如何在Linux上使用命令行从可启动ISO创建可启动USB?


50

我有一张CD是从ISO文件创建的,用于通过plop linux安装Ubuntu的自定义版本。

光盘工作正常,但我想使用可引导的USB驱动器。我使用命令dd尝试创建可启动的USB:

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

现在,这确实复制了文件并使USB可启动,但出现错误“缺少操作系统”

有任何想法吗?


您只能访问命令行吗?还有像Unetbootin的工作非常好,在linux上运行的接口..
仪表盘

3
@dashboard我更喜欢命令行,因为它在每台Linux机器上都可用。
xsdf


@dashboard-GUI工具似乎从未对我有效,并且多年来一直如此。我很高兴知道命令行方法。我发现它更容易,更可靠。少了很多挫败感!
MountainX

Answers:


58

好了,经过一些研究,我找到了解决方案,并将逐步进行研究。问题是双重的。

  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。我知道它可以与CD一起使用,所以我发现我需要调用isohybrid命令,该命令允许BIOS从硬盘驱动器识别ISO。

     isohybrid filename.iso
    

    您可以在此处找到有关此命令的更多信息,但这是消息“ Missing Operating System”的原因。已解决了第一个问题,但现在它说“ isolinux.bin丢失或损坏”。

  5. 下一步是复制iso。我的第二个问题在这里,我要复制到分区sdc1,而不是设备sdc。

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

    这似乎工作得很好,但是在获得最新修复的论坛上,建议在拔下设备之前执行以下操作:

    sync
    sudo eject /dev/sdc
    

3
这是检查dd进度的一种方法:unix.stackexchange.com/a/11264/13011
Nikos Alexandris

3
在这里mkdosfs做个假设,我认为该命令可能不是必需的,因为iso已经位于其上的文件系统(可能包括MBR,不确定)已复制到块设备的开头。伙计,这isohybrid是一个很酷的命令,不知道!
Ehtesh Choudhury 2014年

1
对于Windows 7启动安装USB,也看到superuser.com/questions/256869/...
CWD

7
步骤3是不必要的;dd步骤#5中的命令将使用ISO的内容清除新创建的文件系统。
ewhac 2015年

在我找到您的帖子之前,我差不多要花12个小时才能找到相同的问题,所以我确实按照步骤进行操作,并且...确实有效!(步骤5也是我的问题,我还没有使用proLinux,所以谢谢)
Ismael

3

这是SanDisk USB记忆棒或未格式化为FAT32的记忆棒的常见问题。

如果都不是,那肯定是您的棒分区顺序或syslinux.cfg文件有问题。


USB闪存驱动器来自Verbatim。为了确保仍然出现相同的错误,我重新格式化了FAT32。
xsdf

1

isohybrid可能并不总是有效。例如,我有一个带FreeDOS的.iso,isohybrid无法在其中找到一些重要文件(我不知道它们是否应该由syslinux(我也使用过)或其他东西放置在该文件中)。我在这里提出了几种选择。

1)在此安装另一个引导程序,例如GRUB。在这里解释:

“假设您的USB记忆棒的第一个分区是FAT32,而其分区是/ dev / sdy1”(我grub2在Fedora Core上安装过,因此我对命令做了一些更改):

# 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 在此处提供了GRUB和syslinux的复合方法(尽管我不了解它们的启动方式grub>-直到那个阶段我都无法从USB引导)。

3)是一篇可能有用的文章-它说:“只要command.com,kernel.sys,syslinux.cfg,ldlinux.sys和fat32lba.bss文件位于驱动器的根目录以及MBR和引导中不重写扇区,驱动器应保持可引导状态。

4)此说明了如何使用syslinux引导程序生成可引导的.iso文件。他们甚至不使用同质杂交。不幸的是,那并没有帮助我(也许是因为syslinux)。

5 *)通过使用Windows程序wine。我尝试过rufus,但是没有用,找不到设备。

我警告您,不幸的是我无法解决此问题,我的设备无法启动,但是我希望这对其他人(以及那些不想在usb上安装Linux的人)有用。chtaube生成的usb图像虽然对我有用,所以我认为这些方法是正确的。

UPD:第三种方法确实有效(对自定义安装文件进行了更正)。

UPD2 :(固定链接)。问题isohybrid可能是因为iso和我的系统上的isolinux.bin版本不同。通过重新编译ISO genisoimage的建议在这里

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

有一些问题也是如此,他们通过该方法解决了这里 genisoimage之前:

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

==结束UPD2 ==



第二名:freedos.sourceforge.net/wiki/index.php/USB#Linux_2如果系统比我更信任您,则可以将这些链接添加到帖子中。StackOverflow已经很了解我,那么为什么超级用户会遇到这样的问题?另外,我在发布此信息时遇到了问题,但并没有显示我的答案已经发布。
Yaroslav Nikitenko '16

似乎超级用户通过引用来计数链接,即,如果我两次链接到同一资源,则该链接被计算在内。这似乎是一个错误。UPD中的变通方法来自spiderbird.com/tag/fat32lba-bss
Yaroslav Nikitenko

注释中的所有链接已修复。我将它们留在这里,以说明该政策带来了多少问题。
Yaroslav Nikitenko'2

0

您可以使用bootisoUtility来安全地做到这一点:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.