2007年1月アーカイブ

BLFS Book: Chapter27.Window Managers~XFce-4.2.2

今までは、twmという原始的なウインドウマネージャを使用していましたが、より実用的なウインドウマネージャであるXFceをインストールします。
XFceのソースを展開すると、各種コンポーネントのソースが展開されますが、ここでは必要最低限のコンポーネントをインストールしてXFceをインストールします。実行コマンドは以下のとおり。

$ wget http://www.us.xfce.org/archive/xfce-4.2.2/fat_tarballs/xfce-4.2.2-src.tar.bz2
$ tar jxvf xfce-4.2.2-src.tar.bz2
$ cd xfce-4.2.2/src
$ for i in *.tar.gz
>do tar xzvf $i
>done
$ cd libxfce4util-4.2.2
$ ./configure --prefix=/usr --sysconfdir=/etc
$ make
$ su
# make install
# exit
$ cd ../dbh-1.0.24
$ ./configure --prefix=/usr --sysconfdir=/etc
$ make
$ su
# make install
# exit
$ cd ../libxfcegui4-4.2.2
$ ./configure --prefix=/usr --sysconfdir=/etc
$ make
$ su
# make install
# exit
$ cd ../libxfce4mcs-4.2.2
$ ./configure --prefix=/usr --sysconfdir=/etc
$ make
$ su
# make install
# exit
$ cd ../xfce-mcs-manager-4.2.2
$ ./configure --prefix=/usr --sysconfdir=/etc
$ make
$ su
# make install
# exit
$ cd ../xfwm4-4.2.2
$ ./configure --prefix=/usr --sysconfdir=/etc
$ make
$ su
# make install
# exit
$ cd ../xfce4-panel-4.2.2
$ ./configure --prefix=/usr --sysconfdir=/etc
$ make
$ su
# make install
# exit
$ cd ../xfdesktop-4.2.2
$ ./configure --prefix=/usr --sysconfdir=/etc
$ make
$ su
# make install
# exit
$ cd ../xfce-utils-4.2.2
$ ./configure --prefix=/usr --sysconfdir=/etc
$ make
$ su
# make install
# exit
$ vi ~/.xsession
$ cat ~/.xsession
export LANG=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8
export XMODIFIERS="@im=kinput2"
/usr/X11R6/bin/kinput2 -canna -kinput -xim &
xrdb -merge $HOME/.Xresources
xfce-mcs-manager
xfwm4 --daemon
xftaskbar4 &
xfdesktop &
exec xfce4-panel

最後に、.xsessionもしくは.xinitrcを上記のとおり編集し、Xを一旦ログアウトし、再度ログインします。こちらのとおり、XFceが立ち上がるはずです。

以上をもちまして、LFS構築記は終わりとしたいと思います。普段使用するOSとしては未だ貧弱な所はありますが(特にマルチメディア系や印刷機能)、Linuxディストリビュ-ション自体が元々苦手とする分野なのでLFSに限られている問題ではないかと思います。

小生の場合、普段はleptonにインストールしているGentoo Linuxを使用していますが、こちらのマシンが調子悪くなった場合は、gluonにインストールしたLFSを立ち上げWEBで調べ物をするといった使い分けになるかと思います。

ところで、当初LFSインストールの目的の一つとしてLinuxの仕組み(どのようなソフト・ライブラリで成り立っているか)を学びたいという思いがありましたが、正直言って何も頭に入っていません。ただLFS Bookなり、BLFS Bookなり、Linux World特集記事の手順に沿ってコマンド叩いてただけなので。
インストールしてから持て余していたブログがそれなりにエントリーの投稿を稼げたから、まぁいっか。

BLFS Book:
Chapter35.Graphical Web Browsers~Firefox-1.0.6
Chapter36.Other X-based Internet Programs~Thunderbird-1.0.6

前回でGUIアプリのインストール準備が完了したので、いよいよFirefoxをインストールします。かなり巨大なアプリケーションなので、コンパイルにはそれ相応の時間がかかります。
Firefox-1.0.6
$ wget http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/1.0.6/source/firefox-1.0.6-source.tar.bz2
$ tar jxvf firefox-1.0.6-source.tar.bz2
$ cd mozilla
$ export MOZILLA_OFFICIAL="1"
$ export BUILD_OFFICIAL="1"
$ export MOZ_PHOENIX="1"
$ ./configure --prefix=/usr \
>--with-default-mozilla-five-home=/usr/lib/firefox-1.0 \
>--with-user-appdir=.firefox \
>--with-system-zlib \
>--with-system-png \
>--with-system-jpeg \
>--enable-application=browser \
>--enable-default-toolkit=gtk2 \
>--enable-extensions=cookie,xml-rpc,xmlextras,pref,transformiix,universalchardet,webservices,inspector,gnomevfs,negotiateauth \
>--enable-crypto \
>--enable-xft \
>--enable-xinerama \
>--enable-optimize \
>--enable-reorder \
>--enable-strip \
>--enable-cpp-rtti \
>--enable-single-profile \
>--disable-freetype2 \
>--disable-accessibility \
>--disable-debug \
>--disable-tests \
>--disable-logging \
>--disable-pedantic \
>--disable-installer \
>--disable-mailnews \
>--disable-ldap \
>--disable-composer \
>--disable-profilesharing
$ make
$ su
# make install
# install -d /usr/include/firefox-1.0.6/nss
# cp -Lf dist/private/nss/*.h dist/public/nss/*.h /usr/include/firefox-1.0.6/nss
# cd /usr/lib/firefox-1.0.6
# export LD_LIBRARY_PATH="$PWD"
# export MOZILLA_FIVE_HOME="$PWD"
# ./regxpcom
# ./regchrome
# touch `find . -name *.rdf`
# firefox ← rootでログインし直して実行

インストール後は、先にrootでfirefoxを実行します。これにより、Firefoxが使用するシステムディレクトリが作成されます。rootで起動が成功したら、一般ユーザーでも起動を確認しておきます。

次はThunderbirdのインストールです。Linux Worldの方ではSylpheedをインストールしていますが、ここはBLFS Bookにも記載されているThunderbirdをインストールしてみます。

Thunderbird-1.0.6
$ wget http://ftp.mozilla.org/pub/mozilla.org/thunderbird/releases/1.0.6/source/thunderbird-1.0.6-source.tar.bz2
$ wget http://downloads.mozdev.org/enigmail/src/enigmail-0.92.0.tar.gz
$ wget http://downloads.mozdev.org/enigmail/src/ipc-1.1.3.tar.gz
$ mv mozilla mozilla.firefox ← firefox展開時のディレクトリをリネーム
$ tar jxvf thunderbird-1.0.6-source.tar.bz2
$ cd mozilla
$ export MOZILLA_OFFICIAL="1"
$ export BUILD_OFFICIAL="1"
$ export MOZ_THUNDERBIRD="1"
$ sed -i -e 's/$(destdir)$(bindir)/$(DESTDIR)$(mozappdir)/' mail/app/Makefile.in
$ ./configure --prefix=/usr \
>--with-default-mozilla-five-home=/usr/lib/thunderbird-1.0.6 \
>--with-system-zlib \
>--with-system-png \
>--with-system-jpeg \
>--enable-application=mail \
>--enable-default-toolkit=gtk2 \
>--enable-extensions=wallet,spellcheck,xmlextras,webservices \
>--enable-crypto \
>--enable-xft \
>--enable-xinerama \
>--enable-optimize \
>--enable-reorder \
>--enable-strip \
>--enable-cpp-rtti \
>--enable-single-profile \
>--enable-necko-protocols=http,file,jar,viewsource,res,data \
>--enable-image-decoders=default,-xbm \
>--disable-freetype2 \
>--disable-accessibility \
>--disable-debug \
>--disable-tests \
>--disable-logging \
>--disable-pedantic \
>--disable-installer \
>--disable-profilesharing \
>--disable-mathtml \
>--disable-oji \
>--disable-plugins \
>--disable-necko-disk-cache
$ make
$ tar zxvf ../enigmail-0.92.0.tar.gz -C extensions
$ tar xzvf ../ipc-1.1.3.tar.gz -C extensions
$ build/autoconf/make-makefile extensions/ipc extensions/enigmail
$ make -C extensions/ipc
$ make -C extensions/enigmail
$ su
# make install
# install -d /usr/include/thunderbird-1.0.6/nss
# cp -Lf dist/private/nss/*.h dist/public/nss/*.h /usr/include/thunderbird-1.0.6/nss
# make -C extensions/ipc install
# make -C extensions/enigmail install
# cd /usr/lib/thunderbird-1.0.6
# export LD_LIBRARY_PATH="$PWD"
# export MOZILLA_FIVE_HOME="$PWD"
# ./regxpcom
# ./regchrome
# touch `find . -name *.rdf`

BLFS Book:
Chapter26.X Libraries~Pango-1.8.1, ATK-1.9.1, GTK+-2.6.7, Lesstif-0.94.4
Chapter8.General Libraries~LibIDL-0.8.5

LFS構築記も佳境に入りつつありますが、最終的な目標である実用アプリ(ブラウザ、メーラ)のインストール前に必要なライブラリをいくつかインストールします。

先ずはPango(テキストレンダリング・モジュ-ル)からです。実行コマンドは以下のとおり。
Pango-1.8.1
$ wget http://ftp.gnome.org/pub/GNOME/sources/pango/1.8/pango-1.8.1.tar.bz2
$ tar jxvf pango-1.8.1.tar.bz2
$ cd pango-1.8.1
$ ./configure --prefix=/usr --sysconfdir=/etc
$ make
$ su
# make install

次にATK(GTK+で使用するグラフィックライブラリ)をインストールします。実行コマンドは下記の通り。
ATK-1.9.1
$ wget http://ftp.gnome.org/pub/GNOME/sources/atk/1.9/atk-1.9.1.tar.bz2
$ tar jxvf atk-1.9.1.tar.bz2
$ cd atk-1.9.1
$ ./configure --prefix=/usr
$ make
$ su
# make install

次にLibIDL(Mozilla等で利用されるUI定義言語を扱う為のライブラリ)をインストールします。実行コマンドは以下のとおり。
LibIDL-0.8.5
$ wget http://ftp.gnome.org/pub/GNOME/sources/libIDL/0.8/libIDL-0.8.5.tar.bz2
$ tar jxvf libIDL-0.8.5.tar.bz2
$ cd libIDL-0.8.5
$ ./configure --prefix=/usr
$ make
$ su
# make install

次にGTK+(GNOMEでGUIパーツを提供するライブラリ)をインストールします。実行コマンドは以下のとおり。
GTK+-2.6.7
$ wget http://gd.tuwien.ac.at/graphics/gimp/gtk/v2.6/gtk+-2.6.7.tar.bz2
$ tar jxvf gtk+-2.6.7.tar.bz2
$ cd gtk+-2.6.7
$ ./configure --prefix=/usr --sysconfdir=/etc \
>--without-libtiff --without-libjpeg
$ make
$ su
# make install

もう一つ、Lesstif(オープンソースのGUIツールキット)をインストールします。実行コマンドは以下のとおり。
Lesstif-0.94.4
$ wget http://prdownloads.sourceforge.net/lesstif/lesstif-0.94.4.tar.bz2
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/lesstif-0.94.4-testsuite_fix-1.patch
$ tar jxvf lesstif-0.94.4.tar.bz2
$ cd lesstif-0.94.4
$ patch -Np1 -i ../lesstif-0.94.4-testsuite_fix-1.patch
$ ./configure --prefix=/usr --disable-debug \
>--enable-production --with-xdnd
$ make rootdir=/usr/share/doc/lesstif-0.94.4
$ su
# make rootdir=/usr/share/doc/lesstif-0.94.4 install
# mv -v /usr/X11R6/lib/X11/mwm /etc/X11
# ln -v -s ../../../../etc/X11/mwm /usr/X11R6/lib/X11
# ldconfig

