Customizing Ubuntu Desktop CD

From Gramps
Revision as of 21:35, 27 June 2008 by Shura (talk | contribs) (Adding our packages)
Jump to: navigation, search

This page describes how to customize the Ubuntu Dekstop CD. This is typically done to showcase certain packages that don't come with the default Ubuntu CD. This information is based on Ubuntu 8.04 and may or may not be applicable to future releases.

Brief overview of the process

An extremely general picture is: unpack stuff from CD, add our packages, pack it all back. Now a little more detail on each part.

  • The whole filesystem of the Ubuntu that will run in the Live session is packed into a single file on the CD. This file is /casper/filesystem.squashfs and one needs the squashfs kernel module to work with such filesystems.
  • One needs to prepare packages (.deb files) that are to be added to the system. These packages may have dependencies that also need to be downloaded beforehand.
  • The final CD image may turn up to be more than 700MB after we add our stuff. So some sacrificing of other useless contents might be needed after we add our packages.
  • There are tricks to pack everything back. They all will be explained below in their respective order.


This part is by far the easiest. Once you have downloaded the original iso file with the Ubuntu desktop CD, mount it:

mount ubuntu-8.04-desktop-i386.iso mnt -o loop

assuming that you have an empty directory mnt and the iso file in your working directory. Then copy everything into another directory using rsync:

rsync --exclude=/casper/filesystem.squashfs -a mnt/ iso

This will create the directory called iso with the contents of the CD, except for the largest file /casper/filesystem.squashfs that holds the whole target filesystem. Next we unpack the target filesystem from that huge file. First we will mount it using another empty directory mnt_sq:

mount mnt/casper/filesystem.squashfs mnt_sq -o loop -t squashfs

And then we rsync from it to a new directory:

rsync -a mnt_sq/ squash

This should create the directory squash with the contents of the target filesystem. Now that we are done with the mounted images, we may unmount them:

umount mnt_sq
umount mnt

At this point you should have the directory iso with all the contents on the CD needed for booting the Ubuntu system, and the directory squash with the system itself.

Adding our packages

For the sake of simplicity, let's assume that you have collected all the packages you want to add in a separate directory new/debs relative to your working directory. That is, there's new dir with the subdir debs where all the deb packages are collected. Let's copy all these packages onto the target filesystem (any place will do for now, but I chose /root):

cp new/debs/* squash/root/

Then we will prepare chroot environment like so:

mount -t proc proc squash/proc
mount -t sysfs sysfs squash/sys

and then we will "change root" (chroot) to that target filesystem and install packages.

chroot squash dpkg -i /root/gramps_3.0.1-1_all.deb

Changing root means we will see only the target filesystem as if we were trully running it it and it were our root filesystem. So the above command changes root to squash and then runs dpkg -i /root/gramps_3.0.1-1_all.deb command to install GRAMPS. You will need to repeat that line for every package you want to install. After you are done, remove the debs from the /root of the target:

rm squash/root/*.deb

If you'd like to modify the desktop look, set up custom launchers for the user and the like, you would need to copy all this stuff into /etc/skel of the target. This is because no user accounts exist yet, and there is no way to modify the home directories. But the /etc/skel gets copied into the new home directory of every new user.

for fl in `ls -A new/home`; do 
    cp -R new/home/$fl squash/etc/skel

The thing is, some of that contents may be files and some are directories like .gramps which will need to copy recursively.