💨

Ubuntu server 20.04でZFSのhomeをsend/recvで引っ越した話

2021/06/29に公開

/home がZFSになっているVirtualBoxイメージを新しいPCに移すときの作業を記録したメモです。

VDIをそのままコピっても良かったのですが、既存の環境ですでにhomeがzfsになってるのと、システムをまっさらにしたかったのでzfsによるmigrationを試しました。

受け入れ側の準備

Ubuntu 20.04 Server TLS をインストール

通常通りにインストールします。
今回は、

  • 75GB: root (ext4)
  • 125GB: /home/shirou (zfs)

というようにしたいので、まずは75GBだけのpartitionでインストールします。
インストーラーではentire diskを選択し、75GBはbootとしてext4でformatし / にmountします。残り125GBはunformatのままにします。

再起動してbootできたら準備をします。

zfsの用意

$ sudo apt update
$ sudo apt install zfsutils-linux

zpool作成

ここからはrootになって作業します。/home/ を消したり、あとでzfs sendで送ったりするので、ssh keyをgithubから落としてきて、sshでログインして作業します。

# /bin/rm -rf /home   # /homeを消す
# zpool create home /dev/sda3

さらにオプションを付けます。

# zfs set compression=lz4 home # lz4による圧縮はこの新しいPCでは十分に高速だろうため有効化
# zfs set atime=off home # 最終アクセス時刻記録を無効化

これで以下のようになります。

root@ubuntu:~# zpool list
NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
home   124G   110K   124G        -         -     0%     0%  1.00x    ONLINE  -

root@ubuntu:~# zfs list
NAME   USED  AVAIL     REFER  MOUNTPOINT
home    96K   120G       24K  /home

送信側の準備

これで受け入れ側は完了で、次は送信側に移ります。

snapshotを取る

$ sudo zfs snapshot home@2021-06-20T18:18:24

過去にいくつかsnapshotを取っているのでこうなりました。

% sudo zfs list -t snapshot
NAME                       USED  AVAIL     REFER  MOUNTPOINT
home@2021-05-18T18:58:56  48.7M      -     76.7G  -
home@2021-05-19T12:33:49  32.7M      -     77.8G  -
home@2021-06-07T11:48:59   433M      -     77.8G  -
home@2021-06-20T18:18:24  1.65M      -     77.7G  -

send / recv

取り終わったら最新のsnapshotをそのまま送ります。

% sudo zfs send home@2021-06-20T18:18:24 | ssh root@192.168.1.46 zfs recv -v -F home
receiving full stream of home@2021-06-20T18:18:24 into home@2021-06-20T18:18:24

received 80.9G stream in 5673 seconds (14.6M/sec)

終わった。WiFi遅い。mountします。

# zfs mount home
# ls -la /home/shirou/ | wc -l
211

これでhomeの転送が終わりました。rootはログアウトしてshirouで入り直して確認します。

今の環境は、ほとんどのものが $HOME/bin だったり $HOME/.local だったりに入れてるので、 /home/ だけ移せばだいたいのことできるようになってますので便利です。

おまけ: Ubuntu Desktopの場合

Ubuntu desktop 20.04では、GUIでインストールでき、その中に "ZFS Boot" という実験的な機能を有効にするというチェックがあります。これにチェックを入れてインストールすると、zfsは以下のように構成されます。

% sudo zfs list
NAME                                               USED  AVAIL     REFER  MOUNTPOINT
bpool                                              184M  1.57G       96K  /boot
bpool/BOOT                                         183M  1.57G       96K  none
bpool/BOOT/ubuntu_dy0tro                           183M  1.57G      183M  /boot
rpool                                             3.97G   232G       96K  /
rpool/ROOT                                        3.93G   232G       96K  none
rpool/ROOT/ubuntu_dy0tro                          3.93G   232G     2.91G  /
rpool/ROOT/ubuntu_dy0tro/srv                        96K   232G       96K  /srv
rpool/ROOT/ubuntu_dy0tro/usr                       224K   232G       96K  /usr
rpool/ROOT/ubuntu_dy0tro/usr/local                 128K   232G      128K  /usr/local
rpool/ROOT/ubuntu_dy0tro/var                      1011M   232G       96K  /var
rpool/ROOT/ubuntu_dy0tro/var/games                  96K   232G       96K  /var/games
rpool/ROOT/ubuntu_dy0tro/var/lib                  1006M   232G      891M  /var/lib
rpool/ROOT/ubuntu_dy0tro/var/lib/AccountsService   164K   232G      100K  /var/lib/AccountsService
rpool/ROOT/ubuntu_dy0tro/var/lib/NetworkManager    212K   232G      124K  /var/lib/NetworkManager
rpool/ROOT/ubuntu_dy0tro/var/lib/apt              80.3M   232G     80.2M  /var/lib/apt
rpool/ROOT/ubuntu_dy0tro/var/lib/dpkg             32.7M   232G     30.9M  /var/lib/dpkg
rpool/ROOT/ubuntu_dy0tro/var/log                  3.98M   232G     2.88M  /var/log
rpool/ROOT/ubuntu_dy0tro/var/mail                   96K   232G       96K  /var/mail
rpool/ROOT/ubuntu_dy0tro/var/snap                  604K   232G      540K  /var/snap
rpool/ROOT/ubuntu_dy0tro/var/spool                 184K   232G      112K  /var/spool
rpool/ROOT/ubuntu_dy0tro/var/www                    96K   232G       96K  /var/www
rpool/USERDATA                                    34.7M   232G       96K  /
rpool/USERDATA/root_zqykns                         192K   232G      112K  /root
rpool/USERDATA/shirou_zqykns                      34.4M   232G     30.6M  /home/shirou

% sudo zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
bpool  1.88G   184M  1.70G        -         -     0%     9%  1.00x    ONLINE  -
rpool   244G  3.97G   240G        -         -     0%     1%  1.00x    ONLINE  -

bpool/BOOT, rpool/ROOT, rpool/USERDATAと別れていますが、ここで注目なのは、 /home/shirou という単位でrpoolが分けられている、ということです。
最初これに気が付かずにzfs send/recvして、 /home/shirou/shirou というのができてしまい、悲しい思いをしました。
結局そもそもDesktop要らないじゃん、ということに気がついたのですが、賢明なる読者の人は、/home ではなく個々のユーザーごとにzfs poolを分けましょうね。

Discussion