Difference between revisions of "How to make a custom ISO image with mkimage"
Ajcollins0 (talk | contribs) (→Prerequisite) |
|||
(21 intermediate revisions by 10 users not shown) | |||
Line 1: | Line 1: | ||
− | This document explains how to build a custom ISO image using the new mkimage scripts located in aports directory. | + | This document explains how to build a custom ISO image using the new mkimage scripts located in [[aports]] directory. |
== Prerequisite == | == Prerequisite == | ||
First make sure we have the needed tools | First make sure we have the needed tools | ||
− | {{Cmd|apk add build-base apk-tools alpine-conf busybox fakeroot syslinux xorriso}} | + | {{Cmd|apk add alpine-sdk build-base apk-tools alpine-conf busybox fakeroot syslinux xorriso squashfs-tools sudo}} |
− | For efi you | + | For efi you should additionally add the following: |
− | {{Cmd|mtools dosfstools grub-efi}} | + | {{Cmd|apk add mtools dosfstools grub-efi}} |
Create a user (e.g. build) and add it to abuild group: | Create a user (e.g. build) and add it to abuild group: | ||
− | {{Cmd| | + | {{Cmd|adduser build -G abuild}} |
+ | |||
+ | Give administrative access to abuild group: | ||
+ | {{Cmd|echo "%abuild ALL=(ALL) ALL" > /etc/sudoers.d/abuild}} | ||
+ | |||
+ | Change to build user: | ||
+ | {{Cmd|su - build}} | ||
Then create signing keys (-i installs them in /etc/apk/keys which is required for later) | Then create signing keys (-i installs them in /etc/apk/keys which is required for later) | ||
{{Cmd|abuild-keygen -i -a}} | {{Cmd|abuild-keygen -i -a}} | ||
− | {{Tip| Make sure your public keys are placed in /etc/apk/keys/ (example: build-xxxxxxxx.rsa.pub) | + | {{Tip| Make sure your public keys are placed in /etc/apk/keys/ (example: build-xxxxxxxx.rsa.pub)}} |
{{Cmd|ls /etc/apk/keys/}} | {{Cmd|ls /etc/apk/keys/}} | ||
− | Clone (or update) the [ | + | Clone (or update) the [https://gitlab.alpinelinux.org/alpine/aports git repository]. |
− | {{Cmd|git clone | + | {{Cmd|git clone https://gitlab.alpinelinux.org/alpine/aports.git}} |
Make sure the apk index is up to date (so apk finds the packages): | Make sure the apk index is up to date (so apk finds the packages): | ||
{{Cmd|apk update}} | {{Cmd|apk update}} | ||
− | |||
== Configuration == | == Configuration == | ||
Line 36: | Line 41: | ||
<pre>export PROFILENAME=nas</pre> | <pre>export PROFILENAME=nas</pre> | ||
− | |||
− | |||
− | |||
<pre> | <pre> | ||
+ | cat << EOF > ~/aports/scripts/mkimg.$PROFILENAME.sh | ||
profile_$PROFILENAME() { | profile_$PROFILENAME() { | ||
− | + | profile_standard | |
− | + | kernel_cmdline="unionfs_size=512M console=tty0 console=ttyS0,115200" | |
− | + | syslinux_serial="0 115200" | |
− | + | kernel_addons="zfs spl" | |
− | + | apks="\$apks iscsi-scst zfs-scripts zfs zfs-utils-py | |
− | + | cciss_vol_status lvm2 mdadm mkinitfs mtools nfs-utils | |
− | + | parted rsync sfdisk syslinux unrar util-linux xfsprogs | |
− | + | dosfstools ntfs-3g | |
− | + | " | |
− | + | local _k _a | |
− | + | for _k in \$kernel_flavors; do | |
− | + | apks="\$apks linux-\$_k" | |
− | + | for _a in \$kernel_addons; do | |
− | + | apks="\$apks \$_a-\$_k" | |
− | + | done | |
− | + | done | |
− | + | apks="\$apks linux-firmware" | |
− | |||
} | } | ||
+ | EOF | ||
</pre> | </pre> | ||
Line 66: | Line 69: | ||
{{Cmd|chmod +x mkimg.$PROFILENAME.sh}} | {{Cmd|chmod +x mkimg.$PROFILENAME.sh}} | ||
+ | == Making packages available on boot == | ||
+ | |||
+ | A package may be made available in the live system by defining the generation of an apkovl which contains a corresponding /etc/apk/world file, and adding that overlay definition to the mkimg-profile, e.g. with `apkovl="genapkovl-mkimgoverlay.sh"` | ||
+ | |||
+ | The definition may be done as in the [https://github.com/alpinelinux/aports/blob/master/scripts/genapkovl-dhcp.sh genapkovl-dhcp.sh] example. | ||
+ | Copy the relevant parts (including the rc_add lines) into a `genapkovl-mkimgoverlay.sh` file and add the package(s) that should be installed in the live system on separate lines in the file contents for /etc/apk/world. | ||
== Create the ISO == | == Create the ISO == | ||
+ | |||
+ | {{Cmd|mkimage.sh [--tag RELEASE] [--outdir OUTDIR] [--workdir WORKDIR] | ||
+ | [--arch ARCH] [--profile PROFILE] [--hostkeys] [--simulate] | ||
+ | [--repository REPO] [--extra-repository REPO] [--yaml FILE] | ||
+ | mkimage.sh --help | ||
+ | |||
+ | options: | ||
+ | --arch Specify which architecture images to build | ||
+ | (default: x86_64) | ||
+ | --hostkeys Copy system apk signing keys to created images | ||
+ | --outdir Specify directory for the created images | ||
+ | --profile Specify which profiles to build | ||
+ | --repository Package repository to use for the image create | ||
+ | --extra-repository Add repository to search packages from | ||
+ | --simulate Don't execute commands | ||
+ | --tag Build images for tag RELEASE | ||
+ | --workdir Specify temporary working directory (cache) | ||
+ | --yaml | ||
+ | |||
+ | known profiles: ali rpi uboot base minirootfs standard vanilla extended virt xen}} | ||
+ | |||
+ | {{Tip| You can use the --repository option multiple times, which is very useful when mixing local and official repositories. The --extra-repository option is only there for backward-compatibility.}} | ||
Create a iso directory in your home dir: | Create a iso directory in your home dir: | ||
Line 87: | Line 118: | ||
Of course, several passages of this doc can be automated with a script, like the repository/arch/outdir settings. | Of course, several passages of this doc can be automated with a script, like the repository/arch/outdir settings. | ||
This steps are left to you and to your imagination :) | This steps are left to you and to your imagination :) | ||
− | |||
== Testing your ISO image == | == Testing your ISO image == |
Latest revision as of 22:13, 16 December 2020
This document explains how to build a custom ISO image using the new mkimage scripts located in aports directory.
Contents
Prerequisite
First make sure we have the needed tools
apk add alpine-sdk build-base apk-tools alpine-conf busybox fakeroot syslinux xorriso squashfs-tools sudo
For efi you should additionally add the following:
apk add mtools dosfstools grub-efi
Create a user (e.g. build) and add it to abuild group:
adduser build -G abuild
Give administrative access to abuild group:
echo "%abuild ALL=(ALL) ALL" > /etc/sudoers.d/abuild
Change to build user:
su - build
Then create signing keys (-i installs them in /etc/apk/keys which is required for later)
abuild-keygen -i -a
ls /etc/apk/keys/
Clone (or update) the git repository.
git clone https://gitlab.alpinelinux.org/alpine/aports.git
Make sure the apk index is up to date (so apk finds the packages):
apk update
Configuration
The mkimg scripts are shipped with pre-configured profiles.
The format is mkimg.$PROFILENAME.sh
So, in order to have a custom ISO, you should create your own mkimg.$PROFILENAME.sh script.
This is an example used to have ZFS module, overlayfs (which allows to have /lib/modules in r/w), a serial console output and some other useful apks to build a simple NAS:
export PROFILENAME=nas
cat << EOF > ~/aports/scripts/mkimg.$PROFILENAME.sh profile_$PROFILENAME() { profile_standard kernel_cmdline="unionfs_size=512M console=tty0 console=ttyS0,115200" syslinux_serial="0 115200" kernel_addons="zfs spl" apks="\$apks iscsi-scst zfs-scripts zfs zfs-utils-py cciss_vol_status lvm2 mdadm mkinitfs mtools nfs-utils parted rsync sfdisk syslinux unrar util-linux xfsprogs dosfstools ntfs-3g " local _k _a for _k in \$kernel_flavors; do apks="\$apks linux-\$_k" for _a in \$kernel_addons; do apks="\$apks \$_a-\$_k" done done apks="\$apks linux-firmware" } EOF
Set the script as executable:
chmod +x mkimg.$PROFILENAME.sh
Making packages available on boot
A package may be made available in the live system by defining the generation of an apkovl which contains a corresponding /etc/apk/world file, and adding that overlay definition to the mkimg-profile, e.g. with `apkovl="genapkovl-mkimgoverlay.sh"`
The definition may be done as in the genapkovl-dhcp.sh example. Copy the relevant parts (including the rc_add lines) into a `genapkovl-mkimgoverlay.sh` file and add the package(s) that should be installed in the live system on separate lines in the file contents for /etc/apk/world.
Create the ISO
mkimage.sh [--tag RELEASE] [--outdir OUTDIR] [--workdir WORKDIR] [--arch ARCH] [--profile PROFILE] [--hostkeys] [--simulate] [--repository REPO] [--extra-repository REPO] [--yaml FILE] mkimage.sh --help options: --arch Specify which architecture images to build (default: x86_64) --hostkeys Copy system apk signing keys to created images --outdir Specify directory for the created images --profile Specify which profiles to build --repository Package repository to use for the image create --extra-repository Add repository to search packages from --simulate Don't execute commands --tag Build images for tag RELEASE --workdir Specify temporary working directory (cache) --yaml known profiles: ali rpi uboot base minirootfs standard vanilla extended virt xen
Create a iso directory in your home dir:
mkdir -p ~/iso
Then create the actual ISO. In this example we will use the edge version x86_64:
sh mkimage.sh --tag edge \ --outdir ~/iso \ --arch x86_64 \ --repository http://dl-cdn.alpinelinux.org/alpine/edge/main \ --profile $PROFILENAME
Notes:
Of course, several passages of this doc can be automated with a script, like the repository/arch/outdir settings. This steps are left to you and to your imagination :)
Testing your ISO image
Qemu is useful for a quick test of your created ISO image.