dd写入前必须卸载u盘所有分区,否则会因缓存导致镜像损坏或报“resource busy”错误;需用lsblk确认设备名(如/dev/sdb),再sudo umount逐一分区卸载,of必须指向设备节点而非分区,写完须执行sync并验证分区结构与启动文件。

dd写入前必须卸载U盘所有分区
不卸载就跑dd,Linux会缓存写入、甚至直接报 Resource busy 错误,最终镜像损坏——插上也进不了启动菜单。用 lsblk 确认U盘设备名(比如 /dev/sdb),再逐一分区卸载:
sudo umount /dev/sdb1-
sudo umount /dev/sdb2(如果存在)
提示 not mounted 说明已卸载;若提示 target is busy,可加 -l 强制(sudo umount -l /dev/sdb1),但更稳妥的是先关掉文件管理器、浏览器等可能正访问U盘的程序。
of参数必须指向设备节点,不是分区
of=/dev/sdb 是对的,of=/dev/sdb1 是错的——后者只写进第一个分区,启动文件结构被破坏,UEFI/BIOS都识别不了。写错 of 还可能误写到 /dev/sda,直接覆写系统盘主引导区。
可靠命令示例:
sudo dd if=~/Downloads/ubuntu-22.04-desktop-amd64.iso of=/dev/sdb bs=4M status=progress oflag=sync
关键点:
-
bs=4M比默认512字节快得多,且减少I/O次数 -
oflag=sync确保每块数据落盘,断电也不丢;别用conv=fsync,它只在最后同步一次 -
status=progress显示实时进度(较新版dd才支持)
写完不能立刻拔U盘
dd 返回shell ≠ 写入完成。内核还在刷缓存,此时拔U盘等于截断镜像。必须手动执行:
sudo sync
等光标重新出现、无任何输出后再操作。之后验证是否成功:
-
lsblk /dev/sdb看是否有FAT32分区(含EFI/或isolinux/目录) -
sudo fdisk -l /dev/sdb看分区表是否完整、容量是否接近ISO大小 - 注意:U盘热插拔后设备名可能从
/dev/sdb变成/dev/sdc,dd不会自动适配,全靠你人工核对
UEFI启动失败别急着重写
能进BIOS看到U盘,但选中后黑屏或报“Invalid signature”,大概率不是dd问题,而是:
- ISO本身不带UEFI支持(如某些CentOS 7 minimal镜像缺
EFI/BOOT/bootx64.efi) - 主板Secure Boot开启,而镜像未签名(Ubuntu 22.04+、CentOS Stream 9可以,Rocky 8.8不行)
- BIOS里启动模式设成了Legacy,或U盘没排在第一位
- 验证方法:
file -s /dev/sdb1看是否识别为FAT filesystem;再sudo mount /dev/sdb1 /mnt && ls /mnt/EFI/BOOT/确认启动文件存在
真正容易被忽略的,是设备名动态变化和缓存未刷清这两件事——它们不会报错,但会让整个过程白忙一场。











