WEB开发网
开发学院操作系统Linux/Unix Linux Remote-Boot mini-HOWTO 阅读

Linux Remote-Boot mini-HOWTO

 2005-04-15 11:38:58 来源:WEB开发网   
核心提示:作者:MarcVuilleumierStückelberg,SandroVialeandDavidClerc 译者:曾元佑yytseng@ms16.hinet.net v2.5.2,九月1997 这份文件将说明如何使一群PC拥有相当稳定的Server-based架构,此法可使每台PC在开机时选择使用何种作业系统.此种
作者: Marc Vuilleumier Stückelberg, Sandro Viale and David Clerc
译者: 曾元佑 yytseng@ms16.hinet.net
v2.5.2, 九月 1997 


--------------------------------------------------------------------------------
这份文件将说明如何使一群PC拥有相当稳定的 Server-based 架构 , 此法可使每台PC在开机时选择使用何种作业系统. 此种架构的精要就是 TCP/ip bootPRom ,它可以让使用者在开机时选择不同的开机区块. 此份文件的最新版本,包含超文件连结到可供下载的软体及其它相关的资讯,都可以在这个网址找到 http://cuiwww.unige.ch/info/pc/remote-boot/howto.html. linuxdoc-SGML,DVI 及 postscript各种版本都在这个目录下. 
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

1. 有那些变更...

1.1 ...从 1.x 版後 ? 
一大堆变动: 

Linux server-based 的架构与文件已全部重新设计. 目前是以 RedHat Linux 4.1为主 , kernel 更新成2.0.30 . 更简化了 Linux 系统的设定与维护. 
DOS 和 Windows 的设定也重新设计过, 几乎换成 "hard-disk based" . 如此使得架构更加简化, 开机速度变快, 降低网路的负载,甚至允许Windows NT workstation 采用 server-based setup (虽然还未在本文中谈到). 
目前我们用一台 DHCP server, 遵寻 DHCP/BOOTP extensions (RFC 2132). 
在这个架构也用了 Samba 免费的 SMB server , 来取代 Novell server. 事实上, 我们正要丢掉我们的 Novell server... 

1.2 ...从 2.4 版後? 
新的 开机旗帜 功能已加在 bpunzip 这个工具程式. 它现在可以在 VESA-相容型的显视卡下工作. 开机旗帜可以用 ESC键; 从萤幕中移掉; 其他的按键已不会干扰到 TFTP 的传输. MRZIP,有一只臭□, 在解压缩 磁碟压缩影像 时会导至 "Bad compressed data" 错误, 我们已发现并修正了. 另外在 BPUNZIP 中发现的两只会导至电脑当机的臭□也被修正了. 

更加完整的 . 加入连结到相关软体 ( Shared LAN Cache) 及文件 (from J. Carlstedt, of The Cathedral School of Uppsala, Sweden). 

加入 UNZIPREG 原始程式码的连结位址. 这些资讯是用来跟Windows 95 OSR2搭配使用的. 

bootptag Linux版的工具程式改采 DHCP 取代 BOOTP. 现在可以跟 Solaris 2.6 DHCP server 一起搭配使用. 



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

2. 简介
这里所描述的架构是从1996 夏季开始在 CUI, University of Geneva所发展的. 这个资讯系有许多的伺服器(大多是 Unix 与 Novell), 和一些个人电脑, 可依用途分为两类: 

学生使用 
研究与辅助教学 
以下是我们发展这种架构的目标: 
任何一台电脑都可以执行 Linux, DOS, Windows 3.1 or Windows 95. 每次开机时可以选择所需要的作业系统. 
所有的软体, 包含作业系统, 可以放在伺服器上, 便於安装与更新. 
客户端电脑可以不对伺服器作写入的状态下正常工作(为了安全性),home 目录除外. 
尽可能减少客户端的设定. 客户端可以自动由伺服器取得 IP 组态设定, 这些资讯放在一个小档案, 可供各种作业系统使用. 
大部份的电脑都各自拥有硬碟, 客户端可以靠这优点来降低网路负载与存放使用者的暂存档. 
所有的使用者都 必须注册才能使用电脑. 
注册资讯必须所有的作业系统都相同且使用者可以存取个人的目录,而每种作业系统都一致. 
学生所使用的电脑在每次启动时必须清理一次. 也就是像刚安装完的样子. 
每台电脑可以防毒. 
这些限制使我们选用来自 Köppen EDV GmbH 的 TCP/IP Bootprom 因为这种 Bootprom 跟作业系统无关而令我们相当感兴趣; 它只是模拟出一台软碟机, 而且当以 Linux 开机时就跟 DOS 或 Windows 95 一样简单. 另外,开机磁碟的影像档,可由自制的程式来取代, 这个功能使我们能在作业系统启动前,先做许多初始设定. 


2.1 网路 
Geneva 大学拥有 B 级网域, 分割成许多子网路. CUI 共使用了四个子网路, 其中之一供学生使用. 

原本,我们的个人电脑使用两种网路的通讯协定: IPX 与 IP. IPX 这一类,我们由一台 Novell Netware 3 的伺服器共用 DOS 与 Windows的软体. IP 这一类, 我们由一台 SUN 伺服器靠 NFS 共用 Linux 软体及个人的分割区. 

在我们最新的架构中, 已不再使用 IPX 通讯协定. 改由一台 Unix 伺服器 (可以是 Linux 或 SUN)担任, Linux 客户端可透过 NFS 而 DOS与Windows则由 SMB (NetBIOS) over TCP/IP 共用软体及使用者的档案. 


2.2 它是如何工作 

客户端个人电脑开机後, 在 TCP/IP Bootprom 获得控制权之前先做自我测试. 
Bootprom 送出 BOOTP/DHCP 要求而取得 IP 组态参数. 
如果伺服器收到个人电脑所送出的要求, 就会送回 BOOTP/DHCP 回应,内容包括客户端的 IP 位址, 预设通讯闸道, 及开机影像档. 否则, 伺服器会忽略这个要求. 
Bootprom 由 TFTP 通讯协定从伺服器下载开机影像档, 并同时用这个开机影像档虚拟出一台 BIOS 层级的软碟机. 
个人电脑透过这个开机影像档 开机, 这个开机档只是单纯的开机程式(并不包括作业系统). 
如果这台电脑是学生的个人电脑, 开机程式开始就由 TFTP 通讯协定下载一个小 的文字档其内容是叙述这台电脑的硬碟规划状态. 透过这个小档案, 硬碟的分割区将 重新规划且 DOS 所使用的分割区也被快速格式化. 当所有的工作完成, 这些工作将在开机後三秒内完成. 
开机程式接著让使用者选择所需的作业系统. 
依照使用者的选择, 新的开机影像档将从伺服器透过 TFTP 通讯协定下载. 
如果选择使用 Linux, 开机影像档将包含 kernel loader 及压缩过的 kernel, 此 kernel 将支援 NFS root 及caching 档案系统: 
第一点, IP 组态是透过 BOOTP/DHCP 通讯协定由 Novell 伺服器所接收. 
这个 kernel 可以透过 NFS 挂上一个只能读的 root filesystem. 
挂上一块有写入功能的小型 ramdisk . 
如果在硬碟内发现 swap 分割区, 则为它做好准备并启动它. 
如果在硬碟内发现 linux 分割区, 挂上它并为它做好 caching NFS 分割区. 
IP 组态一完成, 启动所有的服务, 也启动 xdm. 
要求使用者登入. 这台工作站就续. 
如果选择使用 DOS 或 Windows, 开机影像档将是一个可以处理 FAT16 分割区压缩影像的程式. 透过 TFTP 下载开机影像档, 并且储存在硬碟中以供未来使用, 包含任何使用过的分割区. 更严紧的说法是, 这个程式可以在以下的状况中执行: 
这个程式下载一个检查档 (512 bytes)以确认所选作业系统的开机影像档 
如果所需的影像档并不存在磁碟中, 或者与检查档不吻合 (可能是由於开机影像档已被变更或者一个新 的版本被安装到伺服器上), 整个影相像档将透过 TFTP 通讯协定来传输. 
作业系统的影像档解压缩到第一个 FAT16的分割区, 传输速度大约是以每秒一 mega bytes. 
程式接著跳到所选的作业系统的开机磁区, 而它现在已存在本机的硬碟中. 
对 DOS 与 Windows 3.1 而言, 我们使用免费的 Microsoft LanManager for DOS (请透过网路找到较接近您的 mirror 站; 它是由三个档案所组成 disk1 to disk4) 当成 SMB 客户端. Microsoft LanManager 可藉 DHCP 而支援动态设定. 在登入後, 使用者会看到 DOS, 并且可以打 win 启动 Windows 3.1 . 请注意这点, DOS 与 Windows 3.1 就如同安装在客户端一般. 对 Windows 95 而言, 我们也使用 Microsoft SMB 客户端 (叫 Client for the Microsoft Network), 它也可藉 DHCP 而支援动态设定. 我们为降低网路负载使用了 Shared LAN Cache, 一个强而有力的 network-to-disk cache 程式. 
学生所使用的电脑可以很暴力的直接关掉电源而不会有任何问题, 因为硬碟的资料在每次开机都会重新建立. 
对於比较 "安全的" 电脑 (如辅助教学的电脑), 或许有时会使用上述的方法来开机, 有时则直接载入硬碟内的开机影像档而不再清理硬碟. 这样可以允许使用者保留资料在硬碟中. 而当组态修正後又可以完整的更新开机影像档就如同重新安装一般. 


