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>