在格式化USB时,出现“物理块大小为2048字节,但Linux显示为512字节”的错误。如何创建一个没有这个错误的可启动USB?

我正在使用:
dd  if=/path/to/my/ubuntuiso/ubuntu.iso  of=/dev/sdb1  bs=4M  &&  sync

为了在旧版Ubuntu上创建可引导的Ubuntu USB驱动器。它以前运行得非常完美。有时我使用启动磁盘创建器程序,效果很好。
但是,当我在Ubuntu 16.04 LTS上使用相同的方法后,格式化时会出现一些警告。
安装介质按预期工作,但是当我完成工作后尝试格式化该USB驱动器时,会出现以下警告:

enter image description here

那个U盘的分区看起来很奇怪:

enter image description here

它还显示我的16GB闪存盘为64GB。

在与Gparted苦苦挣扎后,我终于设法格式化它。但为什么会发生这种情况?有没有更好的方法在16.04中创建可引导的Ubuntu?

编辑:这里有一个相关问题here。但我的问题不是关于如何正确格式化它。我的问题是“如何创建一个没有错误的可引导USB”和“那个错误的原因是什么”。


对于UEFI,我使用sgdisk命令 - 在过去几个月里,我用这种方法制作了6个发行版的live USB,效果非常好。 - Zanna
@Zanna 请解释一下sgdisk的用法。 - Severus Tux
你确定那是正确的设备吗?如果应该是16GB,可能是/dev/sdc或其他什么。很多SD卡是64GB的,通常不能用于启动。你的驱动器不会始终显示相同的(sdb sdc),这完全取决于哪个驱动器首先被挂载。 - mchid
@mchid 是的,我确定这是正确的设备。在删除它之后...遇到了很多警告...它又变成了16GB。 - Severus Tux
1我在使用ISO文件后,通过mkfs格式化USB设备。无论USB设备的创建方法如何,都可以正常工作。 - user423626
4可能是无法删除USB驱动器分区(块大小错误)的重复问题。 - Braiam
你用错了 dd 命令。你不应该使用 bs=4MB,因为其大小超过了 USB 的块大小。正确的值是 512 字节。 - Braiam
@Braiam,请查看我帖子上的编辑部分。 - Severus Tux
如何在没有出现错误的情况下创建USB,需要使用正确的块大小。为什么会出错呢?因为你没有使用正确的块大小。所有这些都是重复的。基本上,你没有按照正确的方法进行操作 - Braiam
@Braiam 甚至“启动盘创建器”也没有做对吗? - Severus Tux
不,SDC只是在重复使用你在使用dd命令时设置的相同块大小。SDC是正确的。它不会更改块大小,因为它没有必要这样做。 - Braiam
@Braiam 但是当块大小适当时,我遇到了相同的问题。即,我插入一个适当的闪存驱动器,使用SDC Open Gparted创建一个可引导的设备--> 警告。请尝试一次。 - Severus Tux
我做了一些更好的事情,查看了来源。为了确保我没有漏看什么,我还向其他人咨询了一下,但似乎它并没有修改块大小。 - Braiam
让我们在聊天中继续这个讨论:http://chat.stackexchange.com/rooms/40713/discussion-between-severus-tux-and-braiam。 - Severus Tux
重新设计整个写入设备的图像处理过程:(https://bazaar.launchpad.net/~usb-creator-hackers/usb-creator/trunk/revision/474),这就是他们破坏它的方式。他们将block_size设置为1000000(https://bazaar.launchpad.net/~usb-creator-hackers/usb-creator/trunk/view/474/bin/usb-creator-helper#L111),这就是为什么libparted会报错(我推测是不同的错误信息)。我会向软件包提交一个错误报告,以便修复这个问题。 - Braiam
1我有两个USB闪存盘出现了相同的问题,其中一个是使用启动盘创建器创建的。 - Ken Mollerup
@KenMollerup 请考虑将其标记为“是的,它对我有影响”,详情请参考此链接 - Severus Tux
@Severus Tux,请帮忙,我找了很久,点击了你的链接,但是“它也影响我”按钮在哪里?我没有设置任何块大小,但它还是出错了!我已经报告了这个错误,它也影响了“启动盘创建器” - 其他人也在LaunchPad上报告了这些错误! - Ken Mollerup
1我在将Ubuntu 16.04 LTR烧录到U盘时遇到了同样的问题,但我从未手动使用dd命令,所以可能是某个Ubuntu工具出了问题。 - Antonello
这是应该的磁盘工具的使用方法。 - Lonnie Best
11个回答

一种用于UEFI系统的命令行方法制作活动USB的方法

请注意:这将删除目标设备上的所有数据。

安装先决条件:

sudo apt-get install p7zip-full

假设目标USB位于/dev/sdb
(首先使用lsblkgnome-diskssudo fdisk -l进行检查,并确保您知道要格式化的内容)
确保设备没有挂载的文件系统,如果需要,请卸载它,例如:
udisksctl unmount -b /dev/sdb1

销毁现有的分区表:
sudo sgdisk --zap-all /dev/sdb

创建新的GPT:
sudo sgdisk --new=1:0:0 --typecode=1:ef00 /dev/sdb

格式化为FAT32:
sudo mkfs.vfat -F32 /dev/sdb1

检查一下:
sudo fdisk -l /dev/sdb

应该输出类似于:

Device     Start      End  Sectors  Size Type
/dev/sdb1   2048 15663070 15661023  7.5G EFI System

挂载驱动器并将 ISO 文件提取到其中,将“name-of-iso”替换为先前下载的 ISO 文件的实际文件名。
sudo mount -t vfat /dev/sdb1 /mnt
sudo 7z x name-of-iso -o/mnt/

卸载
sudo umount /mnt

现在重新启动并享受Ubuntu ^_^

(这里 是我最初学会这个的地方。)


3正在处理中...但是这需要安装p7zip-full包,如果您能在您的回答中加上使用tar进行相同操作的步骤,那将更好。 - Severus Tux
3哇!非常感谢。它运行得很好。分区看起来很干净。如果您在回答中添加使用内置工具(如tar)进行提取的方法,那将是最好的。(甚至可以添加p7zip-full中可用的7z) - Severus Tux
啊,看来我不能使用 tar 命令来提取 iso 文件。 - Zanna
1@Zanna 我搜索了很多,似乎无法使用tar来提取iso文件。我找到的唯一方法是使用mount -o loop。虽然7z不是内置的,但它更好用。 - Severus Tux
是的,我无法通过每个我创建的可启动USB盘来享受Ubuntu……每一个都不行。 - wayofthefuture
3我给这篇帖子点赞,因为它是一个很好的描述,展示了“所有”基本步骤 :-) 但也有一些工具可以自动完成任务,方便那些懒惰的用户 ;-) - sudodus
4这是唯一一个在16.04版本下适用于我的方法。谢谢!默认应用程序会因为错误的块大小问题而损坏我的媒体文件,并创建一个只读文件系统,由于块大小问题,我无法恢复。这种方法允许用户享受剩余的可用空间。 - user334639
在我这样做之后,Windows系统不再识别我的USB闪存驱动器。然后我又尝试了同样的方法,但是使用了一个创建好的msdos分区表,结果一切正常。 - MaxNevermind
3Ubuntu 17.04的usb-creator(启动盘创建器)每次都会“损坏”我的USB驱动器。而这里提供的逐步操作是唯一将其恢复为正常可写状态的方法。gparted无法实现此功能。 - isync
@sudodus 你写了一个懒人工具呢 ;) - WinEunuuchs2Unix
@WinEunuuchs2Unix,一个懒惰用户的懒人工具 :-D https://help.ubuntu.com/community/mkusb 可以在Linux中将.ISO文件刻录到USB,并且还可以将USB驱动器恢复为标准存储设备。 - sudodus
@sudodus 您的文档写得非常好,我迫不及待想试试实时/持久功能。我刚刚购买了两个用于 Ubuntu 18.04 的 USB 闪存驱动器,一个是用于 Unity 7.5 和 XORG,另一个是用于 Gnome DM 和 Wayland。 - WinEunuuchs2Unix
@WinEunuuchs2Unix,你可以在这个链接上分享你的经验:https://ubuntuforums.org/showthread.php?t=1958073,如果你在Ubuntu论坛上有用户ID的话 :-) - sudodus
@sudodus 嗯,我在使用Ubuntu论坛之前就用过Ask Ubuntu。如果你想笑我以前的新手帖子,我的用户ID是一样的 :p - WinEunuuchs2Unix
@WinEunuuchs2Unix,是的,我们都曾经是新手 :-P - sudodus
@sudodus 如果你有时间的话,我找到了一个关于使用Live USB启动问题的问题,你可能能够解决它。 - WinEunuuchs2Unix
我本不想要一个可启动的驱动器,但在将其用作Ubuntu安装程序后,希望能得到一个正常的驱动器。同样的过程奏效了;使用gpard移除了引导标志,并且只有root用户才能对其进行写入。但是好吧。 - Raphael
1在GPT分区表上,你不应该使用fdisk而是gdisk...像这样$ sudo gdisk /dev/sdf然后输入$ ?并输入p以打印,在我的情况下,我得到了编号1,起始扇区2048,结束扇区30218808,大小14.4 GiB,代码EF00的名称。 - Antonio
@Antonio谢谢,下次我处理闪存时我会查看一下。 - Zanna
谢谢您的解决方案 @Zanna - fear_matrix
1经过一番使用unetbootin和gparted的"为什么这种事情总发生在我身上"的抱怨之后,终端中7zip输出的"一切正常"让我感到欣慰。谢谢! - Bogotrax
@Bogotrax 哈哈哈,没错。很高兴它对你有用。 - Zanna

