How to boot from ISO file stored on hard disk

bootableisosystem-installation

I know that I can create/burn bootable CD/DVD or live USB and can boot/install from it. But suppose I am currently running GNU/Linux and I've ISO file of another GNU/Linux that I want to install on my hard disk, then Can I directly boot from ISO from hard disk and try/install that GNU/Linux operating system?

Best Answer

Yes, you can accomplish this by adding a menu entry to the GRUB boot loader menu.

You can add a custom GRUB menu entry by editing /etc/grub.d/40_custom,

Example of custom menuentry:

 exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.  

menuentry "Trisquel ISO" {
        set isofile="/Operating_Systems/Trisquel_7.0_i686/trisquel_7.0_i686.iso"
        loopback loop (hd0,5)$isofile
        linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash
        initrd (loop)/casper/initrd
}

Instruction & Explanation:

  1. The command set is used for storing the path of the ISO file into a variable, here isofile.

  2. loopback is used to make a device from a file system image. In order to do that, it is necessary to specify the device and image file. Here we used (hd0,5)$isofile in which (hd0,5) represents the fifth partition of the disk.

    • Points to note: In (hd0,5) ,
      1st digit represents the device number which starts from 0 (here : 0 = 1st device) and
      2nd digit represents the partition number which starts from 1 (here 5 = 5th partition).
      That means /dev/sda5
    • And variable $isofile has the path of the ISO file. So, finally it becomes (hd0,5)/Operating_Systems/Trisquel_7.0_i686/trisquel_7.0_i686.iso.
    • For more information, visit : How to specify devices and files.

  3. linux command is used to load Linux kernel (vmlinuz) from file. Put the path of Linux kernel in the ISO.

    • Read/extract the content of ISO to get the path of kernel example:

       $ 7z l trisquel_7.0_i686.iso | grep vmlinu
       2014-10-29 21:41:43 .....      5841680      5841680  casper/vmlinuz
       2014-11-03 00:45:09 .....      5844176      5844176  casper/vmlinuz.netinst
      

      so, /casper/vmlinuz was used here.

  4. initrd command is used to load an initial ramdisk for a Linux kernel image, and set the appropriate parameters in the Linux setup area in memory.

    • initrd is a scheme for loading a temporary root file system into memory. Put the path of initrd in the ISO.
    • Read/extract the content of ISO to get the path of initrd:

      $ 7z l trisquel_7.0_i686.iso | grep initrd
      2014-11-03 00:45:19 .....     16851900     16851900  casper/initrd
      2014-11-03 00:45:09 .....      9398592      9398592  casper/initrd.netinst
      
  5. The additional parameter such as boot=casper iso-scan/filename=$isofile noprompt noeject may be specific to a GNU/Linux distribution and vary for another family of Linux. You can find some configurations for different family/distribution from here.

    Note: Some distributions use initrd.gz or initrd.lz depending upon the algorithm/compression used.

After editing /etc/grub.d/40_custom, GRUB needs to be updated by update-grub2 command. Upon rebooting, you will find the custom menuentry you've added on the GRUB screen. And you may use the Live environment of a GNU/Linux distribution.

In order to perform installation from ISO, installer may need to unmount any mounted partitions; i.e. say another system is mounted at /isodevice, then you can umount -l /isodevice.

Related Question