nfs, docker, pxe boot integration test - all ready

This commit is contained in:
bogale 2026-10-03 19:14:58 +09:00
commit e5bd5aa61e

View file

@ -83,7 +83,6 @@
jq jq
_7zz _7zz
sbctl sbctl
dracut
openssl openssl
grub2_efi grub2_efi
]; ];
@ -129,48 +128,74 @@
}; };
}; };
}; };
systemd.services.pxeboot = { virtualisation.oci-containers.containers.fedora-dracut = {
serviceConfig.Type = "oneshot"; autoStart = false;
wantedBy = [ "multi-user.target" ]; entrypoint = "bash";
path = with pkgs; [ xz dracut grub2_efi util-linux ]; autoRemoveOnStop = false;
script = let image = "docker.io/fedora:latest";
grubCfg = pkgs.writeText "grub.cfg" '' cmd = [ "/data/workdir/entry.sh" ];
set timeout=10 volumes = [
set path=(http,$net_default_server)/local/boot/pxe "/var/lib/podman-dracut:/data/workdir"
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" "/srv/nfs/arch/lower:/data/ro-arch:ro"
menuentry Arch { "/srv/nfs/fedora/lower:/data/ro-fedora:ro"
linux $path/arch/linux $nfs/arch/root ];
initrd $path/arch/initramfs };
} systemd = {
menuentry Fedora { tmpfiles.rules = [ "d /var/lib/podman-dracut 0755 root root -" ];
linux $path/fedora/linux $nfs/fedora/root selinux=0 services.pxeboot = {
initrd $path/fedora/initramfs serviceConfig.Type = "oneshot";
} wantedBy = [ "multi-user.target" ];
''; path = with pkgs; [ xz grub2_efi util-linux ];
in '' script = let
if [ ! -e /srv/tftp/grubx64.efi ]; then grubCfg = pkgs.writeText "grub.cfg" ''
echo "Building grub" set timeout=10
grub-mkstandalone -O x86_64-efi --compress=xz --modules=efinet -o /srv/tftp/grubx64.efi /boot/grub/grub.cfg=${grubCfg} set path=(http,$net_default_server)/local/boot/pxe
fi 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"
for distro in arch:arch/x86_64/airootfs.sfs fedora:LiveOS/squashfs.img; do . $path/grub.cfg
rootfs=''${distro#*:} '';
distro=''${distro%%:*} in ''
cd /srv/nfs/$distro cd /srv/tftp
mkdir -p loop lower upper work root if [ ! -e grubx64.efi ]; then
mountpoint -q loop || mount $distro.iso loop grub-mkstandalone -O x86_64-efi --compress=xz --modules=efinet -o grubx64.efi /boot/grub/grub.cfg=${grubCfg}
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
fi 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)
'';
};
}; };
} }