Gentoo Linux on ThinkPad X1 Carbon (4th Generation)

会社のマシンを買い換えてもらいました。Lenovo の ThinkPad X1 Carbon (4th Generation) です。これが実によくできたマシンで、薄くて軽くて性能もよく、14インチ WQHD の画面に秀逸な入力デバイスという隙のない作りをしています。Gentoo をインストールして一通り設定も終わったので、過程をメモしておきます。

UEFI の設定

まずは SecureBoot をオフにしないといけないのですが、どう頑張っても UEFI の画面に行けず Windows が起動してしまいます。どうやらこれは最近の Windows に追加された高速スタートアップという仕組みによるものらしく、この状態だと起動メニューが出ないのですね。

通常のシャットダウンを行うには Shift を押しながら「再起動」をクリック→「PC の電源を切る」を選べばいいみたいです。後から知ったことですが、再起動はコールドブート扱いになるらしいので普通に再起動すればよかっただけなのかも。

なんとかして UEFI の画面に入ったら SecureBoot をオフに、なぜか Intel VT が無効になっているのでついでにオンにしておきます。

ブートメディアの選択

いつも通り SystemRescueCd から起動してみたのですが、ネットワークデバイスがまったく認識されていません。どうやら新しめのカーネルでないと駄目みたいなので、Arch Linux のインストールメディアを USB メモリに書き込んで起動してみたら有線も無線も無事に認識されました。

wifi-menu コマンドを叩いてインターネットアクセスを確保します。

パーティショニング

ここからは Gentoo Linux amd64 Handbook: Installing Gentoo に従って進めていけば OK です。まずはディスクパーティショニング。

$ sudo gdisk -l /dev/nvme0n1
GPT fdisk (gdisk) version 1.0.1

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/nvme0n1: 500118192 sectors, 238.5 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 33F23207-8C6A-474C-9888-136B515DA2FD
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 500118158
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          526335   256.0 MiB   EF00  EFI System
   2          526336        17303551   8.0 GiB     8200  Linux swap
   3        17303552       500118158   230.2 GiB   8300  Linux filesystem

NVM Express 接続のストレージなのでデバイス名が見慣れない感じになっていますね。

UEFI native ブートのため EFI システムパーティションを作ります。スワップパーティションのサイズに少し悩んだのですが、ハイバネートするときメモリイメージはメモリ容量の 2/5 を目標に圧縮されるとのことだったので、余裕を見てメモリ容量の半分取っておきました。

ファイルシステムはそれぞれ vfat, swap, btrfs です。ルートファイルシステムが btrfs でなければスワップファイルでもいいかもしれません (btrfs はスワップファイルをサポートしていない)。

Stage 3 の展開

ルートパーティションをマウントしたら Stage 3 をダウンロードして展開します。stage3-amd64-systemd-*.tar.bz2 という systemd 環境用っぽいものを見つけたので、これを使いました。

make.conf の設定

PORTDIR="/usr/portage"
DISTDIR="${PORTDIR}/distfiles"
PKGDIR="${PORTDIR}/packages"

CHOST="x86_64-pc-linux-gnu"
CFLAGS="-march=native -O2 -pipe"
CXXFLAGS="${CFLAGS}"
MAKEOPTS="--jobs=4 --load-average=4"
EMERGE_DEFAULT_OPTS="--with-bdeps=y --keep-going"
GENTOO_MIRRORS="http://ftp.iij.ad.jp/pub/linux/gentoo/"

ACCEPT_KEYWORDS="~amd64"
ACCEPT_LICENSE="*"
USE="cjk vaapi wayland -accessibility -ldap"
LINGUAS=""
VIDEO_CARDS="intel i965"
INPUT_DEVICES="libinput"
CPU_FLAGS_X86="aes avx avx2 fma3 mmx mmxext popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3"
RUBY_TARGETS="ruby23"

