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 {startstop}" 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 不包括這項功能. 提供建立與維護開機選單的工具.