Files
LinuxDeploymentServer/img/live/ubuntuPXEInitRamFS.md

111 lines
3.8 KiB
Markdown

#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://<serverIP>/path/to/file boot=pxe maxTryCount=10 initdwnsize=2G
```
### /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 ""
}
```