zfsv28 dedup

[華語, cmn-Hant-TW]

在六月中左右 FreeBSD 8.2-STABLE 的 zfs 升級到了 v28

這版最主要的特色是 dedup,也就是 block level 的 deduplication,傳說中的 virtual machine disk image 備份救星 (誤)。 因為是 block level,所以檔案位置怎麼放,檔案是不是只修改一點點這些通通不用管了,反正 zfs 覺得這兩個 block 是長得一樣的話,就自動會處理,如果硬碟裡面有一堆彼此間差異不大的大檔案,那效果就會非常好,遠比 lzma 或是 gzip 壓縮更有快感 (事實上 dedup 跟壓縮是可以併存的,歡迎挑戰硬體極限) 。

要開 dedup 很簡單,在有 zfsv28 的系統下 zfs set dedup=on filesystem 指令就可以打開,要注意的是 dedup 是從整個 pool 來看的,同一個 pool 下可以有些 filesystem 有開,有些沒有,算是相當有彈性。dedup 的效果可以簡單的用 zpool list 看出,v28 多了一格 DEDUP,那個的倍率就是 dedup 的效果。

NAME         SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
backup       696G   445G   251G    63%  1.80x  ONLINE  -

在有開 dedup 的地方,每一個 block 的 checksum 會存在一個叫 DDT 的表裡面,根據 dedup FAQ 的講法,一般 record size  128K 的情況下,20TB 的資料會需要 32 GB 的實體記憶體來放 DDT,如果沒那麼大的記譩體那就會吃到硬碟,那就會非常非常慢。折衷方案就是找一顆 SSD 當 L2ARC,DDT 主要是讀取 (因為要比對),SSD 的讀取效能遠比硬碟來得好,這個工作還算扛得起來。

記憶體不足硬上 dedup 會對效能有什麼衝擊呢,簡單的測試

( 2G 記憶體,640G 的硬碟空間,zfs compression = gzip; atime = off)
測試檔案為 boost_1_45_0.tar.bz2 大小約 38MB,解壓縮後約275MB,用 FreeBSD 內建的 tar 來解壓,然後用 rm 刪掉,同樣用系統的 time 來測時間

DEDUP on:
tar 19.063u 6.914s 1:03:02.62  0.6%   88+1735k 0+0io 0pf+0w
rm   0.171u 8.741s 1:12:41.98  0.2%   26+2530k 0+0io 0pf+0w
DEDUP off:
tar 19.372u 6.963s    1:05.41 40.2%   74+1464k 0+0io 0pf+0w
rm   0.029u 3.826s    0:08.04 47.7%   16+1528k 0+0io 0pf+0w

這是最慘烈的情況 (八成是整個DDT都在硬碟上了),DEDUP on 一般情況其實沒那麼慢,大約數十分鐘吧,如果硬碟裡面已經有相同的資料的話那還會再更快些,不過再快也是被 DEDUP off  時的速度慘電就是。從實際應用來看,解壓縮一個數十MB 的檔案要花數十分鐘到一小時,砍掉解壓縮出來的東西還要再花數十分鐘到一個小時是什麼情況? 只能說硬體不夠力的話,還是不要亂開 DEDUP 吧。 (不過一想到 DEDUP 的快感… 再加上 RAM 現在便宜的跟●●一樣,好像升級一下再來開也是不錯的選擇)

Posted in FreeBSD. Tags: , , . 1 Comment »

加上/移去 zpool cache

[客家話, hak-Hant-TW]

假使你有一隻分割區 da0s1,要加到 volume1 這隻 pool 袛肚,可以按仔下指令:

zpool add volume1 cache da0s1

用 zpool status 可以看有加成功沒,是講要移去:

zpool remove backup-mmt da0s1

指令當簡單。

Posted in FreeBSD. Tags: , . No Comments »

AFP Server

[華語, cmn-Hant-TW]

據說 Mac 連 AFP 還是比 SMB 順,所以就想架看看用起來的感覺如何,伺服器是 FreeBSD 8.2,要安裝的 ports 有

  • /usr/ports/net/netatalk
  • /usr/ports/net/avahi (選用)
  • /usr/ports/net/howl (選用)

