Linux from Scratchをやってみる
requirementsの確認
version-check.sh
は問題なかった。
パーティションの作成
/boot
: 200MB (sda1)、
/
: 20GB (sda5)、
swap: 8GB (sda6)(hibernateはしないので小さめ)、
/home
: 30GB (sda7)(必要に応じて拡張する)
とした。
勉強用なのであまり大きなストレージは使わないようにする。
パーティションはfdiskを使ってつくる。
ファイルシステムの作成
sudo mkfs -v -t ext4 /dev/sda<1-7>
sudo mkswap /dev/sda6
5. Compiling a Cross-Toolchain
それぞれのパッケージについて以下を行う。
-
tar xfv <package>
で解凍 cd <解凍したディレクトリ>
- ビルドする。
- sources ディレクトリに戻る
- 解凍したディレクトリを削除する
binutilsのビルド
手順とかはかなり丁寧に書かれている印象。コマンドの意味も教えてくれるので勉強になる。
今日はgccのmake手前まで。
再起動時に自動でマウントされるように/etc/fstabに以下を参考にして書いておく
UUID=**** /mnt/lfs ext4 defaults 1 1
UUID=**** /mnt/lfs/boot ext4 defaults 1 1
UUID=**** /mnt/lfs/home ext4 defaults 1 1
Chapter 7. Entering Chroot and Building Additional Temporary Tools
ホストを再起動したら仮想カーネルファイルシステムを再びマウントする必要がある。
export LFS=/mnt/lfs
mount -v --bind /dev $LFS/dev
mount -v --bind /dev/pts $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するときはこれ
chroot "$LFS" /usr/bin/env -i \
HOME=/root TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/usr/bin:/usr/sbin \
/bin/bash --login
9.2. General Network Configuration
DHCPの設定
ここも見る
有線の設定
cat > /etc/systemd/network/10-wired-dhcp.network << "EOF"
[Match]
Name=enp4s0
[Network]
DHCP=ipv4
[DHCP]
UseDomains=true
RouteMetric=10
EOF
無線の設定
cat > /etc/systemd/network/15-wireless-dhcp.network << "EOF"
[Match]
Name=wlp1s0f0u9
[Network]
DHCP=ipv4
[DHCP]
UseDomains=true
RouteMetric=20
EOF
/etc/resolv.conf
を作成
systemd-resolvedを使う
ln -sfv /run/systemd/resolve/resolv.conf /etc/resolv.conf
EOF
/etc/hostname
echo "lfshost" > /etc/hostname
/etc/hosts
127.0.1.1はこれでいいのかわからない。とりあえず何か割り当てられていればOK?
cat > /etc/hosts << "EOF"
# Begin /etc/hosts
127.0.0.1 localhost.localdomain localhost
127.0.1.1 lfs.example.org lfs
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# End /etc/hosts
EOF
9.3. Overview of Device and Module Handling
困ったら見ればよさそう。
10.3. Linux-5.13.12
こんな感じのUIでカーネルのビルドオプションを設定できる。
preemptionの頻度とかも設定できるのか。面白い。
とりあえず、推奨の設定とここの設定だけした。
ブートローダーの設定
GRUB2を使おうと思ったが、ホストのシステム(arch Linux)ではsystemd-bootを使っていたことに気付いたので、/boot/loader/entries
に追加する形でブートローダを入れる。
systemd-bootについてはこちらを参照。
UEFI対応のGRUBを入れようとすると、この手順にあるように、いろいろ依存パッケージを入れないといけないので、意外とこっちの方が楽かもしれない。
あと、/boot
専用のパーティションも作っていたが、UEFIの場合はもとからあるやつを使えば良いので必要なかった。
systemd-bootを使う手順は簡単だが、調べてもLFSと使ったという情報が見つからなかったので以下に示す(一応起動はできたが、完璧に理解して書いているわけではないので、自己責任で)。ここまでで10.3節のカーネルのビルドまで終えていることを前提とする。ただし、UEFIの場合は以下のリンクに書かれているようなKernel Configurationを行なっている必要がある。
-
上のリンクにある手順のうち、"Find or Create the EFI System Partition"と"Mount the EFI Variable File System"に書いてあるように、既存のEFIパーティションとefivarsパーティションをマウントする。
-
systemd-bootにはinitramfsというものが必要なので、以下を参考に作成する。
https://www.linuxfromscratch.org/blfs/view/11.0/postlfs/initramfs.html
mkinitramfs 5.13.12
のようにして、initramfsを作成し、/boot
に移動する。
-
こちらを参考にして
/boot/loader/entries
にLFSのローダーを追加する。
設定例(/boot/loader/entries/lfs.conf
)
title GNU/Linux, Linux 5.13.12-lfs-11.0-systemd
linux /vmlinuz-5.13.12-lfs-11.0-systemd
initrd /initrd.img-5.13.12
options root=PARTUUID=f7270443-05 rw
options のrootはLFSのルートディレクトリがあるパーティションのPARTUUID。PARTUUIDはblkid
というコマンドを打てば見ることができる。
再起動後、ブート時のメニューにLFSが出てくる。
無事ちゃんと起動できた🎉
あとはXが起動するくらいまではやりたい。