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 »

nvidia driver for freebsd/amd64

[華語, cmn-Hant-TW]

隨著 FreeBSD 8.0 的推出,nVidia 也如預期的釋出了給 FreeBSD/amd64 跑的驅動程式,在這篇裡面有提到最新的 195.22 有支援64bit,而支援的版本則是 FreeBSD 8.0/7.3 。當然其實是不需要等 7.3 推出,只要跟著 RELENG_7 跑現在的版本應該就能用了,不過到目前為止(2009/12/07)  ports 裡面是沒有的,所以得手動下載後編譯及安裝,最後再跑 nvidig-config 弄一個新的 xorg.conf 即可。

手上沒有啥特別需要跑 OpenGL 的程式,倒是 KDE  SC 4 的介面可以開 OpenGL 加速之後用起來比 xrender 順很多,用一張舊的 7600GT 跑起來沒遇到什麼太大問題,大致來說讓人非常滿意。

UPDATE:  沒多久之後就進 ports 了

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

FreeBSD 7 to 8

[華語, cmn-Hant-TW]

FreeBSD 8.0 發表了

用懶人的方式升級(csup -> buildkernel/world -> installkernel/world -> delete-old -> mergemaster) 會在 mergemaster 的時候遇到這樣的問題:

install -o root -g wheel  -m 644 atrun cron ftpd imap kde login other passwd pop3 rsh sshd su system telnetd xdm /var/tmp/temproot/etc/pam.d /var/tmp/temproot/etc/pam.d/ftp -> /var/tmp/temproot/etc/pam.d/ftpd
Bad system call (core dumped)
*** Error code 140
 
<code>Stop in /usr/src/etc/pam.d.
*** Error code 1
 
</code><code>Stop in /usr/src/etc.
*** Error code 1
 
</code><code>Stop in /usr/src.
*** Error code 1
 
Stop in /usr/src.
 
 *** FATAL ERROR: Cannot 'cd' to /usr/src and install files to
the temproot environment</code>

在 /usr/src/etc/pam.d 目錄下有一個 ln.core 跑出來,很顯然就是新安裝那個  ln 的問題了,把 7.0 的 ln 找回來代打一下跑完 mergemaster,重開進 8.0 之後再換回新的 ln 即可。

Posted in FreeBSD. Tags: . 2 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 »

portupgrade 的效能

[en]

有一台機器當久沒更新放那邊給他走、前幾日想要用 portupgrade 更新那下才發現當慢。那台機器差不多裝了七百零隻套件、當多。查了一下才發現講光是重新建立 pkgdb.db 就花當多時間、就想到會是資料庫選擇的問題。這台機器本成的 pkgdb.db 是用 dbm_hash、顯然毋是用 bdb、重新裝了有開 bdb 的 portupgrade、重新做出來的 pkgdb.db 就變成 bdb_btree 了。速度正經有差、當明顯是講套件多那下、用 bdb 還是較好的方案。

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

FreeBSD kernel/world cross-compile

[客家話, hak-Hant-TW]

有一台機器本成是 FreeBSD/i386、這下要把他換成 FreeBSD/amd64 同時換一隻硬碟、又毋想找光碟片重新灌一隻系統、這樣就堵到這種問題了。

找了一下資料、看起來毋會太麻煩、編譯那下加一些仔參數就可以了。要編不同平台時要用 TARGET、要指定安裝到哪邊就用 DESTDIR。以我用的例子來講、就是 TARGET=amd64、DESTDIR=/mnt (新的硬碟掛載到 /mnt 下)

make TARGET=amd64 DESTDIR=/mnt world
make TARGET=amd64 DESTDIR=/mnt kernel

過來就是要把 /etc 拷貝到 /mnt/etc 下背、改一下 fstab、照理來講這樣就可以用新的硬碟開機。可以開機之後、再度過來就是重新編譯 ports 安裝的軟體了。

Posted in FreeBSD. Tags: , . No Comments »

gcin 自動執行的神秘事件

[en]

test

[cmn-TW]

在某台電腦最近的一次大更新之後,kdm 登入畫面的右上角居然自動出現三顆按鈕,登入之後還是掛在那邊而且我還不知道要怎麼關掉?!查了一下原來那個東西是 gcb,不過我根本沒裝 gcb 啊!!後來才知道這個是 gcin 1.4.3 之後整合進去的,所以把 gcin 關掉他就會消失。( gcin-setup 可以針對這個功能做設定 )

