Дисклеймер

Внимание: в этом блоге могут описываться события, явления и факты при помощи ненормативной лексики. Убедитесь, что Вы готовы к этому.

воскресенье, 27 ноября 2011 г.

Создание мультизагрузочной USB-флэшки с функцией хранилища файлов v.1.1

Озадачился недавно созданием такой USB-флэшки, чтобы и грузиться с неё можно было бы (желательно несколько вариантов загрузки), и файлы хранить можно было.
Прогуглив как следует, было найдено решение, которым спешу поделиться (и сохранить себе на память, конечно же :) ).

Понадобятся:
  1. сам носитель USB-flash
  2. дистрибутив GNU/Linux из которого и будем производить операции
  3. ntfsprogs, ntfs-3g, grub2
  4. iso-файлы ОС, которые будут загружаться с флэшки
Для начала присоединим к компьютеру флэшку. Если она уже в формате fat/ntfs (дабы и виндовые машины могли читать содержимое), или в ином, нужном Вам - всё в порядке. Иначе - придётся форматировать. В любом случае, все данные с носителя лучше скопировать до совершения каких-либо нижеописанных действий.
Приступим к форматированию (например, в ntfs):
mkfs.ntfs -f /dev/sdb1
Если команда не срабатывает (такое бывает в Kubuntu 13.04, например), то вместо mkfs.ntfs нужно использовать mkntfs. В остальном - без изменений.
В Вашем случае, раздел девайса может называться и sdc1, и sdd1 - будьте внимательны.
Затем можно установить метку раздела, дабы сразу было понятно, что это. Например, так:
ntfslabel -v /dev/sdb1 MultiBootUSB
После этого нужно примонтировать данный раздел.
Для начала необходимо создать директорию, куда будем монтировать. Например,
mkdir /media/MultiBootUSB
И после этого с чистой совестью можно монтировать:
mount /dev/sdb1 /media/MultiBootUSB/
Теперь установим загрузчик на носитель. Обратите внимание, поскольку ставим на носитель, а не на раздел носителя, то цифры 1 после sdb нет:
grub2-install --boot-directory=/media/MultiBootUSB/boot /dev/sdb
Важно:
  1. в некоторых дистрибутивах команда может вызываться как grub-install (без двойки). 
  2. в старых версиях grub вместо --boot-directory=/media/MultiBootUSB/boot надо было писать --root-directory=/media/MultiBootUSB/
Процедура может занять чуть более минуты. В результате этого мероприятия, на флэшке образовалась директория /boot, в которой grub сложил нужные ему (и нам) файлы.
Настало время определиться, где же будут лежать iso-образы, которые будут грузиться с флэшки. Мне представляется, что директория  /iso в корне флэшки - крайне подходящий вариант. Создаём такую любым удобным способом. В моём случае:
mkdir /media/MultiBootUSB/iso
и складываем в неё нужные нам iso-файлы. Я положу дистрибутив Ubuntu 14.04.

Осталось подготовить grub.cfg, отвечающий нашим нуждам. Открываем файл любым редактором, например, nano:
nano /media/MultiBootUSB/boot/grub/grub.cfg
И вписываем туда нужные параметры. В рассматриваемом случае это:

set default="0"

set timeout=5

menuentry "ubuntu-14.04-desktop-amd64" {
set isofile="/iso/ubuntu-14.04-desktop-amd64.iso"
loopback loop $isofile
linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile quiet splash noprompt --
initrd (loop)/casper/initrd.lz
}
Пункт меню для Ubuntu будет справедлив и для любой другой *buntu-системы и им подобных, нужно лишь поменять переменную isofile во второй строке на подходящий, ну и само название пункта - menuentry.

В итоге, мы имеем USB-flash носитель с установленным загрузчиком, двумя директориями /boot и /iso. Эти директории нужны для загрузки с флэшки. В остальное свободное место можно совершенно спокойно складывать разные файлы: полезные и не очень. Таким образом, если носитель воткнуть до старта системы, то при разрешённой в BIOS (*EFI) загрузке с USB будут грузиться положенные iso-файлы ОС, а если же флэшка вставлена во время работы системы, то она будет открываться как файловое хранилище. Просто и удобно ;)

P.S. 20.05.2014 заметка была существенно обновлена, чтобы отражать существующие реалии.

