ZFS

1.はじめに

FreeBSD6まではUFSだったが、FreeBSD10にはフォーマットがZFSになっていた。
これまでのUFSよりも使いやすいのだが、イマイチ理解できない自分がここに居る。
記録簿として分かる範囲で書いてみる。

2.UFSからZFSに変更する

実際に実行したときのメモのままなので、これでうまく行くかは?ですが・・・
ada0を消す
# dd if=/dev/zero of=/dev/ada0 count=64
パーティーションを消しておく
# gpart destroy -F ada0
ada0をGPTにする
# gpart create -s gpt ada0
ada0に3つのパーテーションを作成
# gpart add -t freebsd-boot -s 512k ada0
ada0p1 added
# gpart add -t freebsd-swap -s 2g ada0
ada0p2 added
# gpart add -t freebsd-zfs ada0
ada0p3 added
ada0にブートを書く
# gpart bootcode -b /boot/pmbr ada0
# gpart bootcode -p /boot/gptzfsboot -i 1 ada0
zfs領域作成
# zpool create -o altroot=/mnt zpool0 ada0p3
zfsパーティション作成
# zfs create -o quota=2g -o mountpoint=/ zpool0/ROOT
# zfs create -o quota=4g -o mountpoint=/var zpool0/var
# zfs create -o quota=1g -o mountpoint=/tmp zpool0/tmp
# zfs create -o mountpoint=/usr zpool0/usr
コピーする。
# rsync -avxHR / /var /usr /tmp /mnt
起動後の /boot/ をどこから探せばよいかを zpool 自身に埋め込んでおく
# zpool set bootfs=zpool0/ROOT zpool0
コピーしたファイルを zfs 環境に適したものに修正する。
# echo zfs_load=YES >> /mnt/boot/loader.conf
# echo zfs_enable=YES >> /mnt/etc/rc.conf
データ保護のためにraid0を組む。
ZFSミラー作成
# zpool attach zpool0 ada0p3 ada1p3
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'zpool0', you may need to update
boot code on newly attached disk 'ada1p3'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
zfsパーティション作成
/boot/loader.confに下記を追記
geom_mirror_load="YES"
kern.geom.label.disk_ident.enable="0"
kern.geom.label.gptid.enable="0"
下2行はミラーの関係ではない。なんだったか分からなくなった。
いや、gmirrorはZFSとは別のミラーだった・・・
う〜ん、この記事はちょっと当てにならない。
結果的に移行したシステムは一度初期化してサラからFreeBSD11.3をZFSミラーでインストールした。


参考にしたページ
FreeBSD10: あとからzfs構成にする
FreeBSDのZFSでミラーリングを作ってみた。が

3.ZFS修復

ZFS障害を確認する。
# zpool status -x
all pools are healthy
上記は問題ない場合。
問題があった場合はエラーのドライブをオフラインにする
# zpool offline zpool0 ada1
ドライブを入れ替えてオンラインにする
# zpool online zpool0 ada1
確認
# zpool status -x
all pools are healthy

4.ZFSのTRIM

SSDの場合TRIMを有効にすると良いとの事。
良く分からないけど設定します。
/etc/sysctl.confに追記
vfs.zfs.trim.enabled

インストールディスクで起動しLiveCDモードでコマンド
# tunefs -t enable /dev/ada0p2
# dumpfs /dev/ada0p2|grep flags
flags soft-updates+journal trim

5.ZFSドライブ追加

USBドライブなど追加した場合、ada0やda0などどこなのかをまず探す。
# dmesg | grep MB
で表示すれば分かると思います。
今回はda0として話を進めます。

ディスクインフォを確認
# diskinfo -t /dev/da0

GPTの状況確認
# gpart show da0
=>        34  3907029101  da0  GPT  (1.8T)
          34        2014       - free -  (1.0M)
        2048  3907025072    1  ms-basic-data  (1.8T)
  3907027120        2015       - free -  (1.0M)
この場合は購入時にwindowsフォーマットで確保されているので、まず削除します。
# sudo gpart delete -i 1 da0
da0p1 deleted
数字の1はshowで確認したときのms-basic-dataの前にある1です。

無くなっているか確認します。
# gpart show da0
=>        34  3907029101  da0  GPT  (1.8T)
          34  3907029101       - free -  (1.8T)

GPTではなくMBRの場合はGPTにします。
# gpart destroy da0
# gpart create -s gpt da0

また最初のshowで下記のようなエラーが出た場合は
# gpart show da0
gpart: No such geom: da0.
# gpart create -s gpt da0
でGPTにします。

次にzfsでスライスします。
# gpart add -t freebsd-zfs da0
da0p1 added

確認します。
# gpart show da0
=>        34  3907029101  da0  GPT  (1.8T)
          34  3907029101    1  freebsd-zfs  (1.8T)
# gpart status
  Name  Status  Components
ada0p1      OK  ada0
ada0p2      OK  ada0
ada0p3      OK  ada0
ada1p1      OK  ada1
ada1p2      OK  ada1
ada1p3      OK  ada1
 da0p1      OK  da0
da0が追加されています。

そしてまずZFSストレージプールを作成します。
# zpool create backup /dev/da0p1

zpoolのリストを確認します。
# zpool list -v
NAME         SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
backup      1.81T  90.5K  1.81T        -         -     0%     0%  1.00x  ONLINE  -
  da0p1     1.81T  90.5K  1.81T        -         -     0%     0%
