portmaster

在Freebsd上常用的兩套套件管理程式,大概就是portupgrade和portmaster但是portupgrade是透過ruby寫成的,而且需要額外的資料支援來記錄目前所有的ports內容,所以變成當ports有變動的話同時也要將pkgdb做更新的動作,雖然portupgrade所提供更多工具的支援但是速度就是比較慢,最近已經轉換為portmaster+portconf,因為portmaster沒有辦法單獨的設定一個套件需要的額外參數,所以透過portconf的支援,將不同的軟體需要的編譯參數都寫進去就可以做一個全域的管理了,這裡說明一下portmaster+portconf如何合作並使用。

* 架構說明
portconf -> 設定不同軟體編譯參數
make.conf -> 讀取portconf處理完的編譯參數,之後直接設定整個ports編譯過程follow這些參數
ports install (make install clean) -> 已follow所有make.conf各軟體所指定的編譯參數
portmaster -> 直接使用底層的ports升級或新增安裝,因此也會同時follow各軟體指定的編譯參數

* install portconf
# /usr/ports/ports-mgmt/portconf && make install clean
# vim /usr/local/etc/ports.conf (portconf的設定參數)
*: BATCH=yes | WITHOUT_HAL=yes | WITHOUT_DEBUG=yes | WITHOUT_GNOME=yes | WITHOUT_GCONF=yes | WITHOUT_KDE=yes | WITH_NLS=yes
editors/vim*: WITH_X11_ONLY=yes
x11/xterm: WITH_256_COLOR=yes

由此範例可以看出設定的方式很簡單,只要將你想要設定的ports name以path的方式表示,之後如果有多個版本像是vim有6, 7等等的版本,可以直接使用「*」來指定,之後就是加上一個「;」後面就是在ports的Makefile裡面的參數了,以vim來說,我要指定所有的vim版本都使用WITH_X11_ONLY這個參數,而如果有多個參數的話使用「|」來加入更多的設定就行了。
而在我第一行的設定中*: BATCH=yes | .... |.... 它的意思表示,所有的ports的編譯安裝都要符合這個全域的設用,所以我不指定路徑,而是直接使用「*:」來指定。

* install portmaster
# cd /usr/ports/ports-mgmt/portmaster && make install clean

那portmaster就是我用來取代portupgrade的ports管理器,它有非常多的參數可以設定,而也有設定檔可以指定常用的編譯參數。

* portmaster options

-C 防止每次升級或安裝新的ports時都先make clean

-G 防止每次升級或安裝新的ports時都要make config跳出選擇視窗

-H 不顯示編譯過程

-K 防止每次升級或安裝新的ports之後都做make clean

-B 防止升級時,將舊的套件備份起來(在portmaster升級流程中,會先將原套件備份起來以免新套件未成功安裝,但是裝完的時候就會將備份移除,備份檔會放在/usr/ports/packages/裡面)

-b 升級時,將舊的套件備份起來而不移除

-g 升級或是安裝新的套件時順便建立packages(一樣放在/usr/ports/packages/裡面)

-n 將所有的行程模擬跑過一次,但是不會真的編譯升級 (其實可以不用,因為最後都會問是否確認要升級)

-v 顯示更大量的資訊

-w 升級時,將舊的套件的share library備份起來放在/usr/local/lib/compat/pkg中,這個極為
重要,因為升級的時候,如果是share library bump跳版次的話,會造成系統中所有用到此函式庫的程式需要重新,若沒有重編會因ld連不到存在的函式庫而造成不能執行,先保留起來在打算是必要的

-f 強制執行編譯升級ports

-i 互動模式詢問,當升級套件很多的時候,會一個一個的詢問是否要升級安裝

-D 升級或移除ports的時候不要將用不到的distfiles砍掉

-d 升級或移除ports的時候自動將用不到的distfiles砍掉

-m 可以直接下參數給升級ports的時候編譯參數,但我們有portconf所以大概用不到了

-x 避免某個套件升級,當將ports全部都升級,但只有某幾個不想升的話,這個參數就用的到了

--no-confirm 默認執行,不要跳出任何需要管理者同意的資訊,建議不要開,會有點危險

