#動機
freebsd-updateを使ってバイナリアップグレードを続けていると、次第にシステムが対応するZFS featureが増えていき、既存のZFS poolが対応していないものが出てくる。これは簡単にアップグレードできるのだが、どうも巷の情報には穴がありそうなので自力でまとめておく。
#確認
システムでサポートされているがZFS poolで有効化されていないfeatureは、zpool upgrade
で確認できる。1
>zpool upgrade
This system supports ZFS pool feature flags.
All pools are formatted using feature flags.
Some supported features are not enabled on the following pools. Once a
feature is enabled the pool may become incompatible with software
that does not support the feature. See zpool-features(7) for details.
POOL FEATURE
---------------
zroot
large_blocks
sha512
skein
device_removal
obsolete_counts
zpool_checkpoint
spacemap_v2
#有効化
無効のままのfeatureを有効化するのは簡単で、zpool upgrade <ZFS pool>
とすれば良い。プール名の代わりに-a
を指定すれば全てのプールがアップグレードされる。
>sudo zpool upgrade -a
This system supports ZFS pool feature flags.
Enabled the following features on 'zroot':
large_blocks
sha512
skein
device_removal
obsolete_counts
zpool_checkpoint
spacemap_v2
If you boot from pool 'zroot', don't forget to update boot code.
Assuming you use GPT partitioning and da0 is your boot disk
the following command will do it:
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
ここで末尾に「このプールから起動する場合はブートコードの更新を忘れないように」という注意書きが出ている。システムは更新されていてもディスク上のブートコードは古いままなので、新しいfeatureが使用された場合にそれを解釈できずに起動に失敗する可能性がある。
ただし表示されているコマンドをそのまま実行するのはかえって危険。この実行例の場合、da0p1を問答無用で書き換えてしまうので、本当にそれでいいのか確認する必要がある。ディスクのパーティションレイアウト次第では起動不能になる。
#ブートコード更新
レガシーBIOS経由で起動するGPTディスクの場合、ブートコードはfreebsd-boot (ada0p1)に存在し、実行例のda0をada0に変えればそのまま利用可能。2
>gpart show ada0
=> 34 1953525101 ada0 GPT (932G)
34 6 - free - (3.0K)
40 1024 1 freebsd-boot (512K)
1064 4194304 2 freebsd-swap (2.0G)
4195368 1949329760 3 freebsd-zfs (930G)
1953525128 7 - free - (3.5K)
>sudo gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
partcode written to ada0p1
bootcode written to ada0
UEFI+BIOS両用のGPTディスクの場合、freebsd-bootはada0p2になっている。もし実行例のとおり-i 1
のままだと、EFIパーティションが破壊されてUEFIからブートできなくなる。またfreebsd-bootはレガシーBIOS経由のとき使われるブートコードなので、UEFIからブートする場合に使われるEFIパーティションも更新しなければいけない。現状でレガシーBIOS経由で起動していると気付かないまま放置してしまい、あとでUEFI経由で起動しようとしてハマる可能性がある。
>gpart show
=> 40 3907029088 ada0 GPT (1.8T)
40 409600 1 efi (200M)
409640 1024 2 freebsd-boot (512K)
410664 984 - free - (492K)
411648 4194304 3 freebsd-swap (2.0G)
4605952 3902423040 4 freebsd-zfs (1.8T)
3907028992 136 - free - (68K)
>sudo gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 2 ada0
partcode written to ada0p2
bootcode written to ada0
>sudo mount -t msdosfs /dev/ada0p1 /mnt
>sudo cp -p /boot/loader.efi /mnt/EFI/BOOT/BOOTX64.efi
>sudo umount /mnt
#関連情報
*FreeBSDのブートプロセス