Grand Central Dispatch 試玩

[華語, cmn-Hant-TW]

因為開有多執行緒的需求,就研究了一下 mac 的 framework 有提供哪些東西可以用。初步看來就是傳統 pthread 跟 NSThread 可以用,不過 Thread 程式寫起來一向就很煩,所以就想找找有啥替代品可以用,後來就注意到 Mac OS X 10.6 (iOS 4)之後新加的 Grand Central Dispatch。

基本概念很簡單,就是把你要做的東西加進 queue 就好了。把要做的事情放在同一個 queue 的話他就會照順序一個一個執行,當然你可以開很多個 queue 同時跑,那就可以一次做很多事情,直到把系統榨乾為止。

首先要開一個 queue
dispatch_queue_t queue = dispatch_queue_create("cc.pighead.queue", NULL);

第一個參數可以隨便打,第二個參數在 10.6 沒用,10.7 以上才有用途。

然後把要執行的程式碼放進 queue 裡面
dispatch_async(queue, ^{
  printf("this is a block!\n");
});

裡面包住的東西叫 block,至於 block 是啥這邊先不管他,反正就是包在裡面的程式碼會被另外開一個執行緒來跑就是。

然後把他 sync 回來
dispatch_sync(queue, ^{});
最後 release 掉
dispatch_release(queue);

要同時跑很多的話就多開幾個就可以了,想開幾個就開幾個,在 sync 之前所有的 queue 都可以同時跑,如果有變數會共用的話記得用 lock 或是 @sychronized 這些的東西來控管,大致上就是這樣。另外還有 queue 群組跟 for loop 拆解成平行處理的用法,這次沒用到所以就沒特別去注意了。

話說 FreeBSD 上也是可以用 Grand Central Dispatch 的,用法也差不多,需要的是新一點的 kernel、llvm/clang 編譯器以及 devel/libdispatch 這個 port。

參考文件

A Simple Job Queue With Grand Central Dispatch

Multithreading and Grand Central Dispatch on iOS for Beginners Tutorial

Nullified Construction

Mac OS X (Cocoa) NSLock

GCD on FreeBSD

 

samba + bonjour

[華語, cmn-Hant-TW]

之前這篇有提到開 AFP 分享以及用 Model Name 偽裝成某種型號的 Mac 的方法,其實用同樣的機制也可以把 SMB 的伺服器包的漂漂亮亮的,而且多這層之後用戶端的 Finder 找分享的速度也會比較快,不管從美觀或實用的角度來看都是值得打開。和那篇一樣有 avahi 或 howl 兩種選擇,設定上也和那篇類似,只是把 AFP 的設定換 SMB 而已。 (SMB 伺服器當然要另外安裝,這邊假設 SMB 本來就通的,沒有的話去 ports 找 net/samba3x 挑一個來裝,samba 設定就不詳述了)

/usr/local/etc/avahi/services/smb.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>_smb._tcp</type>
<port>445</port>
</service>
 
<service>
<type>_device-info._tcp</type><port>0</port>
<txt-record>model=Xserve</txt-record>
</service>
 
</service-group>

smb.services 檔名一樣是可以自訂的,除了 type 要改成 _smb._tcp 外其他和 afp 的設定都相同,細節請參考 AFP 那篇

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

用 howl 的話那所有 service 的設定都會在這個檔案裡面,如果 AFP 已經開了的話就直接加上一行 SMB 的設定即可。

值得注意的是雖然平常 SMB 服務是用 139 這個埠,但是 Mac OS X 10.7 Lion 不吃這個埠的 SMB 分享,所以用 445 比較保險。

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

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 »

製作可開機的第一代 iPod Shuffle

[華語, cmn-Hant-TW]

(官網圖片)

初代 iPod Shuffle 在 2005 年登場時,除了體積小容量大沒螢幕外,還有一個很重要的特色 – USB 接頭 (所有其他的 iPod 都是 30pin 連接線),整隻就像一個稍大的隨身碟。後幾代 iPod Shuffle 的 USB 接頭就被移掉改成用轉接線接電腦,變得更輕更小沒錯,但是也比較不適合直接當隨身碟,要當隨身碟的話還是初代好用。

手上那隻很久沒拿來聽歌 Shuffle,任務就是當救急隨身碟,也算蠻稱職的。後來想說有沒有機會讓他可以 USB 開機,但是又能保留既有的播放功能,包括和 iTunes 同步等等,研究了一下在 FreeBSD Forum 看到了 Making DOS bootable USB hard disks 這篇,照這做確實可以做出 FAT 然後用 DOS 6.22 開機,但是 iTunes 就抓不到了,因為 iTunes 要的是 FAT32,當然我們可以用那篇的做法下參數讓他格式化成 FAT32,不過這樣就變成 DOS 6.22 不能開機,iTunes 抓得到,總之兩個不對盤就是,不過從這幾次格式化再復原的經驗得知,分割區長怎樣並不是太重要,只要有 FAT32  iTunes 就滿足了,而且有備份 iPod_Control 目錄的話,重新分割完後把目錄直接丟回去還會還原到原來的樣子。

