电脑技术学习

Linux 无盘工作站 Mini Howto

dn001
作者: Robert Nemkin buci@math.klte.hu
译者: 谢昆中 HSIEH Kun-Chung, ( linuxer.bbs@cis.nctu.edu.tw )

v0.0.3版, 1996年 9月12日 


--------------------------------------------------------------------------------
本文件在叙述如何设立一个无磁碟 Linux 机器。著作权为 Robert Nemkin 所有。著作权条款依照 GPL。我想要谢谢 Bela Kis  将这份文件翻译成为英文。 
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

1. 修改

v0.0.3版 1996年9月12日: 一小部份的修改 


--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

2. 如何设立一个无磁碟的 Linux 机
本文件在叙述如何设立一个无磁碟 Linux 机器。有时候我们可能需要在一个既无硬碟亦无软碟机的个人电脑上执行 Linux 。如果有个网路, 其他的 Unix 系统有著 bootp, tftp, NFS 伺服器,而我们又有一个 eprom 烧录机,那麽我们有办法在建立一个无任何磁碟机的 Linux系统了。 



--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

3. 相关文章

NFS-root Mini Howto 
Linux NET-2/3-HOWTO 由 Terry Dawson 所写, 94004531@postoffice.csu.edu.au 
/usr/src/linux/README □於建构以及编译新核心 


--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

4. 硬体
在本文所提到的都是以下面的建构来做的 

Sun-OS 4.1.3 做为启动伺服器 
Slackware 2.3 + Linux 1.2.8 + wd 8013 网路卡 
已使用中的乙太网路 


--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

5. 基本概念
基本概念如下:个人电脑会经由 bootp 协定从启动伺服器中来取得它的 IP 位址。用 0.0.0.0 为初始 IP 位址,而它的核心程式会经由 tftp 协定。 

跳过区段的启动 (经由路由器router) 并不是个简单问题,所以,不是将伺服器以及无磁碟机的机器放置在同一个网路区段,就只有建构一个 UDP 辅助位址在你的 router 到伺服器的位址上。细节请参考你的 router 产器手册。
以下是我们的步骤 


5.1 设定个人电脑 
取得 nfsboot 套件 (可从你较喜欢的 linux mirror 镜射站的 /pub/Linux/system/Linux-boot 目录取得)。它包含了一个给 wd8013卡可直接烧录用的 booteprom 映像档。 

还有其他方法可以准备个人电脑部份: 

如果你的机器并不是没有磁碟的,那麽你可以使用小小的 DOS 程式或 
含有同样套件的二进位软体映像档。 
如果你选择的是第二者,你必须使用 dd 命令来将这个映像档写入一张软碟片□。 
这个映像档包含了 bootp 以及 tftp 客户端程式。你也需要准备一个 linux 核心程式码,它含有 nfs-root 选项。 

如果你使用最新的稳定核心程式,如 linux-1.2.13,那麽你需要使用包含在 nfsbootk套件内的 patch 修补核心程式。 
参考 patch(1)
如果你想要用最新的,但却不是很稳的 linux-1.3.x 系列核心,那麽你就需要建构 nfs-root 这选项。 
随便你要不要建构区块设备 (软碟机或硬碟机) 的支援,但你必须建构 tcp/ip 支援、 wd 乙太网路卡支援、 nfs 档案系统支援。然後重新编译核心程式。 


5.2 在伺服器上设定 bootpd 
它可以在 bootpd-2.4.tar.gz套件中找到 (可从你较喜欢的 linux mirror 镜射站的 /pub/Linux/system/Network/boot.net 目录内)。取得这个套件,编译并安装它。如果你其他的 Unix 机器也是用 Slackware Linux 的,那麽标准的供应版本就有 bootpd 了,所以你可以跳过这部份。 daemon 可以直接发出命令来执行 


--------------------------------------------------------------------------------

        bootpd -s


--------------------------------------------------------------------------------

或是使用 inetd,但你需修改: 
/etc/inetd.conf 在这些条列中移除 # 号 

--------------------------------------------------------------------------------

# tftp   dgram   udp     wait    root    /usr/sbin/in.tftpd     tftpd /export
# bootps dgram   udp     wait    root    /usr/sbin/in.bootpd    bootpd


--------------------------------------------------------------------------------

在 /etc/services 中插入或是移除备注符号: 

--------------------------------------------------------------------------------

bootps          67/tcp          # BOOTP server
tftp            69/udp          # TFTP server


--------------------------------------------------------------------------------

重新启动 inetd ,使用 

--------------------------------------------------------------------------------

        kill -HUP .


--------------------------------------------------------------------------------


5.3 在伺服器上建构 bootpd 
由先, bootpd 有个叫 bootptab 的建构档,它通常被放在 /etc 内。你必须修改它,加上你的无磁碟机器的闸道 IP 位址、 dns 伺服器,以及乙太网路位址(es)。 □例如下 /etc/bootptab: 


--------------------------------------------------------------------------------


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:


--------------------------------------------------------------------------------

global.prof 是 host 项目的一般样本,其中 

sm 栏包含子网路遮罩 
ds 栏包含网域名称伺服器的位址 
gw 栏包含内定闸道位址 gateway 
ht 栏包含网路媒介硬体种类 
bf 栏包含启动档档名 
之後,每一台机器应该有下面这行 

首栏包含主机名称 
hd 栏包含启动档案的目录 
全区样本应该被包含到 tc 栏, 
ha 栏包含乙太网路卡的硬体位址 
ip 栏包含被分配的的 IP 位址 


5.4 了解 tftp 
TFTP (Trivial File Transfer Protocol) 是一个档案传输协定,就像 ftp 一样,但它比比较简化,因此可以容易地在 EPROM □来编码。 TFTP 的使用方法有二种: 

简单的 tftp: 表示客户端可以存取你的整个档案系统。虽然较简单但却开了一个安全大洞 (任何人都可以经由 tftp 来拿到你的密码)。 
安全的 tftp: tftp 伺服器会使用chroot.2 系统呼叫来改变它自己的根目录。任何在新目录以外的事件都完全无法存取。因为 chroot 目录变成新的根目录, 硬碟在 bootptab 整档时必须反应这个新的处境。例如:当我们使用不安全的 tftp 时, hd 栏包含了启动目录的完整路径,: /export/root/machine1。当使用安全的 tftp 时, /export 被当成根目录,而 /export 变成 / ,且 hd 栏就变成 /root/machine1了。 
几乎每一个 Unix 实作都包含 tfpt 伺服器,也许你并不需要自己安装一个。 

5.5 在远端伺服器上设定一个小型的 Linux 建构 
这包含 Slackware供应版内的 a, ap, n, 及 x 部份。要安装更多的套件也可以;但是上面的套件已足够一个无磁碟 X 终端机的需求了。首先你需要一个已在运转的 Linux 系统。在远端机器□找一个磁碟空间并 export 它成为可读写并挂上它到 Linux 机器的档案系统上的某一处 (例如 /mnt)。开始 Linux 设定并改变root 选项从 / 变为 /mnt。然後设立如上面所说的套件,如果你只是要执行一个无磁碟的 Linux 那麽就不需要做其他改变。另一方面,如果你计画使用超过一个以上的无磁碟机器,那麽上面的设定就需要些许的修改,因为有些档案以及目录必须只有机器本身使用。我们可以以移开 /usr 目录(它包含非私人的资料)的方式跳过这个问题,然後建立一个分开的子目录给每一个无磁碟机器。例如,如果 /export/linux/machine1 被挂在 /mnt 上,那麽在初始设定後目录结构会像这样 


--------------------------------------------------------------------------------

/export/linux/machine1/bin
/export/linux/machine1/sbin
/export/linux/machine1/lib
/export/linux/machine1/etc
/export/linux/machine1/var
/export/linux/machine1/usr


--------------------------------------------------------------------------------

改变後你会有 


--------------------------------------------------------------------------------

/export/linux/machine1/bin
/export/linux/machine1/sbin
/export/linux/machine1/lib
/export/linux/machine1/etc
/export/linux/machine1/var
/export/linux/usr


--------------------------------------------------------------------------------

现在为其他的机器建立目录。从现在开始我们假设你的无磁碟机器分别叫做 machine1、machine2、 machine3等等;使用以下的 bash 命令手稿来设立其他的目录 


--------------------------------------------------------------------------------

 
        cd /export/linux
        for x in machine2 machine3 ; do
                mkdir $x; cd $x
                (cd ../machine1; tar cf - *) | tar xvf -
        done


--------------------------------------------------------------------------------

然後做下列的 export: 

