2007年7月21日 星期六

Jail in FreeBSD 5.3(下)

體驗完單人模式 jail, 那麼來把多使用者模式 jail 也跑起來吧。還有些 設定要做: 在主系統的 /etc/rc.conf 放一行:
ifconfig_lo0_alias0="inet 127.0.0.115/32"
這行是設定 jail 要用的 IP。一般是用 alias 的方式。 再加上這幾行:
jail_enable="YES"
jail_list="conair"
jail_conair_hostname="conair"
jail_conair_ip="127.0.0.115"
jail_conair_rootdir="/usr/jails/conair"
jail_conair_exec="/bin/sh /etc/rc"
jail_conair_devfs_enable="YES"
jail_conair_devfs_ruleset="devfsrules_jail"
上面這幾行是 FreeBSD 5.3 之後才有的設定。jail_list 是設定系統裡面 有那些 jail(s)。jail_xyz_hostname, jail_xyz_ip, jail_xyz_rootdir 是每個 jail (上述範例的 xyz 以 conair 代入) 單獨的相關設定, 依實際 情況而有所不同。jail_xyz_exec, jail_xyz_devfs_enable, 以及 jail_xyz_devfs_ruleset, 基本上是固定的, 不用更動。
Jail 設定
多使用者模式 jail, 就當一般的 FreeBSD 系統來設定吧! 照上述的方法進 入 jail 單人模式, 把以下幾個檔案設定好: /etc/hosts第 13 和 14 行, 該 jail 的 IP 和 hostname 要設好。 /etc/resolv.conf至少放 DNS server。 /etc/master.passwd這就是系統帳號存放的地方了。重點就是, 要新增一個可以遠端登入的 帳號。最簡單的方法是用 adduser 或者 sysinstall 開好就行了。 root 的密碼也要設好。 /etc/group別忘了把自己的帳號加進 wheel。 /etc/rc.confsshd_enable="YES"開啟 sshd 才能遠端登入, 因為 jail 是沒有 console 的。 /etc/ssh/ssh_host_*key自 5.3 起, 第一次啟動 sshd 的時候, 會要求使用者打一些資料進去, 幫助系統產生 ssh key。不過呢, jail 啟動的時候是沒有 terminal 的, 這會導致第一次啟動 jail 的時候有 5 分鐘的停頓。有以下兩個 方法, 可以避開這 5 分鐘的延遲:1. 手動執行 /etc/rc.d/sshd start, 亂打一些東西進去。2. 手動執行下列三行指令:/usr/bin/ssh-keygen -t rsa1 -b 1024 -f /etc/ssh/ssh_host_key -N ''/usr/bin/ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''/usr/bin/ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''/etc/crontab在 jail 裡面 adjkerntz 要特別關掉。至於其它的 periodic jobs, 依各人需要自行調整。 以上是基本的設定, 接下來看 jail 裡其它的設定檔: /etc/periodic.confperidoc daily 有些事 jail 裡面不用做:
daily_status_security_chksetuid_enable="NO"
daily_status_security_chkmounts_enable="NO"
daily_status_disks_enable="NO"
daily_status_security_kernelmsg_enable="NO"
daily_status_network_enable="NO"
關於 mail, 因為 jail 沒有 127.0.0.1, 所以它無法像一般的 sendmail只聽 127.0.0.1, 反而會直接聽某某 IP。因此 sendmail 要整個關掉。/etc/rc.confsendmail_enable="NONE" 這時候在 /etc/periodic.conf 也要做相對應的修改, 叫它不要寄信出來:/etc/periodic.confdaily_output="/var/log/daily.output"daily_status_security_output="/var/log/security.output"weekly_output="/var/log/weekly.output"monthly_output="/var/log/monthly.output"沒有閱讀 periodic output 習慣的人, 可以將它們都改成 /dev/null。
啟動 jail
到此在 host 上以及 jail 內, 該設定的都差不多了。自 5.3 起, FreeBSD 提供了非常方便的 jail 管理機制, 可以任意的啟動, 關閉任一個 jail。 現在來試一試。 在主系統上# /etc/rc.d/jail start conair 接著 ssh 127.0.0.115, 用剛剛的新加的帳號登入。到目前都沒問題的話, 恭禧你, 已經成功的安裝好一個 jail 了! 接下來就依一般使用 FreeBSD 的方式來使用該 jail 吧。
/etc/rc.d/jail 用法
# /etc/rc.d/jail stop 停止列在 /etc/rc.conf jail_list 中的所有 jails # /etc/rc.d/jail start啟動列在 /etc/rc.conf jail_list 中的所有 jails # /etc/rc.d/jail stop jail1停止列在 /etc/rc.conf jail_list 中的特定 jail # /etc/rc.d/jail start jail1啟動列在 /etc/rc.conf jail_list 中的特定 jail
進階議題
網路連通問題 Host 上若同時設有對內及對外的 IP, 且設給 jail 內部的 private IP, 那麼 jail 設定好後, 還需在 host 上設定 NAT, jail 才能對外連線。在 其它場合, 例如 jail 是對 public IP, 或 jail 及 host 同為 private IP, 已外有執行 NAT 的主機, 則無此限制。
Share ports tree among jails 幾乎所有人使用 jail 的第一個疑問就是, 要怎麼共享 ports tree? 有很 多方法, 例如 nullfs, unionfs, hardlink, NFS 等。mount_nullfs(8) 和 mount_unionfs(8) 看起來很嚇人 (see BUGS), hardlink 也不是好主意。 比較通用的方式是用 nfs。 如何設定 NFS server 和 NFS client 不在本文的討論範圍內, 故將焦點集 中在如何在 jail 內正常使用 NFS mount 進來的 ports tree。 首先, 為了效率, 以及 jails 之間不互相干擾 make ports 程序, 要將 work 目錄調開。設定的方法是把 WRKDIRPREFIX 設定到一個不在 ports tree 裡面的地方。設定的地方是 jail 的 /etc/make.conf, 例如: WRKDIRPREFIX=/tmp 另外還有一個常用的工具程式, portupgrade, 也會寫東西進 /usr/ports, 這也要調開。可以設定的地方之一是 jail 的/etc/login.conf, 裡面多設 一個環境變數, 把 PORTS_DBDIR 改到 /var/db/pkg。除此之外, jail 內的 /etc/csh.login, /etc/profile 也都可以設定這個環境變數。
在 jail 中跑 DNS server FreeBSD 5.3 內建的 bind 已經昇級到 bind 9, 而且預設是以 chroot (不 是 jail!) 方式執行。於 jail 中再 chroot 是沒有問題的, 不過由於 5.3 還有 devfs, 而預設 bind 9 在執行的時候還會再 mount devfs, 這在 jail 內會造成問題。因此要對這點要做點特別調整。把 mount devfs 以及 停止 devfs 相關動作的方式, 是在 jail 內的 /etc/rc.conf 中, 加入 named_chroot_autoupdate="NO" 不過目前為止 named 尚不能正確啟動。接下來解析由 /etc/rc.d/named 啟 動 bind 時需要那些元素:
配置完成的 named_chrootdir (預設是 /var/named)
需要 /dev/null 和 /dev/random
/etc/namedb symbolic link 到 /var/named/etc/namedb 目前欠的就是第 2 點提到的兩個 device nodes。建立它的方式是由 host 中去建立: cd /usr/jails/conair/var/named/devmknod random c 245 0; mknod null c 2 2這樣就可以了。 好了, 接下來一切照舊。:) 在新裝好的 jail 中啟動 bind 的話, 建議先 跑一下 make-localhost, 還有調整一下 named.conf。在 FreeBSD 5.3 裡 面, bind 預設也只有聽 localhost, 不對外服務。而 jail 裡面是沒有 127.0.0.1 的, 所以要把 listen-on { 127.0.0.1; }; 這裡的 127.0.0.1 換成配給 jail 的 IP。
Jail 管理基本知識及工具
以下以列舉在 FreeBSD 5.3 上, 系統提供的 jail 相關訊息以及工具, 及實際應用。 ps利用 ps 指令可以得知某 process 是在 host 或是某一 jail 內運行。在 jail 內的 process, 於 ps 顯示時, 會在 STAT 欄位顯示 J # ps ax grep J這個指令可以列出目前處於 jail 內的 process。但儘止於此, 要得知是屬於那一個 jail 則要用到 procfs。 /proc 在 host 上, 要得知某 process 是屬於何 jail, 可以利用 /proc。但是 5.3 預設並沒有把 /proc 掛上系統, 所以得在 /etc/fstab 加上這一行:
/proc /proc procfs rw 0 0
把 /proc 掛上系統
# mount /proc
把 /proc mount 上來後, 以如下方式觀看該 process 的 status:# cat /proc//status在最後會得知該 process 位於那一個 jail (以 hostname 表示) jls 列出正在運行的 jail# jlsjls 會列出下列幾個欄位 JID, IP Address, Hostname, Path。其中的 JID 是系統配的, 接下來會經常用到它。killallFreeBSD 5.3 的 killall 多了個 -j option, 接 jls 看到的 JID。用 途是將屬於某個 jail 的 process 都砍光。jexec 相關的應用jexec 的用途是, 將 process 由 jail 外送入 jail 內執行。看某 jail 內的 process 列表# jexec ps axwww看某 jail 內的 top# jexec top看某 jail 內的使用者# jexec w 使用 jexec 把 ps / top 送進 jail 內看 process, 有一個很大的好 處是, uid : username 的對照, 會以該 jail 內的為準。 sysctl以下是幾個和 jail 有關的 kernel state 的說明
security.jail.set_hostname_allowed 可於 host 環境中設定, 為 1 的時候在 jail 中可以更改該 jail 的 hostname。預設為 1。
security.jail.socket_unixiproute_only 可於 host 環境中設定, 為 1 的時候表示 host 只幫 jail 把 IP 封包往外送(FreeBSD 還支援 Netware, Appletalk 等等通訊協定)。 預設為 1。
security.jail.sysvipc_allowed 可於 host 環境中設定, 為 1 的時候表示可以在 jail 中使用 shared memory, message queues, 還有 semaphores。預設為 0。 要在 jail 中提供用到上述三者的服務, 如 BBS, 或者 PostgreSQL 時, 要將它設為 1。
security.jail.getfsstatroot_only 可於 host 環境中設定, 為 1 的時候表示在 jail 裡面可以看到 其它 mount point, 反之則只能看到 jail 所在的 mount point。 預設為 1。
security.jail.allow_raw_sockets 可於 host 環境中設定, 為 1 的時候表示在 jail 裡面可以產生 raw sockets。最大的用處是允許在 jail 中使用 ping 指令。預 設為 0。
security.jail.jailed 在 host 和 jail 環境中都是唯讀的, 用途在於幫助 /etc/rc.d 的 shell scripts 判斷是不是身處 jail 之中。 可以直接使用 sysctl 指令, 亦可在 /etc/sysctl.conf 或 /boot/loader.conf 中, 設定上述的 kernel state。
Jail 昇級
Jail 內的 FreeBSD 系統, 和一般的 FreeBSD 系統一樣, 也是要昇級的。 不過手續稍微不一樣。其一, 要先在 host 上 buildworld 好。其二, 在 installworld 的時候要指定 DESTDIR。其三, mergemaster 時要多接一個 -D 的參數。以 conair 為例, 在 host 上執行下列指令:
# cd /usr/src
# make installworld DESTDIR=/usr/jails/conair
# mergemaster -D /usr/jails/conair
這些過程比較複雜且煩瑣, 處理的時候要花點耐心。
結語
自 FreeBSD 4.0 起, jail 為 FreeBSD 提供了良好的資訊安全機制, 更佳 的硬體資源利用方式, 以及更方便的系統管理模式。圍繞著 jail 所衍生的 資安機制, 系統工具, 及管理技巧, 也一直持續的在發展。除了 FreeBSD 5.3 本身之外, 於 ports 中還有許多本文尚未提及的 jail 管理工具, 有 興趣的人可以嘗試看看。如今 jail 已是被廣泛應用, 以及持續發展的技術, 如果您尚未使用過 jail, 何不從現在開始?
延伸閱讀
ps(1), killall(1), jail(2), login.conf(5), sysctl.conf(5), loader.conf(5), jail(8), jexec(8), jls(8), sysctl(8)

