nfs, docker, pxe boot integration test - all ready
This commit is contained in:
parent
acace867a8
commit
e5bd5aa61e
1 changed files with 68 additions and 43 deletions
111
common.nix
111
common.nix
|
|
@ -83,7 +83,6 @@
|
|||
jq
|
||||
_7zz
|
||||
sbctl
|
||||
dracut
|
||||
openssl
|
||||
grub2_efi
|
||||
];
|
||||
|
|
@ -129,48 +128,74 @@
|
|||
};
|
||||
};
|
||||
};
|
||||
systemd.services.pxeboot = {
|
||||
serviceConfig.Type = "oneshot";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
path = with pkgs; [ xz dracut grub2_efi util-linux ];
|
||||
script = let
|
||||
grubCfg = pkgs.writeText "grub.cfg" ''
|
||||
set timeout=10
|
||||
set path=(http,$net_default_server)/local/boot/pxe
|
||||
set nfs="rw ifname=ens0:$net_default_mac ip=$net_default_ip::$net_default_server:255.255.0.0::ens0:none root=nfs4:$net_default_server:/srv/nfs"
|
||||
menuentry Arch {
|
||||
linux $path/arch/linux $nfs/arch/root
|
||||
initrd $path/arch/initramfs
|
||||
}
|
||||
menuentry Fedora {
|
||||
linux $path/fedora/linux $nfs/fedora/root selinux=0
|
||||
initrd $path/fedora/initramfs
|
||||
}
|
||||
'';
|
||||
in ''
|
||||
if [ ! -e /srv/tftp/grubx64.efi ]; then
|
||||
echo "Building grub"
|
||||
grub-mkstandalone -O x86_64-efi --compress=xz --modules=efinet -o /srv/tftp/grubx64.efi /boot/grub/grub.cfg=${grubCfg}
|
||||
fi
|
||||
for distro in arch:arch/x86_64/airootfs.sfs fedora:LiveOS/squashfs.img; do
|
||||
rootfs=''${distro#*:}
|
||||
distro=''${distro%%:*}
|
||||
cd /srv/nfs/$distro
|
||||
mkdir -p loop lower upper work root
|
||||
mountpoint -q loop || mount $distro.iso loop
|
||||
mountpoint -q lower || mount loop/$rootfs lower
|
||||
mountpoint -q root || mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work,nfs_export=on root
|
||||
cd /srv/http/local/boot/pxe
|
||||
if [ ! -e $distro ]; then
|
||||
mkdir $distro
|
||||
modsDir=$OLDPWD/lower/usr/lib/modules/*
|
||||
cp $modsDir/vmlinuz $distro/linux
|
||||
dracut -Nvm "network-manager nfs" --zstd --kver $(basename $modsDir) -k $modsDir $distro/initramfs
|
||||
chmod -R 640 $distro
|
||||
chgrp -R php $distro
|
||||
chmod ug+x $distro
|
||||
virtualisation.oci-containers.containers.fedora-dracut = {
|
||||
autoStart = false;
|
||||
entrypoint = "bash";
|
||||
autoRemoveOnStop = false;
|
||||
image = "docker.io/fedora:latest";
|
||||
cmd = [ "/data/workdir/entry.sh" ];
|
||||
volumes = [
|
||||
"/var/lib/podman-dracut:/data/workdir"
|
||||
"/srv/nfs/arch/lower:/data/ro-arch:ro"
|
||||
"/srv/nfs/fedora/lower:/data/ro-fedora:ro"
|
||||
];
|
||||
};
|
||||
systemd = {
|
||||
tmpfiles.rules = [ "d /var/lib/podman-dracut 0755 root root -" ];
|
||||
services.pxeboot = {
|
||||
serviceConfig.Type = "oneshot";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
path = with pkgs; [ xz grub2_efi util-linux ];
|
||||
script = let
|
||||
grubCfg = pkgs.writeText "grub.cfg" ''
|
||||
set timeout=10
|
||||
set path=(http,$net_default_server)/local/boot/pxe
|
||||
set nfs="rw ifname=ens0:$net_default_mac ip=$net_default_ip::$net_default_server:255.255.0.0::ens0:none root=nfs4:$net_default_server:/srv/nfs"
|
||||
. $path/grub.cfg
|
||||
'';
|
||||
in ''
|
||||
cd /srv/tftp
|
||||
if [ ! -e grubx64.efi ]; then
|
||||
grub-mkstandalone -O x86_64-efi --compress=xz --modules=efinet -o grubx64.efi /boot/grub/grub.cfg=${grubCfg}
|
||||
fi
|
||||
done
|
||||
'';
|
||||
cat > /var/lib/podman-dracut/entry.sh <<'EOF'
|
||||
set -e
|
||||
dnf install -y dracut-network nfs-utils
|
||||
cd /data/workdir
|
||||
target=$(cat target)
|
||||
modsDir=../ro-$target/usr/lib/modules/*
|
||||
mkdir $target
|
||||
cp $modsDir/vmlinuz $target
|
||||
dracut -Nm "network-manager nfs" --zstd -k $modsDir --kver $(basename $modsDir) $target/initramfs
|
||||
EOF
|
||||
for distro in arch:arch/x86_64/airootfs.sfs: fedora:LiveOS/squashfs.img:selinux=0; do
|
||||
cmdline=''${distro##*:}
|
||||
distro=''${distro%:*}
|
||||
rootfs=''${distro##*:}
|
||||
distro=''${distro%:*}
|
||||
cd /srv/nfs/$distro
|
||||
mkdir -p loop lower upper work root
|
||||
mountpoint -q loop || mount $distro.iso loop
|
||||
mountpoint -q lower || mount loop/$rootfs lower
|
||||
mountpoint -q root || mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work,nfs_export=on root
|
||||
cd /srv/http/local/boot/pxe
|
||||
if [ ! -e $distro ]; then
|
||||
echo $distro > /var/lib/podman-dracut/target
|
||||
systemctl --wait restart podman-fedora-dracut.service
|
||||
mv /var/lib/podman-dracut/$distro .
|
||||
fi
|
||||
if [ ! -e .grub.cfg.lock ]; then
|
||||
echo "menuentry $distro {
|
||||
linux \$path/$distro/vmlinuz \$nfs/$distro/root $cmdline
|
||||
initrd \$path/$distro/initramfs
|
||||
}" >> grub.cfg
|
||||
fi
|
||||
done
|
||||
touch .grub.cfg.lock
|
||||
chmod -R 640 .
|
||||
chgrp -R php .
|
||||
chmod ug+x $(find -type d)
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue