diff --git a/posts/archiso-portable.md b/posts/archiso-portable.md new file mode 100644 index 0000000..ca4c5f5 --- /dev/null +++ b/posts/archiso-portable.md @@ -0,0 +1,81 @@ +# making custom arch linux live ISOs without arch linux + +2023-06-07 + +If you've ever installed any Linux distro, you probably had to do it using a live install environment. +Once you flashed the USB drive, you could boot off it and you'd be greeted with a Linux system. + +I've always found it fascinating that you could pack the entire OS onto a stick and bring it around with you. +However, something even more enticing is being able to customize that system. + +This is where archiso comes in handy: +it's a tool that can be used to generate ISOs with Arch Linux on them. +You can flash these ISOs to USB drives to make portable Arch Linux systems. +archiso is also incredibly flexible, and you can customize it very well. +In fact, it's the tool that Arch's maintainers use to generate the official live installation images. + +The one issue I have, though is that you need to be running Arch Linux to run archiso: + +> Currently creating the images is only supported on Arch Linux but may work on other operating systems as well. + +As I run another distro on my laptop, I could not use archiso. +So, in the last few days, I set out to make archiso run on my system. +The final results of this endeavour can be found [on GitHub](https://github.com/dogeystamp/archiso-portable). + +## pacstrap + +One of the essential dependencies of archiso is pacstrap. +Essentially, what pacstrap does is that it creates a small Arch Linux system in a folder. +This is the bootstrapped root filesystem (root FS). +Later, archiso takes that folder, compresses it, and puts it in the final ISO file. + +The problem is that pacstrap needs your host system to be Arch Linux so that it can bootstrap a new Arch system. +In fact, if you look at the [source code](https://github.com/archlinux/arch-install-scripts/blob/master/pacstrap.in), +you'll find that the host system uses its own pacman to install everything to the bootstrapped system: + + pacman -r "$newroot" "${pacman_args[@]}" + +pacstrap only has to create a few directories, but the rest is done by installing the `base` metapackage through pacman. +`base` includes both `filesystem` and `pacman`. +As far as I understand, this means that all the important files in an Arch Linux system come from installing the `filesystem` package. +Once the host pacman installs `base` in the bootstrapped system, we have a full Arch Linux root FS, including its own pacman. + +However, since I do not have pacman to bootstrap this way, I needed another way to obtain an Arch root FS. +I came across [archstrap](https://github.com/wick3dr0se/archstrap), which does exactly that. +archstrap downloads a pre-built Arch Linux root FS as a tarball, then installs packages to it just like regular pacstrap. +Cleverly, this script removes the need for arch-chroot on the host system: +it runs the arch-chroot inside the downloaded Arch filesystem. + +Somewhat annoyingly though, archstrap does not operate exactly the same way pacstrap does: +I had to patch it to get it working with archiso. +Also, I patched archiso itself to remove some flags archstrap doesn't parse. + +## other changes + +The other main dependency missing in archiso is pacman, Arch's package manager. +Since we aren't running Arch, we of course do not have it on our host system. +However, the bootstrapped Arch root FS we downloaded earlier does have pacman inside of it. +Therefore, I replaced all invocations of pacman inside archiso with invocations of the bootstrapped pacman. + +archiso also includes a small script to test your generated ISOs in a QEMU virtual machine. +I added a check to it that switches some hard-coded paths. +In Arch, the path is `/usr/share/edk2-ovmf/x64`, +but on my system it was at `/usr/share/edk2-ovmf`. + +## conclusion + +It turns out that modifying open source software isn't that difficult. +Given that archiso's maintainers wrote very structured and organized code, +it's surprisingly easy to navigate around the script to patch things. + +Of course, I definitely ruined the quality of archiso by doing this: +there's missing features and everything is untested and unlinted. +Then again, this isn't going to be production-grade software; +I just wanted to make a custom portable Arch USB while using Gentoo on my PC. + +Anyways, if you want to make your own custom Arch USBs but don't have Arch, +check out [archiso-portable](https://github.com/dogeystamp/archiso-portable) on GitHub. + +As a bonus, here's a screenshot of the Arch Linux live environment I made earlier on a Gentoo system: + +![preview](/public/img/archiso-portable-desktop.jpg) diff --git a/public/img/archiso-portable-desktop.jpg b/public/img/archiso-portable-desktop.jpg new file mode 100644 index 0000000..d8fd177 Binary files /dev/null and b/public/img/archiso-portable-desktop.jpg differ