2017/04/23

Re: ZFSルートなFreeBSDゲストのzpoolのディスクを拡張する

KVM 上の FreeBSD ゲストで pkg upgrade コマンド実行時に zfs ファイルシステムに十分な空き領域がないとの警告が出て、あわてて以前調べた手順でディスクを拡張した時のメモです。

環境

環境は、以前から使用している Debian/GNU Linux の KVM ゲストとして ZFS をルートファイルシステムとした FreeBSD 11.0 です。

この時から少し構成が変わりましたが、まだディスクフルにはなっていないので淡々と拡張した記録です。
  • KVM ゲストのディスクデバイスは qemu ファイルではなく LVM
  • FreeBSD のバージョンは 10.0 から 11.0 にアップグレード

パッケージアップグレード時の警告

pkg upgrade を実行するとパッケージのダウンロードに必要な空き領域が不足しているとの警告が出ました。

# pkg upgrade
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
Checking for upgrades (203 candidates): 100%
Processing candidates (203 candidates): 100%
The following 39 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        rhash: 1.3.4

Installed packages to be UPGRADED:
        vim: 8.0.0550 -> 8.0.0566
        readline: 6.3.8 -> 6.3.8_1
        llvm40: 4.0.0_2 -> 4.0.0_4
        libdrm: 2.4.78,1 -> 2.4.80,1
        graphite2: 1.3.9 -> 1.3.9_1
        go: 1.8_1,1 -> 1.8.1_1,1
        dbus: 1.10.16 -> 1.10.16_1
        curl: 7.53.1_1 -> 7.54.0
        cmake-modules: 3.7.2 -> 3.8.0
        cmake: 3.7.2 -> 3.8.0

Installed packages to be REINSTALLED:
        tcl86-8.6.6_2
        ruby-2.3.3_2,1
        python27-2.7.13_2
        perl5-5.24.1_1
        pango-1.40.4
        lzo2-2.10_1
        libxml2-2.9.4
        libxcb-1.12_2
        libuv-1.11.0
        libpciaccess-0.13.5
        libnghttp2-1.21.1
        liblz4-1.7.5,1
        libffi-3.2.1
        libedit-3.1.20170329_2,1
        libarchive-3.3.1,1
        libXt-1.1.5,1
        libXdmcp-1.1.2
        libXau-1.0.8_3
        libX11-1.6.5,1
        libSM-1.2.2_3,1
        libICE-1.0.9_1,1
        jsoncpp-1.8.0_2
        gtk2-2.24.31
        glib-2.50.2,1
        gettext-runtime-0.19.8.1_1
        gdk-pixbuf2-2.32.3_1
        expat-2.2.0_1
        atk-2.24.0

Number of packages to be installed: 1
Number of packages to be upgraded: 10
Number of packages to be reinstalled: 28

The process will require 1 MiB more space.
371 MiB to be downloaded.

Proceed with this action? [y/N]: y
pkg: Not enough space in /var/cache/pkg, needed 371 MiB available 311 MiB
df と zpool list で表示される空きが倍近く違うものだなと思いました。
# df -hl
Filesystem                             Size    Used   Avail Capacity  Mounted on
rpool/ROOT/freebsd-11.0p9              1.0G    747M    311M    71%    /
devfs                                  1.0K    1.0K      0B   100%    /dev
rpool/ROOT/freebsd-11.0p9/tmp          314M    2.3M    311M     1%    /tmp
rpool/ROOT/freebsd-11.0p9/usr          5.1G    4.8G    311M    94%    /usr
rpool/ROOT/freebsd-11.0p9/usr/local    3.1G    2.8G    311M    90%    /usr/local
rpool/ROOT/freebsd-11.0p9/var          4.5G    4.2G    311M    93%    /var
# zpool list rpool
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
rpool  39.8G  38.2G  1.54G         -    76%    96%  1.00x  ONLINE  -

VMディスクのサイズ拡張

