How to boot from iso file using GRUB & internal HDD (without external USB/CD)
Tags: linux, grub, iso, boot
Published: 2022-08-06 19:15:00

I just received my new System76's Lemp11 pro, and even though I love Pop!_OS I prefer to use Arch (btw), but… I didn't have an external USB drive that will use me as installation media, so…

## Creating Partition
I have two internal hard drives and I'm going to shrink my secondary one to allocate more space for a new partition, you can skip this step in case you have some available memory.

Open Disks, and resize your partition
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m7dqq2ftpdlh1aqgfft8.png)
 

I Choose to leave 32GB my internal partition

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/58moc7zysj9ccsv0pyb5.png)

in the free space create a new `ext4` and name it as you want :)

## Copying the ISO files
step one, copy the iso files to the new disk that you just created. 
step two, None.

## Preparing the data
in the next and last step, we will need to configure our grub, and for this, we will need to collect a few pieces of data:

1. your .iso file hdd number:
you can run `lsblk | grep disk` to list your hard drives:

> `/dev/hda` refers to the first IDE hard drive
> `/dev/sda` refers to the first SCSI or SATA hard drive.
>  If you use a NMVe SSD, it might be named as `/dev/nvme0n1`, `/dev/nvme1n1` and so on.
> But in GRUB, the first hard drive is always referred to as hd0, no matter what the interface type is

2. your .iso file partition number:
you can run the following command `sudo parted -l`  and locate your iso's files partition number

3. your setup's .efi files
browse trough your .iso files (you can do it by mount your iso or open it an archive manager), and locate your desired linuz .efi file and image file
for example:
Ubuntu setup: 
 `/casper/vmlinuz` and `/casper/initrd`
Arch setup
`/arch/boot/x86_64/vmlinuz-linux` and `/arch/boot/x86_64/initramfs-linux`

## Configuring GRUB

use your favorite text editor to add the following line to 

your custom configuration file:
`sudo vi /etc/grub.d/40_custom` 
(if the file doesn't exists `/etc/grub.d/40_custom` and 
update-grub executable install, please install grub-disk)

and add the following lines:

```
menuentry "{{menu entry name}}" {
  insmod ext2
  set isopartition=hd{{hdd number}},{{partition number}}
  set isofile="{{iso file path (relative to hdd)}}"
  loopback loop (hd{{hdd number}},{{partition number}})$isofile
  linux (loop){{iso's vm linuz efi file path}} img_dev=/dev/disk/by-uuid/$isouuid img_loop=$isofile
  initrd (loop){{iso's ram memory image file path}}
}
```

working example (Arch linux)

```
menuentry "archlinux-2022.07.01-x86_64.iso" {
  insmod ext2
  set isopartition=hd1,2
  set isofile="/iso/archlinux-2022.07.01-x86_64.iso"
  loopback loop (hd1,2)$isofile
  linux (loop)/arch/boot/x86_64/vmlinuz-linux img_dev=/dev/disk/by-uuid/$isouuid img_loop=$isofile
  initrd (loop)/arch/boot/x86_64/initramfs-linux.img
}
```

Ubuntu:

```
menuentry "ubuntu-20.04.2.0-desktop-amd64.iso" {
  insmod ext2
  set isofile="/iso/ubuntu-20.04.2.0-desktop-amd64.iso"
  loopback loop (hd1,2)$isofile
  linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet noeject noprompt splash
  initrd (loop)/casper/initrd
}
```

**menuentry:** your GRUB2 menu entry, name it as you like.
**insmod:** inserts a module. Since the ISO file is stored in ext4 partition he ext2 module is needed.
**set isofile**: Specify that path of your ISO image file
**loopback:** Mount the ISO file. hd0 means the first hard drive in the computer and 5 means the ISO file is stored on the 5th disk partition.
The linux command loads a Linux kernel from the specified path. casper/vmlinuz.efi is the linux kernel inside the Ubuntu ISO image.
**initrd**: initrd command loads an initial ramdisk from the specified path. It can only be used after the linux command has been run. The initial ramdisk is a minimal root file system mounted to the RAM. casper/initrd.lz is the initrd file inside the Ubuntu ISO image.

next all you need to do is to run the following command `sudo update-grub` and reboot. 

All done :)