FreeBSD6まではUFSだったが、FreeBSD10にはフォーマットがZFSになっていた。
これまでのUFSよりも使いやすいのだが、イマイチ理解できない自分がここに居る。
記録簿として分かる範囲で書いてみる。
実際に実行したときのメモのままなので、これでうまく行くかは?ですが・・・
ada0を消す
パーティーションを消しておく
# dd if=/dev/zero of=/dev/ada0 count=64
ada0をGPTにする
# gpart destroy -F ada0
ada0に3つのパーテーションを作成
# gpart create -s gpt ada0
ada0にブートを書く
# 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
zfs領域作成
# gpart bootcode -b /boot/pmbr ada0
# gpart bootcode -p /boot/gptzfsboot -i 1 ada0
zfsパーティション作成
# zpool create -o altroot=/mnt zpool0 ada0p3
コピーする。
# 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
起動後の /boot/ をどこから探せばよいかを zpool 自身に埋め込んでおく
# rsync -avxHR / /var /usr /tmp /mnt コピーしたファイルを zfs 環境に適したものに修正する。
# zpool set bootfs=zpool0/ROOT zpool0 データ保護のためにraid0を組む。
# echo zfs_load=YES >> /mnt/boot/loader.conf
# echo zfs_enable=YES >> /mnt/etc/rc.conf
ZFSミラー作成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
/boot/loader.confに下記を追記
下2行はミラーの関係ではない。なんだったか分からなくなった。
geom_mirror_load="YES"
kern.geom.label.disk_ident.enable="0"
kern.geom.label.gptid.enable="0"
いや、gmirrorはZFSとは別のミラーだった・・・
う〜ん、この記事はちょっと当てにならない。
結果的に移行したシステムは一度初期化してサラからFreeBSD11.3をZFSミラーでインストールした。
参考にしたページ
FreeBSD10: あとからzfs構成にする
FreeBSDのZFSでミラーリングを作ってみた。が
ZFS障害を確認する。
上記は問題ない場合。
# zpool status -x
all pools are healthy
問題があった場合はエラーのドライブをオフラインにする
ドライブを入れ替えてオンラインにする
# zpool offline zpool0 ada1
確認
# zpool online zpool0 ada1
# zpool status -x
all pools are healthy
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
USBドライブなど追加した場合、ada0やda0などどこなのかをまず探す。
で表示すれば分かると思います。
# dmesg | grep MB
今回はda0として話を進めます。
ディスクインフォを確認
# diskinfo -t /dev/da0
GPTの状況確認
この場合は購入時にwindowsフォーマットで確保されているので、まず削除します。
# 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)
数字の1はshowで確認したときのms-basic-dataの前にある1です。
# sudo gpart delete -i 1 da0
da0p1 deleted
無くなっているか確認します。
# 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で下記のようなエラーが出た場合は
でGPTにします。
# gpart show da0
gpart: No such geom: da0.
# gpart create -s gpt da0
次にzfsでスライスします。
# gpart add -t freebsd-zfs da0
da0p1 added
確認します。
da0が追加されています。
# 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
そしてまずZFSストレージプールを作成します。
# zpool create backup /dev/da0p1
zpoolのリストを確認します。
backupが作成されています。
# 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にマウントされてしまっているので、マウントポイントを変更する場合は
とこれで/usr/home/backupへマウント位置を変更します。
# zfs set mountpoint=/usr/home/backup backup
アンマウントは
でアンマウントできますが、USBドライブなどで他のマシンへ接続変更することを考えるとエクスポート・インポートが良いようです
# zfs unmount backup
まず外します。
zpoolの状況確認で外れていることを確認します。
# zpool export backup
# 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
カーネルに割り当てられるメモリ
> 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
サイズ変更はかなり簡単でした。
varが大きくなってエラーしていたので大きくしました。
これで終了
# zfs set quota=**G zpool0/var
確認します。
# zfs get quota
CDでブートしてコマンドプロンプトを出す。
これでzfsを編集できるようにする。
# mkdir /tmp/mnt
# zpool import -R /tmp/mnt -f zpool0
/boot中でおかしいファイルなどを修正してリブートする。
ソフト的にミラーする場合は
$ 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 というファイルが作られます。フルパス名は維持されます。