2023年10月9日月曜日

FreeBSD で zfs ファイルシステムに M.2 NVMe SSD を追加した

 2023年9月に FreeBSD で使用している「zfs」に M.2 NVMe 接続の SSD を追加した。 その件についてメモを兼ねて書いておこう。

 1個前の投稿で,zfs ファイルシステムのアップグレードの話を書いた。 zfs ファイルシステムのアップグレードは,実は今回の M.2 NVMe 接続の SSD を追加の際に必要になったので行ったのだった。 一部重複する内容もあるが,あまり気にしないでおこう。

 SSD の追加が必要になった理由は,使用している 2.5 inch の SSD の容量が心もとなくなってきたから,である。 Note PC をサーバーとして使い,そのストレージに 1TB の 2.5 inch SSD を使っているが,写真やらを大量に置いていると徐々に SSD の容量を圧迫してきた。 実質 920GB ほどの領域で,空きが 180GB 程度になっていた。これはちょっと心もとない。ということで,ストレージを増やすことにした。

 今使ってる Note PC には空いている NVMe のスロットがあるので,新たに NVMe の SSD を追加することにした。 そうすると 2.5 inch SSD は特に何もしなくていい。特に「zfs」を使ってるので拡張も簡単やし…。 そこで 1TB の M.2 NVMe SSD を買って追加することにしたのだった。

M.2 NVMe 接続の SSD の追加

 具体的な(物理的な)M.2 NVMe 接続の SSD の追加についてはここでは書かないでおこう。 写真とか撮ってないし…。 NVMe SSD は思ったよりも小さい印象がある。2.5 inch SSD よりも小さい(細長く薄っぺらい)印象がある。

zfs について

 zfs に関しては前回の投稿を見てほしいが, 複数のデバイス(複数の HDD や複数の SSD など)をストレージに使う際に,見た目は全体として1個のファイルシステムとして(全体を1個のプール (pool)として)扱えるところが便利である。 言い換えると「プール」という大きな HDD が1個あるような感じであり,その中に物理的なデバイスを追加して,複数の(1個でもいいが)HDD や SSD で1個のプールを構成している。 今回も M.2 NVMe SSD を追加して,それを既存のプールに追加するだけだった。

 まずは現時点での状況の確認。 プールのリストを調べるために「zpool list」を使うと,
# zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
zroot   920G   741G   179G        -         -    50%    80%  1.00x    ONLINE  -
ここで「zroot」というのがプールの名前。 使用できる容量が 920GB に対して,741GB を使用して,結果として 179GB の空きスペースしかない。 容量の 80% を使っている。さすがにこれはちょっと厳しい。

 次に zroot プールの状況を「zpool status」コマンドで把握した。
# zpool status zroot
  pool: zroot
   state: ONLINE
   config:

        NAME        STATE     READ WRITE CKSUM
        zroot       ONLINE       0     0     0
          ada0p4    ONLINE       0     0     0

errors: No known data errors
問題はない(というか,ここで zfs のアップグレードが必要だったので前回の投稿を書いたんだけどね)。

M.2 NVMe をプールに追加する

 どんな物理デバイスが接続されているかを「geom disk list」コマンドで見てみると…,
# geom disk list
Geom name: nvd0
Providers:
1. Name: nvd0
   Mediasize: 1000204886016 (932G)
   Sectorsize: 512
   Mode: r0w0e0
   descr: CT1000P1SSD8
   lunid: ......(よくわからないけど,念のため隠しておいた)
   ident: ......(よくわからないけど,念のため隠しておいた)
   rotationrate: 0
   fwsectors: 0
   fwheads: 0

Geom name: ada0
Providers:
1. Name: ada0
   Mediasize: 1000204886016 (932G)
   Sectorsize: 512
   Mode: r2w2e3
   descr: Samsung SSD 860 EVO 1TB
   lunid: ......(よくわからないけど,念のため隠しておいた)
   ident: ......(よくわからないけど,念のため隠しておいた)
   rotationrate: 0
   fwsectors: 63
   fwheads: 16
となった。 ここで「nvd0」が NVMe に接続された1個目の(0番の)デバイスを意味し,「ada0」はシリアル ATA(SATA)に接続されている0番のデバイスを示している。 ちなみに USB 接続すると「da0」のようになる。ちゃんと NVMe SSD も認識されている。

 各デバイスには適度にパーティションを切らないといけない。 NVMe SSD はまだ何もないので,まずはパーティションを切ろう(作ろう)。 今回 NVMe SSD は1個の大きな zfs パーティションのみとしてみた。
# gpart delete -i 1 nvd0
# gpart delete -i 2 nvd0
# gpart add -t freebsd-zfs nvd0
実はこの「nvd0」と認識されているデバイス(SSD)は他で一度使ったものなので,2個のパーティションが存在していた。 そこで,まずその2個のパーティションを「削除」している。 その後,「zfs パーティション」を「追加」した。 「gpart show nvd0」コマンドで結果を見ると,
# gpart show nvd0
=>        34  1953525101  nvd0  GPT  (932G)
          34  1953525101     1  freebsd-zfs  (932G)
となった。ちゃんとパーティションが作られている。

 ここで,「nvd0」(NVMe 接続の SSD) に boot 領域(freebsd-boot や efi 領域)を追加してはいけない。 最初からつけてある「ada0」(SATA 接続の 2.5 inch SSD)というデバイスに boot 領域(パーティション)があるので,そことけんかするみたいで,起動時にうまく起動しない時があった。 注意が必要。

 次に「nvd0」のパーティション 1 にファイルシステムを構築する。特にファイルシステムの種類を指定はしていないが,パーティションを作る時に zfs を指定してるのでこれでいいみたい。
# newfs -U /dev/nvd0p1
/dev/nvd0p1: 953869.7MB (1953525096 sectors) block size 32768, fragment size 4096
        using 1526 cylinder groups of 625.22MB, 20007 blks, 80128 inodes.
        with soft updates
