続・玩式草子 ―戯れせんとや生まれけん―

第15回 Days of WINE and Struggles[2]

この記事を読むのに必要な時間:およそ 4.5 分

前回に引き続き,Plamo Linux Multilib化の日記風記録です。日付は適当なものの,このあたりまではCLFSのドキュメントに沿った作業なので,実質3~4日程度で進みました。

7月YX日:CLFSの一時システム作り

先に紹介したようにCLFSでは,まず/mnt/clfs/cross-tools/以下に64/32ビット両対応のGCCを用意し,そのGCCを用いて/mnt/clfs/tools/以下に最小規模の起動可能なLinux環境一時システムを作る。そして,その一時システムを使って/mnt/clfsをルートパーティションとするLinuxのフルシステムを作りあげる,という手順を取る。

すなわち,/mnt/clfs/以下にはcross-tools/bin/のGCC(クロスツール用GCC)とtools/bin/のGCC(一時システム用GCC⁠⁠,/mnt/clfs/usr/bin/のGCC(フルシステム用GCC)の3種ができるわけだ。最小規模のツールから次第に機能を拡張していって,最終的に完全版を本来の場所に配置するこのあたりの手順は,⁠ブートストラップ」という言葉を地で行っているようで興味深い。

とりあえずクロスツール用GCCまではビルドできたので,次は/mnt/clfs/tools/以下に配置する一時システム用のツール作りとなる。その際は,再度GMPやMPFR,MPC,ISLといったGCC用のサポートライブラリからビルドを始め,一時システム用にbinutilsとGCCを作り直す。その後,bashやcoreutilsといった基本ツールとmakeやpatch,tar,sedといった開発用ツール類をビルドして,/mnt/clfsを起動(あるいはchroot)可能な状態にするようだ。

ちなみに手元では,Plamo Linuxをインストールした仮想環境(VirtualBox)を用意して,ホスト側からリモートログインしてCLFSの作業をしている。こうすれば,CLFSの内容を表示しているブラウザから,必要なコマンドをビルド用ターミナルにコピペできるので,タイプミスも生じなくて便利だ。

図1 コピペでCLFSのコマンド入力

図1 コピペでCLFSのコマンド入力

ソースコードは可能な限り最新版を使おうとしているので,CLFSに記載されているバージョンとは異なる場合が多いものの,バージョンに依存するパッチを当てる場合などを除き,ほぼ問題なくビルド,インストールはできた。

次はこの一時システムを自立可能なLinuxシステムにするための,作業ディレクトリや設定ファイル作りだ。CLFSに紹介されている通りに,/procや/sys,/devといったハードウェア情報を扱うためのディレクトリを作成し,mountのbindオプションでchroot先からも必要な情報が見えるようにしておく。

# mkdir -pv ${CLFS}/{dev,proc,run,sys}
...
# mount -v -o bind /dev ${CLFS}/dev
# mount -vt devpts -o gid=5,mode=620 devpts ${CLFS}/dev/pts
# mount -vt proc proc ${CLFS}/proc
# mount -vt tmpfs tmpfs ${CLFS}/run
# mount -vt sysfs sysfs ${CLFS}/sys

一般ユーザ(clfs)で作成したコマンド類の所有者をrootに変更したり,/etcや/varといった必須ディレクトリの作成,/etc/passwdや/etc/groupなどの設定ファイルの追加といった作業を進め,準備が整った一時システムにchrootすると,300強のコマンドが使えるLinux環境になっている。

# chroot /mnt/clfs /tools/bin/env -i   \
     HOME=/root TERM="${TERM}" PS1='\u:\w\$ ' \
     PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
     /tools/bin/bash --login +h

root:/# ls
bin   cross-tools  etc   lib    media  opt   root  sbin     srv  tmp	  usr
boot  dev          home  lib64  mnt    proc  run   sources  sys  tools  var

root:/# ls /tools/bin
'['	        elfedit        linux64		 pr	        truncate
 addr2line      env	       ln		 printenv       tset
 ar	        expand	       locale		 printf         tsort
 ...
 
root:/# ls /tools/bin | wc -l
318

次は,この一時システムの/tools/bin/以下のコマンドを使って,/usr/bin/以下に正式なシステムを作っていくステップになる。

7月YY日:CLFSのフルシステム構築

CLFSではビルドエラーを発見するためのテストを重視しており,他のソフトウェアをインストールする前にテスト用のツール類をインストールする(9章⁠⁠。その後,基本的なLinuxシステムを構成するためのソフトウェアを32ビット版,64ビット版の順でビルドして,本来の置き場所である/usr/以下にインストールしていく(10章⁠⁠。

まず最初にGlibcを32ビット用,64ビット用にビルドし直し,GCCを構成するためのGMPやMPFRなども再度32/64ビット用にビルド,インストールし直す。GCCは4回目のビルドになる上,GMPなどのライブラリは32/64ビット用に2度づつビルドするため,手順の既視感が甚(はなは)だしい。しかしながら,各ステップごとに適用するパッチの有無が変わっていたり,インストール先等を指定する設定オプションが変っていたりするので,一度使ったソースコードは削除して展開し直し,記載されている手順を確認しつつ設定,ビルド,インストールを進めていく。

ビルド用のコマンドラインは一見同じように見えるものの,GCCに渡すオプションが変っていたり("-m32/-m64"⁠⁠,LDFLAGSに指定するライブラリが"/usr/lib"と"/usr/lib64"で入れ替わっていたり,32ビット用ではconfigure時に--hostオプションが必要だったり,と微妙に異なっている。

ライブラリのインストール先は--libdirオプションで切り替えて共存させているのに,実行ファイルのインストール先は/usr/bin/のままでいいのかな,と思ったものの,このあたりはビルド順が工夫されていて,まず32ビット版をビルド,インストールしてから,64ビット版をビルド,インストールすることで,先に/usr/bin/以下にインストールされた32ビット版の実行ファイルは,同名の64ビット版で上書きされる,という考え方らしい。

通常,実行ファイルは32ビット版でも64ビット版でも動作は変らないので,同名のコマンドを64ビット版で上書きしても構わないものの,リンク時に参照するライブラリの位置を返すconfig-XXX系のツールでは,32/64ビット版双方の実行ファイルが必要なことがある。

そのような場合に対応するために,CLFSではmultiarch_wrapperという独自のコマンドを用意している(CLFS 10.27章⁠⁠。このコマンドは50行弱のCプログラムで,USE_ARCHという環境変数に応じて,呼び出す実行ファイルを切り替える,という機能を持っている。

たとえば,32ビット版のperlを/usr/bin/perl-3264ビット版のperlを/usr/bin/perl-64という名前でインストールし,/usr/bin/perl/usr/bin/multiarch_wrapperにシンボリックリンクしておけば,

  $ USE_ARCH=32 /usr/bin/perl

とすると,/usr/bin/perlという名前で呼び出されたmultiarch_wrapperが,USE_ARCH=32の指定に従って32ビット版(/usr/bin/perl-32)を起動し,USE_ARCH=64とすると64ビット版(/usr/bin/perl-64)を起動する。

実用上,multiarch_wrapperが必要になるのは,pkg-config等の機能に頼らずに32ビット版ライブラリを作成する場合くらいだろうけど,切り替え機能はあれば便利なので,CLFSに従ってインストールしておく。

10章はCLFSの記述通りにビルド,インストールを進めていけばいいものの,ざっと数えたところ,32/64ビットのライブラリを作る必要があるソフトウェアが28種類,64ビット版のみでいいソフトウェアが35種類あるから,28x2 + 35の計91回,ビルド,インストール作業が必要になるようだ。まだまだ先は長い。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html