9 комментариев:

  1. :~$ sudo grub-install --root-directory=/media/MultiBootUSB /dev/sdb
    /usr/sbin/grub-setup: предупр: Your embedding area is unusually small. core.img won't fit in it..
    /usr/sbin/grub-setup: ошибка: встраивание невозможно, но оно необходимо для междисковой установки.
    :~$

    Что делать в таком случае?

    ОтветитьУдалить
    Ответы
    1. прошу великодушного прощения, модерационная негодная система не уведомила меня о комментарии, а сам я вот только что забёг сюда для очередного опустошения накопившегося и заметил.

      по существу вопроса могу сказать следующее: нужно освободить место на носителе, скорее всего. также можно попробовать добавить ключи --force --recheck

      Удалить
  2. Иван, а можно вместо Ubuntu 10 добиться загрузки из iso Ubuntu 12?
    Я попробовал, но пишет:
    [2,836,452] Kernel panic: not syncing: VFS: Unable to mount root fs on unknown block (1,0)
    Дальше идет Call Trace и все виснет...

    ОтветитьУдалить
    Ответы
    1. Определённо можно, поскольку я так делал (правда, приходилось чуть-чуть править опции).
      Прошу приложить grub.cfg в том виде, в котором он используется и возникает ошибка.

      Удалить
    2. Только что попробовал с 12.10 и вот такими строками:

      menuentry "Ubuntu 12.10" {
      set isofile="/iso/ubuntu-12.10-desktop-amd64.iso"
      loopback loop $isofile
      linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash noprompt --
      initrd (loop)/casper/initrd.lz
      }

      Всё работает.
      P.S. в отдельных случаях вместо vmlinuz в четвёртой строке придётся писать vmlinuz.efi.signed (кстати, мне как раз что-то связанное с EFI приходилось дописывать, но, к сожалению, ту флэшку я утратил и что именно там было в grub.cfg - не могу сказать)

      Удалить
    3. Да в нем все то же, я только местами пункты меню поменял и изменил название дистрибутива:

      set default="0"

      set timeout=5

      menuentry "ubuntu-12.04.2-desktop" {
      set isofile="/iso/ubuntu-12.04.2-desktop-i386.iso"
      loopback loop $isofile
      linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash noprompt --
      initrd (loop)/casper/initrd.lz
      }


      menuentry "Parted Magic" {
      set isofile="/iso/pmagic-11.11.11.iso"
      loopback loop $isofile
      linux (loop)/pmagic/bzImage iso_filename=$isofile edd=off noapic load_ramdisk=1 prompt_ramdisk=0 rwnomce sleep=10 loglevel=0
      initrd (loop)/pmagic/initramfs
      }

      Еще, кругом пишут, что grub.cfg создается сам - у меня он не создается автоматически (раза три пробовал grub-install).
      Создается только принудительно (когда sudo grub-mkconfig -o /media/Ubuntu 12.0/boot/grub/grub.cfg).
      Но там столько всего наверчено, что я его не решился применять...
      А надо было в него вставить меню для iso-шек?

      Удалить
    4. Вроде всё правильно.
      Погляжу, в чём может быть дело. Ошибка GRUB это известная, но как она тут оказалась - неясно.
      А железо какое? Какие диски висят в системе при загрузке?

      Удалить
  3. Железо - HP7800 (http://reviews.cnet.com/desktops/hp-compaq-business-dc7800/4507-3118_7-32598385.html)

    Диски висят:
    (hd0,msdos4), (hd1,msdos5),(hd1,msdos1),(hd2,msdos1)
    1 диск с 2-мя разделами ntfs (hd1), 1 диск с одним разделом ntfs (hd2) и флешка FAT16 (hd0)

    ОтветитьУдалить
    Ответы
    1. Очень и очень странно.
      Только что попробовал загрузить ubuntu-12.04.2-desktop-i386 со скопированной выше строкой:

      menuentry "ubuntu-12.04.2-desktop" {
      set isofile="/iso/ubuntu-12.04.2-desktop-i386.iso"
      loopback loop $isofile
      linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash noprompt --
      initrd (loop)/casper/initrd.lz
      }

      у меня всё работает.

      вопрос такого плана: а из-под какой системы с какой версией Grub проводилась, собственно, установка?
      P.S. а флэшка в FAT16 - это та, с которой ведётся установка? Может тут собака зарыта, я-то с NTFS пробую (маловероятно, но всё же).

      Удалить