zroot        472G   265G   207G        -         -    26%    56%  1.00x  ONLINE  -
  mirror     472G   265G   207G        -         -    26%    56%
    ada0p3      -      -      -        -         -      -      -
    ada1p3      -      -      -        -         -      -      -

# zpool status backup
  pool: backup
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        backup      ONLINE       0     0     0
          da0p1     ONLINE       0     0     0

errors: No known data errors
# df backup
Filesystem  1K-blocks Used      Avail Capacity  Mounted on
backup     1885339580   23 1885339557     0%    /backup
backupが作成されています。

このままでは勝手に/backupにマウントされてしまっているので、マウントポイントを変更する場合は
# zfs set mountpoint=/usr/home/backup backup
とこれで/usr/home/backupへマウント位置を変更します。

アンマウントは
# zfs unmount backup
でアンマウントできますが、USBドライブなどで他のマシンへ接続変更することを考えるとエクスポート・インポートが良いようです

まず外します。
# zpool export backup
zpoolの状況確認で外れていることを確認します。
# zpool list -v

USBドライブを外して、別のマシンへ接続しまず確認。
# zpool import
   pool: backup
     id: 7518496875472241768
  state: ONLINE
 action: The pool can be imported using its name or numeric identifier.
 config:

        backup      ONLINE
          da0p1     ONLINE

確認できたところでインポートします。
# zpool import backup
他のマシンで使用していたドライブの場合は
# zpool import -f backup

破棄されたZFSストレージプールの場合は
zrootの中身確認
# zpool import -D
で調べてインポートします。
# zpool import -D backup
で復活できます。

それ以外で使用できるコマンドなど

zpoolの状態表示
$ zpool status zroot
  pool: zroot
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zroot       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0

errors: No known data errors

マウントプロパティ
# zfs get mountpoint

参照した記録をしないためatimeをオフする
まず確認
# zfs get atime
そしてオフにする
# zfs set atime=off datatank

512か4kかを確認
# smartctl -i /dev/ada0
smartctl 7.1 2019-12-30 r5022 [FreeBSD 11.3-RELEASE-p8 amd64] (local build)
Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family: Silicon Motion based SSDs
Device Model: TS512GSSD370S
Serial Number: D092343365
Firmware Version: O0919A
User Capacity: 512,110,190,592 bytes [512 GB]
Sector Size: 512 bytes logical/physical
Rotation Rate: Solid State Device
Device is: In smartctl database [for details use: -P show]
ATA Version is: ACS-2 (minor revision not indicated)
SATA Version is: SATA 3.1, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is: Fri May 15 17:35:11 2020 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

zpoolの削除
# zpool destroy databank

6.ZFSのRAM

カーネルに割り当てられるメモリ
> sysctl -a | grep vm.kmem_size
vm.kmem_size_scale: 1
vm.kmem_size_max: 1319413950874
vm.kmem_size_min: 0
vm.kmem_size: 16540499968

/boot/loader.confを修正します。
vm.kmem_size="8192M"
vm.kmem_size_max="15872M"

ZFSのARCに割り当てられるメモリ
> sysctl -a | grep vfs.zfs.arc
vfs.zfs.arc_min: 1933344768
vfs.zfs.arc_max: 15466758144

/boot/loader.confを編集します。
vfs.zfs.arc_max="4G"
vfs.zfs.vdev.cache.size="4M"
vfs.zfs.prefetch_disable="1"
vfs.zfs.txg.timeout="5"
kern.maxvnodes="250000"
vfs.zfs.write_limit_override="1073741824" ←4GBメモリなら256MB,なので16GBだから1GBが妥当?

確認
> zfs-status -M

7.zfs quota変更

サイズ変更はかなり簡単でした。
varが大きくなってエラーしていたので大きくしました。
# zfs set quota=**G zpool0/var
これで終了
確認します。
# zfs get quota

8.立ち上がらなくなった時

CDでブートしてコマンドプロンプトを出す。
# mkdir /tmp/mnt
# zpool import -R /tmp/mnt -f zpool0
これでzfsを編集できるようにする。
/boot中でおかしいファイルなどを修正してリブートする。

9.バックアップ

ソフト的にミラーする場合は
$ rsync -av /storage/ /backup/

rsync -OPTION SRC SRC ・・・ TARGET
-a   サブフォルダーも対称にする
    シンボリックリンクはそのままコピーする。
    パーミッション属性をたもったままコピーする
    タイムスタンプをたもったままコピーする
    グループ属性をたもったままコピーする。
    所有者属性をたもったままコピーする。
    デバイスファイルをたもったままコピーする
-v   バックアップ中にコピーしているファイル名を表示する
-x   再帰的に実行された時にファイルシステムの境界を横断しない、複数のUFS→1つのZFSの場合など
-q   転送情報を表示しない
-H   ハードリンクはそのままコピーする。指定しないとリンク先の実体がコピーされる
-R   相対パス名を使う
--delete コピー元で削除されたファイルは、コピー先でも削除する。

-R, --relative 相対パスを使います。コマンドラインで指定されたフルパス名は、単なる最後の部分のファイル名ではなく、相対パスとしてサーバへ送信されます。これは特に、同時に異なるディレクトリに送信したいときに使われます。例えば、
rsync foo/bar/foo.c remote:/tmp/
ここではリモートのマシンにある /tmp/ というディレクトリに foo.c というファイルを作ります。この代わりに
rsync -R foo/bar/foo.c remote:/tmp/
とすると、リモートのマシンで /tmp/foo/bar/foo.c というファイルが作られます。フルパス名は維持されます。