BLFS Book: -

引き続き日本語環境を構築していきますが、ここでは日本語入力環境を整備します。最近のLinuxでは日本語入力ソフトも色々と種類がありますが、ここでは、以前から使用されているCanna+Kinput2の組み合わせで日本語入力環境を構築していきます。

先ずは、Canna(かな漢字変換エンジン)のインストールからです。実行コマンドは以下のとおり。

$ wget http://ftp.debian.org/debian/pool/main/c/canna/canna_3.7p3.orig.tar.gz
$ tar zxvf canna_3.7p3.orig.tar.gz
$ cd Canna37p3
$ vi Canna.conf
$ cat Canna.conf
~中略~
cannaPrefix = DefCannaPrefix ← 下記のように修正(この行は不要)
cannaPrefix = /usr
~中略~
$ xmkmf -a
$ make canna
$ su
# make install
# make install.man

Cannaをインストールしたら、その起動スクリプトを以下の内容で作成します。
/etc/rc.d/init.d/canna
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
    start)
        boot_mesg "Starting Canna Server..."
        loadproc /usr/sbin/cannaserver start
        ;;
    stop)
        boot_mesg "Stopping Canna Server..."
        killproc /usr/sbin/cannakill
        ;;
    restart)
        ${0} stop
        sleep 1
        ${0} start
        ;;
    status)
        /usr/sbin/cannastat
        ;;
    *)
        echo "Usage: ${0} {start|stop|restart|status}"
        exit 1
        ;;
esac

上記ファイルを作成したら、以下のコマンドを実行し、実行権の付与、ランレベルごとの起動スクリプトへのシンボリックリンクを作成します。

# chmod +x /etc/rc.d/init.d/canna
# cd /etc/rc.d
# for i in rc[2345].d
>do pushd $i
>ln -s ../init.d/canna S30canna
>popd
>done

続いてKinput2(主にCannaと組み合わせて使用されるインプットメソッド)のインストールです。

$ wget http://ftp.debian.org/debian/pool/main/k/kinput2/kinput2_3.1.orig.tar.gz
$ wget http://ftp.debian.org/debian/pool/main/k/kinput2/kinput2_3.1-4.diff.gz
$ tar zxvf kinput2-3.1.orig.tar.gz
$ cd kinput2-v3.1
$ zcat ../kinput2_3.1-4.diff.gz | patch -p1
$ vi Kinput2.conf
$ cat Kinput2.conf
~中略~
/* #define UseSj3 */ /* define if you are going to use Sj3 */ ← コメント
~中略~
$ xmkmf -a
$ make Makefiles
$ make depend
$ make
$ su
# make install

なお、Kinput2.confというファイルでコメントしているのは、これをしないと、コンパイルに失敗するためです(コンパイル作業ではよく見かけるそんなファイルやディレクトリ知らん!的な断末魔メッセージが大量に出力される)。

さて、必要なソフトがインストールできたので、あとはXの設定を行います。設定内容は以下の通り。
~/.Xresources
*SeparateConversion.input: false
*selectionShell.input: false
*auxShell.input: false

~/.xinitrc or ~/.xsession
export XMODIFIERS="@im=kinput2"
xrdb -merge $HOME/.Xresources
/usr/X11R6/bin/kinput2 -canna -kinput -xim &
xterm -g 80x40+0+0 &
xclock -g 100x100-0+0 &
twm

次に、日本語が使用可能なターミナル(端末)と言えば、今も昔も?ktermということで、定番ソフトktermをインストールしておきます。

$ wget http://ftp.debian.org/debian/pool/main/k/kterm/kterm_6.2.0.orig.tar.gz
$ wget http://ftp.debian.org/debian/pool/main/k/kterm/kterm_6.2.0-43.diff.gz
$ tar zxvf kterm_6.2.0.orig.tar.gz
$ cd kterm-6.2.0.orig
$ zcat ../kterm_6.2.0-43.diff.gz | patch -p1
$ chmod +w button.c charproc.c 
$ vi button.c
 ↓修正内容
//extern char *malloc();
$ vi charproc.c
 ↓修正内容
//extern char *malloc();
$ xmkmf -a
$ make
$ su
# make install
# make install.man

ktermのソースの中で、button.cとcharproc.cというファイルを修正していますが、malloc関数の定義関係でコンパイルエラーが発生することによる対処です。Cはあまり詳しくないですが、mallocってCの標準関数だったような気がしたけど、こんな所で何故にわざわざ外部定義をしているのかよく分かりません(小生の対処方法が正しいのかわかりませんが、とりあえずktermは普通に使えているので良しとします)。

最後にこれまたしばしば使用するnkf(文字コード変換ツール)とlv(多言語対応ページャ)もインストールしておきます。

$ wget http://osdn.dl.sourceforge.jp/nkf/20770/nkf207.tar.gz
$ tar xzvf nkf207.tar.gz
$ cd nkf207
$ make
$ su
# install -m755 nkf /usr/bin/nkf
# install -m644 nkf.1 /usr/man/man1/nkf.1
# exit
$ wget http://www.ff.iij4u.or.jp/~nrt/freeware/lv451.tar.gz
$ tar zxvf lv451.tar.gz
$ cd lv451/build
$ ../src/configure
$ make
$ su
# make install

ここまででだいぶ実用的なシステムにはなってきましたが、このご時世にWEBブラウジングが未だ出来ないというのがかなり致命的です。次回以降はこの辺りを改善し、ウインドウマネージャもより実用的なものにアップグレードする予定です。

BLFS Book: -

ここでは日本語環境の構築を行います。BLFS Bookには、特定言語の環境構築について詳細は記載されていないようです(細かく見てないので分かりませんが・・・)。てなわけで、ここからの作業は主に月刊誌(現在は休刊となっている)Linux World2006年12月号の特集記事の内容を中心に作業を行っていくこととなります。

まずはフォントのインストールから始めます。ここでは、さざなみフォントを選びますが、お好みのフォントに合わせてインストールしても良いかもしれません(他のフォントでは未検証)。その他、フォントインストールに伴い、Xの環境設定も行っておきます。具体的な実行コマンドは以下のとおりです。

$ wget http://osdn.dl.sourceforge.jp/efont/10087/sazanami-20040629.tar.bz2
$ tar jxvf sazanami-20040629.tar.bz2
$ cd sazanami-20040629
$ su
# mkdir /usr/share/fonts
# cp sazanami-gothic.ttf sazanami-mincho.ttf /usr/share/fonts
# su -
# mkfontdir /usr/share/fonts
# mkfontscale /usr/share/fonts
# fc-cache /usr/share/fonts
# vi /etc/X11/xorg.conf
# cat /etc/X11/xorg.conf
~中略~
FontPath "/usr/share/fonts/" ← フォントファイルの設定セクション(Filesセクション)に追記
~中略~
# xlsfonts | grep sazanami ← さざなみフォントがXに認識されているか確認(要Xの再起動)

次にロケール設定を行っておきます。実行コマンドは以下のとおり(EUCを使用する場合、ファイル修正は不要)。

# localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
# vi /etc/profile.d/i18n.sh
# cat /etc/profile.d/i18n.sh
export LC_ALL=ja_JP.UTF-8
export LANG=ja_JP.UTF-8
export G_FILENAME_ENCODING=@locale ← 変更なし
# exit
$ vi ~/.xinitrc ← .xsessionも同様
$ cat ~/.xinitrc ← .xsessionも同様
~中略~
xterm -g 80x40+0+0 & ← +lcオプション(ロケールの自動選択機能無効化)を外す
~中略~

BLFS Book: Chapter25.X Window System Environment

前回までにGUI環境(X Window System)のインストールに必要なライブラリ等をインストールし、GUI環境を構築する準備が整いました。先ずは、GUI環境のベースとなるXをインストールします。実行コマンドは以下のとおりです。
Xorg-6.8.2
$ wget ftp://ftp.opengroup.org/pub/x.org/pub/X11R6.8.2/src-single/X11R6.8.2-src.tar.bz2
$ tar jxvf X11R6.8.2-src.tar.bz2
$ cd xc
$ sed -i '/^SUBDIRS =/s/ etc$//' programs/Xserver/Xprint/Imakefile
$ pushd config/util
$ make -f Makefile.ini lndir
$ su
# cp -v lndir /usr/bin
# exit
$ popd
$ mkdir ../xbuild
$ cd ../xbuild
$ lndir ../xc
$ vi config/cf/host.def ← 以下の内容でファイルを作成
$ cat config/cf/host.def
#define HasFreetype2 YES
#define HasFontconfig YES
#define HasExpat YES
#define HasLibpng YES
#define HasZlib YES
#define XInputDrivers mouse keyboard
#define XprtServer NO
#define BuildXprintClients NO
$ sed -i -e "s@^#include @/* & */@" `grep -lr linux/config.h *`
$ ( make World 2>&1 | tee xorg-compile.log && exit $PIPESTATUS )
$ su
# make install
# make install.man
# ln -v -sf ../X11R6/bin /usr/bin/X11
# ln -v -sf ../X11R6/lib/X11 /usr/lib/X11
# ln -v -sf ../X11R6/include/X11 /usr/include/X11
# vi /etc/ld.so.conf ← 以下の内容に修正(3行目を追記) 
# cat /etc/ld.so.conf
/usr/local/lib
/opt/lib
/usr/X11R6/lib
# /sbin/ldconfig

インストールが完了したら、/etc/X11/xorg.confの設定を行います。Xの設定方法は色々とありますが、ここでは、グラボのドライバやディスプレイを自動判別して雛型を作成してくれるツールを使用したいと思います。具体的には以下のとおりコマンドを実行します。

$ su -
# Xorg -configure

上記のコマンドを実行すると、rootのディレクトリにxorg.conf.newというファイルが作成されているかと思いますので内容を確認します。なお、上記ツールではキーボードの自動判別はできないため、日本語キーボードを利用している場合、修正する必要があります。具体的には、キーボードの設定セクションの中に以下の2行を追記します。
また、小生の環境では、次のX起動テストの際、モニターに「out of range」とかモニターが出力しているらしきメッセージが出力され、起動に失敗しました。モニターの設定セクションを見ると水平・垂直周波数が設定されていないのがダメなのかな?と思い設定した後、テストをしてみた所、起動に成功したので、その設定内容も併せて記述しておきます。

# cat xorg.conf.new
~中略~
#キーボードの設定セクションに以下の2行を追記
Option "XkbModel" "jp106"
Option "XkbLayout" "jp"
~中略~
#モニターの設定セクションに以下の2行を追記
HorizSync 28-51
VertRefresh 43-60
~中略~

Xの設定ファイルの確認が終わったら、Xの起動テストを行います。以下のコマンドを実行します。

# X -config ~/xorg.conf.new

上記コマンドを実行し、マウスポインタが「X」で表示され、問題なく動いているようでしたら成功です。[Ctrl]+[Alt]+[BackSpace]でXを抜けて正規の設定ファイルとしてインストールします。具体的には以下のコマンドを実行します。

# mv ~/xorg.conf.new /etc/X11/xorg.conf

