How to Run ISO Files Directly From the HDD with GRUB2

Most Linux distros offer a live environment, which you can boot up from a USB drive, for you to test the system without installing. You can either use it to evaluate the distro or as a disposable OS. While it is easy to copy these onto a USB disk, in certain cases one might want to run the same ISO image often or run different ones regularly. GRUB 2 can be configured so that you do not need to burn the ISOs to disk or use a USB drive, but need to run a live environment directly form the boot menu.

Obtaining and checking bootable ISO images

To obtain an ISO image, you should usually visit the website of the desired distribution and download any image that is compatible with your setup. If the image can be started from a USB, it should be able to start from the GRUB menu as well.

Once the image has finished downloading, you should check its integrity by running a simple md5 check on it. This will output a long combination of numbers and alphanumeric characters

rundirectiso-md5

which you can compare against the MD5 checksum provided on the download page. The two should be identical.

Setting up GRUB 2

ISO images contain full systems. All you need to do is direct GRUB2 to the appropriate file, and tell it where it can find the kernel and the initramdisk or initram filesystem (depending on which one your distribution uses).

In this example, a Kubuntu 15.04 live environment will be set up to run on an Ubuntu 14.04 box as a Grub menu item. It should work for most newer Ubuntu-based systems and derivatives.

In this example the file kubuntu-15.04-desktop-amd64.iso

lives in /home/maketecheasier/TempISOs/ on /dev/sda1.

To make GRUB2 look for it in the right place, you need to edit the

/etc/grub.d/40_custom

file which allows you to add your own menu entries. The file should already exist and contain a few lines.

rundirectiso-40-custom-empty

To start Kubuntu from the above location, add the following code (after adjusting it to your needs) below the commented section, without modifying the original content.

menuentry "Kubuntu 15.04 ISO" {
set isofile="/home/maketecheasier/TempISOs/kubuntu-15.04-desktop-amd64.iso"
loopback loop (hd0,1)$isofile
echo "Starting $isofile..."
linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=${isofile} quiet splash
initrd (loop)/casper/initrd.lz
}

rundirectiso-40-custom-new

Breaking down the above code

First set up a variable named $menuentry. This is where the ISO file is located. If you want to change to a different ISO, you need to change the bit where it says set isofile="/path/to/file/name-of-iso-file-.iso".

The next line is where you specify the loopback device; you also need to give it the right partition number. This is the bit where it says

loopback loop (hd0,1)$isofile

Note the hd0,1 bit; it is important. This means first HDD, first partition (/dev/sda1).

GRUB’s naming here is slightly confusing. For HDDs, it starts counting from “0”, making the first HDD #0, the second one #1, the third one #2, etc. However, for partitions, it will start counting from 1. First partition is #1, second is #2, etc. There might be a good reason for this but not necessarily a sane one (UX-wise it is a disaster, to be sure)..

This makes fist disk, first partition, which in Linux would usually look something like /dev/sda1 become hd0,1 in GRUB2. The second disk, third partition would be hd1,3, and so on.

The next important line is

linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=${isofile} quiet splash

It will load the kernel image. On newer Ubuntu Live CDs, this would be in the /casper directory and called vmlinuz.efi. If you use a different system, your kernel might be missing the .efi extension or be located somewhere else entirely (You can easily check this by opening the ISO file with an archive manager and looking inside /casper.). The last options, quiet splash, would be your regular GRUB options, if you care to change them.

Finally

initrd (loop)/casper/initrd.lz

will load initrd, which is responsible to load a RAMDisk into memory for bootup.

Booting into your live system

To make it all work, you will only need to update GRUB2

sudo update-grub

rundirectiso-updare-grub

When you reboot your system, you should be presented with a new GRUB entry which will allow you to load into the ISO image you’ve just set up.

rundirectiso-grub-menu

Selecting the new entry should boot you into the live environment, just like booting from a DVD or USB would.

Subscribe to our newsletter!

Our latest tutorials delivered straight to your inbox

Attila Orosz

Attila is a writer, blogger and author with a background in IT management. Using GNU/Linux systems both personally and professionally, his advice stems from 10+ years of hands on experience. In his free time he also runs the popular Meditation for Beginners blog.