Samba 可用來讓 Unix、Linux、macOS 及 Windows 等作業系統間檔案資源流通,以 SMB/CIFS (Server Message Block/Common Internet File System) 網路協定做連結,衍生為印表機分享、雲端 網路儲存或整合 Windows Server 網域控制等功能的網通產品,早已存在大家身邊多時,是應用廣泛 的自由軟體。即使現今 NAS (Network Attached Storage) 軟硬體產品取得容易,操作技術門檻降低 ,Samba server 建置的實作,對於學習 Linux 伺服器管理技能應能有所助益。
https://www.ubuntu-tw.org/modules/newbb/viewtopic.php?post_id=183878
create mode = 新增檔案時,檔案的權限
660 = 檔案擁有者、檔案群組擁有者,可讀+寫,其餘人不可讀寫
directory mod = 新增目錄時,目錄的權限
2770=目錄擁有者、目錄群組擁有者,可讀+寫+進入,其餘人無任何權限
特別說明 2770 前面那個 2,那是指當目錄底下新增檔案或目錄,該檔案或目錄的「群組」會自動變成頂層的群組。以此例子來說,就是群組會自動變成 上一層目錄所屬的群組。
auto lo
iface lo inet loopback
重新啟動網路設定 或 重新開機( 使用 reboot 指令)
~# service networking restart
找到 PermitRootLogin without-password
改成 PermitRootLogin yes/etc/init.d/ssh restart
或service ssh restart
即可.
root@debian8:~# testparm
Load smb config files from /etc/samba/smb.conf
Processing section "[homes]"
Processing section "[printers]"
Processing section "[print$]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
# Global parameters
[global]
server role = standalone server
map to guest = Bad User
obey pam restrictions = Yes
pam password change = Yes
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
unix password sync = Yes
syslog = 0
log file = /var/log/samba/log.%m
max log size = 1000
dns proxy = No
usershare allow guests = Yes
panic action = /usr/share/samba/panic-action %d
idmap config * : backend = tdb
[homes]
comment = Home Directories
valid users = %S
create mask = 0700
directory mask = 0700
browseable = No
[printers]
comment = All Printers
path = /var/spool/samba
create mask = 0700
printable = Yes
print ok = Yes
browseable = No
[print$]
comment = Printer Drivers
path = /var/lib/samba/printers
root@debian8:~#
查詢結果顯示,使用者家目錄已開放擁有者讀取權限,兩段與印表機分享相關的設定,用不到時可 以全部刪除。
使用者端「網路芳鄰」瀏覽 為了測試 Samba 功能,虛擬機器軟體中啟動 Windows 虛擬機器,順利的話可在「網路芳鄰」中看 到 Samba server 出現其中。
使用者端直接以網路位址開啟 Samba server Windows 使用者可在「檔案總管」網址列中,以路徑「\\hostname」或「\\IP位址」瀏覽 Samba 伺 服器。 如:\\debian 或 \\10.0.2.15
smb.conf 為 Samba 伺服器重要的設定檔,所有設定參數都在其中。如同一般 Linux 設定檔,主要 設定項目也都提供註解說明。
全域設定、列印分享及目錄分享等類別,以及工作群組與分享目錄參數,為 smb.conf 的主要設定項目。
Samba 安裝後有很多預設值,即使 smb.conf 未更動也能作用,建議先保留預設值,必要時再新增 參數變更,查詢預設值可用「man smb.conf」指令。
Samba 每次設定變更後,皆需重新啟服務讓設定內容生效。
root@debian8:~# /etc/init.d/smbd restart
[ ok ] Restarting smbd (via systemctl): smbd.service.
全部 ok 表示 Samba 服務功能大致正常。
或
root@debian8:~# service smbd restart
root@debian8:~#
[shared] comment = Shared Folder path = /home/samba/shared read only = no guest ok = yes create mask = 0777 directory mask = 0777 |
# 資料夾顯示名稱,建議使用英文字元。實作中文也相容。 # 分享資料夾註解說明,此為非必要項目。 # 分享資料夾路徑。<---- 要手動建立路徑 # 允許寫入。 # 允許訪客瀏覽。 # 預設新增檔案權限,非必要項目。 # 預設新增資料夾權限,非必要項目。 |
[homes] comment = Home Directories browseable = no read only = no create mask = 0700 directory mask = 0700 valid users = %S |
# 分享資料夾隱藏。 # 允許寫入。 # 預設新增檔案權限。 # 預設新增資料夾權限。 # 允許任何可登入的使用者登入。 |
~# pico /etc/samba/smb.conf
約117行
「map to guest = bad user」
預設狀態為允許未登入訪客瀏覽,將此設定項目刪除,或加 上「;」讓設定失效,改為需帳號密碼才可登入使用。
如:
; map to guest = bad user
[public] path = /home/samba/public guest ok = yes write list = user1 |
# 資料夾顯示名稱,建議使用英文字元。中文其實也可以。 # 分享資料夾路徑。 # 允許訪客使用。 # 允許特定使用者寫入。 |
~# pico /etc/samba/smb.conf
[library] path = /home/samba/library browseable = no read only = no guest ok = yes create mask = 0777 directory mask = 0777 |
# 資料夾顯示名稱,建議使用英文字元。中文名稱也可以。 # 分享資料夾路徑。<----- 記得要手動建立分享目錄 # 分享資料夾隱藏。<----- 不會顯示在網芳 # 允許寫入。 # 允許訪客瀏覽。 # 預設新增檔案權限,非必要項目。 # 預設新增資料夾權限,非必要項目。 |
Samba 在網路芳鄰中出現的主機名稱預設與 hostname 相同,修改 hostname 時
~# pico /etc/hostname
修改後重新開機,通常需幾分鐘後才能生效。
也可在 smb.conf 的 global 區段中,加入「netbios name」設定內容。
如: netbios name = servername
Samba 基本設定至此完成。
利用 Linux 系統中 使用者和群組 的設定來達到所有的分享目錄皆在同一個 share 分部目錄底下,同時又能做到權限控管/讀寫/顯示及隱藏的功能。
將 samba 伺服器上的分享目錄全部集中在同一個目錄
[行政辦公] |
# samba 分享目錄名稱 |
veto files = /*.inf/*.com/*.exe/*.lnk/*.cmd/*.dll/*.doc/*.docx/*.m??/*.wav/*.reg/*.rm*/*.url/*.vob/*.vbs/*.vbe/*.eml/*.nws/Riched20.dll/*.ccc/*.vvv/*.CCC/*.VVV/*.wncry/*.WNCRY/
手動建立分享路徑
~# mkdir /home/samba <---若未建立上方 path = /home/path 的路徑目錄,在重新啟動 samba後,以滑鼠點選要進入 行政辦公 目錄時會出現 路徑無法使用的的錯誤。
開啟網路芳鄰登入
這時會發現,無法登入。
原因:samba 伺服器上的密碼設定與OS的帳號密碼是各自獨立
~# passwd user1
是設定登入伺服器主機帳號的密碼,但 samba user和 debian user分開管理的。
所以,我們還要另外設定使用者 user1 的 samba 密碼。
root@debian8:~# useradd user1 <------新增 user1 帳號
root@debian8:~# smbpasswd -a user1 <------新增 samba user1 的帳號密碼
New SMB password:
Retype new SMB password:
root@debian8:~#
這樣,使用者 user1 就能透過網路芳鄰登入 samba 伺服器
新版的 samba 使用者密碼 設定可使用 pdbedit -a user1 來設定
經測試 不管是 smbpasswd 或 pdbedit 功能一致
重點整理:
samba 網路芳鄰的登入
先建立主機的帳號 ---> useradd user1
再新增主機帳號的 samba 密碼 ---> smbpasswd -a user1
如何刪除 samba 使用者帳號
root@debian8:smbpasswd -x user1
Deleted user user1.
或
root@debian8:# pdbedit -x user1
root@debian8:#
列出samba使用者資訊
root@debian8:~# pdbedit -v user1
Unix username: user1
NT username:
Account Flags: [U ]
User SID: S-1-5-21-482853127-1074029144-2756240993-1006
Primary Group SID: S-1-5-21-482853127-1074029144-2756240993-513
Full Name: 葉大雄
Home Directory: \\debian8\user1
HomeDir Drive:
Logon Script:
Profile Path: \\debian8\user1\profile
Domain: DEBIAN8
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: 三, 06 2月 2036 23:06:39 CST
Kickoff time: 三, 06 2月 2036 23:06:39 CST
Password last set: 五, 30 6月 2017 14:06:54 CST
Password can change: 五, 30 6月 2017 14:06:54 CST
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours
root@debian8:/home/samba# tree /home/samba/
/home/samba/
└── 01-教導處
├── 01-教務主任
├── 02-教務組長
├── 03-訓導組長
└── 04-設備組長
5 directories, 0 files
(tree 指令請以 apt-get install tree 安裝)
root@debian8:~# tree /home/samba/
/home/samba/
└── 01-教務處 (群組 g00--->可進入目前的目錄)
├── 01-教務主任 (使用者user1 群組 g01/ 使用者user1可讀寫 群組g00可讀取)
├── 02-教務組長 (使用者user2 群組 g01/ 使用者user2可讀寫 群組g01可讀取)
├── 03-訓導組長 (使用者user3 群組 g01/ 使用者user3可讀寫 群組g01可讀取)
└── 04-設備組長 (使用者user4 群組 g01/ 使用者user4可讀寫 群組g01可讀取)
5 directories, 0 files
root@debian8:~#
建立日期:2017/05/02
更新日期:2017/07/03
1.建raid1、2.建raidz、3.管理與維護、4.效能測試、
Mirror
zfs的Raid1模式稱之為Mirror,也就是鏡像。它跟傳統的Raid1不太一樣的地方在於,寫入的效能等同Raid1;讀取時會從組成磁碟中同時讀取,因此讀取的效能會接近Raid0。從上面的數據來看,測試軟體的數據確實符合這種特性,不過實測數據就沒那麼漂亮。另外,ZFS的Mirror不限於只能複數硬碟組成,3顆、5顆都不是問題,很奇怪吧!雖然它允許你這麼做,但實際上你用單數碟來組mirror意義不大,可參考我後面的效能測試即可知道。若是在原有Mirror的Pool裏再加入一組Mirror會怎樣?答案是:會變成Raid 1+0。
RAIDZ
RAID-Z其實是RAID 5的一種變形,傳統的RAID 5在寫入資料時,如果遇到電力中斷有可能會造成寫入的資料並不完整。而zfs則透過將檔案系統及實體磁碟結合,並使用可變長度的跨距單位(variable-width RAID stripes),來避免這種情形的發生。建raidz至少需要3顆硬碟。
以mirror(RAID 1)的方式建立storage pool時,需要使用關鍵字 mirror並且指定二個以上的虛擬裝置。而在建立RAID-Z時,則使用raidz 這個關鍵字並且指定二個以上的虛擬裝置(這裡跟RAID 5最少需使用三個磁碟不同,但可用空間都是N-1顆)。freebsd官網這裡、中文介紹,有提到raid-z、raid-z1、raid-z2、raidz3的詳細說明。
簡單說:
Raidz1 允許1個HD故障,約等同 Raid5
Raidz2 允許2個HD故障,約等同 Raid6,至少要4顆HD
Raidz3 允許3個HD故障,官方建議,單一個vdev不要超過9個硬碟,具體指令的下法可參考這裡和這裡。
raid1即mirror
pve wiki上的教法,建 raid1 語法:
zpool create 儲存池名稱 raid格式 裝置名稱
zpool create -m 掛載點 儲存池名稱 裝置名稱
zpool create -f -o ashift=12 儲存池名稱 mirror 裝置1 裝置2
zpool的用法詳細說明
這段主要就講這一行指令
zpool create -f -o ashift=12 vic1 mirror sdb sdc
上面這個指令會建立一個 vic1 的儲存池(storage pool)、自動產生zfs檔案系統和掛載點(預設都是在系統的根目錄底下),並且會自動掛載該檔案系統。
一個指令就幫你做了這麼多事,真是簡便到有點不太習慣,它把我這些全都做了:
建raid指令mdadm、格式化mkfs.ext4、建掛載點mkdir /mnt/vic1、掛載mount
-m 指定掛載點,這個掛載點可不用先建資料夾。若已建資料夾也沒關係,但該資料夾內有檔案則會報錯
-f Forces use of vdevs, 即便它正在使用中或有其它的衝突。並非所有裝置都可靠此指令解決。
-o ashift=12 是指先進格式化(4K)的硬碟所需要下的參數。但新版的zpool本身已有支援4K sector的功能了,所以不用特別指定這個參數。
4K問題參考資料:心誌、Silent Melody、delphji's Chaos、
若想查你的 zpool 建立時是否有使用 ashift 指定12 可用此指令zdb |grep ashift來查詢那個數值是否等於12
若你有4顆硬碟想要建mirror的話,會建議你這麼下指令:
zpool create vic1 mirror sdb sdc mirror sdd sde
這樣你建出來的 raid 會變成 raid10 效能會比較好。
或是你一開始只有兩顆硬碟先建mirror了,後來想要再加兩顆進去,指令是這麼下的
zpool create vic1 mirror sdb sdc
zpool add vic1 mirror sdd sde
使用zpool statu 看的效果如下:
NAME STATE READ WRITE CKSUM
vic1 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
不建議使用這樣的方式來下指令
zpool create vic1 mirror sdb sdc sdd sde
若想建立單顆硬碟的儲池存指令語法:
zpool create 儲存池名稱 裝置名稱
zfs 在預設的情況下,不帶任何參數所建立的儲存池就是raid0
裝置名稱可以寫成 /dev/sdb 或簡寫成 sdb 都可以
例:
zpool create vic2 sdb
若你一開始只是建立單碟,之後想要多加一顆進這個儲存池以達加速效果,也很容易實現
zpool add vic2 /dev/sdc
attach指令說明
zpool attach 這個指令是用來加硬碟,但它只能加硬碟進mirrors的最上面那顆硬碟裡
錯誤訊息參考:
$zpool create test1 sdd
invalid vdev specification
use '-f' to override the following errors:
/dev/sdd does not contain an EFI label but it may contain partition
information in the MBR.
若出現以上的錯誤訊息,大意是指 sdd 已有分割區了,使用參數 -f 來強制覆蓋過去即 $zpool create -f test1 sdd
建raidz1指令
zpool create vic1 raidz1 sdb sdc
建raidz2指令
zpool create vic1 raidz2 sdb sdc sdd
多顆硬碟簡便指令
zpool create -f vic1 raidz2 sd{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p}
但不建議你這樣用,因為硬碟代號常會跳動,請改用下面的指令
範例:使用16顆硬碟來建raidz2
這16顆硬碟我們要用它的wwn號來建立,但由於我們要建16顆硬碟,一個個查wwn號 copy和貼上 有點費時,因此就用了點小技巧
①.先列出清單
ls -l /dev/disk/by-id/ > list.txt
②.刪除分割區代號
主要查找 -part 此字串,整行刪掉
sed -in '/-part/d' list.txt
③.使用vim編輯
vim list.txt
刪掉ata和使用 ctrl+v 來刪掉前面的字串
④.使用sort排序
cat list.txt |sort -t ' ' -k 3 > list2.txt
⑤.再用vim進去修改
vim list2.txt
最後結果
上面的內容,進vim把後面的 ...給刪掉即可
最後要執行的指令如下,16顆硬碟分兩個群組
若要加SSD for cache用,指令範例
zpool add vic1 cache sdx
另外拿一顆硬碟當spare
zpool add vic1 spare sdx
參考資料:raidz擴充容量、zfs extend disk、
初學者看過來:
當你在用了ZFS一段時間之後,你可能會發現底下這兩個指令都可以建立資料夾
zfs create vic1/folder1
mkdir /vic1/folder1
這兩個指令都可以建 folder1 資料夾,看起來和使用上好象沒有什麼差別?
簡要說明如下:
mkdir 是linux底下的指令,它所建的資料夾沒有zfs的許多功能可用
zfs create 所建的資料夾是一個資料集(中文翻譯常沒有統一,因此請記它的英文Dataset),你可針對這個資料集做很多zfs特有功能的細部設定,如拍快照、壓縮、重覆資料刪除。
參考此頁的一段原文:
Be careful here. Keep in mind that if any single vdev fails, the entire pool fails with it. There is no fault tolerance at the pool level, only at the individual vdev level! So if you create a pool with single disk vdevs, any failure will bring the whole pool down.
要好好理解上面這段話,任何單一的 vdev 故障,都會導致整個 pool 的故障, pool 沒有任何的容錯機制,只有在 vdev 層級才有容錯機制。基於上述的提醒,若你有16顆硬碟,是想要用兩組 vdev 來建 pool的話,是非常不建議你用兩組 raidz1 來建 pool,即 8顆raid1 兩組,這樣對資料是很危險的。
說明:底下的SOP範例都是使用硬碟代號來組建raid,在實際使用上硬碟代號經常會變動,因此不太建議使用硬碟代號來組建raid,而建議改用wwn 或硬碟序號來建raid,具體執行指令可參考上一章節 2.建raidz。
指令:
zpool status 儲存池名稱
pool: vic1
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
vic1 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
errors: No known data errors
並用指令 hdparm -i /dev/sdX 查清楚每一顆硬碟序號,才不會在換硬碟時搞錯顆硬碟了
zpool offline vic1 /dev/sdc
或是另一個指令 (不建議)
zpool detach pool-name /dev/sdd
detach與offline的差別:
detach: 若沒有其它有效的備份碟的話,執行此指令會被拒絕。若此碟可能還會被加回此儲存池(pool)的話,請用offline來替代。
開機後先用指令查看狀態
pool: vic1
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'.
scan: none requested
config:
NAME STATE READ WRITE CKSUM
vic1 DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
ata-WDC_WD40EZRZ-00WN9B0_WD-WCC4E2LALV2A ONLINE 0 0 0
sdd OFFLINE 0 0 0
上面會看到 /dev/sdd 還在,只是呈離線狀態
先用指令 hdparm -i /dev/sd? 查出我們剛換上去的新硬碟現在是哪個硬碟代號,只能一個個查了
我查出新硬碟位於 /dev/sdc
zpool replace -f vic1 /dev/sdd /dev/sdc
再看狀態
pool: vic1
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 Mon Jul 18 02:24:48 2016
922M scanned out of 372G at 28.8M/s, 3h39m to go
922M resilvered, 0.24% done
config:
NAME STATE READ WRITE CKSUM
vic1 DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
ata-WDC_WD40EZRZ-00WN9B0_WD-WCC4E2LALV2A ONLINE 0 0 0
replacing-1 OFFLINE 0 0 0
sdd OFFLINE 0 0 0
sdc ONLINE 0 0 0 (resilvering)
已經下了 replace 指令了,也看到了它正在重建資料當中 (resilvering)
但是 sdd 還在,估計最後還得下個卸載指令
zpool detach vic1 /dev/sdd
更正:資料重建完之後它就會消失了。
做完以上動作基本上就可以了
若因為機器故障,無法再開機,就必須把 mirror 硬碟,拿其中一顆到另外一台機器上讀取
底下是在另一台機器上的操作方式:
指令
zpool list
看有沒有自動偵測到可用的 pool 若有的話就可直接下指令掛載
指令
zfs mount -a
上面這指令是掛載pool裡所有可掛載的內容
上述兩招若不行,就是沒有偵測到可用的 pool, 改下此指令
zpool import
上面的指令會列出可用的 pool name
後面帶pool名稱,則可掛載
zpool import vic1
會提示一些警告訊息,可能要加 -f 強制選項才能掛載
這裡是介紹使用 pve 安裝介面使用 zfs raid1 來安裝系統,所做出來的系統碟在遇到問題時怎麼排除
系統碟使用zfs主要按照此頁 pve wiki 上面的資料來操作
實作指令:待補...
由於raidz有多種組合,對於硬碟數量比較多的人確實有必要了解一下什麼樣的組合效能才是最好,當然可用的最大空間也是考量之一,因此底下的測試也有把可用空間寫進去。
說明一下我的測試環境:
CPU:CPU E5-2660 v4 *2
RAM:64G*4=256GB
HDD:Segate 7200RPM 1TB*28顆硬碟
主機板型號:X10DSC+
機殼型號:6048R-E1CR60L
SAS卡型號:AOC-S3008L-L8-P 使用晶片是LSI 3008
背板型號:BPN-SAS3-946SEL1
底下的測試主要參考這兩頁而來:calomel.org、icesquare.com、
格式 | 組數 | 硬碟數 | 可用總容量 | 寫MB/s | 讀MB/s | 備註 |
raidz3 | 1 | 28 | 22T | 541 | 700 | |
raidz3 | 2 | 14 | 20T | 566 | 769~780 | |
raidz3 | 4 | 7 | 14T | 525 | 751 | |
raidz2 | 1 | 28 | 23T | 548 | 718 | |
raidz2 | 2 | 14 | 21T | 566~580 | 823~830 | 註1 |
raidz2 | 3 | 9 | 19T | 539 | 542 | 註2 |
raidz2 | 4 | 7 | 18T | 544 | 906 | |
raidz1 | 1 | 28 | 24T | 551 | 692 | |
raidz1 | 2 | 14 | 23T | 576 | 880 | |
raidz1 | 4 | 7 | 21T | 565 | 889 | |
raid0 | 1 | 28 | 25T | 592 | 1126 | 註3 |
mirror | 1 | 28 | 899G | 202 | 585 | |
mirror | 2 | 14 | 1.8T | 441 | 652 | |
mirror | 14 | 2 | 13T | 579 | 939 | 註4 |
底下是 mdadm raid0的測試報告
硬碟數量 | 28顆 | 13顆 | 8顆 | 4顆 |
寫入速度 | 1.3GB/s | 976 MB/s | 919 MB/s | 876 MB/s |
注意上面的硬碟數,從最少的看起4顆就有876MB/s,但可不是隨著硬碟越多,速度就會跟著往上升...跟什麼因素有關,目前我不清楚。
網友提醒我 zfs pool 預設的 record size 是 128kb,可參閱此頁。建議我的dd測試指令可改用128kb來測試看看。
1kb=1024bytes
128kb → 1024*128 = 131072 bytes
256kb → 1024*256 = 262144 bytes 因此我們的測試指令改為
寫入測試指令
dd if=/dev/zero of=/vic2/file.out bs=131072 count=40000 &
上面的bs=131072 可簡寫成 bs=128k
讀取測試指令
dd if=/vic2/file.out if=/dev/zero bs=131072 &
測出來的寫入速度
raid0 有達到最高3GB/s
mirror 2顆*14組 達 2.5GB/s
但是讀取速度就少的可憐了,都只有11MB/s
由於效能最好的raid0跟mirror測出來的讀取速都只有11MB/s這麼低,因此就不多做其它組合的測試了,意義不大。
使用dd 指定 bs=128k 的方式來測寫入速度,請參考下圖
上圖是使用此指令 zpool iostat vic2 -v 1 來看的。
3.5" HDD 7200轉的傳輸速率在 65~115MB/s 之間,上圖的每顆單碟的速度都接近100MB/s了,這個128k的寫入測試,可說是把單碟的最高效能給逼出來了。
2.64GB/s 這數字是浮動的,我看到最高達 3GB/s ,總共28顆硬碟,也就是說單碟速度有超過 100MB/s。
此測試報告主要是要確認此台主機硬體的架構沒有問題即可,之前我擔心是否SAS卡或背板(expander)頻寬有效能不足的問題,經此測試確認了沒有效能不足的問題之後,就可安心使用了。美超微有針對我這台機器提供了測試報告給我,我這台機器背板的頻寬上限是6GB/s 他的測試是大約在25顆左右的硬碟數量即達此極限。
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> |
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 0
errors: No known data errors
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 0
errors: No known data errors
root@debian8:~# zpool online pool1 /dev/sdb
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 0
errors: No known data errors
root@debian8:~# zpool export pool1 -f
root@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
root@debian8:~# zpool import pool1
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
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
檔案系統 容量 已用 可用 已用% 掛載點
pool1/compressed 3.0G 112K 3.0G 1% /pool1/compressed
pool1/data 4.9G 112K 4.9G 1% /data
將 原來 /home/samba/ 底下的所有目錄和檔案同步到 /zfs/samba/
root@debian8:/# rsync -avP /home/samba/ /zfs/samba/
sending incremental file list
./
01-教導處/
01-教導處/01-教務主任/
01-教導處/02-教務組長/
01-教導處/03-設備組長/
01-教導處/04-訓導組長/
sent 285 bytes received 39 bytes 648.00 bytes/sec
total size is 0 speedup is 0.00
root@debian8:/#
修改 /etc/samba/smb.conf 的分享路徑 到 /samba
root@debian8:/# pico /etc/samba/smb.conf
[行政辦公]
comment = 行政辦公
path = /home/samba
改為
[行政辦公]
comment = 行政辦公
path = /zfs/samba
再按 Ctrl+O , Enter 存檔, Ctrl + X 退出編輯器
重新啟動 samba 服務
root@debian8:/# service smbd restart
或
root@debian8:/# service smbd reload
使用 testparm 查看參數
zfs send
及 zfs receive
。
#
zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
backup 7.94G 608K 7.94G 0% 1.00x ONLINE -
zfs 7.94G 608k 7.94G 0% 1.00x ONLINE -
zfs
的儲存池為主要的儲存池,資料會定期寫入與讀取的位置。第二個儲存池 backup
用來待命 (Standby),萬一主要儲存池無法使用時可替換。注意,ZFS 並不會自動做容錯移轉 (Fail-over),必須要由系統管理者在需要的時候手動完成。快照會用來提供一個與檔系統一致的版本來做備份,zfs
的快照建立之後,便可以複製到 backup
儲存池,只有快照可以做備份,最近一次快照之後所做的變更不會含在內容裡面。
#
zfs snapshot zfs/samba
@backup1
#
zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
zfs@backup1 80k - 160k -
zfs send
來建立一個代表快照內容的串流,這個串流可以儲存成檔案或由其他儲存池接收。串流會寫入到標準輸出,但是必須要重新導向到一個檔案或轉接到其他地方,否則會錯誤:
#
zfs send zfs@backup1
Error: Stream can not be written to a terminal.
You must redirect standard output.
zfs send
備份一個資料集,可重新導向到一個位於在已掛載到備份儲存池上的檔案。確定該儲存池有足夠的空間容納要傳送的快照,這裡指的是該快照中內含的所有資料,並非只有上次快照到該快照間的變更。
#
zfs send zfs
@backup1
> /backup/backup1
#
zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
backup 7.94G 608K 7.94G 0% 1.00x ONLINE -
zfs 7.94G 608k 7.94G 0% 1.00x ONLINE -
zfs send
會傳輸在快照 backup1
中所有的資料到儲存池 backup
。可以使用 cron(8) 排程來自動完成建立與傳送快照的動作。zfs receive
將串流轉換回檔案與目錄。zfs send
及 zfs receive
,將資料從一個儲存池複製到另一個,傳輸完成後可以直接使用接收儲存池上的資料。一個資料集只可以被複製到另一個空的資料集。
#
zfs snapshot zfs@replica1
#
zfs send -v zfs
@replica1
| zfs receive -F backup/mypool
<--- 若不存在 backup/mypool ,zfs會自動建立一個 dataset
send from @ to mypool@replica1 estimated size is 50.1M
total estimated size is 50.1M
TIME SENT SNAPSHOT
#
zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
backup 7.94G 1.28M 7.94G 0% 1.00x ONLINE -
zfs 7.94G 1.04M 7.94G 0% 1.00x ONLINE -
步驟:
實作:
root@debian8:~# tree /zfs/samba/
/zfs/samba/
└── 01-教導處
├── 01-教務主任
├── 02-教務組長
├── 03-設備組長
└── 04-訓導組長
5 directories, 0 files
將 /backup/samba 目錄底下清空
root@debian8:~# rm /backup/samba/* -rf
root@debian8:~# ls -alF /backup/samba/
總計 17
drwxr-xr-x 2 root root 2 7月 4 22:29 ./
drwxr-xr-x 4 root root 5 7月 4 21:55 ../
將 dataset zfs/samba 建立的快照 zfs/samba@GMT-2017.07.04-14.25.00
透過網路 以zfs 複製/備份 到
另一台主機 "(現在以本機 localhost 來模擬操作) 的 backup/samba dataset
root@debian8:~# zfs send zfs/samba@GMT-2017.07.04-14.25.00 | ssh localhost zfs receive backup/samba
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is 68:82:38:50:e1:f7:44:67:2c:8a:48:bf:b5:c5:ba:c5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
root@localhost's password:
cannot receive new filesystem stream: destination 'backup/samba' exists
must specify -F to overwrite it
root@debian8:~# zfs send zfs/samba@GMT-2017.07.04-14.25.00 | ssh localhost zfs receive backup/samba -F
root@localhost's password:
cannot receive new filesystem stream: I/O error
查看目前 /backup/samba 底下的目錄及檔案
/backup/samba/
└── 01-教導處
├── 01-教務主任
├── 02-教務組長
├── 03-設備組長
└── 04-訓導組長
5 directories, 0 files
查看目前的快照(快照也會同時複製到遠端)
root@debian8:~# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
backup/samba@GMT-2017.07.04-14.25.00 80K - 152K -
zfs/samba@GMT-2017.07.04-14.25.00 80K - 152K -
NAME USED AVAIL REFER MOUNTPOINT
backup/samba@1 0 - 152K -
zfs/samba@1 0 - 152K -
來源端增量
在 /zfs/samba/ dataset 下增加檔案/目錄
root@debian8:~# cd /zfs/samba/
將 /var/ 目錄複製到 /zfs/samba/ 底下
root@debian8:/zfs/samba# rsync -avP /var/ /zfs/samba/var/
root@debian8:/zfs/samba# ls -alF
總計 34
drwxr-xr-x 4 root root 4 7月 4 23:17 ./
drwxr-xr-x 4 root root 4 7月 3 22:22 ../
drwxr-xr-x 6 root root 6 7月 1 10:10 01-教導處/
drwxr-xr-x 11 root root 13 6月 13 14:04 var/
目錄容量明顯增加
root@debian8:/zfs/samba# du -d1 -h
43K ./01-教導處
145M ./var
145M
/zfs/samba/ 檔案及目錄增加或修改過後
製作第2次快照
root@debian8:/zfs/samba# zfs snapshot zfs/samba@2
目前快照
root@debian8:/zfs/samba# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
backup/samba@1 0 - 152K -
zfs/samba@1 96K - 152K -
zfs/samba@2 0 - 144M -
將增量的部份傳送到遠端主機
使用 參數 -I (大寫的 i ) 來傳送增量快照
~# zfs send -I zfs/samba@1 zfs/samba@2 | ssh localhost zfs receive backup/samba -F
root@localhost's password: <-----這裡輸入遠端主機密碼
root@debian8:/zfs/samba#
目前快照,可以發現本端主機與遠端主機的快照也同步了
root@debian8:/zfs/samba# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
backup/samba@1 96K - 152K -
backup/samba@2 0 - 144M -
zfs/samba@1 96K - 152K -
zfs/samba@2 88K - 144M -
使用增量快照的方式,在資料的傳輸上要比傳統使用 rsync 的方式所需要傳輸的資料少,時間上也較節省。若有一個10G的大檔案變更檔名,以rsync的方式來同步時,就必須重新傳送10G的資料量,而以zfs快照增量的方式,僅僅只需要傳送「變更檔名」的改變。
而且,zfs還提供本機與遠端每一次變更的快照。
參考資料
http://docs.oracle.com/cd/E19253-01/819-0362/ghgfx/index.html
https://www.freebsd.org/doc/zh_TW/books/handbook/zfs-zfs.html
快照會掛載在父資料集下的隱藏目錄:.zfs/snapshots/
。預設不會顯示這些目錄,即使是用 snapshotname
ls -a
指令。雖然該目錄不會顯示,但該目錄實際存在,而且可以像一般的目錄一樣存取。一個名稱為 snapdir
的屬性可以控制是否在目錄清單中顯示這些隱藏目錄,設定該屬性為可見 (visible
) 可以讓這些目錄出現在 ls
以及其他處理目錄內容的指令中。
#
zfs get snapdir mypool/var/tmp
NAME PROPERTY VALUE SOURCE
mypool/var/tmp snapdir hidden default
%
ls -a /var/tmp
. .. passwd vi.recover
#
zfs set snapdir=visible mypool/var/tmp
%
ls -a /var/tmp
. .. .zfs passwd vi.recover
要還原個別檔案到先前的狀態非常簡單,只要從快照中複製檔案到父資料集。在 .zfs/snapshot
目錄結構下有一個與先前所做的快照名稱相同的目錄,可以很容易的找到。在下個範例中,我們會示範從隱藏的 .zfs
目錄還原一個檔案,透過從含有該檔案的最新版快照複製:
#
rm /var/tmp/passwd
%
ls -a /var/tmp
. .. .zfs vi.recover
#
ls /var/tmp/.zfs/snapshot
after_cp my_recursive_snapshot
#
ls /var/tmp/.zfs/snapshot/after_cp
passwd vi.recover
#
cp /var/tmp/.zfs/snapshot/after_cp/passwd
/var/tmp
執行 ls .zfs/snapshot
時,雖然 snapdir
可能已經設為隱藏,但仍可能可以顯示該目錄中的內容,這取決於管理者是否要顯示這些目錄,可以只顯示特定的資料集,而其他的則不顯示。從這個隱藏的 .zfs/snapshot
複製檔案或目錄非常簡單,除此之外,嘗試其他的動作則會出現以下錯誤:
#
cp /etc/rc.conf
/var/tmp/.zfs/snapshot/after_cp/
cp: /var/tmp/.zfs/snapshot/after_cp/rc.conf: Read-only file system
這個錯誤用來提醒使用者快照是唯讀的,在建立之後不能更改。無法複製檔案進去或從該快照目錄中移除,因為這會變更該資料集所代表的狀態。
快照所消耗的空間是依據自快照之後父檔案系統做了多少變更來決定,快照的 written
屬性可以用來追蹤有多少空間被快照所使用。
使用 zfs destroy
可以摧毀快照並回收空間。加上 dataset
@snapshot
-r
可以遞迴移除所有在父資料集下使用同名的快照。加入 -n -v
來顯示將要移除的快照清單以及估計回收的空間,而不會實際執行摧毀的操作。
scrub
(刷洗):http://www.gienginali.idv.tw/modules/tad_book3/page.php?tbdsn=48
http://www.gienginali.idv.tw/modules/tad_book3/page.php?tbdsn=574
How To Create A NAS Using ZFS and Proxmox (with pictures)
https://forum.level1techs.com/t/how-to-create-a-nas-using-zfs-and-proxmox-with-pictures/117375
作者:夢見草
http://note.zn2.us/zfs.htm