現在の VM ディスクは qcow2 のイメージファイルではなく LVM シンボリュームに変更していますので、ボリュームグループやシンプールに空きがあれば拡張は容易です。

# lvs vg/freebsd
  LV      VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  freebsd vg   Vwi-a-tz-- 40.00g kvm         99.39

# vgs vg
  VG   #PV #LV #SN Attr   VSize   VFree
  vg     1  23   0 wz--n- 372.61g 92.41g

# lvs vg/kvm
  LV                 VG   Attr       LSize   Pool Origin             Data%  Meta%  Move Log Cpy%Sync Convert
  kvm                vg   twi-a-tz-- 150.00g                         89.60  67.05
lvextend コマンドで 10GB 増やします。
# lvextend -L+10G vg/freebsd
  Size of logical volume vg/freebsd changed from 40.00 GiB (10240 extents) to 50.00 GiB (12800 extents).
  Logical volume freebsd successfully resized
シンボリュームなのでまだこの時点ではシンプールの使用量は変わっていません。
# lvs vg/freebsd
  LV      VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  freebsd vg   Vwi-a-tz-- 50.00g kvm         79.52

# lvs vg/kvm
  LV                 VG   Attr       LSize   Pool Origin             Data%  Meta%  Move Log Cpy%Sync Convert  
  kvm                vg   twi-a-tz-- 150.00g                         89.60  67.05

GPTパーティションの拡張

ここからは FreeBSD ゲストでの作業。ディスク末尾にあるセカンダリ GPT パーティションテーブルが不明という警告が出ますので gpart recover コマンドで修復します。

# gpart show
=>      34  83886013  vtbd0  GPT  (50G) [CORRUPT]
        34      1024      1  freebsd-boot  (512K)
      1058    261242      2  freebsd-swap  (128M)
    262300  83623747      3  freebsd-zfs  (40G)
# gpart list
Geom name: vtbd0
modified: false
state: CORRUPT
fwheads: 16
fwsectors: 63
last: 83886046
first: 34
entries: 128
scheme: GPT
Providers:
1. Name: vtbd0p1
   Mediasize: 524288 (512K)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 17408
   Mode: r0w0e0
   rawuuid: 6e179c08-22c2-11e7-9bcc-9d1d2957ab95
   rawtype: 83bd6b9d-7f41-11dc-be0b-001560b84f0f
   label: boot0
   length: 524288
   offset: 17408
   type: freebsd-boot
   index: 1
   end: 1057
   start: 34
2. Name: vtbd0p2
   Mediasize: 133755904 (128M)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 541696
   Mode: r1w1e1
   rawuuid: 81821f9a-22c2-11e7-9bcc-9d1d2957ab95
   rawtype: 516e7cb5-6ecf-11d6-8ff8-00022d09712b
   label: swap0
   length: 133755904
   offset: 541696
   type: freebsd-swap
   index: 2
   end: 262299
   start: 1058