avahi 跟 howl 挑一個來裝即可。又為了要用 LDAP 做為登入認證,在編 netatalk 時記得要打開 PAM 的選項,這樣在安裝的時候會自動在 /etc/pam.d/ 裡面產生一個叫 netatalk 的檔案,這個檔案的內容預設是引用 /etc/pam.d/system 的設定,以 LDAP 來講,只要之前在 system 檔裡面有設定好 pam_ldap 的話,什麼都不用改就直接可以用了,接著就是要設一堆的設定檔

/etc/rc.conf
netatalk_enable="YES"
afpd_enable="YES"
cnid_metad_enable="YES"
 
# avahi 用這個
avahi_daemon_enable="YES" 
 
# howl 用這個
mdnsresponder_enable="YES"
mdnsresponder_flags="-f /usr/local/etc/mDNSResponder.conf"

個人的習慣是把這些設定值通通丟到 /etc/rc.conf.local 裡就是。

/usr/local/etc/avahi/services/afp.services (avahi)
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
 
<name replace-wildcards="yes">%h</name>
 
<service>
<type>_afpovertcp._tcp</type>
<port>548</port>
</service>
 
<service>
<type>_device-info._tcp</type><port>0</port>
<txt-record>model=Xserve</txt-record>
</service>
 
</service-group>

afp.services 檔名可以自訂,只要內容長得一樣即可。
其中 %h 是 server name,是顯示在用戶端 Finder 上的機器名稱,然後 model 則是決定顯示的圖形,詳情後述。

/usr/local/etc/mDNSResponder.conf (howl)
"ServerName" _device-info._tcp local. 1 "TXTVersion=1.0" "model=Xserve"
"ServerName" _afpovertcp._tcp  local. 548

這個檔案似乎安裝的時候不會自動產生,要自行建立。其中 ServerName 是用戶端的 Finder 看到的顯示名稱,model 後面的 Xserve 是指定顯示圖形,詳請看下一段。

Model Name

不管是 avahi 或是 howl 都可以丟 device-info,在 Finder 上會根據 device-info 決定顯示的圖形。像是指定成 Macmini 的話就會顯示成 Mac Mini 的樣子,很有趣。在用戶端 (Mac OS X) 上的 /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist 檔案裡可挖出所有可用的值,常見的有:

  • Xserve
  • PowerBook
  • PowerMac
  • Macmini
  • iMac
  • MacBook
  • MacBookPro
  • MacBookAir
  • MacPro
  • AppleTV1,1
  • AirPort
  • iPhone
/usr/local/etc/netatalk.conf
ATALK_MAC_CHARSET='UTF8-MAC'
ATALK_UNIX_CHARSET='UTF8'

把他通通設成 UTF8 比較不會有問題,有需要用別的編碼就自己改即可。

/usr/local/etc/AppleVolumes.default
~
/share             "Share"    allow:whsyu,grass

檔案裡面的說明很詳細,大致上就是 “目錄名 – 顯示名稱 – 選項” 這樣的格式,要分享幾個目錄就寫幾行,以這個例子來看,就是各人的家目錄,以及只分享給 whsyu 跟 grass 的 /share 目錄,在 Finder 上會顯示成 Share 資料夾,要注意的是這邊的 allow 只是給不給看的設定而已,權限還是會跟系統走,如果該使用者在系統上本來就沒有存取該目錄的權限,那就算他看得到那個分享出來的目錄也是沒有用的。

手動執行

/usr/local/etc/rc.d/nettalk start
/usr/local/etc/rc.d/avahi-daemon start (avahi用這個)
/usr/local/etc/rc.d/mdnsresponder start (howl用這個)

通通設定完之後,要直接用的話就手動去打開服務即可,然後就可以去用戶端玩看看了。

特別注意:ZFS 目錄

分享 zfs 的目錄有可能會吃到「無法完成此項操作,因為找不到〇〇〇〇的原項目。」這樣的錯誤訊息,在用戶端的 Console 會看到這樣:

NetworkNode::handleMountCallBack returned 2
NetworkNode::handleMountCallBack returned -50