--no-term-title 將你的termainal的title bar顯示為目前進行的進度關掉,預設是開啟的

-P 若網路上有可用的package版本的話,直接使用來加速安裝,若沒有的話則執行編譯

--packages-build 當升級或安裝軟體的時候,會有build dependency,所以會需要安裝automake或make這樣的ports來當成工具編譯需要的套件,但是往往都會浪費時間,所以提供了使用套件來將這些建立工具直接用package來安裝,可增加效能,同常會搭配--delete-build-only來用

--delete-build-only 將build dependency的套件建立完主要的ports之後就將這些工具移除了,同常搭配--packages-build來使用

--packages-if-newer 用packages來升或安裝,假設版本沒有跟上ports tree版本號的話也沒關系,一樣用舊一點的packages,但是仍然會比系統中已安裝的ports還要新

--always-fetch 不論是否有這個distfiles存在總是重抓一次

--packages-local 如果今天已取得所有需要安裝的ports且已經做成packages的話,可直接指定用這些package來裝,而不在上網去下載可用版本

--local-packagedir= 配合--packages-local一起使用,若不想和系統的packages放在一起搞混的話,可以將人做整個系統做好的package下載到一個你喜歡的目錄,假設為/tmp/mypkg則可以指定這個路徑,之後使用--packages-local參數來升級,就會以/tmp/mypkg的目錄,將所有的ports以packages的方式全部升級

-a 確認所有的ports有沒有必要升級,通常都要先做完ports tree cvs update

--show-work 來顯示某個ports它的相依性,還有那些沒有安裝,那些已經安裝

-o 將目前的某ports取代成另某ports,比如版本的轉換,將firefox換成firefox36

[R-] -r 重編所有相依到某套件上一層所有ports,通常ports version bump的時候就會這樣做了

-R表示若因某原因中斷,而加上此參數可以接續上次處理一次的流程接著處理完,而不重新執行

-l 列出所有目前安裝的ports並分類好

-L 列出所有目前安裝的ports分類好,且同時檢查是否要升級

--list-origins 列出目前所有上層ports在ports tree的原名

-F 只抓取新的distfiles而不做任何動作

-y 對所有執行的動作都回答yes

-e 移除某個ports且會自動運行-s將不在需要的ports一併移除

-s 移除不在需要相依的ports

--clean-distfiles 移除不在需要的distfiles,若有指定-d的話會自動移除

--clean-packages 移除不在需要的packages

--check-depends 確認目前所有的ports相依性,若有缺當的相依性的話,會顯示出來

--check-port-dbdir 確認目前在/var/db/ports下每個ports的設定,是否有過舊,或ports已移除而將不必要的port config也移除

* portmaster config
如果要將上面的設定都記得的話是件很麻煩的事,所以portmaster有提供一個設定檔在/usr/local/etc/portmaster.rc 可以從portmaster.rc.sample cp一份過來,以下是我常用的設定

NO_BACKUP=Bopt (不要保留已移除ports的備份檔)
ALWAYS_SCRUB_DISTFILES=dopt (不要保留舊有的distfiles)
PM_NO_MAKE_CONFIG=Gopt (升級或安裝時不要做make config)
PM_VERBOSE=vopt (每個portmaster顯示行為和過程)
SAVE_SHARED=wopt (保留已經移除ports的share library避免port version bump)


* portmaster Example

若不直接使用ports tree來安裝新軟體,也可以直接透過portmaster來安裝新的ports
# portmaster editors/vim (若vim軟體已存在的話會自動重裝蓋過,若有新版本的話會自動升級)

用portmaster來移除ports和不在被相依的ports
# portmaster -e portupgrade [-n|-y] (-e會自動呼叫-s做清除無用的ports,且會詢問是否執行)

用portmaster來升級所有的ports
# cd /usr/ports && make update fetchindex (更新ports tree)
# portmaster -a [-n|-y]

用portmaster來安裝或升級軟體,並同時建立package
# portmaster -g editors/vim

用portmaster來轉換其它版本的ports
# portmaster -o www/firefox36 firefox-4.0_1,1

用portmaster來清除無用的distfiles
# portmaster --clean-distfiles [-n|-y]

用portmaster列出目前所有套件並分類
# portmaster -l