2.3 相关非商业 
这种组态已经成功的移殖到世界上的许多地方. 少数人已经开始篆写一些技巧跟提示来完成这份 How-To. 如果您也曾做过但在本文件中未备引用欢迎送一份 e-mail 给 Marc.VuilleumierStuckelberg@cui.unige.ch. 如果您在重建这种组态中遇到问题, 请在详细看一次文件 ! 

http://www.katedral.se/system/elevsyst, by Johan Carlstedt of The Cathedral School of Uppsala, Sweden. 
http://vitoria.upf.tche.br/~fred/, in portuguese, by Frederico Goldschmidt of the Passo Fundo University, Brasil. 


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

3. 如何设定
首先, 调整机器位置使手边有下列两台机器: 

伺服器, 我们是用一台 Unix 主机. 
客户端, 一台已经启动 TCP/IP Bootprom 的个人电脑, 硬碟内不要有重要资料. 
如果你想要测试您的组态设定而您还没拿到 TCP/IP Bootprom, 您可以到 http://www.incom.de 下载测试版的磁片. 这个磁片可以使您的电脑就好像是插上 TCP/IP Bootprom 一般.If you want to test the configuration but you do not yet have a 

学生所使用的电脑, 我们设定 Bootprom 由网路开机, 不能使用硬碟开机及软碟开机. 教学用电脑, 我们设定 Bootprom 可以由往路开机, 也允许硬碟与软碟开机; 在你的客户端设定 Bootprom. 

伺服器端, 设定 DHCP daemon (我们使用 Internet Software Consortium 所提供的正式版, 970329 发行). 你也必需启动 TFTP daemon. 这份文件将假设您使用 TCP/IP Bootprom 工具磁片内的加强型 TFTP daemon . 如果您较喜欢使用标准的 TFTP daemon, 移掉所有开机影像档的副档名 P, 用来支会 Bootprom 使用标准的 TFTP port (请看 TCP/IP Bootprom 文件). 

别忘了 BOOTP/DHCP 通讯协定被限制在子网域中使用. 如果客户端与伺服端不在同一网域, 您必须在这两网域间架设闸道器. 现在, 先假设两台机器在相同的网域中. 

首先, 我们先做所有作业系统都要得做的事,如: 

设定初始化硬碟的组态及清理 
设定作业系统选单 
测试开机流程 
然後, 对每一种作业系统, 我们将完成下列步骤: 
建立单独的客户端 
把它的组态放到伺服器上 
测试远端开机客户端 
由本尊产生分身 
完成这些事, 以後你所追加的客户端只要插上 Bootprom 再加几行到 DHCP 设定档. 

3.1 设定开机流程 
在伺服器端的 /tftpboot 目录下, 放下列的开机影像档 (这些是二进位格式) 

bpclean, 硬碟清理工具 
bpmenu, TCP/IP Bootprom 选单程式 (包含在您的 Bootprom 工具磁片) 
bpunzip, 我们的硬碟还原工具 
bphdboot, 传送开机程序到硬碟的影像档 

硬碟的初始化与清理
在相同的目录下, 我们建立符号连结到 (或者直接用拷背指令)) bpclean 命名为 XXXclean (或者您认为可以帮助您记住这是用来清理您的客户端机器的名称) 并且产生一个名为 XXXclean.tab 档叙述您客户端所需的硬碟分割区, 及您要联接的开机影像档. 例如: 我们对 2 Gb 硬碟使用下面的方法 


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

# 允许不超过 512 bytes 的说明叙述
# 十六进制请在字首加一个 $ 钱字符

# Part |       |  Part
# type | Boot? |  Size
   6      Y       +500 Mb
  $82     N       +31 Mb
  $83     N       -50 Mb
   0

# 联接的影像档
/tftpboot/XXXmenu


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

完整的档案格式在後面会叙述. 现在您只要知道这些 
分割区型态 6 是指 BIGDOS, ie. 如. DOS Fat-16 由 32Mb 到 500Mb 
分割区型态 hex 82 是 Linux Swap 
分割区型态 hex 83 是 Linux Ext2fs 
大小如为负值,则表示我们的第三个分割区至少要占据 50 Mb 
分割区型态 0 表示是 空的 (未使用的) 分割区. 
现在, bpclean 在不清除分割区资料内容下,将重新写入主要开机计录(master boot record), 当然也包括分割表. 

作业系统选单
同样的, 建立符号连结 (或者直接拷贝) bpmenu 命名为 XXXmenu (或者你认为可以帮助您记住这是客户端机器开机选单的名称) 并且产生一个名为 XXXmenu.m 档叙述您客户端所需的开机选单. 您比可以手动产生这个档案或透过我们写的开机选单全营幕编辑器 menuedit.exe. 例如, 假设您用下列这个档案: 


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

.CLS 23
.ATT 23
.POS 23 4
.WRT Simple Boot Menu                                         \
.POS 23 5
.WRT ----------------                                         \
.POS 23 8
.WRT 1. Boot from local hard disk                             \
.POS 23 10
.WRT 2. Boot DOS and Windows 3                                \
.POS 23 12
.WRT 3. Boot Windows 95                                       \
.POS 23 14
.WRT 4. Boot RedHat Linux                                     \
.POS 23 17
.WRT Your choice :                                            \
.POS 37 17
.KEY 1 :bphdboot
.KEY 2 :linux.PX
.KEY 3 :win31.P
.KEY 4 :win95.P


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


测试开机程序
在您的 DHCP 设定档中加入您的客户端. 并设定开机影像档为 /tftpboot/XXXclean. 您可能需要重新启动您的 DHCP 伺服器使您的变更生效. 

现在我们起动您的客户端. 您可以讯速的看到由 bpclean, 所送出来的讯息, 告诉您它所建立的分割区的大小, 然後您会看到开机选单出现在您的营幕上. 您可以用键盘上的 pause 键来暂停以便读取刚刚的讯息, 但是这可能会导致 TFTP 的连接逾时. 

如果您按下按键 1, 您将收到一个这样的讯息"开机分割区存在一个无效的开机磁区" (the boot partition contains not valid boot sector). 对未被格式化过的开机分割区而言这是正常的. 因为我们现在还未建立任何开机影像档所以其他的按键将会失效... 

现在我们要开始安装各种作业系统. 您可依您的需要来决定先做那一种. 对任何一种作业系统, 您都需要先从软碟来做初始化的动作. 所以我们在看到 TCP/IP Bootprom 的标志後立刻按 space 键换成软碟开机. 

有些作业系统会更动主要开机计录 (master boot record). 特别是 Linux kernel loader (lilo) 会这样做.而这种变动会因 bpclean这个程式而无法完成, 因此您最好改变客户端的 DHCP 设定内容使开机影像档直接跳到 /tftpboot/XXXmenu (不做清理的动作). 别忘了要使您的改变生效,您必需重新启动 DHCP 伺服器. 