super-block backups (for fsck_ffs -b #) at:
 192, 1280640, 2561088, 3841536, 5121984, 6402432, 7682880, 8963328, 10243776, 11524224, 12804672, 14085120, 15365568, 16646016, 17926464, 19206912, 20487360, 21767808, 23048256, 24328704, 25609152, 26889600, 28170048, 29450496, 30730944,
........
この数字はかなりたくさん出てくる。ここでは省略したけど…。

 あとはこれを「zroot」という名前のプールに追加するだけである。 まずは以下で(「-n」オプションをつけて)ドライランさせて,エラーが起きないかを確認しておく。 ドライランは,ほぼ同じ動作をするけど,最後の書き込みをしないんだっけ?
# zpool add -n zroot nvd0p1

 エラーがなければ実際に「nvd0p1」パーティションを「zroot」プールに追加しよう。
# zpool add zroot nvd0p1
結果は「zpool list」コマンドと「zpool status zroot」コマンドで見ると,
# zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
zroot  1.80T   741G  1.08T        -         -    24%    40%  1.00x    ONLINE  -

# zpool status zroot
  pool: zroot
 state: ONLINE
config:
        NAME        STATE     READ WRITE CKSUM
        zroot       ONLINE       0     0     0
          ada0p4    ONLINE       0     0     0
          nvd0p1    ONLINE       0     0     0
となり,ちゃんと「zroot」プールに「nvd0」のパーティション 1 が追加され,プール全体のサイズも大きくなっている。

結果の確認

 最終的なパーティションの構成は「gpart show」コマンドで見ると,
# gpart show
=>        34  1953525101  nvd0  GPT  (932G)
          34  1953525101     1  freebsd-zfs  (932G)

=>        40  1953525088  ada0  GPT  (932G)
          40      409600     1  efi  (200M)
      409640        1024     2  freebsd-boot  (512K)
      410664         984        - free -  (492K)
      411648    20971520     3  freebsd-swap  (10G)
    21383168  1932140544     4  freebsd-zfs  (921G)
  1953523712        1416        - free -  (708K)
となっている。

 より具体的なプールの内容については「zfs list」というコマンドを使う。 以下は M.2 NVMe SSD (1TB) を追加した後の結果である。
# zfs list
NAME                                           USED  AVAIL     REFER  MOUNTPOINT
zroot                                          741G  1.02T       88K  /zroot
zroot/ROOT                                    60.5G  1.02T       88K  none
zroot/ROOT/default                            60.5G  1.02T     15.4G  /
zroot/ezjail                                   604G  1.02T      136K  /usr/jails
zroot/ezjail/basejail                         2.72G  1.02T     1.93G  /usr/jails/basejail
zroot/ezjail/jail                              601G  1.02T      601G  /usr/jails/jail
zroot/ezjail/newjail                          28.5M  1.02T     26.4M  /usr/jails/newjail
zroot/tmp                                      672K  1.02T      672K  /tmp
zroot/usr                                     76.2G  1.02T       88K  /usr
zroot/usr/home                                55.3G  1.02T     55.3G  /usr/home
zroot/usr/ports                               19.5G  1.02T     19.5G  /usr/ports
zroot/usr/src                                 1.43G  1.02T     1.43G  /usr/src
zroot/var                                      580M  1.02T       88K  /var
zroot/var/audit                                 88K  1.02T       88K  /var/audit
zroot/var/crash                                 88K  1.02T       88K  /var/crash
zroot/var/log                                 3.65M  1.02T     3.65M  /var/log
zroot/var/mail                                 575M  1.02T      575M  /var/mail
zroot/var/tmp                                  132K  1.02T      132K  /var/tmp
ここで「zroot」プールの中に沢山のスライスがあるが,それらはシステムが勝手に作ってるみたい(私は何もしていない)。 これを見ると,web site を入れている jail システムの newjail が 600GB も使っている…。写真とか動画を載せすぎやなぁ…。

ちなみに「df」コマンドでは以下のように見える。
# df -h
Filesystem               Size    Used   Avail Capacity  Mounted on
zroot/ROOT/default       1.0T     15G    1.0T     1%    /
devfs                    1.0K    1.0K      0B   100%    /dev
/dev/da0p2               1.8T    729G    931G    44%    /San2TBSSD
zroot/tmp                1.0T    672K    1.0T     0%    /tmp
zroot/usr/home           1.1T     55G    1.0T     5%    /usr/home
zroot                    1.0T     88K    1.0T     0%    /zroot
zroot/var/log            1.0T    3.7M    1.0T     0%    /var/log
zroot/ezjail             1.0T    136K    1.0T     0%    /usr/jails
zroot/usr/src            1.0T    1.4G    1.0T     0%    /usr/src
zroot/var/crash          1.0T     88K    1.0T     0%    /var/crash
zroot/var/mail           1.0T    576M    1.0T     0%    /var/mail
zroot/usr/ports          1.0T     19G    1.0T     2%    /usr/ports
zroot/var/audit          1.0T     88K    1.0T     0%    /var/audit
zroot/var/tmp            1.0T    132K    1.0T     0%    /var/tmp
zroot/ezjail/jippo       1.6T    601G    1.0T    36%    /usr/jails/jippo
zroot/ezjail/basejail    1.0T    1.9G    1.0T     0%    /usr/jails/basejail
zroot/ezjail/newjail     1.0T     26M    1.0T     0%    /usr/jails/newjail
/usr/jails/basejail      1.0T    1.9G    1.0T     0%    /usr/jails/jippo/basejail
devfs                    1.0K    1.0K      0B   100%    /usr/jails/jippo/dev
fdescfs                  1.0K    1.0K      0B   100%    /usr/jails/jippo/dev/fd
procfs                   4.0K    4.0K      0B   100%    /usr/jails/jippo/proc

 これで無事にサーバーのストレージの容量を増やすことができた。

0 件のコメント: