无磁碟 Linux Mini Howto <author> 作者: Robert Nemkin <tt>buci@math.klte.hu</tt><newline> 译者: 谢昆中 HSIEH Kun-Chung, 台湾 中华民国 Taiwan, Republic of China (NOT People's Republic of China) <tt>(<htmlurl url="linuxer.bbs@cis.nctu.edu.tw" name="linuxer.bbs@cis.nctu.edu.tw"> )</tt> <newline> <date>v0.0.3版, 1996年 9月12日 <abstract> 本文件在叙述如何设立一个无磁碟 Linux 机器。著作权为 Robert Nemkin 所有。 著作权条款依照 GPL。我想要谢谢 Bela Kis <bkis@cartan.math.klte.hu> 将这份文件翻译成为英文。 </abstract> <toc> <sect>修改<p> <itemize> <item>v0.0.3版 1996年9月12日: 一小部份的修改 </itemize> <sect>如何设立一个无磁碟的 Linux 机<p> 本文件在叙述如何设立一个无磁碟 Linux 机器。有时候我们可能需要在一个既无硬碟 亦无软碟机的个人电脑上执行 Linux 。如果有个网路, 其他的 Unix 系统有著 bootp, tftp, NFS 伺服器,而我们又有一个 eprom 烧录机,那麽我们有办法在建立一个无任何磁碟机的 Linux系统了。 <sect>相关文章<p> <itemize> <item>NFS-root Mini Howto <item>Linux NET-2/3-HOWTO 由 Terry Dawson 所写, <tt>94004531@postoffice.csu.edu.au</tt> <item><tt>/usr/src/linux/README</tt> □於建构以及编译新核心 </itemize> <sect>硬体<p> 在本文所提到的都是以下面的建构来做的 <itemize> <item>Sun-OS 4.1.3 做为启动伺服器 <item>Slackware 2.3 + Linux 1.2.8 + wd 8013 网路卡 <item>已使用中的乙太网路 </itemize> <sect>基本概念<p> 基本概念如下:个人电脑会经由 bootp 协定从启动伺服器中来取得它的 IP 位址。 用 0.0.0.0 为初始 IP 位址,而它的核心程式会经由 tftp 协定。<footnote>跳过区段的启动 (经由路由器router) 并不是个简单问题,所以,不是将伺服器以及无磁碟机的机器放置在同一个网路 区段,就只有建构一个 UDP 辅助位址在你的 router 到伺服器的位址上。细节请参考你的 router 产器手册。</footnote> 以下是我们的步骤 <sect1>设定个人电脑<p> 取得 nfsboot 套件 (可从你较喜欢的 linux mirror 镜射站的 <tt>/pub/Linux/system/Linux-boot</tt> 目录取得)。它包含了一个给 wd8013卡可直接烧录用的 booteprom 映像档。<p> 还有其他方法可以准备个人电脑部份: <itemize> <item>如果你的机器并不是没有磁碟的,那麽你可以使用小小的 DOS 程式或 <item>含有同样套件的二进位软体映像档。 </itemize>如果你选择的是第二者,你必须使用 dd 命令来将这个映像档写入一张软碟片□。<p> 这个映像档包含了 bootp 以及 tftp 客户端程式。 你也需要准备一个 linux 核心程式码,它含有 nfs-root 选项。 <itemize> <item>如果你使用最新的稳定核心程式,如 linux-1.2.13,那麽你需要使用包含在 nfsbootk套件内的 patch 修补核心程式。 <footnote>参考 patch(1)</footnote> <item>如果你想要用最新的,但却不是很稳的 linux-1.3.x 系列核心,那麽你就需要建构 nfs-root 这选项。 </itemize> 随便你要不要建构区块设备 (软碟机或硬碟机) 的支援,但你必须建构 tcp/ip 支援、 wd 乙太网路卡支援、 nfs 档案系统支援。然後重新编译核心程式。 <sect1>在伺服器上设定 bootpd<p> 它可以在 <tt>bootpd-2.4.tar.gz</tt>套件中找到 (可从你较喜欢的 linux mirror 镜射站的 <tt>/pub/Linux/system/Network/boot.net</tt> 目录内)。取得这个套件, 编译并安装它。如果你其他的 Unix 机器也是用 Slackware Linux 的,那麽标准的供应版本就 有 bootpd 了,所以你可以跳过这部份。 daemon 可以直接发出命令来执行 <tscreen><code> bootpd -s </code></tscreen> 或是使用 inetd,但你需修改: <itemize> <item> /etc/inetd.conf 在这些条列中移除 # 号 <tscreen><code> # tftp dgram udp wait root /usr/sbin/in.tftpd tftpd /export # bootps dgram udp wait root /usr/sbin/in.bootpd bootpd </code></tscreen> <item>在 /etc/services 中插入或是移除备注符号: <tscreen><code> bootps 67/tcp # BOOTP server tftp 69/udp # TFTP server </code></tscreen> <item>重新启动 inetd ,使用 <tscreen><code> kill -HUP <process id of inetd>. </code></tscreen> </itemize> <sect1> 在伺服器上建构 bootpd<p> 由先, bootpd 有个叫 bootptab 的建构档,它通常被放在 /etc 内。你必须修改 它,加上你的无磁碟机器的闸道 IP 位址、 dns 伺服器,以及乙太网路位址(es)。 □例如下 /etc/bootptab: <tscreen><code> global.prof:\ :sm=255.255.255.0:\ :ds=192.168.1.5:\ :gw=192.168.1.19:\ :ht=ethernet:\ :bf=linux: machine1:hd=/export/root/machine1:tc=global.prof:ha=0000c0863d7a:ip=192.168.1.140: machine2:hd=/export/root/machine2:tc=global.prof:ha=0800110244e1:ip=192.168.1.141: machine3:hd=/export/root/machine3:tc=global.prof:ha=0800110244de:ip=192.168.1.142: </code></tscreen> global.prof 是 host 项目的一般样本,其中 <itemize> <item>sm 栏包含子网路遮罩 <item>ds 栏包含网域名称伺服器的位址 <item>gw 栏包含内定闸道位址 gateway <item>ht 栏包含网路媒介硬体种类 <item>bf 栏包含启动档档名 </itemize> 之後,每一台机器应该有下面这行 <itemize> <item>首栏包含主机名称 <item>hd 栏包含启动档案的目录 <item>全区样本应该被包含到 tc 栏, <item>ha 栏包含乙太网路卡的硬体位址 <item>ip 栏包含被分配的的 IP 位址 </itemize> <sect1>了解 tftp<p> TFTP (<tt>Trivial File Transfer Protocol</tt>) 是一个档案传输协定,就像 ftp 一样,但 它比比较简化,因此可以容易地在 EPROM □来编码。 TFTP 的使用方法有二种: <itemize> <item> 简单的 tftp: 表示客户端可以存取你的整个档案系统。虽然较简单但却开了一个安全大洞 (任何人都可以经由 tftp 来拿到你的密码)。 <item> 安全的 tftp: tftp 伺服器会使用chroot.2 系统呼叫来改变它自己的根目录。任何在新目录以 外的事件都完全无法存取。因为 chroot 目录变成新的根目录, 硬碟在 bootptab 整档时必须反应 这个新的处境。例如:当我们使用不安全的 tftp 时, hd 栏包含了启动目录的完整路径, : <tt>/export/root/machine1</tt>。 当使用安全的 tftp 时, /export 被当成根目录,而 /export 变成 / ,且 hd 栏就变成 <tt>/root/machine1</tt>了。 </itemize> 几乎每一个 Unix 实作都包含 tfpt 伺服器,也许你并不需要自己安装一个。 <sect1>在远端伺服器上设定一个小型的 Linux 建构 <P> 这包含 Slackware供应版内的 a, ap, n, 及 x 部份。要安装更多的套件也可以;但 是上面的套件已足够一个无磁碟 X 终端机的需求了。首先你需要一个已在运转的 Linux 系统。在远端机器□找一个磁碟空间并 export 它成为可读写并挂上它到 Linux 机器的档案系统上的某一处 (例如 /mnt)。开始 Linux 设定并改变root 选项从 / 变为 /mnt。然後设立如上面所说的套件,如果你只是要执行一个无磁碟的 Linux 那 麽就不需要做其他改变。另一方面,如果你计画使用超过一个以上的无磁碟机器, 那麽上面的设定就需要些许的修改,因为有些档案以及目录必须只有机器本身使用。 我们可以以移开 /usr 目录(它包含非私人的资料)的方式跳过这个问题, 然後建立一个分开的子目录给每一个无磁碟机器。例如,如果 /export/linux/machine1 被挂在 /mnt 上,那麽在初始设定後目录结构会像这样 <tscreen><code> /export/linux/machine1/bin /export/linux/machine1/sbin /export/linux/machine1/lib /export/linux/machine1/etc /export/linux/machine1/var /export/linux/machine1/usr </code></tscreen> <p>改变後你会有 <tscreen><code> /export/linux/machine1/bin /export/linux/machine1/sbin /export/linux/machine1/lib /export/linux/machine1/etc /export/linux/machine1/var /export/linux/usr </code></tscreen> 现在为其他的机器建立目录。从现在开始我们假设你的无磁碟机器分别叫做 machine1、machine2、 machine3等等; 使用以下的 bash 命令手稿来设立其他的目录 <tscreen><code> cd /export/linux for x in machine2 machine3 ; do mkdir $x; cd $x (cd ../machine1; tar cf - *) | tar xvf - done </code></tscreen> 然後做下列的 export: <itemize> <item>/export/linux/usr 唯读(对每个使用者) <item>/export/liunx/machine1 只有对 machine1 有 rw,root 权利。 <item>/export/liunx/machine2 只有对 machine2 有 rw,root 权利。 <item>/export/liunx/machine3 只有对 machine3 有 rw,root 权利。 </itemize> 如下<footnote>下面□列是依照 SunOs 4.1.3 的 exports 档案的语法来做</footnote>: <tscreen><code> # This file is /etc/export # for remote linux X terminals by Buci # this line is only once /export/root/usr -access=linuxnet # these lines once for every host /export/root/machine1 rw=machine1,root=machine1 /export/root/machine2 rw=machine2,root=machine2 /export/root/machine3 rw=machine3,root=machine3 </code></tscreen> 请不要忘了执行 exportfs -a <sect1>建构 tftp 伺服器<p> 现在该是建构 tftp 伺服器的时候了。如果你不需要一个安全的 tftp 那很简单, 因为你的客户端已经可以从 /export 目录来启动。 如果一个安全的 tftp 被采用,那麽你可以在 /tftpboot 目录下做个完整的 /export/linux 目录结构。 (用一个实体核心程式及连结给其他机器的符号连结), 或是让 /export 目录成为安全的 tftpd 的根目录。或者如果你有一另外的 tftpboot 目录,那麽,同样地,你只需要原来的目录结构,然後用一个实体核心程式来 符号连结其他机器) 。 你可以执行下列命令来完成这个设定: <tscreen><code> mkdir -p /tftpboot/export/linux/machine1 cd /tftpboot/export/linux/machine1 cp /export/linux/machine1/<name of the kernel> . </code></tscreen> 然後执行下面: <tscreen><code> mkdir -p /tftpboot/export/linux/machine2 cd ../machine2 ln -s ../machine2/<name of the kernel> </code></tscreen> <sect1>最後工作<p> 最後,你必须插入 <tscreen><code> /sbin/mount nfs_server:/export/linux/usr /usr </code></tscreen> 到 <tscreen><code> /export/linux/<machinex>/etc/rc.d/rc.S </code></tscreen> 的第一行。在这□ <machinex> 指的是 machine1, machine2等等。 <sect>记忆体以及磁碟空间要求; 速度<p> 我只在 Slackware 2.3上测试过;对於其他的供应商(Linux)套件或版本,下面的数字可能会不同。 <itemize> 磁碟空间: 28MB + 6.5MB/每台机器 <item> RAM: 我在 8MB 上跑 X ,只需要 4MB swap 。我猜想,这个可以被建立-为每一部机器分别做- 在 /tmp□面,请不要忘了执行 mkswap。 <item>速度: 我在一台有 8 Megs 的 486 DX2/66 机器上跑并无问题。 </itemize> <sect>可能的错误<p> <itemize> <item>我发现一个奇怪的错误:在 /dev 子目录□, SunOS 搞错了设备名称,所以我被迫 将这个子目录挂上一个有磁碟的 Linux 机器上来重新执行 MAKEDEV 。 (原因是因为 linux nfs 和 SunOs nfs是不同的: 两者都使用32 位元在主要及次要设备名称, 但是linux 使用 16 位元宽度栏在两者上, SunOs 则使用 14 位元宽度栏给主要设备, 18 位元宽给次要设备号码。) <item> 当无磁碟 linux 被启动时,只有一个行径 route 会被放在 tftp 伺服器的行径表□ , 所以你需要设定正确的行径表。你有两种选择: <itemize> <item> 手动建构每一台机器的每一个 rc.S 。 <item> 或使用bootp 客户端套件并写一个通用的设定命令手稿 </itemize> </itemize> <sect>本文件中的错误以及更详细的解说<p> <itemize> <item>正确引用相关的文件。 <item>SunOs 是以 BSD 为基础,所以需要包含 SVR4 (如 Solaris) 为基础的伺服器建构。 <item>虽然 Linux 和 SunOs 都可以做为 bootp/tftp 伺服器,但是 Linux 会比较有用些。 <item> 更新这份文件到最新的 etherboot 套件。 <item> 指出核心程式版本1.2.13 在nfs root 修补後与新的 1.3.x 版(此版已包含了 nfs-root 的修补)的不同处。 <item> 需要试试 wd8013 以外的其他乙太网路卡 <item> 包含 bootpc的建构资讯,一个bootp 客户端来设定正确的 rooting 表。 <item>编排上或其他的错误:麻烦您告诉我一声,谢谢。 <tt>buci@math.klte.hu</tt> </itemize> <p>译者按: 若您发现本文件内容有翻译不顺畅或错误的地方,请您来信告诉我,以做更正,谢谢。 <tt><htmlurl url="mailto:linuxer.bbs@cis.nctu.edu.tw" name="linuxer.bbs@cis.nctu.edu.tw"></tt>。 </article>