3.2 设定 Linux 
在您的客户端架设 RedHat Linux 4.1 支援网路功能, kernel 原始程式码及您所需要的软体套件. 准备未来要挂入的点 (放在 /mnt/tmp 比较有用), 设定您的 X server, 等等. 在 /usr/src/linux-2.0.27 目录中, 您必须有 kernel 2.0.27 的原始程式码. 

现在我们要加入一些修正档, 使它升级到 2.0.30, 并且支援 TCP/IP Bootprom 及档案快取的功能. 档案快取是一个 把 "未确定的" NFS 档案储存在您硬碟中的结构, 它您可以降低网路负载. TCP/IP Bootprom 的支援已经由□Marc Vuilleumier Stuckelberg 完成, 并且由 David Clerc 转移到 kernel 2.0 . 档案快取已经由 Unifix GmbH 完成, 并且已 是 Unifix Linux 2.0 的一部份. TCP/IP Bootprom 及档案快取的支援都已经由它们的作者免费的散布. 

值得注意的是 Linux 对 NFS-Root 的支援只能架构在 BOOTP 通讯协定, 不是 DHCP 通讯协定. 仅管 DHCP 只是 BOOTP 的延伸, Linux 也可以在 DHCP 伺服器下工作 (如果您没有设定 DHCP 伺服器拒绝 BOOTP要求). 


产生 Kernel
首先, 到您的 /usr/src 目录并加入下列修正档, 使用这个指令 

patch -p0 < 修正档的名称: 

patch-2.0.28: 这是一个正式的 kernel 更新, 您一定要加入这个修正档 
patch-config-sound: 一个美化音效设定的修正档, 来自 Unifix Linux 2.0 
patch-PCSP: 一个较大的修正档用来使 PC 的扬声器模拟音效卡, 来自 Unifix Linux 2.0 
patch-bootprom: 一个小的修正档用来产生特别的 kernel image, 使它可由 TCP/IP Bootprom 开机 
patch-filecache: 一个小的修正档使 kernel 加入一些特别功能, 如 Unifix filecache. 来自 Unifix Linux 2.0 
patch-penguinlogo: 一个小的修正档帮助您的使用者等到 Linux 系统完全载入 
patch-2.0.29: 另一个小的正式的 kernel 更新档, 如果您不需要最新版的 kernel 则不用加入它 
patch-2.0.30: 又是一个正式的 kernel 更新档, 满大的. 一样, 您不需要加入这项修正 (但它会改善 TCP/IP 通讯 协定). 如果在您的机器上您没有 alpha 的原始程式码 (这很有可能发生), 这个修正档将出现两次抱怨含入档不存在的讯息. 不要紧张, 只要回答您要跳过这些缺少的档案,不会发生任何问题 
接著执行 make mrproper 及 make xconfig, 产生 kernel. 记住这将是客户端电脑以 Linux 启动时, 唯一接收到的软体, 所以 它必须要包含启动整个作业系统所需的东西. 可以使用模组方式, 但是不包括网路模组. 因为网路功能一定要放在 kernel 中. 简而言之, 您的 kernel 至少需要以下这些 

支援网路 
在有 BOOTP 通讯协定下,支援 NFS-Root 
支援 filecache 
支援客户端电脑的硬体所需的模组 
您可以使用我们的 .config 当做起点. 如果您想要在没有 Bootprom 的状况下测试, 请确定您已经在 kernel 内包含硬碟机的支援. 
当您的选择完成後, 照常地输入 make clean; make dep 接著 make zImage, make modules 与 make modules_install. 这会花一点时间... 现在您准备去测试您的新 kernel, 先用先用 lilo. 安装您的 kernel (参考 lilo 文件),并重新启动您的电脑 (由硬碟启动). 如有任何错误, 修正它们并再试一次. 执行 depmod -a 计算 modules dependencies. 当完全无误时, 执行 make bpImage 产生一个 bootimage 给 TCP/IP Bootprom 使用. 


把 Root 档案系统移到 NFS
您的伺服器要有足够的空间来保存您的整个 Linux 档案系统 (几百 Megabytes). 建立一个新的目录给 NFS 输出, 就叫 rootfs, 并在其中建立另一个新目录就叫 runtime. 我们使用 /export/linux/rootfs/runtime. 把它输出成只有您的 Linux 客户端可读可写, 并具有 root 的存取权 ( annon=0). 例如, 我们的 NFS 是在 Solaris 下执行, 我们用以下这个指令: 


share -F nfs -o rw=pc7971,anon=0 /export/linux/rootfs/runtime. 

在您的 Linux 客户端挂上这个分割区并用GNU tar 把整个 Linux 档案系统复制过去 (预设是 RedHat Linux). 很重要的是当您使用 GNU tar 指令,因为所有的 tar 指令可能无法正确地处理 block device 的 special nodes . 然後编辑档案 /export/linux/rootfs/runtime/etc/fstab 并变更根目录的设定,使根目录符合以 nfs mount 取代自己的硬碟机. 你还要移去 (或者 至少要变更名称) /export/linux/rootfs/runtime/etc/sysconfig/network-scripts/ifcfg-eth0 因为网路装置将由 NFS-root 初始化但不能被初始化两次. 

现在在您的 /etc/lilo.conf 复制一行 linux, 例如:以 linux-nfs 为名, 并加入以下的参数: 


append="root=/dev/nfs nfsroot=/export/linux/rootfs/runtime nfsaddrs=您的-ip:伺服器的-ip:闸道器的-ip:网路遮罩:机器名称" 

(您的-ip 是您的 Linux 客户端的 IP 位址,是以十进位有点的方法表示, 伺服器的-ip 是 NFS 伺服器的 IP 位址, 闸道器的-ip 是 Linux 客户端的预设闸道器, 网路遮罩 是 Linux 客户端的网路遮罩 而 机器名称 是Linux 客户端的主机名称). 再执行一遍 lilo , 重新启动您的电脑 (仍然是由硬碟机), 并选择 linux-nfs 开机设定. 您的电脑将如先前一般启动, 即使有一点慢. 如果在这里有某些东西不能正常工作, 您只要重新开机用您原来 local的 linux 开机设定并试著修正它. 大部份的状况是, 您的 NFS root 设定错误. 如果有任何东西您不了解, 看一下 /usr/src/linux/Documentation 这些档案... 您或许可以看看 NFS-Root-Mini-Howto. 

您可以再试一次,这次只用 append="root=/dev/nfs" 以确定 Linux kernel 可以透过 DHCP/BOOTP要求而获得您所设定的 IP 参数. 如果要这样做, 您必须在您的 DHCP 设定档中加入以下这些选项 (当然是要设定您自己的网路组态), 加上您的机器的硬体及 IP 位址: 


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

option subnet-mask 255.255.252.0;
option routers 129.194.68.1; 
option root-path "/export/linux/rootfs";


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

如果您的 Linux kernel 须要再加入其它指令参数, 您可以用 option option-177 来加入. 
下一步要使我们的系统在 唯读的 NFS 档案系统下可以工作. 


产生唯读的 NFS Root 档案系统
既然我们要我们的 root 档案系统在大部份的 Linux 客户端以唯读的方式挂上, 那就要使档案系统有些微的不同, 因此我们将需要写入权限的地方以 ramdisk 或 filecache 取代. 我们把这个档案系统建立在 /export/linux/rootfs 目录下, 而标准的版本则直接放到 /runtime/ 下. 登入您的 NFS 伺服器并在 /export/linux/rootfs目录下,建立以下的目录跟连结: 


