project patch

diff 和patch是在opensource project常常用到的工具,這裡介紹一下流程和用法

* 建立project

myproject
-> config -> address.inc
-> main.c

* 修改project

> cp -rfv myproject myproject.orig
> cd myproject (開始進行修改)

* 建立差異檔 use diff

> cd .. (離開myproject目錄,此時可看到myproject 與myproject.orig兩目錄同時存在)

此時分辨一下 myproject 是修改完,所以是新的,而myproject.orig則是舊的

> diff -urN myproject.orig myproject > myproject.patch (注意,是從舊到新,不能寫反)
> cat myproject.patch 看一下內容
diff -urN myproject.orig/doc/README myproject/doc/README
--- myproject.orig/doc/README 1970-01-01 08:00:00.000000000 +0800
+++ myproject/doc/README 2011-11-03 18:19:15.000000000 +0800
@@ -0,0 +1 @@
+this is a diff,patch test
diff -urN myproject.orig/main.c myproject/main.c
--- myproject.orig/main.c 2011-11-03 18:18:25.000000000 +0800
+++ myproject/main.c 2011-11-03 18:18:41.000000000 +0800
@@ -1,6 +1,8 @@
#include
+#include

int main()
{
puts("hello world");
+ return 0;
}


* 將myproject.patch分享給別人讓別人套用更新

當其實使用者拿到此patch檔的時候,他將要為他的myproject打上更新,因此在目錄下會存在
home
-> myproject/
-> myproject.patch

與我們建新patch時相同的目錄結構

* 打上myproject.patch更新

> patch -p0 < myproject.patch

* 注意

經過以上流程就已可以打上更新了,但是常常有人會失敗,可能的原因有目錄 錯誤或是-p?路徑不正確,建議使用者可以看一下myproject.patch檔案內容

+++ myproject/doc/README 2011-11-03 18:19:15.000000000 +0800

我們要將舊的myproject更新成新的,因此若要使用-p0的話那myproject.patch目錄下也要存在有一個叫myproject目錄,如此可以正確的打上patch

send-pr log

send-pr -a epdfview.patch

To: FreeBSD-gnats-submit@freebsd.org
From: Anati Chang
Reply-To: Anati Chang
Cc:
X-send-pr-version: 3.113
X-GNATS-Notify:


>Submitter-Id: current-users
>Originator: User &
>Organization:
>Confidential: no
>Synopsis: [PATCH] graphics/epdfview: fix wrong color
>Severity: non-critical
>Priority: low
>Category: ports
>Class: update
>Release: FreeBSD 8.2-STABLE i386
>Environment:
System: FreeBSD cse.tw 8.2-STABLE FreeBSD 8.2-STABLE #6: Wed Oct 5 11:51:25 CST 2011 gaod@cse.tw:/usr/obj/usr/src/sys/GENERIC i386



>Description:
PDF document will get wrong color, when poppler-glib update to 0.18.0.
apply this thread http://trac.emma-soft.com/epdfview/changeset/367
>How-To-Repeat:
apply this patch
>Fix:

快速建立 FreeBSD 無線網路連線

Quick Wireless Setup On FreeBSD

Scripting Language 語法對照表

寫過多種程式的人,如果不常常使用,一定常常會把語法格式寫錯,今天找到一個很好的網站,它整理了各種常用的scripting language並將它語言特性做了整理,方便查詢

http://hyperpolyglot.org/scripting

update desktop cache

在偶然的過程中,發現freebsd會有軟體安裝先後順序的問題,可能會發生檔案無法由某特定軟體開啟,但明明已經安裝了,另外又有可能某軟體升級了,但是圖示卻出不來,這都是因為部份軟體為了求快,而gtk會將這些資料做成cache方便取用,然而每個ports的管理者也許會忘記更新系統內的圖示或軟體對應的快取,因此有些時候自己手動來比較快。

* 更新軟體對應快取(針對.desktop檔案)主要產生mimeinfo.cache

# update-desktop-database (預設路徑為 /usr/local/share/applications系統路徑)
> update-desktop-database ~/.local/share/applications (更新使用者自己的.desktop檔案快取)

* 更新軟體對應圖示快取(針對軟體的icons)主要產生icon-theme.cache

