自建 samba + ZFS (snhpshot快照/任意還原點)檔案伺服器
- ZFS 建路陣列指令
ZFS 指令 | 啟用壓縮指令 (proxmox ve主機) |
|
單一硬碟建立 ZFS檔案系統儲存池 |
zpool create -f -o ashift=12 <pool-name> <device> | zfs set compression=lz4 <pool-name> |
建立 Raid 0 最少1顆以上硬碟 |
zpool create -f -o ashift=12 <pool-name> <device1> <device2> ... 資料會平均分配寫入各顆硬碟,若其中一顆硬碟毀損,全部的資料也將會一起毀損。 優點是寫入速度快 |
zfs set compression=lz4 <pool-name> |
建立 Raid 1 最少2顆以上硬碟 |
zpool create -f -o ashift=12 <pool-name> mirror <device1> <device2> 建立 Raid1(1+1=1) Mirror 格式,資料會同時寫入兩棵 HD。 (這是最佳建議方式,安全性也較高) |
zfs set compression=lz4 <pool-name> |
建立 Raid 10 最少4顆以上硬碟 |
zpool create -f -o ashift=12 <pool-name> mirror <device1> <device2> mirror <device3> <device4> | zfs set compression=lz4 <pool-name> |
建立 Raid Z-1 最少3顆以上硬碟 |
zpool create -f -o ashift=12 <pool-name> raidz1 <device1> <device2> <device3> | |
建立 Raid Z-2 最少4顆以上硬碟 |
zpool create -f -o ashift=12 <pool-name> raidz2 <device1> <device2> <device3> <device4> |
- zfs 的即時壓縮功能(預設是關閉)
主機的 CPU Loading 若效能還有剩餘,可以啟用 zfs compression 功能,
但若效能剛好或不足,則建議使用較低的壓縮效率或關閉即時壓縮功能
debian 主機
compression YES YES on | off | lzjb | gzip | gzip-[1-9] | zle- 查看 storage/compressed 檔案目錄屬性
zfs get all storage/compressed
- 查看 storage/compressed 檔案目錄屬性
- 常用指令
- ZFS 的 zpool 指令
- # 建立 Raid1(1+1=1) Mirror 格式,資料會同時寫入兩棵 HD。
# zpool create storagename mirror /dev/sdb /dev/sdc
# df -h # 查看 storage pool 是有已經建立
Filesystem Size Used Avail Capacity Mounted on
pool1 16G 112K 16G 1% /pool1
- # zpool status
# 查看本機 ZFS 的狀態,這個系統中有一個 pool 名稱為 pool1 是由兩棵代號 sdb 及 sdc 的實體硬碟 mirror 而成root@debian8:~# zpool status
pool: pool1
state: ONLINE
scrub: none requested
config:NAME STATE READ WRITE CKSUM
pool1 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0errors: No known data errors
- # zpool list
# 查看 pool 的空間使用狀態
root@debian8:~# zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
pool1 7.94G 388K 7.94G 0% 1.00x ONLINE -
- # zpool offline pool1 /dev/sdb
# 讓 storage 這個 pool 的 ad2 硬碟暫時離線
root@debian8:~# zpool offline pool1 /dev/sdb
- # zpool status pool1
# 查看狀態會有 DEGRADED 警告
root@debian8:~# zpool status pool1
pool: pool1
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scrub: none requested
config:NAME STATE READ WRITE CKSUM
pool1 DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
sdb OFFLINE 0 0 0
sdc ONLINE 0 0 0errors: No known data errors
- # zpool online pool1 /dev/sdb
# 讓 pool1 這個 pool 的 /dev/sdb 硬碟重新上線
root@debian8:~# zpool online pool1 /dev/sdb
- # zpool status pool1
# 查看狀態 DEGRADED 警告已解除
root@debian8:~# zpool status pool1
pool: pool1
state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Sat Jul 1 11:24:41 2017
config:NAME STATE READ WRITE CKSUM
pool1 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0 12K resilvered
sdc ONLINE 0 0 0errors: No known data errors
- # zpool export -f pool1
# 卸除(umount) pool1 這個 pool 參數 -f (Force) 為強制卸除root@debian8:~# zpool export pool1 -f
- # df -h
# 查看是否 umount,已無 pool1 這個 pool
root@debian8:~# df -h
檔案系統 容量 已用 可用 已用% 掛載點
/dev/sda1 1.9G 1004M 733M 58% /
udev 10M 0 10M 0% /dev
tmpfs 150M 4.6M 145M 4% /run
tmpfs 374M 0 374M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 374M 0 374M 0% /sys/fs/cgroup
- # zpool import
# 列出目錄系統上存在但尚未掛載的 pool storageroot@debian8:~# zpool import
pool: pool1
id: 244594555867708236
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:pool1 ONLINE
mirror-0 ONLINE
disk/by-id/ata-VBOX_HARDDISK_VB5260512b-73cfc5a7 ONLINE
disk/by-id/ata-VBOX_HARDDISK_VBff905153-79c3b58a ONLIN
- # zpool import -f
# 強制掛載目前系統上所有存在且未掛載(mount) 的 pool storage
- # zpool import pool1 # 掛載(mount) storage 這個 pool
root@debian8:~# zpool import pool1
- # df -h # 查看是否 mount,已重新掛載 storage pool
root@debian8:~# df -h
檔案系統 容量 已用 可用 已用% 掛載點
/dev/sda1 1.9G 1004M 733M 58% /
udev 10M 0 10M 0% /dev
tmpfs 150M 4.6M 145M 4% /run
tmpfs 374M 0 374M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 374M 0 374M 0% /sys/fs/cgroup
pool1 7.9G 112K 7.9G 1% /pool1 - # zpool scrub storage
# 手動驗證 storage 這個 pool 中所有資料的完整性
# 部份版本的 zfs 不提供
- # zpool replace pool1 /dev/sdd /dev/sde
# 在 storage pool1 中用新的 /dev/sdd /dev/sde 取代原本的 /dev/sdb /dev/sdc 兩棵 HD
- # 建立 Raid1(1+1=1) Mirror 格式,資料會同時寫入兩棵 HD。
- ZFS 的 zfs 指令
- # zfs create pool1/compressed
# 在 pool1 這個 pool 中建立一個檔案目錄叫 compressed
# zfs list # 查看 ZFS 檔案狀態
root@debian8:~# zfs list
NAME USED AVAIL REFER MOUNTPOINT
pool1 524K 7.81G 112K /pool1
pool1/compressed 112K 7.81G 112K /pool1/compressed
#以df -h 查看
root@debian8:~# df -h
檔案系統 容量 已用 可用 已用% 掛載點
/dev/sda1 1.9G 1004M 733M 58% /
udev 10M 0 10M 0% /dev
tmpfs 150M 4.6M 145M 4% /run
tmpfs 374M 0 374M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 374M 0 374M 0% /sys/fs/cgroup
pool1 7.9G 120K 7.9G 1% /pool1
pool1/compressed 7.9G 112K 7.9G 1% /pool1/compressed
- # zfs set compression=gzip pool1/compressed # 將 compressed 目錄設定成 gzip 壓縮格式
# zfs set compression=off pool1/compressed # 解除 compressed 目錄設的壓縮格式
# zfs mount # 查看所有 ZFS 掛載的磁區
root@debian8:~# zfs mount
pool1 /pool1
pool1/compressed /pool1/compressed
- # zfs get all pool1/compressed # 查看 pool1/compressed 檔案目錄屬性
root@debian8:~# zfs get all pool1/compressed
NAME PROPERTY VALUE SOURCE
pool1/compressed type filesystem -
pool1/compressed creation 六 7月 1 11:53 2017 -
pool1/compressed used 112K -
pool1/compressed available 7.81G -
pool1/compressed referenced 112K -
pool1/compressed compressratio 1.00x -
pool1/compressed mounted yes -
pool1/compressed quota none default
pool1/compressed reservation none default
pool1/compressed recordsize 128K default
pool1/compressed mountpoint /pool1/compressed default
pool1/compressed sharenfs off default
pool1/compressed checksum on default
pool1/compressed compression off default
pool1/compressed atime on default
pool1/compressed devices on default
pool1/compressed exec on default
pool1/compressed setuid on default
pool1/compressed readonly off default
pool1/compressed zoned off default
pool1/compressed snapdir hidden default
pool1/compressed aclmode groupmask default
pool1/compressed aclinherit restricted default
pool1/compressed canmount on default
pool1/compressed xattr on default
pool1/compressed copies 1 default
pool1/compressed version 4 -
pool1/compressed utf8only off -
pool1/compressed normalization none -
pool1/compressed casesensitivity sensitive -
pool1/compressed vscan off default
pool1/compressed nbmand off default
pool1/compressed sharesmb off default
pool1/compressed refquota none default
pool1/compressed refreservation none default
pool1/compressed primarycache all default
pool1/compressed secondarycache all default
pool1/compressed usedbysnapshots 0 -
pool1/compressed usedbydataset 112K -
pool1/compressed usedbychildren 0 -
pool1/compressed usedbyrefreservation 0 -
pool1/compressed logbias latency default
pool1/compressed dedup off default
pool1/compressed mlslabel off - -
# 只查看 pool1/compressed 目錄中 compression 屬性
root@debian8:~# zfs get compression pool1/compressed
NAME PROPERTY VALUE SOURCE
pool1/compressed compression off default - # zfs set quota=3G pool1/compressed # 可設定檔案空間大小為 3G 但 storage 這個 pool 總大小為 7.9G 如果 3G 滿了而 7.9G 還未用完會 share 給 /pool1/compressed 繼續使用
# df -h # 查看 storage/compressed 的 Avail 變成 3G
檔案系統 容量 已用 可用 已用% 掛載點
pool1 7.9G 120K 7.9G 1% /pool1
pool1/compressed 3.0G 112K 3.0G 1% /pool1/compressed
- # zfs set reservation=3g pool1/compressed
# 設定保留了 3G 給 /pool1/compressed
# df -h # 查看 pool1 的 Size 變成 4.9G,這是因為保留了 3G 給 /pool1/compressed,代表 /pool1/compressed 真正擁有 3G 別的 filesystem 是不能跟它 share 的
root@debian8:~# zfs set reservation=3G pool1/compressed
root@debian8:~# df -h
檔案系統 容量 已用 可用 已用% 掛載點
pool1 4.9G 120K 4.9G 1% /pool1
pool1/compressed 3.0G 112K 3.0G 1% /pool1/compressed
- # zfs create pool1/data # 於 storage pool 中再建立一個 data 檔案目錄
# zfs set mountpoint=/data pool1/data # 設定真實掛載點原本 Mounted on 會由 /pool1/data 變成到 /data
# df
檔案系統 容量 已用 可用 已用% 掛載點
pool1/compressed 3.0G 112K 3.0G 1% /pool1/compressed
pool1/data 4.9G 112K 4.9G 1% /data - # zfs set sharenfs=rw pool1/data # 設定分享權限可讀及寫,通常用在 NFS 分享上root@debian8:~# zfs set sharenfs=rw pool1/data
cannot share 'pool1/data': exportfs failed
property may be set but unable to reshare filesystem - # zfs snapshot pool1/compressed@2017-07-05
# touch /pool1/compressed/1234 # 建一個檔案到 compressed 目錄下
# zfs snapshot pool1/compressed@2017-07-051
# zfs snapshot pool1/compressed@2017-07-052
# snapshot compressed 目錄,取個隨便名稱就用今天日期 - zfs list -t snapshot
# 列出所有的snapshot(快照)
root@debian8:~# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
pool1/compressed@2017-07-05 0 - 112K -
pool1/compressed@2017-07-051 0 - 112K -
pool1/compressed@2017-07-052 0 - 112K - - zfs list -t all
# 列出所有的zfs檔案系統
root@debian8:~# zfs list -t all
NAME USED AVAIL REFER MOUNTPOINT
pool1 3.00G 4.81G 120K /pool1
pool1/compressed 112K 3.00G 112K /pool1/compressed
pool1/compressed@2017-07-05 0 - 112K -
pool1/compressed@2017-07-051 0 - 112K -
pool1/compressed@2017-07-052 0 - 112K -
pool1/data 112K 4.81G 112K /data
- # pool1/compressed@2017-07-051
# 刪除 pool1/compressed@2017-07-051 這個 snapshot
root@debian8:~# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
pool1/compressed@2017-07-05 0 - 112K -
pool1/compressed@2017-07-052 0 - 112K -
- # 回復到某一個快照點
# 先刪除剛剛產生的檔案
root@debian8:~# rm /pool1/compressed/1234
root@debian8:~# ll /pool1/compressed/
總計 17
drwxr-xr-x 2 root root 2 7月 1 12:24 ./
drwxr-xr-x 3 root root 3 7月 1 12:04 ../
再將zfs檔案系統還原到刪除前的snapshot
root@debian8:~# zfs rollback pool1/compressed@2017-07-052
root@debian8:~# ls -alF /pool1/compressed/
總計 18
drwxr-xr-x 2 root root 3 7月 1 12:23 ./
drwxr-xr-x 3 root root 3 7月 1 12:04 ../
-rw-r--r-- 1 root root 0 7月 1 12:23 1234
- # zfs destroy pool1/compressed # 可刪除 pool1/compressed 檔案目錄
root@debian8:~# zfs list -t all
NAME USED AVAIL REFER MOUNTPOINT
pool1 3.00G 4.81G 120K /pool1
pool1/compressed 280K 3.00G 112K /pool1/compressed
pool1/compressed@2017-07-05 88K - 112K -
pool1/compressed@2017-07-052 80K - 112K -
pool1/data 112K 4.81G 112K /data
# 在 pool1/compressed 檔案系統裡還有兩個快照存在
# 直接刪除檔案系統
root@debian8:~# zfs destroy pool1/compressed
cannot destroy 'pool1/compressed': filesystem has children
use '-r' to destroy the following datasets:
pool1/compressed@2017-07-05
pool1/compressed@2017-07-052
- # zfs create pool1/compressed
- ZFS 的 zpool 指令