/export/linux/usr 唯读(对每个使用者) 
/export/liunx/machine1 只有对 machine1 有 rw,root 权利。 
/export/liunx/machine2 只有对 machine2 有 rw,root 权利。 
/export/liunx/machine3 只有对 machine3 有 rw,root 权利。 
如下 
下面□列是依照 SunOs 4.1.3 的 exports 档案的语法来做
: 

--------------------------------------------------------------------------------

 
# 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


--------------------------------------------------------------------------------

请不要忘了执行 exportfs -a 

5.6 建构 tftp 伺服器 

现在该是建构 tftp 伺服器的时候了。如果你不需要一个安全的 tftp 那很简单,因为你的客户端已经可以从 /export 目录来启动。 

如果一个安全的 tftp 被采用,那麽你可以在 /tftpboot 目录下做个完整的 /export/linux 目录结构。 (用一个实体核心程式及连结给其他机器的符号连结),或是让 /export 目录成为安全的 tftpd 的根目录。或者如果你有一另外的 tftpboot 目录,那麽,同样地,你只需要原来的目录结构,然後用一个实体核心程式来符号连结其他机器) 。 你可以执行下列命令来完成这个设定: 


--------------------------------------------------------------------------------

      mkdir -p /tftpboot/export/linux/machine1
      cd /tftpboot/export/linux/machine1
      cp /export/linux/machine1/ . 


--------------------------------------------------------------------------------

然後执行下面: 



--------------------------------------------------------------------------------

      mkdir -p /tftpboot/export/linux/machine2
      cd ../machine2 
      ln -s ../machine2/ 


--------------------------------------------------------------------------------


5.7 最後工作 

最後,你必须插入 


--------------------------------------------------------------------------------

   /sbin/mount nfs_server:/export/linux/usr /usr


--------------------------------------------------------------------------------

到 



--------------------------------------------------------------------------------

   /export/linux//etc/rc.d/rc.S


--------------------------------------------------------------------------------

的第一行。在这□  指的是 machine1, machine2等等。 



--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

6. 记忆体以及磁碟空间要求; 速度
我只在 Slackware 2.3上测试过;对於其他的供应商(Linux)套件或版本,下面的数字可能会不同。 

磁碟空间: 28MB + 6.5MB/每台机器 
RAM: 我在 8MB 上跑 X ,只需要 4MB swap 。我猜想,这个可以被建立-为每一部机器分别做-在 /tmp□面,请不要忘了执行 mkswap。 
速度: 我在一台有 8 Megs 的 486 DX2/66 机器上跑并无问题。 


--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

7. 可能的错误

我发现一个奇怪的错误:在 /dev 子目录□, SunOS 搞错了设备名称,所以我被迫将这个子目录挂上一个有磁碟的 Linux 机器上来重新执行 MAKEDEV 。 (原因是因为 linux nfs 和 SunOs nfs是不同的: 两者都使用32 位元在主要及次要设备名称,但是linux 使用 16 位元宽度栏在两者上, SunOs 则使用 14 位元宽度栏给主要设备, 18 位元宽给次要设备号码。) 
当无磁碟 linux 被启动时,只有一个行径 route 会被放在 tftp 伺服器的行径表□ , 所以你需要设定正确的行径表。你有两种选择: 
手动建构每一台机器的每一个 rc.S 。 
或使用bootp 客户端套件并写一个通用的设定命令手稿 


--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

8. 本文件中的错误以及更详细的解说

正确引用相关的文件。 
SunOs 是以 BSD 为基础,所以需要包含 SVR4 (如 Solaris) 为基础的伺服器建构。 
虽然 Linux 和 SunOs 都可以做为 bootp/tftp 伺服器,但是 Linux 会比较有用些。 
更新这份文件到最新的 etherboot 套件。 
指出核心程式版本1.2.13 在nfs root 修补後与新的 1.3.x 版(此版已包含了 nfs-root 的修补)的不同处。 
需要试试 wd8013 以外的其他乙太网路卡 
包含 bootpc的建构资讯,一个bootp 客户端来设定正确的 rooting 表。 
编排上或其他的错误:麻烦您告诉我一声,谢谢。 buci@math.klte.hu 

译者按: 若您发现本文件内容有翻译不顺畅或错误的地方,请您来信告诉我,以做更正,谢谢。 linuxer.bbs@cis.nctu.edu.tw。 


--------------------------------------------------------------------------------

标签: linux