这是我解决在将USB用作安装介质后重新格式化时出现错误的方法:

  • 首先打开“应用程序”下的“磁盘应用程序”
  • 选择可启动的U盘。
  • 右上角会有一个选项菜单
  • 选择“格式化驱动器”选项(CTRL + F
  • 会弹出一个窗口。选择0分区并格式化磁盘
  • 现在磁盘将为空,但系统将无法识别它。但您可以在“磁盘应用程序”中看到。
  • 选择U盘并重新格式化。现在任何系统都可以检测到U盘。

接受的答案太复杂了,需要大量输入和记住特定的磁盘名称(否则可能会遇到严重问题)。我的方法非常简单易行。


3+1,但我认为这个问题的标题有误导性 - 我已经编辑过了。对于这个问题的接受答案是一种创建安装介质的方法,正如OP所要求的那样,并不仅仅是格式化驱动器(无论使用何种方法,你都必须确保选择正确的设备进行格式化!) - Zanna
好的,谢谢你告诉我。根据你修改后的标题,你可以使用启动盘创建工具,在格式化驱动器之后创建一个全新的安装介质。 - Gopal Prasad
谢谢。右上角的菜单不太明显找到。 - Tor Klingberg


1在上述网站的最后一条评论中,有一个名为EoflaOE的用户,在其下方,您可以看到评论以及影响我和我建议的内容,以便您不要像上次那样损坏您的USB。如果您需要制作自己的可启动USB,请使用Rufus或Universal USB Creator,直到此错误得到修复。 - Eofla

这个要简单得多。只需将/dev/sdd替换为您的设备地址即可。这可以在DisksGparted工具中找到。
sudo dd if=/dev/zero of=/dev/sdd bs=2048 count=32

您可以使用启动盘创建器将镜像烧录到驱动器中。

我在Ubuntu上使用UNetbootin(包括旧版本和16.04)并且在我的电脑上运行良好。这里是更多信息的链接。
sudo apt-get install unetbootin

3谢谢您的关注,但我的问题不是“有没有其他选择?”我的问题是“为什么这些方法不能按预期工作?”我也会很感激任何不涉及第三方工具的其他方法。 - Severus Tux
7@SeverusTux 实际上,unetbootin并不比其他任何东西更像第三方软件。它可以通过apt-get获取。 - mchid
不允许磁盘镜像(多分区)安装,坚持要求已挂载一个分区。 - Gringo Suave

尝试这种方式从未让我失望过:dd if=/path/to/my/ubuntuiso/ubuntu.iso of=/dev/sdb(注意在结尾处使用b而不是b1 - 如果存在其他分区,将会销毁它们)。
你检查过ISO文件是否损坏了吗?
此外,在非图形环境下使用TTY进行操作可能有助于追踪问题。
编辑:你也可以使用/dev/null来覆盖分区表。

像这样:dd if=/dev/null of=/dev/sdb?这个似乎没有做任何事情。 - quantumbutterfly
2/dev/null 指向 'nothing',用于输出,但 /dev/zero 生成零字符(ASCII 0)。 - sudodus
在我看来,这是最好的答案,简单而高效,只有一个小例外,就是添加oflag=sync作为参数,以确保所有写入操作在命令返回之前都已完成。然而,这个方法的可行性是因为Canonical使用了一个技巧来创建镜像,它既是ISO镜像又是分区磁盘镜像。 - NovHak

关于块大小的投诉可能是由于读取iso9660文件系统的软件中的一个错误引起的。新版本的gparted已经发布,并且至少在Ubuntu 17.10中可用,该错误已被修复。
你可以使用mkusb来克隆驱动器。这种方法对驱动器的内容不敏感,因此非常可靠。
它也非常安全,因为mkusb在强大但危险的dd命令周围“包了一条安全带”。目标驱动器显示得非常清楚,您还有一个最后的检查点,在那里您可以仔细检查,确保将安装到正确的驱动器上(避免错误)。
请参考此链接:https://help.ubuntu.com/community/mkusb 如果仍然无法正常工作,您可以根据以下链接尝试: 无法格式化我的USB驱动器。我已经尝试过mkdosfs和gparted - 对问题的分析 请注意,您无需从格式化开始,因为mkusb将覆盖驱动器的先前内容。您可以直接进行操作。
  • 从ISO文件(或镜像文件)安装操作系统
  • 将驱动器恢复为标准存储设备

一个与所选答案相关的问题:插入后,U盘现在变得不可见。(我使用的是Lubuntu 16.04 64位) 解决方案:打开“磁盘”实用程序来挂载它。
In Lubuntu: Start menu > Preferences > Disks.

选择的答案中起作用的是,我们回到了使用USB驱动器的老方法,将可引导的ISO写入其中,并且仍然保持可写的USB驱动器,剩余空间可用于存储其他文件(来自另一个不运行实时操作系统的现有操作系统)。在16.04版本中,使用“启动盘创建器”会擦除USB驱动器,创建一个类似于CD的只读分区,使USB的剩余部分未分配(因此32GB的驱动器变成了一个900MB的只读驱动器),而我无法在未分配的空间中创建任何次要分区。
更新:Unetbootin似乎完成了工作,U盘仍然可见,在插入时不会隐藏,并且磁盘的剩余部分可用于存储其他数据。但是,当我启动笔记本电脑时,该磁盘并未被识别为可引导的USB!我使用的是UNetBootin的Ubuntu版本。

  1. 如果你从开发者的PPA安装Unetbootin,可能会有更好的运气,因为Ubuntu仓库中的版本可能太旧(无法与新版本的Ubuntu兼容);
  2. 这个问题标题中的错误信息是因为软件无法理解克隆引导驱动器的iso9660文件系统;
  3. 如果你在将驱动器恢复为标准存储设备时遇到问题,可以根据我回答中的链接使用mkusb。(也可以使用gparted和Disks,但可能更困难一些。)
- sudodus

显然,错误出在parted错误地读取驱动器上,而不是dd命令或启动盘创建程序。 parted的Debian Bug报告:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=788808 解决方法:如果您使用fdisk而不是parted,则可以看到正确的分区。在parted错误修复之前,请使用fdisk代替parted。

很遗憾,许多这些图形用户界面的磁盘工具不会简单地允许您删除USB上的分区表,而是只会提示一些愚蠢的错误信息,真是令人沮丧。
Physical block size is 2048 bytes, but Linux says it is 512 bytes

那个错误对话框应该与这个问题配对:
Would you like delete the partition table on this device (all data will be lost)?

由于它不会自动执行此操作,您可以立即使用以下命令自行完成:
sudo sgdisk --zap-all /dev/sd?

在执行上述命令之前,请确保以下两点:
  1. 确保您的终端已登录到您认为的计算机。
  2. 确保设备路径正确(参见上述命令中的问号,您需要将其更改为正确的设备路径)。
正如其他人提到的那样,您可以通过以下方式找出设备路径:
sudo fdisk -l

在这之后,你可能可以继续使用你在遇到这个错误时使用的实用工具。
顺便说一下,对于这个问题,使用dd命令的解决方案对我的需求来说太慢了。我真正想做的只是摆脱那个错误,而不是等待dd将整个驱动器清零。