diff --git a/modules/installer/cd-dvd/system-tarball-pc.nix b/modules/installer/cd-dvd/system-tarball-pc.nix index 6162f599096f..9f81695452c2 100644 --- a/modules/installer/cd-dvd/system-tarball-pc.nix +++ b/modules/installer/cd-dvd/system-tarball-pc.nix @@ -21,13 +21,92 @@ let TOTALTIMEOUT 9000 label nixos - MENU LABEL ^NixOS base through NFS + MENU LABEL ^NixOS using nfsroot KERNEL bzImage - append initrd=initrd ip=dhcp tnfsroot=IPADDR:/home/pcroot systemConfig=${config.system.build.toplevel} init=${config.system.build.toplevel}/initrd + append ip=dhcp nfsroot=/home/pcroot systemConfig=${config.system.build.toplevel} init=${config.system.build.toplevel}/init + + # I don't know how to make this boot with nfsroot (using the initrd) + label nixos_initrd + MENU LABEL NixOS booting the poor ^initrd. + KERNEL bzImage + append initrd=initrd ip=dhcp nfsroot=/home/pcroot systemConfig=${config.system.build.toplevel} init=${config.system.build.toplevel}/init label memtest MENU LABEL ^Memtest86+ - KERNEL memtest.bin + KERNEL memtest + ''; + + dhcpdExampleConfig = pkgs.writeText "dhcpd.conf-example" '' + # Example configuration for booting PXE. + allow booting; + allow bootp; + + # Adapt this to your network configuration. + option domain-name "local"; + option subnet-mask 255.255.255.0; + option broadcast-address 192.168.1.255; + option domain-name-servers 192.168.1.1; + option routers 192.168.1.1; + + # PXE-specific configuration directives... + # Some BIOS don't accept slashes for paths inside the tftp servers, + # and will report Access Violation if they see slashes. + filename "pxelinux.0"; + # For the TFTP and NFS root server. Set the IP of your server. + next-server 192.168.1.34; + + subnet 192.168.1.0 netmask 255.255.255.0 { + range 192.168.1.50 192.168.1.55; + } + ''; + + readme = pkgs.writeText "readme.txt" '' + Let all the files in the system tarball sit in a directory served by NFS (the NFS root) + like this in exportfs: + /home/pcroot 192.168.1.0/24(rw,no_root_squash,no_all_squash) + + Run "exportfs -a" after editing /etc/exportfs, for the nfs server to be aware of the + changes. + + Use a tftp server serving the root of boot/ (from the system tarball). + + In order to have PXE boot, use the boot/dhcpd.conf-example file for your dhcpd server, + as it will point your PXE clients to pxelinux.0 from the tftp server. Adapt the + configuration to your network. + + Adapt the pxelinux configuration (boot/pxelinux.cfg/default) to set the path to your + nfrroot. If you use ip=dhcp in the kernel, the nfs server ip will be taken from + dhcp and so you don't have to specify it. + + The linux in bzImage includes network drivers for some usual cards. + + + QEMU Testing + --------------- + + You can test qemu pxe boot without having a DHCP server adapted, but having nfsroot, + like this: + qemu-system-x86_64 -tftp /home/pcroot/boot -net nic -net user,bootfile=pxelinux.0 -boot n + + I don't know how to use NFS through the qemu '-net user' though. + + + QEMU Testing with NFS root and bridged network + ------------------------------------------------- + + This allows testing with qemu as any other host in your LAN. + + Testing with the real dhcpd server requires setting up a bridge and having a tap device. + tunctl -t tap0 + brctl addbr br0 + brctl addif br0 eth0 + brctl addif tap0 eth0 + ifconfig eth0 0.0.0.0 up + ifconfig tap0 0.0.0.0 up + ifconfig br0 up # With your ip configuration + + Then you can run qemu: + qemu-system-x86_64 -boot n -net tap,ifname=tap0,script=no -net nic,model=e1000 ''; in @@ -58,8 +137,17 @@ in { source = pxeconfig; target = "/boot/pxelinux.cfg/default"; } + { source = readme; + target = "/readme.txt"; + } + { source = dhcpdExampleConfig; + target = "/boot/dhcpd.conf-example"; + } { source = "${pkgs.memtest86}/memtest.bin"; - target = "/boot/memtest.bin"; + # We can't leave '.bin', because pxelinux interprets this specially, + # and it would not load the image fine. + # http://forum.canardpc.com/threads/46464-0104-when-launched-via-pxe + target = "/boot/memtest"; } ]; @@ -69,19 +157,6 @@ in services.openssh.enable = true; jobs.openssh.startOn = pkgs.lib.mkOverrideTemplate 50 {} ""; - boot.initrd.postMountCommands = '' - for o in $(cat /proc/cmdline); do - case $o in - tnfsroot=*) - set -- $(IFS==; echo $o) - # TODO: It cannot mount nfs, as maybe it cannot find 'mount.nfs' - mount $2 /mnt-root - ;; - *) ;; - esac - done - ''; - boot.kernelPackages = pkgs.linuxPackages_2_6_39; nixpkgs.config = { packageOverrides = p: rec { diff --git a/modules/installer/cd-dvd/system-tarball.nix b/modules/installer/cd-dvd/system-tarball.nix index 63c5a3117c45..a829b85b59fe 100644 --- a/modules/installer/cd-dvd/system-tarball.nix +++ b/modules/installer/cd-dvd/system-tarball.nix @@ -72,13 +72,16 @@ in inherit (config.tarball) contents storeContents; }; + # Otherwise it will collide with the 'ip=dhcp' kernel autoconfig. + networking.useDHCP = false; + boot.postBootCommands = '' # After booting, register the contents of the Nix store on the # CD in the Nix database in the tmpfs. if [ -f /nix-path-registration ]; then ${config.environment.nix}/bin/nix-store --load-db < /nix-path-registration && - rm /nix-path/registration + rm /nix-path-registration fi # nixos-rebuild also requires a "system" profile and an