bin -> cache/bin 
dev -> ramdisk/dev 
etc -> ramdisk/etc 
lib -> cache/lib 
root -> ramdisk/root 
sbin -> cache/sbin 
tmp -> ramdisk/tmp 
usr -> cache/usr 
var -> ramdisk/var 
cache/ 
bin -> /runtime/bin 
lib -> /runtime/lib 
sbin -> /runtime/sbin 
usr -> /runtime/usr 
mnt/ 
cdrom/ 
floppy/ 
tmp/ 
proc/ 
ramdisk/ 
dev -> /runtime/dev 
etc -> /runtime/etc 
root -> /runtime/root 
tmp -> /runtime/tmp 
var -> /runtime/var 
就如您所见的, 它看起来像正常的 root filesystem, 除了少部份几个是重新指到 /ramdisk, 有些则重新指到 cache 目录. 当用唯读的 NFS filesystem 开机, 我们将挂上一个已初始化过的 ramdisk 放在 /ramdisk 下. 同样□ 自己硬碟的分割区将被挂在 /cache 给 NFS 快取使用. 粗略的说,这个档案快取的原理是当the principle of the filecache is that whenever a symbolic link from the cache subdirectory is followed, it is replaced by its target. 如果目标自己是一个子目录, 则每一个子目录会转换成一个符号连结并连结到外部档案系统的原始位置. 注意档案快取使用绝对符号连结是必须的, 即使它们在 NFS 伺服器上是无意义的. 如果您不喜欢这样, 可以在您的 NFS 伺服器上,建立一个符号连结由 /runtime 到 /export/linux/rootfs/runtime . 
在唯读的客户端加入一些设定的东西是必须的, 如此才可以挂上 ramdisk, 及设定档案快取和侦测硬体以变更设定档. 这些都由三个程序档和一个组态档来完成, 您可以把它复制到您的NFS 伺服器: 


runtime/etc/rc.d/rc.ramdisk, 可以快速设定并挂上 ramdisk: 

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

#!/bin/sh
#
# 设定一个 ramdisk 因为 root 透过 NFS 以唯读方式挂上
#
modprobe rd
gzip -c -d /runtime/lib/ramdisk.gz | dd of=/dev/ram bs=1k > /dev/null 2>&1
mount -n -t ext2 /dev/ram /ramdisk


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

runtime/etc/rc.d/rc.sysdetect, 这是所有的机器各自独立的设定档, 包括侦测及分配 区域硬碟机的分割区给档案快取使用. 为了空间的理由我们不在此份文件可列印的版本中包含此档, 但您可以在超文件的版本找到它; 
runtime/etc/rc.d/init.d/filecache.init 这是用来启动档案系统的: 

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

#!/bin/sh
#
# filecache:    档案快取:    启动档案快取 (给 NFS root 用)
#
# 来源功能函数库.
. /etc/rc.d/init.d/functions

# 看看我们如何呼叫功能函数.
case "$1" in
  start)
        if [ -e /cache -a -r /etc/filecache.conf ]; then
                echo -n "Starting NFS filecache: "
                # 把 var 与 tmp 移到区域性的硬碟机
                rm -rf /cache/var /cache/tmp
                (cd /ramdisk; tar cf - var tmp) | (cd /cache; tar xf -)
                (cd /ramdisk; rm -rf var tmp;ln -s /cache/var;ln -s /cache/tmp
)
                chmod 777 /cache/tmp
                # 启动档案快取
                daemon filecache -d on
                echo ""
                touch /var/lock/subsys/filecache
        fi
        ;;
  stop)
        filecache off
        rm -f /var/lock/subsys/filecache
        ;;
  *)
        echo "*** Usage: filecache.init {start|stop}"
        exit 1
esac

exit 0


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

runtime/etc/filecache.conf, 档案快取的设定档 

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

Max 100 MB 50 % #
Cache /runtime /cache


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

前两个档案应该放在前两个档案应该放在 runtime/etc/rc.d/rc.sysinit, 档案内最前面的位置, 如下所示: 

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

# 设定所需的  ramdisk  (给 root NFS 唯读的机器)
if [ -e /ramdisk -a -r /etc/rc.d/rc.ramdisk ]; then
        /etc/rc.d/rc.ramdisk
fi

# 设定硬体各自独立的参数 (给每个 root NFS使用)
if [ -r /etc/rc.d/rc.sysdetect ]; then
        /etc/rc.d/rc.sysdetect
fi


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

而第三个应该 be bound as usual to the System V init directories: we use links named S35filecache in the rc3.d and rc5.d directories, and K80filecache in the rc0.d, rc1.d, rc2.d and rc6.d directories. 
检查一下 rc.sysdetect 这个档案, 并使它与您的硬体设备配合. 特别要注意的是, 如果您跟我们一样没有使用相同的显示卡及萤幕 (这很可能发生的 :-), 看看它们在 /proc/pci 的回应并依此修改叙述档. 在每台机器所使用的存放位置下, 其 rc.sysdetect 之中有一段内容为, 可自订的设定档 (例如 printcap), a为了能每台独立工作, 您需要於伺服器的 dhcpd.conf 档案中, 用特别的标记 option-132 设定每台机器所使用的位置. 在您继续安装之前, 您至少要先建立基本的几个档案 runtime/etc/fstab.ref 和 runtime/etc/hosts.ref , 这些将由 rc.sysdetect 叙述档在启动时透过侦测设定来完成, 为了动态的设定 X servver, 使用 RedHat 软体套件, 有一件事您必须先变更的: 在 /usr/X11R6/bin 及 /usr/X11R6/lib/X11 目录下, 有一些相关的连结设定档及目录应该改成绝对连结. 别忘了以後的 X server 更新安装也要如法泡制. 

把 filecache 安装在 runtime/bin 目录下, 并把它的使用说明 man page 安装在 runtime/usr/man/man8 目录下. 把 bootptag 或 dhcptag 安装在 runtime/usr/local/bin 目录下, 并且 bootptag.c (或 dhcptag.c) 必须放在 runtime/usr/local/src 目录下: 它是一个发送 BOOTP/DHCP 要求, 并以相容於 shell 的标准输出格式回应 BOOTP/DHCP 内容的小程式, 就如下的□例所示: 




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

bootp_your_ip='129.194.71.32'
bootp_server_ip='129.194.77.31'
bootp_filename='XXXclean'
bootp_subnet_mask='255.255.252.0'
bootp_routers='129.194.68.1'
bootp_domain_name_servers='129.194.69.200 129.194.8.7 129.194.4.32'
bootp_host_name='pc7132'
bootp_domain_name='unige.ch'
bootp_root_path='/export/linux/rootfs'
bootp_broadcast_address='129.194.71.255'
bootp_nis_domain='cuisunnet.unige.ch'
bootp_nis_servers='129.194.69.200'
bootp_option_132='dufour'


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

标记的名称与 RFC 2132 很相似. 如果您使用 dhcptag, 您将得到一些以 dhcp_ 开头的标记, 这些是 DHCP-规格的选项内容; 为了顾及相容性, 其它的资讯仍然以 bootp_ 为字首. 我们使用这个程式自动设定 rc.sysdetect. 最後, 在 runtime/lib 安装 makeramdisk script . 我们将用它自动产生 ramdisk 影像档. 这些软体都在超文件的版本中. 
现在试著由客户端以 read-write NFS 开机 (仍然用硬碟开机). 它将侦测您客户端的个别组态, 并产生适当的档□ 检查 /etc/fstab, /etc/hosts, /etc/sysconfig/network 是否设定正确. 如果您看到的不是这样, 请在单人工作模式下重试一遍, 并找出您在 rc.sysdetect 叙述档中所犯的错误. 

等到它可以正常工作, 到 /lib 目录下执行 ./makeramdisk. 将会花几秒钟, 来产生一个 ramdisk 影像档给唯读的 NFS 客户端. 把产生出来得 ramdisk image 放在这 /lib/ramdisk.gz, 就这样您的组态就绪了! 


由 Bootprom 开机
如果您还未完成它, 请安装您的 TCP/IP Bootprom-相容的 kernel 影像档 (可在这找到 /usr/src/linux/arch/i386/boot/bpImage) 即您伺服器上的 /tftpboot/linux.PX . rc.sysdetect 这个叙述档用来初始化您的 Linux swap 及 Linux 资料分割区. 因为要启动它, 故编辑伺服器上 XXXclean.tab 这个档案并改变分割区的型态由 hex 82 改为 hex 28, 及 hex 83 改为 hex 38. 这是一种未知的分割区型态, 但是安装程序档能把它当成预备分割区来辨识. 在 DHCP 的设定档中, 把开机档设定为 XXXclean , 使它能重新建立分割表. 别忘了在修改完设定档後要重新启动 DHCP daemon. 

最後, unexport 可读写的 runtime 目录, 并 export 唯读的 /export/linux/rootfs 目录. 重新启动客户端, 这一次使用开机使用 Linux 选单的选项. 您的系统现在已是 remote-boot Linux. 


系统维护与更新
如果您以後想更新软体,安装一些错误修正档或安全性修正档, 请按照下列步骤: 

Unexport rootfs 目录 
Export runtime 目录为可读可写给您得客户端 
设定您客户端的 nfsroot 目录为 runtime (在 /etc/bootptab 中设定) 
启动您得 Linux 客户端, 并安装您想安装的东东. 不要怕使用 rpm, 它可以做得很好 (只要小心当您安装任何软体套件时,要注意一些您做过的修正可能有些要作修改). 
当您完成後重新换成正常的 export 
这是指, 您必须在 local 安装的状态下, 才能更新您的 server-based 设定的软体. 

3.3 设定 DOS 6 及 Windows 3.1 
在您的客户端电脑, 使用您喜欢的 dos 软碟开机 (记得开机时, 按空白键取消 BootPROM 开机). 格式化您硬碟中的 dos 分割区并加上 /S 参数, 使它放入作业系统. 建立一个名为 DOS 的子目录, 把 DOS 拷贝进去. 安装你所喜欢的网路客户端程式 (例如 Microsoft LanManager), Windows 3.1, 等等. 使用 DHCP 通讯协定设定 IP 组态. 

您必须恢复原本被 BootPROM 所使用掉的记忆体空间 (当 DOS 启动後这些记忆体不再需要用到啦) 加入下面这一行到您 config.sys 内的第一行: 



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

device=\util\bputil.sys -r


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

(bputil 是一个 TCP/IP BootPROM 工具磁片中的程式). 不用怕使用 EMM386 最佳化您所使用的记忆体, 您可以把网路卡 ROM 所占的区域纳入管理, 因为它在这时已经用不到了. 但要记得把网路卡所使用的 RAM 区块不纳入管理, 否则您将无法连接到您的伺服器. 
如果您不让您的客户端机器使用无效的登入名称, 把我们的 nobreak.sys pseudo-device 驱动程式放在您 config.sys 的开头处并把以下这些东西放到您的 autoexec.bat: 



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

rem -- 我们使用 c:\logged 为一个旗号
del c:\logged >nul
:loginneeded
cls
echo Please type in your login name and passWord
echo.
net logon *
rem -- the login script 已经建立好 c:\logged
if not exist c:\logged goto loginneeded
del c:\logged
rem -- 使 break 功能生效
echo Yes >NOBRK


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

重新开机并在开机选单中选择 Boot from local hard-disk 选项, 确定可以开机. 


把组态设定移到伺服器
回到伺服器上, 建立一个分享名称为 admin , 用来放一些系统管理者用的东东. 如果伺服器是跑 Unix, 建议您把 /tftpboot 子目录用 softlink 放一份到 admin , 这样您可以直接由客户端传回开机影像档. 在 admin 目录内, 建一个 /utils 子目录并放入如下的工具: 

mrzip.exe, 一个用来压缩您客户端硬碟影像档的程式. 
mrunzip.exe, 一个用来回存您硬碟影像档到伺服器的程式. 
您也需要把一些用来清理硬碟及产生压缩影像的批次档放到相同的目录下,这些批次档如下: 

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

@echo off
if "%1"=="" goto error
echo >c:\lanman.dos\lmuser.ini
l:\utils\mrzip l:\tftpboot\%1
goto end
:error
echo Usage: MAKEIMG {image-name-without-extension}
:end


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

现在回到您的客户端, 以下将以 admin mount 为磁碟机 L: 为□例作说明接著执行您建立的批次档, 如果您还没做那可以按下列的指令执行 (不一定要用绝对路径 ) 




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

        L:\util\mrzip L:\tftpboot\win31


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

一分钟过後, 您伺服器上的 /tftpboot 子目录下将有两个新档案, 名称为 win31.imz, 是您硬碟内容的压缩影响档win31.chk, 这是相关的检查档 (是 partition boot record 细部修改後的拷贝). 在这真正的目录内, 只要建立一个 bpunzip 的 symbolic link (或这用拷贝的) 且命名为 win31.P. 

您的硬碟为主的远端开机设定现在一切就绪啦. 


测试远端开机客户端
现在重新启动您的客户端并在开机选单中选 DOS and Windows 3.1 的选项. bpunzip 这程式将传给您一些它产生影像的表格讯息, 并自网路下载整个开机影像档 (因这是第一次它看到这个开机影像档). 这将会花掉一分钟左右. 接著它会解压缩这个影像到 DOS 分割区, 并由他开机. 这就是你要的, 您的远端开机客户端完成啦 ! 

下一次您重新开机, 它只会解压所这个影像档, 大概在 30 秒内完成. 


转换设定档给其他机器
如果您要为每台机器修正一些设定 (例如预设印表机), 或者如果您需要变更一些不能透过 DHCP 通讯协定修改的网路设定, 您可以使用 unzipreg.exe 程式来处理, 它必须放到客户端的 autoexec.bat (原始程式码在 这). 这程式将读取一个由 bpunzip 产生的特殊隐藏档案, 名称为 BOOTP.ANS, 它的内容是由伺服器透过 BOOTP/DHCP 通讯协定回传的. 接著, 它将读取第一个参数所指的档案名称, 藉由 BOOTP/DHCP 的回应内容, 以 UNZIPREG: 标签名 : 这种格式取代所有的字串, 并把结果写入第二个参数所指的档案名称. 例如, 如过您有个档案名为 input.bat 内容为: 




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

set hostname=UNZIPREG:HOSTNAME:
set domainname=UNZIPREG:DOMAINNAME:
set gateway=UNZIPREG:ROUTER:
set subnetmask=UNZIPREG:SUBNET:
set printer=UNZIPREG:T180:


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

而您执行了这个指令 

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

        unzipreg input.bat output.bat


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

您将得到一个档案名为 output.bat 包含内容: 

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

set hostname=pc7179
set domainname=unige.ch
set gateway=129.194.76.1
set subnetmask=255.255.252.0
set printer=laserwriter1


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

假设您的 DHCP 设定档定义这台机器名为 pc7179, 领域名称为 unige.ch, 等等, 而 option-180 标记是 laserwriter1. 
也可以透过这种登入修改 Windows 桌面. 我们写了一个小程式 simple program 用来增加 PROGMAN.INI 档案, 允许为一群使用者设定同样的桌面. 

在为任何一台客户端机器设定後, 别忘了使用 mrzip 重新建立磁碟影像档以维持您的所有变更. 


3.4 设定 Windows 95 
在此份文件先前的版本, 我们使用过微软公司的 Windows 95 server-based installation, 但是用这方法太过痛苦又不是那麽的有价值: 

