Open Source Developers' Blog

Custom Live Ubuntu

September 14, 2018

This blog is about making a live CD/DVD from the main system on your hard drive. This is useful if you want to build a clean live CD, or if you want to build a minimal rescue CD. We used it to create a beginner-friendly wargame to introduce Linux to everyone. The theme was similar to that of Bandit with very elementary Linux commands and only 11 levels.

If interested, you can download the .iso from here and play

What is a Live CD/DVD?

A live CD/DVD (also live disc, or live operating system) is a complete bootable computer installation including operating system which runs directly from a CD-ROM or similar storage device into a computer’s memory, rather than loading from a hard disk drive. It allows users to run an operating system for any purpose without installing it or making any changes to the computer’s configuration. Live CDs can run on a computer without secondary storage, such as a hard disk drive, or with a corrupted hard disk drive or file system, allowing data recovery.

Live CD/DVD Structure

The directory tree of the live CD/DVD we are going to create is going to look like this:

|       |-------filesystem.${FORMAT}
|       |-------filesystem.manifest
|       |-------filesystem.manifest-desktop
|       |-------vmlinuz |
|       |--------+grub
|       |
|       |        |--------grub.cfg
|       |
  • /casper/filesystem.${FORMAT}: This is the container of the Linux filesystem we are going to copy from our hard disk. It is usually a compressed filesystem like squashfs.
  • /casper/filesystem.manifest: This file is optional. You only need it if you decide to include the Ubuntu installer in the CD. The purpose of this file will be explained later.
  • /casper/filesystem.manifest-desktop: This file is optional. You only need it if you decide to include the Ubuntu installer in the CD. The purpose of this file will be explained later.
  • /casper/vmlinuz: The Linux kernel. This is copied from the Linux filesystem.
  • /casper/initrd.img: the initramfs that contain the customizations necessary for the live CD/DVD.
  • /boot/grub/grub.cfg: File containing boot options for the live CD/DVD.
  • /boot/memtest86+: Optional file used to test the RAM of the machine from the live CD/DVD.
  • /md5sum.txt: Optional file containing checksums for all the files in the CD/DVD.

Outline of the Steps

  • Prepare our work Environment
  • Copy the source system to the target directory
  • chroot into the new system and make modifications
  • Prepare the CD directory structure
  • Build the CD/DVD

Preparing the Environment

  • Set some variables

    export WORK=~/work
    export CD=~/cd
    export FORMAT=squashfs
    export FS_DIR=casper

    The WORK Directory is where our temporary files and mount point will reside. The CD is the location of the CD tree. FORMAT is the filesystem type. We are going to use compressed squashfs. FS_DIR is the location of the actual filesystem image within the cd tree.

  • Create the CD and WORK Directory Structure
sudo mkdir -p ${CD}/{${FS_DIR},boot/grub} ${WORK}/rootfs
  • Install some packages on current system
sudo apt-get update
sudo apt-get install debootstrap zgrub2 xorriso squashfs-tools qemu

qemu is (optional). It is only needed for testing the CD before burning it. It can be substituted with any other virtualization software like VirtualBox.

Preparing your new filesystem

mkdir ${WORK}/rootfs
sudo debootstrap --include grub-pc,locales --arch amd64 bionic ${WORK}/rootfs

Here, debootstrap will download, extract and install the base system packages to our target directory. Debootstrap only fetches the base system without a kernel or bootloader, so we’ll use the --include option to fetch those too. If you need packages not found in the main repository, you can include packages from contrib and non-free with this option --components main, contrib, non-free

Usage: debootstrap --include <additional_packages,comma-separated> --arch <architecture> <release> <target> <mirror>

Next, we’ll enter the chroot environment for a moment to complete the second stage of the install.

    sudo chroot ${WORK}/rootfs /bin/bash
    debootstrap --second-stage
Preparing the chroot environment

Binding the virtual filesystems. Until your new install is booting on it’s own, we’ll borrow these from the host.

mount -o bind /dev /mnt/deboot/dev
mount -o bind /proc /mnt/deboot/proc
mount -o bind /sys /mnt/deboot/sys

We also need a working network to install necessary packages

sudo cp /etc/resolv.conf ${WORK}/rootfs/etc

Now let’s enter into the chroot system

sudo chroot ${WORK}/rootfs /bin/bash

Install packages essential for LIVE CD

apt-get install casper lupin-casper

Now let’s give your new install a name. If not, your new install won’t have a name, or inherit the name of the host you are installing from and also configure its locale

echo "<name-your-host>" > /etc/hostname
dpkg-reconfigure locales

Now let’s create a password for root and also add a user and finally update our system and exit

adduser <your-user-name>
apt-get update && apt-get upgrade

Now if you want to want to make something similar to the mini-war-game that we made, you can refer this link

Prepare the CD directory Structure

  • Copy the kernel, the updated initrd and memtest prepared in the chroot:

    export kversion=`cd ${WORK}/rootfs/boot && ls -1 vmlinuz-* | tail -1 | sed 's@vmlinuz-@@'`
    sudo cp -vp ${WORK}/rootfs/boot/vmlinuz-${kversion} ${CD}/${FS_DIR}/vmlinuz
    sudo cp -vp ${WORK}/rootfs/boot/initrd.img-${kversion} ${CD}/${FS_DIR}/initrd.img
    sudo cp -vp ${WORK}/rootfs/boot/memtest86+.bin ${CD}/boot
  • Unmount bind mounted dirs:

    sudo umount ${WORK}/rootfs/proc
    sudo umount ${WORK}/rootfs/sys
    sudo umount ${WORK}/rootfs/dev
  • Convert the directory tree into a squashfs:

    sudo mksquashfs ${WORK}/rootfs ${CD}/${FS_DIR}/filesystem.${FORMAT} -noappend

    Note: Make sure the resulting file size can fit into your live media.

  • Make filesystem.size

    echo -n $(sudo du -s --block-size=1 ${WORK}/rootfs | tail -1 | awk '{print $1}') | sudo tee ${CD}/${FS_DIR}/filesystem.size
  • Calculate MD5

    find ${CD} -type f -print0 | xargs -0 md5sum | sed "s@${CD}@.@" | grep -v md5sum.txt | sudo tee -a ${CD}/md5sum.txt
  • Make Grub the bootloader of the CD Make the grub.cfg
 sudo vim ${CD}/boot/grub/grub.cfg

Copy the following text into it and save it.

      set default="0"
      set timeout=10

      menuentry "Ubuntu" {
      linux /casper/vmlinuz boot=casper quiet splash
      initrd /casper/initrd.img

      menuentry "Ubuntu in safe mode" {
      linux /casper/vmlinuz boot=casper xforcevesa quiet splash
      initrd /casper/initrd.img

      menuentry "Ubuntu CLI" {
      linux /casper/vmlinuz boot=casper textonly quiet splash
      initrd /casper/initrd.img

      menuentry "Ubuntu GUI from RAM" {
      linux /casper/vmlinuz boot=casper toram quiet splash
      initrd /casper/initrd.img

      menuentry "Check Disk for Defects" {
      linux /casper/vmlinuz boot=casper integrity-check quiet splash
      initrd /casper/initrd.img

      menuentry "Memory Test" {
      linux16 /boot/memtest86+.bin

      menuentry "Boot from the first hard disk" {
      set root=(hd0)
      chainloader +1

Build the LIVE CD

Make the .iso file

    sudo grub-mkrescue -o ~/live-cd.iso ${CD}

Now it’s ready to be made bootable from any device.

Open Source Developers Community

Written by the folks at the Open Source Developers Community who live in and around JIIT, Noida, India.