Ubuntu server 20.04でZFSのhomeをsend/recvで引っ越した話
/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