Difference between revisions of "Remastering the Install ISO"

From ArchWiki
Jump to navigation Jump to search
m (→‎Modifying the EFI boot image: dd standard correctness)
m (→‎See also: use https; beautification)
 
(13 intermediate revisions by 9 users not shown)
Line 1: Line 1:
[[Category:Getting and installing Arch]]
+
[[Category:Live Arch systems]]
[[Category:Live_Arch_systems]]
 
 
[[ja:インストール ISO のリマスタリング]]
 
[[ja:インストール ISO のリマスタリング]]
 
[[ru:Remastering the Install ISO]]
 
[[ru:Remastering the Install ISO]]
Line 22: Line 21:
 
=== How it works ===
 
=== How it works ===
  
The installer ISO used to contain two separate archlinux systems. One for 32 bit (i686) and one for 64 bit (x86_64). Now only 64 bit system is supported. The root filesystems of this system is stored in {{ic|arch/x86_64/airootfs.sfs}}. The kernel and initramfs are in {{ic|arch/boot/x86_64}}.
+
The root filesystems of the live system is stored in {{ic|arch/x86_64/airootfs.sfs}} in the ISO. The kernel and initramfs are in {{ic|arch/boot/x86_64}}.
  
 
When booting, the initramfs will search for the device it was booted from via its label, {{ic|ARCH_201410}} for example, and will mount the root filesystem for the architecture.
 
When booting, the initramfs will search for the device it was booted from via its label, {{ic|ARCH_201410}} for example, and will mount the root filesystem for the architecture.
Line 42: Line 41:
 
  $ cp -a /mnt/archiso ~/customiso
 
  $ cp -a /mnt/archiso ~/customiso
  
{{Note|Make sure {{ic|customiso}} does not exist beforehand, otherwise this will create a subdirectory called {{ic|archiso}} inside {{ic|customiso}}}}
+
{{Note|Make sure {{ic|customiso}} does not exist beforehand, otherwise this will create a subdirectory called {{ic|archiso}} inside {{ic|customiso}}.}}
  
 
=== Customization ===
 
=== Customization ===
  
 
==== Modifying the x86_64 system ====
 
==== Modifying the x86_64 system ====
 +
 
Change into the directory of the x86_64 system:
 
Change into the directory of the x86_64 system:
 
    
 
    
  $ cd ~/customiso/arch/x86_64
+
$ cd ~/customiso/arch/x86_64
  
 
Unsquash {{ic|airootfs.sfs}} (to {{ic|squashfs-root}}):
 
Unsquash {{ic|airootfs.sfs}} (to {{ic|squashfs-root}}):
  
  $ unsquashfs airootfs.sfs
+
$ unsquashfs airootfs.sfs
  
 
{{Note|You need {{Pkg|squashfs-tools}} in order to do that.}}
 
{{Note|You need {{Pkg|squashfs-tools}} in order to do that.}}
 +
 +
If you will need to run {{ic|mkinitcpio}} within {{ic|arch-chroot}}, you need to temporarily copy the kernel over:
 +
 +
$ cp ../boot/x86_64/vmlinuz squashfs-root/boot/vmlinuz-linux
  
 
Now you can modify the content of the system in {{ic|squashfs-root}}. You can also chroot into this system to install packages etc.:
 
Now you can modify the content of the system in {{ic|squashfs-root}}. You can also chroot into this system to install packages etc.:
  
  # arch-chroot squashfs-root /bin/bash
+
# arch-chroot squashfs-root /bin/bash
  
