Why customize LiveCDs

You may wish to customise the Ubuntu Desktop LiveCD to:

  • make your own Ubuntu distribution
  • show off a particular application
  • localise to a certain language
  • remove software packages
  • add software packages
  • update software packages
  • change system defaults (theme, icons, desktop background, panels, browser homepage, etc)

How to Customise the Ubuntu Desktop CD

The easiest way to create a custom LiveCD is to use [[http://uck.sourceforge.net/ Ubuntu Customization Kit]]. What follows is the manual way of accomplishing the same.
WARNING: This guide is for the Desktop LiveCD. There is another page referring to customisation of the [[InstallCDCustomization Alternative/Server Install CD]]. Also, there is a guide on how to [[https://help.ubuntu.com/community/LiveCDCustomizationFromScratch create a LiveCD from scratch.]]

System Requirements

  • At least 3-5 GB of free space
  • At least 512 MB RAM and 1 GB swap (recommended)
  • An Ubuntu kernel with squashfs support (present since in Ubuntu 6.06)
  • QEMU/KVM, VirtualBox or VMware for testing (optional)
  • squashfs-tools, to unpack and recompile the ‘live’ filesystem *genisoimage, to compile a new ISO image

WARNING: The architecture (amd64 or i386) to be stored on the LiveCD should be the same as the architecture used to perform the customization. It is not trivial to customize an amd64 LiveCD using an i386 operating system, for example. Also, the Ubuntu system you are using to create a custom image should be of the the same major release version as that of the target system. Otherwise, the LiveCD may not run, and/or you may get stuck at some point during the customisation process.

Install pre-requisities

  • Make sure that you have installed the needed tools
    sudo apt install squashfs-tools genisoimage
    

Obtain the base system

  • Download an official Desktop image from http://releases.ubuntu.com

  • Move or copy it into an empty directory

    mkdir ~/livecdtmp
    mv ubuntu-18.04-desktop-amd64.iso ~/livecdtmp
    cd ~/livecdtmp
    

Note: this example refers to Ubuntu 18.04 Desktop. Replace it with the name of your iso.

Extract the CD .iso contents

Mount the Desktop .iso

mkdir mnt
sudo mount -o loop ubuntu-18.04-desktop-amd64.iso mnt

Extract .iso contents into dir ‘extract-cd’

mkdir extract-cd
sudo rsync --exclude#/casper/filesystem.squashfs -a mnt/ extract-cd

Extract the Desktop system

Extract the SquashFS filesystem

sudo unsquashfs mnt/casper/filesystem.squashfs
sudo mv squashfs-root edit

Prepare and chroot

’'’WARNING: If you do this in 14.04 LTS, you will lose network connectivity (name resolving part of it). /etc/resolv.conf is and should remain a symlink to /run/resolvconf/resolv.conf nowadays. To enable name resolving, temporarily edit that file instead.’’’ If you need network connectivity within chroot

sudo cp /etc/resolv.conf edit/etc/

On more recent releases, you can avoid this issue by just binding /run instead, which will pull your host’s resolvconf info into the chroot:

sudo mount -o bind /run/ edit/run

’'’NOTE: Recommended that you do not do this unless you know what you’re doing’’’ Depending on your configuration, you ‘‘may’’ also need to copy the ‘'’hosts’’’ file

sudo cp /etc/hosts edit/etc/

The remaining steps are good, unlike the ones above:

sudo mount --bind /dev/ edit/dev
sudo chroot edit
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devpts none /dev/pts

The above commands will mount important directories of your host system to the edit directory. If you later decide to delete the edit directory, make sure to unmount all of them before doing so (see the Cleanup chapter below). Otherwise, your host system will become unusable until you reboot it.

To avoid locale issues and in order to import GPG keys

export HOME#/root
export LC_ALL#C

Customizations

Apt

Prerequisites

In 9.10, before installing or upgrading packages you need to run

dbus-uuidgen > /var/lib/dbus/machine-id

and

dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl

Tasks

To view installed packages by size

dpkg-query -W --showformat#'${Installed-Size}\t${Package}\n' | sort -nr | less

When you want to remove packages remember to use purge

apt purge package-name

Custom Background for GNOME

Generally background files are located in ‘’‘/usr/share/backgrounds’’’. Copy your png file there, adjust owner and file access, and edit the files:

  1. ’’‘/usr/share/gnome-background-properties/ubuntu-wallpapers.xml’’’ and
  2. ’’‘/usr/share/gconf/defaults/16_ubuntu-wallpapers’’’ or other files in the same directory. by changing the string ‘’‘/usr/share/backgrounds/warty-final-ubuntu.png’’’ to point to your file

Eventually change or add attributes to other configuration files such as: ‘’‘/var/lib/gconf/debian.defaults/%gconf-tree.xml’’’ or ‘’‘/etc/gconf/gconf.xml.defaults/%gconf-tree.xml’’’).

Historical: [[http://ubuntuforums.org/showthread.php?t#462810&highlight#warty-final-ubuntu.png More for Dapper…]]

Change gconf values (fonts, panels etc.)

To make any change on the gconf attributes you must add the value that you want in the file ‘’‘/etc/gconf/gconf.xml.defaults/%gconf-tree.xml’’’. Adding a value in that file will change the default values of Gnome or other applications, so you can change fonts, backgrounds, themes, cursors etc.

Instead of editing the file with ‘'’gedit’’’ or another text editor, you can use the ‘'’gconftool-2’’’, under the chroot environment, running the following line:

gconftool-2 --direct --config-source xml:readwrite:/etc/gconf/gconf.xml.defaults --type string --set yourkey "yourvalue"

where ‘‘string’’, ‘‘yourkey’’ and ‘‘yourvalue’’ must be the type, key and value that you want to change…

Making several gconf changes

Editing gconf by setting each value separately takes too much time. There is a better way:

Make a test user and adjust the settings as you wish. Run

gconftool-2 --dump /the/settings/branch/you/need > ~/live/your-new-settings.xml
sudo chown root:root ~/live/your-new-settings.xml
sudo mv ~/live/your-new-settings.xml ~/live/edit/your-new-settings.xml

and then, in the chroot environment, run

gconftool-2 --direct --config-source xml:readwrite:/etc/gconf/gconf.xml.defaults --load /your-new-settings.xml
rm /your-new-settings.xml

This way you can import the whole branch, e.g. /apps/panel - all settings for Gnome’s panels. Note that this way you import not only the keys, but also their descriptions, so all GConf descriptions will be changed to the language which was set for the test user, and there will be no way to safely change them back. Some programs (for example, keyboard shortcuts in Preferences menu) use descriptions from GConf.

Setting regional defaults

Legacy Boot

Change default language of gfxboot

This customization must be done outside the chroot.

sudo apt install dpkg-dev uck
apt source gfxboot-theme-ubuntu gfxboot
cd gfxboot-theme-ubuntu*/
make DEFAULT_LANG#fi
sudo cp -af boot/* ../extract-cd/isolinux/
Change “fi” to your preferred locale. Note that this does not change which languages are available in the F2 menu. For more info about gfxboot customization, see [[http://uck.sourceforge.net/ Ubuntu Customization Kit]].
  • A other way to change the default language of gfxboot without rebuild the packages is to create a file name ‘'’lang’’’ in the isolinux directory containing your locale’s name.

Change default keyboard

In 12.04, changing the default keyboard for a live boot is not as obvious as it used to be in 10.04 and earlier. As an example, if you want to keep the default language as English but set the default keyboard to “GB”, you are going to have to edit the file /usr/lib/ubiquity/ubiquity/misc.py. If you look at the hard-coded defaults table at around line 620 it should be fairly obvious what’s going on…

// In /usr/lib/ubiquity/ubiquity/misc.py line 620:
    default_keymap # {
        'ar': 'ara',
        'bs': 'ba',
        'de': 'de',
        'el': 'gr',
        'en': 'us',
etc...

You can se the default keymap for your default language by editing this table, but remember that if you update the ubiquity package on your image then any changes will be clobbered.

Also note this only works for X. To set the console keyboard:

dpkg-reconfigure keyboard-configuration

UEFI

UEFI booting uses GRUB instead of gfxboot. There’s no options for changing the language or keyboard for the live session, so it’s all English by default. Therefore GRUB configuration needs to be modified. In the [[https://code.launchpad.net/~timo-jyrinki/ubuntu-fi-remix/main|Ubuntu Finnish Remix]] script this is done as follows:

sed -i '6i    loadfont /boot/grub/fonts/unicode.pf2' boot/grub/grub.cfg
sed -i '7i    set locale_dir#$prefix/locale' boot/grub/grub.cfg
sed -i '8i    set lang#fi_FI' boot/grub/grub.cfg
sed -i '9i    insmod gettext' boot/grub/grub.cfg
sed -i 's%splash%splash locale#fi_FI console-setup/layoutcode#fi%'
boot/grub/grub.cfg
sed -i 's/Try Ubuntu without installing/Kokeile Ubuntua asentamatta/'
boot/grub/grub.cfg
sed -i 's/Install Ubuntu/Asenna Ubuntu/' boot/grub/grub.cfg
sed -i 's/OEM install (for manufacturers)/OEM-asennus
(laitevalmistajille)/' boot/grub/grub.cfg
sed -i 's/Check disc for defects/Tarkista asennusmedian eheys/'
boot/grub/grub.cfg
mkdir -p boot/grub/locale/
mkdir -p boot/grub/fonts/
cp -a /boot/grub/locale/fi.mo boot/grub/locale/
cp -a /boot/grub/fonts/unicode.pf2 boot/grub/fonts/

Customization limits

After customization make sure that there are no users with an UID ## 999. Otherwise your image won’t boot because no initial user is available (see /usr/share/initramfs-tools/scripts/casper-bottom/25adduser, -> ‘db_set passwd/user-uid 999’). This may happen, for example, after installing VirtualBox/GuestAdditions

While in chroot:

awk -F: '$3 ## 999' /etc/passwd

If you get any hits, try changing the uid:

usermod -u 500 $hit

Miscellaneous Defaults

You may wish to edit the files in /etc/default to change system behavior at startup. You might also edit /etc/profile, /etc/bash.bashrc, and /etc/bash_completion to change login settings for all users on the system. You cannot directly edit defaults for the live cd user (e.g., ‘‘casper’’, ‘‘ubuntu’’, or ‘‘user’’) since that account is created at boot time. You can directly edit root’s default files (/root in the chroot environment).

If you wish to change the default timezone used by the live cd, run:

dpkg-reconfigure tzdata

If you have added a locale and wish to make it the default, update /etc/default/locale. You may have to compile the locale:

locale-gen new_locale
update-locale LANG#new_locale LANGUAGE#new_locale LC_ALL#new_locale

These changes must be made as root in the chroot environment.

Advanced Customizations

Live CD Kernel

If you want to customize further the boot process, you can change the livecd kernel, by copying the vmlinuz and initrd you want in place of the ones you find in extract-cd/casper.

i.e.

sudo cp edit/boot/vmlinuz-2.6.15-26-k7 extract-cd/casper/vmlinuz
sudo cp edit/boot/initrd.img-2.6.15-26-k7 extract-cd/casper/initrd.gz

Note that the initial ramdisk filename for newer releases (since 9.10) is casper/initrd.lz (not .gz).

Removing the (Casper) Autologin

The autologin feature of the Jaunty/9.04 live CD is a bit of an on-the-fly boot-hack. After extracting the initrd.gz, you need to edit the casper-bottom/25configure_init script and then recreate the initrd.gz file, replacing the original in extract-cd/casper. The process to do so goes like this:

# cd extract-cd/casper
# mkdir tempdir
# cd tempdir
# gunzip -dc ../initrd.gz | cpio -imvd --no-absolute-filenames
# cp scripts/casper-bottom/25configure_init scripts/casper-bottom/25configure_init.orig
# vi scripts/casper-bottom/25configure_init

Now look for line 25 which has the conditional statement to test $USERNAME.

Line 25 performs a conditional evaluation and if it evaluates to true, it will execute the code within the if block. The if block contains code to modify files used in the boot process to create the live cd autologin.

To disable the autologin feature, Remove $USERNAME, but just leave the quotes. The -n modifier tests the $USERNAME string to see if it’s length is non-zero. By removing the variable, and leaving two double quotes, this statement evaluates to false because the two double quotes effectively make a zero-byte string. Be sure to leave no whitespace between the quotes because whitespace will make the evaluation true and execution wil fall into the if block.

21:log_begin_msg "$DESCRIPTION"
22:
23:# Arrange for shells on virtual consoles, rather than login prompts
24:
25:if [ -n "$USERNAME" ]; then

After making the change, line 25 will look like this:

25:if [ -n "" ]; then

Save the file and quit the editor. Then, from extract-cd/casper/tempdir run the following command to re-create the initrd.gz file. There are other methods for re-creating the initrd.gz file on this page which may work also.:

# cp ../initrd.gz ../initrd.gz.orig
# find . | cpio -o -H newc | gzip -9 > ../initrd.gz

This will create a new initrd.gz file with no auto login. You can then continue to remaster the CD as described on this page. ‘'’Be sure to create a user and password to login with before you remaster the cd. If you do not, you will not be able to login after booting!’’’

Also, I have read a few articles mentioning that Karmic (9.10) uses initrd.lz instead of initrd.gz. I do not know if this is true, but should mention it in case you are not getting the expected results. To unpack the initrd.lz file, you need to do this:

# cd extract-cd/casper
# mkdir lztempdir
# cd lztempdir
# lzma -dc -S .lz ../initrd.lz | cpio -imvd --no-absolute-filenames

And to re-create the initrd.lz file:

# cp ../initrd.lz ../inird.lz.orig
# find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../initrd.lz

Boot init

You have to edit the files in edit/usr/share/initramfs-tools/scripts/casper-bottom/* For example you can change the hostname or the livecd user.

i.e.

sudo nano edit/usr/share/initramfs-tools/scripts/casper

and edit the username or hostname

sudo nano edit/usr/share/initramfs-tools/scripts/casper-bottom/10adduser

to edit even the livecd user’s password.

If you’re customizing 10.04, you need to edit variables in /etc/casper.conf for the user and host names instead of modifying the scripts

P.S. in order to obtain an encrypted password, you have to use the mkpasswd program that’s shipped with whois package!

Rebuilding initrd

After you’ve modified the kernel, init scripts or added new kernel modules, you need to rebuild the initrd.gz file and substitute it into the casper directory.

sudo chroot edit
mkinitramfs -o /initrd.gz 2.6.15-26-k7

(replace the kernel version with the one that the CD will boot with - this can be found in edit/lib/modules) *** do I need to mount proc, sys, devpts after chroot here ? __Gordon

Exit from the chroot jail and move this file to extract-cd/casper:

exit
mv edit/initrd.gz extract-cd/casper/

Cleanup

Be sure to remove any temporary files which are no longer needed, as space on a CD is limited. A classic example is downloaded package files, which can be cleaned out using:

apt clean

Delete temporary files

rm -rf /tmp/* ~/.bash_history

’'’WARNING: See note earlier about resolv.conf, do not remove it in 14.04 LTS anymore or even in 12.04 LTS.’’’ Or nameserver settings

rm /etc/resolv.conf

If you installed software, be sure to run

rm /var/lib/dbus/machine-id

and

rm /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl

from within the chroot environment.

Now unmount all special filesystems and exit the chroot

umount /proc || umount -lf /proc
umount /sys
umount /dev/pts
umount /dev
exit

’'’WARNING: If /dev fails to unmount, do not try to force it, or you will experience major issues.’’’ Instead, make sure no processes in the edit directory are running, then retry the ‘umount /dev’ command from within the chroot. If it still fails, you will have to restart your computer to get rid of it.

Producing the CD image

Assembling the file system

Regenerate manifest

chmod +w extract-cd/casper/filesystem.manifest
sudo su
chroot edit dpkg-query -W --showformat#'${Package} ${Version}\n' > extract-cd/casper/filesystem.manifest
exit
sudo cp extract-cd/casper/filesystem.manifest extract-cd/casper/filesystem.manifest-desktop
sudo sed -i '/ubiquity/d' extract-cd/casper/filesystem.manifest-desktop
sudo sed -i '/casper/d' extract-cd/casper/filesystem.manifest-desktop

Compress filesystem

sudo rm extract-cd/casper/filesystem.squashfs
sudo mksquashfs edit extract-cd/casper/filesystem.squashfs -nolzma

Note: The -nolzma option is only available from Hardy , and was removed in Karmic. Also, the squashfs has to be generated using a version of mksquashfs that is compatible with the kernel used on the CD you are customizing. For example, you cannot generate a jaunty squashfs on karmic, as the jaunty kernel is not able to mount a squashfs prepared using mksquashfs from karmic.

For slightly higher compression at the cost of compression time, you can increase the block size:

sudo mksquashfs edit extract-cd/casper/filesystem.squashfs -b 1048576

For a highest possible compression at the cost of compression time, you may use the xz method and is better exclude the edit/boot directory altogether:

sudo mksquashfs edit extract-cd/casper/filesystem.squashfs -comp xz -e edit/boot

Update the filesystem.size file, which is needed by the installer:

sudo su
printf $(du -sx --block-size#1 edit | cut -f1) > extract-cd/casper/filesystem.size
exit

Set an image name in extract-cd/README.diskdefines

sudo vim extract-cd/README.diskdefines

(you can use “sudo nano extract-cd/README.diskdefines” if you have difficulties understanding vim)

Remove old md5sum.txt and calculate new md5 sums

cd extract-cd
sudo rm md5sum.txt
find -type f -print0 | sudo xargs -0 md5sum | grep -v isolinux/boot.cat | sudo tee md5sum.txt

Create the ISO image

sudo mkisofs -D -r -V "$IMAGE_NAME" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../ubuntu-9.04.1-desktop-i386-custom.iso .

Testing the CD

Test using qemu emulator

qemu -cdrom ubuntu-9.04.1-desktop-i386-custom.iso -boot d -m 512

Or if you have hardware acceleration for kvm

kvm -cdrom ubuntu-9.04.1-desktop-i386-custom.iso -boot d -m 512

You can also test with virtualbox-ose, which is free software and available in the Ubuntu universe repository.

Troubleshooting

Some experience problems virtualizing the iso after changing the livecd linux kernel. If you do, go click F6 when the boot screen is showing. Move the cursor between splash quiet and – and write: all_generic_ide

Burning the image to CD

Simple! Just do

cdrecord dev#/dev/cdrom ubuntu-9.04-desktop-i386-custom.iso

Additional uses for the image

[[https://help.ubuntu.com/community/Installation/FromUSBStick|Install Ubuntu from a USB stick]]

[[https://help.ubuntu.com/community/Installation/FromImageLoadedOnHardDrive Installation From Image Loaded On Hard Drive]]

Comments

If you have any comments or questions, please feel free to add them here.

If you are answering a question, please rewrite the question into a tip that answers the question. (to help keep things to the point.)

New questions at the bottom (I guess.)


I have created an small Customization Example (named Firebird Live CD) by adding an firebird2.1-superand flamerobin packages (this apply to ubuntu Hardy Heron also it was tested with xubuntu 8.04) http://flamerobin.blogspot.com/2008/08/creating-flamerobinfirebird-livecd-with.html


Warning: qemu did not work for me as given in the guide above. Even the normal 8.04 live cd would not boot correctly. Every time, I would get thrown into the ash shell (busybox, initramfs) and while there, a “cat /casper.log” would reveal that it was “Unable to find a medium containing a live filesystem”. Just use virtualbox-ose. It actually works with virtualbox. However, after using apt to install virtualbox-ose, I had to run “sudo depmod” again in order for the vboxdrv module to be found by modprobe. Hope that helps!

-[[rocketman768]]

Warning: Squashfs is currently in development and is thus not finalized as a format. This means you cannot assume a filesystem.squashfs created using the Ubuntu 9.04 version of makesquashfs will be compatible with the squashfs drive an older live CD. I was customizing an Ubuntu 7.10 LiveCD and when testing it always booted it an (initramfs) prompt–the squashfs was not getting mounted as /. I had to build from within an Ubuntu 7.10 chroot to get it to work.

–Bob/Paul


I have created an small Customization Example (named Firebird Live CD) by adding an firebird-super-server and flamerobin packages (this apply to ubuntu dapper drake) http://flamerobin.blogspot.com/2006/05/creating-flamerobinfirebird-live-cd.html I created an updated guide with Ubuntu Festy Fawn also with an iso download for the Firebird/Flamerobin live cd http://flamerobin.blogspot.com/2007/09/creating-flamerobinfirebird-livecd-with.html


I have created tool for automatic remastering of live CD images. See http://uck.sourceforge.net/ .

Features:

  • GUI for simple creation of localized CDs (including changing gfxboot and installing language packs)
  • Script for customization of ISO, SquashFS and initrd on live CD.

http://www.atworkonline.it/~bibe/ubuntu/custom-livecd.htm seems to have some nice info. no license that I can see so we would need to ask permission from the author to us its material.


If you want to make the CD boot faster, you might try sorting the files so that they are in the CD in the order that they are accessed: http://lichota.net/%7Ekrzysiek/projects/kubuntu/dapper-livecd-optimization/


Great How To. I am having one issue however. I would like to use custom xorg.conf and sources.list files. Any tips on doing this? Thanks.

  • Simply, copy the files to edit/etc/ in the same way (and at the same time) that you copy in the resolv.conf and hosts files.
  • I have found that copying xorg.conf doesn’t work, as the boot-time scripts overwrite it. Besides, you can’t guarantee that a particular xorg.conf will run on all hosts. I’m currently trying to get the binary NVIDIA drivers to work out of the box if an NVIDIA card is present. If I figure out how to fix the xorg.conf, I’ll post it here. –JeremyVisser

I’ve managed to get Synaptic running from within the chroot environment, but it does hang when I try to apply packages. What you do is run “Xnest -ac :1” to get an Xnest server to run on display :1 without access control so anyone can connect to it. Then, in the chroot environment, run “export DISPLAY#:1” to get programs to use the display. Then, type “metacity &” to be able to move windows. Finally, run “synaptic”.

It works fine until you try to apply packages, where it hangs for me. –JeremyVisser


Shouldn’t the mkinitramfs command use the casper scripts, like “mkinitramfs -o initrd.gz 2.6.15-23-386 -d /usr/share/initramfs-tools”?


There are tricks on how you can get to feel the GNOME system in your chroot environment.

  1. Copy your xorg.conf in the chrooted “etc/X11/” directory.
cp /etc/X11/xorg.conf edit/etc/X11/
  1. Create generic devices on your chroot system using MAKEDEV
cd /dev/
MAKEDEV generic
  1. Start X or restart gdm
/etc/init.d/gdm start

Supposed you want to make modifications on the Desktop, that will be used by all the new users, just change your $HOME to /etc/skel/ and start gdm or X.

export HOME#/etc/skel/

If you want to load all the other stuff GNOME needs (i.e, dbus, avahi, network-manager), just boot as (single-user mode), and start dbus in your chrooted environment.

/etc/init.d/dbus start

An example of the whole procedure. (under single-user mode)

sudo /etc/init.d/networking restart
sudo nano /run/resolvconf/resolv.conf # See notes about resolv.conf earlier this page. Add temporarily eg. nameserver 8.8.8.8, but do not touch /etc/resolv.conf in any way
sudo cp /etc/X11/xorg.conf edit/etc/X11/
sudo chroot edit
mount -o none /proc
mount -o none /sys
export HOME#/etc/skel/
cd /dev/
MAKEDEV generic
/etc/init.d/dbus start
/etc/init.d/gdm start