現在位置: ホーム / みらくるブログ / Linux From Scratch で自作ディストリビューションづくり-8(最終回)

Linux From Scratch で自作ディストリビューションづくり-8(最終回)

今日は、カーネルをビルドして initramfs を作って、自作ディストリビューションを完成させます。

お疲れさまです。ニックネーム たいちょう です。

前回は、7.9の指南書に従って、第7章のところまで一気にやっていきましたね。
使ったスクリプトは、以下で、このスクリプトを最後まで流したとして話を進めます。

https://sourceforge.net/projects/pinkrabbitlinux/files/Version-7.9-systemd.tar.gz/download

本日は、いよいよカーネルのビルドに入りますよ。

ホスト上で root になって、以下のコマンドを打って下さい。
これから、LFS システムに chroot する、といったら、以下をセットで実行します。

----------------------------------------------

export LFS=/mnt/lfs
echo $LFS
mount -v -t ext4 /dev/sdb1 $LFS
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run
if [ -h $LFS/dev/shm ]; then
  mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi
chroot "$LFS" /usr/bin/env -i              \
    HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin     \
    /bin/bash --login

----------------------------------------------

第8章に入ります。

root:/# vim /etc/fstab
# Begin /etc/fstab

# file system mount-point type options dump fsck order
#

/dev/sdb1    /    ext4    defaults    1    1
/dev/sdb2    swap    swap    pri=1    0    0
proc        /proc         proc     nosuid,noexec,nodev 0 0
sysfs       /sys          sysfs    nosuid,noexec,nodev 0 0
devpts      /dev/pts      devpts   gid=5,mode=620 0 0
tmpfs       /run          tmpfs    defaults 0 0
devtmpfs    /dev          devtmpfs mode=0755,nosuid 0 0

保存します。

root:/# cd sources
root:/sources# tar -xvf linux-4.4.2.tar.xz
root:/sources# cd linux-4.4.2
root:/sources/linux-4.4.2# make mrproper

mrproper とは、Linux 開発者の Linus さんがお世話になっていたクリーニング屋さんの名前なんです。
このコマンドで、Mr. Proper さんが Linus の洗濯物をきれいにしたみたいに、きれいにしましょうねということです。
 
では、ビルドしていきます。
ここで、指南書には書いていない部分も有効にしていきます。

root:/sources/linux-4.4.2# make menuconfig

指南書にあるところは、デフォルトで有効にします。
一つ、audit は有効のままにしておきます。

save して、make します。

root:/sources/linux-4.4.2# make

終わったら、次のコマンドを打って以下のオプションを設定します。

以下の方法で確認します。

root:/sources/linux-4.4.2# cat -n .config | grep "検索文字"
CONFIG_EFI_PARTITION=y
CONFIG_EFI=y
CONFIG_EFI_STUB=y <-- ここを y に設定します。
CONFIG_EFI_VARS=n <--ここを n に設定します。
CONFIG_EFIVAR_FS=y <-- ここを y に設定します。

-----------------------
また、この設定を以下のようになっているかを確認します。

CONFIG_RELOCATABLE=y
CONFIG_FB_EFI=y
CONFIG_FRAMEBUFFER_CONSOLE=y

-----------------------

 

root:/sources/linux-4.4.2# make
root:/sources/linux-4.4.2# make modules_install
root:/sources/linux-4.4.2# cp -v arch/x86_64/boot/bzImage /boot/vmlinuz-4.4.2-lfs-7.9-systemd
root:/sources/linux-4.4.2# cp -v System.map /boot/System.map-4.2.2
root:/sources/linux-4.4.2# cp -v .config /boot/config-4.2.2

カーネルドキュメントをインストールします。

root:/sources/linux-4.4.2# install -d /usr/share/doc/linux-4.4.2
root:/sources/linux-4.4.2# cp -r Documentation/* /usr/share/doc/linux-4.4.2

以下を実行します。

root:/sources/linux-4.4.2# install -v -m755 -d /etc/modprobe.d
root:/sources/linux-4.4.2# cat > /etc/modprobe.d/usb.conf << "EOF"
# Begin /etc/modprobe.d/usb.conf

install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true

# End /etc/modprobe.d/usb.conf
EOF

grub をインストールします。

root:/sources/linux-4.4.2# grub-install /dev/sdb

grub の 設定ファイルを投入します。

cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

insmod ext2
set root=(hd1,1)

menuentry "GNU/Linux, Linux 4.4.2-lfs-7.9-systemd" {
        linux   /boot/vmlinuz-4.4.2-lfs-7.9-systemd root=/dev/sdb1 ro
}
EOF

(hd1,1) というのは、sdb1 を表しています。

ここで、構築環境から出ます。

root:/sources/linux-4.4.2# exit
logout
[root@localhost デスクトップ]#


次を実行します( chroot環境から出た時は、必ず実施します )。
---------------------------

export LFS=/mnt/lfs
umount -v $LFS/dev/pts
umount -v $LFS/dev
umount -v $LFS/run
umount -v $LFS/proc
umount -v $LFS/sys
umount -v $LFS

--------------------------
ホストマシンで、以下を行い、メニューに登録します。

---- ホストマシンで行ないます ----