通常來講,netatalk 會把設定檔裡面權限不足或是名字打錯的目錄過濾掉,並不會分享給用戶端,因此用戶端看得到理論上應該是一定會找得到。那這個錯誤是怎麼產生的呢? zfs 的 volume 用 set mountpoint 直接指定掛載點時,zfs 建立的目錄是只有 root 有存取權限,但是隨後掛載上去的就會蓋掉了原先的權限,於是一般使用者在本機上也就能存取了。netatalk (現在版本 2.1.5) 不知為何會被卡在這邊,不過解決方法也不難,就先暫時改掉 mountpoint,把目錄改成 755 之類的權限後再把 mountpoint 改回去即可。

參考資料

http://linuxnet.ch/groups/linuxnet/wiki/f8a83/FreeBSD_Setup_Netatalk_Server_for_OSX_with_Bonjour.html

http://thomas.pelletier.im/2010/01/time-machine-freebsd-and-afp-are-on-a-little-boat/

Posted in FreeBSD. Tags: , , , , . 2 Comments »

raidz 換硬碟

[華語, cmn-Hant-TW]

以三顆拼成的 raidz 來講,假設塞進去的硬碟都是整顆拿來用(dangerously dedicated?!)的情況,那要換硬碟的時候只要這樣下指令就可以了: (假設要把 data 的 ad6 換成 ad8)

zpool replace data ad6 ad8

不過如果抽取盒插滿滿又懶得打開機殼拔來拔去的話,那也是可以冒點風險同位置直接抽換。抽換 ad6 成新硬碟後再下指令強制更新:

zpool replace -f data ad6 ad6
zpool clear data

在剛換新硬碟的時候 raidz 會進 DEGRADED 模式一段時間,等跑完後才會恢復成正常。這部份就是風險所在,當然以一般個人用的情況來看應該是可接受的。

註:在硬體更換或新增完畢 (通常需要重開機進入系統) 後才下這些指令,請確認無誤後再執行,不然換
錯硬碟就搞笑了。

Posted in FreeBSD. Tags: , . No Comments »

換 zfsroot pool 的名仔

[客家話, hak-Hant-TW]

一般要換 zfs 的 pool 名就直接 export 過來 import 換新名就好了,毋過是講 pool 袛肚有 root 就作不得 export,按仔就要用別隻方法來改。

要用 zfs 開機的時節,系統會參考 /boot/zfs/zpool.cache 來 import 看得到的 zfs pool,是講沒找到 /boot/loader.conf 底肚的 vfs.root.mountform 指定的地方,就會跳出錯誤訊息叫你輸入對的位仔,所以常理來講是沒要挺動較好,正經想要要改可以按仔做:

  1. 用別台電腦 (沒就是換一個硬碟開機) 強制 import 這隻 zfs pool 同時改名仔。
  2. 拷這下這個系統的 zpool.cache 進去這隻 pool 相對的位仔。 (可以直接用這下的系統 mount 這隻 pool 的 root)
  3. 配合修改 /boot/loader.conf 的 vfs.root.mountform 變作新的名仔。
  4. 配合修改 /etc/fstab ,共樣有看到舊仔名仔就換作新名。
  5. 換轉去用這隻硬碟開機,是講沒問題就看得到 pool 的名換了。
Posted in FreeBSD. Tags: , . No Comments »

FreeBSD zfsboot

[華語, cmn-Hant-TW]

安裝

想要把一台 FreeBSD 8.0 機器硬碟升級,想說乾脆換成 GPT 弄個純 zfs 的環境來用看看。在官網的 wiki 有提到在這裡可以下載安裝光碟,裡面有一個 zfsinstall 的 script 可以幫忙把 FreeBSD 安裝到一顆乾淨的硬碟裡面,直接下載附有包好一份 FreeBSD/amd64 dist 的 special edition 比較方便,不然就得自己包一份餵給 zfsinstall 吃。

安裝過程很快,不過重開機後怪事就發生了,開機居然會卡在開機硬碟掃瞄的畫面?!一開始推測是 GPT 的問題,把硬碟清掉之後果然就不卡了,這實在沒啥道理,後來把硬碟拿去用 Mac 的磁碟工具程式分割成 GUID 分割表 (即 GPT),一試居然也不會卡,那問題是在哪? 再深入交叉測試發現原來只要用 gpart create -s GPT 指令做出來的分割表開機的時候就會卡住,就算裡面是空的也一樣,Mac 的則不會。所以結論就是用 FreeBSD 的 gpart 在 WD 6400AAKS 上產生的 GPT 會讓 MSI K8N Neo4-FI 主機板卡在硬碟掃瞄畫面,至於問題是誰造成的我就不知道了。

