This is a Vagrant Environment for a Preboot Execution Environment (PXE) gateway.
Install the Ubuntu 20.04 base box.
Run create_empty_box.sh
to create the empty
environment (the PXE client machines use it as a base box).
Run vagrant up gateway --no-destroy-on-error
to launch the gateway.
Run vagrant up debian_live --no-destroy-on-error
to launch the debian_live
(Debian Live) PXE client. This assumes you have ../debian-live-builder-vagrant/live-image-amd64.hybrid.iso
built as described at the rgl/debian-live-builder-vagrant repository.
Run vagrant up linuxkit --no-destroy-on-error
to launch the linuxkit
(LinuxKit) PXE client. This assumes you have ../linuxkit-vagrant/shared/sshd-kernel
(and sshd-initrd.img
) built as described at the rgl/linuxkit-vagrant repository.
Run vagrant up tcl --no-destroy-on-error
to launch the tcl
(Tiny Core Linux) PXE client.
Run vagrant up winpe --no-destroy-on-error
to launch the winpe
(Windows PE) PXE client. This assumes you have ../windows-pe-vagrant/tmp/winpe-amd64.iso
built as described at the rgl/windows-pe-vagrant repository. Note that vagrant wont be able to connect to it; the idea is just to see it PXE boot.
The winpe
(Windows PE) PXE client can also install Windows from a SMB network share into the local disk, as described at the end of the windows-server-2022/startup.ps1 file.
This is roughly how Debian Live Linux is booted on a PXE PC:
- The PC broadcasts an DHCP request
- The DHCP server offers the TFTP server address (
10.10.10.2
) in theNext server IP address
field and the bootloader (debian-live/lpxelinux.0
) filename in theBoot file name
field - The PC TFTP downloads the
debian-live/lpxelinux.0
file lpxelinux.0
HTTP downloadsldlinux.c32
with a request similar to:GET /debian-live/ldlinux.c32 HTTP/1.0 Host: 10.10.10.2 User-Agent: Syslinux/6.03 Connection: close Cookie: _Syslinux_ip=10.10.10.100%3A10.10.10.2%3A10.10.10.2%3A255.255.255.0 Cookie: _Syslinux_BOOTIF=01-08-00-27-00-00-03 Cookie: _Syslinux_SYSUUID=00000000-0000-4000-8000-000000000003 Cookie: _Syslinux_CPU=6PXL Cookie: _Syslinux_SYSVENDOR=innotek+GmbH Cookie: _Syslinux_SYSPRODUCT=VirtualBox Cookie: _Syslinux_SYSVERSION=1.2 Cookie: _Syslinux_SYSSERIAL=0 Cookie: _Syslinux_SYSFAMILY=Virtual+Machine Cookie: _Syslinux_MBVENDOR=Oracle+Corporation Cookie: _Syslinux_MBPRODUCT=VirtualBox Cookie: _Syslinux_MBVERSION=1.2 Cookie: _Syslinux_MBSERIAL=0 Cookie: _Syslinux_BIOSVENDOR=innotek+GmbH Cookie: _Syslinux_BIOSVERSION=VirtualBox Cookie: _Syslinux_SYSFF=1
lpxelinux.0
HTTP downloads the configuration from one the first addresses that return an HTTP 200:/debian-live/pxelinux.cfg/00000000-0000-4000-8000-000000000003 /debian-live/pxelinux.cfg/01-08-00-27-00-00-03 /debian-live/pxelinux.cfg/0A0A0A64 /debian-live/pxelinux.cfg/0A0A0A6 /debian-live/pxelinux.cfg/0A0A0A /debian-live/pxelinux.cfg/0A0A0 /debian-live/pxelinux.cfg/0A0A /debian-live/pxelinux.cfg/0A0 /debian-live/pxelinux.cfg/0A /debian-live/pxelinux.cfg/0 /debian-live/pxelinux.cfg/default
lpxelinux.0
HTTP downloads and loadslinux
andinitrd
into memorylpxelinux.0
transfers control tolinux
initrd
HTTP downloads and mounts the root filesystem (filesystem.squashfs
)
You can see all of this if you run the following command on your linux host before launching the debian_live
vm:
vagrant ssh-config gateway >tmp/gateway-ssh-config.conf
wireshark -k -i <(ssh -F tmp/gateway-ssh-config.conf gateway 'sudo tcpdump -s 0 -U -n -i eth1 -w - not port 22')