它就真的是非常的虚拟 
大部份的软体套件都不支援它而且如果您试著去安装结果通常是失败的. 包括, Microsoft Internet Explorer, OnNet 32, Novell's Protected-mode client (这较 Microsoft Client for Netware安全). 
因为微软公司不提供 Windows 95 在真实模式下的 TCP/IP 相容的驱动程式所以您无法使用 Microsoft Network client over TCP/IP 这也就意味著您不能使用 Samba 
因为当客户端一启动就会锁住一些动态连结档造成许多程式几乎无法更新, 如果您试著去更新它则会出现违背分享(sharing violations)的错误. 
因此几个月前我们放弃这份错误百出的资料 (您仍然可在这找到 http://cuiwww.unige.ch/info/pc/remote-boot/win95old/win95old.html) 然後换到我们这个新的 disk-based 远端启动的概念. 基本上, 这种 Windows 95 安装方法就跟安装 DOS一样容易. 

建立一台独立的客户端
在客户端用 DOS 开机, 如果您已经设定好 DOS/Windows 3.1 那就随便由开机选项中选一个, 或者用一个软碟开机 (按 space 键可以跳过 BootPROM). 使用第一种方法的优点是你已经有一台可使用网路的客户端, 并且只需要把 Windows 95 的安装磁片放到您的伺服器上的某个地方. 

如果您由软碟开机, 您的第一步是安装作业系统, 方法是格式化您硬碟机的 DOS 分割区并用 /S 的选项. 如果您使用 DOS/Windows 3.1 的组态, 那麽首先您要清除一些您安装 Windows 95 时不需要的档案以及一些在您最後的开机影像中不需要的档案 (例如, WINDOWS 这个目录). 

开始安装 Windows 95, 照著步骤把它装在 local . 安装最後, 程式会重新启动您的客户端电脑, 做一些设定并再重新启动一次. 这几次的重新开机, 您必须再您的开机选单选择 Boot from local hard-disk 选项. 等到您设定好您所需要的驱动程式後, 您可以执行 defrag 做完整的硬碟重组 (包含重组未使用得磁碟空间). 

您或许也想要使用 BootPROM 所占掉的记忆体, 只要在 config.sys 第一行加上 : 



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

device=\util\bputil.sys -r


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

(bputil 是放在 TCP/IP Bootprom 工具磁片中). 不同於 DOS, 您避需避免在 Windows 95 中使用 EMM386 . 
如果您要使用 Windows 95 OSR2 (或叫 MSWIN 4.1, 或者 Windows 95 service pack 1, 或者 Windows 95 with Internet Explorer), 您要在 MSDOS.SYS 中的 [Options] 段加一行 (没错它是文字档): 



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

AUTOSCAN=0


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

这样可以使 Windows 知道您开机时不自动启动 ScanDisk . 
当所有的软体都放在伺服器时, 如果您要减轻网路及伺服器的负担 (这将增进您的系统效率) , 您可以考虑安装这套相当不错的 Shared LAN Cache,由 Measurement Techniques, Inc 生产的 (参考 http://www.lancache.com). 这套软体在每台客户端电脑执行, 它会对所有从网路上取得的资料放在区域性的硬碟中快取. 即使像 MS-Office 在您第二次执行时也会更快... 您的每台客户端电脑都要有一份版权, 不是它还不是很贵, 这家公司对於大专院校有特惠价格. 更好的是您可以到他们的网页下载免费的评估版. 



把设定档移到伺服器
伺服器端, 如果您目前还没有建一个名为 admin 的目录, 那就建一个. 这将放一些系统管理要用的东西. 如果伺服器是 Unix 的机器, 现在把 admin 目录用 softlink 到 /tftpboot 子目录下, 这样您可以由客户端直接把影像档放到这. 在 admin 目录内, 建立一个 /utils 子目录并把下列工具放进去: 

mrzip.exe, 一个用来产生您客户端硬碟机压缩影像的程式. 
mrunzip.exe, 一个用来把压缩影像档从伺服器回存到您客户端硬碟的程式. 
在您的客户端开个 MS-DOS 视窗, 可以把您的 admin 用网路磁碟机挂在 L: 并执行下列的指令 (不一定要使用绝对路径, 多打几个字无害啦 :-) 



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

        L:\util\mrzip L:\tftpboot\win95


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

这将在伺服器的 /tftpboot 子目录下, 产生两个新档案, 名为 win95.imz, 一个您客户端硬碟机的压缩影像及 win95.chk, 检查用的档案 (其实内容是把开机分割区做些许的变动). 真正的目录, 只要建个名为 win95.P 的符号连结到 bpunzip (或者拷背一份) . 

现在您的 Windows 95 远端开机组态就完成啦. 


测试远端开机客户端
现在重新启动您的客户端电脑并从开机选单中选择 Windows 95 . bpunzip 程式将给您一些关於它更新影像表的讯息, 并且从网路下载整个开机影像 (如果它是第一次看到这个开机影像). 这大约会花掉两分钟. 接著它将解压缩这个影像档到 DOS 分割区, 并启动它. 就这样, 您的远端开机客户端就序啦! 下一次您重新开机, 它只会解开这个影像档, 大概会花 40 秒. 


转换为其它分身的设定
Windows 95 与 Windows 3.1 最大的不同是加入了即插即用的程式码, 即自动侦测您的硬体设备. 它本身无舍坏处, 但问题是出在它太过灵敏, 而且有时後会出□. 

如果您试著用同样的开机影像去启动另一台客户端机器, 您将在收到一堆 Windows 侦测到新的硬体设备的讯息: 一片新的音效卡, 一棵新的硬碟机, 一片新的网路卡, 或者一只新的滑鼠... 会这样的原因有二: 


这些设备可能使用不同的硬体资源 (比如, 滑鼠不是接在相同的连接埠, 音效卡不是接在同样的扩充槽 - 没错, 这会被侦测到) 
这些设备可能通知 Windows 95 它们的序号 (比如, 每台跑 Windows 95 的网路卡, 从最基础的乙太网路位址就每台都不一样了) 
事实上 , 如果 Windows 95 的即插即用功能可以正常工作的话, 自动侦测变更的硬体设备并不会出问题, 所以如果即插即用功能失效时, 问题就来了. 例如, Windows 95 对上我们的罗技 PS2 滑鼠时就不能即插即用, 更糟的是滑鼠就消失了. 要解决这类问题方法就是, 尽可能使全部电脑有相同的设备. 
您无法避免的问题是每台电脑的网路卡. 很不幸的, 给我们的 SMC EtherEX 使用的即插即用的程式码会使电脑当机. 唯一的解法是使 Windows 95 相信它已经知道有这片网路卡, 且不需触动即插即用机制. 这个技巧就是透过开机自动执行档 autoexec.bat , 自动的把关於这片网路卡的设定值加入 Windows 95 的系统注册资讯. 要注意的是使用 PCI 的网路卡并不需要这个技巧. 

到您的客户端电脑, 编辑开机自动执行档 autoexec.bat 并加入下列几行: 



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

rem --- 修正 Windows 系统注册资讯以避免即插即用功能侦测
cls
unzipreg c:\lib\smc.reg c:\temp\smc.reg
regedit /L:c:\win95\system.dat /R:c:\win95\user.dat c:\temp\smc.reg
echo.
del c:\temp\smc.reg


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

regedit 是标准 Windows 95 的程式. 如果您在 Windows 95下执行它,它可以帮您流览您的系统登录资讯, 或者如果您在 DOS 下执行它, 它可以对您的系统登录资讯做一些简单的修正. unzipreg.exe 是一个自制的小程式, 您可以放在您的路径下的任何地方 (原始程式至在 这). 它将读取一个由 bpunzip 所产生的特别隐藏档案, 名称是 BOOTP.ANS, 它包含来自伺服器的原始 BOOTP/DHCP 回应资讯. 然後, 它将读取第一个参数的档案(c:\lib\smc.reg), 然後以 BOOTP/DHCP 回应的资料取代档案内所有以 UNZIPREG:tagname: 为格式的内容, 接著写入第二个参数的档案(c:\temp\smc.reg). 
在 lib 子目录下, 我们有个名为 smc.reg 的档案其内容如下: 



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

REGEDIT4

[HKEY_LOCAL_MACHINE\Enum\ISAPNP\SMC8416\UNZIPREG:MACID:C0]
"HardwareID"="*SMC8416,ISAPNP\SMC8416"
"HWRevision"="1.0.10"
"DeviceDesc"="SMC EtherEZ (8416)"
"Class"="Net"
"Driver"="Net\\0001"
"CompatibleIDs"="*SMC8416"
"Mfg"="SMC"
"ConfigFlags"=hex:10,00,00,00

[HKEY_LOCAL_MACHINE\Enum\ISAPNP\SMC8416\UNZIPREG:MACID:C0\Bindings]
"MSTCP\\0001"=""

[HKEY_LOCAL_MACHINE\Enum\ISAPNP\SMC8416\UNZIPREG:MACID:C0\LogConfig]
"0000"=hex:00,04,00,00,00,20,00,00,10,00,00,00,04,00,00,00,00,00,00,00,a8,0e,\
  00,00,20,00,00,00,02,00,00,00,01,00,0c,00,00,00,00,00,00,00,00,00,e0,ff,20,\
  00,40,02,ff,03,00,00,04,03,2c,00,00,00,01,00,00,00,01,00,14,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,e0,ff,ff,00,20,00,00,00,00,0c,00,ff,ff,0f,00,00,\
  00,00,00,2c,00,00,00,01,80,00,00,01,00,14,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,e0,ff,ff,00,80,00,00,00,00,0c,00,ff,5f,10,00,00,00,00,00,00,00,00,\
  00

[HKEY_LOCAL_MACHINE\Enum\ISAPNP\SMC8416\UNZIPREG:MACID:C1]
"HardwareID"="*SMC8416,ISAPNP\SMC8416"
"HWRevision"="1.0.10"
"DeviceDesc"="SMC EtherEZ (8416)"
"Class"="Net"
"Driver"="Net\\0001"
"CompatibleIDs"="*SMC8416"
"Mfg"="SMC"
"ConfigFlags"=hex:10,00,00,00

[HKEY_LOCAL_MACHINE\Enum\ISAPNP\SMC8416\UNZIPREG:MACID:C1\Bindings]
"MSTCP\\0001"=""

[HKEY_LOCAL_MACHINE\Enum\ISAPNP\SMC8416\UNZIPREG:MACID:C1\LogConfig]
"0000"=hex:00,04,00,00,00,20,00,00,10,00,00,00,04,00,00,00,00,00,00,00,a8,0e,\
  00,00,20,00,00,00,02,00,00,00,01,00,0c,00,00,00,00,00,00,00,00,00,e0,ff,20,\
  00,40,02,ff,03,00,00,04,03,2c,00,00,00,01,00,00,00,01,00,14,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,e0,ff,ff,00,20,00,00,00,00,0c,00,ff,ff,0f,00,00,\
  00,00,00,2c,00,00,00,01,80,00,00,01,00,14,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,e0,ff,ff,00,80,00,00,00,00,0c,00,ff,5f,10,00,00,00,00,00,00,00,00,\
  00


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

这个档案一开始由 Windows 95 的 regedit 产生. 我们把关於网路卡的设定部份输出成一个档案 ( HKEY_LOCAL_MACHINE/Enum/ISAPNP/SMC8416) 然後用 UNZIPREG:MACID: 记号取代网路卡的硬体位址. 当我们在这档案中执行 unzipreg , 它会自动的以网路卡真实的硬体位址值取代我们所设定的记号. 注意这里有个数字在 MACID 之後的有时是 C0 有时是 C1. 即使放一个不存在的网路卡在这个登录档中不会出□, 我们还是把两项都放进去. 
还要一次ㄡ, 这整个技巧对 PCI 网路卡而言并不需要. 顺便一提的是, 我们可以用同样的方法自动的配置主电脑名称, 当 Windows 95 不能透过 DHCP 取的设定时. 我们只须加入下列几行到我们的 smc.reg 档案中: 



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

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VNETSUP]
"ComputerName"="UNZIPREG:HOSTNAME:"

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\MSTCP]
"HostName"="UNZIPREG:HOSTNAME:"

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\control\ComputerName\ComputerName]
"ComputerName"="UNZIPREG:HOSTNAME:"


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

