Загрузочный ISO-образ/образ диска GRUB с раздела NTFS

Загрузочный ISO-образ/образ диска GRUB с раздела NTFS

Я пытаюсь загрузить ISO, содержащий Linux live system, с существующего раздела NTFS на ПК. ПК имеет UEFI, а жесткий диск разбит на разделы GPT, поэтому GRUB4DOS не вариант. Это вообще возможно сделать?

Я знаю, что этот вопрос уже задавался:Grub — загрузите iso-файл Debian с раздела ntfs и установите его, но там нет утвержденных ответов - поэтому я спрашиваю снова. Также я хотел бы использовать свое собственное ядро ​​вместо какого-то фиксированного и предварительно скомпилированного.

Из других ответов следует, что мне нужно будет включить какой-то настроенный файл ядра (я предполагаю, поместить его в раздел EFI), который затем сможет загрузить остальную часть ISO(?) из самой NTFS.

Это можно сделать уже на разделе FAT, просто выполнив запись GRUB

menuentry "Boot LINUX FROM ISO FILE" {
  set iso_path=/path_to/image_on_FAT_filesystem.iso
  loopback loop (hdX,msdosY)$iso_path
  linux (loop)/path_to/vmlinuz nomagic base_only norootcopy from=$iso_path
}

решение1

Итак, в качестве решения:

Предыстория: Я использую Arch Linux. Он используетmkinitcpioдля генерации его initramfs (и раннего пользовательского пространства(!)). Поскольку мы загружаем образ файловой системы из NTFS, нам нужно настроить initramfs. Мы можем использовать GRUB и его модуль ntfs для чтения (модуль ntfs GRUB — ro afaik.) ядра и initramfs из раздела NTFS. После этого нам все еще нужно смонтировать раздел NTFS из initramfs для полного доступа на чтение/запись.

Теория работы решения: Я добавил пакеты ntfs-3g и fusefs в initramfs, чтобы можно было смонтировать раздел NTFS. Я также создал новыйхук mkinitcpioкоторый должен быть загружен до фактического монтирующего хука. Хук — это простой скрипт оболочки, который получает параметры (они задаются как аргументы ядра из GRUB), например

menuentry "Boot LINUX FROM ISO FILE" {
  insmod ntfs
  set root='(hdX,Y)'
  linux /in_ntfs/vmlinuz-linux root=UUID=*GPT_UUID_OF_ROOTFS_ON_DISK_IMAGE* image_path=*path_to_disk_image_on_NTFS* image_hd=*GPT_UUID_OF_NTFS_DISK*
  initrd /in_ntfs/initrd.img
}
  1. Расположение образа диска внутри раздела NTFS (image_path)
  2. Раздел NTFS GPT GUID (image_hd)
  3. Если образ диска содержит несколько разделов, то UUID rootfs (корень)

Процедура загрузки с учетом монтирования дисков:

  1. Хук initcpio монтирует раздел NTFS
  2. Хук initcpio монтирует образ диска из раздела NTFS как петлевое устройство
  3. Теперь запускается обычный хук монтирования, ему назначается ext4 или любой другой раздел, содержащий Linux rootfs внутри образа диска, смонтированного на шаге 2.
  4. Система выходит из раннего пользовательского пространства; newroot устанавливается на раздел rootfs файла образа, смонтированного в NTFS-loop.
  5. Та-дам, мы получили работающую систему Linux с правами на чтение и запись, запущенную с образа диска/iso-образа внутри раздела NTFS.

Связанный контент