検索
連載

OSの心臓、glibcのコンパイルとchrootLFSで作って学ぶLinuxの仕組み(3)(2/3 ページ)

カーネルがOSの脳だとすると、glibcは心臓といえるだろう。Linuxにとってなくてはならないglibcをコンパイルすることで、構築中のLFSもひとまとまりの「OS」に大きく近づく。LFSの自力起動まで、あともう少しだ。(編集局)

Share
Tweet
LINE
Hatena

glibcのインストール

 ユーザー名が表示されなかったり、ホスト名が分からなかったりと、何となくOSっぽくない現在の(仮想)LFSを、そろそろOSらしくしてみるとしよう。そのキモとなるのがglibcである。glibcはLinuxの心臓部ともいえるもので、カーネルとセットで利用されるライブラリ集である。これがなければ、大半のプログラムは動作しない()。ユーザー名やホスト名が表示されないのも、本来はbashがglibcを呼び出して表示しているからだ。glibcをコンパイルすれば、かなりLinux(OS)らしくなるはずだ。

注:glibcにもバージョンがあり、バージョンによっては互換性がない。ライブラリの仕様が変わったためにアプリケーションから呼び出すことができず、動かないといった事態が起きてしまうのだ。オープンソースのアプリケーションの多くは、glibcのバージョンアップに合わせてプログラムを修正/公開しているが、商用アプリケーションではそうもいかない。使う必要のある商用アプリケーションがある場合は、どのバージョンのglibcに対応しているのか、事前に確認しておくべきだろう。


 glibcのインストール方法は、今回提供するスクリプトを参照していただくのが一番だ。ただ、方法がほかのプログラムとは少し違っている部分もあるので、ここで補足しておくことにしよう。といっても、最終的にconfigure(インストール前の設定、makeに必要なMakefileが作成される)を行い、make(コンパイル)、make install(コンパイルしたファイルの配置)と続くことに違いはない。異なるのは、configureを行うまでに必要な作業が、ほかのプログラムのようにソースファイルを展開して作成されたディレクトリへ移動するだけというわけにはいかないところにある。

アーカイブの展開とディレクトリの移動

bzcat glibc-2.2.5.tar.bz2 | tar xv
cd glibc-2.2.5

 最初の2行は、ほかのプログラムと変わらない。LFS PACKAGEに含まれているglibcのソースコードのアーカイブを展開し、作成されたディレクトリへ移動する。

glibc-linuxthreadsの展開

cp ../glibc-linuxthreads-2.2.5.tar.bz2 
./
bzcat glibc-linuxthreads-2.2.5.tar.bz2 | tar xv

 glibcには、LinuxThreadsとLocale、Cryptというアドオンパッケージが存在する。これらのアドオンなしでもglibcはインストールできるが、LinuxThreadsがないとほかのプログラムとの互換性に問題が生じる可能性が高い。そこでLinuxThreadsを展開し、同時にコンパイルできるようにしておく。

/dev/nullの作成

mknod -m 0666 /dev/null c 1 3

 /devに作成されるデバイスファイルは、CD-ROMドライブやFDD、マウスやキーボードなど、コンピュータに搭載された各種デバイスにアクセスするために必要になる。lsコマンドで参照できるため普通のファイルと同じと思うかもしれないが、まったく異なる特別な存在だ。その中でも、特別なのがnullデバイスである。

 nullデバイスは、その名のとおり「空」、すなわち空白を表す。例えば、

$ hogehoge.sh > /dev/null

とすれば、hogehoge.shが標準出力に出力する内容は、どこにも表示されることなく消えてしまう。また、

$ cp /dev/null hoge.log

とすれば、hoge.logの内容はクリアされる。

 このような使い方をする/dev/nullが、glibcのコンパイルで必要になる。いまはまだLFS用のデバイスファイルは何も作成されていないので、ここで作成しなければならない。/dev/null以外のデバイスについては、後で作成するので問題ない。

 前述したように、デバイスファイルは特別なファイルだから、作成にも専用のコマンドが必要になる。それが mknodコマンドだ。mknodコマンドに指定するオプションのうち、「-m

0666」は作成するファイルのパーミッションを表し、「c」はファイルのタイプを表す。「c」はキャラクタを意味し、このほかにブロックを意味する「b」やFIFOを意味する「p」、キャラクタでもバッファなしの「u」などがある。

 それに続く「1 3」はメジャー番号とマイナー番号を表し、デバイスのパーティションによって決まる。ここでは、固定で「1」と「3」を指定すればよい。

ld.so.confファイルの作成

touch /etc/ld.so.conf

 見てのとおり、/etc/ld.so.confファイルを中身なしで作成する。これは、glibcのインストールの最終段階で実行されるldconfigに対応するためだ。

Makefileの変更