Jail in FreeBSD 5.3(上)

作者:evilc
什麼是 jail, 和 FreeBSD 有什麼關係?
Jail 是自 FreeBSD 4.0 起獨有的功能, 發展至今已 4 個年頭。和 chroot 有點像, 但又比 chroot 更強大。Jail 和 chroot 的相同的地方是, 皆會 將某個 process 及其 children 的根目錄 "/", 切換到某一個目錄下, 將 它們關起來。但 jail 可以關的就更多了, 除了可以在存取檔案系統方面做 限制, 在 process 這個層次也做了類似概念的隔離。TCP/IP stack 層次, 也有一定程度的限制。
Jail 的組成, 如同 chroot 般, 首先需要一個目錄, 再視用途, 把必要的 應用程式放進去。以往在建 chroot 環境的時候, 傾向於只把必要的東西放 進去。但在建 jail 的時候, 反而傾向把完整的系統放進 jail 裡。除了已 經裝好系統的目錄之外, jail 還需要有自己的 hostname, 以及自己的 IP。
運行中的 jail 亦是系統的一部份, 共享各種硬體資源, 如 CPU time, memory, disk space, network bandwidth 等等。一般將提供 jail 運行的 主系統稱之為 host。一個空的 jail (不包含 ports) 大約要佔用 150 MB 左右的磁碟空間。日後依 jail 利用方式的不同, 空間的使用也會有很大的 差異。而 CPU time, memory, network bandwidth 方面, 則視 jail 內提 供的服務, 以及執行的應用程式而定。故一個 host 能提供多少 jails, 乃 是依硬體規格及實際負載而定, 系統管理者需依情況評估及調整。
Jail 適合用來做什麼?
一個 jail 幾乎可以被視為一台獨立的 server。因此一般 server 能做的事, jail 幾乎都能做。例如 web server, mail server, shell server, database server... 都是可以 "養" 在 jail 裡面的。
Jail 仍不適合用來做什麼?
Jail 的概念是隔離, 而不是分割, 也不是模擬。某些系統資源, 像是 System V IPC (message queues, shared memory, semaphores) 目前也不 在目前 jail 能隔離的範圍內。又如在檔案系統層次, 雖然和主系統隔離了, 但所使用的磁碟空間, 卻是沒辦法強制限定只能用多少。在 TCP/IP 層次, jail 被限定只能有一個 IP, 連 lo0 127.0.0.1 都沒有。因此, 像是防火 牆, 路由器等等工作, jail 是無法勝任的。又如 BBS, PostgreSQL server 等等, 會使用到 System V shared memory, semaphores 的服務, 也得小心 調整。
FreeBSD 5.3 的 jail 有什麼新奇功能?
Jail 自 FreeBSD 5.0 起逐一修正了許多大大小小的問題, 也新增了如 jls, jexec 等等系統工具。但要說到讓人感到耳目一新, 有全新的感受, 就非得推 FreeBSD 5.3 了! Devfs 有了給 jail 專用的規則, df 能做到不 顯示 host 上其它的 mount point, 且 /etc/rc.d 已完全支援 jail! 如今 啟動 jail 時十分的乾淨, 沒有任何看了心煩的訊息。
安裝 jail
首先, 要把 jail 所需的資源先規劃好。假設 IP, hostname, path 如下:
jail IP: 127.0.0.115
jail hostname: conair
jail path: /usr/jails/conair
以上假設, 是每個 FreeBSD 系統都可以設定的。但在實際的應用上, 則依 客觀條件的不同而有所不同。 接著來把系統裝進去 jail 要使用的目錄。在安裝之前, 要先 buildworld。 這要花一點時間, 視機器的速度而定。
# cd /usr/src; make buildworld
Buildworld 做完後, 要 installworld 到上面規劃的目錄去, 還要把 jail 的 /etc 做出來。這些事有些瑣碎, 也有點危險 (不小心少打幾個字元, 會 reset 主系統的 /etc), 故建議自行寫 shell script 處理。下面是個簡單的範例: newjail.sh
------------------ newjail.sh -------------------------
#!/bin/sh
if [ -z $1 ]; then
echo "specify dest dir such as $0 /some/dir"
exit
fi
if [ ! -d $1 ]; then
echo "dest dir $1 does not exist, mkdir first"
exit
fi
echo "Install a new jail into $1"
D=$1
cd /usr/src
make installworld DESTDIR=$D
cd etc
make distribution DESTDIR=$D
cd $D/etc
ln -sf /var/named/etc/namedb
cd $D
ln -sf dev/null kernel
------------------ newjail.sh -------------------------
我把它放在 /usr/local/sbin/newjail
# cp newjail.sh /usr/local/sbin/newjail
# chmod +x /usr/local/sbin/newjail
安裝 jail base system
# mkdir -p /usr/jails/conair
# /usr/local/sbin/newjail /usr/jails/conair
接著要在主系統上設一個 IP 給它。
# ifconfig lo0 inet 127.0.0.115/32 alias
該有的都有了, 來試試 jail 的 "single user mode"
# jail /usr/jails/conair conair 127.0.0.115 /bin/sh
一些常用指令都可以拿來試試看, 例如 ps, df, top, sockstat, netstat 等等。可以再開一個窗同時比較看看, jail 內和 jail 外有什麼不一樣。

