How to Run ISO Files Directly From the HDD with GRUB2

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


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

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


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.


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

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

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.


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


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.


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

Attila Orosz 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.


  1. There are two errors in the first command you provide, to edit “/etc/grub.d40-custom.” It’s missing a slash and it should have an underscore rather than a dash: “/etc/grub.d/40_custom.”

    Right after that, you give “set isofile=”/home/maketecheasier/TempISOs/kubuntu-15.04-desktop-amd64.iso”” as an example of the path to a bootable ISO. That obviously does not explain how to use the 40_custom file on a dual-boot setup, which I have (as do most Linux users, according to what I’ve read).

    Since this is a fairly arcane subject, I can only try a series of guesses as to the path to the ISO when Grub is installed on the MBR of a Windows disk and the ISO is on a Linux partition. I gave up reading the article at that point.

    1. Well, it seems you gave up reading too early then. :)

      The very next line contains the solution, where you need to set up hd(x,y), which will specify the partition we are talking about.

      The path is what you use as an absolutre oath for your ISO on the given partition if you want to access it from e.g. the terminal (logged in), the partition is… Well, the partition where the file is… Not sure how to make this easier.

      See if you are not familiar with unix-like absolute paths, or not sure what grub is, or how partitions are named and numberd in Linux, it is probably safest not to go to where the ‘arcane’ lives. Unfortunately the article’s scope was limited, and a full tutorial could not be provided. I’d suggest you read up on partitioning, there is very good stuff online on how grub works and what it does and you can find info on absolute paths too.

      While of course I tried to make it easy to follow, such ‘arcane’ subjects will unfortunately require at least some familiarity with the concepts they talk about. Anyway, reading through the whole article first often leads to more results than complaining in comments. :)

      As for the typo: Thanks for spotting that, I’ll try to have it fixed.

Comments are closed.