{{Note|{{ic|arch-chroot}} is part of the package {{Pkg|arch-install-scripts}}}}
+
{{Note|
{{Note|If the {{ic|arch-chroot}} script is not available in your system (e.g, when remastering arch-based distros), mount the api file systems and copy over your DNS details. See [[Chroot#Using chroot]].}}
+
* {{ic|arch-chroot}} is part of the package {{Pkg|arch-install-scripts}}.
 +
* If the {{ic|arch-chroot}} script is not available in your system (e.g, when remastering from other distributions), mount the API file systems and copy over your DNS details. See [[Chroot#Using chroot]].
 +
}}
  
 
To be able to install package, you have to initialise the pacman keyring:
 
To be able to install package, you have to initialise the pacman keyring:
  
  (chroot) # pacman-key --init
+
(chroot) # pacman-key --init
  (chroot) # pacman-key --populate archlinux
+
(chroot) # pacman-key --populate archlinux
  
{{Note|This step can take quite a while, be patient. (see [[Pacman-key#Initializing the keyring|Pacman-Key]])}}
+
{{Note|This step can take quite a while, be patient. See [[Pacman/Package signing#Initializing the keyring]].}}
  
 
If the kernel or initrd is updated, additional steps are required. In this case you have to install {{Pkg|archiso}} inside the chroot and change the content of {{ic|/etc/mkinitcpio.conf}}:
 
If the kernel or initrd is updated, additional steps are required. In this case you have to install {{Pkg|archiso}} inside the chroot and change the content of {{ic|/etc/mkinitcpio.conf}}:
  
  (chroot) # pacman -Syu --force archiso linux
+
(chroot) # pacman -Syu --force archiso linux
  (chroot) # nano /etc/mkinitcpio.conf
+
(chroot) # nano /etc/mkinitcpio.conf
  
 
Change the line that says {{ic|1=HOOKS="...}} to:
 
Change the line that says {{ic|1=HOOKS="...}} to:
  
  HOOKS="base udev memdisk archiso_shutdown archiso archiso_loop_mnt archiso_pxe_common archiso_pxe_nbd archiso_pxe_http archiso_pxe_nfs archiso_kms block pcmcia filesystems keyboard"
+
HOOKS="base udev memdisk archiso_shutdown archiso archiso_loop_mnt archiso_pxe_common archiso_pxe_nbd archiso_pxe_http archiso_pxe_nfs archiso_kms block filesystems keyboard"
  
 
Now update the initramfs:
 
Now update the initramfs:
  
  (chroot) # mkinitcpio -p linux
+
(chroot) # mkinitcpio -p linux
  
 
When you are done, create a list of all installed packages, clean the pacman cache and exit the chroot:
 
When you are done, create a list of all installed packages, clean the pacman cache and exit the chroot:
  
  (chroot) # LANG=C pacman -Sl | awk '/\[installed\]$/ {print $1 "/" $2 "-" $3}' > /pkglist.txt
+
(chroot) # LANG=C pacman -Sl | awk '/\[installed\]$/ {print $1 "/" $2 "-" $3}' > /pkglist.txt
  (chroot) # pacman -Scc
+
(chroot) # pacman -Scc
  (chroot) # exit
+
(chroot) # exit
  
If you updated the kernel or the initramfs, copy them over to the system:
+
If you updated the kernel or the initramfs, move them over to the system, and remove the fallback initramfs (the install ISO does not use this):
  
  $ cp squashfs-root/boot/vmlinuz-linux ~/customiso/arch/boot/x86_64/vmlinuz
+
$ mv squashfs-root/boot/vmlinuz-linux ~/customiso/arch/boot/x86_64/vmlinuz
  $ cp squashfs-root/boot/initramfs-linux.img ~/customiso/arch/boot/x86_64/archiso.img
+
$ mv squashfs-root/boot/initramfs-linux.img ~/customiso/arch/boot/x86_64/archiso.img
 +
$ rm squashfs-root/boot/initramfs-linux-fallback.img
  
 
Move the list of packages:
 
Move the list of packages:
 
    
 
    
  $ mv squashfs-root/pkglist.txt ~/customiso/arch/pkglist.x86_64.txt
+
$ mv squashfs-root/pkglist.txt ~/customiso/arch/pkglist.x86_64.txt
  
 
Now recreate {{ic|airootfs.sfs}}:
 
Now recreate {{ic|airootfs.sfs}}:
  
  $ rm airootfs.sfs
+
$ rm airootfs.sfs
  $ mksquashfs squashfs-root airootfs.sfs
+
$ mksquashfs squashfs-root airootfs.sfs
 +
 
 +
{{Note|The monthly install ISO uses the {{ic|-comp xz}} option on {{ic|mksquashfs}} to significantly reduce size, but it also takes longer}}
  
 
Cleanup:
 
Cleanup:
  
  # rm -r squashfs-root
+
# rm -r squashfs-root
  
Now update the MD5 checksum of {{ic|airootfs.sfs}}:
+
Now update the SHA512 checksum of {{ic|airootfs.sfs}}:
 
    
 
    
  $ md5sum airootfs.sfs > airootfs.md5
+
$ sha512sum airootfs.sfs > airootfs.sha512
  
 
==== Modifying the EFI boot image ====
 
==== Modifying the EFI boot image ====
Line 117: Line 126:
 
You will need {{Pkg|dosfstools}} as the EFI boot image is a {{ic|FAT16}} filesystem.
 
You will need {{Pkg|dosfstools}} as the EFI boot image is a {{ic|FAT16}} filesystem.
  
  $ mkdir mnt
+
$ mkdir mnt
  # mount -t vfat -o loop ~/customiso/EFI/archiso/efiboot.img mnt
+
# mount -t vfat -o loop ~/customiso/EFI/archiso/efiboot.img mnt
  # cp ~/customiso/arch/boot/x86_64/vmlinuz mnt/EFI/archiso/vmlinuz.efi
+
# cp ~/customiso/arch/boot/x86_64/vmlinuz mnt/EFI/archiso/vmlinuz.efi
  # cp ~/customiso/arch/boot/x86_64/archiso.img mnt/EFI/archiso/archiso.img
+
# cp ~/customiso/arch/boot/x86_64/archiso.img mnt/EFI/archiso/archiso.img
  
 
If you see {{ic|No space left on device}} errors, you might need to resize {{ic|efiboot.img}}.
 
If you see {{ic|No space left on device}} errors, you might need to resize {{ic|efiboot.img}}.
 
You can also create a new {{ic|efiboot.img}} and copy the old files (replace {{ic|50}} with the required size).
 
You can also create a new {{ic|efiboot.img}} and copy the old files (replace {{ic|50}} with the required size).
  
  $ dd if=/dev/zero bs=1024x1024 count=50 of=efiboot-new.img
+
$ dd if=/dev/zero bs=1M count=50 of=efiboot-new.img
  $ mkfs.fat -n "ARCHISO_EFI" efiboot-new.img
+
$ mkfs.fat -n "ARCHISO_EFI" efiboot-new.img
  $ mkdir new
+
$ mkdir new
  # mount -t fat -o loop efiboot-new.img new
+
# mount -t fat -o loop efiboot-new.img new
  $ cp -r mnt/* new/
+
$ cp -r mnt/* new/
  # umount new mnt
+
# umount new mnt
  $ mv efiboot-new.img ~/customiso/EFI/archiso/efiboot.img
+
$ mv efiboot-new.img ~/customiso/EFI/archiso/efiboot.img
  
 
And use the new {{ic|efiboot.img}} as above.
 
And use the new {{ic|efiboot.img}} as above.
Line 141: Line 150:
 
  $ genisoimage -l -r -J -V "ARCH_201209" -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -c isolinux/boot.cat -o ../arch-custom.iso ./
 
  $ genisoimage -l -r -J -V "ARCH_201209" -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -c isolinux/boot.cat -o ../arch-custom.iso ./
  
{{Note|The ISO label must remain the same as the original label (in this case {{ic|ARCH_201209}}) for the image to boot successfully.}}
+
{{Note|
 
+
* The ISO label must remain the same as the original label (in this case {{ic|ARCH_201209}}) for the image to boot successfully.
{{Note|The {{ic|-b}} and {{ic|-c}} options expect paths relative to the root of the ISO}}
+
* The {{ic|-b}} and {{ic|-c}} options expect paths relative to the root of the ISO.
 +
}}
  
The resulting ISO image will boot only from CD, DVD or BD. For booting from USB stick or hard disk, it needs the [http://www.syslinux.org/wiki/index.php/Isohybrid isohybrid] feature.
+
The resulting ISO image will boot only from CD, DVD or BD. For booting from USB stick or hard disk, it needs the [https://wiki.syslinux.org/wiki/index.php/Isohybrid isohybrid] feature.
 
This can be achieved by postprocessing the ISO by program isohybrid included in {{pkg|syslinux}}.
 
This can be achieved by postprocessing the ISO by program isohybrid included in {{pkg|syslinux}}.
Officially, the version of installed SYSLINUX has to be the same as the version of /isolinux/isolinux.bin in the ISO. It is not known whether really incompatible version combinations exist.
+
Officially, the version of installed SYSLINUX has to be the same as the version of {{ic|/isolinux/isolinux.bin}} in the ISO. It is not known whether really incompatible version combinations exist.
  
 
An alternative to genisoimage plus isohybrid can be derived from the xorriso run of mkarchiso.
 
An alternative to genisoimage plus isohybrid can be derived from the xorriso run of mkarchiso.
Line 163: Line 173:
 
         ~/customiso
 
         ~/customiso
  
Option -isohybrid-mbr needs an [[MBR]] template file. Most probably there is already such a file /isolinux/isohdpfx.bin in the original ISO, which matches the SYSLINUX version used in the ISO.
+
Option {{ic|-isohybrid-mbr}} needs an [[MBR]] template file. Most probably there is already such a file {{ic|/isolinux/isohdpfx.bin}} in the original ISO, which matches the SYSLINUX version used in the ISO.
 
Only if this file is missing in the copied ISO content, it has to be cut out of the original ISO image file, before above xorriso run is performed:
 
Only if this file is missing in the copied ISO content, it has to be cut out of the original ISO image file, before above xorriso run is performed:
  
 
  $ dd if=/path/to/archISO bs=512 count=1 of=~/customiso/isolinux/isohdpfx.bin
 
  $ dd if=/path/to/archISO bs=512 count=1 of=~/customiso/isolinux/isohdpfx.bin
  
If the original ISO supports bootability via EFI, this can be activated in the new ISO by inserting the following options between the lines "-isohybrid-mbr ..." and "-output ...":
+
If the original ISO supports bootability via EFI, this can be activated in the new ISO by inserting the following options between the lines {{ic|-isohybrid-mbr ...}} and {{ic|-output ...}}:
  
 
         -eltorito-alt-boot \
 
         -eltorito-alt-boot \
Line 174: Line 184:
 
         -no-emul-boot -isohybrid-gpt-basdat \
 
         -no-emul-boot -isohybrid-gpt-basdat \
  
The file /EFI/archiso/efiboot.img is a FAT filesystem image file. If it is missing in the original ISO, then there was no EFI support in that ISO.
+
The file {{ic|/EFI/archiso/efiboot.img}} is a FAT filesystem image file. If it is missing in the original ISO, then there was no UEFI support in that ISO.
  
The newly created ISO image {{Ic|arch-custom.iso}} is found in the home directory. You can write the ISO image to a USB stick as explained in [[USB Installation Media]]. Alternatively you can burn the ISO image on a CD, DVD, or BD with your preferred software. On Arch, that is covered in the [[Optical_disc_drive#Burning_an_ISO_image_to_CD.2C_DVD.2C_or_BD|article about burning an ISO image]].
+
The newly created ISO image {{Ic|arch-custom.iso}} is found in the home directory. You can write the ISO image to a USB stick as explained in [[USB Installation Media]]. Alternatively you can burn the ISO image on a CD, DVD, or BD with your preferred software. On Arch, that is covered in the [[Optical_disc_drive#Burning an ISO image to CD, DVD, or BD|article about burning an ISO image]].
  
 
== See also ==
 
== See also ==
  
* http://www.knoppix.net/wiki/KnoppixRemasteringHowto
+
* [http://knoppix.net/wiki3/index.php?title=KnoppixRemasteringHowto Knoppix Remastering Howto]
* http://syslinux.zytor.com/iso.php
+
* [https://wiki.syslinux.org/wiki/index.php?title=ISOLINUX ISOLINUX]
* http://busybox.net/
+
* [https://busybox.net/ BusyBox]
* [http://www.linux-live.org/ Linux Live Kit]
+
* [https://www.linux-live.org/ Linux Live Kit]

Latest revision as of 20:09, 25 September 2019

Remastering the official Arch Linux install ISO image is not necessary for most applications. However, it may be desirable in some cases.

  • Basic hardware is not supported by the core install. (rare)
  • Installation on a non-internet capable machine.
  • Deployment of Arch Linux on many similar machines, requiring the same installation procedure.

As these ISOs are bootable, they can also be used for system rescue, testing, project demos, and more.

Archiso

It is often preferable to rebuild the installation ISO with Archiso, instead of remastering an existing ISO.

Manually

How it works

The root filesystems of the live system is stored in arch/x86_64/airootfs.sfs in the ISO. The kernel and initramfs are in arch/boot/x86_64.

When booting, the initramfs will search for the device it was booted from via its label, ARCH_201410 for example, and will mount the root filesystem for the architecture.

Extracting the ISO

To remaster the Arch Linux ISO, you will need a copy of the original ISO image. Download it from the download page

Now, create a new directory to mount the ISO:

# mkdir /mnt/archiso

Mount the ISO to this directory (due to the nature of ISOs, the result is read-only):

# mount -t iso9660 -o loop /path/to/archISO /mnt/archiso

Copy the contents to another directory, where they can be edited:

$ cp -a /mnt/archiso ~/customiso
Note: Make sure customiso does not exist beforehand, otherwise this will create a subdirectory called archiso inside customiso.

Customization

Modifying the x86_64 system

Change into the directory of the x86_64 system:

$ cd ~/customiso/arch/x86_64

Unsquash airootfs.sfs (to squashfs-root):

$ unsquashfs airootfs.sfs
Note: You need squashfs-tools in order to do that.

If you will need to run mkinitcpio within arch-chroot, you need to temporarily copy the kernel over:

$ cp ../boot/x86_64/vmlinuz squashfs-root/boot/vmlinuz-linux

Now you can modify the content of the system in squashfs-root. You can also chroot into this system to install packages etc.:

# arch-chroot squashfs-root /bin/bash
Note:
  • arch-chroot is part of the package arch-install-scripts.
  • If the arch-chroot script is not available in your system (e.g, when remastering from other distributions), mount the API file systems and copy over your DNS details. See Chroot#Using chroot.

To be able to install package, you have to initialise the pacman keyring:

(chroot) # pacman-key --init
(chroot) # pacman-key --populate archlinux
Note: This step can take quite a while, be patient. See Pacman/Package signing#Initializing the keyring.

If the kernel or initrd is updated, additional steps are required. In this case you have to install archiso inside the chroot and change the content of /etc/mkinitcpio.conf:

(chroot) # pacman -Syu --force archiso linux
(chroot) # nano /etc/mkinitcpio.conf

Change the line that says HOOKS="... to:

HOOKS="base udev memdisk archiso_shutdown archiso archiso_loop_mnt archiso_pxe_common archiso_pxe_nbd archiso_pxe_http archiso_pxe_nfs archiso_kms block filesystems keyboard"

Now update the initramfs:

(chroot) # mkinitcpio -p linux

When you are done, create a list of all installed packages, clean the pacman cache and exit the chroot:

(chroot) # LANG=C pacman -Sl | awk '/\[installed\]$/ {print $1 "/" $2 "-" $3}' > /pkglist.txt
(chroot) # pacman -Scc
(chroot) # exit

If you updated the kernel or the initramfs, move them over to the system, and remove the fallback initramfs (the install ISO does not use this):

$ mv squashfs-root/boot/vmlinuz-linux ~/customiso/arch/boot/x86_64/vmlinuz
$ mv squashfs-root/boot/initramfs-linux.img ~/customiso/arch/boot/x86_64/archiso.img
$ rm squashfs-root/boot/initramfs-linux-fallback.img

Move the list of packages:

$ mv squashfs-root/pkglist.txt ~/customiso/arch/pkglist.x86_64.txt

Now recreate airootfs.sfs:

$ rm airootfs.sfs
$ mksquashfs squashfs-root airootfs.sfs
Note: The monthly install ISO uses the -comp xz option on mksquashfs to significantly reduce size, but it also takes longer

Cleanup:

# rm -r squashfs-root

Now update the SHA512 checksum of airootfs.sfs:

$ sha512sum airootfs.sfs > airootfs.sha512

Modifying the EFI boot image

If you have updated the kernel or the initramfs and wish to boot on EFI systems, update the EFI boot image. You will need dosfstools as the EFI boot image is a FAT16 filesystem.

$ mkdir mnt
# mount -t vfat -o loop ~/customiso/EFI/archiso/efiboot.img mnt
# cp ~/customiso/arch/boot/x86_64/vmlinuz mnt/EFI/archiso/vmlinuz.efi
# cp ~/customiso/arch/boot/x86_64/archiso.img mnt/EFI/archiso/archiso.img

If you see No space left on device errors, you might need to resize efiboot.img. You can also create a new efiboot.img and copy the old files (replace 50 with the required size).

$ dd if=/dev/zero bs=1M count=50 of=efiboot-new.img
$ mkfs.fat -n "ARCHISO_EFI" efiboot-new.img
$ mkdir new
# mount -t fat -o loop efiboot-new.img new
$ cp -r mnt/* new/
# umount new mnt
$ mv efiboot-new.img ~/customiso/EFI/archiso/efiboot.img

And use the new efiboot.img as above.

Create a new ISO

Create a new ISO image with genisoimage, which is part of cdrtools, as a symlink to mkisofs.

$ genisoimage -l -r -J -V "ARCH_201209" -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -c isolinux/boot.cat -o ../arch-custom.iso ./
Note:
  • The ISO label must remain the same as the original label (in this case ARCH_201209) for the image to boot successfully.
  • The -b and -c options expect paths relative to the root of the ISO.

The resulting ISO image will boot only from CD, DVD or BD. For booting from USB stick or hard disk, it needs the isohybrid feature. This can be achieved by postprocessing the ISO by program isohybrid included in syslinux. Officially, the version of installed SYSLINUX has to be the same as the version of /isolinux/isolinux.bin in the ISO. It is not known whether really incompatible version combinations exist.

An alternative to genisoimage plus isohybrid can be derived from the xorriso run of mkarchiso.

$ iso_label="ARCH_201209"
$ xorriso -as mkisofs \
       -iso-level 3 \  
       -full-iso9660-filenames \
       -volid "${iso_label}" \
       -eltorito-boot isolinux/isolinux.bin \
       -eltorito-catalog isolinux/boot.cat \
       -no-emul-boot -boot-load-size 4 -boot-info-table \
       -isohybrid-mbr ~/customiso/isolinux/isohdpfx.bin \
       -output arch-custom.iso \ 
       ~/customiso

Option -isohybrid-mbr needs an MBR template file. Most probably there is already such a file /isolinux/isohdpfx.bin in the original ISO, which matches the SYSLINUX version used in the ISO. Only if this file is missing in the copied ISO content, it has to be cut out of the original ISO image file, before above xorriso run is performed:

$ dd if=/path/to/archISO bs=512 count=1 of=~/customiso/isolinux/isohdpfx.bin

If the original ISO supports bootability via EFI, this can be activated in the new ISO by inserting the following options between the lines -isohybrid-mbr ... and -output ...:

       -eltorito-alt-boot \
       -e EFI/archiso/efiboot.img \
       -no-emul-boot -isohybrid-gpt-basdat \

The file /EFI/archiso/efiboot.img is a FAT filesystem image file. If it is missing in the original ISO, then there was no UEFI support in that ISO.

The newly created ISO image arch-custom.iso is found in the home directory. You can write the ISO image to a USB stick as explained in USB Installation Media. Alternatively you can burn the ISO image on a CD, DVD, or BD with your preferred software. On Arch, that is covered in the article about burning an ISO image.

See also