Ubuntu Server 20.04をBtrfsにインストールする

# Ubuntu Server 20.04をBtrfsにインストールする

Ubuntu Server 20.04のルートファイルシステムをBtrfsにした時の手順をまとめました。

## Btrfsのサブボリュームについて

Btrfsのサブボリュームは、個別にマウントでき、サブディレクトリとして表示できます。また、Btrfsのスナップショットはコピーオンライト(CoW)機能により、素早くスナップショットを作成できます。

## Btrfsのサブボリュームのレイアウトについて

BtrfsのサブボリュームのレイアウトはopenSUSEが参考になります。openSUSEのデフォルトのファイルシステムはBtrfsを採用しています。

## ストレージ レイアウトの設定

ストレージ レイアウトの設定で、`Custom storage layout`を選択します。

![Screenshot_ubuntu20.04_2020-10-18_01:01:40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33079/4e8bbb8e-3385-8b32-2a06-11fcd17481ac.png)

ブート デバイス用のパーティションを作成します。

![Screenshot_ubuntu20.04_2020-10-18_01:01:55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33079/b0451536-517d-3888-c0b9-1cffdbfc5e4c.png)

GPTパーティションを追加します。

![Screenshot_ubuntu20.04_2020-10-18_01:02:12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33079/e7f24295-1b22-2006-5ba7-57d47398aad2.png)

btrfsでフォーマットし、マウント ポイントは`/`にします。

![Screenshot_ubuntu20.04_2020-10-18_01:02:23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33079/e8c6e060-918b-1811-f11f-ecf043f9c686.png)

ディスクにパーティション テーブルを書き込んで、インストールを続けます。

![Screenshot_ubuntu20.04_2020-10-18_01:02:36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33079/85519543-a47e-070f-4c48-b056cd1989a3.png)

インストールが完了したら、再起動せずに次のステップに進んでください。

![Screenshot_ubuntu20.04_2020-10-18_09:02:29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33079/ad3ee315-ce00-78ce-1e89-c0a01a999983.png)

## Btrfsのサブボリュームの作成

インストールが完了したら、再起動せずに`ALT` + `F2`を押して、コンソールに切り替えます。ここでルートになります。

```sh
sudo -i
```

マウントしたデバイスを表示します。`/target`にUbuntuがインストールされています。

```sh
mount -l | grep /target
```

![Screenshot_ubuntu20.04_2020-10-18_09:07:45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33079/075a0e43-2281-1a66-5b47-babca600ae30.png)

`/target`をアンマウントし、`/mnt`にディスクをマウントします。

```sh
umount -l /target
mount /dev/vda2 /mnt
```

`lsblk`でブロックデバイスの一覧を表示できます。

![Screenshot_ubuntu20.04_2020-10-18_09:15:38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33079/7ca6a7af-616b-93e0-43dc-7dc8149f8d4d.png)

サブボリュームを作成します。

```sh
cd /mnt
btrfs subvolume create @
btrfs subvolume create @/home
btrfs subvolume create @/opt
btrfs subvolume create @/root
btrfs subvolume create @/srv
btrfs subvolume create @/tmp
chmod 1777 @/tmp
mkdir @/usr
btrfs subvolume create @/usr/local
btrfs subvolume create @/var
btrfs subvolume create @/swap
```

`/var`のコピーオンライト(CoW)を無効にして、パフォーマンスを向上させます。

```sh
chattr +C /mnt/@/var
```

すべてのファイルとフォルダをサブボリュームに移動します。

```sh
shopt -s dotglob
mv home/* @/home
mv root/* @/root
mv usr/local/* @/usr/local
mv var/* @/var
rmdir home opt root srv usr/local tmp var
ls | grep -v @ | xargs mv -t @
```

`/mnt`をアンマウントして、システムに必要なデバイスをすべてマウントします。

```sh
umount /mnt
mount -o subvol=@ /dev/vda2 /target
mount /dev/vda2 /target/boot/efi
mount --bind /proc /target/proc
mount --bind /dev  /target/dev
mount --bind /sys  /target/sys
```

`ALT` + `F3`を押して、3番目のウインドウに切り替え、`chroot`でシステムを切り替えます。

```sh
sudo -i
chroot /target
```

fstabを編集して、サブボリュームを適切なマウントポイントを設定します。

```sh
vi /etc/fstab
```

```sh
UUID=xxxx / btrfs defaults,ssd,noatime,space_cache,commit=120,compress=zstd,subvol=@ 0 1
/swap/swapfile none swap sw 0 0
```

## スワップ ファイルの作成

Btrfsのサブボリュームにスワップ ファイルを作成するには、コピーオンライト(CoW)を無効にしないといけません。しかし、コピーオンライト(CoW)が無効なファイルがあると、スナップショットを撮ることができません。そこで、スワップ ファイル用のサブボリュームを作成、そこにスワップ ファイルを作成します。

```sh
touch /swap/swapfile
chmod 0600 /swap/swapfile
chattr +C /swap/swapfile
fallocate /swap/swapfile -l 2g
mkswap /swap/swapfile
```

最後にGRUBを更新します。

```sh
update-initramfs -u -k all
grub-install --recheck /dev/sda
update-grub
```

`ALT` + `F1`を押して、1番目のウインドウに切り替えて、再起動します。

![Screenshot_ubuntu20.04_2020-10-18_09:02:29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33079/ed1221c0-9ea3-d110-8436-0b2383193af0.png)

## 参考文献

1. [Install Ubuntu 18.04 Server on btrfs - work-work.work](https://work-work.work/blog/2018/12/01/ubuntu-1804-btrfs.html)
1. [18.04 - Where are my BTRFS subvolumes? - Ask Ubuntu](https://askubuntu.com/questions/1204802/where-are-my-btrfs-subvolumes)
1. [Ubuntu 20.04 with btrfs-luks-RAID1 full disk encryption including /boot and auto-apt snapshots with Timeshift | Willi Mutschler](https://mutschler.eu/linux/install-guides/ubuntu-btrfs-raid1/)
1. [Using Btrfs for Easy Backup and Rollback | John Ramsden](https://ramsdenj.com/2016/04/05/using-btrfs-for-easy-backup-and-rollback.html)
1. [Creating openSUSE-style btrfs root partition & subvolumes](https://rootco.de/2018-01-19-opensuse-btrfs-subvolumes/)
1. [SDB:BTRFS - openSUSE Wiki](https://en.opensuse.org/SDB:BTRFS)
1. [swap - Can I have a swapfile on btrfs? - Ask Ubuntu](https://askubuntu.com/questions/1206157/can-i-have-a-swapfile-on-btrfs)