cp malloc/Makefile malloc/Makefile.backup
sed 's%\$(PERL)%/usr/bin/perl%' malloc/Makefile.backup > malloc/Makefile
cp login/Makefile login/Makefile.backup
sed 's/root/0/' login/Makefile.backup > login/Makefile

 Makefileはmakeコマンドが読み込むファイルで、コンパイルの内容を決定する。このファイルの内容を、sedコマンドで文字列置換しようというわけだ。

 sedコマンドは2回に分けて発行されているが、最初のsedでは「$(PERL)」を「/usr/bin/perl」に置き換え、2度目のsedで「root」を「0」に置き換えている。つまり、Perlプログラムの位置を絶対パスで指定するためと、rootユーザーのユーザーIDが参照できないのでユーザーIDである0を指定するための置き換えである。

 それぞれのsedを実行する前にcpコマンドが実行されているが、これは置き換えが失敗した場合のためのバックアップを作成しているのだ。Makefile.backupファイルを作成して、そのファイルを置き換え元とし、オリジナルを置き換え先としている。

ビルド用ディレクトリの作成

mkdir ../glibc-build
cd ../glibc-build

 glibcのビルド、つまりコンパイルは、ソースファイルとは別のディレクトリで行う。

glibcのコンパイル

../glibc-2.2.5/configure --prefix=/usr 
--enable-add-ons --libexecdir=/usr/bin
echo "cross-compiling = no" > configparms
make
make install

 いよいよコンパイルを行うが、その前にconfigureでMakefileを作成しなくてはならない。ここで指定しているオプション「--prefix」は、コンパイルしたプログラムを配置するディレクトリの指定だ。「--libexecdir」も、同じくコンパイルしたプログラムを配置するディレクトリの指定だが、これはライブラリとして使われるプログラム用の指定である。glibcの場合は、pt_chownだけがlibexecdirで指定したディレクトリに配置され、それ以外はprefixで指定されたディレクトリに配置される。

 「--prefix」と「--libexecdir」は、ほかのプログラムのconfigureでも利用されるオプションなので、覚えておくとよいだろう。「--enable-add-ons」はほかのプログラムのconfigureでは見かけないオプションだが、先ほど紹介したLinuxThreadsを組み込むために必要となる。

 通常であれば、configureの後はすぐにmakeを行うところだが、ここでは間に1つコマンドが入っている。単なるechoコマンドだから実行結果は分かると思うが、configparmsというファイルに「cross-compiling

= "no"」と書き込んでいる。これは、glibcのmake時に、クロスコンパイルを行わないことを指定するためだ。

各国語対応ファイルの追加

make localedata/install-locales

 無事にmake installまで終了しても、まだ作業は完全に終了したとはいえない。続いて、glibcの各国語対応ファイルをインストールする。この作業を行う主たる目的は、時刻表示やメッセージを多言語に対応させることだ(編注)。

編注:より厳密にいうと、言語は一面にすぎない。日本の場合は国と言語が1対1で対応するが(実際は複数の文字コードを考慮する必要がある)、ある言語が複数の国で公用語となっている場合、ある国が複数の言語を公用語としている場合も考慮しなければならない。そして、言語が同じでも日時、時刻の表記ルールが国によって異なる場合もある。これらに対応することを「国際化」という。

 この作業を行わなければ、メッセージは英語で表示される。しかし、多言語化すると、環境変数「LANG」で指定した言語でメッセージが表示されるようになる。LFS 3.3に含まれるglibcにはEUC(ja_JP.eucJP)が含まれているから、この作業を行えばglibcの日本語対応が完了する。

 とはいえ、上記のコマンドでは必要ない言語のファイルもインストールされてしまう。それがイヤだという方は、別途localedefコマンドで必要な言語のファイルだけをインストールするとよいだろう。また、標準ではインストールされないSJIS(シフトJIS)などをインストールしたい場合は、そのデータを取得してlocaledefによるインストールを行うことになる。これについては、環境構築後の調整段階で詳しく紹介したいと思う。現時点でよく分からない場合は、取りあえずすべてをインストールしておけばいいだろう。

localedef -i ja_JP 
-f EUC_JP ja_JP.EUC
localedefコマンドの例

bashの再実行

exec /bin/bash --login

 glibcのインストールが終わったら、bashを再実行してglibcを読み込ませる。これでホスト名やユーザー名が取得できるようになり、プロンプトの表示が変わるはずだ。また、

export LANG=ja_JP.eucJP

として環境変数を設定してやれば、dateコマンドやlsコマンドのメッセージが日本語で表示されることを確認できる。

 ただし、提供したスクリプト(lfs-compile2.sh)では、この行をカットしている。なぜなら、これを実行してしまうと新しいシェルが起動されてしまい、スクリプトの実行が止まってしまうからだ。代わりに、スクリプトの最後でこの行と同じ命令を実行している。コンパイルを行ううえでは、まったく問題ない。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る