Simple Optimization for PHP and MySQL

Simple Optimization for PHP and MySQL
Saturday April 29 2006 03:23

Here is a list of a few very simple tips for optimizing your php/mysql applications. Keep these in mind while developing.


MySQL

MySQL is interpreted from right to left so you should put the most significant limiters as far to the right as possible.


Only select fields you need, instead of selecting * (everything).


Don't put things that changes very rarely in the database, instead put it in a global array in some include file.


Use indexes on the columns in the WHERE clause and on the columns you want to ORDER BY.


Indexes are great if you search the table alot, but it slows down insertion.


Use the EXPLAIN command to analyze your indexes.


If you only want one line as a result from the database you should always use LIMIT 1. This way mysql stops searching when it finds the first line instead of continuing through the whole database, only to find that there weren't any more lines that matched the query.


If you use $line = mysql_fetch_array($result) you'll get two ways of accessing the columns, $line[0] and $line['columnname']. If you only use the $line['columnname'] you should use $line = mysql_fetch_assoc($result) instead, then there will not be any $line[int index] array.


Sometimes mysql_free_result() end up wasting more memory than it saves. Check the difference with memory_get_usage().


Don't ask the database for the same stuff over and over again, save the result.


Use NOT NULL as default value as much as you can, it speeds up execution and saves one bit.


