はじめに
Gentoo Linuxをどれだけ早くインストールできるか気になったのでタイムアタックをしてみます。いわゆるGentoo Install Battleです。
条件
- ハードウェア制限なし
- インストール先は、VirtualBox上の仮想環境
- VirtualBoxは設定済みとし、起動したらMinimal Installation CDが読み出される状態
- stage3はホストにダウンロード済み
- 自動化するための自前スクリプトの事前用意は禁止
(すべてのコマンドを自力でタイプする。ただしシェルが持つ機能、タブ保管やワンライナーなどは可) - タイムは起動ボタンを押してから、ログイン後のuname表示まで
VirtualBoxの設定
ホストからゲストへsshでアクセスできるようにポートフォワーディングルールを追加しておきます。
インストールの流れ
インストールに必要な手順はGentoo Handbookに沿っていますが、最低限のコマンドだけ行います。
大まかな流れは下の通りです。
- ディスクパーティションの準備
- Stage3の展開
- 環境設定
- Linux kernelの構築
- ブートローダーのインストール
それでは、さっそくスタート
本編
起動ボタンを押したらタイマースタートします。
ディスクパーティションの準備
まず、シェルが起動したらディスクパーティションを準備します。
UEFIでブートできるようにGPT上に各パーティション(EFI、rootfs)を作成します。
※swapは省略しています
※EFIパーティションは、bootパーティションも兼ねさせています
livecd ~ # fdisk /dev/sda
コマンド (m でヘルプ): g
コマンド (m でヘルプ): n
パーティション番号 (1-128, 既定値 1):
最初のセクタ (2048-16777182, 既定値 2048):
最終セクタ, +/-セクタ番号 または +/-サイズ{K,M,G,T,P} (2048-16777182, 既定値 16777182): +256M
コマンド (m でヘルプ): t
パーティションのタイプ または別名(L で利用可能なタイプを一覧表示します): 1
コマンド (m でヘルプ): n
パーティション番号 (2-128, 既定値 2):
最初のセクタ (526336-16777182, 既定値 526336):
最終セクタ, +/-セクタ番号 または +/-サイズ{K,M,G,T,P} (526336-16777182, 既定値 16777182):
コマンド (m でヘルプ): w
フォーマット
livecd ~ # mkfs.vfat -F 32 /dev/sda1
livecd ~ # mkfs.ext4 /dev/sda2
rootfsパーティションをマウント
livecd ~ # mount /dev/sda2 /mnt/gentoo
livecd ~ # cd /mnt/gentoo
Stage3の展開
あらかじめホストでダウンロードしておいたstarge3をsshでゲストへ送りつけます。
sshを有効
livecd /mnt/gentoo # echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
livecd /mnt/gentoo # /etc/init.d/sshd start
livecd /mnt/gentoo # passwd
Enter new password: p@ssW0rd
Re-type new password: p@ssW0rd
ホストからゲストへstage3を送信
host $ scp -P 2222 stage3-*.tar.xz root@localhost:/mnt/gentoo
stage3を展開
livecd /mnt/gentoo # tar xpf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner
環境設定
nameserver
chroot後、名前解決ができるようにコピーします。
livecd /mnt/gentoo # cp -L /etc/resolv.conf etc/
device
livecd /mnt/gentoo # mount --types proc /proc proc
livecd /mnt/gentoo # for n in sys dev run; do mount --rbind /$n $n; mount --make-rslave $n; done
chroot
livecd /mnt/gentoo # chroot . /bin/bash
livecd / # source /etc/profile
mount
livecd / # mount /dev/sda1 /boot
password
これを忘れて再起動後ログインできず、よくはまります。
livecd / # passwd
Enter new password: p@ssW0rd
Re-type new password: p@ssW0rd
Portage
回線状況が悪いと時間がかかる運ゲーポイントです。
livecd / # emerge-websync
後のkernel構築用に環境変数を設定しておきます。
livecd / # echo "ACCEPT_LICENSE=@BINARY-REDISTRIBUTABLE" >> /etc/portage/make.conf
livecd / # echo "MAKEOPTS=-j8" >> /etc/portage/make.conf
fstab
livecd / # echo "/dev/sda1 /boot vfat defaults 0 2" >> /etc/fstab
livecd / # echo "/dev/sda2 / ext4 noatime 0 0" >> /etc/fstab
Linux kernelの構築
livecd / # emerge sys-kernel/gentoo-sources
livecd / # eselect kernel set 1
livecd / # cd /usr/src/linux
livecd /usr/src/linux # make menuconfig
デフォルトの状態から必要最小限の設定だけ行います。
※不要な構成を外すことで、さらに最適化が可能
Gentoo Linux --->
Generic Driver Options --->
Support for init systems, system and service managers --->
[ ] OpenRC, runit and other script based systems and managers
[*] systemd
Device Drivers --->
Graphics support --->
Frame buffer Devices --->
<*> Support for frame buffer devices --->
[*] EFI-based Framebuffer support
kernelをビルド&インストールします。
(ハードスペックにモノを言わせる見せ場)
livecd /usr/src/linux # make -j8 && make modules_install && make install
アプリケーション(オプション)
再起動後、ネットワークへ接続したい場合にインストールします。
livecd /usr/src/linux # emerge net-misc/dhcpcd
ブートローダーのインストール
GRUBをインストールします。
livecd /usr/src/linux # echo 'GRUB_PLATFORMS="efi-64"' >> /etc/portage/make.conf
livecd /usr/src/linux # emerge sys-boot/grub
livecd /usr/src/linux # grub-install --target=x86_64-efi --efi-directory=/boot
livecd /usr/src/linux # grub-mkconfig -o /boot/grub/grub.cfg
再起動
livecd /usr/src/linux # exit
livecd /mnt/gentoo # cd
livecd ~ # umount -l /mnt/gentoo/dev{/shm,/pts,}
livecd ~ # umount -R /mnt/gentoo/
livecd ~ # reboot
ゴール
localhost login: root
Password: p@ssW0rd
localhost ~ # uname -r
5.15.59-gentoo
ここでタイマーストップ、15分43秒でした。
あとがき
完走した感想ですが、今回はkernelをほぼデフォルトでビルドしてますが、再起動後にkernelを読み出されてから2秒程度でログイン画面が表示されるので、こんなにも早く起動できるのかと驚きました。また、chrootした後にpasswdをし忘れて再起動後ログインできなかったり、kernelのビルド時にEFI-based Framebuffer supportが有効になっておらず、再起動後に固まったりしてよく詰むので注意が必要でした。