Как создать загрузочный USB из загрузочного ISO с помощью командной строки в Linux?

144764
xsdf

У меня есть компакт-диск, созданный из файла ISO, который я использую для установки пользовательской версии Ubuntu через plop linux.

Компакт-диск работает нормально, но я бы хотел вместо этого использовать загрузочный USB-накопитель. Я использовал команду dd, чтобы попытаться создать загрузочный USB:

dd if=filename.iso of=/dev/sdb1 bs=4k 

Теперь это копирует файлы и делает загрузочный USB, но я получаю сообщение об ошибке "Отсутствует операционная система"

Есть идеи?

50
У вас есть только доступ к командной строке? Есть такие интерфейсы, как Unetbootin, которые работают очень хорошо и работают на Linux. dashboard 11 лет назад 0
@dashboard Я бы предпочел командную строку, потому что она доступна на любой машине Linux. xsdf 11 лет назад 3
http://askubuntu.com/questions/116942/any-way-to-manually-make-a-bootable-usb-from-iso Ciro Santilli 新疆改造中心 六四事件 法轮功 9 лет назад 0
@dashboard - мне кажется, что инструменты с графическим интерфейсом никогда не работают хорошо, и это верно в течение многих лет. Я счастлив узнать метод командной строки. Я считаю это проще и надежнее. Это намного менее расстраивает! MountainX 9 лет назад 0

4 ответа на вопрос

57
xsdf

Хорошо, после некоторого исследования, я нашел решение и пройдусь по нему шаг за шагом. Проблема была двоякая.

  1. Подключите USB-накопитель и определите устройство, на котором он установлен, с помощью команды:

    sudo fdisk -l 

    На этот раз это был / dev / sdc1 для меня, поэтому я буду использовать это в качестве примера.

  2. Размонтировать устройство

    umount /dev/sdc1 
  3. Не уверен, если нужно, но я отформатировал диск в FAT32, на всякий случай

    sudo mkdosfs -n 'USB-Drive-Name' -I /dev/sdc -F 32 
  4. Теперь мой ISO использовал isolinux, а не syslinux. Я знал, что это работает с компакт-дисками, поэтому я понял, что мне нужно вызвать изогибридную команду, которая позволяет ISO распознавать BIOS с жесткого диска.

     isohybrid filename.iso 

    Вы можете узнать больше об этой команде здесь, но это было причиной сообщения «Отсутствует операционная система». Первая проблема была исправлена, но теперь она сказала, что «isolinux.bin отсутствует или поврежден»

  5. Следующим шагом является копирование ISO. Моя вторая проблема лежала здесь, где я копировал в раздел, sdc1, а не устройство, sdc.

    sudo dd if=filename.iso of=/dev/sdc bs=4k 

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

    sync sudo eject /dev/sdc 
Вот способ проверить прогресс дд: http://unix.stackexchange.com/a/11264/13011. Nikos Alexandris 10 лет назад 3
Делая здесь предположение, я думаю, что команда `mkdosfs` может и не понадобиться, поскольку в iso уже есть файловая система (вероятно, включая MBR, не уверенная), которая копируется в начало блочного устройства. Человек, изогибрид - классная команда, не знал об этом! Ehtesh Choudhury 10 лет назад 3
для загрузочной Windows 7 установите USB, также см. http://superuser.com/questions/256869/what-are-the-nuisances-of-creating-a-bootable-windows-7-usb-drive-from-linux-wit ? RQ = 1 cwd 10 лет назад 1
Шаг № 3 не нужен; команда `dd` на шаге 5 уничтожит вновь созданную файловую систему с содержимым ISO. ewhac 9 лет назад 7
Я почти 12 часов ищу эту же проблему, пока не найду твой пост здесь, и я следил и шагал, и ... это сработало! (Шаг 5 тоже был моей проблемой, я еще не профессионал в Linux, так что спасибо) Ismael 8 лет назад 0
3
Shouvik Sayef

Это распространенная проблема с USB-накопителями SanDisk или накопителями, не отформатированными в FAT32.

Если нет ни одного из них, то это, безусловно, проблема с порядком разделов флешки или файлом syslinux.cfg.

Флешка от Verbatim. Я переформатировал в FAT32 просто чтобы быть уверенным и все еще получил ту же ошибку. xsdf 11 лет назад 0
1
Yaroslav Nikitenko

