Normally Linux distribution ISOs work perfectly when written to a USB for booting as a 'Live USB' allowing both usage and installation of the distro. Unfortunately with the introduction of Intel Atom based mini PCs the issue of requiring a 32-bit bootloader to boot a 64-bit OS arose. Further complications were caused by the lack of mainline support for HDMI audio and wifi resulting in the use of custom kernels. And now even with mainline support soon to eventuate there is still a lead time required by distributions before they incorporate the latest kernels.
To solve the issue of using a standard ISO but with a different kernel I developed a script that allows the ISO to be respun with the latest kernel build. But because new kernel builds are released weekly I extended the script to allow the respinning with a specified kernel.
However I always end up installing the same set of packages immediately after installation so I thought it would be useful if packages could be included during the respin. Equally adding locally compiled packages became another requirement as it allowed the respinning of ISOs to include custom kernels or third party applications like Google Chrome.
Another limitation was that after installation I found myself wanting to run scripts to fix or add functionality like audio and wifi. So being able to incorporate these as part of a personalized ISO would simplify both the installation process and provide a more functional Live USB.
The last issue I encountered was trying to boot an ISO on a new Apollo Lake mini PC. As the GRUB bootloader failed to boot Ubuntu I switched to using the rEFInd boot manager to allow Linux to boot itself. In doing so I solved another want I've sometimes wished for when using a Live USB namely the lack of persistence or the ability to save files such as screenshots or error messages that could still be accessed after rebooting. So I rewrote my script to include all these features.
The invocation although command line based is really quite simple:
Usage: ./isorespin.sh [-h|-v] | [[-u | -k <kernel>] | -p "package_1 ... package_n" | -l "package_1.deb ... package_n.deb" | -a "file_1 ... file_n" | -r [-s <size><MB|GB>]] -i <ISO>
Functionality is achieved by calling the command with flags and arguments or options with parameters and these are as follows:
-u or --update will update an Ubuntu based ISO (e.g. Ubuntu or one of its flavours or Linux Mint) to the latest Ubuntu Kernel Team released mainline build. For a Debian based ISO (e.g. Debian Live or LMDE) using this option will update the current v3.16 kernel with the Canonical DKMS patches for HDMI audio and RTL8723BS wifi.
-k or --kernel replaces an Ubuntu based ISO's kernel with the one specified by the argument or parameter which can be any of the Ubuntu Kernel Team kernel builds located at http://kernel.ubuntu.com/~kernel-ppa/mainline (just use the directory or folder name without the trailing '/' as in '--kernel v4.11-rc7' noting that earlier kernels will probably not work well if at all).
-p or --package will install a single package or a set of packages (if enclosed in quotes) that are available to the ISO (which can be either Ubuntu or Debian based) and would typically would be installed using 'apt install <package>' command.
-l or --local allows local Debian binary packages to be installed within the respun ISO. Care must be taken in specifying the order of multiple packages to preserve any dependencies and of course all dependencies must be met for the packages to be successfully installed.
-a or --add allows local binaries or shell scripts to be saved under '/usr/local/bin' on the respun ISO although there is no limitation on the actual type of file itself so any file can be added if required.
-r or --refind will add the rEFInd boot manager which can be selected using the device's boot manager at boot time.
-s or --storage adds persistence to the respun ISO. Although a size must be specified there is some flexibility on how much is allocated. The minimum size is 100MB which keeps the size of the ISO down but means that once the USB is created the persistence partition should be manually resized for typical usage. Alternatively a larger size can be specified thus avoiding the immediate need to resize as this can always be performed later. It is recommended to use a realistic amount somewhere between 1GB and 2GB to maintain the balance between a practical but usable ISO.
-i or --iso must be specified and is the location of the ISO to be respun.
Depending on the options and their complexity the respin will take a few minutes and the script provides updates its progress whilst running. The respun ISO is created with a new name derived from the original ISO name and includes indicators of the options used like 'persistence' or the kernel name or 'dkms' for example. It is recommended that at least 10GB of space is available for the script to function correctly (as the script requires a minimum of 10GB to run) and an internet connection is typically required for some options like kernel updates for example. The script runs on Debian/Ubuntu based distros and requires certain packages to be installed prior to running although it checks and notifies if anything is missing first before continuing. Also the rEFInd bootmanager (http://www.rodsbooks.com/refind) can be downloaded from https://sourceforge.net/projects/refind/files into the same directory as the script to prevent unnecessary repeated downloads if this is a concern and will make processing quicker.
Once the ISO has been respun it can be written to a USB using the standard 'dd' command.
To perform a manual resize when using a USB with persistence first use the device's boot menu to select the USB and when the rEFInd screen appears click on 'F2' twice. A text line will appear at the top of the screen so use the arrow keys to move the cursor and delete the word 'persistence' or 'persistent' depending on whether it is an Ubuntu or Debian based ISO. This step actually disables persistence and is only required so that the partition is not auto mounted thus preventing resizing. Now press the enter key to boot.
Once booted use the 'gparted' command to resize the persistence partition. You will be prompted to fix the GPT to use all the available space so click 'Fix' and then continue with the resizing.
An example invocation is as follows:
./isorespin.sh -i ubuntu-17.04-desktop-amd64.iso -k v4.11-rc5 -a "../scripts/wifi/linuxium-install-rtl8723bs-binaries-for-4.11.0-rc5.sh ../scripts/linuxium-install-UCM-files.sh" -p "ssh openssh-server inxi" -l google-chrome-stable_current_amd64.deb -r -s 2GB
This will respin the latest Ubuntu 'Zesty' ISO and make the boot kernel the fifth release candidate of the latest development mainline kernel. It will add my script for installing wifi for the RTL8723BS chip on this specific kernel version under '/usr/local/bin' along with adding another script to install the UCM files required for headphone audio on certain Intel Atom mini PCs. It will also install the 'ssh', 'openssh-server' and 'inxi' packages along with 'Chrome' so they are all available for immediate use on a 'Live USB' and will be included as part of a standard installation. It will also include a persistence partition of 2GB and the resultant ISO produced as:
linuxium@LINUXIUMONE:~$ ls -l linuxium-persistence-rEFInd-v4.11-rc5-ubuntu-17.04-desktop-amd64.iso
-rw-r--r-- 1 linuxium linuxium 4215292928 Apr 22 12:43 linuxium-persistence-rEFInd-v4.11-rc5-ubuntu-17.04-desktop-amd64.iso
The script currently supports all recognized desktop 64-bit Ubuntu and Ubuntu flavoured ISOs (https://www.ubuntu.com/download/ubuntu-flavours), Linux Mint and LDME ISOs (https://www.linuxmint.com/download.php), Debian 'Live install' ISOs (https://www.debian.org/CD/live), KDE neon ISOs (https://neon.kde.org/download), elementary OS ISOs (https://elementary.io) and Kali ISOs (https://www.kali.org/downloads). Any issues or improvement suggestions are welcome. It can be downloaded from isorespin.sh (md5sum: 4998077659253231b39d3e4e04902582).
Please donate if you find the script useful using the following link http://goo.gl/nXWSGf as everything helps with development costs.