問題來了,這台電腦上主要都是用 oxim 的輸入法,雖然說也有灌 gcin 但是平常根本就沒有執行啊,啊 gcin 怎麼會自動跑起來?當然,把整個 gcin 反安裝就不會跳出來了,不過我也不想反安裝 gcin,畢竟有時候應急或是測試還是會用到,所以就要來試看看到底是什麼東西讓他自動跑起來的。

首先檢查了一下 kdm 的所有 script,還有 .xsession、.xprofile 之類的地方有沒有誤跑 gcin,似乎都沒有看到;接下來試著不要用 kdm,直接用 root 跑 twm 看看。嗯,這樣執行似乎不會自動跑起來,不過如果用 root 直接跑 kde 的話 gcin 又出現了。

然後試了一下把 /usr/local/bin/gcin 砍掉看看,結果 kde 完全開不了,錯誤訊息抱怨說找不到 /usr/local/bin/gcin。好,既然已經知道把整個 gcin 套件砍掉的話可以打開 kde 而且不會有錯誤訊息,那就一個一個把 gcin 套件會安裝的東西砍掉直到他不靠北這個錯誤訊息為止,這樣就知道是哪個東西會讓系統想要把 gcin 叫起來了。

最後發現是 qt im module 造成的,這很合理,不管是 kdm 或是直接執行 kde 都一定會用到 qt,然後 qt 發現有 gcin 的 qt im module 手癢就去載入他,所以每次都會看到 gcin 被載入……

所以最後解決方法很簡單,安裝 gcin 套件時不要選 QT_IM_MODULE 他就不就不會自已跑出來了。 (有用到 qt im module 的話… 再說吧)

[華語] cmn-TW

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

自動清理目錄的設定

[]

自 Mac OS X Leopard 有「下載目錄」功能開始,下載的東西緊放落去就可以了毋使愁講要放到哪邊。毋過東西一多就是麻煩,是講有些東西看過就算了也沒想要留下來,又沒想緊用手動的方式來清這些檔案,就想寫一個簡單的程式給電腦定時去檢查,放超過時間就把他刪掉,按呢就毌使自家動手來清了。本成我就有佇 FreeBSD 做同樣的事情了:有一著分大家共用的暫存目錄,東西放超過兩禮拜就會被系統用 find –delete 自動清掉,逐日半夜會清一次。

不過按呢有一著沒顧到的地方:這著目錄的圖示 (Icon) 還有語系設定檔 (.localized) 是講沒一定時間沒去摸他一下,系統就會覺得這放太久要把他刪掉。 .localized 還好處理,就清理目錄前先摸他一下就好了; Icon 就麻煩了,他不是正經的一著檔案,摸他沒用;喊 find 毋要刪掉名仔是 Icon 是可以啦,不過裡背也還有名仔也是 Icon 的檔案就會共下留下來了,按呢不理想。

後來想到可以用 file flag 來標記沒想刪掉的檔案,本成想要用 uchg,試驗了一下發現可以用,毋過按呢其他的人就改不得有標記過的檔案,會較麻煩一些仔。後來想到 nodump 沒用到 (這下不是用 dump 備份的時代了),啊又堵堵好暫存目錄本成就毋使備份,正經有用到 dump 功能的時節也不使擔心。

用 chflags 可以設定 flag,檔案產生那下就有 dump 的屬性,所以設定成 nodump 就做得了。
 
chflags nodump ~/Downloads/.localized
chflags nodump ~/Downloads/Icon

過來用 find 可以找到什麼檔案有 nodump 這著屬性,”+”,定對(?)要加,毋是講有兩種屬性 (像:nodump, hidden) 就會找不到了。

find ~/Downloads -flags +nodump

改寫一下,就可以清掉放超過 1 著月的檔案又毋會清掉 nodump 的檔案。 過來就放 /etc/crontab 沒就 /var/cron/tabs 裡背給他跑就可以定時清理了 (要多久清一道可以自已去設定)。

find ~/Downloads \! -newerct '1 month ago' \! -flags +nodump -delete

[客家語] hak-Hant-TW

Posted in FreeBSD, Mac. 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 »

VMWare 和 386BSD 的奇怪現象

[華語, cmn-Hant-TW]