3. Name: vtbd0p3
   Mediasize: 42815358464 (40G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 134297600
   Mode: r1w1e2
   rawuuid: b4378490-54d4-11e2-8e58-525400c151da
   rawtype: 516e7cba-6ecf-11d6-8ff8-00022d09712b
   label: disk0
   length: 42815358464
   offset: 134297600
   type: freebsd-zfs
   index: 3
   end: 83886046
   start: 262300
Consumers:
1. Name: vtbd0
   Mediasize: 53687091200 (50G)
   Sectorsize: 512
   Mode: r2w2e5
# dmesg | grep GEOM
GEOM: vtbd0: the secondary GPT header is not in the last LBA.
GEOM: vtbd1: the primary GPT table is corrupt or invalid.
GEOM: vtbd1: using the secondary instead -- recovery strongly advised.
GEOM: vtbd2: the primary GPT table is corrupt or invalid.
GEOM: vtbd2: using the secondary instead -- recovery strongly advised.
GEOM: vtbd3: the primary GPT table is corrupt or invalid.
GEOM: vtbd3: using the secondary instead -- recovery strongly advised.
# gpart recover vtbd0
vtbd0 recovered
GPT パーティションテーブルを復旧すると拡張した領域が認識されますので、パーティションを拡張します。
# gpart show vtbd0
=>       34  104857526  vtbd0  GPT  (50G)
         34       1024      1  freebsd-boot  (512K)
       1058     261242      2  freebsd-swap  (128M)
     262300   83623747      3  freebsd-zfs  (40G)
   83886047   20971513         - free -  (10G)
# gpart resize -i 3 vtbd0
vtbd0p3 resized
# gpart show vtbd0
=>       34  104857526  vtbd0  GPT  (50G)
         34       1024      1  freebsd-boot  (512K)
       1058     261242      2  freebsd-swap  (128M)
     262300  104595260      3  freebsd-zfs  (50G)
# gpart list vtbd0
Geom name: vtbd0
modified: false
state: OK
fwheads: 16
fwsectors: 63
last: 104857559
first: 34
entries: 128
scheme: GPT
Providers:
1. Name: vtbd0p1
   Mediasize: 524288 (512K)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 17408
   Mode: r0w0e0
   rawuuid: 6e179c08-22c2-11e7-9bcc-9d1d2957ab95
   rawtype: 83bd6b9d-7f41-11dc-be0b-001560b84f0f
   label: boot0
   length: 524288
   offset: 17408
   type: freebsd-boot
   index: 1
   end: 1057
   start: 34
2. Name: vtbd0p2
   Mediasize: 133755904 (128M)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 541696
   Mode: r1w1e1
   rawuuid: 81821f9a-22c2-11e7-9bcc-9d1d2957ab95
   rawtype: 516e7cb5-6ecf-11d6-8ff8-00022d09712b
   label: swap0
   length: 133755904
   offset: 541696
   type: freebsd-swap
   index: 2
   end: 262299
   start: 1058
3. Name: vtbd0p3
   Mediasize: 53552773120 (50G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 134297600
   Mode: r1w1e2
   rawuuid: b4378490-54d4-11e2-8e58-525400c151da
   rawtype: 516e7cba-6ecf-11d6-8ff8-00022d09712b
   label: disk0
   length: 53552773120
   offset: 134297600
   type: freebsd-zfs
   index: 3
   end: 104857559
   start: 262300
Consumers:
1. Name: vtbd0
   Mediasize: 53687091200 (50G)
   Sectorsize: 512
   Mode: r2w2e5

zpoolの拡張

ディスクの拡張が完了したのでストレージプールを拡張します。

# zpool list rpool
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
rpool  39.8G  38.3G  1.47G         -    76%    96%  1.00x  ONLINE  -
# zpool get autoexpand rpool
NAME   PROPERTY    VALUE   SOURCE
rpool  autoexpand  on      local
# zpool online -e rpool gpt/disk0
CAPACITY が 76% まで下がりましたので pkg upgrade できるようになりました。
# zpool list rpool
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
rpool  49.8G  38.3G  11.5G         -    60%    76%  1.00x  ONLINE  -

おわりに

最近 NAS が不調なのでバックアップ先に ZFS を使ってみようかと久しぶりに FreeBSD を起動して各種アップデートしていたときの領域不足。もともとコマンド練習がてらの VM ということで最小サイズしか割り当てていませんでしたので、ZFS の領域監視には munin-contrib にあるモジュールを利用してみようと思います。

# pkg install munin-node munin-contrib

# ln -sv /usr/local/share/examples/munin-contrib/plugins/zfs/zfs-filesystem-graph /usr/local/etc/munin/plugins/zfs_fs_rpool_ROOT
# curl telnet://localhost:4949

# munin node at freebsd.vm.myhome
fetch zfs_fs_rpool_ROOT
usedbydataset.value 31744
usedbysnapshots.value 0
usedbychildren.value 43523726336
usedbyrefreservation.value 0
available.value 8110702080
total.value 51634460160
quota.value 0
.

0 件のコメント:

コメントを投稿