您也可以使用同样的机器按照机器的型态跟位置来设定其他的环境. 这个□例, 您一样可以参考 DOS/Windows 3.1 那一段的叙述. 

在变更任何客户端机器的设定後, 千万别忘了用 mrzip 重新建立磁碟影像, 否则您所有的设定都会不见. 

使用这个系统登录资讯的小技巧, 您的设定资讯将可以正常的转移到所有的机器. 如果您无法避免 Windows 去侦测一些机器上的新硬体, 试著由这台机器重新建立磁碟影像档. 包含针对这台机器所设定的登录资讯也要放入磁碟影像中, 如果顺利的话可以解决这个问题. 

当磁碟影像档解压缩时会花一些时间 (通常是 20-30 秒.), 您可以给使用者一些讯息或者就放张漂漂的图给他们看. 这个工作可以很简单的完成 (看看下一篇文件的 BPUNZIP ). 

如果您想得到更多设定 Samba 的资讯与工具给远端开机的电脑使用, 我们还写了另一份文件. 可以看看 http://cuiwww.unige.ch/info/pc. 



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

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

4. TCP/IP Bootprom 相关工具程式
这一段将把我们为 TCP/IP BootPROM 所写的程式作一些说明. 


4.1 MENUEDIT 
这是在 DOS 下执行的程式, 用来编辑给 TCP/IP Bootprom 的开机选单叙述档. 它很简单, 不过比原厂所提供的开机选单叙述档来的方便. 您可以按 F1 看到一些线上说明. 如果您想要加强他的功能 ( 比如加入剪贴功能), 我会很乐意发表您的新版本. 

原始程式为 Pascal 语法可在 这取得. 


4.2 BPHDBOOT 
此 boot image 将载入硬碟的 master boot record 并执行它. 

这个 boot image 对於那些需要重新开机才能完成所有设定的作业系统是相当方便的. 它也可以用在当您要强迫清理硬碟的时候. 

原始程式为 Assembler 语法可在 这取得. 


4.3 BPCLEAN 
此 boot image 将重新写入硬碟的 master boot record, 包含硬碟的分割表. 此外, 它可以快速格式化 DOS (FAT16) 资料分割区 (但无法使它可开机). 因为版权的关系, 我们必须重新规划我们的 master boot record 与 FAT16 开机磁区, 除了一些远端开机的讯息外, 它们与标准的分割区大致上是一样的. 为了使这个程式能工作, 您或许需要关掉 BIOS 对 master boot record 的保护 (因为每次开机都更新一遍). 

这个程式下载与这个程式同样主档名的分割表叙述档其副档名为 .tab. 这个档案可以包含空行, 注解由记号开始但不得超过 512 个字元. 

前四个不含空白及注解的几行应该包含四个硬碟分割区的叙述. 第五个不含空白及注解的那一行应包含下一个要载入的开机影像档名称. 

分割区的叙述行由由空格或 tab 键来分割, 必须如下这三种格式: 



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

type  boot?  1st-cyl  1st-head  1st-sect  last-cyl  last-head  last-sect
type  boot?  1st-cyl  1st-head  1st-sect  relative-size
type  boot?  relative-size


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

第一种格式, 给予精确的分割区叙述. 
第二种格式, 第一个 sector 位置有定义但分割区的结束位置是依要求的分割区大小自动计算. 
第三种格式, 第一个 sector 依照前一个分割区的结束位置自动推算且分割区的结束位置是靠所要求的分割区大小自动计算. 这种格式是完全决定於硬碟的大小. 
所有的数字都假设十进制, 除非字首有出现钱字号, 这样才会被设定为十六进制. 
分割区的 type DOS 分割区小於 32 Mb 为 4, DOS 分割区在 32Mb 到 500Mb 之间为 6 . 其他的值可以在使用 Linux fdisk help 找到例子. 
如果可开机分割区 boot? 这一段应该设定成 Y 而其它分割区设定成 N . 这个旗标是给主要开机纪录 (master boot record) 所使用. 
1st-cyl, 1st-head 及 1st-sect 是关系著这个分割区的第一个磁区. 千万别忘记,磁柱及磁头是从 0 开始, 而磁区是从 1 开始. 
last-cyl, last-head 及 last-sect 是关系著 这个分割区的最後一个磁区. 分割区通常结束在磁柱的边界. 
分割区所占的 大小比例 可以下列的方法表示: 
+ 10 Mb 是指分割区至少要有 10 Mb (即 2048 磁区); 
- 100 Mb 是指分割区必须预留至少 100 Mb (即 20480 磁区) 可用的空间给下一个分割区; 
+ 30 % 是指分割区必须在目前的位置, 占住至少 30 perceny 的空间; 
- 70 % 是指分割区应留下至少 70 percent 的空间在目前的位置给下一个分割区. 
以大小比例定义分割区时通常会在磁柱的边界结束, 并且除非第一个分磁区的位置是正确的, 才会从磁头的边界处开始. 以我们所知, 这是为了符合标准的使用. 
当一个标签附加在一个分割区叙述句之後, 相对应的分割区会被格式化成 DOS FAT16 的分割区,无论原本是哪种格式. 分割区形式 4 跟 6 是相容的, 而且它在清理学生所使用的电脑时相当有用的. 这种快速格式化只要花几十秒. 

预设值, bpclean 是编译成支援 LBA (不超过 1024 个磁柱, 但可达 256 个磁头). 某些奇怪的 BIOS 及某些奇怪的作业系统较喜欢另一种 NORMAL 模式 (可达 4096 个磁柱, 但不能超过 64 个磁头); 如果您需要这种模式, 那麽把 LBA 的定义从原始程式里改成注解然後重新编译一遍. 

Assembler 语法的原始程式码在 这. 