之前有提到過用VMWare 開 FreeBSD 實體磁碟區會遇到的小問題,現在這個組合又遇到另一個超怪的現象了。 這次的情況是有其他的 Guest OS 要用 FreeBSD 磁碟區前面的實體磁碟區 (有兩個,分別是 fat32 和 ntfs),把 VMWare 的虛擬磁碟對應設好之後,一跑就會吃到這個錯誤訊息:

Cannot open disk "S:\Virtual Machines\test\physical.vmdk" or one of the snapshot disks it depends on.

進去看 log 之後發現錯誤訊息是長這樣子的:

Jun 24 09:21:46.216: vmx| Partition:Invalid slice magic number.
Jun 24 09:21:46.216: vmx| DEVCREAT: Unable to read partitions from device
Jun 24 09:21:46.216: vmx| DISKLIB-LIB   : Sanity check failed!
Jun 24 09:21:46.218: vmx| DISKLIB-LIB   : Failed to open 'S:\Virtual Machines\test\physical.vmdk' with flags 0xa (The specified device is not a valid physical disk device).

無論 FAT32 或是 NTFS 都一樣,而 FreeBSD 的那塊倒是可以正常讀取。 再繼續試了幾種設定都不成功之後,就決定狠下心來備份重灌做實驗了。 首先是砍掉最後面的那塊 FreeBSD,結果砍掉之後 VMWare 就讀得到前面的那兩塊了。 接著在砍掉的地方建立了一塊新的 NTFS 磁碟區,試一下確定三塊都可以正常使用,這時候心想可能是原來的 FreeBSD 磁碟區有問題,那就重灌一個新的 FreeBSD 吧。

重灌 FreeBSD 之後再把 VMWare 設定好,靠腰,跟原來的情況一模一樣,該不會是 VMWare 和 FreeBSD 的磁碟區八字不合吧? 這時候心裡就浮現了一個念頭:如果是假的 FreeBSD 磁碟區不知道會怎樣? 在網路上找到一個可以修改磁碟區類型的小工具 – MBRwizard! 來做實驗:首先建立一個 NTFS 的磁碟區,確認 VMWare 可用之後,接著用 MBRwizard! 把這個磁碟區的類型從 NTFS (0×07) 改成 386BSD (0xA5),再重設 VMWare 虛擬磁碟之後發現…… 這 樣 就 不 行 了! 而且把類型改回來 VMWare 就讀得到了,改成其他的類型也都沒問題,所以搞了半天真的是 VMWare 和 FreeBSD 的磁碟區不合,真是的。 因為不合所以 FreeBSD 不能用那就算了,沒想到居然是 FreeBSD 可用,反而是旁邊的其他磁碟區不能用,這就不知道該如何去解釋了,也許 VMWare 在遇到 386BSD 類型 (0xA5) 的時候,會做一些什麼特別的事情造成誤判吧? 

再進一步的實驗發現其實改磁碟區類型是不需要重新設定 VMWare 的 (一般情況 VMWare 在實體磁碟區有變更的時候會發出警告要求重新建立一個對應實體磁碟區的虛擬磁碟,但這種情況不會)。 在 NTFS 類型 (0×07) 的情況下可以用的磁碟區,改成 386BSD (0xA5) VMWare 依然可用,那理論上只要建立虛擬磁碟的時候不要出現 386BSD,等設定好 VMWare 之後再改回來就可以解決問題。 所以接下來的實驗就是安裝 FreeBSD,然後在 Windows 下用 MBRwizard! 把他偽裝成其他類型的磁碟區,然後看 VMWare 吃不吃。結果真的沒問題! 當然,偽裝過的 FreeBSD 是沒辦法開機的,要再改回來才能使用。 把磁碟區類型改回來但不重設 VMWare 的虛擬磁碟,哈,果然可以! 現在那顆硬碟上不只 FreeBSD 可以正常使用,其他的磁碟區也可以正常讀取了。

所以結論就是:同一顆硬碟上如果同時有 FreeBSD 和其他的磁碟區,在建立 VMWare 的虛擬磁碟前,先用 MBRwizard! 把 FreeBSD 的磁碟區偽裝成別的,等所有的磁碟區對應都設好之後再把 FreeBSD 用的那塊改回 386BSD 類型即可,然後王子和公主就可以繼續過幸福美滿的日子了。