2009-06-06

[心得] 在 freebsd 上使用 binary packages

轉錄自:[心得] 在 freebsd 上使用 binary packages

作者:chwong

最近拿到一台機器,裝了 FreeBSD 7.2,由於機器記憶體很少編譯會非常慢,所以嘗試了用官方現成編好的 binary packages來安裝軟體。以下是一些心得,可能有些不妥之處,還請大家提醒。

  • Step1: 設定環境變數 PACKAGESITE
    這裡是要設定到哪抓 PACKAGE,大致的設定方法是
    (csh) setenv PACKAGESITE ftp://ftp.tw.freebsd.org/pub/FreeBSD/ports/`uname -p`/packages-7-stable/All/
    (sh) export PACKAGESIT=ftp://ftp.tw.freebsd.org/pub/FreeBSD/ports/`uname -p`/packages-7-stable/All/
    Ps. 這裡使用 packages-7-stable 的理由是希望儘量使用新版軟體。7 表示 version 7,stable 則會有比較新的軟體
  • Step2: 利用 pkg_replace 安裝軟體
    在這我用 pkg_replace (ports-mgmt/pkg_replace) 作為套件輔助的工具,安裝軟體的方法很簡單:
    pkg_replace -NP category/name
    N 表示 new port/package,P 表示採用 binary package
    Ps. 由於 portupgrade 太慢,portmaster 看似不支援binary package,所以我用 pkg_replace
  • Step 3: 此時會有下列幾種情況:
    Case 1: 安裝順利成功
    當這個 package 不 depend on 其他的 packages 或是所有 depend 的 packages 都已經安裝了,並且在 ports 中對應版本的 package 在 ftp server 上找得到。恭喜! 結果像 log1

    Case 2: 下載不到 package 而失敗
    當這個 binary package 在伺服器上找不到的時候,會出現這個情況,此時直接連上 ftp server,找尋目前最新版本,利用 pkg_add -r 安裝 (此時直接寫軟體名+版本號,不要加 catelog) ,範例在 log2

    Case 3: 下載到 package 卻安裝失敗
    當這個 packages 有 depend 到的 package 未安裝的時候,pkg_replace 會安裝失敗,此時將同樣版本號的軟體利用 pkg_add -r 安裝即可 (直接寫軟體名+版本號,不要加 catelog),pkg_add 會幫你下載需要的 packages 一併安裝。範例見 log3

    利用上面的方法,我已經可以處理大多數的軟體安裝了。(有些軟體不加 option 自己編會不好用的例外)
    之後需要做軟體更新的時候,只要 pkg_replace -P package-name (或者 pkg_replace -aP 升級所有軟體) 就好。但值得注意的是發生 dependency 改變的時候,升級軟體會失敗,這時候就得觀察缺的package是哪些,另外用 pkg_replace -NP 或者 pkg_add -r 加進來,才能夠正確升級。

    最後補充說明:
    pkg_replace 若是升級到 0.9.0 (RC2) (20080129) 貌似可以避免掉 case 3 的問題,但 ports 裡頭的資料還沒更新,等更新之後應該就只剩下 ftp server 沒有最新 package 的時候才需要用 pkg_add 先裝舊版頂著用了。

  • 2009-04-01

    [硬體] QLOGIC QLE2460

    原文在:[硬體] QLOGIC QLE2460 @ PIXNET Lab

    前陣子公司進了台 RAIDBOX,uplink是接光纖的,所以廠商拿 QLOGIC QLE2460 來給我們測試合不合用,上面的控制晶片型號是 ISP2432。



    QLE2460 有兩種版本,右邊晶片上面標 SINGAPORE(亮的)是比較早期的版本,左邊比較近期標的就是 CHINA(黑的),目前用起來還沒發現有什麼差異,晶片的發熱也不會太強而有力,機殼內的空氣對流有弄好應該就不會過熱。

    在 FreeBSD 上,device isp 在 6.3-RELEASE 以後開始有支援,而且還有 device ispfw 這個 firmware module 可以硬上韌體比較舊的卡。

    我們家的機器是 7.1-RELEASE,用 /boot/loader.conf 的方式載入 isp 和 ispfw:
    isp_load="YES"
    ispfw_load="YES"

    開機有顯示 ispfw 有提供以下 isp 的 firmware:
    kernel: registered firmware set <isp_1040>
    kernel: registered firmware set <isp_1040_it>
    kernel: registered firmware set <isp_1080>
    kernel: registered firmware set <isp_1080_it>
    kernel: registered firmware set <isp_12160>
    kernel: registered firmware set <isp_12160_it>
    kernel: registered firmware set <isp_2100>
    kernel: registered firmware set <isp_2200>
    kernel: registered firmware set <isp_2300>
    kernel: registered firmware set <isp_2322>
    kernel: registered firmware set <isp_2400>

    然後抓到卡片:
    kernel: isp0: <Qlogic ISP 2432 PCI FC-AL Adapter> port 0xc800-0xc8ff mem 0xfdcfc000-0xfdcfffff irq 16 at device 0.0 on pci5
    kernel: isp0: [ITHREAD]
    kernel: isp0: Board Type 2422, Chip Revision 0x2, loaded F/W Revision 4.0.20

    因為我們拿到的卡上面的韌體是 4.00.30,不需要 ispfw 來蓋掉,所以在 /boot/device.hints 加上:
    hint.isp.0.fwload_disable="1"
    (直接拿掉 ispfw_load="YES" 會看到 isp 叫找不到 ispfw 的訊息)

    所以重開機抓到的訊息就變成:
    kernel: isp0: Board Type 2422, Chip Revision 0x2, resident F/W Revision 4.0.30

    之後也順利抓到 RAIDBOX:
    kernel: pass0 at isp0 bus 0 target 0 lun 0
    kernel: pass0: <STORAGE RAID 1.0> Fixed Direct Access SCSI-5 device
    kernel: pass0: 400.000MB/s transfers
    kernel: pass0: Command Queueing Enabled
    kernel: GEOM: new disk da0
    kernel: da0 at isp0 bus 0 target 0 lun 0
    kernel: da0: <STORAGE RAID 1.0> Fixed Direct Access SCSI-5 device
    kernel: da0: 400.000MB/s transfers
    kernel: da0: Command Queueing Enabled
    kernel: da0: 8566784MB (17544774528 512 byte sectors: 255H 63S/T 1092111C)

    不過,開始把 da0 卯上來用之後,就會一直噴訊息出來:
    kernel: (da0:isp0:0:0:0): SYNCHRONIZE CACHE. CDB: 35 0 0 0 0 0 0 0 0 0
    kernel: (da0:isp0:0:0:0): CAM Status: SCSI Status Error
    kernel: (da0:isp0:0:0:0): SCSI Status: Check Condition
    kernel: (da0:isp0:0:0:0): ILLEGAL REQUEST asc:20,0
    kernel: (da0:isp0:0:0:0): Invalid command operation code: Command byte 0 bit 0 is invalid
    kernel: (da0:isp0:0:0:0): (da0:isp0:0:0:0): SYNCHRONIZE CACHE. CDB: 35 0 0 0 0 0 0 0 0 0
    kernel: (da0:isp0:0:0:0): ILLEGAL REQUEST asc:20,0
    kernel: (da0:isp0:0:0:0): Invalid command operation code: Command byte 0 bit 0 is invalid
    kernel: Unretryable error

    翻了幾下 mailing list,看來是這個 RAIDBOX 不支援 SYNCHRONIZE CACHE 的指令,不是卡片的問題,只好等廠商升級 RAIDBOX 的韌體,看看能不能改善這個狀況。

    --
    其實我們總共拿到三張卡在做測試,除了一張韌體是 4.03.01 以外,其他都是 4.00.0x 的版本。

    初步測試的時候,有一張 4.00.0x 是開機就偵測不到 RAIDBOX,先放棄,然後發現 4.03.01 不會噴上面那一堆 ILLEGAL REQUEST 的訊息!當時還不確定 RAIDBOX 不支援 SYNCHRONIZE CACHE 的指令,以為這一張是完美的解藥,就進行詳細測試。

    可是在詳細測試 4.03.01 後,發現這張卡不正常:(開機用 verbose mode 才看到下面這些訊息)
    kernel: isp0: Port Database Changed
    kernel: isp0: Firmware State <Config Wait->Ready>
    kernel: isp0: 2Gb link speed/s
    kernel: isp0: HBA PortID 0x0000ef N-Port Handle 0, Connection Topology 'Private Loop'

    明明是 4Gb 的卡,怎麼會抓成 2Gb,而且 HBA PortID 也是錯的,其他卡的正常訊息像這樣:
    kernel: isp0: Port Database Changed
    kernel: isp0: Firmware State <Config Wait->Ready>
    kernel: isp0: 4Gb link speed/s
    kernel: isp0: HBA PortID 0x000001 N-Port Handle 125, Connection Topology 'Private Loop'

    而且其他卡都能正確抓到 RAIDBOX,只有 4.03.01 的不會回報 pass0/da0 出來用,初步認為是 4.03.01 的韌體有問題,所以就請廠商把這三張卡都更新韌體到 4.00.30 版本。

    再次測試,原本有一張 4.00.0x 偵測不到 RAIDBOX 的卡恢復正常運作,連 pass0/da0 都有回報出來,而 4.03.01 降成 4.00.30 的卡還是一樣的錯誤訊息,後來判定這張卡應該是哪邊有故障,完全不能使用。

    所以現在上線跑的卡是 4.00.30 版本的韌體,依然努力地噴著訊息運作著。

    2009-03-26

    MFC 是這樣嗎(誤)

    13:33 < kenyao> freebsd 7 stable linux module 编译出错13:34 < kenyao> /usr/src/sys/modules/linux/../../i386/linux/linux_sysvec.c:In function 'exec_linux_setregs':
    13:35 < kenyao>
    /usr/src/sys/modules/linux/../../i386/linux/linux_sysvec.c:808: error:
    / '__LINUX__NPXCW__' undeclared (first use in this function)
    13:35 < kenyao> anyone meets that error ?
    13:43 < Guest33942> kenyao: me2
    13:45 < kenyao> Oh
    13:46 < kenyao> prerelease 不是更新很快的吗?我等了几天了还是这样!
    14:00 <@yhchan> kenyao: 再更新看看吧,試試看 jhb@ 的 r190418
    14:41 < kenyao> I direct merge the codes of linux module with 7.1release's,
    it works!
    14:41 <@vvlng> 7.1prerelease 比 7.1release 還早吧
    14:43 < kenyao> But i merge it with 8-current, more errors. linux.ko is not
    important for me.
    14:43 < kenyao> 我指7.2 prerelease
    14:44 <@vvlng> 你就專心用 7.1-RELEASE 吧
    14:59 < kenyao> 但现在可以用了,应该没什么问题。
    15:00 <@yhchan> MFC 是這樣嗎(歪頭)
    15:15 <@chinsan> XD
    15:30 <@knight> MFC 和 KFC 是什麼關係 *誤*
    15:31 <@S3pPoor> 麥當勞炸機, 肯德基炸機...
    15:37 < ceciltsai> 這解釋真是經典...*lol
    15:42 <@knight> 炸機還是炸 w|ng?
    15:42 * knight 逃

    2009-03-24

    make love (羞)

    今天有道友提到 make love 的訊息變了,特地測試了幾下。

    FreeBSD 6.1-RELEASE-p13 [~] [22:54/W6] make love
    make: don't know how to make love. Stop
    (這是一般會看到的訊息...)

    FreeBSD 7.1-RELEASE [~] [22:54/W1] make love
    Not war.
    (這個反應變了!)

    FreeBSD 4.11-RELEASE-p26 [~] [22:54/W11] make love
    "/etc/make.conf", line 0: Cannot open /etc/make.conf
    make: fatal errors encountered -- cannot continue
    (找不到套套的意思? XD)

    FreeBSD 4.11-RELEASE-p26 [~] [22:54/W11] gmake love
    gmake: *** No rule to make target `love'. Stop.
    (找不到教材的意思? XD)

    2009-01-18

    FreeBSD 版號後面的 p 與 # 意思

    ptt 的 osuer 問到了
    7.0-RELEASE-p3 FreeBSD 7.0-RELEASE-p3 #3

    7.0-RELEASE FreeBSD 7.0-RELEASE #0
    #後面的 數字是代表 使用新kernel 嗎

    關於這個 #p 可以看看 /usr/src/sys/conf/newvers.sh

    # 後面數字的初始值是 0,隨著每次重新 build 會累加次數
    也就是 echo `expr ${v} + 1` > version
    比方說打 expr 0 + 1 會得到 1

    p 後面的數字,簡單講代表共歷經幾發 SA patch 數
    舉個例子:
    2008-12-23 發佈了 FreeBSD-SA-08:13.protosw
    2009-01-07 發佈了 FreeBSD-SA-09:01.lukemftpd 以及 FreeBSD-SA-09:02.openssl
    2009-01-13 發佈了 FreeBSD-SA-09:03.ntpd 以及 FreeBSD-SA-09:04.bind

    先就 2008-12-23 的講,請看一下 FreeBSD-SA-08:13.protosw.asc
    裡面會有列出哪些已經是有修正過的版本 (Corrected)
    Corrected: 2008-12-23 01:23:09 UTC (RELENG_7, 7.1-PRERELEASE)
    2008-12-23 01:23:09 UTC (RELENG_7_1, 7.1-RC2)
    2008-12-23 01:23:09 UTC (RELENG_7_0, 7.0-RELEASE-p7)
    2008-12-23 01:23:09 UTC (RELENG_6, 6.4-STABLE)
    2008-12-23 01:23:09 UTC (RELENG_6_4, 6.4-RELEASE-p1)
    2008-12-23 01:23:09 UTC (RELENG_6_3, 6.3-RELEASE-p7)

    所以若原先你的是 RELENG_7_0 歷經這次 SA 的 patch 更新、compile、install 之後,會是 7.0-RELEASE-p7 才對,因為這是 7.0-RELEASE 出來之後所歷經的第七次 patch。

    而 2009-01-07 同日一起發佈的 SA-09:01.lukemftpdFreeBSD-SA-09:02.openssl 若你在這之後也再次循 RELENG_7_0 更新會是 7.0-RELEASE-p8 才對。

    同理 2009-01-13 同日所發佈的 FreeBSD-SA-09:03.ntpdFreeBSD-SA-09:04.bind 若你在這之後也再次循 RELENG_7_0 更新會是 7.0-RELEASE-p9 才對。



    而 FreeBSD SA 的命名規則是 SA-西元年度後兩位-該年度第幾發


    以上如有說錯之處,還請各方先進指正。