DOS 6.22 + FAT 不能動的話,也就只好找別的方案了。後來試了一下 FreeDOS  有成功,不過因為手上的 PC 剛好沒有光碟機,所以是在 Mac 下用 VMWare 把 iPod Shuffle 偽裝成實體磁碟才安裝進去,當然這樣子是沒辦法灌 boot manager 進 Shuffle 的,不過影響不大,FreeDOS 還是可以開機成功,只是說 AUTOEXEC.BAT 裡的磁碟機代號全錯 (通通是 C 因為灌的時候他以為是硬碟,實際上用 USB 開機會是 A),不過這種小問題手動修一修就解決,不會是太大的問題。

接下來的話,來試看看能不能讓他多重開機好了。

 

加上/移去 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 »

Dovecot LMTP

[華語, cmn-Hant-TW]

花了不少時間測試,終於讓 Dovecot LMTP 能正常運作了。會用 lmtp 的原因是 sieve 會用到,對於 sieve 來講 dovecot 有支援 lda 跟 lmtp 這兩種方式,評估了一下 lmtp 在非 virtual user 的環境比較簡單,所以就採用 lmtp 方案,用到的 ports 主要有:

  • mail/postfix
  • mail/dovecot2
  • mail/dovecot2-pigeonhole

在之前的嘗試中,不斷的遇到像是這樣的錯誤:

auth: passwd(whsyu@pighead.cc): unknown user
550 5.1.1  User doesn't exist: whsyu@pighead.cc (in reply to RCPT TO command))

這篇這篇有提到,問題是因為從 postfix 傳到 dovecot lmtp 的使用者名稱帶 domain,不過系統用的使用者名稱當然是沒有帶,所以要告訴 lmtp 使用者名稱的格式,不過照那兩篇的改法怎麼改都還是會吃到一樣的錯誤,不管是 pam 或是 ldap 認證結果都一樣。不過第二篇有提到 auth_username_format 這個參數,查了一下說明文件後發現 n 會把 domain 去掉,然後 L 會把大寫通通變成小寫,所以其實只要加 %Ln 就不會再吃那個錯誤,而整個設定就會變成這樣: (只列出和 lmtp/sieve 有關的部份)

/usr/local/etc/dovecot/dovecot.conf
auth_username_format = %Ln
protocols = lmtp sieve
service managesieve-login {
}
 
service managesieve {
}
 
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    group = postfix
    mode = 0660
    user = postfix
  }
  client_limit = 1
}
 
protocol lmtp {
  mail_plugins = sieve
}
 
plugin {
   # Used by both the Sieve plugin and the ManageSieve protocol
   sieve = ~/.dovecot.sieve
   sieve_dir = ~/sieve
}

關於 sieve 的部份,其實沒啥好設的,client_limit = 1 則是因為我們的系統還有 mbox (當初會用 dovecot 就是因為要讓 mbox 跟 maildir 和樂相處),而 dovecot 要求在有 mbox 的環境下一定要下這個參數,所以就把他加上去。

/usr/local/etc/postfix/main.cf
mailbox_transport = lmtp:unix:/var/spool/postfix/private/dovecot-lmtp

非 virtual user 的模式要加的是這個,如果是 virtual user 的話要用 virtual_transport,後面的檔案位置要跟 dovecot.conf 裡面的設定一樣才會動,設定完重開 dovecot 跟 postfix 之後應該就 ok 了。

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 »

sockstat, lsof

[客家話, hak-Hant-TW]

FreeBSD 下是講要看麼介 process 用了麼介 port,最簡單的方式就是 sockstat,毋過這隻是 FreeBSD 限定,Linux 下就做不得用了。好在還有其他替代方案: lsof

講實在的 lsof 主要不是拿來看開麼介 port 的,是拿來看 process 開了麼介檔案,是講也有看用了麼介 port 的功能就是。 lsof -i 就可以看到那隻 process 開了那隻 port,同 sockstat,也當方便啦。

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

kdemultimedia + alsa = build-error

[客家話, hak-Hant-TW]

有一台的 multimedia/kdemultimedia4 毋知哪下開始就編不過,毋過那台咩沒用到這邊的功能,就沒特別去看是什麼問題,就放著。後來有閒那下去看才知說是要編 kscd  時節,很像是尋不到 alsa 這種的問題,毋重新編過 audio/alsa-* 咩沒用,共樣編不過。 看一下別台有 kde 的有堵到共樣的問題沒,結局那台是根本就沒裝 alsa,按仔就是說 alsa 是沒一定要用到的, 正經反安裝 alsa 後這台就編過了,問題解決。

Posted in KDE. Tags: , . No Comments »

nvidia-driver 和 libglx

[華語, cmn-Hant-TW]

ports 裡面的 xorg 前一陣子終於更新到 7.5 了 ,啊找一天就給他整個升下去。

結果升完之後發現 KDE SC 特效只剩 xrender 可用,opengl 的選項失效了。查了一下 xorg 的 log 發現 nvidia 的 driver 是有跑起來沒錯,可是他在抱怨 glx 不能動,所以就從這邊出發去找解法。後來在這篇裡面瞄到了 x11/nvidia-driver 這個 port 會裝自己的 libglx 到 extension 裡面,也許是升級的時候又把 nvidia-driver 的那份蓋掉了。重新安裝一次 nvidia-driver 再試開一次 opengl 的選項也確實可以用,問題解決。

btw, xorg 升級到 7.5 之後似乎順非常多,就算用 xrender 跑那堆特效也不會有很強烈的遲滯感,整個 KDE SC 的介面反應速度快得讓人驚訝。當然了,資源還是一樣吃很兇就是,但是至少用起來爽度大增。

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