Gentoo RTA

# はじめに
Gentoo Linuxをどれだけ早くインストールできるか気になったのでタイムアタックをしてみます。いわゆるGentoo Install Battleです。

# 条件

1. ハードウェア制限なし
2. インストール先は、VirtualBox上の仮想環境
3. VirtualBoxは設定済みとし、起動したら[Minimal Installation CD](https://ftp.iij.ad.jp/pub/linux/gentoo/releases/amd64/autobuilds/20220731T170548Z/install-amd64-minimal-20220731T170548Z.iso)が読み出される状態
4. [stage3](https://ftp.iij.ad.jp/pub/linux/gentoo/releases/amd64/autobuilds/20220731T170548Z/stage3-amd64-systemd-20220731T170548Z.tar.xz)はホストにダウンロード済み
5. 自動化するための自前スクリプトの事前用意は禁止
（すべてのコマンドを自力でタイプする。ただしシェルが持つ機能、タブ保管やワンライナーなどは可）
6. タイムは起動ボタンを押してから、ログイン後のuname表示まで

## VirtualBoxの設定

![Screenshot_20220807_172931.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561682/925c0f4d-f981-9462-aba9-0bd3cd500735.png)

ホストからゲストへsshでアクセスできるようにポートフォワーディングルールを追加しておきます。

![Screenshot_20220807_174936.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561682/65c71fb6-59f9-131b-0050-ea4088c2f232.png)

# インストールの流れ

インストールに必要な手順はGentoo Handbookに沿っていますが、最低限のコマンドだけ行います。

https://wiki.gentoo.org/wiki/Handbook:AMD64

大まかな流れは下の通りです。

1. ディスクパーティションの準備
2. Stage3の展開
3. 環境設定
4. Linux kernelの構築
5. ブートローダーのインストール

それでは、さっそくスタート

# 本編

起動ボタンを押したらタイマースタートします。

## ディスクパーティションの準備

まず、シェルが起動したらディスクパーティションを準備します。
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が有効になっておらず、再起動後に固まったりしてよく詰むので注意が必要でした。