Xの設定ファイルが完成したら、ウインドウマネージャ(現段階ではtwm)等の最低限必要な設定を以下行います。

$ vi ~/.xinitrc
$ cat ~/.xinitrc
xterm +lc -g 80x40+0+0 &
xclock -g 100x100-0+0 &
twm
$ su
# vi /etc/sysconfig/createfiles
# cat /etc/sysconfig/createfiles
/tmp/.ICE-unix dir 1777 root root ← X起動時に余計な警告を表示させないための設定
# exit
$ startx

ここで、twmが起動しない問題が発生。Xがハングし、キーボードも入力を受け付けない状態に陥りました。原因はわかりませんが、とりあえず、Xのログ(/var/log/Xorg.0.log)を参照すると、グラフィックチップ関連のエラーが発生していることが判明。Xがグラフィックチップの自動認識に結局のところ失敗してんじゃね~か?とあたりをつけ、再度設定し直すことにしました。
同じ方法で再設定しては意味が無いので、ここは、昔ながらの設定方法でやってみることにしました。

# xorgconfig
~主な設定内容は以下のとおり~
・mouse protocol type → 1.Auto
・mouse device → /dev/psaux
・keyboard type → 11.Japanese 106-key
・国の設定? → 44.Japanese
・horizontal sync range → 11.Enter your own horizontal sync rangeを選択し、28-51を指定
・vertical sync range → 5.Enter your own vertical sync rangeを選択し、43-60を指定
・card definition → 15.Intel i810(generic)
・video memory → 9.65536K
・color depth → 5.24 bits (16 million colors)

xorgconfigの最後に/etc/X11/xorg.confに保存すっか?と聞いてくるので、気にせず保存して既存のファイルに上書きしてしまいます。その後再度startxで起動したら無事twmが起動しました。

最後にxdmの設定を行い、ひとまず終了とします。それには、/etc/inittabファイルを以下のとおり編集します。
/etc/inittab
# vi /etc/inittab
# cat /etc/inittab
# 最下行に以下を追記
x:3:respawn:/usr/X11R6/bin/xdm -nodaemon
# cp /etc/pam.d/login /etc/pam.d/xdm ← xdmのPAM設定ファイル作成
# exit
$ cp ~/.xinitrc ~/.xsession

以上の設定ができたら、LFS Linuxを再起動します。GUIのグラフィカルなログイン画面が表示されるはずです。

BLFS Book:
Chapter8.General Libraries~PCRE-6.1, Popt-1.7-5, Slang-1.4.9, FAM-2.7.0, GDBM-1.8.3, GLib-2.6.4, Expat-1.95.8, Libxml2-2.6.20,LZO-2.0.1
Chapter9.Graphics and Font Libraries~Libjpeg-6b, Libpng-1.2.8, Libtiff-3.7.3, FreeType-2.1.10, Fontconfig-2.3.2

今日も引き続き各種ユーティリティのインストール作業を行っていきます。先ずはPCRE(Perl互換の正規表現機能を提供するライブラリ)からインストールします。なお、月刊誌Linux World 2006年11月号の特集ではDHCP Clientのインストールをする順番となっていますが、ここでは固定でIPを割り振っているものとし、DHCP Clientのインストール作業については割愛させていただきます。
PCRE-6.1
$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-6.1.tar.bz2
$ tar jxvf pcre-6.1.tar.bz2
$ cd pcre-6.1
$ ./configure --prefix=/usr --enable-utf8
$ make
$ su
# make install
# install -v -m755 -d /usr/share/doc/pcre-6.1/html
# install -v -m644 doc/html/* /usr/share/doc/pcre-6.1/html
# install -v -m644 doc/{Tech.Notes,*.txt} /usr/share/doc/pcre-6.1

次にPopt(コマンドラインで指定されたオプションを取得するライブラリ)をインストールします。手順は以下のとおり。
Popt-1.7-5
$ wget http://ftp.debian.org/debian/pool/main/p/popt/popt_1.7.orig.tar.gz
$ wget http://ftp.debian.org/debian/pool/main/p/popt/popt_1.7-5.diff.gz
$ gunzip popt_1.7-5.diff.gz
$ tar xzvf popt_1.7.orig.tar.gz
$ cd popt-1.7
$ patch -Np1 -i ../popt_1.7-5.diff
$ ./configure --prefix=/usr
$ cp configure.in configure.ac
$ touch configure.in configure.ac
$ make
$ su
# make install

次はSlang(キーボードからの入力や画面表示を制御する機能を集めたライブラリ)です。実行コマンドは以下のとおり。
Slang-1.4.9
$ wget http://gd.tuwien.ac.at/editors/davis/slang/v1.4/slang-1.4.9.tar.bz2
$ tar jxvf slang-1.4.9.tar.bz2
$ cd slang-1.4.9
$ ./configure --prefix=/usr
$ make
$ su
# make install
# exit
$ make elf
$ su
# make install-elf
# chmod 755 /usr/lib/libslang.so.1.4.9

続いてFAM(デスクトップ管理ソフトなどで使用されるファイルが変更されたことを検出するデーモン)のインストールです。
FAM-2.7.0
$ wget http://gd.tuwien.ac.at/opsys/linux/gentoo/distfiles/fam-2.7.0.tar.gz
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/fam-2.7.0-dnotify-1.patch
$ tar zxvf fam-2.7.0.tar.gz
$ cd fam-2.7.0
$ patch -Np1 -i ../fam-2.7.0-dnotify-1.patch
$ chmod -v 755 configure
$ autoreconf -f -i
$ ./configure --prefix=/usr --sysconfdir=/etc
$ make
$ su
# make install
# vi /etc/inetd.conf ← 以下の1行を追加
# cat /etc/inetd.conf
sgi_fam/1-2 stream rpc/tcp wait root /usr/sbin/famd fam
# cd ../blfs-bootscripts-6.1 ← blfs-bootscriptsのディレクトリに移動(場所は任意)
# make install-fam

続いてGDBM(アプリケーション組み込み型データベース)のインストールです。
GDBM-1.8.3
$ wget http://ftp.gnu.org/gnu/gdbm/gdbm-1.8.3.tar.gz
$ tar zxvf gdbm-1.8.3.tar.gz
$ cd gdbm-1.8.3
$ ./configure --prefix=/usr
$ make
$ su
# make BINOWN=root BINGRP=root install
# make BINOWN=root BINGRP=root install-compat

次はGLib(基本的なデータ処理機能が集まったライブラリ)のインストールです。
GLib-2.6.4
$ wget http://gd.tuwien.ac.at/graphics/gimp/gtk/v2.6/glib-2.6.4.tar.bz2
$ tar jxvf glib-2.6.4.tar.bz2
$ cd glib-2.6.4
$ ./configure --prefix=/usr
$ make
$ su
# make install

次にExpat(Cで書かれたXMLパーサライブラリ)のインストールです。
Expat-1.95.8
$ wget http://prdownloads.sourceforge.net/expat/expat-1.95.8.tar.gz
$ tar zxvf expat-1.95.8.tar.gz
$ cd expat-1.95.8
$ ./configure --prefix=/usr
$ make
$ su
# make install

次にLibxml2(Expatと同じ機能のライブラリだが処理が高速で高機能)のインストールです。
Libxml2-2.6.20
$ wget http://ftp.gnome.org/pub/GNOME/sources/libxml2/2.6/libxml2-2.6.20.tar.bz2
$ tar jxvf libxml2-2.6.20.tar.bz2
$ cd libxms2-2.6.20
$ ./configure --prefix=/usr --with-history
$ make
$ su
# make install

次にLZO(データを高速に圧縮/伸長するためのライブラリ)のインストールです。そろそろ飽きてきたな。
LZO-2.01
$ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.01.tar.gz
$ tar zxvf lzo-2.01.tar.gz
$ cd lzo-2.01
$ ./configure --prefix=/usr --enable-shared
$ make
$ su
# make install
# install -v -m755 -d /usr/share/doc/lzo-2.01
# install -v -m644 doc/* /usr/share/doc/lzo-2.01

次からはグラフィックとフォント関連のライブラリのインストールに趣向が変わってきます。先ずは、Libjpeg(JPEG形式の画像ファイル処理に関するライブラリ)のインストールからです。
Libjpeg-6b
$ wget http://www.photopost.com/jpegsrc.v6b.tar.gz
$ tar zxvf jpegsrc.v6b.tar.gz
$ cd jpeg-6b
$ ./configure --prefix=/usr --enable-static --enable-shared
$ make
$ su
# make install

続いてLibpng(PNG形式の画像ファイル処理に関するライブラリ)のインストールです。
Libpng-1.2.8
$ wget http://prdownloads.sourceforge.net/libpng/libpng-1.2.8.tar.bz2
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/libpng-1.2.8-link_to_proper_libs-1.patch
$ tar jxvf libpng-1.2.8.tar.bz2
$ cd libpng-1.2.8
$ patch -Np1 -i ../libpng-1.2.8-link_to_proper_libs-1.patch
$ make prefix=/usr ZLIBINC= ZLIBLIB= -f scripts/makefile.linux
$ su
# make prefix=/usr install -f scripts/makefile.linux

続いてLibtiff(TIFF形式の画像ファイル処理に関するライブラリ)のインストールです。
Libtiff-3.7.3
$ wget ftp://81.18.129.66/pub/mirrors/gentoo/distfiles/tiff-3.7.3.tar.gz
$ tar zxvf tiff-3.7.3.tar.gz
$ cd tiff-3.7.3
$ ./configure --prefix=/usr
$ make
$ su
# make install

続いてFreeType(True Typeフォントのレンダリング機能を提供するライブラリ)のインストールです。
FreeType-2.1.10
$ wget http://prdownloads.sourceforge.net/freetype/freetype-2.1.10.tar.bz2
$ tar jxvf freetype-2.1.10.tar.bz2
$ cd freetype-2.1.10
$ sed -i -r 's:.*(#.*BYTE.*) .*:\1:' include/freetype/config/ftoption.h
$ ./configure --prefix=/usr
$ make
$ su
# make install


最後にFontconfig(フォントファイルがある位置を管理し、使用可能なフォントのアクセス方法をシステムに伝えてやるソフト)のインストールです。
Fontconfig-2.3.2
$ wget http://fontconfig.org/release/fontconfig-2.3.2.tar.gz
$ tar zxvf fontconfig-2.3.2.tar.gz
$ cd fontconfig-2.3.2
$ ./configure --prefix=/usr --sysconfdir=/etc --disable-docs
$ make
$ su
# make install

BLFS Book:
Chapter18.Basic Networking Programs~Inetutils-1.4.2, Tcpwrappers-7.6, Portmap-5beta, Net-tools-1.60
Chapter11.System Utilities~UnZip-5.52, Zip-2.31, Pkg-config-0.19, Which-2.16


ここからは、一般的なライブラリをはじめ、しばしばよく利用されるコマンド等各種ユーティリティをインストールしていきます。