用portmaster列出目前所有套件並以ports name來顯示
# portmaster --list-origins

用portmaster來檢查所有ports的相依性問題
# portmaster --check-depends

用portmaster來檢查並刪除舊有的port config
# portmaster --check-port-dbdir [-n|-y]

用portmaster來檢查並刪除舊有的packages
# portmaster --chean-packages [-n|-y]

用portmaster來安裝新ports,但避免時間的浪費,所以將build dependency用packages來裝,且之後這些build dependency的packages要刪除不要佔空間
# portmaster --packages-build --delete-build-only ports-mgmt/portupgrade

用portmaster來檢查新安裝一個ports還需欠有那些相依性要先裝
# portmaster --show-work ports-mgmt/portupgrade

用portmaster來安裝新的ports並看看有沒有packages可以用免得自己編譯浪費時間
# portmaster -P ports-mgmt/portupgrade (注意:這和 PACKAGESITE環境變數有關,不然會抓到的是和光碟版一同釋出的ports版本)

用portmaster全部升級所有ports,但是只有firefox和vim不升級
# portmaster -x firefox -x vim -a

如果某個ports發生ports version bump的話,需要重編所有相依到此ports的上層ports
# portmaster -r graphics/png

如果整個系統做跳版次的升級7.3r -> 8.2r 那麼必須將所有的ports全部重編
# portmaster -fa

* 結論
用了portupgrade差不多一年多了,轉換到portmaster之後覺整個升級流程速度快上很多,雖然portupgrade還是穩定一些,而且選擇更多,但是相對的portmaster比較簡單而且不需要額外的資料庫支援,因為後來發現portconf這個好物之後就直接換到portmaster了,原本只有在portupgrade裡面所用到的pkgtool.conf,而在portconf也可以做的到了。

Virtualbox 安裝過程

* 從ports來安裝

# cd /usr/ports/emulators/virtualbox-ose
# make install clean

* 裝完設定

# echo 'vboxdrv_load="YES"' >> /boot/loader.conf
# ceho 'vboxnet_enable="YES"' >> /etc/rc.conf
# pw groupmod vboxusers -m who_want_to_use_virtual_box

* usb支援設定

# pw groupmod operator -m who_want_to_use_virtual_box
# vim /etc/devfs.rules 加入以下設定
[localrules=10]
add path 'usb/*' mode 0660
表示將usb的device node設為operator群組都可以讀寫
# echo 'devfs_system_ruleset="localrules"' >> /etc/rc.conf

如果完成以上動作,只要建立vm的時候將usb controller開啟,那麼winxp啟動的環境下位於virtualbox視窗右下方有一個usb圖案,如果你有連結usb裝置的話,點選就會列出有那些usb裝置可以使用,只要點選了winxp就會偵測到有新裝置插入了

* 共用資料夾設定

當設好共用資料夾之後,要透過windows把這個共用資料夾當成網路磁碟來使用,因此我們要為此共用資料夾新增一個網路磁碟

start -> run -> cmd
C:\> net use z: \\vboxsvr\which_folder_want_to_share

* 直接啟動已建立的vm以xp為例

$ VBoxManage startvm winxp

ports downgrade

當ports軟體不穩定,或是有bug時我們都很期待開源工作者釋出修正,不過有時候為了急著用,所以可以用下面的方法把版本降回以前的版本先擋著使用

cd /usr/ports/sysutils/portdowngrade
make install clean
rehash
portdowngrade -o -s \\
:pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs lang/php4

Freebsd building package

如果需要讓別人安裝和自己系統一樣的軟體版本或是自己客制過的軟體的話,可以用以下的指令來建立一個套件庫

cd /var/db/pkg/ && find . -name '+CONTENTS' | xargs grep " ORIGIN:" | awk ' { match($1, "ORIGIN:"); print "portupgrade -fp -m \"BATCH=yes\" \"" substr($2,8) "\""; } ' > /tmp/all_pkg.sh

ibus add boshiamy input method

在ibus中安裝嘸蝦米輸入法網路上已經有非常多的解決方法,經過一些參考之後自己也整理了一份,若有需要的朋友可以直接下載

