あらすじ
新マシンとして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のインストールは以下の希望を満たせるよう、進めることにします。
- Windows & Linux dual boot
- UEFIブート(not CSMモード)
- Win,Linux どちらでも読み書きできる領域(ファイル交換用)を16GBがほしい
- winもLinuxもファイルシステムを暗号化したい(紛失後の情報流出の心配を減らしたい)
- 暗号化されたswap領域も欲しい
- サスペンドのみでハイバネートは使わない
- Btrfs + snapper + snap-syncで差分バックアップ取れるようにしたい
一言でまとめるとすると「(UEFI + Windows 10 + Bitlocker(without TPM)) and (UEFI + Arch Linux + dm-crypt + Btrfs)」とかけばいいのでしょうか......? 結構大変です。
手順が長くなるので、以下の3つくらいに記事を分けたいと思います。
- USBディスクからArchをインストールするまで
- Archのデスクトップ環境を作るまで
- Snapperで定期snapshot取得およびバックアップを設定するまで
Windowsのインストール
先にWindows 10を120GBのパーティションを作ってインストールします。
細かいインストール方法等は省略します。
UEFIの設定でTPMをDisableにすればBitlockerを用いて暗号化も可能です。 TPMを有効にしたまま行うのは難しそうです。
Linuxをインストール
パーティション作成
既に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を暗号化します。
sudo cryptsetup -s 512 luksFormat /dev/sda5
Are you sure? (Type uppercase yes):
と聞かれるので、大文字でYESと答えます。
次にパスワードを聞かれるので、入力してください。。
これで暗号化完了です。
暗号化を解除するには、以下のコマンドを実行します。
cryptsetup open --type luks /dev/sda5 cryptroot
これで /dev/mapper/cryptroot
に復号されたデバイスがマップされます。
rootfsパーティション作成
復号されたデバイス上にbtrfsのファイルシステムを作ります。
mkfs.btrfs /dev/mapper/cryptroot
マウント
compress=zstd
をつけて圧縮を有効にしながら、rootfsを/mnt
にマウントします。
mount -o compress=zstd /dev/mapper/cryptroot /mnt
subvolume の作成
Snapperで使える推奨ファイルシステムレイアウトを作ります。 推奨レイアウトについては以下を参照してください。
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の暗号化は完了します。
まず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を使うかの理由は、以下を参照してください。
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
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
が
例えば
# 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 フックを追加します。
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
おしまい
今回はここでおしまいです。