Proxmox VEのZFS Rootをバックアップしgummibootからブートする

#はじめに
Proxmox VEはZFSにインストールできますが、システムをバックアップしようとするとZFSストレージプール(zpool)の名前が衝突してしまいます。GRUBをもう一つインストールすればいいはずですが、この際gummibootというUEFI用のシンプルなブートローダーを使ってみます。

#gummibootのセットアップ
新しいUSBメモリーを一つ用意してそこにセットアップしていきます。
##EFI System partitionパーティションを作成
```
dev='/dev/<sdX>' &&
sgdisk -Z $dev && #既存のGPTとMBRを消去
sgdisk -o $dev && #GPT（パーティションテーブル）を作成
sgdisk -n 1::+512M -t 1:ef00 $dev && #第1パーティションにEFI System partitionを作成
sgdisk -p $dev && #GPTを確認
sgdisk -i 1 $dev #第1パーティションを確認
```

##パーティションをフォーマット
```
dev='/dev/<sdX>' &&
mkfs.vfat -F32 "${dev}1"
```

##gummibootのインストール
```
apt-get install gummiboot
```

##ブートローダーを作成
```
dev='/dev/<sdX>' &&
esp='/mnt/boot' &&
mkdir $esp &&
mount "${dev}1" $esp &&
gummiboot install --path $esp &&
cp '/boot/initrd.img-4.4.6-1-pve' "$esp/initrd.img-4.4.6-1-pve" &&
cp '/boot/vmlinuz-4.4.6-1-pve' "$esp/vmlinuz-4.4.6-1-pve"
```

##ブートローダーを設定
###$esp/loader/loader.confを作成
```
default pve
timeout 5
editor 0
```

###$esp/loader/entries/pve.confを作成
```
title          Proxmox Virtual Environment
linux          /vmlinuz-4.4.6-1-pve
initrd         /initrd.img-4.4.6-1-pve
options        root=ZFS=rpool/ROOT/pve-1 rw boot=zfs quiet rootdelay=2
```

##マウントを恒久化
```
vi /etc/fstab

下記の行を追加
PARTUUID=<partuuid> $esp vfat defaults,noatime,nofail 0 2
```

##確認
これで既存のProxmox VEをgummibootからブートすることができるはずです。Proxmox VEではZFS RootのブートはBIOSブートしか対応していませんが、gummibootによってUEFIブートができるようになります。

#ZFS Rootをバックアップ
さきほどのUSBメモリーにバックアップしていきます。

##ZFS用のパーティションを作成
```
dev='/dev/<sdX>' &&
sgdisk -n 2:: -t 2:bf01 -c 2:'zfs' $dev && #第2パーティションにSolaris /usr & Mac ZFSを作成
```
この後、再起動が必要になるかもしれません。

##ZFSストレージプールを作成
```
zpoolname1='rpool' &&
zpoolname2='rpool2' &&
partuuid='<partuuid>' &&
zpool create -o ashift=12 $zpoolname2 "/dev/disk/by-partuuid/$partuuid" &&
zfs set compression=lz4 $zpoolname2 &&
zfs set atime=off $zpoolname2 &&
zfs set sync=standard $zpoolname2
```

##ZFSを作成
```
zpoolname2='rpool2' &&
zfs create $zpoolname2/ROOT &&
zfs create -V 1G -b 4K -o primarycache=metadata -o sync=always -o com.sun:auto-snapshot=false $zpoolname2/swap &&
```
スワップは通常2GBのところ1GBにしてありますが、お好みで変更してください。

##ZFSをコピー
```
zpoolname1='rpool' &&
zpoolname2='rpool2' &&
zfs snapshot $zpoolname1/ROOT/pve-1@temp &&
zfs send     $zpoolname1/ROOT/pve-1@temp | zfs recv $zpoolname2/ROOT/pve-1 &&
zfs destroy  $zpoolname1/ROOT/pve-1@temp &&
zfs destroy  $zpoolname2/ROOT/pve-1@temp
```

##ZFSのマウントポイントを設定
```
zpoolname2='rpool2' &&
zpool export $zpoolname2 &&
zpool import -d /dev/disk/by-partuuid -R /mnt/$zpoolname2 $zpoolname2 &&
zfs set mountpoint=/ $zpoolname2/ROOT/pve-1 &&
zfs set mountpoint=/$zpoolname2 $zpoolname2
```

##スワップをフォーマット
```
zpoolname2='rpool2' &&
mkswap /dev/zvol/$zpoolname2/swap
```

##スワップのプール名を修正
```
vi /mnt/$zpoolname2/etc/fstab

下記の行を$zpoolname1から$zpoolname2に修正する
/dev/zvol/$zpoolname2/swap none swap sw 0 0
```

###$esp/loader/entries/pve2.confを作成
```
title          Proxmox Virtual Environment 2
linux          /vmlinuz-4.4.6-1-pve
initrd         /initrd.img-4.4.6-1-pve
options        root=ZFS=$zpoolname2/ROOT/pve-1 rw boot=zfs quiet rootdelay=2
```
再起動後、ブート時にProxmox Virtual Environment 2を選べばバックアップした方からブートするはずです。

#後始末
この後、gummibootをアンインストールして、/etc/initramfs/post-update.d//zz-update-gummibootを手動で削除しないとカーネルのアップデートに支障を来すかもしれません。