# gtk-update-icon-cache -f /usr/share/icons/hicolor

Bind9 dns server

在bsd中如果要架設dns server是非常方便的事情,因為內建就有bind9,因此險只要經過一些動作就可以輕鬆架設dns,不過這裡不解釋dns的架構與學理的討論

通常dns最少都會有兩台為了防止查不到的情況,因此這裡以master/slave架構來介紹這兩台機器如何共同運作,假設機器有140.114.3.83與140.114.6.93兩台來說

* 140.114.3.83 master 設定bind9

# cd /etc/namedb/
# cp named.conf named.conf.back (先備份起來,免得改壞了)
# vim named.conf

// listen-on {127.0.0.1;}; (要註解掉,因為預設只允許本機查詢)
include "named.conf.my_config" (將自己做出來的設定檔用include方法加入)

# cd /etc/namedb/working/
# vim named.conf.my_config (因為在named.conf裡面有指定directory的關系所以要放在working目錄下才讀的到)

zone "arkbsd.org" {
type master;
file "master.arkbsd.org";
allow-transfer {
140.114.6.93; (允許的slave機器)
};
};

# cd /etc/namedb/working/
# vim master.arkbsd.org (開始要寫zone檔了)

$TTL 86400
@ IN SOA dns1.arkbsd.org. femc7488.gmail.com. (
2011052001 ; serial
8H ; refresh (8 hours)
2H ; retry (2 hours)
1W ; expire (1 week)
1D ; negative cache (1 day)
)
IN A 140.114.3.83 ; arkbsd.org 正解ip
IN NS dns1.arkbsd.org. ; master dns1
IN NS dns2.arkbsd.org. ; slave dns2
dns1 IN A 140.114.3.83 ; dns1.arkbsd.org 正解ip
dns2 IN A 140.114.6.93
www IN CNAME arkbsd.org. ; www.arkbsd.org為arkbsd.org的alias
ftp IN CNAME arkbsd.org.
aria IN A 220.134.30.214
tifa IN A 140.114.6.93
movie IN A 114.34.131.23
locker IN A 140.114.6.114


# echo 'named_enable="YES"' >> /etc/rc.conf
# /etc/rc.d/named start (之後可以看一下在/var/log/message中有沒有錯誤)

* 140.114.6.93 slave 設定bind9

# cd /etc/named/
# cp named.conf named.conf.back (一樣先備份)
# vim named.conf

// listen-on {127.0.0.1;}; (要註解掉,因為預設只允許本機查詢)
include "named.conf.my_config" (將自己做出來的設定檔用include方法加入)

# cd /etc/namedb/working/
# vim named.conf.my_config (因為在named.conf裡面有指定directory的關系所以要放在working目錄下才讀的到)

zone "arkbsd.org" {
type slave;
file "slave.arkbsd.org";
masters {
140.114.3.83;
};
};

在slave機器中不需要編輯slave.arkbsd.org的zone檔,因為它會由master來提供

# echo 'named_enable="YES"' >> /etc/rc.conf
# /etc/rc.d/named start (之後可以看一下在/var/log/message中有沒有錯誤)

* 設定完後的工作

當設定完當然要看看有沒有正常運作,我們可以透過dig這個命令來查看看是不是可以查的到
# dig arkbsd.org @127.0.0.1
# dig www.arkbsd.org @127.0.0.1
# dig -t ns arkbsd.org @127.0.0.1
# dig dns1.arkbsd.org @127.0.0.1
# dig dns2.arkbsd.org @127.0.0.1

另外如果正常運作的話 slave中的zone檔會自動透過同步路產生,也可以檢查一下是否存在
# cd /etc/named/working/ (看看在6.93那台上有沒有存在slave.arkbsd.org)

如果一切都正常的話,就可以將dns代管那邊改為自管,並將dns指向dns1, dns2
之後過一段時間我們可以使用
# dig arkbsd.org @168.95.1.1
查詢結果如果有正確指向我們要的機器的ip的話就代表成功了,如果簡單的dns只需要正解的功能,而反解的話需要上層的設定,除非自己有一個網段下的ip否則可以不用設

找出目錄下所有壞掉的symblic link

找出壞掉的s-link

find . -type l | perl -lne 'print if ! -e'

配合xargs 做刪除動作

