summaryrefslogtreecommitdiff
path: root/generate-usb-img
diff options
context:
space:
mode:
authorPhilip J Freeman <elektron@halo.nu>2025-05-31 12:34:14 -0700
committerPhilip J Freeman <elektron@halo.nu>2025-05-31 15:47:31 -0700
commit34105077c777b0d2c5c69f39921f376b84ce1443 (patch)
tree606152d6f739a0ee7fd8e5127e79b595f3fe8c85 /generate-usb-img
parent5392080129b1093f36533e47c155f618c283ea57 (diff)
Deploying a demo amd64 debian-based OS via ostree
This is a prototype outline for building and deploying a debian based OS with ostree. For purposes of demonstration, the OS runs from a bootable USB device on a UEFI capable amd64 machine. Once a USB device is created and booted, the OS can be updated using a simple shell script. <https://ostreedev.github.io/ostree/> <https://www.nin.wiki/Halo_numbers>
Diffstat (limited to 'generate-usb-img')
-rwxr-xr-xgenerate-usb-img96
1 files changed, 96 insertions, 0 deletions
diff --git a/generate-usb-img b/generate-usb-img
new file mode 100755
index 0000000..68cf2f7
--- /dev/null
+++ b/generate-usb-img
@@ -0,0 +1,96 @@
+#!/bin/bash -xe
+
+set -o pipefail
+
+. ./config
+. ./sh-lib
+
+sysroot=/tmp/$$.ostree_usb
+
+version=$(date +%Y%m%d.%H%M%S)
+image="./$osname-$osversion-usb-$version.img"
+seek_sectors=$(( (8 *1024 *1024 *2) +33 -1 ))
+
+# Check for dependencies:
+package_deps dosfstools ostree parted udev
+
+[ -f "$image" ] && rm "$image"
+
+dd if=/dev/zero of="$image" seek="$seek_sectors" count=1 bs=512
+loopdev=$(losetup -f --show "$image")
+
+function cleanup(){
+ set +e
+ if [ -n "$deployroot" ]; then
+ for p in /proc /sys /dev /image /boot/efi /boot /sysroot; do
+ umount "$deployroot""$p"
+ done
+ if [ -f "$deployroot"/image ]; then
+ chattr -i "$deployroot"
+ rm -f "$deployroot"/image
+ chattr +i "$deployroot"
+ fi
+ fi
+ for p in /boot/efi /; do
+ umount "$sysroot""$p"
+ done
+ rmdir "$sysroot"
+ partx -d "$loopdev"p1
+ partx -d "$loopdev"p2
+ losetup -d "$loopdev"
+}
+trap cleanup EXIT
+
+parted -a optimal -s "$loopdev" -- \
+ mklabel gpt unit MiB \
+ mkpart ESP fat32 1 17 \
+ mkpart root ext4 17 8192 \
+ set 1 boot on \
+ print
+
+partx -a "$loopdev" || /bin/true
+mkfs.vfat -n ESP "$loopdev"p1
+mkfs.ext4 -L root "$loopdev"p2
+rootuuid=$(blkid -s UUID -o value "$loopdev"p2)
+mkdir -p "$sysroot"
+mount "$loopdev"p2 "$sysroot"
+mkdir -p "$sysroot"/boot/efi
+mount "$loopdev"p1 "$sysroot"/boot/efi
+
+ostree admin init-fs "$sysroot"
+ostree admin --sysroot="$sysroot" os-init "$osname"
+
+ostree --repo="$sysroot"/ostree/repo remote add --gpg-import=key.asc "$remote" "$remote_url" "$branch"
+ostree --repo="$sysroot"/ostree/repo pull-local --remote="$remote" "$repo" "$branch"
+
+ostree --repo="$sysroot"/ostree/repo config set sysroot.bootprefix true
+ostree admin --sysroot="$sysroot" deploy --os="$osname" --karg=root=UUID="$rootuuid" --karg=rw "$remote":"$branch"
+
+current_deployment=$(ostree admin --sysroot="$sysroot" status | awk '{print $2}' | head -1)
+deployroot="$sysroot"/ostree/deploy/"$osname"/deploy/"$current_deployment"
+
+chattr -i "$deployroot"
+touch "$deployroot"/image
+chattr +i "$deployroot"
+
+mount --bind "$image" "$deployroot"/image
+mount --bind "$sysroot"/boot "$deployroot"/boot
+mount --bind "$sysroot"/boot/efi "$deployroot"/boot/efi
+
+for p in /proc /sys /dev; do
+ mount --bind "$p" "$deployroot""$p"
+done
+
+chroot "$deployroot" /usr/sbin/grub-install --target='x86_64-efi' \
+ --efi-directory=/boot/efi --boot-directory=/boot \
+ --bootloader-id=GRUB --removable "$image"
+
+mount --bind "$sysroot" "$deployroot"/sysroot
+chroot "$deployroot" grub-mkconfig -o /boot/grub/grub.cfg
+
+trap - EXIT
+cleanup
+
+bmaptool create "$image" > "$image".bmap
+xz "$image"
+sha256sum "$image".xz > "$image".sha256sum