Linux+FreeBSD mini-HOWTO 中譯版 <author> 作者: Niels Kristian Bech Jensen, <tt><htmlurl url="mailto:nkbj@image.dk" name="nkbj@image.dk"></tt> <newline> 譯者: <htmlurl url="http://www.geocities.com/ResearchTriangle/7856/" name="黃則榮"> <tt><htmlurl url="mailto:tjhuang@technologist.com" name="tjhuang@technologist.com"></tt> <date>v1.4, 23 January 1998 翻譯日期: 17 March 1998 <abstract> 這份文件途述如何在一個系統中使用 Linux 和 FreeBSD. 它介紹 FreeBSD, 並討論這兩個系統如何互相影響, 如一起分享 swap 空間. 你在讀這份文件之前, 應該要有使用 Linux 與做硬碟分割的經驗. 如果你對這篇文件有任何的評論, 問題, 與建議, 請不要猶豫, 寫封電子郵件給我. 我也希望聽聽有同時使用 Linux 和 NetBSD 或 OpenBSD 經驗的人說說. </abstract> <toc> <sect>什麼是 FreeBSD? <p> FreeBSD 和 Linux 一樣是個免費的, 如同 unix 般的作業系統. 最主要的差異是, Linux 是自首到尾從新發展的, 而 FreeBSD 是基於 4.4BSD (柏克來大學軟体 Distribution) 自由 redistribution 的那一個部份而來. 這個部份也被稱為 4.4BSD-lite. 這個事實也許會使人這麼想: FreeBSD 比 Linux 更近於'真正'的unix. FreeBSD 只能在 Intel PC 平台上(i386或更高)執行. 而移植到 DEC Alpha 平台的版本目前正在被討論. FreeBSD 對硬体的需求與 Linux 非常的相像. <p> FreeBSD 的發展與 Linux 比較起來是比較封閉的. 主要的決定是由一個開發人員所成立的中心團隊負責. 大的改變先在mail-list 上事先做討論. FreeBSD 有兩個發展樹, (如同 Linux 一般) : <em/``-current''/ 和 <em/``-stable"/. 新功能的發展在``-current"發展樹中, 而``-stable"樹中的改變主要都是己除去 bug 的了. <p> FreeBSD 如同 Linux一般可自由免費的使用與(re-)散發. 系統的大部份是在BSD 版權下發行, 而其他的則是在 GNU GPL 或 GNU LPGL 下. <p> 你可以在 <url url="http://www.freebsd.org/" name="FreeBSD Inc."> 下找到更多的資訊或是下載整個系統. 最新 ``-stable"的版本和 ``-current"發展程式碼可以在 <url url="http://www.cdrom.com/" name="Walnut Creek CDROM"> 購得. (他們是使用 FreeBSD 來提供 web 和 ftp 服務) <sect>FreeBSD 標示硬碟的方式 <p> Linux 和 FreeBSD 使用兩種不同的方式來標示與切割硬碟. <sect1>FreeBSD ``slices'' 和 ``partitions'' <p> FreeBSD 只需要用硬碟上的一個主硬碟切割區. 這個主切割區在 FreeBSD 的術語中被稱為 <em/``slice''/. 然後它用 <tt/disklabel/ 這個程式在這個主硬碟切割區中製造邏輯切割區. 這些邏輯切割區在 FreeBSD 的術語中被稱為<em/``partitions''/. 這個觀念與 Linux (和 DOS) 處理括充切割區中的邏輯切割區是非常相像的. 注意: Linux <tt/fdisk/ 程式的主功能表中並不會將 FreeBSD slice 中的 partitions 顯示出來, 但是你可以使用命令 'b' 來顯示 BSD 磁碟標籤的訊息. 它的輸出將如這樣 : (<tt>/dev/hda4</tt> 是 FreeBSD 的 slice): <tscreen><verb> # fdisk /dev/hda Command (m for help): p Disk /dev/hda: 64 heads, 63 sectors, 621 cylinders Units = cylinders of 4032 * 512 bytes Device Boot Begin Start End Blocks Id System /dev/hda1 * 1 1 27 54400+ 83 Linux native /dev/hda2 28 28 55 56448 83 Linux native /dev/hda3 56 56 403 701568 83 Linux native /dev/hda4 404 404 621 439488 a5 BSD/386 Command (m for help): b Reading disklabel of /dev/hda4 at sector 1624897. BSD disklabel command (m for help): p 8 partitions: # size offset fstype [fsize bsize cpg] a: 64512 1624896 4.2BSD 0 0 0 # (Cyl. 404 - 419) b: 104832 1689408 swap # (Cyl. 420 - 445) c: 878976 1624896 unused 0 0 # (Cyl. 404 - 621) e: 64512 1794240 4.2BSD 0 0 0 # (Cyl. 446 - 461) f: 645120 1858752 4.2BSD 0 0 0 # (Cyl. 462 - 621) BSD disklabel command (m for help): q # </verb></tscreen> 在第一個欄位中的字母 `a'...`f' 與下面 FreeBSD slice 的例子中的是相同的. 字母`b'指的是 swap partition, 而`c'指的是整個 slice. 閱讀 FreeBSD 文件以便獲取指定這些字母給不同切割型態的``標準方法" 的更多資訊. <sect1>Linux 和 FreeBSD 中的硬碟與切割區標示. <p> Linux 和 FreeBSD 中的硬碟是如下列方法標示的: <tscreen><verb> Linux FreeBSD First IDE drive /dev/hda /dev/wd0 Second IDE drive /dev/hdb /dev/wd1 First SCSI drive /dev/sda /dev/sd0 Second SCSI drive /dev/sdb /dev/sd1 </verb></tscreen> FreeBSD slice 是如下方法標示: (<tt>/dev/hda</tt> 為範例): <tscreen><verb> Linux FreeBSD First primary partition /dev/hda1 /dev/wd0s1 Second primary partition /dev/hda2 /dev/wd0s2 Third primary partition /dev/hda3 /dev/wd0s3 Fourth primary partition /dev/hda4 /dev/wd0s4 </verb></tscreen> FreeBSD slice 中的 partitions 如下述方法標示 (<tt>/dev/hda4</tt> 是例子中的 FreeBSD slice ): <tscreen><verb> Linux label FreeBSD label Default FreeBSD mount point /dev/hda5 /dev/wd0s4a / /dev/hda6 /dev/wd0s4b swap /dev/hda7 /dev/wd0s4e /var /dev/hda8 /dev/wd0s4f /usr </verb></tscreen> 如果你在 Linux中執行 <tt/dmesg/ 你將會看到如下 (Linux 的 kernel 必須有 <bf/UFS/ 支援才能奏效. 看 <ref id="installlinux" name="安裝並準備 Linux">) 部份: <tscreen><verb> Partition check: hda: hda1 hda2 hda3 hda4 < hda5 hda6 hda7 hda8 > </verb></tscreen> 如果你在 <tt>/dev/sdb3</tt> slice 中安裝 FreeBSD, 而且 <tt>/dev/sdb2</tt> 是一個含有兩個邏輯切割的 Linux 擴充切割 (<tt>/dev/sdb5</tt> 及 <tt>/dev/sdb6</tt>), 之前的例子看起來將如同這樣: <tscreen><verb> Linux label FreeBSD label Default FreeBSD mount point /dev/sdb7 /dev/sd1s3a / /dev/sdb8 /dev/sd1s3b swap /dev/sdb9 /dev/sd1s3e /var /dev/sdb10 /dev/sd1s3f /usr </verb></tscreen> 在 <tt/dmesg/ 的輸出中看起來將如 <tscreen><verb> Partition check: sdb: sdb1 sdb2 < sdb5 sdb6 > sdb3 < sdb7 sdb8 sdb9 sdb10 > </verb></tscreen> 如果你有一個 Linux 延伸磁區在 FreeBSD slice <em/之後/, 你便有了麻煩. 因為大多數的 Linux 核心安裝磁片沒有內含<bf/UFS/ 支援, 它們認不得 FreeBSD slice 中的 partitions. 看到的(<tt>/dev/hda3</tt> 是 FreeBSD slice 而 <tt>/dev/hda4</tt> 是 Linux 延伸切割) <tscreen><verb> Partition check: hda: hda1 hda2 hda3 < hda5 hda6 hda7 hda8 > hda4 < hda9 hda10 > </verb></tscreen> 出現成: <tscreen><verb> Partition check: hda: hda1 hda2 hda3 hda4 < hda5 hda6 > </verb></tscreen> 這會導致錯誤的設施指定, 並會令資料遺失. 我的建議是 <em/永遠把你的 FreeBSD slice 放在任何 Linux 延伸切割之後, 並且不要在安裝 FreeBSD 後, 改變 Linux 延伸切割中的任何邏輯切割/. <sect>在 Linux 和 FreeBSD間分享 Swap 空間 <p> 這一個篇幅描述我如何讓 Linux 和 FreeBSD 共用一個 Swap 切割. 可能還有別的方法可以做到相同的結果. 這裡所用的 Linux 是 Red Hat 4.1 和 4.2 (Linux 核心 2.0.29 和 2.0.30) 與 FreeBSD 2.2.2. 如果你願意, 你可以在安裝 Linux 之前先安裝 FreeBSD, 但要注意 FreeBSD slice 中 partition 的順序. <sect1>安裝和準備 Linux<label id="installlinux"> <p> 第一步是如平常一樣的安裝 Linux. 你必須在你的硬碟中留下給 FreeBSD slice 的空間. 你不用作 Linux 的 Swap 切割, 但如果你要這樣一個切割, 就把它放在你要給 FreeBSD 的空間中. 這樣, 你便可以在稍後刪除這個切割, 並把它拿來給 FreeBSD 用 . 在完成 Linux 的安裝後, 你必須要重新編譯 kernel. 如果你對這不清楚, 可以參考 <bf/The Linux Kernel HOWTO/. 你 <em/必須/ 加入對 <bf/UFS 檔案系統/ 的支援, 與對 <bf/BSD disklabel (FreeBSD partition tables)/ 的支援. <tscreen><verb> UFS filesystem support (read only) (CONFIG_UFS_FS) [N/y/m/?] y BSD disklabel (FreeBSD partition tables) support (CONFIG_BSD_DISKLABEL) [N/y/?] (NEW) y </verb></tscreen> 安裝新的核心並重新開機. 如果你有建構 Linux Swap 切割, 把在<tt>/etc/fstab</tt> 檔中任何含有 <em/swap/ 的那幾行刪去. <em/確定你有可用的新核心開機片/ 你便可以開始來安裝 FreeBSD 了. <sect1>安裝 FreeBSD <p> 依 FreeBSD 文件中所描述的方式來安裝你的 FreeBSD. 如果你有建構 Linux swap 切割, 把它刪除, (你可以使用 FreeBSD 的<tt/fdisk/ 程式.) 注意一下 FreeBSD slice 中 partitions 的順序. 如果你使用預設的標籤編碼, 第二個 partition 將是swap 切割. 完成 FreeBSD 的安裝, 並<em/使用Linux的開機片/ 重新開機進入 Linux. <sect1>在 Linux 中設定 FreeBSD 的 swap 切割 <p> 在進入 Linux 後執行 <tt/dmesg/. 在它的輸出你應該會看到類似這樣的東西: <tscreen><verb> Partition check: hda: hda1 hda2 hda3 hda4 < hda5 hda6 hda7 hda8 > </verb></tscreen> 這表示 <tt>/dev/hda4</tt> 是你的 FreeBSD slice, 而 <tt>/dev/hda5</tt>, <tt>/dev/hda6</tt>, <tt>/dev/hda7</tt> 和 <tt>/dev/hda8</tt> 是 FreeBSD 切割. 如果你的 swap 切割是在 slice 中的第二個切割, 那將會是 <tt>/dev/hda6</tt>. 你必須把下面的這幾行放到你的 <tt>/etc/fstab</tt> 檔中來開啟 swap partition 的功能. <tscreen><verb> /dev/hda6 none swap sw 0 0 </verb></tscreen> FreeBSD 可以用任何型態的切割來當作 swap 切割, 但 Linux 的 swap 切割需要特別的簽名. 這個簽名是用 <tt/mkswap/ 來建構的. FreeBSD 使用這個共用的 swap 切割時會對這個簽名造成破壞, 所以你必須在每次進入 Linux 的時後執行 <tt/mkswap/. 要讓這個動作自動執行, 你必須找出執行 <tt/swapon/ 的 script 並在開機時執行. 以 Red Hat 而言, 這是 <tt>/etc/rc.d/rc.sysinit</tt>. 把下面這一行放到 <tt/swapon -a/ <em/前/: <tscreen><verb> awk -- '/swap/ && ($1 !~ /#/) { system("mkswap "$1"") }' /etc/fstab </verb></tscreen> 這將會在每次開機時, 在 <tt>/etc/fstab</tt> 中的任何 swap 切割上執行 <tt/mkswap/, 除非你把它取消 (使用 ``#'' 當一行的第一個字元) 在你重新開機進入 Linux 後, 使用 <tt/free/ 來檢查 swap 空間的大小. 你也必須重新開機進入 FreeBSD 來確認一切都如預期的運作. 如果沒有, 那你可能使用了錯誤的切割來當作 swap 切割. 唯一的解決辦法, 便是重新再安裝 FreeBSD, 並再試一次. 經驗是好的導師. :-) <sect>使用 LILO 來啟動 FreeBSD <p> 你可以非常容易的使用 LILO 來啟動 FreeBSD. 如果你要使用 LILO, 不要安裝 FreeBSD 的 boot loader (<tt/Booteasy/). 在你的<tt>/etc/lilo.conf</tt> 檔中加入下列這幾行, 並執行 <tt/lilo/ ( FreeBSD slice 是在 <tt>/dev/hda4</tt>): <tscreen><verb> other=/dev/hda4 table=/dev/hda label=FreeBSD </verb></tscreen> 如果你把 FreeBSD 安裝在第二顆 SCSI 硬碟中, 使用類似這樣的設定(FreeBSD slice 在 <tt>/dev/sdb2</tt>): <tscreen><verb> other=/dev/sdb2 table=/dev/sdb loader=/boot/chain.b label=FreeBSD </verb></tscreen> <sect>架構檔案系統 <sect1>在 Linux 中架構 UFS 檔案系統 <p> 不幸的, Linux 核心對 UFS 的支援有問題. 當你試著去架構 UFS 檔案系統時, 只會得到一些錯誤訊息(檔案系統事實上已經被架上去了, 但你卻不能讀到任何東西). 所幸 Linux 2.0.xx 核心 (xx<30) 有一個新 (ALPHA) 版本的 UFS 檔案系統支援, 在 <url url="ftp://sunsite.unc.edu/pub/Linux/ALPHA/ufs/" name="SunSite">. 這被稱為 <bf/U2FS/, 而目前的版本是 <tt/u2fs-0.4.3.tar.gz/. <bf/U2FS/ 是用下列的方式來安裝(假設<tt/u2fs-0.4.3.tar.gz/ 是存放在<tt>/usr/src</tt>): <tscreen><verb> cd /usr/src tar xvzf u2fs-0.4.3.tar.gz patch -p0 -E < u2fs-0.4.3.patch </verb></tscreen> <p> Linux 2.0.31 或更新的核心(<tt/u2fs-0.4.4.tar.gz/), 與最新的 2.1.xx 核心適用的 <bf/U2FS/版本, 可以在 <url url="http://www.image.dk/~nkbj/u2fs/" name="這個網站"> 找到. 現在你必須重新建立支援 <bf/U2FS 檔案系統/ 和 <bf/BSD disklabel/ 的核心. 參考 <ref id="installlinux" name="安裝和準備 Linux"> 來得到更多的資料. 當使用<bf/U2FS/時, 你可以忽略核心的 <bf/UFS 檔案系統/ 支援. 當完成新的核心安裝後, 你可以使用如下列的指令來架構你的 UFS 檔案系統(所有在 FreeBSD slice 中的切割, 除了 swap 切割. <tscreen><verb> mount -t u2fs /dev/hda8 /mnt </verb></tscreen> 這個 UFS 支援是唯讀的. 那即是你可以自UFS 檔案系統中讀取,但你不能對其作寫入. <sect1> 在 FreeBSD上架構 ext2fs 檔案系統<label id="ext2fs"> <p> 要在 FreeBSD 中架構 ext2fs 檔案系統, 你要先建立一個支援 ext2f 的核心. 請參照 FreeBSD 的文件來明白如何進行. 放這幾行 <tscreen><verb> options "EXT2FS" </verb></tscreen> 在你新核心的設定檔中. 在完成使用新的核心來開機後, 你可以用下列這幾行來架構你的 ext2fs 檔案系統 <tscreen><verb> mount -t ext2fs /dev/wd0s3 /mnt </verb></tscreen> 注意: 你不能把 ext2fs 檔案系統架構在 FreeBSD 的延伸切割中. <p> 基於 FreeBSD 的某些錯誤, 你必須在關閉 FreeBSD <em/前/卸下所有的 ext2fs 檔案系統. 如果你在有 ext2fs 檔案系統未卸下前就關閉 FreeBSD, FreeBSD 便不能 sync UFS 檔案系統. 這會導致FreeBSD下次啟動時 <tt/fsck/ 被執行. 這個錯誤據報告說已在``-current" 發展樹中被修正. <sect>執行外來的執行檔 <sect1>在 Linux 下執行 FreeSBD 的執行檔 <p> <tt/iBCS/ package 有提供在 Linux 下執行 FreeBSD 執行檔的支援; 但它已太老舊且沒有人維護. 我不能成功讓它動作. 如果你幸運地叫它動起來, 請你告訴我. <sect1>在 FreeBSD 下執行 Linux 的執行檔 <p> FreeBSD 有能力來執行 Linux 的執行檔, 包括 a.out 和ELF 型式. 要這麼做, 你必須要採取下列三個步驟: <enum> <item>你必須開啟與 Linux 相容的機制. 要這麼做 (in FreeBSD 2.2.2 --- 其他版本的細節可能不同) 你要修改你的<tt>/etc/rc.conf</tt> 檔案, 並修改 <tscreen><verb> linux_enable="NO" </verb></tscreen> 成 <tscreen><verb> linux_enable="YES" </verb></tscreen> <item>你必須安裝 Linux 共享的程式庫. 它們在 FreeBSD 2.2.2 中被包含成為 package<tt/linux_lib-2.4.tgz/ (更新的版本可能已經出來了.) 執行這個命令 <tscreen><verb> pkg_add <path_to_package>/linux_lib-2.4.tgz </verb></tscreen> 來安裝這個package. <path_to_package> 是這個package存放的目錄. <item>安裝你要執行的 Linux 程式. 這些程式可任意安裝在 UFS 或 ext2fs 檔案系統中. 看章節 <ref id="ext2fs" name="在 FreeBSD 上架構 ext2fs 檔案系統"> 來獲取在 FreeBSD 中使用 ext2fs 檔案系統的更多資訊. </enum> 我已成功地使用這些方法在 FreeBSD 2.2.2 執行 Linux 版的 Applixware 4.3 和 Netscape 3.01 (兩個都是 ELF 格式), (是的, 我知道有 FreeBSD 版的 Netscape 4.) 讀 FreeBSD 的文件來了解有關這個主題. <sect>參考文獻於其他有趣的文件 <p> 最新版的這份 mini-HOWTO 能夠在 <url url="http://www.image.dk/˜nkbj/" name="我的 homepage"> 中找著, 有數種格式 (包括 SGML 與 PostScript.) 這份文件已被 Mr. Teruyoshi Fujiwara 翻譯成日文, 成為 <url url="ftp://jf.linux.or.jp/pub/JF/other-formats/" name="JF project"> 的一部份. <p> FreeBSD 手冊與 FreeBSD FAQ 被與 FreeBSD 一起散發. 它們也可以在<url url="http://www.freebsd.org/" name="FreeBSD Inc."> 中被找著. 這個網站也有很多關於 FreeBSD 的其他資訊. <p> Linux Kernel HOWTO 被散發成為 <url url="http://sunsite.unc.edu/LDP/" name="The Linux Documentation Project"> 的一部份. <sect>感謝和版權 <p> 感謝<url url="http://hotel.prosa.dk/bsd-dk/" name="*BSD 丹麥使用者群">成員的回答一位 FreeBSD 新手的問題, 也感謝 Mr. Takeshi Okazaki 讓我注意到<bf/U2FS/ 的存在. <sect1>Disclaimer <p> 雖然這文件內容所提供的訊息是被相信正確的, 作者本人將不為文件中的內容負責. 請自己承擔使用這些技巧和範例的風險. <sect1>Copyright <p> Copyright (c) 1997, 1998 by Niels Kristian Bech Jensen. This document may be distributed only subject to the terms and conditions set forth in <url url="http://sunsite.unc.edu/LDP/LICENSE.html" name="the LDP license">. 版權 Copyright (c) 1997, 1998 by Niels Kristian Bech Jensen. 這份文件只可在遵守 <url url="http://sunsite.unc.edu/LDP/LICENSE.html" name="the LDP license"> 的條文和條件下被散發. </article>