find . -type l | perl -lne 'print if ! -e' | xargs rm -rf

geany 基本設定

一般
->startup->project files 刪掉
介面
->show sidebar 不勾
->顯示符號列表 不勾
->show documents list 不勾
->字型Editor: Bistream Vera Sans Mono Roman 10
工具例
->Icon Style-> Images Only
->Icon Size->Very Small icons
編輯器
->Indentation->Type->Spaces
->Auto-indent mode->basic
->Display->Long line marker->Enabled 不勾
keybindings
->自動補完文字 刪除
->開啟訊息視窗 F12

jpg to pdf

在unix下有一個很好用的工具叫ImageMagick它能處理各種格式的轉換,而如果想要將許多的照片壓成一本相本給人家看的話,那輸一出PDF格式在試合不過了,而這個工具就可以讓你簡單的就做到這個工作。

$ convert *.jpg ok.pdf

xrandr dual monitor

一般來說要設定雙螢幕的話要透過xorg.conf,在/usr/local/etc/X11/下的一個設定檔,簡單以nvidia原生的軀動和xf86的nv來比較好了,對於nvidia原生的軀動可以透過nvidia-driver來安裝,之後再load kernel module就好了,之後就是需要透過nvidia-settings這個工具來幫我們編輯設定我們的xorg.conf,這樣可以完成設定,另外的話可以由xrandr來動態的設定,但目前就我知道,好像nv才行原生的軀動的話不行。

* 先列出目前有多少個輸出裝置

$ xrandr -q
如果沒意外的話應該會看到有DVI0 VGA1 VGA2這樣的裝置代號

* 設定雙螢幕

$ xrandr --output VGA1 --mode 1024x768 --output VGA2 --mode 1024x768 --right-of VGA1
以我的電腦來說我接了兩個VGA的螢幕所以我有VGA1 VGA2我將兩個大小都設成1024x768之後在指定VGA2在VGA1的右邊

--output 輸出裝置如VGA1 DVI0
--mode 輸出的解析度如1024x768
--right-of 輸出裝置如VGA1

* 設定虛擬桌面大小

如果沒意外的話,應該會出現一個錯誤讓你無法設定,那就是虛擬桌面的大小沒有支援到超過單一個螢幕大小,但是這是可以修改的,重新打開xorg.conf之後找到SubSection "Display"之後改成

  Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
Device "Configured Video Device"
SubSection "Display"
Virtual 2048 768
EndSubSection
EndSection

這樣就可以正確的透過xrandr來設定了,xrandr還可以動態的改成許多不同的顯示方式如mirror就是一種。

xcompmgr

在X環境中最如果要達成視窗有的透明卡,看起來會比較炫,但沒什麼用的時候,這個軟體xcompmgr很好用,以下是它的一些使用參數

-r 由client端模糊的半徑值,預設為12。
-o 由client端的半透明值,預設為75。
-l 左邊陰影的偏移量,預設為-15。
-t 上面陰影的偏移量,預設為-15。
-I 淡入的時間,預設為0.028。
-O 淡出的時間,預設為0.03。
-D 淡入淡出的delta效果的時間,預設為10。
-c 由client端描繪出模糊的邊框。
-C 避免陰影繪到dock、panel windows。
-f 淡入淡出、退出和打開效果。
-F 淡入淡出的半透明效果。
-n 由普通的client支持透明。
-s 由server開始繪製。

如果有興趣的人可以玩看看我,貼上我使用的參數

xcompmgr -c -o.5 -r4 -l-5 -t-5

portmaster upgrade by packages

如果有一天你有很多台機器,雖然其中一台常常在升級,但是其它台都很少在管理,如果要快速升級的話,最快的就是透過package來升級,不然每台都做編譯的動作非常浪費時間。因此這裡提供一些動作當參考,可以加速ports的升級。

1. 選一台source機,以後都專門做package的機器,並將所有的ports升到最新

# cd /usr/ports && make update fetchindex
# portmaster -a

2. 將機器上所有的ports都做成package

