#Generate initramfs for ubuntu that can fetch rootfs from http server ## Steps * Boot in to live Ubuntu disk * Open Terminal * Run `sudo -i` * Put insert content of below to files `/usr/share/initramfs-tools/modules.d/pxe` and `/usr/share/initramfs-tools/scripts/pxe` * Run `mkinitramfs -o /root/initrd.img` * Migrate `/root/initrd.img` to PXE server * Add new boot parameters to pxelinux config on pxe server ### New Required boot parameters ``` rooturl=http:///path/to/file boot=pxe maxTryCount=10 ``` ### /usr/share/initramfs-tools/modules.d/pxe ``` overlayfs squashfs ``` ### /usr/share/initramfs-tools/scripts/pxe Script from https://habr.com/en/post/513568/ ``` #!/bin/bash mountroot() { maxTryCount=5 squashfsFile="/dwn/rootfs.squashfs" squashfsMountPoint="/mnt/ro" tmpfsMountPoint="/mnt/rw" overlayfsUppderDir="$tmpfsMountPoint/upper" overlayfsWorkDir="$tmpfsMountPoint/work" overlayfsDir="/mnt/overlayfs" tryCount="1" # run udevadm wait_for_udev 10 # parce kernel cmdline args. rooturl needed for x in $(cat /proc/cmdline); do case $x in rooturl=*) export rooturl=${x#rooturl=} ;; maxTryCount=*) export maxTryCount=${x#maxTryCount=} ;; initdwnsize=*) export initdwnsize=${x#initdwnsize=} ;; esac done log_begin_msg "Loading modules" modprobe squashfs || panic "can't modprobe squashfs" modprobe af_packet || panic "can't modprobe af_packet" modprobe overlay || panic "can't modprobe overlayfs" log_success_msg "modules loaded" log_begin_msg "Generating RamDisk for download.." mkdir /dwn mount -t tmpfs -o rw,size=${initdwnsize} tmpfs /dwn log_success_msg "Generating RamDisk for download [ OK ]" log_begin_msg "Configure network" configure_networking || panic "Can't configure network" log_success_msg "Network configured" log_begin_msg "Download rootfs" while [ ! -f ${squashfsFile} ] && [ ${tryCount} -le ${maxTryCount} ]; do wget ${rooturl} -O ${squashfsFile} || log_failure_msg "Can't download rootfs, count ${tryCount}" tryCount=$(( ${tryCount} + 1 )) sleep 0.5 done if [ -f ${squashfsFile} ] then log_success_msg "Rootfs downloaded" else panic "Can't download rootfs" fi log_begin_msg "Mount rootfs" mkdir -p $squashfsMountPoint mount -t squashfs -o loop $squashfsFile $squashfsMountPoint || panic "Can't mount rootfs" log_success_msg "Rootfs mounted" log_begin_msg "Mount tmpfs" mkdir -p $tmpfsMountPoint mount -t tmpfs none $tmpfsMountPoint || panic "Tmpfs mount failed " log_success_msg "Tmpfs mounted" log_begin_msg "Mount overlayfs" mkdir -p $overlayfsUppderDir $overlayfsWorkDir $overlayfsDir mount -t overlay overlay -o lowerdir=$squashfsMountPoint,upperdir=$overlayfsUppderDir,workdir=$overlayfsWorkDir $overlayfsDir \ || panic "Overlayfs mount failed" log_success_msg "Overlayfs mounted" log_begin_msg "Move tmpfs and squashfs to new root" mkdir -p $overlayfsDir/$tmpfsMountPoint $overlayfsDir/$squashfsMountPoint mount --move $squashfsMountPoint $overlayfsDir/$squashfsMountPoint || panic "squashfs move failed" mount --move $tmpfsMountPoint $overlayfsDir/$tmpfsMountPoint || panic "tmpfs move failed" log_success_msg "Tmpfs and squashfs moved" log_begin_msg "Move overlayfs to new root" mount --move $overlayfsDir ${rootmnt} || panic "" } ```