[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
...(snip)...
Found unknown Linux distribution on /dev/sdb1
done
[root@localhost ~]# grub2-install /dev/sda

ここで、再起動して新たに作成したシステムが起動できるかやってみましょう。

[root@localhost ~]# shutdown -r now

grub の画面で、/dev/sdb1 を選択します。

...(snip)...

Call Trace:

...(snip)...
Kernel Offset: disabled
--[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(8,17)

カーネルパニックになってしまいました。

マシンを停止して、もう一度再起動します。
今度は、grub のコマンドラインからやってみます。

grub の画面で、e キーを押下します。
Ctl + c を押下します。
以下の画面になったのを確認します。

grub>

以下のように、入力していきます。

grub> set root=(hd1,1)
grub> linux /boot/vmlinuz-4.4.2-lfs-7.9-systemd root=/dev/sdb1
grub> boot

やっぱり、カーネルパニックになってしまいました。

initrd.img がないからだと思います。

LFSの範疇を超えるのですが、以下のページ(BLFS)のスクリプトをコピーして、ファイルを作成します。

http://www.linuxfromscratch.org/blfs/view/svn/postlfs/initramfs.html

/sbin に、mkinitramfs ファイルが実行権限付きで、/usr/share/mkinitramfs/init.in ファイルがそれぞれできましたか。

これを、LFS システムに chroot してから実行したいのですが、cpio コマンドがないとダメなので、インストールします。

http://www.linuxfromscratch.org/blfs/view/svn/general/cpio.html

ホストマシンから、LFSシステムの /sources ディレクトリにコピーします。
LFS システムに chroot して、cpio コマンドを、上記の指定にもとづきインストールして、できたcpio-2.12ディレクトリを削除します。

root:~# mkinitrd 4.4.2

以下のファイルができている事を確認します。
initrd.img-4.4.2

root:~# grub-install /dev/sdb
root:~# vim /boot/grub/grub.cfg
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

insmod ext2
set root=(hd1,1)

menuentry "GNU/Linux, Linux 4.4.2-lfs-7.9-systemd" {
        linux   /boot/vmlinuz-4.4.2-lfs-7.9-systemd root=/dev/sdb1 ro
        initrd /boot/initrd.img-4.4.2      <-----この行を追加します
}

chroot 環境から出ます。
chroot 環境から出る処理を忘れずに。

---- もう一度、ホストマシンで行ないます ----

[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
...(snip)...
Found unknown Linux distribution on /dev/sdb1
done
[root@localhost ~]# grub2-install /dev/sda

ここで、再起動して新たに作成したシステムが起動できるかやってみましょう。

[root@localhost ~]# shutdown -r now

grub の画面で、/dev/sdb1 を選択します。

うーん、途中まで行ったんだけど、cannot mount rootfs になってしまいます。
ちょっと、grub のコマンドラインで調べてみます。
どうやら、/dev/sdb1 と、 /dev/sdb2 が入れ替わってしまったようです。

これって、linux ではあることなんです。
/dev/sdX という指定の仕方が悪いようです。

では、blkid を調べて、きちんと指定してあげたら直るかもしれませんね。

/boot/grub/grub.cfg と、 /etc/fstab も UUID で指定してあげました。

blkid /dev/sdbX として、UUID を把握してください。

root:~# vim /boot/grub/grub.cfg
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

insmod ext2
set root=(hd1,1)

menuentry "GNU/Linux, Linux 4.4.2-lfs-7.9-systemd" {
        linux   /boot/vmlinuz-4.4.2-lfs-7.9-systemd root=UUID=xxxxxxxxxx ro <-----この行を修正します。
        initrd /boot/initrd.img-4.4.2      
}

/etc/fstab も、/dev/sdb1, /dev/sdb2 を同様に UUID に修正します。

さあ、再起動します。

---- その前に、もう一度、grub の設定ファイルを再作成、再インストールをホストマシンで行ないます ----

[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
...(snip)...
Found unknown Linux distribution on /dev/sdb1
done
[root@localhost ~]# grub2-install /dev/sda

ここで、再起動して新たに作成したシステムが起動できるかやってみましょう。

[root@localhost ~]# shutdown -r now

grub の画面で、/dev/sdb1 を選択します。

やったー! 立ち上がりました。

PinkRabbitLinux login:

もちろん、プロンプトに出て来る名前は、好きに変えられますよ。

ユーザーは、とりあえず root しかいません。
私は、パスワードを root にしておいたので、root,root で入ってみます。

できました。

ほんの数秒(5 秒程度)で立ち上がる、自作ディストリビューションが、LFS を活用してできましたね。

ここから、色々なアプリを入れたり、ネットワークができるようにしたり、GUI 環境を構築したりと、楽しみは広がります。では、何しようかな。次の機会は、この OS を CDイメージにして持ち歩けるようにしてみたい、なんて考えました。

容量は 800Mbyte ぐらいですから、軽くする工夫はいるでしょう。色々とやりたいことはありますが、今日は一応完成したので、このシリーズは終わりにします。ひとまず、お疲れさまでした。ニックネーム たいちょう でした。

またのシリーズをお楽しみに。

今回作成した自作ディストリビューションは、systemd 版です。同じく systemd 版の、Asianux Server 7 という Linux ディストリビューションをご存知ですか?

こちらから評価版がダウンロードできますので、試してみてくださいね。

タグ: