working init for squashfs boot

This commit is contained in:
ading2210 2023-12-21 22:51:47 -08:00
parent 11621e15b5
commit e8b2f15d7b
7 changed files with 113 additions and 19 deletions

View File

@ -84,6 +84,7 @@ echo "copying data into the image"
populate_partitions $image_loop $initramfs_dir $rootfs_dir populate_partitions $image_loop $initramfs_dir $rootfs_dir
echo "cleaning up loop devices" echo "cleaning up loop devices"
umount $rootfs_dir
losetup -d $shim_loop losetup -d $shim_loop
losetup -d $image_loop losetup -d $image_loop
echo "done" echo "done"

View File

@ -50,7 +50,7 @@ for mountpoint in $chroot_mounts; do
mount --make-rslave --rbind "/${mountpoint}" "${rootfs_dir}/$mountpoint" mount --make-rslave --rbind "/${mountpoint}" "${rootfs_dir}/$mountpoint"
done done
chroot_command="DEBUG=${DEBUG} release_name=${release_name} packages=${packages} /opt/setup_rootfs.sh" chroot_command="/opt/setup_rootfs.sh '$DEBUG' '$release_name' '$packages'"
chroot $rootfs_dir /bin/bash -c "${chroot_command}" chroot $rootfs_dir /bin/bash -c "${chroot_command}"
for mountpoint in $chroot_mounts; do for mountpoint in $chroot_mounts; do

View File

@ -35,14 +35,16 @@ compile_unionfs() {
local repo_url="https://github.com/rpodgorny/unionfs-fuse" local repo_url="https://github.com/rpodgorny/unionfs-fuse"
local original_dir="$(pwd)" local original_dir="$(pwd)"
local core_count="$(nproc --all)"
rm -rf $working_path rm -rf $working_path
git clone $repo_url -b master --depth=1 $working_path git clone $repo_url -b master --depth=1 $working_path
cd $working_path cd $working_path
env LDFLAGS="-static" make env LDFLAGS="-static" make -j$core_count
local binary_path="$working_path/src/unionfs" local binary_path="$working_path/src/unionfs"
cp $binary_path $out_path cp $binary_path $out_path
cd $original_dir
} }
rootfs_dir=$(realpath $1) rootfs_dir=$(realpath $1)
@ -67,7 +69,7 @@ rm -rf $kernel_dir
mkdir $kernel_dir -p mkdir $kernel_dir -p
dd if=$kernel_loop of=$kernel_dir/kernel.bin bs=1M status=progress dd if=$kernel_loop of=$kernel_dir/kernel.bin bs=1M status=progress
echo "extracting initramfs from kernel" echo "extracting initramfs from kernel (this may take a while)"
extract_initramfs $kernel_dir/kernel.bin $kernel_dir $rootfs_dir extract_initramfs $kernel_dir/kernel.bin $kernel_dir $rootfs_dir
rm -rf $rootfs_dir/init rm -rf $rootfs_dir/init
@ -75,16 +77,12 @@ echo "mounting shim"
make_mountable "${shim_loop}p3" make_mountable "${shim_loop}p3"
safe_mount "${shim_loop}p3" $shim_rootfs safe_mount "${shim_loop}p3" $shim_rootfs
echo "extracting and compressing modules from shim"
extract_modules $modules_squashfs $shim_rootfs
echo "compressing old rootfs" echo "compressing old rootfs"
mksquashfs $old_dir $root_squashfs -noappend -comp gzip mksquashfs $old_dir $root_squashfs -noappend -comp gzip
echo "patching new rootfs" echo "patching new rootfs"
mv $unionfs_dir/unionfs $rootfs_dir/bin/unionfs mv $unionfs_dir/unionfs $rootfs_dir/bin/unionfs
#cp -ar ./squashfs/* $rootfs_dir/ cp -ar squashfs/* $rootfs_dir/
chmod +x $rootfs_dir/bin/*
echo "cleaning up" echo "done"
umount $shim_rootfs
losetup -d $shim_loop

View File

@ -3,6 +3,10 @@
#setup the debian rootfs #setup the debian rootfs
#this is meant to be run within the chroot created by debootstrap #this is meant to be run within the chroot created by debootstrap
DEBUG="$1"
release_name="$2"
packages="$3"
set -e set -e
if [ "$DEBUG" ]; then if [ "$DEBUG" ]; then
set -x set -x
@ -23,13 +27,14 @@ END
#install the patched systemd #install the patched systemd
apt-get install -y ca-certificates apt-get install -y ca-certificates
apt-get update apt-get update
apt-get upgrade -y installed_systemd="$(dpkg-query -W -f='${binary:Package}\n' | grep "systemd")"
apt-get install --reinstall $installed_systemd
#enable shimboot services #enable shimboot services
systemctl enable kill-frecon.service systemctl enable kill-frecon.service
#install desktop #install desktop
apt-get install -y task-xfce-desktop cloud-utils zram-tools apt-get install -y $packages cloud-utils zram-tools
#set up zram #set up zram
tee -a /etc/default/zramswap << END tee -a /etc/default/zramswap << END

View File

@ -23,10 +23,3 @@ extract_initramfs() {
rm -rf $output_dir rm -rf $output_dir
cat $cpio_path | cpio -D $output_dir -imd --quiet cat $cpio_path | cpio -D $output_dir -imd --quiet
} }
extract_modules() {
local output_path="$1"
local shim_rootfs="$2"
local modules_dir="$shim_rootfs/lib/modules"
mksquashfs $modules_dir $output_path -noappend -comp gzip
}

68
squashfs/bin/bootstrap.sh Executable file
View File

@ -0,0 +1,68 @@
#!/bin/busybox sh
#mount the squashfs + unionfs and boot into it
move_mounts() {
local base_mounts="/sys /proc /dev"
local newroot_mnt="$1"
for mnt in $base_mounts; do
mkdir -p "$newroot_mnt$mnt"
mount -n -o move "$mnt" "$newroot_mnt$mnt"
done
}
boot_dir() {
local target="$1"
echo "moving mounts to newroot"
move_mounts $target
echo "switching root"
mkdir -p $target/oldroot
pivot_root $target $target/oldroot
/bin/bash -c "mount -o bind /oldroot/lib/modules /lib/modules"
exec /sbin/init < "$TTY1" >> "$TTY1" 2>&1
}
mount_squashfs() {
mkdir -p /lib/modules /mnt/root_squashfs
mount /root.squashfs /mnt/root_squashfs
mount -o bind /mnt/root_squashfs/lib/modules /lib/modules
}
#based on https://github.com/rpodgorny/unionfs-fuse/blob/master/examples/S01a-unionfs-live-cd.sh
mount_unionfs() {
local chroot_path="/tmp/unionfs"
local data_path="/data"
local mountpoint="/newroot"
local squashfs_path="/mnt/root_squashfs"
local fuse_options="-o allow_other,suid,dev"
local unionfs_options="-o cow,chroot=$chroot_path,max_files=32768"
mkdir -p $data_path
mkdir -p $mountpoint
mkdir -p $chroot_path/root
mkdir -p $chroot_path/rw
mount -o bind $squashfs_path $chroot_path/root
mount -o bind $data_path $chroot_path/rw
modprobe fuse
unionfs $fuse_options $unionfs_options /root=RO:/rw=RW /newroot
}
main() {
echo "mounting squashfs"
mount_squashfs
echo "mounting unionfs"
mount_unionfs
echo "booting unionfs"
boot_dir /newroot
}
main "$@"
sleep 1d

29
squashfs/bin/init Executable file
View File

@ -0,0 +1,29 @@
#!/bin/busybox sh
#original: https://chromium.googlesource.com/chromiumos/platform/initramfs/+/refs/heads/main/factory_shim/init
detect_tty() {
if [ -f "/bin/frecon-lite" ]; then
export TTY1="/dev/pts/0"
export TTY2="/dev/pts/1"
else
export TTY1="/dev/tty1"
export TTY2="/dev/tty2"
fi
}
setup_environment() {
# Install additional utility programs.
/bin/busybox --install /bin || true
}
main() {
setup_environment
detect_tty
# In case an error is not handled by bootstrapping, stop here
# so that an operator can see installation stop.
exec bootstrap.sh < "$TTY1" >> "$TTY1" 2>&1 || sleep 1d
}
main "$@"
exit 1