Making the system-tarball-pc boot fine with PXE, and include help files and a
readme file as examples for an easy PXE setup. This allows booting the NixOS in the system tarball, and thus allows installing nixos. svn path=/nixos/trunk/; revision=28585
This commit is contained in:
parent
8f6a4be721
commit
4bc0bfec4c
@ -21,13 +21,92 @@ let
|
|||||||
TOTALTIMEOUT 9000
|
TOTALTIMEOUT 9000
|
||||||
|
|
||||||
label nixos
|
label nixos
|
||||||
MENU LABEL ^NixOS base through NFS
|
MENU LABEL ^NixOS using nfsroot
|
||||||
KERNEL bzImage
|
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
|
label memtest
|
||||||
MENU LABEL ^Memtest86+
|
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
|
in
|
||||||
@ -58,8 +137,17 @@ in
|
|||||||
{ source = pxeconfig;
|
{ source = pxeconfig;
|
||||||
target = "/boot/pxelinux.cfg/default";
|
target = "/boot/pxelinux.cfg/default";
|
||||||
}
|
}
|
||||||
|
{ source = readme;
|
||||||
|
target = "/readme.txt";
|
||||||
|
}
|
||||||
|
{ source = dhcpdExampleConfig;
|
||||||
|
target = "/boot/dhcpd.conf-example";
|
||||||
|
}
|
||||||
{ source = "${pkgs.memtest86}/memtest.bin";
|
{ 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;
|
services.openssh.enable = true;
|
||||||
jobs.openssh.startOn = pkgs.lib.mkOverrideTemplate 50 {} "";
|
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;
|
boot.kernelPackages = pkgs.linuxPackages_2_6_39;
|
||||||
nixpkgs.config = {
|
nixpkgs.config = {
|
||||||
packageOverrides = p: rec {
|
packageOverrides = p: rec {
|
||||||
|
@ -72,13 +72,16 @@ in
|
|||||||
inherit (config.tarball) contents storeContents;
|
inherit (config.tarball) contents storeContents;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Otherwise it will collide with the 'ip=dhcp' kernel autoconfig.
|
||||||
|
networking.useDHCP = false;
|
||||||
|
|
||||||
boot.postBootCommands =
|
boot.postBootCommands =
|
||||||
''
|
''
|
||||||
# After booting, register the contents of the Nix store on the
|
# After booting, register the contents of the Nix store on the
|
||||||
# CD in the Nix database in the tmpfs.
|
# CD in the Nix database in the tmpfs.
|
||||||
if [ -f /nix-path-registration ]; then
|
if [ -f /nix-path-registration ]; then
|
||||||
${config.environment.nix}/bin/nix-store --load-db < /nix-path-registration &&
|
${config.environment.nix}/bin/nix-store --load-db < /nix-path-registration &&
|
||||||
rm /nix-path/registration
|
rm /nix-path-registration
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# nixos-rebuild also requires a "system" profile and an
|
# nixos-rebuild also requires a "system" profile and an
|
||||||
|
Loading…
Reference in New Issue
Block a user