Linuxloops is an adaptable / declarative linux distribution installer.
Why create a linux distribution installer ?
Linux is very modular thanks to package management systems, however most distribution installers are either completely manual or focus on a specific DE and bring lots of packages that are not necessarily needed. Linuxloops allows minimal Linux installs with more DE options, to directly add custom packages, Secure Boot support, nvidia proprietary drivers or Linux-surface patches.
In addition, Linuxloops supports installing linux distributions in disk image files that can be booted natively by the GRUB bootloader (from btrfs, ext4, exfat or ntfs partitions) or in VMs.
The Linuxloops script will chroot into a temporary rootfs image (usually a linux container rootfs or an actual distribution iso) and then perform the install from there using the target distribution package manager.
Linuxloops can be used from any Linux distribution or from Windows WSL, it has limited dependencies that are installed by default in most if not all Linux distros: bash, coreutils, curl, grep, sed, sudo, tar, util-linux, xz.
Note: Windows WSL does not allow to write directly to a disk but you can create disk images and flash them to a drive using Rufus/Etcher or boot them from Grub2Win.
For security purpose, Linuxloops will not install packages/binaries that are not present in the official distribution repositories. The only exceptions are:
- The "RPM fusion" repo for Fedora and the "EPEL" repo for RedHat based distributions that are enabled by default as they contain necessary packages for standard use.
- For Arch based distributions, the "shim-signed" AUR package is included in order to support Secure Boot.
✔ Base Requirements:
- x86_64 based computer with UEFI BIOS.
- Administrative privileges on the device.
- A drive or partition with at least 14 GB available space.
Distribution | Versions | Secure Boot support | Nvidia proprietary driver support | Linux-surface patches support | Notes |
---|---|---|---|---|---|
AlmaLinux | 9 | ✓ | notes | ||
Arch | Current | ✓ (shim-signed AUR) | ✓ | ✓ | notes |
Artix | Current/Openrc Current/Runit Current/S6 Current/Dinit |
✓ (shim-signed AUR) | ✓ | notes | |
BlendOS | v4 | ✓ (shim-signed AUR) | ✓ | notes | |
BlissOS | 15 16 |
||||
Brunch | Stable Unstable | ✓ | ✓ | notes | |
CachyOS | x86-64 x86-64-v3 x86-64-v4 |
✓ (shim-signed AUR) | ✓ | ✓ | notes |
ChimeraOS | Stable Unstable |
✓ | |||
ChromeOS-Flex | Stable | ✓ | notes | ||
Debian | Bookworm Testing Unstable |
✓ | ✓ | ✓ | |
Devuan | Daedalus Testing Unstable |
✓ | ✓ | ||
Elementary | 7 | ✓ | ✓ | ✓ | |
Fedora | 40 41 Rawhide |
✓ | ✓ | ✓ | notes |
Gentoo | 23/Openrc 23/Systemd |
✓ | ✓ | ||
Kali | Rolling | disk images only | ✓ | ✓ | notes |
Linuxmint | Wilma | ✓ | ✓ | ✓ | |
LMDE | Faye | ✓ | ✓ | ✓ | |
Manjaro | Stable Testing Unstable |
✓ (shim-signed AUR) | ✓ | ✓ | notes |
MX | 23 | ✓ | ✓ | ✓ | |
Neon | User Testing Unstable |
✓ | ✓ | ✓ | |
NixOS | 24.05 Unstable |
✓ | ✓ | ||
Nobara | 40 | ✓ | ✓ | ✓ | |
OpenSUSE | 15.6 Tumbleweed |
✓ | ✓ | notes | |
Parrot | Lory | disk images only | ✓ | ✓ | notes |
Pop | 22.04 24.04 |
✓ | ✓ | ✓ | |
Proxmox | VE8 | ✓ | ✓ | ✓ | |
Qubes | 4.2.3 | notes | |||
RockyLinux | 9 | ✓ | notes | ||
SteamOS | 3.6 | ✓ (shim-signed AUR) | ✓ | ✓ | notes |
Tails | Stable | ✓ | notes | ||
Ubuntu | 24.04 24.10 25.04 |
✓ | ✓ | ✓ | |
Void | Current | ✓ | |||
Zorin | 17 | ✓ | ✓ | ✓ |
Download the Linuxloops script:
curl -L https://raw.githubusercontent.com/sebanc/linuxloops/main/linuxloops -O --create-dirs --output-dir ~/bin
Install the PyQtWebEngine
package for your distribution:
- Debian / Ubuntu derivatives:
Debian 12 / Ubuntu 24.04 and above:sudo apt install python3-venv python3-pyqt6.qtwebengine
Older Debian / Ubuntu versions:sudo apt install python3-venv python3-pyqt5.qtwebengine
- Arch-based distributions:
sudo pacman -Syu python-pyqt6-webengine
- RHEL-based distributions:
sudo dnf install python3-pyqt6-webengine
- OpenSUSE:
sudo zypper in python3-PyQt6-WebEngine
- Gentoo:
sudo emerge dev-python/PyQt6-WebEngine
- Void:
sudo xbps-install python3-pyqt6-webengine python3-pyqt6-gui python3-pyqt6-widgets python3-pyqt6-network python3-pyqt6-webchannel python3-pyqt6-printsupport
- NixOS: No package to install (python3Packages.pyqt6-webengine will be installed by linuxloops in nix-shell environment)
Once the PyQtWebEngine
package is installed, start linuxloops in GUI mode:
bash ${HOME}/bin/linuxloops
List of command line flags:
Usage: bash ${HOME}/bin/linuxloops -distro <distribution name> -ver <distribution version> -env <environment name> -dst <disk name or disk image path>
-distro, --distribution <distribution name> (Distribution to install)
-ver, --version <version name> (Distribution version to install)
-env, --environment <environment name> (Environment to install)
-dst, --destination <disk name or disk image path> (e.g. /dev/sda or /ubuntu.img)
-s, --size <total install size> (number in GB, minimum 14GB)
-z, --swapsize <swap size> (number in GB)
-b, --btrfs (Use btrfs for the root filesystem)
-r, --rootfs-compression (Enable standard btrfs compression, implies -b)
-e, --encrypt (Encrypt the root filesystem)
-a, --autologin (Enable user autologin)
--efi-name (EFI partition name)
--efi-mountoptions (EFI partition specific mountoptions)
--boot-name (Boot partition name)
--boot-mountoptions (Boot partition specific mountoptions)
--root-name (Root partition name)
--root-mountoptions (Root partition specific mountoptions)
-A, --add-partition <partition details> (Add a partition according to the below format:
<mountpoint>*<name>*<fstype>*<mountoptions>*<size(in GB)>*<encryption>
ex: /home*Home*ext4*noatime,discard*20*Yes)
-H, --hostname (Provide a specific hostname)
-L, --locale <locale> (specify locale to be used, by default "en_US")
-K, --keymap <keymap> (specify keymap to be used, by default "us")
-T, --timezone <timezone> (specify timezone to be used, by default "UTC")
-n, --nvidia (Install nvidia drivers)
-S, --surface (Add patches for Surface devices from github.com/linux-surface)
-c, --custom-packages (list of additional packages to be installed - space separated)
-C, --custom-script (bash script that should be run at the end of the install process)
-k, --kernel-parameters (specific kernel parameters to be applied - space separated)
-m, --custom-mirror <mirror details> (Add a custom mirror according to the below format:
<repository>*<mirror>
ex: Arch*https://mirrors.kernel.org/archlinux)
-p, --user-password-for-encryption (Use user account password for encryption)
-g, --grub-hide (Hide the GRUB Bootloader)
-G, --generate-declarative-config <config_file_path> (Generate a declarative configuration file)
-d, --apply-declarative-config <config_file_path> (Use a declarative configuration file)
-l, --list (List available distributions and environments)
-lb, --list-btrfs (Confirms if btrfs is supported for chosen distribution/version)
-ld, --list-distributions (List available distributions)
-le, --list-environments (List available environments for chosen distribution/version)
-ll, --list-locales (List available locales)
-lk, --list-keymaps (List available keymaps)
-ln, --list-nvidia (Confirms if nvidia proprietary driver is supported for chosen distribution/version)
-ls, --list-surface (Confirms if Surface devices patches are supported for chosen distribution/version)
-lt, --list-timezones (List available timezones)
-lv, --list-versions (List available versions for chosen distribution)
-h, --help (Display this menu)
The main parameters are: the distribution, the version, the environment and the destination. Use the below command to list available distributions, versions and environments:
bash ${HOME}/bin/linuxloops -l
As an example:
bash ${HOME}/bin/linuxloops -distro Ubuntu -ver 24.04 -env Plasma/Full -dst /dev/sdX -e
will install Ubuntu 24.04 with the complete kde environment on the drive /dev/sdX with encryption.
bash ${HOME}/bin/linuxloops -distro Arch -ver Current -env Cinnamon -dst ~/arch.img -s 30 -S
will install Arch with the cinnamon desktop environment and linux-surface patches in a 30 GB image located at /home/username/arch.img.
Have a look at the declarative configuration examples available here:
Declarative configuration examples
The main parameters are: the distribution, the version and the environment. Use the below command to list available distributions and environments:
bash ${HOME}/bin/linuxloops -l
Create your own declarative configuration and run the below command to start the install:
bash ${HOME}/bin/linuxloops -d <path_to_your_declarative_configuration>
Support for Linuxloops is provided in the dedicated section of the Brunch Discord server:
- The linuxcontainers project for maintaining Linux container rootfs archives.
- The Grub2Win project for allowing the GRUB bootloader to be installed on devices running Windows.
- The Linux-Surface crew for greatly improving Linux support on Surface devices.