Qbilinux 日記

Linux に関係することだけではなく,最近は一般的なコンピュータやガジェット関係についても記載してます.

Plamo Linux の野良パッケージ作成(その40): ARM の v6/v7 対応と hardfp 対応

ぼちぼちと Plamo のソース一式を修正して,野良パッケージ (野良ディストリビューション?) を作成.

いつまで続くのか.

いじってる野良パッケージのビルドスクリプトhttps://github.com/t-matsuki/Plamo-mysrc,バイナリは http://circle2.org/pub/ にあります.

最近はずっと ARM 関係をいじってます.

Plamo Linux の野良パッケージの ARM 対応版ですが,これまでは v7 コードで softfp がデフォルトになっていたので,RPi1 や zero 等で動作しません.せっかく zero w を入手したのにそれじゃちょっと悲しいなということで,v6 対応と,ついでに hardfp 対応しようかなと思い立ち.

ラズパイ用にバイナリ配布されているソフトがポチポチありますが,これらが hardfp な glibc を要求する物が多いので,標準配布されている Raspbian 等に合わせてデフォルトは hardfp にしておいた方が便利かなと思っています.

ということで v6 hardfp 対応の作業を.

現在のままでも gcc 自体は v6 コードも hardfp コードも出力できるので,glibc だけ差し替えてリビルドすれば良いのかな.と思って glibcコンパイルしてみたら,いろんなライブラリとのリンクの時にエラーになりました.VFP 対応の .o と対応していない .o とのリンク時にエラーではじかれる仕様なのね.

でもよくよく考えたら,仮にこれでコンパイルが通ったとしても,出来上がった glibc に入れ換えた瞬間,命令セットも異なるので glibc を参照しているバイナリが全滅になってしまっておそらくダメダメなんでしょうね.

ということで,普通に armv6 および hardfp 対応の gccglibc 一式のクロスコンパイル環境を用意.手元のものはネットに転がっていた方法をベースにちょこちょこと修正しながら使っていて,あまり一般的な物ではなくなってるのでここでは省略させてもらいます.今回はとりあえず gcc, glibc, kernel header だけを使ったクロス環境を作成しました.過去にここの blog で「Plamo Linux の arm クロスコンパイル環境」で少し書いたのと似たような環境です.lfs の II. Preparing for the Build と似たようなものを作っています.で,そのクロスコンパイル環境を使って,テンポラリでパッケージ作成を行うためのツール一式を作成.lfs の 5. Constructing a Temporary System あたりのツールです.

toshi-mtk.hatenablog.com

その後,chroot してからポチポチコンパイルを始めた...けどかなり大変な作業になってきたな.

と,しばしここで思案.

これなら,armv6 対応と hardfp 対応を同時にやるのではなく,とりあえず armv7 環境で hardvfp 対応だけ先にやって,v7 環境を使える環境に固めてから,ゆっくりと armv6 対応をしていった方が良いかも...と.

ということで,こちらも VFP 絡みで色々と怒られそうなので,とりあえず hardfp に対応したコンパイル環境 (gcc とか glibc とか) を準備.その環境で本番用の glibc のパッケージを作成.おっかなびっくり置き換えてみたら...やっぱり駄目.全滅とまではいかないですけど,結構な数のコマンドが動作しなくなりました.

やっぱり v7 の hardfp 対応するだけでも地道な作業が必要みたいだなぁということで,このコンパイル環境を使って基本となるパッケージのリコンパイルをぼちぼちと実施.

で,現在の状況ですが,armv7 hardfp な環境で新規インストールを行ってなんとか動作するくらいのパッケージ分は用意しました.とりあえず新規インストールして,その環境の上でパッケージ作成ができることは確認したので,今後はクロスコンパイル環境ではなく,新規インストールした環境下で再びきれいな形 (?) にパッケージを作り直していこうかと思っています.はい.

先日まで作成していた v7 softfp な環境はそのうち上記の http サイトの方に置いておきますが,今後はメンテは行わない予定です.割と中途半端な状態のままの放置になってしまいますが,私的にはもう使わないので....

ここで少しだけ補足情報を書いておきます.

もし linux 環境が壊れてしまった場合,別の linux 環境等を立ち上げて,その linux 上から壊れたパッケージを再インストールするなりして復旧させて...とか行うのが普通かなと思いますが,Plamo Linux やこの野良環境の場合,そこまで行わなくても割と簡単に復旧できます.

/sbin/installer 以下に static なコマンド類が入っています.また,bash も static なものが bash-static というコマンド名でインストールされています.これらのコマンドは glibc などのライブラリ類が死んでしまっても問題なく使えるので,これらを使えばあらかじめ root 権限のあるアカウントでログインしたターミナルを一個開いておけばそこから割と簡単に修復することができます.パッケージ自体は tar + xz で固めているだけなので,基本的にそれで上書きしてしまうだけです.

例えば glibc の復旧の場合,問題なく動作していた glibc のパッケージを使って

% cd /
% /sbin/installer/xzcat どっか/libc-2.25-armv7l-P0m2.txz | /sbin/installer/tar xvf -

でファイルを上書きした後に

% export PATH=/sbin/installer/:$PATH
% bash-static /install/doinst.sh

で設定等を戻してあげれば動作していた環境に戻せます.再起動も必要ないですね.

上記で PATH を設定してるのは doinst.sh 中で呼ばれる rm, ln などのコマンドに /sbin/installer 以下の物を使いたいからです.じゃないと,通常の shared lib なコマンド類が呼ばれてエラーになってしまいます.

その他の重要なライブラリが死んでしまっても同様の感じで復旧作業は出来るかなと思います.ただし,壊れる場所によってはこの方法が扱えずに普通に別の linux を立ち上げ...ってする必要もあるかも.

この辺りは他のディストリビューションと違ってパッケージ管理が緩い感じ行われているから出来ることなのかなぁと思います.他のディストリビューションでそこまでひどい壊れ方をしたことはないですけどね.:-)

まぁ,そんな感じでぼちぼちといじってます.はい.