CPU に合わせた最適化の設定、testing branch を選択。libinput はなんとなく新しくてよさそうという理由で選んだのですが、マスクされているので /etc/portage/profile/package.use.mask でマスクを解除してやる必要があります (マスクされている理由は知らない)。

x11-base/xorg-drivers -input_devices_libinput

libinput はミドルボタン+TrackPoint のスクロールがデフォルトで使えてちょっと楽です。

パッケージのインストール

Handbook の手順に従って chroot します。systemd - Gentoo Wiki に書かれている ln -sf /proc/self/mounts /etc/mtab を忘れないうちにやっておきます。

Portage tree は Git で同期するよう設定したいところなのですが、Stage 3 には Git が入っていないので初回は emerge-webrsync する必要があります。

プロファイルはいきなり default/linux/amd64/13.0/desktop/gnome/systemd を選びます。そして emerge -avuDN @world gnome-light linux-firmware で全パッケージの更新と Gnome、ファームウェアのインストールを一気にやってしまいます。数時間掛かるので気長に待ちましょう。

タイムゾーンの設定

あとで systemd がなんとかしてしまうので設定する必要はないです。

ロケールの設定

これも systemd がやるので locale-gen だけしておけばよいです。

カーネルのビルド

emerge -av gentoo-sources/usr/src/linuxmake nconfig して設定を開始します。最低限必要なのは↓ぐらいでしょうか。

CONFIG_BLK_DEV_NVME=y
CONFIG_BTRFS_FS=y
CONFIG_CMDLINE="root=/dev/nvme0n1p3 init=/usr/lib/systemd/systemd"
CONFIG_DRM_I915=y
CONFIG_E1000E=y
CONFIG_EFI=y
CONFIG_EFI_PARTITION=y
CONFIG_EFI_STUB=y
CONFIG_GENTOO_LINUX_INIT_SYSTEMD=y
CONFIG_IWLMVM=m
CONFIG_IWLWIFI=m
CONFIG_UEVENT_HELPER_PATH=""
CONFIG_VFAT_FS=m

気の済むまで設定したらビルドとインストールを行います。

$ make -j4 && make install modules_install

EFI システムパーティションにカーネルイメージを配置します。

$ cd /boot
$ mkdir efi
$ mount /dev/nvme0n1p1 efi
$ mkdir -p efi/boot
$ cp vmlinuz-*-gentoo efi/boot/bootx64.efi

これで UEFI ブートローダがカーネルイメージを直接起動してくれるようになります。

fstab

/dev/nvme0n1p1          /boot/efi       vfat            defaults,discard        0 2
/dev/nvme0n1p2          none            swap            defaults,discard        0 0
/dev/nvme0n1p3          /               btrfs           defaults,discard        0 0

dump/pass はこれでいいんでしょうか。よくわかっていません。

ネットワークの設定

systemd と networkmanager にすべて任せます。スキップ。

ユーザアカウントの作成

$ useradd -m -G wheel,portage ursm
$ passwd ursm

sudo できるようにしておきます。

$ emerge -av sudo

visudo して %wheel ALL=(ALL) ALL のコメントアウトを解除します。 root にもパスワードを設定しておかないと sudo できなかったような気がするので (あやふや) 設定しておきます。

$ passwd

syslog

systemd が頑張ってしまうのでいりません。

ブートローダ

UEFI がうまいことやってくれるので grub の類は必要ないです。efibootmgr も不要。

再起動

Ctrl+D で chroot を抜けて reboot。umount は勝手にやってくれるからいいんじゃないかなあ。

システム設定

コンソールでログインして各種設定を行います。

$ localectl set-locale LANG=en_US.utf8
$ hostnamectl set-hostname x1

networkmanager を起動しつつグラフィカルログインを有効にします。

$ systemctl enable --now NetworkManager gdm

作成したユーザで Gnome にログインし、右上をポチポチして Wi-Fi に接続します。Date & Time の設定画面を開いて Automatic Date & Time と Automatic Time Zone をオン。これで時刻が正しく設定されるはず。