====== ZFS 指令與操作整理 ======
* 以下 zfs 的操作環境是在 PVE(PROXMOX Virtual Environment) 主機環境執行
===== ZFS 基本語法 =====
* https://www.freebsd.org/doc/zh_TW/books/handbook/zfs-zpool.html
* zpool
* zfs
===== 新硬碟建立為 ZFS 方式 =====
* https://pve.proxmox.com/wiki/ZFS_on_Linux
* 建立一個 ZFS 的 Partation Exp. /dev/sdb fdisk /dev/sdb
* g : 建立為使用 GPT disklabel 硬碟
* n : 建立一個新的 Partation
* t : 48 - Solaris /usr & Apple ZFS
* w : 寫入
* 透過 zfs 工具建立 pool Exp. /dev/sdb2 -> ssd-zpool
zpool create -f -o ashift=12 ssd-zpool /dev/sdb2
zfs set compression=lz4 atime=off ssd-zpool
zpool list
root@TP-PVE-249:~# zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
rpool 928G 169G 759G - 8% 18% 1.00x ONLINE -
ssd-zpool 448G 444K 448G - 0% 0% 1.00x ONLINE -
* 再透過 PVE web 介面 Datacenter -> Storage -> Add -> ZFS
* 輸入 ID Exp. ssd-zfs
* 選擇 ZFS Pool : ssd-zpool
* 這樣就可以加入 ZFS 的磁碟
===== 限制 ZFS 使用多少 RAM 當 cache 方式 =====
* 參考 - https://pve.proxmox.com/wiki/ZFS_on_Linux#sysadmin_zfs_limit_memory_usage
* 預設 ZFS 會使用主機的 50% RAM 當 Cache, 如要更改就需要設定 zfs_arc_max 的值, 為了 ZFS 的效能, zfs_arc_max 的值不應該小於 2 GiB Base + 1 GiB/TiB ZFS Storage, 也就是說如果有 1T 的 ZFS pool , 需要的 RAM 至少 2+1 = 3G
* Exp. 限制最多使用 3 GB 的 RAM 當 ZFS Cache
* 編輯 /etc/modprobe.d/zfs.conf 設定檔, 讓 zfs_arc_max 設定值永久生效
root@aac:~# echo "$[3*1024*1024*1024]"
3221225472
vi /etc/modprobe.d/zfs.conf
:
options zfs zfs_arc_max=3221225472
* 如果 root 不是 ZFS 可以設定立即生效
echo "$[3 * 1024*1024*1024]" >/sys/module/zfs/parameters/zfs_arc_max
* 如果 root 是 ZFS 需要執行以下命令, 然後重新開機生效
update-initramfs -u -k all
reboot
===== 將一顆 ZFS 資料碟加回主機內 =====
因系統碟毀損重新安裝, 將原本放在 zfs 資料碟加回重新安裝的主機內
* 這棵資料碟 /dev/nvme0n1 透過 fdisk -l /dev/nvme0n1 可看到以下資訊
root@nuc:/etc/postfix# fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 953.9 GiB, 1024209543168 bytes, 2000409264 sectors
Disk model: PLEXTOR PX-1TM9PeGN
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 31E1D4CF-870D-E741-B28E-2305FDF86533
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 2000392191 2000390144 953.9G Solaris /usr & Apple ZFS
/dev/nvme0n1p9 2000392192 2000408575 16384 8M Solaris reserved 1
* 透過 zdb -l /dev/nvme0n1p1 可看到以下資訊
root@nuc:/etc/postfix# zdb -l /dev/nvme0n1p1
------------------------------------
LABEL 0
------------------------------------
version: 5000
name: 'local-zfs'
state: 0
txg: 5514533
pool_guid: 1902468729180364296
errata: 0
hostid: 585158084
hostname: 'nuc'
top_guid: 1144094455533164821
guid: 1144094455533164821
vdev_children: 1
vdev_tree:
type: 'disk'
id: 0
guid: 1144094455533164821
path: '/dev/nvme0n1p1'
devid: 'nvme-PLEXTOR_PX-1TM9PeGN_P02927100475-part1'
phys_path: 'pci-0000:6d:00.0-nvme-1'
whole_disk: 1
metaslab_array: 65
metaslab_shift: 33
ashift: 12
asize: 1024195035136
is_log: 0
DTL: 25995
create_txg: 4
features_for_read:
com.delphix:hole_birth
com.delphix:embedded_data
labels = 0 1 2 3
* 執行 zpool import -d /dev/nvme0n1p1 檢查是否可以依照之前狀態建立出 local-zfs
root@nuc:/etc/postfix# zpool import -d /dev/nvme0n1p1
pool: local-zfs
id: 1902468729180364296
state: ONLINE
status: The pool was last accessed by another system.
action: The pool can be imported using its name or numeric identifier and
the '-f' flag.
see: http://zfsonlinux.org/msg/ZFS-8000-EY
config:
local-zfs ONLINE
nvme0n1 ONLINE
* 依照上面出現的訊息要輸入 -f 的以下語法才能讓 local-zfs 加回系統
zpool import -f local-zfs
* 參考網址 -
* https://www.unix.com/solaris/125956-mount-old-zfs-filesystem.html
* https://zfsonlinux.org/msg/ZFS-8000-EY/
===== 修改 zpool 名稱的方式 =====
* 原本的 zpool name 為 ssd-zfs 想要改成 ssd-zpool
zpool export ssd-zfs
zpool import ssd-zfs ssd-zpool
* 參考網址 - https://prefetch.net/blog/2006/11/15/renaming-a-zfs-pool/
===== 移除 zpool 的方式 =====
* 原本的 zpool name 為 ssd2-zfs , 因 Fragmentation > 20% 想要移除後再重建, 先將所有在 ssd2-zfs 的檔案移到其他的 zpool, 再進行以下刪除 zpool 語法
zpool destroy ssd2-zfs
===== 安裝一顆存在相同 zpool 名稱的 zfs 硬碟處理方式 =====
* 最簡單的方式是先在外面 fdisk 清空好硬碟再安裝, 萬一主機硬碟安裝程序複雜, 已經安裝開機才發現以下錯誤訊息 Exp. rpool
Message: cannot import 'rpool' : more than one matching pool
import by numeric ID instead
Error: 1
就可以使用 zpool import 指令來處理
- 找出現有 rpool 的 id
/sbin/zpool import
出現的畫面類似以下:{{:tech:2020081701.png|}}
- 判別原有真正要的 rpool 的 id 進行匯入 Exp. 13396254673059535051 , 語法如下:
/sbin/zpool import -N 13396254673059535051
- 如果沒有出現其他訊息, 就表示匯入成功, 這時輸入 Exit 就可以進入正常繼續開機執行程序
* 進入開機成功狀態後, 要儘快透過 fdisk 將這顆新加入有重複的 zpool 名稱硬碟進行處理
* 否則下次開機還是要處理一次這樣的程序.
===== zpool 出現降級(Degraded)時更換 zfs 硬碟處理方式 =====
* Exp. pbs-zpool zpool status pbs-zpool
pool: pbs-zpool
state: DEGRADED
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Thu Oct 29 15:43:26 2020
355G scanned at 49.8M/s, 96.9G issued at 13.6M/s, 1.55T total
97.1G resilvered, 6.09% done, 1 days 07:14:16 to go
config:
NAME STATE READ WRITE CKSUM
pbs-zpool DEGRADED 0 0 0
sdb1 DEGRADED 11 52 0 too many errors
errors: No known data errors
* 假設新安裝的硬碟為 sdf , 需要 [[tech/zfs#%E6%96%B0%E7%A1%AC%E7%A2%9F%E5%BB%BA%E7%AB%8B%E7%82%BA_zfs_%E6%96%B9%E5%BC%8F|fdisk 先將 sdf 建立一個 ZfS partition]]
* 將新建立的 sdf1 加入 pbs-zpool
zpool attach pbs-zpool sdb1 sdf1
如果這指令執行幾秒沒有出現錯誤訊息, 就可以透過
zpool status pbs-zpool 來查看修復與同步狀況
pool: pbs-zpool
state: DEGRADED
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Thu Oct 29 15:43:26 2020
355G scanned at 46.4M/s, 101G issued at 13.2M/s, 1.55T total
102G resilvered, 6.34% done, 1 days 08:09:31 to go
config:
NAME STATE READ WRITE CKSUM
pbs-zpool DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
sdb1 DEGRADED 11 52 0 too many errors
sdf1 ONLINE 0 0 0 (resilvering)
errors: No known data errors
* 等 sdf1 加入 pbs-zpool 的 resilvering 完成後, 就可移除原本異常的 sdb1
zpool clear pbs-zpool
zpool detach pbs-zpool sdb1
zpool status pbs-zpool
應該可看到如下的訊息
pool: pbs-zpool
state: ONLINE
scan: resilvered 1.35T in 1 days 04:24:31 with 0 errors on Mon Nov 2 10:25:43 2020
config:
NAME STATE READ WRITE CKSUM
pbs-zpool ONLINE 0 0 0
sdf1 ONLINE 0 0 0
errors: No known data errors
===== 底層硬碟擴大後 zpool 擴大空間方式 =====
* 參考網址 - https://www.kringles.org/linux/zfs/vmware/2015/02/10/linux-zfs-resize.html
* 使用情境 -
* 更換硬碟 Exp. 原本 4TB 更換 8TB -> zpool 透過 attach 新硬碟(8TB) 與原本硬碟(4TB) 進行 mirror 後, detach 原本硬碟(4TB) 後雖然 zpool 的硬碟已經是 8TB, 但 zpool 還是只有原本 4TB
* 虛擬機底層 VDisk 調大空間後, zpool 仍然是看到原本空間大小
* 處理方式 Exp. pbs-zpool @ /dev/sdd1
zpool set autoexpand=on pbs-zpool
parted /dev/sdd
resizepart
1
[X.XGB]?
quit
zpool online -e pbs-zpool sdd1
df -h
實際處理訊息如下
root@TP-PVE-252:/# parted /dev/sdd
GNU Parted 3.2
Using /dev/sdd
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) resizepart
Partition number? 1
End? [8002GB]?
Error: Partition(s) 1 on /dev/sdd have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use. As a result, the old partition(s) will
remain in use. You should reboot now before making further changes.
Ignore/Cancel?
Ignore/Cancel? I
(parted) quit
Information: You may need to update /etc/fstab.
root@TP-PVE-252:/# zpool online -e pbs-zpool sdd1
root@TP-PVE-252:/# df -h
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 796M 28M 768M 4% /run
:
:
tmpfs 796M 0 796M 0% /run/user/0
pbs-zpool 7.1T 1.4T 5.7T 20% /pbs-zpool
root@TP-PVE-252:/#
===== 增加一顆 SSD 當 zfs 的 cache =====
* 參考 - https://linuxhint.com/configuring-zfs-cache/
* 假設使用六顆 SAS 1TB 硬碟組成 ZFS - raidz2 , 加上一顆 SSD 400GB (/dev/nvme0n1) 當 Cache
root@pve-1:~# zpool status
pool: rpool
state: ONLINE
scan: scrub repaired 0B in 0 days 00:00:10 with 0 errors on Fri Dec 3 17:24:52 2066
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
scsi-35000c50099b187df-part3 ONLINE 0 0 0
scsi-35000c50095c609f7-part3 ONLINE 0 0 0
scsi-35000c50099b18c6b-part3 ONLINE 0 0 0
scsi-35000c50099b185e3-part3 ONLINE 0 0 0
scsi-35000c50099b18453-part3 ONLINE 0 0 0
scsi-35000c50099b18ebb-part3 ONLINE 0 0 0
* 加入 nvme0n1 當 rpool 的 cache 語法
zpool add rpool cache nvme0n1
root@pve1:~# zpool status
pool: rpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
scsi-35000c50099b187df-part3 ONLINE 0 0 0
scsi-35000c50095c609f7-part3 ONLINE 0 0 0
scsi-35000c50099b18c6b-part3 ONLINE 0 0 0
scsi-35000c50099b185e3-part3 ONLINE 0 0 0
scsi-35000c50099b18453-part3 ONLINE 0 0 0
scsi-35000c50099b18ebb-part3 ONLINE 0 0 0
cache
nvme0n1 ONLINE 0 0 0
* 查看 zpool 使用狀況 zpool iostat -v
root@pve1:~# zpool iostat -v
capacity operations bandwidth
pool alloc free read write read write
-------------------------------- ----- ----- ----- ----- ----- -----
rpool 180G 5.28T 0 243 2.62K 5.17M
raidz2 180G 5.28T 0 243 2.62K 5.17M
scsi-35000c50099b187df-part3 - - 0 39 447 860K
scsi-35000c50095c609f7-part3 - - 0 40 352 889K
scsi-35000c50099b18c6b-part3 - - 0 42 536 905K
scsi-35000c50099b185e3-part3 - - 0 40 456 879K
scsi-35000c50099b18453-part3 - - 0 40 360 882K
scsi-35000c50099b18ebb-part3 - - 0 40 530 878K
cache - - - - - -
nvme0n1 64.9G 308G 0 15 2 1.56M
-------------------------------- ----- ----- ----- ----- ----- -----
===== 移除 ZFS cache 硬碟方式 =====
* 要移除 zfs2TB 內的 cache - sdc 的語法
zpool remove zfs2TB sdc
* 執行前
# zpool status zfs2TB
pool: zfs2TB
state: ONLINE
scan: scrub repaired 0B in 0 days 00:55:00 with 0 errors on Sun Dec 13 01:19:07 2020
config:
NAME STATE READ WRITE CKSUM
zfs2TB ONLINE 0 0 0
ata-WDC_WD2002FAEX-007BA0_WD-WMAY03424496 ONLINE 0 0 0
cache
sdc ONLINE 0 0 0
* 執行後
# zpool status zfs2TB
pool: zfs2TB
state: ONLINE
scan: scrub repaired 0B in 0 days 00:55:00 with 0 errors on Sun Dec 13 01:19:07 2020
config:
NAME STATE READ WRITE CKSUM
zfs2TB ONLINE 0 0 0
ata-WDC_WD2002FAEX-007BA0_WD-WMAY03424496 ONLINE 0 0 0
===== 對 zpool 加上 Metadata 的 Special Device 加速讀取效能的方式 =====
* 參考
- https://github.com/openzfs/zfs/discussions/14542
- https://pbs.proxmox.com/docs/sysadmin.html
* Metadata 是指 ZFS 儲存檔案系統資訊的資料, 由於讀取和寫入頻率較高,因此對系統效能有較大的影響。所以在一般 HDD 的 ZFS 加上 SSD 當 Special Device 就可以提高整體存取效能。不過需要注意的是 Special Device 如果損壞, 整個 zpool 就會毀損, 因此會將 special device 用兩個實體的 SSD 進行 mirror 保護來確保安全。另外 spool 設上 special device 是無法復原回沒有設定的狀態, 因此設定前要審慎。
* 語法 : zpool add special mirror
* Exp. 對 pbs-zpool 加上 /dev/nvme0n1 與 /dev/nvme1n1 當 special device
zpool add pbs-zpool special mirror /dev/nvme0n1 /dev/nvme1n1
加入之後
root@h470:~# zpool status pbs-zpool
pool: pbs-zpool
state: ONLINE
scan: scrub repaired 0B in 02:55:43 with 0 errors on Sun Nov 12 03:19:52 2023
config:
NAME STATE READ WRITE CKSUM
pbs-zpool ONLINE 0 0 0
sda1 ONLINE 0 0 0
special
nvme0n1 ONLINE 0 0 0
nvme1n1 ONLINE 0 0 0
* 想要瞭解 IO 狀態, 可透過以下語法觀察 watch zpool iostat -v pbs-zpool
{{tag>zfs pve}}