Open9

Linux from Scratchをやってみる

matsui54matsui54

requirementsの確認

https://www.linuxfromscratch.org/lfs/view/stable-systemd/chapter02/hostreqs.html
version-check.shは問題なかった。

パーティションの作成

https://www.linuxfromscratch.org/lfs/view/stable-systemd/chapter02/creatingpartition.html
パーティションは
/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
matsui54matsui54

5. Compiling a Cross-Toolchain

それぞれのパッケージについて以下を行う。

  1. tar xfv <package>で解凍
  2. cd <解凍したディレクトリ>
  3. ビルドする。
  4. sources ディレクトリに戻る
  5. 解凍したディレクトリを削除する

binutilsのビルド

https://www.linuxfromscratch.org/lfs/view/stable-systemd/chapter05/binutils-pass1.html
1SBUは2分半くらい。意外と短かった。
手順とかはかなり丁寧に書かれている印象。コマンドの意味も教えてくれるので勉強になる。

今日はgccのmake手前まで。

matsui54matsui54

Chapter 7. Entering Chroot and Building Additional Temporary Tools

https://www.linuxfromscratch.org/lfs/view/stable-systemd/chapter07/kernfs.html#ch-tools-kernfsmount
ホストを再起動したら仮想カーネルファイルシステムを再びマウントする必要がある。

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
matsui54matsui54

9.2. General Network Configuration

https://www.linuxfromscratch.org/lfs/view/stable-systemd/chapter09/network.html

DHCPの設定

ここも見る
https://wiki.archlinux.jp/index.php/Systemd-networkd#.E5.90.8C.E4.B8.80.E3.83.9E.E3.82.B7.E3.83.B3.E3.81.A7.E6.9C.89.E7.B7.9A.E3.82.A2.E3.83.80.E3.83.97.E3.82.BF.E3.81.A8.E7.84.A1.E7.B7.9A.E3.82.A2.E3.83.80.E3.83.97.E3.82.BF.E4.B8.A1.E6.96.B9.E3.82.92.E4.BD.BF.E7.94.A8

有線の設定

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

https://www.linuxfromscratch.org/lfs/view/stable-systemd/chapter09/udev.html
困ったら見ればよさそう。

matsui54matsui54

ブートローダーの設定

GRUB2を使おうと思ったが、ホストのシステム(arch Linux)ではsystemd-bootを使っていたことに気付いたので、/boot/loader/entriesに追加する形でブートローダを入れる。
systemd-bootについてはこちらを参照。
UEFI対応のGRUBを入れようとすると、この手順にあるように、いろいろ依存パッケージを入れないといけないので、意外とこっちの方が楽かもしれない。
あと、/boot専用のパーティションも作っていたが、UEFIの場合はもとからあるやつを使えば良いので必要なかった。
systemd-bootを使う手順は簡単だが、調べてもLFSと使ったという情報が見つからなかったので以下に示す(一応起動はできたが、完璧に理解して書いているわけではないので、自己責任で)。ここまでで10.3節のカーネルのビルドまで終えていることを前提とする。ただし、UEFIの場合は以下のリンクに書かれているようなKernel Configurationを行なっている必要がある。
https://www.linuxfromscratch.org/blfs/view/11.0/postlfs/grub-setup.html

  1. 上のリンクにある手順のうち、"Find or Create the EFI System Partition"と"Mount the EFI Variable File System"に書いてあるように、既存のEFIパーティションとefivarsパーティションをマウントする。

  2. systemd-bootにはinitramfsというものが必要なので、以下を参考に作成する。
    https://www.linuxfromscratch.org/blfs/view/11.0/postlfs/initramfs.html

mkinitramfs 5.13.12
のようにして、initramfsを作成し、/bootに移動する。

  1. こちらを参考にして/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というコマンドを打てば見ることができる。

matsui54matsui54

再起動後、ブート時のメニューにLFSが出てくる。
無事ちゃんと起動できた🎉

あとはXが起動するくらいまではやりたい。