archLinux
thinkpad

Thinkpad X1 Carbon (Gen 4)にArch Linuxをインストールする

More than 1 year has passed since last update.

Thinkpad X1 Carbonを入手しました。2016年に発売された第4世代のものです。
これにArch Linuxをインストールしようと思います。

方針

  • Arch Linuxを導入する
    • Linux単体で使う
    • 入手時にWindows 10が導入されていたが、消す
  • SSD
    • dm-crypt、LUKSで暗号化して、LVMで管理する
    • ファイルシステムはext4を使う
    • スワップは作らない

ちなみにこのPC、NVMe SSDが使われていました。NVMeを扱うのが自分はこれがはじめてだったのですが、特に困ったことはありませんでした。今まで通りの手順でインストールできています。

インストール前の準備

インストールメディアをつくる

インストールメディアからLinuxを起動する

  1. USBメモリをさし、電源ON
  2. LENOVOロゴの画面でEnterを押す
  3. Startup Interrupt Menuの画面でF1を押す
  4. Secure Bootを無効にする
    1. Security>Secure Boot
    2. Secure BootがDisabledであることを確認
  5. USBメモリのLinuxの起動を最優先にする
    1. ESCを押して、Startup>Boot
    2. USBメモリのBoot Priority Orderを1番にする
  6. F10 (Save and Exit)を押して、Yesを選択する
  7. 再起動し、インストールメディアが起動する

リモート接続を受け付ける

まずsshサーバを起動し、リモートからログインして作業できるようにする。

root@archiso ~ # loadkeys jp106
root@archiso ~ # wifi-menu
root@archiso ~ # ping -4 -c 3 ftp.tsukuba.wide.ad.jp
root@archiso ~ # ping -4 -c 3 ftp.jaist.ac.jp
root@archiso ~ # passwd
root@archiso ~ # systemctl start sshd
root@archiso ~ # ip addr

X1 Carbon 2016(Gen 4)にArch Linuxをインストール - pockestrapを読んで、真似してみた。コピペがし易く、ログを残すのが簡単になるので、大変よかった。

手順

SSHログインした直後から。

キーボードは日本語を使う

root@archiso ~ # loadkeys jp106

時刻合わせ

root@archiso ~ # timedatectl set-ntp true

パーティションテーブルを作成する

EFIパーティションと暗号化するパーティションの2件を作成する。
スワップパーティションを作らないのは前提に書いたとおり。

root@archiso ~ # parted /dev/nvme0n1 \
>   -s mklabel gpt \
>   -s mkpart ESP fat32 1MiB 513MiB \
>   -s set 1 boot on \
>   -s mkpart primary ext4 513MiB 100%
root@archiso ~ # parted /dev/nvme0n1 print
Model: Unknown (unknown)
Disk /dev/nvme0n1: 512GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size   File system  Name  Flags
 1      1049kB  538MB  537MB  fat32              boot, esp
 2      538MB   512GB  512GB

EFIパーティションを作成する

root@archiso ~ # mkfs.vfat -F32 /dev/nvme0n1p1
mkfs.fat 4.1 (2017-01-24)

LUKSコンテナを作成する

root@archiso ~ # cryptsetup luksFormat /dev/nvme0n1p2

WARNING!
========
This will overwrite data on /dev/nvme0n1p2 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase: <パスワード>
Verify passphrase: <再度、パスワード>

LUKSコンテナにLVMボリュームを作成する

  • 物理ボリューム: /dev/mapper/lvm
    • ボリュームグループ: volume
    • 論理ボリューム #1: root
      • 20GB
      • /にマウントする
    • 論理ボリューム #2: home
      • 残り全部
      • /homeにマウントする
root@archiso ~ # cryptsetup open /dev/nvme0n1p2 lvm
Enter passphrase for /dev/nvme0n1p2:
root@archiso ~ # pvcreate /dev/mapper/lvm
  Physical volume "/dev/mapper/lvm" successfully created.
root@archiso ~ # vgcreate volume /dev/mapper/lvm
  Volume group "volume" successfully created
root@archiso ~ # lvcreate --size 20G volume --name root
  Logical volume "root" created.
root@archiso ~ # lvcreate --extents +100%FREE volume --name home
  Logical volume "home" created.

ファイルシステムを作成する

root@archiso ~ # mkfs.ext4 /dev/mapper/volume-root
mke2fs 1.43.4 (31-Jan-2017)
Creating filesystem with 5242880 4k blocks and 1310720 inodes
Filesystem UUID: 335c2dd4-154c-4a0b-9440-706ed5ce55f2
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

root@archiso ~ # mkfs.ext4 /dev/mapper/volume-home
mke2fs 1.43.4 (31-Jan-2017)
Creating filesystem with 119651328 4k blocks and 29917184 inodes
Filesystem UUID: 2187ac2c-c677-44b0-808e-256bf03857ce
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

ファイルシステムをマウントする