http://moon.cse.yzu.edu.tw/~s932361/bsd/ibus_boshiamy.tgz

※包含以下內容

liu.txt 所有字根拆碼表
liu.db 己產生可以給ibus用的字根表
liu.png 給ibus用的圖示

※安裝方法

# cp liu.db /usr/local/share/ibus-table/tables/
# cp liu.png /usr/local/share/ibus-table/icons/
重啟動ibus就完成了

※自己手動製作字根表

請參考 http://cmchao.pixnet.net/blog/post/26079454
備用載點 http://moon.cse.yzu.edu.tw/~s932361/bsd/ibus_liu_gen.tbz

而它所需要的table請從有安裝嘸蝦米的windows中將liu-uni2.tab liu-uni3.tab liu-uni4.tab liu-uni.tab找出來後並複製到ibus_liu_gen的目錄中,之後直接執行uni2txt.sh就可以一次完全轉完產生出liu.txt字根表,在透過以下指令產生出ibus可使用的字根表格式,就可以使用了

# ibus-table-createdb -s liu.txt -n liu.db

freebsd pkg_info

pkg_info是freebsd一個非常重要的指令,拿來查詢目前安裝的軟體,雖然man文件寫的很清楚,不過常用的幾個功能記錄一下

1. 查詢某一套件
> pkg_info -Ex gtk

2. 查詢套件相依
> pkg_info -rx py26-gtk

3. 查詢套件被相依
> pkg_info -rx py26-gtk

4. 查詢套件安裝資訊
> pkg_info -Dx virtualbox-ose

5. 查詢套件包含的檔案
> pkg_info -Lx virtualbox-ose

6. 查詢套件的說明
> pkg_info -dx pkg_tree

7. 查詢套件屬於那個ports
> pkg_info -ox virtual

8. 查詢某檔案屬於那個套件
> pkg_info -W libglx.so

9. 查詢某個ports安裝後為那個套件
> pkg_info -O ports-mgmt/pkg_tree

當然光有pkg_info工具不夠,所以通常大概會裝幾個關於管理的工具如
1. pkg_tree 了解套件之間相依性
2. portupgrade 裡面的集合的工具如pkg_deinstall pkgdb ....
3. bsdadminscripts 裡面集合的pkg_libchk ...

fontconfig command

介紹幾個X11上面對於fontconfig好用的指令

$ fc-cache -fv 更新目前字型資料庫,通常會先把xx.ttf搬到 ~/.fonts/下再執行
$ fc-list 顯示目前安裝的字體有多少個
$ fc-list :lang=zh 顯示目前安裝的字體屬於中文的有多少個
$ fc-match 查詢目前fontconfig幫你選到的字型是那個
$ fc-match -s 列出除了選到的字型外,其它後補字型的排序
$ fc-match -s sans-serif 列出選到無襯線字體的字型排序
$ fc-match -s serif 列出選到襯線字體的字型排序
$ fc-match -s monospace 列出選到等寬字體的字型排序

大約這幾個就夠用了,以下補充一下,在X11下因為中英文混雜,也許使用的中文字型內含的英文字太難看,或是根本沒有英文字型,所以會造成讓fontconfig選字上的困難,預設fontconfig會先看locale所以讀到若是utf8的話,會讓中文字型優先,因此會使用中文字型內含的英文字,因此如果要使用其它的英文字型的話,必須要讓英文優先順序先選,選完一定沒有中文字型,之後在來選中文字型,就可以讓好看的英文字母來配需要中文顯示的中文字型

$ vim ~/.fonts.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<alias binding="strong">
<family>sans-serif</family>
<prefer>
<family>Bitstream Vera Sans</family>
<family>AR PL New Sung</family>
</prefer>
</alias>
<alias binding="strong">
<family>serif</family>
<prefer>
<family>Bitstream Vera Serif</family>
<family>AR PL New Sung</family>
</prefer>
</alias>
<alias binding="strong">
<family>monospace</family>
<prefer>
<family>Bitstream Vera Sans Mono</family>
<family>AR PL New Sung</family>
</prefer>
</alias>
</fontconfig>

以上有看到使用到「 binding="strong" 」主要目的是讓fontconfig強制選字排序,忽略locale中要先選utf8的字型。