Gentoo はどんどん簡単になっている
Gentoo Linux はインストールや運用のハードルが高いディストリビューションとして有名ですが、近年ではビルド済みカーネルや amd64/arm64 向けバイナリパッケージが提供されて格段に楽になっています。これにより非力な VPS で Gentoo を運用することも現実的になりました(このブログもメモリ 1GB の Gentoo VM でホストしています)。
実録: Gentoo のインストール
実際に Gentoo のインストールがどれほど楽になっているか見てみましょう。GNOME Boxes で適当な VM を作成して、Gentoo source mirrors からダウンロードした Minimal installation CD を使ってブートします。
パーティションを作成します。今回作成した VM は legacy BIOS システムのため、BIOS boot partition を 2MB 取って残りを rootfs にします。
gdisk /dev/vda
ファイルシステムを作成してマウントします。
mkfs.xfs -L root /dev/vda2
mount /dev/vda2 /mnt/gentoo
スワップファイルを作成して有効にしておきます。
cd /mnt/gentoo
fallocate -l 2GiB swapfile
chmod 600 swapfile
mkswap swapfile
swapon swapfile
時計を合わせましょう。
chronyd -q
Gentoo source mirrors から stage3-amd64-systemd-*.tar.xz
をダウンロードして展開します。
tar xpvf stage3-amd64-systemd-*.tar.xz --xattrs-include='*.*' --numeric-owner
rm stage3-amd64-systemd-*.tar.xz
/mnt/gentoo/etc/portage/make.conf
を編集してバイナリパッケージを利用するための設定をします。binpkg-request-signature
はパッケージの署名を検証するオプションです。
FEATURES="getbinpkg binpkg-request-signature"
/mnt/gentoo/etc/portage/binrepos.conf/gentoobinhost.conf
を編集して、より最適化されたバイナリを使うようにします (Gentoo x86-64-v3 binary packages available – Gentoo Linux)。
- sync-uri = https://distfiles.gentoo.org/releases/amd64/binpackages/17.1/x86-64
+ sync-uri = https://distfiles.gentoo.org/releases/amd64/binpackages/17.1/x86-64-v3
/etc/resolv.conf
をコピーして Gentoo 環境に chroot します。
cp -L /etc/resolv.conf /mnt/gentoo/etc/
arch-chroot /mnt/gentoo
Portage tree のスナップショットを取得します。ついでにニュースを流し読みしておきましょう。
emerge-webrsync
eselect news read new
rsync は遅いので Portage tree の取得元を GitHub にしましょう。まず Git を入れます。
emerge -av dev-vcs/git
ここで行が紫色、行頭が binary となっているパッケージはバイナリパッケージからインストールされ、緑色で ebuild となっている行のパッケージは通常通りローカルでビルドされます。Gentoo にはパッケージごとにビルドオプションなどを調整する USE フラグという仕組みがあり、これが一致するバイナリパッケージがある場合はそれが使われ、ない場合はビルドにフォールバックされます。今回は nghttp2 だけマッチするバイナリパッケージがなかったのでビルドされています。当然ですが、バイナリパッケージのインストールはアーカイブをダウンロードして展開するだけなので非常に高速です。
続いて eselect-repository を入れます。
emerge -av eselect-repository
既存の Porage tree を一旦削除し、GitHub から取得し直します。
rm -rf /var/db/repos/gentoo
eselect repository enable gentoo
emerge --sync
全パッケージを更新しておきましょう。ここでもほとんどのパッケージはバイナリインストールになるので大した時間は掛かりません。
emerge -avuDN @world
タイムゾーンを設定します。
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
date
ロケールを設定します。
echo 'en_US.UTF-8 UTF-8' > /etc/locale.gen
locale-gen
eselect locale set en_US.utf8
. /etc/profile
ファームウェアをインストールします。ファームウェアにはオープンソース互換ライセンスでないものも含まれているので、/etc/portage/make.conf
で受け入れ可能なライセンスを設定します。*
は任意のライセンスを受け入れるの意です。
ACCEPT_LICENSE="*"
続いて linux-firmware パッケージをインストールします。
emerge -av linux-firmware
カーネルのインストールに移ります。USE フラグの設定を簡単にするため、flaggie をインストールしましょう。
emerge -av flaggie
今回はブートローダとして grub を使うため、適切な USE フラグを設定して installkernel をインストールします。
flaggie installkernel +grub
emerge -av installkernel
カーネルをインストールします。
emerge -av gentoo-kernel-bin
USE フラグの変更が必要だと言われるので dispatch-conf しましょう。u で新しい設定を適用します。
dispatch-conf
あらためてカーネルをインストールします。
emerge -av gentoo-kernel-bin
既存の gentoo-sources はカーネルソースだけをインストールして後のコンフィグとビルドは自分で頑張らないといけなかったのですが、gentoo-kernel-bin はカーネルイメージそのものをインストールします。つまり、これだけでカーネルのインストールはおしまいです。
この新しい方式のカーネルパッケージを Distribution Kernel と呼びます。Distribution Kernel には現状 vanilla-kernel(Gentoo のパッチセットが当たっていない素のカーネル、ソースコードからビルド)、gentoo-kernel(パッチセットを適用したカーネル、ソースコードからビルド)、gentoo-kernel-bin(パッチセットを適用したカーネル、バイナリインストール)の3種類があります。gentoo-kernel-bin 以外の2つはインストール前にコンフィグをカスタマイズすることもできます。プリセットのコンフィグは Fedora のものが使われているそうです。
Distribution Kernel 環境用の USE フラグがあるので /etc/portage/make.conf
に設定しておきましょう。これによってカーネル更新時にカーネルモジュールが自動でリビルドされるようになります。
USE="dist-kernel"
USE フラグを変更したので影響のあるパッケージをリビルドしましょう。
emerge -avuDN @world
/etc/fstab
を設定します。
LABEL=root / xfs defaults,noatime 0 1
/swapfile none swap sw 0 0
ルートパスワードを設定して作業用アカウントを作成します。
passwd
useradd -m -G wheel,portage ursm
passwd ursm
sudo をインストールして設定します。
emerge -av sudo
visudo
wheel グループに対して sudo を許可するようにしましょう。NOPASSWD: ALL
はお好みで。
%wheel ALL=(ALL:ALL) NOPASSWD: ALL
Systemd の初期設定を行います。
systemd-machine-id-setup
systemd-firstboot --prompt
ブートローダをインストールします。
grub-install /dev/vda
systemd-networkd の設定ファイル /etc/systemd/network/50-dhcp.network
を作成します。
[Match]
Name=en*
[Network]
DHCP=yes
chroot 環境を抜けて reboot します。
^D
reboot
作業用アカウントでログインして、ネットワークを使える状態にします。
sudo systemctl enable --now systemd-networkd
これでインストールは完了です。ね、簡単でしょう?
「ビルドせずして何が Gentoo か」という声もあろうかと思うのですが、別に Gentoo はバイナリベースのディストリビューションになろうとしているわけではありません。基本はビルドで、オプションとしてバイナリパッケージという選択肢が提供されただけです。冒頭に挙げた非力な VPS のように、これまで Gentoo の運用が難しかった環境への導入の道が開けますし、初回インストールはバイナリインストールで手早くセットアップして後からシステム全体をビルドし直すようなやり方も取れるようになります。まさに "Choice is another Gentoo design principle" を体現する動きと言えるのではないでしょうか。