root@archiso ~ # mount /dev/mapper/volume-root /mnt
root@archiso ~ # mkdir /mnt/home
root@archiso ~ # mount /dev/mapper/volume-home /mnt/home
root@archiso ~ # mkdir /mnt/boot
root@archiso ~ # mount /dev/nvme0n1p1 /mnt/boot

パッケージインストールのミラーを設定する

root@archiso ~ # cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup
root@archiso ~ # grep -A 1 --no-group-separator '^## Japan' /etc/pacman.d/mirrorlist.backup | grep -v '^## Japan' > /etc/pacman.d/mirrorlist

ベースシステムをインストールする

root@archiso ~ # pacstrap /mnt base base-devel
(略)

fstabファイルを作成する

root@archiso ~ # genfstab -U /mnt >> /mnt/etc/fstab

新しいシステムにchrootする

root@archiso ~ # arch-chroot /mnt

ホスト名を設定する

[root@archiso /]# NEW_HOSTNAME=susi
[root@archiso /]# echo "$NEW_HOSTNAME" > /etc/hostname
[root@archiso /]# echo "127.0.1.1      ${NEW_HOSTNAME}.localdomain  $NEW_HOSTNAME" >> /etc/hosts

タイムゾーンを設定する

[root@archiso /]# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
[root@archiso /]# hwclock --systohc

ロケールを設定する

[root@archiso /]# sed -i 's/^#en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen
[root@archiso /]# sed -i 's/^#ja_JP.UTF-8/ja_JP.UTF-8/' /etc/locale.gen
[root@archiso /]# locale-gen
Generating locales...
  en_US.UTF-8... done
  ja_JP.UTF-8... done
Generation complete.
[root@archiso /]# cat << __LOCALE_CONF__ > /etc/locale.conf
> LANG=en_US.UTF-8
> LC_ALL=
> __LOCALE_CONF__
[root@archiso /]# echo 'KEYMAP=jp106' > /etc/vconsole.conf

rootのパスワードを設定する

[root@archiso /]# passwd
New password:
Retype new password:
passwd: password updated successfully

initramfsを作成する

[root@archiso /]# sed -i.backup '/^HOOKS=/ s/ filesystems / encrypt lvm2 resume filesystems /' /etc/mkinitcpio.conf
[root@archiso /]# mkinitcpio --preset linux
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default'
  -> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux.img
==> Starting build: 4.11.9-1-ARCH
  -> Running build hook: [base]
  -> Running build hook: [udev]
  -> Running build hook: [autodetect]
  -> Running build hook: [modconf]
  -> Running build hook: [block]
  -> Running build hook: [encrypt]
  -> Running build hook: [lvm2]
  -> Running build hook: [resume]
  -> Running build hook: [filesystems]
  -> Running build hook: [keyboard]
  -> Running build hook: [fsck]
==> Generating module dependencies
==> Creating gzip-compressed initcpio image: /boot/initramfs-linux.img
==> Image generation successful
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback'
  -> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-fallback.img -S autodetect
==> Starting build: 4.11.9-1-ARCH
  -> Running build hook: [base]
  -> Running build hook: [udev]
  -> Running build hook: [modconf]
  -> Running build hook: [block]
==> WARNING: Possibly missing firmware for module: aic94xx
==> WARNING: Possibly missing firmware for module: wd719x
  -> Running build hook: [encrypt]
  -> Running build hook: [lvm2]
  -> Running build hook: [resume]
  -> Running build hook: [filesystems]
  -> Running build hook: [keyboard]
  -> Running build hook: [fsck]
==> Generating module dependencies
==> Creating gzip-compressed initcpio image: /boot/initramfs-linux-fallback.img
==> Image generation successful

aic94xx、wd719xのファームウェアがない、とWARNINGがでているけど……
そのファームウェアは必要なんだろうか?

ブートローダーをインストールする

systemd-bootを使う。

[root@archiso /]# bootctl --path=/boot install
Created "/boot/EFI".
Created "/boot/EFI/systemd".
Created "/boot/EFI/BOOT".
Created "/boot/loader".
Created "/boot/loader/entries".
Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/systemd/systemd-bootx64.efi".
Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/BOOT/BOOTX64.EFI".
Created EFI boot entry "Linux Boot Manager".
[root@archiso /]# echo 'default arch' >> /boot/loader/loader.conf
[root@archiso /]# echo 'timeout 5' >> /boot/loader/loader.conf
[root@archiso /]# UUID_CRYPTDEVICE=$(find /dev/disk/by-uuid -lname ../../nvme0n1p2 -printf "%f\n" | head -n 1)
[root@archiso /]# cat << __ARCH_CONF__ > /boot/loader/entries/arch.conf
> title Arch Linux
> linux /vmlinuz-linux
> initrd /initramfs-linux.img
> options cryptdevice=UUID=${UUID_CRYPTDEVICE}:volume root=/dev/mapper/volume-root rw intel_pstate=no_hwp
> __ARCH_CONF__

再起動する

[root@archiso /]# exit
exit
arch-chroot /mnt  11.15s user 1.54s system 4% cpu 4:17.33 total
root@archiso ~ # umount -R /mnt
root@archiso ~ # reboot