/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

Windows10とArch Linuxをファイルシステムを暗号化しながら入れた話 その1

あらすじ

新マシンとして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を暗号化します。

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 に復号されたデバイスがマップされます。

rootfsパーティション作成

復号されたデバイス上に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

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

おしまい

今回はここでおしまいです。