WORK in progress…
==> this tutorial is a draft and should be improved
==> Feel free to test, edit and improve the content
Difficulty: ★★★☆☆
This tutorial is inspired by this one: [HowTo] Booting manjaro iso directly with grub
Introduction
In most cases, when you see a black screen, it is recommended to start a Manjaro installation media aka “live session”. But it can be that there is no USB stick and you just want to continue working. This setup should solve the following problems:
- No flash drive is available.
- ISO Images or Squash Images of any kind can be booted.
- TODO Start an initramfs that detects and fixes common problems via chroot.
How it works
The idea is nothing new, but is also used for bootable USB sticks. There is one installation of Grub for (U)EFI and one BIOS/CSM, which are independent of each other.
In case the UEFI installation does not start, you can start the BIOS installation and thus start a repair routine.
Of course, you can choose only UEFI or only CSM, but here you would have both options.
Another partition will then hold ISO images, squash images or an initramfs image. This is used by Grub as root and then boots the respective medium that was entered in the Grub configuration file.
If you choose UEFI only or BIOS/CSM only, then the additional partition for the images can be omitted.
In any case, the Manjaro boot loader remains untouched and will boot without further ado. An exception would be a pure BIOS Setup, which several Bootloader per non removable disk are not possible and the case is not supported.
Of course, problems can usually be solved with the help of the built-in rescue mode and this is true in most cases, but the terminal jargon is not for everyone where this system is supposed to support.
- A new installation can be made without having to have a USB stick at hand.
- A CHROOT can be performed to solve problems, but at the same time one does not have to do without a graphical environment.
- What should be the ultimate goal is to boot a custom image that does not boot into the command line, but opens a graphical menu that opens the possibility to solve problems in a user-friendly way. It should do that in general:
- Scan for problems
- Make possible problems visible
- Give the user the possibility to solve the problem with one click
- Save the process for further investigation if it fails
- Optional: open terminal for manual repair
- Optional: backup tool (cloning, snapshots, rsync)
Requirements
- The drive must have a GPT (GUID Partition Table)
- Manjaro must boot in EFI mode and optionally CSM could be used also.
Preparation
We need 4 partitions
- Partition for the grub image
- Size → 8MB
- Filesystem → none/non-formatted/deleted
- Name →
grub_bios
- Label → none
- Flag →
grub_bios
- Partition for EFI boot
- Size → 50MB
- Filesystem → FAT16/32
- Name →
EFI_RECOVER
- Label →
EFI_RECOVER
- Flag →
boot
- Partition for CSM/BIOS boot
- Size → 50 MB
- Filesystem → EXT2
- Name →
CSM_RECOVER
- Label →
CSM_RECOVER
- Flag → legacy_boot
- Partition for the ISOs etc…
- Size → 5GB (and/or more)
- Filesystem → EXT2 (but it can be any filesystem which grub can read)
- Name →
ISO_RECOVER
- Label →
ISO_RECOVER
- Flag → none
You should create this in the GUI of parted: gparted
or kparted
.
Name → Partition Name | Label → Filesystem Label
You may ask: “Why ext2 and not ext4?”. Because the extra features in ext3/4 are not needed for this use case on such small partition. You can upgrade ext2 anytime to ext3 or ext4, but no downgrading.
Now we create mountpoints and add them to fstab:
sudo mkdir -pv /recovery/{efi,csm,iso}
File: /etc/fstab
# RECOVERY SETUP
LABEL=EFI_RECOVER /recovery/efi vfat rw,relatime,fmask=0000,dmask=0000,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro,noauto,x-systemd.automount 0 2
LABEL=CSM_RECOVER /recovery/csm ext2 defaults,noatime,noauto,x-systemd.automount 0 2
LABEL=ISO_RECOVER /recovery/iso ext2 defaults,noatime,noauto,x-systemd.automount 0 2
sudo mount -v -L EFI_RECOVER
sudo mount -v -L CSM_RECOVER
sudo mount -v -L ISO_RECOVER
If everything worked as expected, then lsblk -f
should display something similar to this:
$ lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1
├─sda2 vfat FAT32 EFI_RECOVER E2BD-CDE3 36,7M 25% /recovery/efi
├─sda3 ext2 1.0 CSM_RECOVER 5465bf5d-eaa1-4dd7-9b0d-9eef184edae9 31,9M 25% /recovery/csm
├─sda4 ext2 1.0 ISO_RECOVER 5b344de2-9ea4-45bc-8e70-694c1e5f48e7 3,2G 62% /recovery/iso
Install grub for EFI and CSM
We need to install it separately.
EFI
sudo grub-install --target=x86_64-efi --recheck --removable \
--bootloader-id=Recovery \
--efi-directory=/recovery/efi \
--boot-directory=/recovery/efi/boot
CSM
sudo grub-install --target=i386-pc --recheck --removable \
--boot-directory=/recovery/csm/boot \
/dev/sda
Change the permission
sudo chmod -Rv 777 /recovery/csm
sudo chmod -Rv 777 /recovery/iso
Create the Menu
Since these grub installations are independent, we need to create the grub.cfg by hand. grub-update
will not work.
Create keyboard layout of your language
sudo grub-kbdcomp de --output /recovery/efi/boot/grub/de.gkb
sudo grub-kbdcomp de --output /recovery/csm/boot/grub/de.gkb
Replace de
with your language. Available symbols are extracted from here: /usr/share/X11/xkb/symbols/
Not all Symbols can be used, therefore it will reject symbols, which cannot be used in the layout file. It is limited ot ASCII, but the keys will be then on the correct place.
EFI
File: /recovery/efi/boot/grub/grub.cfg
insmod part_gpt
insmod ext2
# Load Keyboard Layout
insmod keylayouts
keymap /boot/grub/de.gkb
terminal_input at_keyboard
# Load EFI video drivers. This device is EFI so keep the
# video mode while booting the linux kernel.
insmod efi_gop
insmod font
if loadfont ${prefix}/fonts/unicode.pf2
then
insmod gfxterm
set gfxmode=auto
set gfxpayload=keep
terminal_output gfxterm
fi
menuentry "Manjaro ISO" {
set isofile="/manjaro.iso"
set label="ISO_RECOVER"
set dri="free"
set lang="de_DE"
set keytable="de"
set timezone="Europe/Berlin"
search --no-floppy --label --set=root $label
set pqr="/dev/disk/by-label/$label"
loopback loop $isofile
linux (loop)/boot/vmlinuz-x86_64 img_dev=$pqr img_loop=$isofile driver=$dri tz=$timezone lang=$lang keytable=$keytable
initrd (loop)/boot/intel_ucode.img (loop)/boot/amd_ucode.img (loop)/boot/initramfs-x86_64.img
}
CSM
File: /recovery/csm/boot/grub/grub.cfg
insmod part_gpt
insmod ext2
# Load Keyboard Layout
insmod keylayouts
keymap /boot/grub/de.gkb
terminal_input at_keyboard
menuentry "Manjaro ISO" {
set isofile="/manjaro.iso"
set label="ISO_RECOVER"
set dri="free"
set lang="de_DE"
set keytable="de"
set timezone="Europe/Berlin"
search --no-floppy --label --set=root $label
set pqr="/dev/disk/by-label/$label"
loopback loop $isofile
linux (loop)/boot/vmlinuz-x86_64 img_dev=$pqr img_loop=$isofile driver=$dri tz=$timezone lang=$lang keytable=$keytable
initrd (loop)/boot/intel_ucode.img (loop)/boot/amd_ucode.img (loop)/boot/initramfs-x86_64.img
}
Test it
When everything is set correctly, you can test it.
- Copy the
manjaro.iso
to/recovery/iso
- Look up the Hex Number of Recovery:
efibootmgr
- Set the number for the next boot:
sudo efibootmgr -n 0001
- Reboot now:
reboot
TODO
- At this point it is also possible to create an initramfs, which includes essential tools to manage broken installations automatically. That is one thing I looking to achieve.
- Add more example Menu entries.
- Add an introduction describing how the setup will work.
- …