How to Customize an Ubuntu Installation Disc – The Right Way (16.04 Compatible!)

If you’re like me, you’ve wanted to customize an Ubuntu install DVD for a long time – but all the tools/directions for doing it are out of date and/or broken. Look no further!

I have successfully customized an ISO of Xubuntu 14.04 for my project Builduntu but this guide should work for just about any flavor of Ubuntu, maybe even other Linux distributions. If you aren’t sure, give it a try! Mint and Debian are very similar and may work with minimal changes to the commands (ie, replace apt-get with whatever package manager the particular distro uses). It helps if the distro you want to customize is the same as what you are running currently, but is not necessary.

Note: Awesome contributor Mike made a script (see comments section) to automate this process, check it out here!


Let’s get to it.

First download the ISO you want to start customizing from Ubuntu’s release server. Remember where you save it, because you’re going to have to move it in a minute.

From here on out, it’s bash command line. Don’t worry, it’s the easiest way of doing this (for now). You don’t need to be a Linux guru, just pay close attention to the directions and it will work fine.

Make sure the prerequisite software is installed for unpacking and repacking the image. Open a terminal and run:

sudo apt-get install squashfs-tools genisoimage

Create a fresh folder to begin work. For the purposes of this guide, everything will be done from the starting point of the user’s home directory (indicated in Linux by a tilde “~”). Approximately 10 gigabytes total of free hard drive space is required for decompressing the ISO filesystem and repackaging it at the end.

mkdir ~/custom-img

Move the base ISO downloaded in the first step to the working directory. From here on out, replace “ubuntu.iso” with the name of the image downloaded from the Ubuntu Release server ex. trusty-desktop-amd64.iso

cp /path/to/saved/ubuntu.iso ~/custom-img
cd ~/custom-img

Next, extract the contents of disc image.

mkdir mnt
sudo mount -o loop ubuntu.iso mnt
mkdir extract
sudo rsync --exclude=/casper/filesystem.squashfs -a mnt/ extract

Here’s where things start to get interesting. Extract the filesystem with the following commands:

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

You’re going to need network access from within the chroot environment to download and install updated/new packages. Essentially what’s happening is you are going to “log in” to a command line instance of the Ubuntu installation, separate from the host system. Perhaps a confusing concept to wrap your head around at first, but it makes sense when you think about it. Copy resolv.conf from your system into the freshly unpacked fs.

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

Mount a few important working directories:

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

Now you are actually logged in to the installation instance as root. Neat. Before making changes, a few commands will make sure that everything goes smoothly while modifying packages.

export HOME=/root
export LC_ALL=C
dbus-uuidgen > /var/lib/dbus/machine-id
dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl

OK, now you can start playing around. This guide is only going to cover adding and removing software, but it’s possible to customize just about anything. Things like custom backgrounds and settings are already documented elsewhere, but be careful! Many of the directions are outdated and the commands may need slight alterations to work correctly. I had to piece this guide together from a few different sources with a whole lot of dead reckoning.

Start by removing the packages you don’t want. Be sure to use the “purge” command so that the system will automatically uninstall and delete the package, which optimizes the space required for the ISO. When you execute purge, read the list of programs to be removed before you select “Y” and make absolutely sure you haven’t accidentally flagged a core system package via association. You will recognize this because the list will contain significantly more packages than those you selected.

apt-get purge package1 package2 package3

I personally remove games, scanning utilities (I don’t have a scanner) and default text editors like abiword and mousepad (geany is the best). Stay away from core components unless you know what you are doing.

Since I am customizing a 64-bit Ubuntu image, I need multiarch (i386) support for some of the programming libraries. The following command is not necessary for everyone, but I recommend it anyway.

dpkg --add-architecture i386

Update the software repositories and upgrade the remaining packages on the system.

apt-get update && apt-get upgrade

Add packages to the system the usual way:

apt-get install package1 package2 package3

You are almost there! Time to clean up:

apt-get autoremove && apt-get autoclean
rm -rf /tmp/* ~/.bash_history
rm /var/lib/dbus/machine-id
rm /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl

Unmount the directories from the beginning of this guide:

umount /proc || umount -lf /proc
umount /sys
umount /dev/pts
sudo umount edit/dev

You have now “logged out” of the installation environment and are “back” on the host system. These final steps will actually produce the ISO. Other guides stop working at this point, but have no fear! The following commands have been tested and verified.

Generate a new file manifest:

sudo chmod +w extract/casper/filesystem.manifest

sudo chroot edit dpkg-query -W --showformat='${Package} ${Version}\n' | sudo tee extract/casper/filesystem.manifest

sudo cp extract/casper/filesystem.manifest extract/casper/filesystem.manifest-desktop

sudo sed -i '/ubiquity/d' extract/casper/filesystem.manifest-desktop

sudo sed -i '/casper/d' extract/casper/filesystem.manifest-desktop

Compress the filesystem:

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

Update filesystem size (needed by the installer):

printf $(sudo du -sx --block-size=1 edit | cut -f1) | sudo tee extract/casper/filesystem.size

Delete the old md5sum:

cd extract
sudo rm md5sum.txt

…and generate a fresh one:Β (single command, copy and paste in one piece)

find -type f -print0 | sudo xargs -0 md5sum | grep -v isolinux/ | sudo tee md5sum.txt

And finally, create the ISO. This is a single long command, be sure to copy and paste it in one piece and don’t forget the period at the end, it’s important:

sudo genisoimage -D -r -V "$IMAGE_NAME" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/ -no-emul-boot -boot-load-size 4 -boot-info-table -o ../name-of-your-custom-image.iso .

It takes a few minutes, but when that is done you will have a burnable/distributable ISO in your working directory (~/custom-img)

Have fun and good luck! Let me know how customizing works out for you!

If you appreciate my hard work, feel free to buy me a coconut water ( donate ). It will be greatly appreciated!

  82 comments for “How to Customize an Ubuntu Installation Disc – The Right Way (16.04 Compatible!)

  1. umi
    March 27, 2014 at 4:31 am

    Can this step be use on ubuntu server?

    • sylentprofet
      March 28, 2014 at 3:51 am

      Yes. Just change the name of the ubuntu.iso to match the image you download and it should be fine.

      • umi
        March 28, 2014 at 7:27 am

        but i cannot file the casper/filesystem.squashfs in ubuntu server iso. i only found it on ubuntu desktop. is in any chance i did miss something?

        • Alex
          January 25, 2017 at 4:05 am

          Ubuntu server does not have casper, so it’s a completely different process to customize that (although a lot easier), as there is no compressed filesystem on that iso.

          Loads of guides on the net for that, and they all work.

          • May 21, 2017 at 8:51 pm

            If you’re using the Ubuntu server, just replace all ./casper/ references with ./install/

  2. Techgs
    April 18, 2014 at 2:55 pm

    Lol… You deserver to be donated. Excellent work. Think of creating shell scrip or may be python script… Suggest some packages to be removed ( like thunderbird,sudoku, ) some packages to be added ( mc, cheese, chromium, jre, jdk )

    • May 21, 2017 at 8:52 pm

      No offense, but this article is basically a copy of Thanks for going into detail about each step though. πŸ™‚

      • May 23, 2017 at 4:58 am

        It’s close, but not quite. At least as of the time I originally wrote the article, the directions on the LiveCDCustomization wiki article didn’t work for me, or many other people based on the Google research I did at the time. I don’t recall precisely, but I vaguely remember having to re-write some of the snippets using tee instead of the method described in the wiki. Perhaps they’ve updated it since.

        Thanks for the tip with Ubuntu server!

        • Bridget
          June 19, 2018 at 3:41 pm

          There is something missing or incorrect in the last step when we create the ISO with genisoimage because the custom ISO doesn’t boot in UEFI (not sure about BIOS), whereas the original Ubuntu ISO does boot in UEFI mode.

  3. necat
    April 21, 2014 at 7:16 pm

    Please mak e ascript for it :/ any other projects: remastersys, uck has been discontinued. πŸ™

    • sylentprofet
      June 7, 2014 at 3:40 am

      Testing v0.1 now. Stay posted!

  4. Meral
    May 1, 2014 at 10:12 am

    Please make a script πŸ™

    • sylentprofet
      June 7, 2014 at 3:39 am

      I’m almost done with one. Just in final testing phases of v0.1

  5. Serhat
    May 4, 2014 at 2:43 pm


    First thanks for your sharing.

    I want to ask if these all operations will work under a Ubuntu Live (Not installed system). I can put 2 HDD (Ubuntu Live ISO USB and Empty at least 10 gb HDD) on my machine. Than I can generate my ISO, with live system by mounting 10 GB HDD as “custom-img” ?

    And I want to ask if there are project to generate Custom ISO? I research them for years but some of the project are discontinued, or they are alpha, or they are not deseign for Ubuntu (and it’s variants).

    reconstructor: they want money. even I can not try without paying.
    remastersys: discontinued
    Ubuntu Builder: discontinued
    relinux: it is beta, which also it is not updating since 2 years.
    mklivecd: is on the 0.0.1 version since 2002
    ubuntu-customization-kit: I could not install it on fresh install ubuntu. which is also not updating since 2 years.
    liveCD: on their official site they write that they are support Mandrakelinux PCLinuxOS

    • sylentprofet
      June 7, 2014 at 3:36 am

      To answer your first question, yes I think this may work under a Live System. As long as you aren’t building on the File System, which is limited to the amount of RAM you have available.

      I’m working on a script for customizing the ISO. It’s a bit different in bash than just typing the commands, but it should be ready for release soon.

    • ipkpjersi
      November 9, 2016 at 1:56 pm

      I modified and merged the commands together. I tested this and it made an ISO that worked fine for me:

      first sudo chmod 777 /home/yourusernamehere/ and copy the ubuntu image over to /home/yourusernamehere/, then run this from /home/yourusernamehere/:

      mkdir ~/custom-img
      cp ubuntu* ~/custom-img/
      cd ~/custom-img
      sudo apt-get install squashfs-tools genisoimage -y
      mkdir mnt
      sudo mount -o loop ~/custom-img/ubuntu*.iso mnt
      mkdir extract
      sudo rsync –exclude=/casper/filesystem.squashfs -a mnt/ extract
      sudo unsquashfs mnt/casper/filesystem.squashfs
      sudo mv squashfs-root edit
      sudo cp /etc/resolv.conf edit/etc/
      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
      export HOME=/root
      export LC_ALL=C
      dbus-uuidgen > /var/lib/dbus/machine-id
      dpkg-divert –local –rename –add /sbin/initctl
      ln -s /bin/true /sbin/initctl
      apt-get update && apt-get dist-upgrade -y && apt-get install zfsutils-linux -y && apt-get install openssh-server -y && apt-get install samba -y && update-grub && update-initramfs -u
      dpkg –add-architecture i386

      then once verified everything has installed (keep in mind as a side note, no sudo commands can be execited until we exit out of sudo chroot edit seen below before executing a sudo umount, that’s why we don’t sudo update-grub):

      apt-get autoremove && apt-get autoclean
      rm -rf /tmp/* ~/.bash_history
      rm /var/lib/dbus/machine-id
      rm /sbin/initctl
      dpkg-divert –rename –remove /sbin/initctl
      umount /proc || umount -lf /proc
      umount /sys
      umount /dev/pts
      sudo umount edit/dev

      then verify that sudo worked and did not give a sudoers error, if it did reboot then continue, if not just continue:

      cd ~/custom-img
      sudo chmod +w extract/casper/filesystem.manifest
      sudo chroot edit dpkg-query -W –showformat=’${Package} ${Version}n’ | sudo tee extract/casper/filesystem.manifest
      sudo cp extract/casper/filesystem.manifest extract/casper/filesystem.manifest-desktop
      sudo sed -i ‘/ubiquity/d’ extract/casper/filesystem.manifest-desktop
      sudo sed -i ‘/casper/d’ extract/casper/filesystem.manifest-desktop
      sudo mksquashfs edit extract/casper/filesystem.squashfs -b 1048576
      printf $(sudo du -sx –block-size=1 edit | cut -f1) | sudo tee extract/casper/filesystem.size
      cd extract
      sudo rm md5sum.txt
      find -type f -print0 | sudo xargs -0 md5sum | grep -v isolinux/ | sudo tee md5sum.txt
      sudo genisoimage -D -r -V “$IMAGE_NAME” -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/ -no-emul-boot -boot-load-size 4 -boot-info-table -o ../ubuntu-custom.iso .
      ls | grep hi

      P.S. Thanks OP, I will send a donation your way. πŸ˜€

  6. Michael
    May 14, 2014 at 12:17 pm

    how do you configure the target installation to use a proxy for the apt-get operations?

  7. SPV
    June 14, 2014 at 9:40 am

    mkisofs has been deprecated. instead replace it with genisoimage

  8. Bob
    August 12, 2014 at 4:45 pm

    I followed your directions and wow, great thanks. I have built a custom kernel image and while I am in the chroot env, I tried to install it. I was able to fix up the /etc/mtab file such that it has a rootfs, and then I did the dpkg -i custom-kernel-image.deb. It appears to install ok and in the edit directory I can see kernel installed. but when I use the iso image to install a machine, it it still on the generic kernel… and the directories dont have my new customer kernel. am I missing somthing?

  9. August 14, 2014 at 8:11 am

    It works with Ubuntu server 14.04. The only change that needs to be made for it to work is to change the ‘/casper/’ directory to ‘/install/’ when using this guide. Thank you for the guide. Funny enough it was way easier than getting remastersys or relinux to work. Keep up the good work. I am a python fan so would like to see that finished python script

  10. September 25, 2014 at 4:27 pm

    Is it possible to create my existing ubuntu 14.04’s image to install it other computers or this procedures only changes the new iso extracted from the image and recompressed as iso.

    • October 7, 2014 at 12:33 pm

      I’m not sure how well it works, but there is a program called Black Lab Imager that is a continuation of the remastersys project. The source code is free, but the team is asking for a one-time donation for access to a binary executable. Give it a try!

  11. David
    November 18, 2014 at 11:50 am

    Tried this on Ubuntu Server 14.10 iso. There were a LOT of dependency issues along the way that had to be resolved. I got them resolved, but then it throws me more troubles. Toward the end it didnt want to unmount anything. It kept saying it was busy. So I had to forcefully unmount the things.

    Creating the ISO itself went fine. After this I booted the ISO into a virtualbox and tried it. It started off going well. It booted up the Ubuntu installer as expected and went through the whole process. However, after reboot it freezes. It just wont boot into the system. I dont know why but something is obviously wrong.

    • November 21, 2014 at 8:21 am

      I’m gonna work on updating this guide for 14.10 soon. There may need to be some slight modifications to the commands.

      Were you building the ISO from inside of a 14.10 installation? Or were you trying to customize a 14.10 disc on a system with a 14.04 or earlier install? The main issue I can think of with dependencies etc would likely be caused by trying to customize a “newer” release from within an older host installation.

      Let me know if you have any luck! Like I said at the top of the post, some people are running into issues but others are able to get things working with a few minor changes to the commands.

      • David
        December 18, 2014 at 2:16 pm

        Well, I have a little free time to try and do this again so I am trying to work through it. The first error I am coming up to is where you have “dbus-uuidgen > /var/lib/dbus/machine-id”.

        when i put this in it states “no such file or directory”. when i type “dbus-uuidgen –help” it says “command not found”. i then go to a separate terminal and try “dbus-uuidgen –help” and it works fine. are the steps out of order for this? while in the “chroot edit/” terminal it just doesnt work.

        • David
          December 18, 2014 at 5:55 pm

          I proceed to go on past the “dbus-uuidgen” not working right. i figured it wouldnt affect much anyway.

          most everything else seems to have gone alright. unmount things seems buggy. everything complained it was busy with the commands given. so i added the “-lf” switch on all of them. i could not exit after that because then it said there where “stopped jobs”. so then i just closed the terminal to kill it.

          after that i opened a new terminal and changed directory over to ~/custom-img and continued on. generating the iso gave me no problems.

          installation gave me one minor error with the “select and install” portion. apparently it didnt like one of the packages. probably modemmanager in gnome since thats the only one in the whole process that gave me an issue. so your mileage may vary on this. after i went in manually and hit apply it continued the installation.

          the system seems to have installed everything i asked it to install which is good. i ran playonlinux with a game and it seemed to going good. so i am going to say that its working.

          started with Ubuntu 14.10 64bit desktop installed on virtualbox. used apt-get update and apt-get dist-upgrade to make sure the host system was fully updated. i used Ubuntu 14.10 64bit server to build the image since server is a minimal install and you dont have uninstall a billion things. you just go in and install everything you want on top of it.

    • Rick Galbraith
      May 17, 2016 at 12:45 pm

      Sounds like you need to find a point to restart the process and try again. What you created may be a coaster.

  12. A.S.
    February 1, 2015 at 7:36 am

    Hi there,
    I am looking for a way to replace the live session user with my preferred username and also to avoid direct boot to the live user. I’d rather prefer the lightdm greeter screen to pop up and allow me to insert my credentials.

    I have the squashfs filesystem extracted as we speak but cannot find any relevant information regarding how to alter those. See this question of mine for more details. Do you have any idea how I should tackle this matter?

    Thank you for your help!

    • February 4, 2015 at 10:41 pm

      My best recommendation would be to read through the Live CD customization documentation provided by Canonical. It’s not the most reliable or up-to-date, but you might be able to modify some of the commands to work for modern versions. Some of the structure hasn’t been valid for 4 or 5 years, so your mileage will vary. Good luck!

  13. Michael Gregg
    February 21, 2015 at 12:02 am

    That worked! Thanks!

    How do I edit the list of packages that get installed?

    • February 24, 2015 at 10:37 am

      Use apt-get just as the directions mentioned. The packages that are added/removed during this process will be mirrored to the installation system.

  14. David
    March 20, 2015 at 12:16 pm

    been playing around with this some more and just wanted to post about this step up top:
    “sudo mksquashfs edit extract/casper/filesystem.squashfs -b 1048576”

    i believe if it is changed slightly it compresses it more.
    “sudo mksquashfs edit extract/casper/filesystem.squashfs -comp xz -b 1M -Xdict-size 100%”

  15. Jesse Millwood
    August 12, 2015 at 12:54 pm

    Has anyone gotten this method to work with the ubuntu-mini-remix?

  16. August 28, 2015 at 3:57 am

    Would not having wireless driver on my computer affect the installation. When I start, it says package not found

    • August 29, 2015 at 9:53 pm

      Did you copy resolv.conf from your system to the mounted filesystem? That’s important for network access during the editing process.

  17. David
    April 12, 2016 at 6:49 pm

    16.04 compatible.
    I have built one up starting with the server iso.

  18. Bob
    April 28, 2016 at 7:18 pm

    This is a fantastic tutorial. I successfully made a custom Xubuntu CD with this (though it had a few bugs because of a botched Java installation; I will try again). I’m trying to use it to alter TAILS a little and am running into the following error:

    ~/custom-img/extract$ sudo unsquashfs mnt/casper/filesystem.squashfs
    Could not open mnt/casper/filesystem.squashfs, because No such file or directory

    • Bob
      April 28, 2016 at 7:38 pm

      I’m sorry for not specifying that the successful custom CD was Xubuntu 16.04 and the failed one was TAILS 2.3.

      • David
        April 30, 2016 at 6:46 pm

        looking up TAILS it looks like it is a Debian system. which as i recall is not even the same kind of directories or anything. you should be able to just look at the folders on the mounted ISO and determine if any of this is going to work.

        the directories you are obviously looking for as above:

        which if they are there then you look in them and see if they have the files you want.

  19. Jayaraj
    May 8, 2016 at 12:33 am

    During the installation it shows “failed to install grub-efi to /target/ the system will not boot”
    it’s okey when installing with internet, but i want to install it offline. can you please help me?
    THANK YOU VERY MUCH for this post.

  20. Ivan
    May 21, 2016 at 9:11 am

    Great! Excellent! First guide which really work’s! In one word, excellent! I’m thrilled! Thank You very, very much.

  21. May 26, 2016 at 2:14 pm

    always stuck at genisoimage. can’t make iso. how to solve this? thanks.

    • May 26, 2016 at 5:04 pm

      Can you provide some error output? It’s hard to help without knowing more about the situation.. It is likely you’re either missing the genisoimage package, or typing the command incorrectly.

  22. Andy
    June 8, 2016 at 9:34 am

    Thanks for this script – looks very good with the current version of ubuntu-mini-remix-16.04-amd64.iso.
    There are no error while creating. ISO starts with VMWare Fusion – no problem –
    But if I do create a DVD or a USB stick from this iso – it doesn’t start up. BIOS settings for boot are set properly.
    Any idea ?

    • David
      June 21, 2016 at 8:41 am

      that sounds more like boot disc creator issue than anything else. granted i have ran into those problems before which i have found it to be either the USB creator i was using or the burning program not acting right. its kind odd like that.

      also, make sure your USB is FAT32 formatted with a bootable flag. sometimes those things, especially the large ones, can end up NTFS or exFAT formatted which doesnt always work. the USB creators also dont all format the drives. some just put the files on the disk.

      at least the good thing about USB is you dont waste a lot of disks trying to make it work. right?

  23. Thomas Stanton
    August 15, 2016 at 8:07 am

    Thank you, we found this very helpful, keep up the great work.

  24. Nicholas Estrada
    September 12, 2016 at 9:13 am

    How does one add software from a non-default repository to the install disk? I keep trying to add a repo with wget and it says host (my localhost name) could not be found.

  25. September 16, 2016 at 10:41 am

    Consider also the Ubuntu Customization Kit.

    • September 19, 2016 at 8:21 am

      I have tried many of the various tools available, including UCK. However, that specific app has not been updated since Ubuntu 13.10

      It might work for older distributions, but for anything above 14.04 it never produced a viable image for me, hence the guide here.

      Thanks for the suggestion!

  26. October 21, 2016 at 12:09 pm

    Thank you, perfect for providing custom live systems! πŸ˜‰

  27. tuxintuxedo
    November 5, 2016 at 2:10 pm

    Hello. Thank you for the guide.
    My only problem is, that I cannot make the new ISO work with an updated kernel. Only kernels which are in the original repositories work, I always get kernel error when booting if I try a kernel from kernel-ppa/mainline. Any ideas?

    • David
      November 28, 2016 at 8:43 am

      That sounds kinda odd tbh. I have a 16.04 image and it comes with something like kernel 4.2 i think. I always update the kernel to the newest “STABLE” release from the mainline repository though. It has never failed me either.

      -make sure you are downloading all of the correct files. (ex. all low-latency or all generic and with the correct format 32bit/64bit)

      -when you go to install them there should be 3 files. (ex. “linux-headers…all.deb”, “linux-headers…amd64.deb”, and “linux-image…amd64.deb”) To install go to their folder and do “dpkg -i linux-headers*” followed by “dpkg -i linux-image*”

  28. Dave
    January 30, 2017 at 12:36 am

    Doesn’t seem to work with elementary -loki which is based on 16.04
    Everything is fine except once I start using apt I get a bunch of permission errors that keeps me from being able to install anything. fchmod operation not permitted in the apt/partials temporary file. I tried to to chmod -R 777 the apt directories… nada… any ideas??

    • Dave
      January 30, 2017 at 3:23 am

      ahhhh weird… everything worked if I sudo -i and run all commands from the /root which is where you land anyway. sudo works this way btw

  29. March 13, 2017 at 2:36 am

    Here’s my automated build (using Gitlab CI) of your great article:

    I’m using it for PXE only…creating an ISO is documented in README.

  30. Jehonan
    April 4, 2017 at 9:18 am

    This is excellent! Man can learn so much from this step by step building process. In fact, it’s great to know which command does what, how and why! My only error in which i have stumbled during building process is that after successful build installed system can’t see audio card. Only “Dummy output” is reported! Is somebody having same issue and what is solution, if You know?!

  31. Mat
    April 12, 2017 at 12:43 pm

    It looks like there is an error in the the line “dpkg-query -W –showformat=’${Package} ${Version}\n'” under “Generate new Manifest file”.

    dpkg-query -W –showformat=’${Package} ${Version}n’ echoes all of the installed packages, separated by an ‘n’ on one single line.

    I’m assuming it should be ‘\n’ instead of just ‘n’ so that it outputs all the installed packages, with each package on a new line.

    • April 12, 2017 at 12:46 pm

      Made the change, thanks for the heads up!

  32. dipper
    April 28, 2017 at 1:58 pm

    I was trying to use your guide to create a custom spin of a Ubuntu derivative called GalliumOS. It all work fine until I try to generate the ISO via genisoimage. It fails with an error saying “oh uh, I can’t find the boot image ‘isolinux.bin'”. I’ve followed the commands exactly, but every time I get stuck at this same part. Any ideas on what I’m doing wrong?

  33. Thom Yorke
    May 4, 2017 at 11:28 pm

    Any idea how how to make the finished product be able to be turned into a USB stick for installation? When creating a USB in a few programs and using ‘dd’ the disk does not boot. It does however boot in a virtual machine and installs.

    • Mike
      July 6, 2017 at 6:45 pm

      Hi Thom,

      I had the same exact problem. I put together a script, based on this post, and others, to get my/our desired result.

      Comments in the script hopefully explain why I did what I did. πŸ™‚


      — Mike

  34. tony
    May 22, 2017 at 8:33 am

    It worked for me on Ubuntu 16.04.2 LTS desktop. But I still hava a problem.
    The password of the live session user is needed when I boot up with customized ubuntu. I tried passwords with blank, ubuntu… Nothing works. Did you have the same problem when processing ubuntu 14.04 ?

  35. Mike
    July 6, 2017 at 6:42 pm

    I had the same exact problem as Thom Yorke (May 4, 2017) .

    FWIW, my source ISO image is ubuntu-mate-16.04.2-desktop-amd64.iso. I am able to ‘dd’ that to a USB stick and boot/install as expected. After processing that ISO according to this procedure, and incorporating a few other improvements gleaned from ipkpjersi’s (November 9, 2016) script, above, I created the script posted over here to save myself a ton of typing as I beat my head against the main issue:

    For some reason, makeisofs would not properly create a bootable EFI partition on USB media. VirtualBox, however, booted just fine from the resulting .iso according to this blog post.

    Ultimately, I had to give up on genisoimage because I found via that xorriso actually works for creating a USB-bootale EFI partition, after a dd of isohdpfx.bin out of the origin .iso distribution.

    I created a script, and posted it here if anyone would like to take it for a spin.

    • July 7, 2017 at 9:21 am

      Awesome, Mike! Thanks for the info. I’ve been super busy at work and haven’t had much time to keep up with new posts. The script looks perfect.

      Would it be ok for me to add the script to the original post and credit you? I’m sure a ton of readers would find it handy. This post has overtaken my guides for Android build environments elsewhere in the blog in terms of popularity for the past few months.


      • Mike
        July 7, 2017 at 3:06 pm

        Hi Nathan,

        Certainly! I’ve pasted it to a more permanent location, so please use this link instead.


        — Mike

  36. Leo
    August 27, 2017 at 2:23 am

    That sounds very interesting!

    My problem is this

    so I’m wondering if it’s possible to change the graphic driver?


  37. umt
    November 7, 2017 at 10:50 pm

    Hi , I am trying to create a customized ubuntu server iso with mkisofs. I want to install a package CM during the installation. I added following command to the preseed file “d-i pkgsel/include string CM” and I copied the package to ./pool/extras and I get the Unable to locate error during the installation. Could you help me understand why I am getting this error even though the package exists ?
    I followed the steps on

  38. Tejas
    November 15, 2017 at 7:01 am

    Hi Nathan,

    Great work!
    I am successfully able to create the image with your instruction. Thank you for sharing it.

  39. roxma
    November 26, 2017 at 11:54 pm

    I’m wondering, why remove isolinux/ in md5sum.txt?

    ` | grep -v isolinux/ |`

  40. Gene
    November 29, 2017 at 1:20 am

    Excellent guide, thank you so much! I have one question. Tried this on 16.04.3 server and after doing apt-get update && apt-get upgrade and trying to install iso installer reported following error Any ideas how can I fix it?

  41. December 21, 2017 at 2:38 pm

    Woow that was strange. I ust wroite an very lonmg comment but after I clicked submit my comment didn’t appear.
    Grrrr… well I’m nnot writing all that over again. Anyways,
    just wanted to say wonderful blog!

  42. Tanphat310
    May 17, 2018 at 12:45 am

    I have been install a fresh application, but after burn into new iso and boot into that iso. It have not my application.
    Please, help me!

  43. husnu
    June 10, 2018 at 5:42 am

    Hi, I’m working on ubuntu server 16.04. And everything is well until I try to install the custom image in virtualbox. The error message i have got is that “Select and Install software: Installation step failed” during the installation processes. I have just skipped that installation phase and continued with grup installation. And After restart it is just looping in the login screen. I’m entering username and password and It displays the login screen again and again. Btw, I sure about that I’m using right username and password.

  44. gms
    June 25, 2018 at 11:38 am

    Great guide.
    I purged libreoffice* and installation has problem,, seems still try to install libreoffice

  45. January 1, 2019 at 2:58 am

    God bless you man!
    Also worked on Ubuntu 18.04! It is a year I am searching for a straight forward approach for doing this and here it is!

  46. March 1, 2019 at 3:18 pm

    There’s a project called FAI which can also create customzied installation ISO images for Debian and Ubuntu

  47. jack zhang
    March 28, 2019 at 3:12 am

    I: -input-charset not specified, using utf-8 (detected in locale settings)
    genisoimage: Uh oh, I cant find the boot catalog directory ‘isolinux’!
    I: -input-charset not specified, using utf-8 (detected in locale settings)
    genisoimage: Missing pathspec.
    Usage: genisoimage [options] -o file directory …

    Use genisoimage -help
    to get a list of valid options.

    Report problems to

  48. doublenine
    May 28, 2019 at 7:27 pm

    Everything worked out perfectly, theres just one non fatal error if I try to use the check errors on disk feature of the iso. It will say there are errors on two files. It will say this even if I only extract and compress the iso again without modifying anything. Doing this with ubuntu 18.04 by the way.

  49. mike g
    November 29, 2019 at 3:34 pm

    Very good article,
    If I want to add something to boot command like modprobe.blacklist=nouveau
    what is the way to do it


  50. Joe
    February 5, 2020 at 8:27 am

    Systemback is still working in Xubuntu 19.04, and it makes a live-usb in 2 partitions, which can be resized to recover the remain usb storage space into a new partition so you have a custom live-os which is completely frozen stable and dynamic storage for other files.

    With Xubuntu and Systemback, I have learned to hack it enough to customize the wallpaper, apps, most of the configs, plymouth splash screens, and the EFI and legacy Grub themes to make an impressive live-usb including wine apps and bells and whistles. I consider the live-installer to be broken because it won’t setup the partitions and grub auto-magically.

    In the future, it would be helpful to look into the C++ sources of Systemback to understand the commands that it runs, and that could be added to this excellent guide you have here, or even made into a Python/Tkinter script for continued use. Systemback and its forks are not being developed and its just lucky that it works for now.

    Thanks very much to the O.P. and commenters for sharing the knowledge you’ve acquired. The world needs more people like you.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.