Use datatypes that fits your data, not too large. For example, INT can hold values up to 4294967295 unsigned, which is often unnecessarily big. Use MEDIUMINT or SMALLINT where applicable.


Make use of the default values, only insert values that differs from the default values to speed up the insertion.





PHP:

Many code blocks might slow down the interpretation a little bit.





is faster than







Don't concatenate when you don't need to.

"SELECT id FROM tabell WHERE id = $_SESSION[id] LIMIT 1"

is faster than:

"SELECT id FROM tabell WHERE id = ".$_SESSION['id']." LIMIT 1"


Surrounding your string by ' instead of " will make things interpret a little faster since php looks for variables inside "..." but not inside '...'. Of course you can only do this when you don't need to have variables in the string.


The previous item makes it all boil down to

'SELECT id FROM tabell WHERE id =
'.$_SESSION['id'].' LIMIT 1'

as the fastest way of concatenating querys.




When echoing strings it's faster to separate them by comma instead of dot.

echo "echoing ",$variable," something";

Note: This only works with echo, which is a function that can take several strings as arguments.



echo is faster than print.


Set the maxvalue for your for-loops before and not in the loop.

$maxvalue = 100/10;
for($i=0; $i<$maxvalue; $i++){
// Some code
}


is faster than:

for($i=0; $i<100/10; $i++){
// Some code
}


because the value is calculated once instead of ten times.



Unset your variables to free memory, especially large arrays.



If possible it's of course always better to generate static html pages every time something is updated or as often as an update might be relevant instead of querying the database every time.

Choosing right data type
http://dev.mysql.com/doc/refman/5.0/en/data-size.html
Optimizing Queries with EXPLAIN
http://dev.mysql.com/doc/refman/5.0/en/explain.html
Other Optimization Tips http://dev.mysql.com/doc/refman/5.0/en/tips.html
A HOWTO on Optimizing PHP http://phplens.com/lens/php-book/optimizing-debugging-php.php

[轉錄]FreeBSD Tinderbox (上)

ublished by Gea-Suan Linat July 17, 2006 in , , , and .
這篇主要是給 FreeBSD Ports maintainer/committer 看的,如果你看不懂,呃… 到 #bsdchat 上問看看吧 :p

Tinderbox (在 misc/tinderbox 裡) 主要是拿來測試 port 是否可以正常的編出來,順便產生 package。網頁在 http://tinderbox.marcuscom.com/ 這,其中的 README 寫得蠻清楚的,建議仔細看。

Tinderbox 的好處在於他會產生一個 chroot 的環境 (在 Tinderbox 官方說明文件裡的 “Jail” 指的是 chroot 的環境,下面提到 Jail 都是指這個,而非 FreeBSD 的 jail),然後在裡面進行編譯的工作,這可以測試在系統什麼都沒有裝的情況下是否能正確編譯。主要是要看有沒有漏設 *_DEPENDS。

