Last night I went through this setup in order to build a PXE bootable BartPE. Here are my notes, for consolidation since it took me a while to wade through everything.
Configuration:
TFTP server - Fedora Core 4 standard tftp server v 0.40-6
DHCP server - Fedora Core 4 standard DHCP server (ISC DHCP v 3.0.2-34
NOTE: I have some extra stuff in my dhcpd.conf that is completely unnecessary for a standard installation. I've included it all just for documentation purposes. Your scopes will vary based on your IP addresses, but the main gist of it is to add the PXE stuff. I also have some group inclusions in order to deal with both PXE boots and non-PXE boots. The PXE stuff was lifted from
this site. I'd love to take credit for it, but I can't.
/etc/dhcpd.confCODE
ddns-update-style interim;
ignore client-updates;
option space PXE;
option PXE.mtftp-ip code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option PXE.discovery-control code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr code 7 = ip-address;
subnet 198.202.195.0 netmask 255.255.255.0 {
option routers 198.202.195.253;
option subnet-mask 255.255.255.0;
option broadcast-address 198.202.195.255;
option nis-domain "assetsw.com";
option domain-name "assetsw.com";
option domain-name-servers 198.202.195.70;
option time-offset -18000; # Eastern Standard Time
option ntp-servers 198.202.195.60;
option netbios-name-servers 198.202.195.70;
range dynamic-bootp 198.202.195.150 198.202.195.200;
default-lease-time 21600;
max-lease-time 43200;
host sniffles {
hardware ethernet 00:04:23:47:23:8D;
fixed-address 198.202.195.85;
}
}
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
option vendor-class-identifier "PXEClient";
vendor-option-space PXE;
# At least one of the vendor-specific PXE options must be set in
# order for the client boot ROMs to realize that we are a PXE-compliant
# server. We set the MCAST IP address to 0.0.0.0 to tell the boot ROM
# that we can't provide multicast TFTP (address 0.0.0.0 means no
# address).
option PXE.mtftp-ip 0.0.0.0;
# This is the name of the file the boot ROMs should download.
filename "/startrom.n12";
# This is the name of the server they should get it from.
next-server 198.202.195.60;
}
group {
use-host-decl-names on;
option log-servers 198.202.195.70;
host snifflesvm.assetsw.com {
hardware ethernet 00:0C:29:B6:E2:49;
# hardware ethernet 00:0C:29:EA:B6:E5;
fixed-address 198.202.195.86;
ddns-hostname "snifflesvm.assetsw.com";
ddns-domainname "assetsw.com";
}
}
allow unknown-clients;
The only modification for the tftp server is to edit /etc/xinetd.d/dhcp and set disable = no.
Started with the basic information from the original poster. I copied my Windows 2003 RC2 server disk over to my local drive, then slipstreamed in the SP1 update. Then I configured PE Builder to build from that installation. PE Builder failed on the first run, but that was because my custom drivers for my RAID card were in subdirectories from the txtsetup.oem file, and PE Builder didn't like that. The 2nd failure was because PE Builder can't write an ISO to the root directory of a drive for some reason.
After getting my ISO built, I then followed the procedures from the original poster.
Note: These were all modified after the first failures. See notes below...
Copy startrom.com to /tftpboot/startrom.com
Copy setupldr.exe to /tftpboot/ntldr
Copy NTDETECT.COM to /tftpboot/NTDETECT.COM
Copy bartpe.iso to /tftpboot/bartpe.iso
Setup the winnt.sif file as specified by the original poster. Make absolutely sure that it's in DOS format and not Unix format for line breaks. Run this against it:
dos2unix /tftpboot/winnt.sif
I started with startrom.com, but for whatever reason after loading startrom.com, the install would freeze immediately after loading it. I then fell back on startrom.n12 (which I wanted anyway) and that worked fine, but when it tried to pull in ntldr, it wanted it in capital letters (Linux/Windows difference I suppose - I watched the request with ethereal.) So I renamed ntldr to NTLDR and started again. This time the failure (post loading NTLDR) said Error in NTDETECT.COM. Again, watching it in ethereal, it was requesting ntdetect.com and not NTDETECT.COM. So I renamed NTDETECT.COM to ntdetect.com, restarted, and ntdetect started properly. However, then it said it couldn't find BARTPE.ISO. Yet another rename from bartpe.iso to BARTPE.ISO, and it started perfectly, booted into BartPE, and everything works great.
So you should have the following files in your /tftpboot directory with specific regard to case sensitivity when using standard Linux services:
BARTPE.ISO (or whatever you named it in winnt.sif - just make sure it's all caps)
ntdetect.com
NTLDR
startrom.n12
winnt.sif
I'm now adding all of the stuff I need to automate the entire network startup process without having to click any buttons and only having to type a single password for mounting a disk drive. That's pretty much done at this point. My objective is to perform a complete remote installation using all non-Microsoft services and allowing for multiple (possibly hundreds) of client computers to perform their remote install. I'm working on the ability to load a specific winnt.sif file for the operating system based on the MAC address of the machine making the request. I've already got a lot of that scripting done.
Anyway, I figured I'd post this, since I haven't seen a complete non-Microsoft tftp/dhcp configuration posted yet. Hopefully someone can use this.