あらすじ
新マシンとしてThinkPad X230の中古品と480GBのSSDを買ったので、セットアップを行いました。その時行ったことを備忘録として書いておこうと思います。
ハードの性能はこんな感じです。
name |
spec |
Hardware |
ThinkPad x230 |
CPU |
Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz |
Memory |
8GB |
Storage |
SSD 480GB |
OSのインストールは以下の希望を満たせるよう、進めることにします。
一言でまとめるとすると「(UEFI + Windows 10 + Bitlocker(without TPM)) and (UEFI + Arch Linux + dm-crypt + Btrfs)」とかけばいいのでしょうか......? 結構大変です。
手順が長くなるので、以下の3つくらいに記事を分けたいと思います。
- USBディスクからArchをインストールするまで
- Archのデスクトップ環境を作るまで
- Snapperで定期snapshot取得およびバックアップを設定するまで
先にWindows 10を120GBのパーティションを作ってインストールします。
細かいインストール方法等は省略します。
UEFIの設定でTPMをDisableにすればBitlockerを用いて暗号化も可能です。
TPMを有効にしたまま行うのは難しそうです。
既にWindowsのパーティションが4つでできているので、新たにrootfs(sda5)に298GiB、swap(sda6)に16GiB、ファイル交換用(sda7)に16GiBのパーティションを作ります。
fdisk /dev/sda
完成後はこんな感じになります。
partition |
size |
type |
/dev/sda1 |
499M |
Windows recovery environment |
/dev/sda2 |
100M |
EFI System |
/dev/sda3 |
16M |
Microsoft reserved |
/dev/sda4 |
116G |
Microsoft basic data(Windows10 OS) |
/dev/sda5 |
298G |
Linux filesystem(rootfs) |
/dev/sda6 |
16G |
Linux swap |
/dev/sda7 |
16G |
Microsoft basic data(ファイル交換用) |
最後のsda7だけ暗号化しないのでexfatでフォーマットしておきます。
mkfs.exfat /dev/sda7
rootfsの暗号化
以下を参考に、dm-crypt/LUKSを使ってrootfsを暗号化します。
https://wiki.archlinux.jp/index.php/Dm-crypt/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%85%A8%E4%BD%93%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96#Btrfs_.E3.82.B5.E3.83.96.E3.83.9C.E3.83.AA.E3.83.A5.E3.83.BC.E3.83.A0.E3.81.A8.E3.82.B9.E3.83.AF.E3.83.83.E3.83.97
sudo cryptsetup -s 512 luksFormat /dev/sda5
Are you sure? (Type uppercase yes):
と聞かれるので、大文字でYESと答えます。
次にパスワードを聞かれるので、入力してください。。
これで暗号化完了です。
暗号化を解除するには、以下のコマンドを実行します。
cryptsetup open --type luks /dev/sda5 cryptroot
これで /dev/mapper/cryptroot
に復号されたデバイスがマップされます。
復号されたデバイス上にbtrfsのファイルシステムを作ります。
mkfs.btrfs /dev/mapper/cryptroot
マウント
compress=zstd
をつけて圧縮を有効にしながら、rootfsを/mnt
にマウントします。
mount -o compress=zstd /dev/mapper/cryptroot /mnt
subvolume の作成
Snapperで使える推奨ファイルシステムレイアウトを作ります。
推奨レイアウトについては以下を参照してください。
https://wiki.archlinux.jp/index.php/Snapper#.E6.8E.A8.E5.A5.A8.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.82.B7.E3.82.B9.E3.83.86.E3.83.A0.E3.83.AC.E3.82.A4.E3.82.A2.E3.82.A6.E3.83.88
cd /mnt
sudo btrfs subvolume create @
sudo btrfs subvolume create @home
sudo btrfs subvolume create @log
一緒にsnapper向けのsubvolumeも作ります。
sudo btrfs subvolume create @snapshots
sudo btrfs subvolume create @snapshots/snapshots_root
sudo btrfs subvolume create @snapshots/snapshots_home
一旦マウントし直します。
cd
umount /mnt
mount -o compress=zstd,subvol=@ /dev/mapper/cryptroot /mnt
mkdir /mnt/home
mount -o compress=zstd,subvol=@home /dev/mapper/cryptroot /mnt/home
mkdir -p /mnt/var/log
mount -o compress=zstd,subvol=@log /dev/mapper/cryptroot /mnt/var/log
cd /mnt
mkdir -p var/cache/pacman/
btrfs subvolume create var/cache/pacman/pkg
btrfs subvolume create var/abs
btrfs subvolume create var/tmp
btrfs subvolume create srv
bootのマウント
bootをマウントします。
mkdir /mnt/boot
mount /dev/sda2 /mnt/boot
Archのセットアップとインストール
システムクロック更新
timedatectl set-ntp true
ミラー選択
/etc/pacman.d/mirrorlist を編集します。
sed -i -e "s/Server/#Server/" /etc/pacman.d/mirrorlist
nano /etc/pacman.d/mirrorlist
JAPANのミラーだけコメントアウトから外してください。
base systemのインストール
cd /mnt
pacstrap /mnt base base-devel
fstabの反映
マウント情報をfstabに反映します。
genfstab -U /mnt >> /mnt/etc/fstab
暗号化されたswap領域の作成とマウント設定
swapはRAMのデータが一時的に退避される場所です。
なので、ここが暗号化されていないとRAMにあるデータが一部読み取れてしまうかもしれないので、暗号化します。
ハイバネートをすることを考えなければ、swapの暗号化は非常に簡単です。
以下のドキュメントを参考に /mnt/etc/crypttab
と /mnt/etc/fstab
を修正すれば、swapの暗号化は完了します。
https://wiki.archlinux.jp/index.php/Dm-crypt/%E3%82%B9%E3%83%AF%E3%83%83%E3%83%97%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96#suspend-to-disk_.E3.82.92.E4.BD.BF.E7.94.A8.E3.81.97.E3.81.AA.E3.81.84
まずswapパーティション(sda6)の先頭1Mをext2でフォーマットし、UUIDを得ます。
mkfs.ext2 -L cryptswap /dev/sda6 1M
blkid /dev/sda6
すると、UUIDとLABELが得られるので、どちらか好きな方を使って /mnt/etc/crypttab
に暗号化の設定を追記します。
swap LABEL=cryptswap /dev/urandom swap,offset=2048,cipher=aes-xts-plain64,size=256
これで起動時に暗号化されたswapが /dev/mapper/swap
にマウントされるので、このswapを使うようにfstabに追記します。
/dev/mapper/swap none swap defaults 0 0
なぜこのようにoffsetを使うかの理由は、以下を参照してください。
https://wiki.archlinux.jp/index.php/Dm-crypt/%E3%82%B9%E3%83%AF%E3%83%83%E3%83%97%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96#UUID_.E3.81.A8_LABEL
It is more reliable to identify the correct partition by giving it a genuine UUID or LABEL. By default that does not work because dm-crypt and mkswap would simply overwrite any content on that partition which would remove the UUID and LABEL too
swapの書き込み制限
sudo sh -c "echo 10 > /proc/sys/vm/swappiness"
sudo sh -c 'echo "vm.swappiness = 10" >> /mnt/etc/sysctl.conf'
swapの書き込み回数を減らしてSSDの寿命を伸ばします。
chrootでArchのrootfsを設定していきます。
arch-chroot /mnt
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
locale設定
/etc/locale.gen
を編集して以下のコメントを外します。
そして以下のコマンドを実行します。
locale-gen
最後にlocaleを設定します。
sudo sh -c 'echo LANG=en_US.UTF-8 > /etc/locale.conf'
一応vconsoleも設定します。
sudo sh -c 'echo KEYMAP=jp106 > /etc/vconsole.conf'
Hostname
ホスト名を適当に設定します。 /etc/hosts
も忘れずに。
echo HOGEHOE > /etc/hostname
127.0.0.1 localhost.localdomain localhost
::1 localhost.localdomain localhost
127.0.1.1 HOGEHOGE.localdomain HOGEHOGE
systemctl-boot
systemd-bootをブートローダーとしてインストールします。
bootctl --path=/boot install
rootfsを暗号化してるので、以下の /boot/loader/entries/arch.conf
を作ります。
title Arch Linux Encrypted
linux /vmlinuz-linux
initrd /initramfs-linux.img
options cryptdevice=UUID=<UUID>:<mapped-name> root=UUID=<luks-UUID> rootflags=subvol=@ quiet rw
UUIDは以下のコマンドで調べられます。
ls -l /dev/disk/by-uuid/
/dev/sda5
が、dm-0が<luks-UUID>なので、合わせて設定してください。
例えば
# ls -l /dev/disk/by-uuid/
lrwxrwxrwx 1 root root 10 Feb 8 2018 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX -> ../../dm-0
lrwxrwxrwx 1 root root 10 Feb 8 2018 (hidden) -> ../../sdb2
lrwxrwxrwx 1 root root 10 Feb 8 2018 (hidden) -> ../../sdb1
lrwxrwxrwx 1 root root 10 Feb 8 2018 YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY -> ../../sda5
lrwxrwxrwx 1 root root 10 Feb 8 2018 (hidden) -> ../../sda2
lrwxrwxrwx 1 root root 10 Feb 8 2018 (hidden) -> ../../sda1
lrwxrwxrwx 1 root root 10 Feb 8 2018 (hidden) -> ../../sda7
lrwxrwxrwx 1 root root 10 Feb 8 02:01 (hidden) -> ../../sda6
となる場合は/boot/loader/entries/arch.conf
は以下のようになります。
title Arch Linux Encrypted
linux /vmlinuz-linux
initrd /initramfs-linux.img
options cryptdevice=UUID=YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY:cryptroot root=UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw rootflags=subvol=@ quiet
一緒に、Windowsをブートするためのエントリも作成してください。
title Windows 10
loader EFI/MICROSOFT/BOOT/BOOTMGFW.EFI
btrfs-progs
btrfs をつかうので、入れておきます。
sudo pacman -S btrfs-progs
これを入れておかないと、次のmkcpioでbtrfsのモジュールが入りません。
mkcpio
ブート時にrootfsの暗号化を解除できるよう /etc/mkinitcpio.conf
に encrypt フックを追加します。
https://wiki.archlinux.jp/index.php/Dm-crypt/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E5%AE%9A#encrypt_.E3.83.95.E3.83.83.E3.82.AF.E3.82.92.E4.BD.BF.E3.81.86
HOOKSの行を以下のように書き換えてください。
HOOKS=(base udev autodetect keyboard keymap consolefont modconf block encrypt btrfs filesystems)
initramfsを作り直します。
mkinitcpio -p linux
ansible動かせるように色々インストール
初期セットアップを別マシンからansibleで行えるようにしたいので、必要なファイルを入れておきます。
sudo pacman -S python openssh
sudo systemctl enable sshd.service
user追加
管理に使うユーザーを追加します。
useradd -m -G wheel USERNAME
passwd USERNAME
visudo
wheelのひとはNOPASSWDでsudo使えるようにしておくと、ansibleでの初期セットアップができて便利なので、設定しておきます。
リブート
最後にリブートして完了です。
exit
cd
umount -R /mnt
reboot
おしまい
今回はここでおしまいです。