4.4 MRZIP, MRUNZIP and BPUNZIP 


MrZip 是一个在 DOS 下执行的程式, 用来建立压缩的 DOS FAT 16分割区. 第一步, 先分析磁碟机的使用状况, 它然後只对有使用到的资料做压缩, 接著用相当快的 (并不是最有效率的) 统计的压缩演算法则来压缩资料. 已经支援 Windows 95 的长档名, 但是副档名为 .SWP 的档案并不会储存. 在各式不同的档案类型中,已经包含许多 magic numbers, 且已跟原始资料做过检查的 处理. 当档案容量的高位序号数字增大时, 这个检查码储存在档案的容量的低位序号数字中 . 如果您在建立压缩影像档前把您硬碟的序号归零, 则您可以使用这个数字来 追踪您影像档的更新次数. 

因为 MrZip 会使用直接磁碟存取, 建议您在执行前先把磁碟机快取区的资料回存. Windows 95 似乎是对做一制性的管理直接磁碟存取□ 

MrUnzip 是一个在 DOS 下执行的程式,用来解压缩磁碟影像档到硬碟机中, 使用直接磁碟存取. 不要跟任何具有快取功能的程式一起使用, 因为光是这个程式就已经快把 DOS 给折磨死了... 不管怎样, 如果您要恢复一个无法开机的机器那麽它会是将很有用的. 

BpUnzip 是一个开机影像用来管理压缩硬碟的影像档. 粗略的来说, 它将由硬碟机的影像来开机并用同样的名称, 副档名为 .imz. 

首先, 它会先读取分割区表并检查 


第一个 DOS 分割区, 磁碟影像档回存的地方 
分割区中最後一个磁柱, 以後将储存压缩硬碟影像. 
接著它会读取第一个未用到的磁柱的第一个磁区并检查是否已经有一个影像表. 如果不是这样, 或者影像表内容有点矛盾, 或者两个 shift 键都被按下时 (一种特别的 general-cleaning 信号), 这个影像表将会被清除. 
如果影像表还没有包含所需的影像, 它会透过 TFTP 通讯协定载入并加在影像表内. 如果在前面所载入的影像之後, 没有足够的空间来存放旧的影像资料时, 则旧的影像档会被砍掉. 如果影像档已经存在影像表中, 最新的开机影像磁区 (包含检查码) 将会透过 TFTP 通讯协定载入并且与目前得影像档做比较. 如果它们不完全一致, 则压缩影像会再重新载入一次. 

这个影像接著会被解压缩, 所有的 magic numbers 都再确认, 并检查解压缩後的资料. 如果解压缩失败, 或者检查结果与最新的开机磁区不吻合, 则影像档将会重新载入并修正一次. 否则, 程式会把控制权交给开机磁区, 作业系统就会启动. 

如果 bpunzip 透过副档名 .P 载入 (如 win95.P), 则它会假设 TFTP 伺服器在 port 59 有加强型的介面 (在正规的 port 69 之外所附加的). BpUnzip 将透过它以较大的封包格式载入影像档, 通常是以 1408 bytes 来取代每个封包 512 bytes (这种转换使用大封包的技巧有点像TCP/IP Bootprom所使用的). 

同理, 如果 bpunzip 是透过副档名 .G 载入 (如 win95.GP), 则它将会先下载一个以同样主档名的 GIF 图档 (如 win95.gif) 并在开机时把它秀在营幕上. 这个程式只能在 800x600, 256 色的模式下工作 (即使 GIF 图档可以更小或者使用更少的颜色). 如果您想要看看开机的流程记录, 则这个标题可以按 ESC 键移除. 如果您的显示卡不是 VESA 相容型, 则这个功能您不能使用. 另外,还要注意的是这个标记的执行完成棒是使用调色盘的 最後十六色来显示. 如果不想使用这个功能, 或者希望修正它. 顺便一提, 如果您不喜欢我们标记的执行完成棒, 您可以自由的改变它 (在 GIFDATA.ASM), 但请保留我们的名字在可以看得到的地方. 

目地分割区不需要完全跟原始的大小相同 ; 它只要有足够的空间来存放分割区中,所有使用到的磁柱. 如果目地分割区小於原始的分割区, 则 档案对硬表 FAT 将会因此而萎缩 (但磁柱大小则不变). 如果目地分割区大小大於原始分割区, 则 档案对应表 FAT 将会尽可能的扩大. 然而, 如果目地分割区比原始分割区大更多, 可能 65518 个磁柱就不够覆盖所有的空间 (因为磁柱大小是无法改变的). 像这种状况, bpunzip 将会产生警告,告诉使用者有一些空间流失掉了. 

预设值, bpunzip 是编译成支援 LBA (不超过 1024 个磁柱, 但可达 256 个磁头). 某些奇怪的 BIOS 及某些奇怪的作业系统较喜欢另一种 NORMAL 模式 (可达 4096 个磁柱, 但不能超过 64 个磁头); 如果您需要这种模式, 那麽把 LBA 的定义从原始程式里改成注解然後重新编译一遍. 

Assembler 语法的原始程式码在 这. 

如果使用 Solaris 2.5 当 TFTP server. 在处理超过 16 Megabytes 时, 会有问题. 这是因为它无法处理超过 32768 packets per file 这是一个已知的臭□, 但直到目前 SUN 仍未提供修正. 我们建议您使用更有效率的加强型 extended TFTP server (它也支援其他作业系统, 就在 TCP/IP Bootprom 工具磁片中). 


4.5 NOBREAK 
Nobreak.sys 相当小 (大概只有 350 bytes ) 的驱动程式, 它将加在您 config.sys 中的开始处. 它的目的是保护开机程序, 直到使用者登入. DOS 为这提供一种设定 (名为 BREAK=OFF), 但它不够暴力, 并且在 autoexec.bat 没舍用. 我们的驱动程式工作原理是当中断要求产生时修改键盘的扫描码, 直接在 BIOS 层工作. 以这方法, 所有的程式在中断未致能前都收不道中断讯息. 

这个驱动程式必须放在 config.sys 档中(或者使用 Undocumented DOS 的 devlod 程式). 接著, 可以透过传送 Yes 到 NOBRK 这个虚拟装置, 并且传送 No 而禁能 (事实上, 只需要第一个字元, Y 或 N 才是最重要的). 

因为这个驱动程式依靠 BIOS, 所以它只能在 DOS 跟 Windows 3.1.下工作 Windows 95 则有它自己的低阶键盘处理机制. 

Assembler 语法的原始程式码在 这. 



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

5. 讨论
我们在这将讨论关於这个架构的相关理论性议题. 


5.1 Bootproms 与 硬碟机 
Bootproms 已经出现相当久了, 而通常我们只会把它们使用在无磁碟机的电脑. 但我们主张, Bootproms 用在具有硬碟机的电脑将更有趣, 因为我们得到了双面的利益: 

一个 Bootprom 可以使得您的架构更加稳定, 因为它可以确定电脑必定会以同一个开机步骤开机, 即使是中了病毒或分割表损毁. 还可以这样作, 也就是我们做过的, 在载入作业系统之前先清理您的硬碟 
有硬碟机使得这个组态更加有效率, 因为它可以透过快取而降低网路负载, 并允许更有效率的 swap. 

5.2 使用那一种 Bootprom ? 
个人电脑可用的 Bootproms 相当多. 我们有许多理由选择 Köppen EDV GmbH 的 TCP/IP Bootprom : 


它是以 BOOTP/DHCP 通讯协定为基础, 这些通讯协定已由 RFCs 公开的定义. 它的定义是当 BOOTP/DHCP 伺服器收到未知的客户端的要求讯号, 将不会有任何回应. 这是用来防止有多台伺服器时而互相干扰, 当您苦於 MSD 开机伺服器的体验. 而且, 而且 IP 只能在子网路内广播, 这样比起 IPX 会产生较低的杂讯. 
它可使用多种作业系统. 
技术资料与 API 资料可索取. 
可以自己写开机载入程式 (我们试过) 
开机的程序可以有更多的变化. 特别是, 它可以允许我们在旧式的 AST 电脑关掉软碟的开机, 这在原机器的 BIOS 不包括这项功能. 
提供建立与维护开机选单的工具. 


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

Tags:Linux Remote Boot

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接