isohybrid may not always work. For example, I had an .iso with FreeDOS and isohybrid was not able to find some important files there (I don't know whether they should had been put there by syslinux, which I used too, or anything else). I propose several alternatives here.

1) Install another bootloader there such as GRUB. It is explained here:

"Assume your USB stick's first partition is FAT32 and its partition is /dev/sdy1" (I had grub2 on my Fedora Core, so I changed the commands a bit):

# mkdir -p /mnt/usb ; mount /dev/sdy1 /mnt/usb # grub2-install --target=i386-pc --recheck --debug --boot-directory=/mnt/usb/boot /dev/sdy # grub2-mkconfig -o /mnt/usb/boot/grub2/grub.cfg # optional, backup config files of grub.cfg # mkdir -p /mnt/usb/etc/default # cp /etc/default/grub /mnt/usb/etc/default # cp -a /etc/grub.d /mnt/usb/etc # sync; umount /mnt/usb 

2) FreeDOS wiki offers a compound method with GRUB and syslinux here (though I don't understand how they launched grub> - I couldn't boot from the usb up to that stage).

3) Here is a post which may be useful - it says 'As long as the command.com, kernel.sys, syslinux.cfg, ldlinux.sys and fat32lba.bss files are in the root of the drive and the MBR and boot sector are not rewritten the drive should remain bootable.'

4) Here it is explained how to generate a bootable .iso file with a syslinux bootloader. They don't even use isohybrid. Unfortunately that didn't help me (maybe because of syslinux).

5*) Use a windows program via wine. I tried rufus, however that didn't work, it couldn't find the device.

I warn you that unfortunately I couldn't solve this problem, my device was unbootable, but I hope that this may be useful for other people (also those who want to install not a linux on the usb). The usb image generated by chtaube though worked for me, so I think these methods are correct.

UPD: The 3rd method really works (with a correction for a custom installation file).

UPD2: (fixed links). The problem with isohybrid was probably because the versions of isolinux.bin on iso and my system were different. Recompiled the iso using genisoimage as suggested here:

genisoimage -l -r -J -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -c isolinux/boot.cat -o fd11new.iso fd11new 

There were some problems too, they were solved by the method here before genisoimage:

cp /boot/extlinux/*.c32 fd11new/isolinux/ extlinux --install /boot/isolinux 

== end UPD2 ==

1-я ссылка: https://wiki.archlinux.org/index.php/GRUB#Install_to_external_USB_stick Yaroslav Nikitenko 8 лет назад 0
2-й: http://freedos.sourceforge.net/wiki/index.php/USB#Linux_2 Вы можете добавить эти ссылки к сообщению, если система доверяет вам больше, чем мне. StackOverflow уже хорошо меня знает, так почему такая проблема у суперпользователя? Также у меня были проблемы с публикацией этого, это не показывало, что мой ответ уже был опубликован. Yaroslav Nikitenko 8 лет назад 0
Кажется, суперпользователь считает ссылки по их ссылкам, т.е. если я дважды ссылаюсь на один и тот же ресурс, он считается. Это похоже на ошибку. Обходной путь в UPD пришел с http://www.spiderbird.com/tag/fat32lba-bss/ Yaroslav Nikitenko 8 лет назад 0
Все ссылки в комментариях исправлены. Я оставляю их здесь, чтобы показать, сколько проблем приносит эта политика. Yaroslav Nikitenko 8 лет назад 0
0
Jules Randolph

Вы можете использовать bootisoутилиту, которая делает именно это, безопасно:

bootiso -d /dev/sdb filename.iso 

bootiso проверит, что выбранное устройство /dev/sdbподключено через USB и, если оно этого не произойдет, произойдет сбой, что является большим плюсом безопасности. Он также автоматически обнаружит USB-устройство, если к вашей системе подключен только один USB-накопитель, посмотрите его в действии:

Если вы хотите установить загрузчик syslinux, чтобы обойти проблемы, упомянутые в @xsdf, используйте -bпараметр:

 bootiso -b -d /dev/sdb filename.iso 

Чтобы установить его:

curl -L https://rawgit.com/jsamr/bootiso/latest/bootiso -O chmod +x bootiso