Linuxを日常的に使う実験ブログ

LFS 7.7を構築する [Part 4 基本ソフトウェアのインストール編]

 2015-10-11

 LFS

こんにちは。今回のテーマは『LFS 7.7を構築する [Part 4 基本ソフトウェアのインストール編]』です。本記事はLFS 7.7を構築する [Part 3 一時的環境の構築編]からの続きとなります。今回はLFS構築作業のクライマックスとも言える基本ソフトウェアのインストール作業です。詳細な作業はLFS-BOOK (*1)を参照いただくとして、作業の流れとTIPSをお届けできればと考えています。 (*1 LFS-BOOK-7.7 Copyright © 1999-2015 Gerard Beekmans 本文中のコマンドはMITライセンスに準じます。) [adsense02] 【目次】 仮想カーネルファイルシステムの準備 Chroot環境への移行 ディレクトリの作成 設定ファイルとリンクの作成 各種プログラムのビルドとインストール ビルド後の後片付け

仮想カーネルファイルシステムの準備

ファイルシステムのためのディレクトリを作成します。

host# mkdir -pv $LFS/{dev,proc,sys,run}

初期デバイスノードの生成

以下コマンドでデバイスノードを生成します。

host# mknod -m 600 $LFS/dev/console c 5 1 host# mknod -m 666 $LFS/dev/null c 1 3

/dev のマウントと有効化

以下コマンドで/devをマウントします。—bindオプションを忘れずに。

host# mount -v —bind /dev $LFS/dev

仮想カーネルファイルシステムのマウント

各ファイルシステムをマウントしていきましょう。

host# mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620 host# mount -vt proc proc $LFS/proc host# mount -vt sysfs sysfs $LFS/sys host# mount -vt tmpfs tmpfs $LFS/run

Chroot環境への移行

一時的環境の構築の際にはlfsというユーザーを作成し作業を行いましたが、ここから先は構築するシステムの中にchrootして作業を行っていきます。

host# 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

ディレクトリの作成

ここから先はChroot環境での操作となりますのでプロンプトはroot#として表示します。ただ、実際には”I have no name!”と表示されます。以後の作業で正常に戻るので安心して下さい。

root# mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt} root# mkdir -pv /{media/{floppy,cdrom},sbin,srv,var} root# install -dv -m 0750 /root root# install -dv -m 1777 /tmp /var/tmp root# mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src} root# mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man} root# mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo} root# mkdir -v /usr/libexec root# mkdir -pv /usr/{,local/}share/man/man{1..8}

root# case $(uname -m) in x86_64) ln -sv lib /lib64 ln -sv lib /usr/lib64 ln -sv lib /usr/local/lib64 ;; esac

root# mkdir -v /var/{log,mail,spool} root# ln -sv /run /var/run root# ln -sv /run/lock /var/lock root# mkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}

設定ファイルとリンクの作成

リンクの生成

システムに必要なリンクを生成していきます。

root# ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /bin root# ln -sv /tools/bin/perl /usr/bin root# ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib root# ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib root# sed ‘s/tools/usr/’ /tools/lib/libstdc++.la > /usr/lib/libstdc++.la root# ln -sv bash /bin/sh root# ln -sv /proc/self/mounts /etc/mtab

/etc/passwdファイルの生成

passwdファイルを生成します。rootのパスワードは後で決定します。ここでは仮にxという文字が入れてあります。

root# cat > /etc/passwd << “EOF” root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/dev/null:/bin/false daemon:x:6:6:Daemon User:/dev/null:/bin/false messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false nobody:x:99:99:Unprivileged User:/dev/null:/bin/false EOF

/etc/groupファイルの生成

以下コマンドでgroupファイルを生成しますが、ここで挙げたグループは約束事はなく、udevが必要とするものの他は慣用的なものです。筆者も作成時にはLFSbookに従いました。

root# cat > /etc/group << “EOF” root:x:0: bin:x:1:daemon sys:x:2: kmem:x:3: tape:x:4: tty: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: adm:x:16: messagebus:x:18: systemd-journal:x:23: input:x:24: mail:x:34: nogroup:x:99: users:x:999: EOF

新たなシェルの起動

passwdとgroupファイルができたことでユーザー名とグループ名の名前解決が行われます。以下のコマンドで実行して新たなシェルを起動します。

root# exec /tools/bin/bash —login +h

ログファイルの生成

以下コマンドでログファイルを生成します。

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

各種プログラムのビルドとインストール

ここではLFSbookの記述に従い順番通りソフトウェアをインストールしていきます。膨大な作業を全て記す誌面はありませんので、簡単にTIPSを記すことにします。

中断できるようにリスタート用のシェルスクリプトを作成(任意)

ここから先の作業時間がかかるので途中で中断することもあると思います。作業を再開する際にすぐに始められるように筆者は以下のスクリプトをホストシステム側に用意していました。これですぐに作業を再開できます。 restart.sh [bash] #! /bin/sh export LFS=/mnt/lfs mount -v /dev/ $LFS mount -v —bind /dev $LFS/dev mount -v —bind /dev $LFS/dev mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620 mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vt tmpfs tmpfs $LFS/run 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 [/bash]

GCCのコンパイルテストは長時間

マシンスペックにもよると思いますが、GCCをコンパイルした後に行うmake -k checkでのチェックはとても膨大で筆者がVirtualBox上で行った時には半日ぐらいは潰れてしまいました。これだけ膨大な時間かけたチェックですが、おそらく結果はエラーだらけだと思います。LFSbookにもhttp://www.linuxfromscratch.org/lfs/build-logs/7.7/http://gcc.gnu.org/ml/gcc-testresults/と比較して大きな違いがなければ次に進むように書いてあります。本当にこのチェックが必要だったのかという気持ちにもなりますが、ここでエラーが出てもあまり気にせずmake install後のチェックを重要視していけば良いのではないかと個人的には思っています。

ビルド後の後片付け

長いインストール作業お疲れ様でした。あとは後片付けをしましょう。

不要なファイル等の削除(任意)

この作業は必須ではありませんが、デバッグ用のファイルやリンクを削除することで要領を節約できます。

root# /tools/bin/find /{,usr/}{bin,lib,sbin} -type f \ -exec /tools/bin/strip —strip-debug ’{}’ ’;‘

root# rm -rf /tmp/*

Chroot環境への再ログイン

システムに必要なソフトウェアをインストールしたので/ToolsへのPATHが不要となりました。ログインし直しましょう。

host# chroot “$LFS” /usr/bin/env -i \ HOME=/root TERM=“$TERM” PS1=‘\u:\w\$ ’ \ PATH=/bin:/usr/bin:/sbin:/usr/sbin \ /bin/bash —login

$LFS/toolsの削除

/toolsはこの後の作業では使用しませんので削除します。

root# rm -rf /tools

最後に

LFSは教育的な実用的な便利さよりも学習的な部分に重きを置いているため、ソフトウェアのソースからのビルドだけでなく、設定ファイルも自作します。本当に手作りという感じですね。さて、今回までの作業でLFS構築作業は山場を超えて、あとはシステムとして機能させるための設定となります。自分で構築したシステムが起動するものも後少しです。 【関連記事】 LFS 7.7を構築する [Part 3 一時的環境の構築編] LFS 7.7を構築する [Part 2 一時環境の構築準備編] LFS 7.7を構築する [Part 1 LFS概略とホストシステム選択編] [adsense]