diff --git a/img/live/ubuntuPXEInitRamFS.md b/img/live/ubuntuPXEInitRamFS.md new file mode 100644 index 0000000..da609ba --- /dev/null +++ b/img/live/ubuntuPXEInitRamFS.md @@ -0,0 +1,111 @@ +#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 "" +} +``` \ No newline at end of file