另外,Tinderbox 可以在 6.x 的機器上建立出 5.x 甚至 4.x 的 Jail 並進行編譯,這使得以往要在多台機器上測試的情況可以在一台機器上測試完畢。

再來,Tinderbox 可以對每個 Jail/PortsTree/Build 自訂環境變數 (關於什麼是 PortsTree 與 Build,在後面會提到),於是你可以利用這些東西建立出設定不同的 Perl version (4.11 系統裡的 5.00503,或是 5.6.x,或是目前建議用的 5.8.x),這對於 p5-* 的 maintainer 相當方便。

接下來開始講 misc/tinderbox 的安裝,Tinderbox 需要一個 Database,裝 mysql 4.1 之後的版本,接著裝 databases/p5-DBI 與 databases/p5-DBD-mysql{41,50,51,…},然後才裝 Tinderbox。

裝好後東西都丟在 /usr/local/tinderbox 下,原則上不動這個目錄,直接找個夠大的空間 cp -R 過去,像我自己是丟在 /da1/tb 下。

丟進去以後改 /da1/tb/scripts/tinderbox.ph,改前面幾行的設定就好,重點在於第一行的路徑要設對就可以了。改好後跑 cd /da1/tb/scripts && ./tc init,然後看看 /da1/tb 下面是不是多了一堆目錄。

接著建立 Jail,挑你想要測試的環境建立:

