2023-06-07 21:40:43 -04:00
|
|
|
# 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:
|
|
|
|
|
2024-02-13 18:22:22 -05:00
|
|
|
> "Currently creating the images is only supported on Arch Linux but may work on other operating systems as well."
|
2023-06-07 21:40:43 -04:00
|
|
|
|
|
|
|
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)
|