先ずは、Inetutils(ftpd、telnetdなど今となっては古き良き時代?に使用されていた基本的なインターネット関連ツールを含むパッケージ)をインストールします。実行コマンドは次の通り。
Inetutils-1.4.2
$ wget ftp://ftp.gnu.org/gnu/inetutils/inetutils-1.4.2.tar.gz
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/inetutils-1.4.2-kernel_headers-1.patch
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/inetutils-1.4.2-daemon_fixes-1.patch
$ tar xzvf inetutils-1.4.2.tar.gz
$ cd inetutils-1.4.2
$ patch -Np1 -i ../inetutils-1.4.2-kernel-headers-1.patch
$ patch -Np1 -i ../inetutils-1.4.2-daemon_fixes-1.patch
$ ./configure \
>--prefix=/usr \
>--libexecdir=/usr/sbin \
>--sysconfdir=/etc \
>--localstatedir=/var \
>--mandir=/usr/share/man \
>--infodir=/usr/share/info \
>--disable-logger \
>--disable-syslogd
$ make
$ su
# make install
# mv -v /usr/bin/ping /bin

次はLinuxではあまり使用しませんが、UnZipです。実行コマンドは下記の通り。
UnZip-5.52
$ wget ftp://ftp.openpkg.org/sources/DST/infozip/unzip552.tar.gz
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/unzip-5.52-fix_Makefile-1.patch
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/unzip-5.52-fix_libz-1.patch
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/unzip-5.52-dont_make_noise-1.patch
$ tar zxvf unzip552.tar.gz
$ cd unzip-5.52
$ patch -Np1 -i ../unzip-5.52-fix_Makefile-1.patch
$ patch -Np1 -i ../unzip-5.52-fix_libz-1.patch
$ patch -Np1 -i ../unzip-5.52-dont_make_noise-1.patch
$ cp -v unix/Makefile .
$ make prefix=/usr LOCAL_UNZIP=-DUSE_UNSHRINK linux
$ make prefix=/usr LOCAL_UNZIP=-DUSE_UNSHRINK linux_shlibz
$ su
# make prefix=/usr LOCAL_UNZIP=-DUSE_UNSHRINK install
# cp -v -d libunzip.so* /usr/lib

次はUnZipの反対のことをしてくれるZipです。実行コマンドは以下のとおり。
Zip-2.31
$ wget ftp://ftp.the.net/ftp1/opendarwin/distfiles/zip231.tar.gz
$ tar zxvf zip231.tar.gz
$ cd zip-2.31
$ sed -i -e 's@$(INSTALL) man/zip.1@$(INSTALL_PROGRAM) man/zip.1@' unix/Makefile
$ make prefix=/usr -f unix/Makefile generic_gcc
$ su
# make prefix=/usr -f unix/Makefile install

お次はPkg-config(コンパイル時にインクルードファイルやライブラリのパスを取得するツール)のインストールです。
Pkg-config-0.19
$ wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.19.tar.gz
$ tar xzvf pkg-config-0.19.tar.gz
$ cd pkg-config-0.19
$ ./configure --prefix=/usr
$ make
$ su
# make install

次にWhichをインストールします。これも使用頻度の高いコマンドといえるでしょう。
Which-2.16
$ wget ftp://ftp.gnu.org/gnu/which/which-2.16.tar.gz
$ tar zxvf which-2.16.tar.gz
$ cd which-2.16
$ ./configure --prefix=/usr
$ make
$ su
# make install

続いてTcpwrappers(ネットワークのアクセス制御ツール)をインストールします。以下のコマンドを実行します。
Tcpwrappers-7.6
$ wget http://files.ichilton.co.uk/nfs/tcp_wrappers_7.6.tar.gz
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/tcp_wrappers-7.6-shared_lib_plus_plus-1.patch
$ tar xzvf tcp_wrappers_7.6.tar.gz
$ cd tcp_wrappers_7.6
$ patch -Np1 -i ../tcp_wrappers-7.6-shared_lib_plus_plus-1.patch
$ sed -i -e "s,^extern char \*malloc();,/* & */," scaffold.c
$ make REAL_DAEMON_DIR=/usr/sbin STYLE=-DPROCESS_OPTIONS linux
$ su
# make install

次にPortmap(RPCプロトコルを管理するツール)をインストールします。
Portmap-5beta
$ wget ftp://ftp.porcupine.org/pub/security/portmap_5beta.tar.gz
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/portmap-5beta-compilation_fixes-3.patch
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/portmap-5beta-glibc_errno_fix-1.patch
$ tar xzvf portmap-5beta.tar.gz
$ cd portmap_5beta
$ patch -Np1 -i ../portmap-5beta-compilation_fixes-3.patch
$ patch -Np1 -i ../portmap-5beta-glibc_errno_fix-1.patch
$ make
$ su
# make install

お次はNet-tools(ifconfigやnetstat、routeなど、これまた頻繁に利用するコマンドを含むパッケージ)をインストールします。実行コマンドは以下のとおり。
Net-tools-1.60
$ wget http://www.tazenda.demon.co.uk/phil/net-tools/net-tools-1.60.tar.bz2
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/net-tools-1.60-gcc34-3.patch
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/net-tools-1.60-kernel_headers-2.patch
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/net-tools-1.60-mii_ioctl-1.patch
$ tar jxvf net-tools-1.60.tar.bz2
$ cd net-tools-1.60
$ patch -Np1 -i ../net-tools-1.60-gcc34-3.patch
$ patch -Np1 -i ../net-tools-kernel_headers-2.patch
$ patch -Np1 -i ../net-tools-mii_ioctl-1.patch
$ yes "" | make config
$ sed -i -e 's|HAVE_IP_TOOLS 0|HAVE_IP_TOOLS 1|g' \
>-e 's|HAVE_MII 0|HAVE_MII 1|g' config.h
$ sed -i -e 's|# HAVE_IP_TOOLS=0|HAVE_IP_TOOLS=1|g' \
>-e 's|# HAE_MII=0|HAVE_MII=1|g' config.make
$ make
$ su
# make update

BLFS Book: Chapter4.Security
・Shadow-4.0.9
・Iptables-1.3.3
・GnuPG-1.4.1

引き続きセキュリティ関連ソフトのインストール作業を行っていきます。先ずは、Shadowから。実行コマンドは以下のとおりです。
Shadow-4.0.9
$ wget ftp://ftp.pld.org.pl/software/shadow/old/shadow-4.0.9.tar.bz2
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/shadow-4.0.9-Linux_PAM_fixes-1.patch
$ tar jxvf shadow-4.0.9.tar.bz2
$ cd shadow-4.0.9
$ patch -Np1 -i ../shadow-4.0.9-Linux_PAM_fixes-1.patch
$ ./configure --libdir=/lib \
>--enable-shared \
>--with-libpam \
>--without-libcrack
$ sed -i 's/groups$(EXEEXT) //' src/Makefile
$ sed -i '/groups/d' man/Makefile
$ make
$ su
# make install
# mv -v /usr/bin/passwd /bin
# mv -v /lib/libshadow.*a /usr/lib
# rm -v /lib/libshadow.so
# ln -v -sf ../../lib/libshadow.so.0 /usr/lib/libshadow.so

Shadowのインストールが終わったら、認証に関する設定ファイル(/etc/login.defs)を編集します。編集内容は単にコメントするだけですが、設定項目が多いので少々面倒臭いです。以下の設定項目について、コメント(行頭に"#"を追加)します。エディタの検索機能で地道にコメントしていきましょう。

LASTLOG_ENAB
MAIL_CHECK_ENAB
PORTTIME_CHECKS_ENAB
CONSOLE
MOTD_FILE
NOLOGINS_FILE
PASS_MIN_LEN
SU_WHEEL_ONLY
MD5_CRYPT_ENAB
CONSOLE_GROUPS
ENVIRON_FILE
ULIMIT
ENV_TZ
ENV_HZ
ENV_SUPATH
ENV_PATH
QMAIL_DIR
MAIL_DIR
MAIL_FILE
CHFN_AUTH
FAILLOG_ENAB
QUOTAS_ENAB
FTMP_FILE
OBSCURE_CHECKS_ENAB
CRACKLIB_DICTPATH
PASS_CHANGE_TRIES
PASS_ALWAYS_WARN

次に認証系コマンド用のPAM設定ファイルを以下の通り作成します。
/etc/pam.d/login
auth       requisite pam_securetty.so
auth       requisite pam_nologin.so
auth       required pam_unix.so
account  required pam_access.so
account  required pam_unix.so
session   required pam_env.so
session   required pam_motd.so
session   required pam_limits.so
session   optional pam_mail.so dir=/var/mail standard
session   optional pam_lastlog.so
session   required pam_unix.so
password required pam_cracklib.so retry=3 difok=8 minlen=5 dcredit=3 ocredit=3 ucredit=2 lcredit=2
password required pam_unix.so md5 shadow use_authtok

/etc/pam.d/passwd
password required pam_cracklib.so retry=3 difok=8 minlen=5 dcredit=3 ocredit=3 ucredit=2 lcredit=2
password required pam_unix.so md5 shadow use_authtok

/etc/pam.d/su
auth    sufficient pam_rootok.so
auth    pam_rootok.so
account required pam_unix.so
session optional pam_mail.so dir=/var/mail standard
session required pam_env.so
session required pam_unix.so

/etc/pam.d/chage
auth     sufficient pam_rootok.so
auth     required pam_unix.so
account  required pam_unix.so
session  required pam_unix.so
password required pam_permit.so

/etc/pam.d/other
auth     required pam_deny.so
auth     required pam_warn.so
account  required pam_deny.so
session  required pam_deny.so
password required pam_deny.so
password  pam_warn.so

その他コマンドのPAM設定ファイルについても、内容的に変わらない物については、以下のコマンドで複製します。

# for PROGRAM in chpasswd newusers groupadd groupdel groupmod useradd userdel usermod
>do
>install -v -m644 /etc/pam.d/chage /etc/pam.d/$PROGRAM
>done

残りの設定は下記のとおりです。これでようやく、Shadowのインストールが完了です。

# if [ -f /etc/login.access ]; then
>mv -v /etc/login.access /etc/login.access.NOUSE
>fi
# if [ -f /etc/limits ]; then
>mv -v /etc/limits /etc/limits.NOUSE
>fi
# ENV_PATH=`grep '^#ENV_PATH' /etc/login.defs | awk '{ print $2 }' | sed 's/PATH=//'`
# echo 'PATH DEFAULT='`echo "${ENV_PATH}"`' OVERRIDE=${PATH}' >> /etc/security/pam_env.conf
# unset ENV_PATH

ようやくShadowのインストールが終わり、次にインストールするソフトはiptablesです。以下の要領でインストールします。
Iptables-1.3.3
$ wget http://www.iptables.org/files/iptables-1.3.3.tar.bz2
$ tar jvxf iptables-1.3.3.tar.bz2
$ cd iptables-1.3.3
$ make PREFIX=/usr LIBDIR=/lib BINDIR=/sbin
$ su
# make PREFIX=/usr LIBDIR=/lib BINDIR=/sbin install
# make install-iptables

最後にGnuPGをインストールして、セキュリティ関連ソフトのインストールは終わりです。実行したコマンドは下記の通り。
GnuPG-1.4.1
$ wget http://public.ftp.planetmirror.com/pub/gnupg/gnupg-1.4.1.tar.bz2
$ tar jxvf gnupg-1.4.1.tar.bz2
$ cd gnupg-1.4.1
$ ./configure --prefix=/usr --libexecdir=/usr/lib
$ make
$ su
# make install
# chmod -v 4755 /usr/bin/gpg

BLFS Book: Chapter4.Security
・OpenSSL-0.9.7g
・CrackLib-2.8.3
・Berkeley DB-4.3.28(Chapter23.Databases)
・Linux-PAM-0.80