#
# 4.11-RELEASE
./create Jail -j 4.11 -d “FreeBSD 4.11-RELEASE” -t RELENG_4_11 -u CVSUP -H cvsup.tw.freebsd.org
#
# 4-STABLE
./create Jail -j 4 -d “FreeBSD 4-STABLE” -t RELENG_4 -u CVSUP -H cvsup.tw.freebsd.org
#
# 5.5-RELEASE
./create Jail -j 5.5 -d “FreeBSD 5.5-RELEASE” -t RELENG_5_5 -u CVSUP -H cvsup.tw.freebsd.org
#
# 5-STABLE
./create Jail -j 5 -d “FreeBSD 5-STABLE” -t RELENG_5 -u CVSUP -H cvsup.tw.freebsd.org
#
# 6.0-RELEASE
./create Jail -j 6.0 -d “FreeBSD 6.0-RELEASE” -t RELENG_6_0 -u CVSUP -H cvsup.tw.freebsd.org
#
# 6.1-RELEASE
./create Jail -j 6.1 -d “FreeBSD 6.1-RELEASE” -t RELENG_6_1 -u CVSUP -H cvsup.tw.freebsd.org
#
# 6-STABLE
./create Jail -j 6 -d “FreeBSD 6-STABLE” -t RELENG_6 -u CVSUP -H cvsup.tw.freebsd.org

執行後他會跑 cvsup 將指定的版本抓回來,然後 make world 將 Jail 建立出來。

portupgrade under jail

使用上一篇的host 共用 ports 的方法
portupgrade 升級軟體,你會發現因為沒有辦法寫入 /usr/ports (要更新 INDEX.db) 而失敗
我發現這個問題可以想辦法避開寫入 /usr/ports 就可以了,在 portupgrade 的 manpage 裡面有提到 PORTS_DBDIR 這個變數
PORTS_DBDIR Alternative location for the ports database files.
Default is ``$PORTSDIR''.於
是只要在 /usr/local/etc/pkgtools.conf 裡面設定:
ENV['PORTS_DBDIR'] ||= '/tmp'
指到 /tmp 就可以解決了。

Jail installtion

1.enviroment Setting
buildworld
make installworld DESTDIR=/da1/jail0
make distribution DESTDIR=/da1/jail0
2.add users
改 /da1/jail0/etc/master.passwd
pwd_mkdb -d /da1/jail0/etc /da1/jail0/etc/master.passwd (rebuild password)
add your home dir
3. edit rc.conf
ifconfig_fxp1_alias0="inet 192.168.1.10/24"
jail_enable="YES"
jail_list="testbase"
jail_testbase_devfs_enable="YES"
jail_testbase_devfs_ruleset="devfsrules_jail"
jail_testbase_exec="/bin/sh /etc/rc"
jail_testbase_hostname="testbase"
jail_testbase_ip="192.168.1.10"
jail_testbase_rootdir="/da1/jail0"
pf_enable="YES"
4.pf setting
nat on fxp0 from 192.168.1.0/24 to any -> (fxp0)
nat on fxp1 from 192.168.1.0/24 to any -> (fxp0)
5. other setting ex.resolv.conf , hostname
6.start jail
/etc/rc.d/jail start
7.generate ssh key 請自己去 /etc/rc.d/sshd 翻
ps. 如果要跟 host 共用 ports directory,可以用 mount_nullfs 以 read-only 掛上來 (security issue),然後修改 /etc/make.conf,把本來會寫入的部分都改到 /tmp 下:
DISTDIR= /tmp/distfiles
WRKDIRPREFIX= /tmp/WRKDIR
ps2.
像是 jail 弄好之後發現沒有帳號可以登入,在 jail host 上:
cd /jail_path/etc
vim master.passwd
pwd_mkdb -d . master.passwd
其實也可以這樣:
vipw -d /jail_path/etc
不知道現在的書還會不會教這些…

[轉錄]为FreeBSD中的Firefox安装Flash插件

要在FreeBSD中為Firefox安裝Flash插件需要以下步驟:

a) install www/linuxpluginwrapper

b) install www/linux-flashplugin7

c) cp /usr/local/share/examples/linuxpluginwrapper/libmap.conf-FreeBSD6 /etc/libmap.conf

d) ln -s /usr/local/lib/npapi/linux-flashplugin/* /usr/local/lib/firefox/plugins/