From 3067270c0c60ab10b803cb57f4b170f42913dd9b Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Wed, 13 May 2020 18:45:37 -0400 Subject: split btrfs filesystem into two seed layers --- .gitignore | 5 +++++ Makefile | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 73 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 697ef25..70a7dc0 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,8 @@ samizdat.iso TEST_CHILD.*.log krng-add-entropy reused-child +gold.iso +patched.iso +rootfs/samizdat.patch.btrfs +rootfs/samizdat.seed.btrfs +rootfs/seed.iso diff --git a/Makefile b/Makefile index c686735..03e748d 100644 --- a/Makefile +++ b/Makefile @@ -166,7 +166,72 @@ isotest-netinst: samizdat.netinst.iso gpg_iso_path=gnupghome GPG_INPUT_DIR=${samizdat_child_dir}/child.$(shell cat reused-child)/root/.gnupg -samizdat.iso: rootfs/samizdat.iso reused-child +samizdat_btrfs_patch_size=256M + +get_loop_dev="$$(sudo losetup -n -O name -j $@~tmp)" +get_backing_file="$$(sudo losetup -n -O back-file -j $@~tmp)" +get_min_size="$$(btrfs inspect-internal min-dev-size --id 1 $@.mnt | (read b _; echo $$b))" + +rootfs/samizdat.seed.btrfs: rootfs/samizdat.btrfs +ifneq ($(shell id -u),0) + sudo make $@ +else + cp --reflink $< $@~tmp + btrfstune -f -S0 $@~tmp + test -d $@.mnt || mkdir $@.mnt + mount -t btrfs -o rw $@~tmp $@.mnt + btrfs fi defrag -c -r $@.mnt + s=$(get_min_size) && (set -x; btrfs fi resize 1:$$s $@.mnt && truncate -s "$$s" $@~tmp) + umount $@.mnt + losetup -f $< + btrfstune -S1 $@~tmp + mv $@~tmp $@ +endif + +rootfs/samizdat.patch.btrfs: rootfs/samizdat.seed.btrfs +ifneq ($(shell id -u),0) + sudo make $@ +else + rm -f $@~tmp + touch $@~tmp + fallocate -l $(samizdat_btrfs_patch_size) $@~tmp + test -d $@.mnt || mkdir $@.mnt + ! mountpoint -q $@.mnt || umount $@.mnt + mount -o ro -t btrfs $< $@.mnt + a=$(get_loop_dev); [ -z "$$a" ] || losetup -d $$a + losetup -f $@~tmp + btrfs device add $(get_loop_dev) $@.mnt + mount -o rw,remount $@.mnt + chroot $@.mnt /bin/sh -c 'echo samizdat > /etc/hostname' + chroot $@.mnt bash -i + umount $@.mnt + losetup -f $< + btrfstune -S1 $@~tmp + mv $@~tmp $@ +endif + +samizdat.iso: patched.iso + cp --reflink $< $@ + +patched.iso: gold.iso rootfs/samizdat.patch.btrfs + rm -f $@~tmp + cp --reflink $< $@~tmp + sudo xorrisofs -iso-level 3 -- \ + -indev $@~tmp \ + -outdev $@~tmp \ + -return_with FAILURE 32 \ + -pathspecs on \ + -follow link \ + -add /rootfs/z00.btrfs=rootfs/samizdat.patch.btrfs -- \ + -follow default \ + -as mkisofs -graft-points \ + -b grub/i386-pc/eltorito.img \ + -no-emul-boot -boot-info-table \ + --embedded-boot "${samizdat_grub_efi_dir}"/embedded.img \ + --protective-msdos-label + mv $@~tmp $@ + +gold.iso: rootfs/seed.iso reused-child sudo grub-efi.sh ! grep 'vmlinuz.*nbdroot' -r ${samizdat_grub_efi_dir} rm -f $@~tmp @@ -175,7 +240,6 @@ samizdat.iso: rootfs/samizdat.iso reused-child -indev $@~tmp \ -outdev $@~tmp \ -return_with FAILURE 32 \ - -volid SamizdatLive \ -pathspecs on \ -rm_r linux -- \ -add linux="${samizdat_linux_dir}" -- \ @@ -193,7 +257,7 @@ samizdat.iso: rootfs/samizdat.iso reused-child --protective-msdos-label mv $@~tmp $@ -rootfs/samizdat.iso: rootfs/samizdat.btrfs +rootfs/seed.iso: rootfs/samizdat.seed.btrfs rm -f $@~tmp touch $@~tmp fallocate -n -l 10G $@~tmp @@ -204,7 +268,7 @@ rootfs/samizdat.iso: rootfs/samizdat.btrfs -volid SamizdatLive \ -pathspecs on \ -follow link \ - -add /rootfs/samizdat.btrfs=/srv/nbd/samizdat.btrfs -- \ + -add /rootfs/samizdat.btrfs=$< -- \ -follow default mv $@~tmp $@ -- cgit v1.2.3