§ Загрузочный USB диск с ISO.

В интернетах много инструкций о том как взять и сделать загрузочную флешку. Ее можно сделать из ISO образа, или поставить Linux непосредственно на флешку, но лично мне такие способы не нравятся, так как обычно требуют либо FAT32 либо EXT4, первый из которых не умеет хранить файлы больше 4Gb а второй не читается машинами на Windows. Да и хочется иметь возможность загружать не одну систему а любой (ну почти любой) ISO образ который мы качаем из интернетов.

Для этого я собственно и пишу данную статью. Я расскажу как сделать USB флешку отформатированную в NTFS, с установленным загрузчиком GRUB и позволяющую загружаться непосредственно с ISO образа на самой флешке. Интересно? Тогда читаем дальше.

Для начала нужно поставить все что требуется, а именно NTFS-3G и Syslinux (не волнуйтесь, я сказал GRUB и именно его мы будем ставить на флешку).

$ sudo aptitude install ntfs-3g syslinux

Естественно флешку нужно сперва отформатировать

$ sudo mkfs.ntfs /dev/sdX1

Теперь необходимо поставить Grub. Если у вас современный дистрибутив - то скорее всего он у вас уже стоит. Монтируем флешку и ставим.

$ sudo mount /dev/sdX1 /mnt/flash

$ sudo grub-install --target=i386-pc --force --no-floppy --boot-directory=/mnt/flash /dev/sdX

Итак теперь у нас стоит Grub в MBR и в корне флешки появилась папка grub. Теперь необходимо создать конфигурационный файл /mnt/flash/grub/grub.cfg следующего содержания

insmod part_msdos
insmod ntfs

set timeout=10
set default=1
 
function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}
 
if loadfont unicode ; then
  set gfxmode="800x600x32"
  load_video
  insmod gfxterm
  terminal_input console
  terminal_output gfxterm
fi
 
insmod gfxmenu
 
terminal_input at_keyboard
insmod memdisk
set pager=0

menuentry "Xubuntu 14.04 32 bit" { 
  set isofile="/ISO/xubuntu-14.04-desktop-i386.iso"
  loopback loop $isofile
  linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile quiet noeject noprompt splash --
  initrd (loop)/casper/initrd.lz
}

menuentry "SystemRescueCD (using memdisk)" { 
  linux16 /grub/memdisk iso
  initrd16 "/ISO/systemrescuecd-x86-4.3.0.iso"
}

Тут внизу приведены два примера как мы можем загрузиться с ISO образа, первый способ монтирует ISO и загружает ядро непосредственно из смонтированного образа, с указанными ему параметрами. По большому счету любой LiveCD Linux можно разобрать и посмотрев ему в исподнее понять какое ядро загружать и с какими параметрами, и в принципе так и стоит делать.

Второй способ гораздо проще но требует большего объема памяти и ещё одного пасса руками. В данном случае вызывается утилита memdisk которая создает образ диска в памяти, помещает туда весь ISO файл передает загрузку ему. Таким образом можно загрузить Windows и прочее сложно адаптирующееся (в том числе и некоторые Linux дистрибутивы).

Но так как файл /grub/memdisk у нас на диске отсутствует - нужно его скопировать

$ sudo cp /usr/lib/syslinux/memdisk /mnt/flash/grub

Вот и все - теперь остаётся только создать каталог ISO, положить туда образы и можно проверять

$ mkdir /mnt/flash/ISO

$ cp /path/to/isofile.iso /mnt/flash/ISO/

$ sudo umount /mnt/flash

$ sudo qemu-system-i386 -usb /dev/sdX

Надеюсь данная инструкция будет полезна.


comments powered by Disqus