冷呆獸試驗場

在Linux上架設RIS安裝XP與2003 - 1

在參考了一些文章之後,就試著將Windows的RIS整合到Linux的PXE server上,經過了一個禮拜的努力終於成功了,來把過程紀錄一下。

主要參考網頁:

首先將PXE環境架設起來,這個部份跳過,網路上的參考網頁也很多,主要是DHCP、TFTPD、還要安裝SAMBA,因為RIS的安裝是透過SAMBA抓取檔案的,再將/tftproot設定為名字是ris的分享。再確認是否有安裝perl與python,稍後的部份需要這兩種語言。

TFTPD的部份:設定檔要作些修改,使用rule檔案

server_args = -m /tftpboot/rules -s /tftpboot

這個rules檔案的內容如下

ri ^[a-z]: # Remove “drive letters”  
rg \\ / # Convert backslashes to slashes  
rg \# @ # Convert hash marks to @ signs  
rg /../ /..no../ # Convert /../ to /..no../  
rg A a  
rg B b  
rg C c  
rg D d  
rg E e  
rg F f  
rg G g  
rg H h  
rg I i  
rg J j  
rg K k  
rg L l  
rg M m  
rg N n  
rg O o  
rg P p  
rg Q q  
rg R r  
rg S s  
rg T t  
rg U u  
rg V v  
rg W w  
rg X x  
rg Y y  
rg Z z  
r ^/(.*) \1

請注意,在套用這個rules檔之後,將會使所有對tftpd的要求都轉為小寫,所以在/tftproot下的所有檔案也要轉為小寫,不然tftpd就會找不到而回傳File not found。

/tftproot下建立winxp與win2k3及inf三個目錄,接著將XP與2003安裝光碟內的I386目錄分別複製到winxp與win2k3目錄內,到這邊為止/tftproot底下的目錄結構應該是像這樣

/tftproot  
├ inf  
├ win2k3  
│└ i386  
└ winxp  
 └ i386

為什麼要放在/tftproot內而不用連結?因為之前用連結,都會有無法取得檔案的問題,所以這邊是實體直接放在/tftproot內。

接著要開始作出RIS的boot file,沒有cabextract程式的可以到官方網頁下載。

WindowsXP的部份:

cabextract winxp/i386/STARTROM.N1_  
sed -i -e 's/NTLDR/XPLDR/gi' startrom.n12  
mv startrom.n12 /tftproot/winxp.0  
cabextract winxp/i386/SETUPLDR.EX_  
sed -i -e 's/winnt\.sif/winxp\.sif/gi' setupldr.exe  
sed -i -e 's/ntdetect\.com/ntdetect\.wxp/gi' setupldr.exe  
mv setupldr.exe /tftproot/xpldr  
cp winxp/i386/NTDETECT.COM /tftproot/ntdetect.wxp  

Windows 2003 Server的部份:

cabextract win2k3/i386/STARTROM.N1_  
sed -i -e 's/NTLDR/W2K3L/gi' startrom.n12  
mv startrom.n12 /tftproot/w2k3.0  
cabextract win2k3/i386/SETUPLDR.EX_  
sed -i -e 's/winnt\.sif/wi2k3\.sif/gi' setupldr.exe  
sed -i -e 's/ntdetect\.com/ntdetect\.2k3/gi' setupldr.exe  
mv setupldr.exe /tftproot/w2k3l  
cp win2k3/i386/NTDETECT.COM /tftproot/ntdetect.2k3  

再來是建立winxp.sif與wi2k3.sif兩個設定檔,可直接參考RIS for Linux內的設定,我是自己再改過,以達到選完硬碟分割區就一路裝到完的目標。下面是節錄winxp.sif的內容,基本上把路徑的winxp改成win2k3就可以當wi2k3.sif來用了,當然序號不能通用。

[data]  
AutoPartition = "0"  
floppyless = "1"  
msdosinitiated = "1"  
UnattendedInstall = "Yes"  
OriSrc = "\\server_name_or_ip\ris\winxp\i386"  
OriTyp = "4"  
LocalSourceOnCD = "1"  
DisableAdminAccountOnDomainJoin = "1"  

[SetupData]  
OsLoadOptions = "/fastdetect"  
SetupSourceDevice = "\Device\LanmanRedirector\server_name_or_ip\ris\winxp"  

[Unattended]  
UnattendMode = "FullUnattended"  
FileSystem = "LeaveAlone"  
NtUpgrade = "No"  
OverwriteOemFilesOnUpgrade = "No"  
DriverSigningPolicy = "Ignore"  
UpdateInstalledDrivers = "Yes"  
ConfirmHardware = "No"  
ExtendOEMPartition = "0"  
TargetPath = "\WINDOWS"  
UnattendSwitch = "Yes"  
WaitForReboot = "No"  
CrashDumpSetting = "0"  
OemSkipEula = "Yes"  
OEMSkipWelcome = "1"  
InstallFilesPath = "\\server_name_or_ip\ris\winxp\i386"  
LegacyNIC = "1"  

[UserData]  
ProductKey = "XXX...."  
FullName = "abc"  
OrgName = "xyz"  
ComputerName = *  

[GuiUnattended]  
AdminPassword = xxxxx  
EncryptedAdminPassword = "No"  
OEMSkipRegional = "1"  
TimeZone = "220"  
OemSkipWelcome = "1"  

[Identification]  
JoinWorkgroup = WORKGROUP  

[RemoteInstall]  
Repartition = "No"  
UseWholeDisk = "No"  

[Networking]  
InstallDefaultComponents = "Yes"

如果要詳細設定sif檔的內容,可以參考WINNT.SIF Reference

再來最重要的就是要把這兩個i386目錄內的檔名與目錄名全都改成小寫:

find ./ -depth | perl -ne 'chomp;m[^/]*$>;$d=$`;$_=$f=$&;''s/([\x80-\xFF].)|(\w)/$1\l$2/g;system "echo",$d.$f,$d.$_ if $f ne $_'

上面這行會列出目前目錄底下有那些檔名或目錄名有包含大寫字母的,如果有的話再執行下面這行,將所有大寫字母全部替換為小寫。

find ./ -depth | perl -ne 'chomp;m[^/]*$>;$d=$`;$_=$f=$&;''s/([\x80-\xFF].)|(\w)/$1\l$2/g;system "mv",$d.$f,$d.$_ if $f ne $_'  

Guides & How-To去抓Ris for Linux Tools,這個工具組包含了負責擔任Binl Server的程式,將ris-linux-0.4.tar.gz抓下來之後解開,將安裝Windows所需的inf放在/tftproot/inf內,執行

./infparser.py /tftproot/inf

再執行

./binlsrv.py

注意,這個程式在安裝時不可關掉,或是加上-d讓它以daemon型態在背景執行。

/tftproot/pxelinux.cfg/default內加上

label winxp  
  kernel winxp.0  

label win2k3  
 kernel w2k3.0  

接下來就可以用PXE開機,鍵入winxp就可以開始安裝WindowsXP,鍵入win2k3就會開始安裝Windows 2003 Server。下一篇再說明自己在設定過程中遇到的問題。