LoginSignup
3
3

More than 3 years have passed since last update.

ZFS poolのアップグレード

Last updated at Posted at 2020-12-28

動機

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のブートプロセス


  1. 具体的なfeatureの情報はないけれど、zpool status実行時にもメッセージがでる。 

  2. /boot/pmbrはZFS featureとは関係ないが、トラブル防止のため/boot/gptzfsbootとセットで更新しておいた方が良い。 

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3