NAS4Free 安裝 Jails 實戰教學
[alert type=”danger” close=”yes”]我知道這篇是本站頗受歡迎的文章,雖然方法還是正確,但現在有更簡單的建立和管理 FreeBSD jails 的方法。請到新網頁參考: 2015 新版 NAS4Free 的 jails 管理方法實戰 – Finch [/alert]
前導:
前陣子有舊機退休,又逢硬碟自泰國水災回復後價位平穩後,炒麵想在聖誔假期時打造一台 網路磁碟 (NAS) 伺服器來供應 iPad 和新 HTPC 的影音資源,著手研究了一下現在2大免費開源的NAS軟體。當然如果想省時間預算又夠,買現成的產品如 Synology 或 Q-NAP 就可以很方便的建構. 但是,FreeNAS 自2011年被 ix systems 買走產品名後,就出現了二種版本的分岐,原作者把程式碼捐出後,NAS4Free 反而是繼承原來 FreeNAS 7 的風格。2 個我都試過,但 FreeNAS 的 plugin 變成使用 pbi 安裝, NAS4Free 就必須還是土法練鋼在 terminal 下鍵入。但經過一番研究後,如果想安裝 pyLoad, Jdownloader, Air Video Server, PS3 Media Server, 反而 NAS4Free 的文章比較多,所以這篇教學就以 NAS4Free 9.0 作為基準。雖然 9.1 出了,但是 FreeBSD 的 port repository 上 9.1 軟體還不完整.
原文出處:
http://wiki.nas4free.org/doku.php?id=documentation:howto:jails
什麼是 jail and ports?
FreeBSD Jail: 簡單來說,是 chroot 的完整方案。可以建立一個子系統。類似主作業系統下的虛擬環境,一些套件在 jail 上跑就有獨立而不影響主要作業系統的疑慮。 Ports: FreeBSD 的軟體套件。用來快速安裝和部署已經包裝好的軟體。很方便。請參考 Ports.
事前準備:
像原文所言,安裝 Jails 是屬於進階功能而且是被官方禁用的。其實功能已經足夠,但炒麵想讓機器多做點事,如 DLNA (FreeNAS 支援), pyLoad, Air Video Server, 就要靠 Jails 完成.
系統內容:
主機名 | nas4free.local |
IPv4 | 192.168.1.74 |
版本 | 註*1 9.0.0.1 – Sandstorm version 249 Full Installation (不是用 embedded 的) |
平台 | 註*2 Windows 2012 Standard Server Hyper-V (虛擬) |
BIOS | Boot from CD |
Memory | 1024 MB |
Processor | 1 Virtual processor |
IDE Controller 0 | 1 x nas4free9.vhd (OS 系統碟 – 40G, 4G USB 被我塞爆,不建議。), 1 x N4FZFS.vhd (ZFS 掛載碟 – 40G) |
IDE Controller 0 | DVD Drive |
Network | Legacy Network Adapter DHCP (新版不支援,要用傳統的) |
* 註1:下載 Live CD 的 ISO 檔,再按9安裝選3 Full Installation. * 註2:Hyper-V 的設置不在本篇的範圍內,硬體或 VMWare 上安裝應該是大同小異
此時 Web GUI 介面也可以用了,開啟 Browser 打入上面的網址即可。
NAS4Free Web UI預設帳號和密碼
User ID: admin Password: nas4free
安裝步驟:
先按 6 進入 Shell 吧. 如果想遠端用 Terminal or Putty 進入的,記得去 Web GUI 上的 Services 內把 SSH 打開. 還要勾取 Permit root login, 就可以用 root 登入,預設密碼是 nas4free
建立目錄和掛載點
mkdir /jail mkdir /mnt/data mkdir /mnt/data/jail mkdir /mnt/data/jail/{work,proto,conf} mount_nullfs /mnt/data/jail /jail
/jail/work | 用來儲存下載的臨時檔案 |
---|---|
/jail/proto | 用來建立新Jail雛形的目錄 |
/jail/conf | 用來存放設定檔和起動檔的目錄 |
下載 FreeBSD 主要系統
cd /jail/work fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/`uname -m`/`uname -m`/`uname -r | cut -d- -f1-2`/base.txz fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/`uname -m`/`uname -m`/`uname -r | cut -d- -f1-2`/lib32.txz
* 註:原文把版本名直取用 uname 取出了,方便很多. uname -m = amd64, uname -r = 9.0-RELEASE-p4
解開到 /jail/proto 目錄作為建立其它 jail 的雛形
tar xvf /jail/work/base.txz -C /jail/proto/ tar xvf /jail/work/lib32.txz -C /jail/proto/
安裝 jail 檔
先建立 jail 所需的目錄結構
# cd /jail mkdir -p conf/root/{etc/rc.d/,usr/bin,usr/sbin}
再 copy 必須的 rc-script (開機會自動執行的程式). 從剛才下載的基本雛形目錄下 copy 過來。
cp proto/etc/rc.d/jail conf/root/etc/rc.d/ cp proto/usr/sbin/{jail,jexec,jls} conf/root/usr/sbin/ cp proto/usr/bin/mktemp conf/root/usr/bin/
根據原著的介紹,作者在此先停止解釋了結構,可以參考原文的 Pit Stop 部份。我不放在此是因為作者要說明樹狀目錄的構造,我是懶人 copy & paste 教學。故跳過.
設定雛形 jail
從 NAS4Free 的主機先 copy 設定檔,以下是 DNS resolve.conf
cp /etc/resolv.conf /jail/proto/etc/
設定時區
當然就依照自已的時區做更改了,我是美西時間,就如以下.
cp /jail/proto/usr/share/zoneinfo/America/Los_Angeles /jail/proto/etc/localtime
如果是台北,那就是
cp /jail/proto/usr/share/zoneinfo/Asia/Taipei /jail/proto/etc/localtime
建立 fstab 檔來掛載用
我們剛才在系統需求中有第2個40G的 ZFS 硬碟,在 Web GUI 中可以把第2個硬碟設定成 ZFS 格式,裡頭的檔案就可以掛給 jail 用。但我們就先建立一個空白的檔,以後再來談掛載自動起動的部份。
touch /jail/conf/fstab.proto
建立 rc.conf.local 設定檔
touch /jail/conf/rc.conf.local nano /jail/conf/rc.conf.local
複製以下的程式碼
在 copy 之前,有幾個地方要注意的.
- jail_proto_hostname= 改成自已想要的名字
- jail_proto_ip=改成合適的 IP (要在同一個 subnet 下. 如 255.255.255.0)
- jail_proto_interface=”de0″ (請參考圖一或自已的Console畫面來判斷)
### EXAMPLE - MODIFY TO FIT YOUR NEEDS ### jail_enable="YES" # enable jails YES|NO jail_list="proto" # name of the jails to start "proto www..." jail_proto_rootdir="/jail/proto" # path to our jail jail_proto_hostname="proto.chaoman.local" # hostname jail_proto_ip="192.168.1.51" # ip of the jail jail_proto_interface="de0" # Network Interface to use, replace on your NAS interface name jail_proto_devfs_enable="YES" # use devfs jail_proto_mount_enable="YES" # mount YES|NO jail_proto_fstab="/jail/conf/fstab.proto" # File with Filesystems to mount
按 Ctrl + x 再按 Y 儲存離開.
結束設定和起動 jail
首先, 先建立一個啟動檔
nano /jail/conf/jail_start
再加入以下的內容
#!/bin/tcsh -x #mounting to /jail mkdir /jail mount_nullfs /mnt/data/jail /jail # copy jail binaries to /usr cp -r /jail/conf/root/ / # link config files to /etc ln -s /jail/conf/rc.conf.local /etc #start all jails /etc/rc.d/jail start
按 Ctrl + x 再按 Y 儲存離開. 存完檔後, 改變啟動檔的屬性.
chmod 755 /jail/conf/jail_start
讓啟動檔在開機時自動執行
當然也有 CLI 的做法,但也可以簡單的在 Web GUI 上做. 打開瀏覽器打入 IP 位置,本例是 192.168.1.74
去 System > Advanced > Command 按+號後, 加入以下內容 Command: /mnt/data/jail/conf/jail_start Type: PostInit
按Add後,就重新開機吧. 但是如果你是使用 Hyper-V 的人,會遇到一個小問題. 就是重開 NAS4Free 後,網卡的設置會不見. 還有,預設的 jail 的IP也無法溝通, 解決方法如下.
解決 Hyper-V 上 NAS4Free 無法抓到網址和 jail 網址
- 在黑黑的 Console setup 畫面, 先按2重新抓 IP 位址. 我跳過 IPv6 的部份只抓 IPv4. 正常來說就會抓到了.
- 按 6 進入 Shell, 先打 jls 看到以下的結果代表jail安裝成功了.
nas4free:~# jls JID IP Address Hostname Path 1 192.168.1.51 proto.chaoman.local /jail/proto
但是呢,你去 ping 192.168.1.51 是沒有回應的. 所以我們接下來就是重新啟動 jail
/etc/rc.d/jail restart
之後再打 jls 後, 就看到以下的新 jail ID.
Welcome to NAS4Free!nas4free:~# jls JID IP Address Hostname Path 2 192.168.1.51 proto.chaoman.local /jail/proto
重新啟動的 jail 也可以ping 到了。同時也可以跟同一個子網路下的電腦溝通了。 最後再打入下面的指令就可以進入到 jail 了。
jexec 2 csh
到現在為止,jail 已經可以說是安裝完全,接下來就是進階的安裝 FreeBSD port 上的軟體。
進階安裝部份
原文裡有介紹說幫 jail 減肥。 如果你打算把NAS4Free塞進小小的USB Drive 或著是CF卡裡,或許有必要,我是跳過。因為把所有 CVS(Concurrent Versions System) 都下載完 約佔了約 1.3G的容量。如果再用 buildworld 後,4G的USB是塞不下,但現在隨隨便便一個USB Drive 就是 32G。我就懶的不瘦身了。如果你的USB Drive 只有4G, 我建議瘦一下身吧。 接下來的部份都是在jail 裡完成的,所以請用 jls 指令查出現在 jail 的ID. 我的是2。鍵入以下指令就可以進入了。
jls JID IP Address Hostname Path 2 192.168.1.51 proto.chaoman.local /jail/proto jexec 2 csh proto#
指向 FreeBSD 的原始碼
先把 source-supfile 複製過來 jail 裡。再按ee去編輯,如果你習慣用 nano, 也可以打 pkg_add -r nano 安裝。
proto# cp /usr/share/examples/cvsup/standard-supfile /etc/source-supfile ee /etc/source-supfile
到第49行找以下的設定來做更改。
*default host=CHANGE_THIS.FreeBSD.org
改成以下
*default host=cvsup.US.FreeBSD.org
*註:用 csup 指令來抓取放在FreeBSD伺服器上的原始碼,但要先改 CVS 的位址。在很多國家都有伺服器,所以2碼的 ISO 國家碼請自行更改。我的例子就是 US, 台灣是 TW, 大陸就是CN囉。以此類推。 如果是用 ee ,按 Enter + Esc 跳出,記得選 save 結束。 最後再更新原始碼的內容,打以下指令:
csup -z /etc/source-supfile
這步驟要花費很長的時間。我的 VM 上要超過1小時,所以可以先去喝杯咖啡吧。
buildworld
原文寫到:The process of recompiling the complete system from source is called buildworld. 很有意思的程序。所以 proto 就是我們的原生雛型,用它來編譯其它新的 jail. 但基於安全理由,系統是不充許更改旗標(flag)的。所以我們要先去 Web GUI 更改 Sysctl,步驟如下。
先在 Browser 打 http://192.168.1.74 登入後去 System - Advanced - sysctl.sonf 在最下面按+號。
出現輸入格後,就參照以下的內容複製。
Name: security.jail.chflags_allowed Value: 1 Comment: Allow chflags inside jails
在 jail 裡,就可以開始建立新世界了。這個也是會跑很久。我在VM和Pentium D 的機器上都要跑2小時以上。(沒有瘦身的結果,可以參考原文來改 /etc/src.conf 檔)建議先去休息一下再回來看結果。
proto# cd /usr/src proto# make -j1 buildworld
*駐:-j4 是指可以同時執行的程序數,原作者是建議一個CPU核一個,我是用 VM, 保守一點選1.我也有選過2,只是在 build 的時候會出現錯誤,只好乖乖的選1。我的Hyper-V Server 只有雙核,所以我只開1線來跑。 等看到下面的畫面,就大功告成囉。 Build 結束後,最後一步就是安裝。
make installworld
安裝步驟也滿耗時間的,剛才已經喝過咖啡和休息過了,那就去玩個iPad 小遊戲吧。
建立一個新的 jail
當 world 建立完後,表示我們之前辛苦建的 proto 雛形已經完成,接下來可以簡單的建立其它新的 jail 了。原作者介紹了一個直接建立 Apache + PHP + MySQL 的網站。我們來試試看。 當然你也可以直接複製設定檔開始,但我們使用 FreeBSD 的方法。首先在還沒進入 jail 前:
mkdir /jail/www
掛載 www 目錄到 proto 的掛載點下面
mount_nullfs /jail/www /jail/proto/mnt/
進去 proto 的 jail 中。
jexec 2 csh proto#
安裝 world 在剛才把 www 掛在 proto 的掛載點上。DESTDIR 就是目標目錄. installworld 只會安裝基本軟體。
cd /usr/src make installworld DESTDIR=/mnt
這個步驟也是滿耗時間的。就先放到一邊暫等吧。完成後就要再用 make distribution 來安裝預設的設定檔.
make distribution DESTDIR=/mnt
待完成後,就可以退出 jail 了。
exit
也可以把掛載點却下了。回到 nas4free# 下。
nas4free# umount /jail/www
接下來要重覆之前 6.6 章裡設定時區的部份來幫新的 www jail 設定基本資訊。時間和DNS是很重要的。
cp /etc/resolv.conf /jail/www/etc/ cp /jail/proto/usr/share/zoneinfo/America/Los_Angeles /jail/www/etc/localtime
最後就是幫新的 www jail 在開機時自動建立磁碟載點和自動執行設定.
touch /jail/conf/fstab.www nano /jail/conf/rc.conf.local
先找第3行
jail_list="proto" 修改成 jail_list="proto www" (中間以空白鍵區隔)
再來在下面空白的地方貼上下面其它的設定
jail_www_rootdir="/jail/www" jail_www_hostname="www.chaoman.local" jail_www_ip="192.168.1.52" # change to a new IP jail_www_interface="de0" # match your interface name jail_www_devfs_enable="YES" jail_www_mount_enable="YES" jail_www_fstab="/jail/conf/fstab.www"
*註:跟剛才 6.8 章一樣,jail_www_ip 要跟剛才不一樣的,還有 jail_www_interface=”de0″ 也要跟你的網卡名符合 Ctrl + x 和 y 儲存離開後,就來個重開機吧。當然,在 hyper-v 上每次開機都要重新抓 IP 和重啟 jail. 請參照 6.12 的解說。 之後打jls 看到2個同時執行的 jail 就大工告成啦。
nas4free:~# jls JID IP Address Hostname Path 3 192.168.1.51 proto.chaoman.local /jail/proto 4 192.168.1.52 www.chaoman.local /jail/www
在新 www jail 上安裝 ports
FreeBSD ports 就是把軟體都打包好方便下載安裝。我們先拿取一份在server上的鏡像來同步. 但要先進入新建的 jail 裡。剛才看給 www 的新 JID 是4,那就要打4進去
jexec 4 csh www# portsnap fetch extract
由於我們要抓取一分現在 ports 的所有樹狀結構鏡像再解開,這過程少說也要1個小時。我先去吃個飯吧。基本上整個在 nas4free 安裝基本 jail 就差不多,安裝新的 Apahce + MySQL + PHP 我再另闢新文來寫好了。