ここでは、セキュリティ関連のソフトをインストールします。先ずは、OpenSSLからです。実行コマンドは以下のとおりです。
OpenSSL
$ wget http://www.openssl.org/source/openssl-0.9.7g.tar.gz
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/openssl-0.9.7g-fix_manpages-1.patch
$ tar xzvf openssl-0.9.7.tar.gz
$ cd openssl-0.9.7g
$ ./config --openssldir=/etc/ssl \
>--prefix=/usr shared
$ make MANDIR=/usr/share/man
$ su
# make MANDIR=/usr/share/man install
# cp -v -r certs /etc/ssl

続いてCrackLibのインストールは、以下のとおり。
CrackLib
$ wget http://prdownloads.sourceforge.net/cracklib/cracklib-2.8.3.tar.gz
$ wget http://prdownloads.sourceforge.net/cracklib/cracklib-words.gz
$ wget http://www.linuxfromscratch.org/blfs/downloads/6.1/cracklib-2.8.3-heimdal-1.patch
$ tar xzvf cracklib-2.8.3.tar.gz
$ cd cracklib-2.8.3
$ patch -Np1 -i ../cracklib-2.8.3-heimdal-1.patch
$ ./configure --prefix=/usr \
>--datadir=/lib
$ make
$ su
# make install
# mv -v /usr/lib/libcrack.so.2* /lib
# ln -v -sf ../../lib/libcrack.so.2.8.0 /usr/lib/libcrack.so
# install -v -m644 -D ../cracklib-words.gz /usr/share/dict/cracklib-words.gz
# gunzip -v /usr/share/dict/cracklib-words.gz
# ln -v -s cracklib-words /usr/share/dict/words
# echo $(hostname) >> /usr/share/dict/cracklib-extra-words
# create-cracklib-dict /usr/share/dict/cracklib-words /usr/share/dict/cracklib-extra-words

次にインストールするLinux-PAMが必要とするBerkeley DBをここでインストールしておきます。
Berkeley DB
$ wget ftp://ftp.osb.hu/openwrt/sources/db-4.3.28.tar.gz
$ tar zxvf db-4.3.28.tar.gz
$ cd db-4.3.28/build_unix
$ ../dist/configure --prefix=/usr \
>--enable-compat185 \
>--enable-cxx
$ make LIBSO_LIBS="-lpthread" LIBXSO_LIBS="-lpthread"
$ su
# make docdir=/usr/share/doc/db-4.3.28 install
# chown root:root /usr/bin/db_* /usr/lib/libdb* /usr/include/db*
# chown -R root:root /usr/share/doc/db-4.3.28

Linux-PAMのインストールは下記のとおり。
Linux-PAM-0.80
$ wget http://www.kernel.org/pub/linux/libs/pam/pre/library/Linux-PAM-0.80.tar.bz2
$ tar jxvf Linux-PAM-0.80.tar.bz2
$ cd Linux-PAM-0.80
$ sed -i 's|DICT_DIR_CANDIDATES="|&/lib /lib/cracklib |' configure
$ ./configure --enable-static-libpam \
>--with-mailspool=/var/mail \
>--enable-read-both-confs \
>--sysconfdir=/etc \
>--mandir=/usr/share/man
$ make
$ su
# make install
# mv -v /lib/libpam.a /lib/libpam_misc.a /lib/libpamc.a /usr/lib
# rm -v /lib/libpam{,c,_misc}.so
# ln -v -sf ../../lib/libpam.so.0.80 /usr/lib/libpam.so
# ln -v -sf ../../lib/libpam_misc.so.0.80 /usr/lib/libpam_misc.so
# ln -v -sf ../../lib/libpamc.so.0.80 /usr/lib/libpamc.so
# mkdir /etc/pam.d
# vi /etc/pam.d/other ← 以下の内容でファイル作成
# cat /etc/pam.d/other
auth required pam_unix.so nullok
account required pam_unix.so
session required pam_unix.so
password required pam_unix.so nullok

今日はここまで。次にインストールするシャドウパスワードでおなじみのShadowも設定がかなり面倒臭い。

BLFS Book: Chapter3.After LFS Configuration Issues
・The /etc/shells File
・Random Number Generation

その他の設定として、使用可能なシェルの設定を/etc/shellsに記述しておきます。
/etc/shells
/bin/sh
/bin/bash

もう一つ、暗号化ソフト等で使用される乱数発生機能の設定を行います。先ず、blfs-bootscriptsというツールをダウンロードし、乱数発生起動スクリプトをインストールします。実行コマンドは、以下の通りです。なお、wgetは事前に個別インストールしたもので、LFS構築直後はインストールされていません。

# wget http://www.linuxfromscratch.org/blfs/downloads/6.1/blfs-bootscripts-6.1.tar.bz2
# tar jxvf blfs-bootscripts-6.1.tar.bz2
# cd blfs-bootscripts-6.1
# make install-random

BLFS Book: Chapter3.After LFS Configuration Issues
・The Bash Shell Startup Files

先ず、bashを使用したログイン時に最初に読み込まれるファイル/etc/profileを以下の内容で作成します。
/etc/profile
pathremove () {
    local IFS=':'
    local NEWPATH
    local DIR
    local PATHVARIABLE=${2:-PATH}
    for DIR in ${!PATHVARIABLE}; do
        if [ "$DIR" != "$1" ]; then
            NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
        fi
    done
    export $PATHVARIABLE="$NEWPATH"
}

pathprepend () {
    pathremove $1 $2
    local PATHVARIABLE=${2:-PATH}
    export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}"
}

pathappend () {
    pathremove $1 $2
    local PATHVARIABLE=${2:-PATH}
    export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1"
}

export PATH=/bin:/usr/bin
if [ $EUID -eq 0 ]; then
    pathappend /sbin:/usr/sbin
    unset HISTFILE
fi

export HISTSIZE=1000
export HISTIGNORE="&:[bf]g:exit"
export PS1='\u@\h:\w\$ '
for script in /etc/profile.d/*.sh ; do
    if [ -r $script ]; then
        . $script
    fi
done
unset pathremove pathprepend pathappend

以下、/etc/profileから読み込まれるファイルを大量生産していきます。
/etc/profile.d/dircolors.sh
if [ -f "/etc/dircolors" ] ; then
    eval $(dircolors -b /etc/dircolors)
    if [ -f "$HOME/.dircolors" ] ; then
        eval $(dircolors -b $HOME/.dircolors)
    fi
fi
alias ls='ls --color=auto'

/etc/profile.d/extrapaths.sh
if [ -d /usr/local/lib/pkgconfig ] ; then
    pathappend /usr/local/lib/pkgconfig PKG_CONFIG_PATH
fi
if [ -d /usr/local/bin ] ; then
    pathprepend /usr/loca/bin
fi
if [ -d /usr/local/sbin -a $EUID -eq 0 ] ; then
    pathprepend /usr/loca/sbin
fi
for directory in $(find /opt/*/lib/pkgconfig -type d 2>/dev/null); do
    pathappend $directory PKG_CONFIG_PATH
