使用 'dd' 命令创建可启动的USB闪存驱动器

为什么Ubuntu的某些版本的ISO映像可以通过"dd"命令成功地放入USB闪存驱动器并成功引导,而其他版本则不行?此外,它似乎还取决于特定的USB闪存驱动器。我尝试了标准版的Ubuntu: $ sudo dd if=./ubuntu.iso of=/dev/sdd bs=8129
效果很好,我的意思是:可以引导并安装或运行Ubuntu Live。但是当我使用另一个以同样方式准备的USB闪存驱动器时,它无法引导,并显示"操作系统未找到"的BIOS错误。
当我尝试Ubuntu GNOME时,它也无法引导,并显示与上一个示例中相同的错误,而无论我使用哪个USB闪存驱动器。
我知道Ubuntu中有一个名为"Startup Disk Creator"的应用程序,但我相信它只是简单"dd"命令的图形界面门面,而且我始终可以使用"dd"创建可引导的USB闪存驱动器,至少对于Linux来说。我错了吗?

1我个人使用Unetbootin,从未遇到过问题。 - Tim
3个回答

如果你运行启动盘创建器,你会注意到它会做三(四)件事情:
1. 格式化驱动器 2. 将ISO中的数据复制到驱动器上 3. (如果选择了持久性,则添加额外的casper1文件。使用dd命令无法提供持久性。) 4. 安装引导程序
SDC不是dd的图形用户界面(有一些GUI适用于dd,但SDC不是其中之一)。 你可以将其视为执行Arch LinuxGentoo的手动方法的等效操作。目前,你应该能够使用大多数(相当受欢迎的)发行版的安装ISO创建可引导的USB。这在三四年前并不成立,当时我看过Arch的情况。直到2010年,所有的Arch ISO才具备了这个功能(可以直接写入USB驱动器),而在2008年至2010年期间,它们只有特殊的USB镜像。
此外,如果您直接使用dd命令对驱动器进行操作,该驱动器在格式化或以其他方式利用剩余空间之前将变为只读状态。虽然SCD创建的磁盘在实时环境中的内容不易访问,但仍可用作USB驱动器。因此,如果您将1GB的ISO文件使用dd命令复制到8或16GB的USB驱动器上,除非采取额外步骤,否则您将无法有效利用剩余空间。
通常,大多数实时映像使用SquashFS文件作为root分区。SquashFS是只读的,所以为了持久性,在/casper中创建了一个casper-rw文件。我不确定casper的起源。据我所知,当使用boot=casper选项启动时,内核将casper文件(如果不存在则创建一个)覆盖在squashfs之上,以获得写入能力。casper不一定是一个文件,也可以是一个分区

1什么是“casper文件”?请解释一下。 - user280493
1@MikołajBartnicki 我自己也不太确定,但我已经更新了答案。 - muru
1Casper是一个鬼魂(你们都知道)。就像你说的那样,它在只读文件系统上叠加了一些文件夹。通过启用持久性的运行中镜像来检查文件系统,可以看到一些目录'upper'和'lower',它们存在于只读和可写系统上,但在运行中的系统中表现为一个,有点类似于对已经存在的文件夹进行挂载。 - oneindelijk
1请注意,这些说明在撰写时是相关的,但在2016年4月,Ubuntu启动盘创建器进行了改版。此后,它成为了一个克隆工具,可以复制混合ISO引导系统和ISO9660文件系统(每个位都无修改地复制)。此外,当前的Ubuntu ISO文件在写入USB驱动器时,会在克隆镜像后面占用驱动器空间,并创建一个ext4文件系统(在第一次启动时)。 - undefined

尝试一下:
su -c 'mkfs.vfat /dev/sdc -I'

使用dd命令从iso文件创建可引导的USB磁盘时,磁盘不能有像/dev/sdc1(来自磁盘/dev/sdc的四个可能主分区之一)这样的分区。你不能将iso文件的块克隆到主分区,因为DVD或CD光盘也没有该分区。这就是为什么你必须在磁盘/dev/sdc上创建一个文件系统,而不是在主分区上。

此外,您在键入dd命令时犯了几个错误。

请尝试以下命令:

su -c 'dd if=/home/user/debian.iso of=/dev/sdc bs=4M;sync;eject /dev/sdc'

你的命令在没有先执行mkfs.vfat的情况下是不正确的。如果你安装了引导程序并将分区设置为活动状态,可能会生效。其他USB驱动器可能无法工作,可能是因为你的USB端口与另一个USB端口共享,或者你没有足够的电力来运行Live USB操作系统,可能是因为正在使用的硬盘驱动器和其他需要比平常更多电力的USB设备(例如带有USB到SATA适配器的外置硬盘驱动器)的平均功耗超过了标准值。

你甚至可以使用`cp`命令创建一个可启动的USB驱动器(对我来说,这比使用`dd`或GUI要简单得多):
``` sudo cp path/to/ISO /dev/sdX ```

请记住将/dev/sdX替换为您的块设备名称(例如/dev/sdb/dev/sdc)。


1这对我来说真是新鲜事。加上progress(https://unix.stackexchange.com/a/301329/87264),它也显示进度。 - Jonas Eberle