既然 Mac OS X 產生出來的 GPT 沒問題,那就用 Mac OS X 做一個空殼。因為 Mac 在分割的時候會很貼心的順便塞 EFI 之類的東西進去,所以在安裝前要先用 gpart delete 指令把所有分割區砍掉只留 GPT。然後 zfsinstall 也需要修改,因為他一開始會檢查確認硬碟是否為全空,要把那段註解掉或是讓他檢查沒過時不會跳出,然後 gpart create 的部份也要註解掉,因為事先已用 Mac 之工具做好 GPT 了,一切順利的話,安裝完重新開機就可以進去整顆都是 zfs 的系統了。

移動

要把舊的系統移到新的系統問題不大,用舊硬碟開機下手動將新硬碟的 zfs dataset ( /root /var /tmp /usr ) 掛載上去後直接用 rsync 把既有資料蓋到新硬碟上的相對位置即可,蓋完之後要再修改兩處

/boot/loader.conf
zfs_load="YES"
vfs.root.mountfrom="zfs:data/root"
/etc/fstab
/dev/gptid/78e0d9bd-1fac-11df-bc9c-0210dc9db087 none swap sw 0 0
data/usr /usr zfs rw 0 0
data/var /var zfs rw 0 0
data/tmp /tmp zfs rw 0 0

data 是 zfs pool 的名字,zfsinstall 時可以下參數指定,/etc/fstab 中 swap 的 gptid 可以用 zfs status 查到,事實上這兩個檔案在 zfsinstall 安裝時都會設定好,不過把舊硬碟資料複製到新硬碟時很有可能會被蓋掉,所以要再確認修改。

一切順利的話用新硬碟重開機應該可以看到原來的系統又跑起來了,差別只是硬碟變大、根目錄變 zfs 而已 (輕描淡寫貌)。

update: (2011-12-01)
補充一下,root partition 不要用 gzip,不然會開不了機,zfsv28 的 dedup 倒是沒差可以直接在 root 開

http://www.freebsd.org/cgi/query-pr.cgi?pr=153173

update: (2012-02-02)
試過另一顆 SSD 在原來那台機器上一樣會卡,看來是這張主機板會挑。還有就是後來的版本可以不用 legacy 模式掛載 /usr /var 等,再搭配直接在 zfs volume 上開 swap 的話那就可以完全不用 /etc/fstab ,這樣就更有 zfs 的味道了。

Posted in FreeBSD. Tags: , , , , . No Comments »

make installworld 到 zfs partition

[客家話, hak-Hant-TW]

每擺就會毋記得講要用什麼參數、安裝新編好的 world 到 zfs partition 才不會佇到 zfs 做不得 chflag 的問題、這擺就同他記下來,下擺要找較快。

make NO_FSCHG=true installworld

按仔就不會吃到 error 了。

參考連結 - make installworld 出来ない症候群

Posted in FreeBSD. Tags: , , . No Comments »

zfs 硬碟隨你便

[華語, cmn-Hant-TW]

3.5 吋的多層硬碟抽取盒很方便,但是要確定插下去的硬碟是 ad6 ad8 ad10 的哪顆就很難去記了。所以通常需要標示清楚,然後線也要分清楚後依序接到主機板上,這樣才不會弄亂。

不過如果是拿來給 zfs 用的話,那就不用管那麼多了,反正只要你的硬碟還在他就可以處理,亂插也無妨。當然了,如果是 IDE 的抽取盒的話那就要注意 master/slave 的問題,這是硬體的限制。

附帶一提,在 FreeBSD 7.1 下,用預設值跑原則上是不會出問題的,不過如果一直吃到 kmem too small 的 panic 的話,那就把 vm.kmem_size 拉到 1G,或是把 vfs.zfs.arc_max 弄小一點,這些都可以在 /boot/loader.conf 裡面設定。(sysctl 只能看不能設)

Posted in FreeBSD. Tags: . No Comments »