# setenv PACKAGES /tmp/ports_package (將所有的ports做出來的package放在/tmp/ports_package中)
# portmaster -t -y --clean-distfiles (把所有舊有的distfile都清掉)
# portmaster --check-port-dbdir (把沒安裝但留在系統中沒用的所有舊的port config目錄清掉)
# portmaster -afF (指定所有ports且先將所有的distfiles抓完、強制執行)
# portmaster -afg (強制重編所有的ports並且建立package,千萬要記得-g不然都白做了,根據ports的流程,若要建立package的話編譯是必須的,沒辦法由系統直接打包)

之後portmaster就會開紿跑相依性並將所有的ports全都重編且重新安裝,同時會做成package放到之前我們定義的目錄/tmp/ports_package中,不過這過程就要看系統安裝多少ports的複雜度來決定時間,如果你使用的是xterm的話在title bar中會顯示已經完成了多少ports,另外如果不幸中斷的話,可以重新執行最後一行指令,並加上-R讓它將接著下去,而不是全部重做

3. 建立ports index並放入/tmp/ports_package

因為軟體都有使用到portconf做客製化,因此相依性的部份和用fetchindex抓下來的INDEX-8會有些差異,如果要由package來升級的話,portmaster必須要參考此檔來決定那些要升級,因此我們要由目前ports狀態下做出目前的port index

# cd /usr/ports && make index (建立port index INDEX-8)
# mv /usr/ports/INDEX-8 /tmp/ports_package
# cd /tmp/ports_package && bzip2 -z INDEX-8

這個時候ports_package目錄應該為

-INDEX-8.bz2
+ALL
+Latest
+....
+....

4. 將ports_package目錄做成web目錄

總之就是建立一個http,並將目錄指向ports_package。比如我開了一個帳號叫srvupgrade,並將所有的ports_package資料都放在public_html之中,架構為
/home/srvupgrade/public_html/INDEX-8, ALL, Latest而且對外必須要能存取如http://140.xx.3.xx/~srvupgrade/INDEX-8可以取的到index,而http://140.xx.3.xx/~srvupgrade/ALL可以看的到所有的套件的符號連結

5. 在要升級的client端先修改一些參數將package升級導向我們的伺服器

# mkdir /tmp/upgrade_package && setenv PACKAGES /tmp/upgrade_package (將package指定到其它地方不要和系統的目錄搞在一起)
# setenv MASTER_SITE_INDEX http://140.xx.3.xx/~srvupgrade/ (自己做出來的INDEX-8的網址)
# setenv INDEXDIR /tmp/upgrade_package (下載index之後放在/tmp/upgrade_package中)
# setenv PACKAGESITE http://140.xx.3.xx/~srvupgrade/Latest/ (指定package要去我們的server上抓)

如果不希望每次都設定的話,就寫入.cshrc吧!

6. client端開始只使用package升級,而不用到ports

# portmaster --index-only --packages-only --delete-packages -a

會先下載INDEX-8並存在/tmp/upgrade_package中之後檢查那些軟體需要升級,之後會透過我們指定的PACKAGESITE去我們自己的server上下載回來放在/tmp/upgrade_package,最後升級完成後順便將下載回來已經升級完的package刪除。

如果每台機器所裝的軟體都一樣的話,那上面這種方式非常的方便,但是如果這台client還裝了其它的軟體的話,因為server上沒有編,而所做出來的INDEX-8會記錄這些其它軟體也需要升級,所以在升級的過程中我們不能只使用--packages-only,因為一定會有軟體在server上沒有編,所以這些不大的軟體,我們可以由client自己編譯升級,一樣會大幅的減少升級時間

# cd /usr/ports && make update fetchindex (先更新整個ports)
# portmaster --packages --delete-packages -a (以ports為基礎,如果沒有package版本一樣的話,就由client自己編譯)

7. client最後將一些不需要的資料清掉

# portmaster --clean-distfiles (將系統沒安裝或是用不到的distfiles清掉)
# portmaster --clean-packages (將系統沒安裝或是用不到的package清掉)
# portmaster --check-depends (整理所有ports的相依性看有沒有任何的錯誤)

* 結論

當然做出來的package不但能用來升級,如果有新機器要快速建立的話,直都都透過pkg_add來裝就非常的快
透過這種方式升級會更方便且快速,但是做成package來裝的穩定性和相依性比不上由ports來要好,所以除非希望方便升級或是希望要非常快就可以安裝或升級,再用此方法會更好。

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