done
for directory in $(find /opt/*/bin -type d 2>/dev/null); do
    pathappend $directory
done
if [ -d ~/bin ] ; then
    pathprepend ~/bin
fi

/etc/profile.d/readline.sh
if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
    INPUTRC=/etc/inputrc
fi
export INPUTRC

/etc/profile.d/tinker-term.sh
if [ -n "$COLORTERM" ]; then
    export TERM=xterm-color
fi
if [ "$TERM" = "xterm" ]; then
    export TERM=xterm-color
fi

/etc/profile.d/umask.sh
if [ "$(id -gn)" = "$(id -un)" -a $EUID -gt 99 ]; then
    umask 002
else
    umask 022
fi

/etc/profile.d/X.sh
if [ -x /usr/X11R6/bin/X ]; then
    pathappend /usr/X11R6/bin
fi
if [ -d /usr/X11R6/lib/pkgconfig ]; then
    pathappend /usr/X11R6/lib/pkgconfig PKG_CONFIG_PATH
fi

/etc/profile.d/extra-prompt.sh
PROMPT_COMMAND="echo -ne '\e[1m${USER}@${HOSTNAME} : ${PWD}\e[0m\a'"
export PROMPT_COMMAND

/etc/profile.d/i18n.sh
export LC_ALL=ja_JP.eucJP
export LANG=ja_JP.eucJP
export G_FILENAME_ENCODING=@locale

最後に、Linuxではお馴染みbashの設定ファイルを作成しておきます。
/etc/bashrc
if [ -f /etc/profile.d/tinker-term.sh ]; then
    . /etc/profile.d/tinker-term.sh
fi
alias ls='ls --color=auto'
export PS1='\u@\h:\w\$ '

$HOME/.bashrc
if [ -f "/etc/bashrc" ]; then
    . /etc/bashrc
fi

BLFS Book: Chapter3.After LFS Configuration Issues
・About System Users and Groups

LFSを実用的なシステムに仕立て上げる為の第一歩として、先ずはシステムユーザーの登録を行います。以下の内容で、/etc/passwd、/etc/groupを作成します。
/etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1::/:/bin/false
lp:x:9:9::/:/bin/false
named:x:20:20::/:/bin/false
gdm:x:21:21::/:/bin/false
fcron:x:22:22::/:/bin/false
apache:x:25:25::/:/bin/false
smmsp:x:26:26::/:/bin/false
exim:x:31:31::/:/bin/false
postfix:x:32:32::/:/bin/false
sendmail:x:34:34::/:/bin/false
vmailman:x:35:35::/:/bin/false
news:x:36:36::/:/bin/false
mysql:x:40:40::/:/bin/false
postgres:x:41:41::/:/bin/false
ftp:x:45:45::/:/bin/false
proftpd:x:46:46::/:/bin/false
vsftpd:x:47:47::/:/bin/false
rsyncd:x:48:48::/:/bin/false
sshd:x:50:50::/:/bin/false
stunnel:x:51:51::/:/bin/false
svn:x:56:56::/:/bin/false
games:x:60:60::/:/bin/false
anonymous:x:98:98::/:/bin/false
nobody:x:99:99::/:/bin/false

/etc/group
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tty:x:4:
tape:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
named:x:20:
gdm:x:21:
fcron:x:22:
apache:x:25:
smmsp:x:26:
exim:x:31:
postfix:x:32:
postdrop:x:33:
mail:x:34:
vmailman:x:35:
news:x:36:
mysql:x:40:
ftp:x:45:
proftpd:x:46:
vsftpd:x:47:
rsyncd:x:48:
sshd:x:50:
stunnel:x:51:
svn:x:56:
svtest:x:57:
games:x:60:
nogroup:x:99:
users:x:100:

次に、一般ユーザーの作成準備にとりかかります。先ず、useradd実行時のデフォルトの設定を行う為のファイルを作成します。
/etc/default/useradd
GOUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel

この時点では、未だ/etc/skelディレクトリが作成されていないので、作成します。

# mkdir /etc/skel

以上で準備完了ということで、一般ユーザーを作成します。

# useradd -m hogehoge
# passwd hogehoge
New password:
Re-enter new password:

前回までにLFSの構築は終わっているわけですが、完成したシステムは昨今のLinuxディストリビューションに比べたら実用性に乏しいと言わざるを得ないでしょう。

GUIを特に必要としないシステム(サーバー、ファイアウォール等)の特定用途として使用するならば、GUIが入っていなくとも不便さは感じられないかと思いますが、一般的な用途としてWEBブラウジング、メール程度ができるくらいのGUIを備えたシステムを想定すると、現時点でのLFSにはシステム的に物足りなさを感じてしまいます。

GUI環境を備えるには、今後も多数のソフトウェアをインストールする必要があり、詳しくはBLFS(Beyond Linux From Scratch) Bookなるものに記載されていますが、当該資料は1000ページにも及ぶ一大巨編となっており、その全てを読解してシステムを構築する気力はもはや小生にはありません。

そこで、今後の作業としてはBLFSの内容に従いつつも、よりかいつまんでGUI環境の構築までを解説していた月刊誌(今は残念ながら休刊となっている)Linux World 2006年11、12月号の内容に従ってGUI環境を構築していきたいと思います。

なお、今後の作業を考慮して、現時点のLFSにwgetをインストールしておくと、各種パッケージ(tarボール)のダウンロード時に重宝するかと思います。昔ながらのftpで取得しても良いですが、匿名ユーザーanonymousでログインする場合、大抵はパスワードにメールアドレスを入力するのが流儀であり、入力が面倒です。その点、wgetならアドレスさえ指定すれば、あとは良しなに事を進めてくれるので、それほど手間はかからないでしょう。なお、wgetはこちらで入手できます。

wget-1.10.2
# ftp gnjilux.cc.fer.hr
Name (gnjilux.cc.fer.hr:root): anonymous ← 匿名ユーザー(anonymous)でログイン
Password:XXXXXXXXX ← メールアドレスを入力
ftp>cd pub/unix/util/wget
ftp>get wget-1.10.2.tar.gz
ftp>bye
# tar zxvf wget-1.10.2.tar.gz
# cd wget-1.10.2
# ./configure
# make
# make install
# export PATH=$PATH:/usr/local/bin

wgetは/usr/local/binにインストールされるので、当該パスをPATHに設定して使用します。

LFS Book: Chapter8.Making the LFS System Bootable

ここまで来れば、LFSの起動まであともう少しです。
先ず、/etc/fstabの設定を行います。面倒臭いので、viで編集しちゃいます。

# vi /etc/fstab
# cat /etc/fstab
/dev/hda1 swap swap pri=1 0 0
/dev/hda2 / ext2 defaults 1 1
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devpts /dev/pts devpts gid=4,mode=620 0 0
shm /dev/shm tmpfs defaults 0 0

ここでようやくカーネルの登場です。カーネルの再構築を行った事がある方にはお馴染みの手順です。

# cd /sources/linux-2.6.11.12
# make mrproper
# make menuconfig
# make
# vi /etc/modprobe.conf
# cat /etc/modprobe.conf
alias usb-controller1 uhci-hcd
alias eth0 e100
# make modules_install
# cp -v arch/i386/boot/bzImage /boot/lfskernel-2.6.11.12
# cp -v System.map /boot/System.map-2.6.11.12
# cp -v .config /boot/config-2.6.11.12

最後にGRUBの設定を行います。

# grub
grub>root (hd0,1)
grub>setup (hd0)
grub>quit
# vi /boot/grub/menu.lst
# cat /boot/grub/menu.lst
default 0
timeout 30
color green/black light-green/black
title LFS 6.1.1
root (hd0,1)
kernel /boot/lfskernel-2.6.11.12 root=/dev/hda2
# mkdir -v /etc/grub
# ln -sv /boot/grub/menu.lst /etc/grub
# echo 6.1.1 > /etc/lfs-release

以上でLFSの構築は完了です。以下のコマンドを実行してLFSを起動してみましょう。

# logout
# umount -v $LFS/dev/pts
# umount -v $LFS/dev/shm
# umount -v $LFS/dev
# umount -v $LFS/proc
# umount -v $LFS/sys
# umount -v $LFS
# shutdown -r now

小生の場合、初回起動時にswapパーティションの有効化に失敗(FAIL)しましたが、多分mkswapしておくのを忘れたか何かの原因で、初回起動後、rootでログインしてmkswapして再起動したら特にエラーも発生せず、無事起動しました。
無事起動され、ログインプロンプトが表示された時の画面がこちらです。ピンボケして見づらいですが・・・

LFS Book: Chapter7.Setting Up System Bootscripts

ここでは、LFSシステムの起動の為に必要な設定を行っていきます。主に、システムの起動時に読み込まれるスクリプト(設定ファイル)の作成を行います。
先ずは起動スクリプトのインストールからです。以下のコマンドを実行します。

# cd /sources/lfs-bootscripts-3.2.1
# make install

次にシステム起動時に設定される時刻を世界標準時ではなく、現地時刻に設定するための設定を行います。

# cat > /etc/sysconfig/clock <<"EOF"
>UTC=0
>EOF

次にコンソールの設定です。日本語配列のキーボードを使用している場合は以下の設定を行います。

# cat > /etc/sysconfig/console <<"EOF"
>KEYMAP="jp106"
>EOF

次にホスト名の設定を行います。適当に好きな名前をホスト名に設定しましょう。

# echo "HOSTNAME=gluon" > /etc/sysconfig/network

続いて/etc/hostsファイルを編集します。これまでの作業の中で当該ファイルは既に作成されているので、適当に各自の環境に併せて設定してやります。LFS環境に既にviも入っているのでvi好きな人ならviで編集すればてっとり早いでしょう。

# vi /etc/hosts
# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.1.101 quark.skucky.com quark
192.168.1.11 neutrino.skucky.com neutrino
192.168.1.12 lepton.skucky.com lepton
192.168.1.15 gluon.skuckyu.com gluon

次にNICの設定ファイルを作成します。因みにこの時点では固定IPでの設定しかできません(DHCPクライアントがインストールされていないため)。

# cd /etc/sysconfig/network-devices
# mkdir -v ifconfig.eth0
# cat > ifconfig.eth0/ipv4 <<"EOF"
>ONBOOT=yes
>SERVICE=ipv4-static
>IP=192.168.1.15
>GATEWAY=192.168.1.1
>PREFIX=24
>BROADCAST=192.168.1.255
>EOF

続いてリゾルバの設定ファイルを作成します。

# cat > /etc/resolv.conf <<"EOF"
>domain skucky.com
>nameserver 192.168.1.101
>nameserver 203.xxx.yyy.zzz
>nameserver 203.XXX.YYY.ZZZ
>EOF

LFS Book: 6.61.Stripping Again~6.62.Cleaning Up

ここでまたデバッグ情報の削除を行い、これからの作業のためのchrootの変更点を確認しておきます。

デバッグ情報の削除は前にも行っていますが、今回は以下のコマンドを実行します。


# logout
# chroot $LFS /tools/bin/env -i \
>HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
>PATH=/bin:/usr/bin:/sbin:/usr/sbin \
>/tools/bin/bash --login
# /tools/bin/find /{,usr/}{bin,lib,sbin} -type f \
>-exec /tools/bin/strip --strip-debug '{}' ';'

これ以降$LFSにchrootする場合、以下のコマンドでchrootします。

# chroot "$LFS" /usr/bin/env -i \
>HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
>PATH=/bin:/usr/bin:/sbin:/usr/sbin \
>/bin/bash --login

変更点は/tools/bin/envではなく、/usr/bin/envを使用していること、PATHから/tools/binを取り除いていること、/tools/bin/bashではなく、/bin/bashを使用していること、そして、bashの+hオプション(ハッシュ機能を使用しないオプション)を除去している点です。

もうお分かりになるかと思いますが、/toolsディレクトリ(暫定環境)はこの時点で不要となります。
ただし、削除した場合、一時的にtoolchainのテストのためにインストールした一部のパッケージ(Tcl、Expect、DejaGNU)を後で必要とする場合、再インストールする必要があります。

LFS Book: 6.34.Texinfo-4.8~6.59.Util-linux-2.12q

Texinfo-4.8
# cd /sources/texinfo-4.8
# patch -Np1 -i ../texinfo-4.8-tempfile_fix-1.patch
# ./configure --prefix=/usr
# make
# make install
# make TEXMF=/usr/share/texmf install-tex
# cd /usr/share/info
# rm dir
# for f in *
>do install-info $f dir 2>/dev/null
>done

Autoconf-2.59
# cd /sources/autoconf-2.59
# ./configure --prefix=/usr
# make
# make install

Automake-1.9.5
# cd /sources/automake-1.9.5
# ./configure --prefix=/usr
# make
# make install

Bash-3.0
# cd /sources/bash-3.0
# tar jxvf ../bash-doc-3.0.tar.bz2 &&
>sed -i "s|htmldir = @htmldir@|htmldir = /usr/share/doc/bash-3.0|" Makefile.in
# patch -Np1 -i ../bash-3.0-fixes-3.patch
# patch -Np1 -i ../bash-3.0-avoid_WCONTINUED-1.patch
# ./configure \
>--prefix=/usr \
>--bindir=/bin \
>--without-bash-malloc \
>--with-installed-readline
# make
# make install
# exec /bin/bash --login +h

File-4.13
# cd /sources/file-4.13
# ./configure --prefix=/usr
# make
# make install

Libtool
# cd /sources/libtool-1.5.14
# ./configure --prefix=/usr
# make
# make install

Bzip2-1.0.3
# cd /sources/bzip2-1.0.3
# patch -Np1 -i ../bzip2-1.0.3-install_docs-1.patch
# patch -Np1 -i ../bzip2-1.0.3-bzgrep_security-1.patch
# make -f Makefile-libbz2_so
# make clean
# make
# make install
# cp -v bzip2-shared /bin/bzip2
# cp -av libbz2.so* /lib
# ln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so
# rm -v /usr/bin/{bunzip2,bzcat,bzip2}
# ln -sv bzip2 /bin/bunzip2
# ln -sv bzip2 /bin/bzcat

Diffutils-2.8.1
# cd /sources/diffutils-2.8.1
# ./configure --prefix=/usr
# make
# make install

Kbd-1.12
# cd /sources/kbd-1.12
# ./configure
# make
# make install

E2fsprogs-1.37
# cd /sources/e2fsprogs-1.37
# sed -i -e 's/-DTEST/$(ALL_CFLAGS) &/' lib/e2p/Makefile.in
# mkdir -v build
# cd build
# ../configure --prefix=/usr \
>--with-root-prefix="" \
>--enable-elf-shlibs \
>--disable-evms
# make
# make install
# make install-libs

Grep-2.5.1a
# cd /sources/grep-2.5.1a
# ./configure --prefix=/usr --bindir=/bin
# make
# make install

GUB-0.96
# cd /sources/grub-0.96
# ./configure --prefix=/usr
# make
# make install
# mkdir -v /boot/grub
# cp -v /usr/lib/grub/i386-pc/stage{1,2} /boot/grub

Gzip-1.3.5
# cd /sources/gzip-1.3.5
# patch -Np1 -i ../gzip-1.3.5-security_fixes-1.patch
# ./configure --prefix=/usr
# sed -i 's@"BINDIR"@/bin@g' gzexe.in
# make
# make install
# mv -v /usr/bin/gzip /bin
# rm -v /usr/bin/{gunzip,zcat}
# ln -sv gzip /bin/gunzip
# ln -sv gzip /bin/zcat
# ln -sv gzip /bin/compress
# ln -sv gunzip /bin/uncompress

Hotplug-2004_09_23
# cd /sources/hotplug-2004_09_23
# make install
# cp -v etc/hotplug/pnp.distmap /etc/hotplug
# rm -rfv /etc/init.d
# rm -fv /etc/hotplug/net.agent
# mkdir -v /lib/firmware

Man-1.5p
# cd /sources/man-1.5p
# sed -i 's@-is@&R@g' configure
# sed -i 's@MANPATH./usr/man@#&@g' src/man.conf.in
# ./configure -confdir=/etc
# make
# make install

Make-3.80
# cd /sources/make-3.80
# ./configure --prefix=/usr
# make
# make install

Module-Init-Tools-3.1
# cd /sources/module-init-tools-3.1
# touch modprobe.conf.5
# tar jxvf ../module-init-tools-testsuite-3.1.tar.bz2 --strip-components=1
# ./configure
# make check
# make distclean
# ./configure --prefix="" --enable-zlib
# make
# make install

Patch-2.5.4
# cd /sources/patch-2.5.4
# CPPFLAGS=-D_GNU_SOURCE ./configure --prefix=/usr
# make
# make install

Procps-3.2.5
# cd /sources/procps-3.2.5
# make
# make install

Psmisc-21.6
# cd /sources/psmisc-21.6
# ./configure --prefix=/usr --exec-prefix=""
# make
# make install
# mv -v /bin/pstree* /usr/bin
# ln -sv killall /bin/pidof

Shadow-4.0.9
# cd /sources/shadow-4.0.9
# ./configure --libdir=/lib --enable-shared
# sed -i 's/groups$(EXEEXT) //' src/Makefile
# sed -i '/groups/d' man/Makefile
# make
# make install
# cp -v etc/{limits,login.access} /etc
# sed -e 's@#MD5_CRYPT_ENAB.no@MD5_CRYPT_ENAB yes@' \
>-e 's@/var/spool/mail@/var/mail@' etc/login.defs.linux > /etc/login.defs
# mv -v /usr/bin/passwd /bin
# mv -v /lib/libshadow.*a /usr/lib
# rm -v /lib/libshadow.so
# ln -sfv ../../lib/libshadow.so.0 /usr/lib/libshadow.so
# mkdir -v /etc/default
# pwconv
# grpconv
# passwd root

Sysklogd-1.4.1
# cd /sources/sysklogd-1.4.1
# patch -Np1 -i ../sysklogd-1.4.1-fixes-1.patch
# make
# make install
# cat > /etc/syslog.conf << "EOF"
>auth,authpriv.* -/var/log/auth.log
>*.*;auth,authpriv.none -/var/log/sys.log
>daemon.* -/var/log/daemon.log
>kern.* -/var/log/kern.log
>mail.* -/var/log/mail.log
>user.* -/var/log/user.log
>*.emerg *
>local2.* -/var/log/boot.log
>EOF

Sysvinit-2.86
# cd /sources/sysvinit-2.86
# sed -i 's@Sending processes@& started by init@g' src/init.c
# make -C src
# make -C src install
# cat > /etc/inittab << "EOF"
>id:3:initdefault:
>
>si::sysinit:/etc/rc.d/init.d/rc sysinit
>
>l0:0:wait:/etc/rc.d/init.d/rc 0
>l1:S1:wait:/etc/rc.d/init.d/rc 1
>l2:2:wait:/etc/rc.d/init.d/rc 2
>l3:3:wait:/etc/rc.d/init.d/rc 3
>l4:4:wait:/etc/rc.d/init.d/rc 4
>l5:5:wait:/etc/rc.d/init.d/rc 5
>l6:6:wait:/etc/rc.d/init.d/rc 6
>
>ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
>
>su:S016:once:/sbin/sulogin
>
>1:2345:respawn:/sbin/agetty -I '\033(K' tty1 9600
>2:2345:respawn:/sbin/agetty -I '\033(K' tty2 9600
>3:2345:respawn:/sbin/agetty -I '\033(K' tty3 9600
>4:2345:respawn:/sbin/agetty -I '\033(K' tty4 9600
>5:2345:respawn:/sbin/agetty -I '\033(K' tty5 9600
>6:2345:respawn:/sbin/agetty -I '\033(K' tty6 9600
>EOF

Tar-1.15.1
# cd /sources/tar-1.15.1
# patch -Np1 -i ../tar-1.15.1-sparse_fix-1.patch
# patch -Np1 -i ../tar-1.15.1-security_fixes-1.patch
# ./configure --prefix=/usr \
>--bindir=/bin \
>--libexecdir=/usr/sbin
# make
# make install

Udev-056
# cd /sources/udev-056
# make udevdir=/dev
# make DESTDIR=/ udevdir=/dev install
# cp -v ../udev-config-4.rules /etc/udev/rules.d/25-lfs.rules
# /sbin/udevstart

Util-linux-2.12q
# cd /sources/util-linux-2.12q
# sed -i 's@etc/adjtime@var/lib/hwclock/adjtime@g' hwclock/hwclock.c
# mkdir -p /var/lib/hwclock
# patch -Np1 -i ../util-linux-2.12q-cramfs-1.patch
# patch -Np1 -i ../util-linux-2.12q-umount_fix-1.patch
# ./configure
# make HAVE_KILL=yes HAVE_SLN=yes
# make HAVE_KILL=yes HAVE_SLN=yes install
# mv /usr/bin/logger /bin

以上で必要なパッケージのインストールは完了です。

LFS Book: 6.15.Coreutils-5.2.1~6.33.Perl-5.8.7

これ以降は残り45個あまりのパッケージをひたすらインストールしていきます。

Coreutils-5.2.1
# cd /sources/coreutils-5.2.1
# patch -Np1 -i ../coreutils-5.2.1-uname-2.patch
# patch -Np1 -i ../coreutils-5.2.1-suppress_uptime_kill_su-1.patch
# DEFAULT_POSIX2_VERSION=199209 ./configure --prefix=/usr
# make
# echo "dummy1:x:1000:" >> /etc/group
# echo "dummy2:x:1001:dummy" >> /etc/group
# echo "dummy:x:1000:1000:::/bin/bash" >> /etc/passwd
# make NON_ROOT_USERNAME=dummy check-root
# src/su dummy -c "make RUN_EXPENSIVE_TESTS=yes check"
# sed -i '/dummy/d' /etc/passwd /etc/group
# make install
# mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin
# mv -v /usr/bin/{false,hostname,ln,ls,mkdir,mknod,mv,pwd,rm} /bin
# mv -v /usr/bin/{rmdir,stty,sync,true,uname} /bin
# mv -v /usr/bin/chroot /usr/sbin
# mv -v /usr/bin/{head,sleep} /bin

Zlib-1.2.3
# cd /sources/zlib-1.2.3
# ./configure --prefix=/usr --shared --libdir=/lib
# make
# make install
# rm -v /lib/libz.so
# ln -sfv ../../lib/libz.so.1.2.3 /usr/lib/libz.so
# make clean
# ./configure --prefix=/usr
# make
# make install
# chmod -v 644 /usr/lib/libz.a

Mktemp-1.5
# cd /sources/mktemp-1.5
# patch -Np1 -i ../mktemp-1.5-add_tempfile-2.patch
# ./configure --prefix=/usr --with-libc
# make
# make install
# make install-tempfile

Iana-Etc-1.04
# cd /sources/iana-etc-1.0.4
# make
# make install

Findutils-4.2.23
# cd /sources/findutils-4.2.23
# ./configure --prefix=/usr \
# --libexecdir=/usr/lib/locate \
# --localstatedir=/var/lib/locate
# make
# make install

Gawk-3.1.4
# cd /sources/gawk-3.1.4
# ./configure --prefix=/usr --libexecdir=/usr/lib
# make
# make install

Ncurses-5.4
# cd /sources/ncurses-5.4
# ./configure --prefix=/usr --with-shared --without-debug
# make
# make install
# chmod -v 755 /usr/lib/*.5.4
# chmod -v 644 /usr/lib/libncurses++.a
# mv -v /usr/lib/libncurses.so.5* /lib
# ln -sfv ../../lib/libncurses.so.5 /usr/lib/libncurses.so
# ln -sfv libncurses.so /usr/lib/libncurses.so

Readline-5.0
# cd /sources/readline-5.0
# patch -Np1 -i ../readline-5.0-fixes-1.patch
# ./configure --prefix=/usr --libdir=/lib
# make SHLIB_XLDFLAGS=-lncurses
# make install
# chmod -v 755 /lib/lib{readline,history}.so*
# mv -v /lib/lib{readline,history}.a /usr/lib
# rm -v /lib/lib{readline,history}.so
# ln -sfv ../../lib/libreadline.so.5 /usr/lib/libreadline.so
# ln -sfv ../../lib/libhistory.so.5 /usr/lib/libhistory.so

Vim-6.3
# cd /sources/vim63
# echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
# patch -Np1 -i ../vim-6.3-security_fix-2.patch
# ./configure --prefix=/usr --enable-multibyte
# make
# make install
# ln -sv vim /usr/bin/vi
#
# cat > /etc/vimrc << "EOF"
>set nocompatible
>set backspace=2
>syntax on
>if (&term == "iterm") || (&term == "putty")
> set background=dark
>endif
>EOF

M4-1.4.3
# cd /sources/m4-1.4.3
# ./configure --prefix=/usr
# make
# make install

Bison-2.0
# cd /sources/bison-2.0
# ./configure --prefix=/usr
# make
# make install

Less-382
# cd /sources/less-382
# ./configure --prefix=usr --bindir=/bin --sysconfdir=/etc
# make
# make install

Groff-1.19.1
# cd /sources/groff-1.19.1
# PAGE=a4 ./configure --prefix=/usr
# make
# make install
# ln -sfv soelim /usr/bin/zsoelim
# ln -sfv eqn /usr/bin/geqn
# ln -sfv tbl /usr/bin/gtbl

Sed-4.1.4
# cd /sources/sed-4.1.4
# sed -i 's@/doc@&/sed-4.1.4@' doc/Makefile.in
# ./configure --prefix=/usr --bindir=/bin
# make
# make install

Flex-2.5.31
# cd /sources/flex-2.5.31
# patch -Np1 -i ../flex-2.5.31-debian_fixes-3.patch
# touch doc/flex.1
# ./configure --prefix=/usr
# make
# make install
# ln -sv libfl.a /usr/lib/libl.a
#
# cat > /usr/bin/lex << "EOF"
>#!/bin/sh
>exec /usr/bin/flex -l "$@"
>EOF
# chmod -v 755 /usr/bin/lex

Gettext-0.14.3
# cd /sources/gettext-0.14.3
# ./configure --prefix=/usr
# make
# make install

Inetutils-1.4.2
# cd /sources/inetutils-1.4.2
# patch -Np1 -i ../inetutils-1.4.2-kernel_headers-1.patch
# patch -Np1 -i ../inetutils-1.4.2-no_server_man_pages-1.patch
# ./configure \
>--prefix=/usr \
>--libexecdir=/usr/sbin \
>--sysconfdir=/etc \
>--localstatedir=/var \
>--disable-logger \
>--disable-syslogd \
>--disable-whois \
>--disable-servers
# make
# make install
#mv -v /usr/bin/ping /bin

IP Route2-2.6.11-050330
# cd /sources/iproute2-2.6.11
# sed -i '/^TARGETS/s@arpd@@g' misc/Makefile
# ./configure
# make SBINDIR=/sbin
# make SBINDIR=/sbin install

Perl-5.8.7
# cd /sources/perl-5.8.7
# patch -Np1 -i ../perl-5.8.7-sprintf_vulnerability-1.patch
# ./configure.gnu --prefix=/usr -Dpager="/bin/less -isR"
# make
# echo "127.0.0.1 localhost $(hostname)" > /etc/hosts
# make test
# make install

今日はここまで。流石に疲れた。

LFS Book: 6.14.GCC-3.4.3

次はgccのインストールです。実行コマンドは以下のとおりです。なお、3番目のパッチはLFS Bookには記載がありませんが、カーネル2.6.12以降でgccの動作テストが失敗するとのことなので、このパッチを当てておきます。当該パッチは、LFSの公式サイトから"patches"→"downloads"→"gcc"とリンクをたどれば置いてあります。

# cd /sources
# tar jxvf gcc-3.4.3.tar.bz2
# cd gcc-3.4.3
# patch -Np1 -i ../gcc-3.4.3-no_fixincludes-1.patch
# patch -Np1 -i ../gcc-3.4.3-linkonce-1.patch
# patch -Np1 -i ../gcc-3.4.3-pch-1.patch
# sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
# mkdir -v ../gcc-build
# cd ../gcc-build
# ../gcc-3.4.3/configure \
>--prefix=/usr \
>--libexecdir=/usr/lib \
>--enable-shared \
>--enable-threads=posix \
>--enable-__cxa_atexit \
>--enable-clocale=gnu \
>--enable-languages=c,c++
# make
# make -k check
# make install
# ln -sv ../usr/bin/cpp /lib
# ln -sv gcc /usr/bin/cc

前回のgccのインストール(2発目)ではgccのSummaryでunexpected failuresが39個もありましたが、今回は1つだけで、下記リンク先との比較も大差はありませんでした。
http://www.linuxfromscratch.org/lfs/build-logs/6.1.1/chapter6/gcc-3.4.3

おそらく、前回「FAIL」と出力されていたプログラムの格納ディレクトリと思しき名称が「pch」とかだったので、今回当てたパッチ(gcc-3.4.3-pch-1.patch)が物を言ったのかもしれません。

LFS Book: 6.13.Binutils-2.15.94.0.2.2

LFS本システムで使用するbinutilsをインストールします。以下のコマンドを実行します。なお、インストール前にexpect -c "spawn ls"コマンドを実行して「spawn ls」が表示されることを確認します。

# expect -c "spawn ls"
# cd /sources
# tar jxvf binutils-2.15.94.0.2.2.tar.bz2
# mkdir -v binutils-build
# cd binutils-build
# ../binutils-2.15.94.0.2.2/configure \
>--prefix=/usr \
>--enable-shared
# make tooldir=/usr
# make check
# make tooldir=/usr install
# cp -v ../binutils-2.15.94.0.2.2/include/libiberty.h /usr/include

なお、今回のbinutilsのコンパイルにはGCC-3.4.3(LFSでインストールされたGCC)を使用するので、binutilsのパッチは必要ありません(GCC-4以上でパッチ適用する)。

LFS Book: 6.12.Re-adjusting the Toolchain

ここでは、前に行った暫定環境の調整と同様に再度、ダイナミックリンカのパスが/libになるように設定します。先ず、前に残しておいたbinutilsのビルド用ディレクトリに移動して、リンカをインストールします。

# cd /sources/binutils-build
# make -C ld INSTALL=/tools/bin/install install
# perl -pi -e 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g;' \
>-e 's@\*startfile_prefix_spec:\n@$_/usr/lib/ @g;' \
>`gcc --print-file specs`
# echo 'main(){}' > dummy.c
# cc dummy.c
# readelf -l a.out | grep ': /lib'
[Requesting program interpreter: /lib/ld-linux.so.2]

上記のようにダイナミックリンカ(ld-linux.so.2)のパスが/libに変更されて入ればOKです。また、この時点でbinutilsのソース、ビルド用ディレクトリは削除しても構いません。

LFS Book: 6.11.Glibc-2.3.4

次はシステムの要となるGlibcをインストールします。実行コマンドは以下のとおりです。

# cd /sources
# tar jxvf glibc-2.3.4.tar.bz2
# cd glibc-2.3.4
# tar jxvf ../glibc-linuxthreads-2.3.4.tar.bz2
# patch -Np1 -i ../glibc-2.3.4-rtld_search_dirs-1.patch
# patch -Np1 -i ../glibc-2.3.4-fix_test-1.patch
# patch -Np1 -i ../glibc-2.3.4-tls_assert-1.patch
# mkdir -v ../glibc-build
# cd ../glibc-build
# ../glibc-2.3.4/configure \
>--prefix=/usr \
>--disable-profile \
>--enable-add-ons \
>--enable-kernel=2.6.0 \
>--libexecdir=/usr/lib/glibc
# make
# make -k check > glibc-check-log 2>&1
# grep Error glibc-check-log
# touch /etc/ld.so.conf
# make install
# make localedata/install-locales
# make -C ../glibc-2.3.4/linuxthreads/man
# make -C ../glibc-2.3.4/linuxthreads/man install

小生の場合、glibc-check-logを調べた結果(Errorでgrepした結果)、1件エラーが引っかかりましたが、最後に(ignored)と出力されていたので、無視して続行しました。

次に、Glibcに関連する設定ファイルを作成します。以下のコマンドで作成します。

/etc/nsswitch.conf
# cat > /etc/nsswitch.conf << "EOF"
>passwd: files
>group: files
>shadow: files
>hosts: files dns
>networks: files
>protocols: files
>services: files
>ethers: files
>rpc: files
>EOF

次にタイムゾーンに関する設定を行います。下記コマンドでtzselectを実行すると、CUIベースで質問形式のメニューが表示されますが、Asia、Japanを選べんだ後にYesを選択するだけです。

# tzselect
# cp -v --remove-destination /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

/etc/ld.so.conf
# cat > /etc/ld.so.conf << "EOF"
>/usr/local/lib
>/opt/lib

LFS Book: 6.9.Linux-Libc-Headers-2.6.11.2~6.10.Man-pages-2.01

前回までにchrootした環境構築(LFS本システム構築の下準備)が完了したので、これからLFSシステムに必要なパッケージをインストールしていきます。

先ず、ヘッダファイル、マニュアルのインストールから始めます。

# cd /sources/linux-libc-headers-2.6.11.2
# cp -Rv include/asm-i386 /usr/include/asm
# cp -Rv include/linux /usr/include
# chown -Rv root:root /usr/include/{asm,linux}
# find /usr/include/{asm,linux} -type d -exec chmod -v 755 {} \;
# find /usr/include/{asm,linux} -type f -exec chmod -v 644 {} \;
# cd /sources/man-pages-2.01
# make install

LFS Book: 6.2.Mounting Virtual Kernel File System~6.8.Populating /dev

新年早々からLFS構築作業です。明日(1月2日)からまた仕事だし、小生にとってはいつもと変わらない週末(今日は月曜だけど)となっております。

先ずは仮想カーネルファイルシステムをマウントします。実行コマンドは以下のとおりです。

# mkdir -pv $LFS/{proc,sys}
# mount -vt proc proc $LFS/proc
# mount -vt sysfs sysfs $LFS/sys

LFS Bookにもありますが、これらのファイルシステムはPCを再起動して作業を再開する際に、chrootする前にマウントしておく必要があります。

さらに、chroot環境の中でマウントされる付加的なファイルシステムをフェイクマウントしておきます。

# mount -vft tmpfs tmpfs $LFS/dev
# mount -vft tmpfs tmpfs $LFS/dev/shm
# mount -vft devpts -o gid=4,mode=620 devpts $LFS/devpts

次にいよいよchrootして新しい環境の構築作業準備に入ります。

# chroot "$LFS" /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

lfsユーザーは新しい環境には存在しないので、/toolsディレクトリの所有者をrootに変更し、必要なディレクトリ等を作成します。実行コマンドは下記のとおりです。

# chown -R 0:0 /tools
# install -dv /{bin,boot,dev,etc/opt,home,lib,mnt}
# install -dv /{sbin,srv,user/local,var,opt}
# install -dv /root -m 0750
# install -dv /tmp /var/tmp -m 1777
# install -dv /media/{floppy,cdrom}
# install -dv /usr/{bin,include,lib,sbin,share,src}
# ln -sv share/{man,doc,info} /usr
# install -dv /usr/share/{doc,info,locale,man}
# install -dv /usr/share/{misc,terminfo,zoneinfo}
# install -dv /usr/share/man/man{1,2,3,4,5,6,7,8}
# install -dv /usr/local/{bin,etc,include,lib,sbin,share,src}
# ln -sv share/{man,doc,info} /usr/local
# install -dv /usr/local/share/{doc,info,locale,man}
# install -dv /usr/local/share/{misc,terminfo,zoneinfo}
# install -dv /usr/local/share/man/man{1,2,3,4,5,6,7,8}
# install -dv /var/{lock,log,mail,run,spool}
# install -dv /var/{opt,cache,lib/{misc,locate},local}
# install -dv /opt/{bin,doc,include,info}
# install -dv /opt/{lib,man/man{1,2,3,4,5,6,7,8}}
# ln -sv /tools/bin/{bash,cat,pwd,stty} /bin
# ln -sv /tools/bin/perl /usr/bin
# ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
# ln -sv bash /bin/sh

次にシステムに必要なファイル等を作成します。以下のコマンドで作成します。
/etc/passwd
# cat > /etc/passwd << "EOF"
>root:x:0:0:root:/root:/bin/bash
>EOF

/etc/group
# cat > /etc/group << "EOF"
>root:x:0:
>bin:x:1:
>sys:x:2:
>kmem:x:3:
>tty:x:4:
>tape:x:5:
>daemon:x:6:
>floppy:x:7:
>disk:x:8:
>lp:x:9:
>dialout:x:10:
>audio:x:11:
>video:x:12:
>utmp:x:13:
>usb:x:14:
>cdrom:x:15:
>EOF

ここで以下のコマンドを実行し、環境設定を読み込んでおきます。これでプロンプトに「root」が表示されるはずです(chrootした直後は/etc/passwdが無いので、「I have no name!」と表示されている)。

# exec /tools/bin/bash --login +h

その他/var配下のログ、認証系ファイル等も作成します。

# touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
# chgrp -v utmp /var/run/utmp /var/log/lastlog
# chmod -v 664 /var/run/utmp /var/log/lastlog

次にデバイスファイル系(/dev配下のファイル)を作成します。

# mknod -m 600 /dev/console c 5 1
# mknod -m 666 /dev/null c 1 3
# mount -nvt tmpfs none /dev
# mknod -m 622 /dev/console c 5 1
# mknod -m 666 /dev/null c 1 3
# mknod -m 666 /dev/zero c 1 5
# mknod -m 666 /dev/ptmx c 5 2
# mknod -m 666 /dev/tty c 5 0
# mknod -m 444 /dev/random c 1 8
# mknod -m 444 /dev/urandom c 1 9
# chown -v root:tty /dev/{console,ptmx,tty}
# ln -sv /proc/self/fd /dev/fd
# ln -sv /proc/self/fd/0 /dev/stdin
# ln -sv /proc/self/fd/1 /dev/stdout
# ln -sv /proc/self/fd/2 /dev/stderr
# ln -sv /proc/kcore /dev/core
# mkdir -v /dev/pts
# mkdir -v /dev/shm
# mount -vt devpts -o gid=4, mode=620 none /dev/pts
# mount -vt tmpfs none /dev/shm

/dev/ptsのマウント時(最後から2番面のコマンド実行時)に/etc/fstabなんてファイル知らんぞ!というWarningが出力されますが、当該ファイルは未だ作成していないので出力されて当然です。特に実害はないので気にしなくて結構です。

このアーカイブについて

このページには、2007年1月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2006年12月です。

次のアーカイブは2008年1月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。