Linux 系统以其强大的命令行工具和灵活的配置选项,在硬件管理和开发领域备受青睐,通过命令行操作 USB 设备是 Linux 管理者和技术人员必备的技能之一,本文将详细介绍在 Linux 环境下如何识别、管理、读写 USB 设备,并涵盖一些高级操作场景,帮助读者全面掌握 Linux 写 USB 的核心方法与实践技巧。

识别与确认 USB 设备
在进行任何 USB 操作前,首先需要准确识别系统中的 USB 设备及其信息,Linux 系统会将 USB 设备视为字符设备或块设备,通过一系列系统文件和命令可以获取详细信息。
查看 USB 总线与设备信息
使用 lsusb 命令可以列出系统中所有连接的 USB 设备及其厂商 ID、产品 ID 等详细信息,在终端输入 lsusb,会输出类似以下的列表:
Bus 001 Device 005: ID 0781:5581 SanDisk Corp. Ultra Fit
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
这里的 0781:5581 分别是 SanDisk 设备的厂商 ID 和产品 ID,通过这些 ID 可以在网络上查找具体的设备型号。
查看设备节点信息
USB 存储设备(如 U 盘)通常会被识别为块设备,并自动挂载到 /dev 目录下,如 /dev/sdb、/dev/sdc 等,使用 fdisk -l 或 lsblk 命令可以查看所有块设备的信息,包括 USB 设备的容量、分区表类型等。
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 1 14.9G 0 disk
└─sdb1 8:17 1 14.9G 0 part /media/user/USB_DRIVE
这表示系统识别到一个 14.9GB 的 USB 设备(/dev/sdb),并且已有一个分区(/dev/sdb1)挂载到 /media/user/USB_DRIVE。
安全卸载 USB 设备
在写入数据前,若 USB 设备已自动挂载,建议先安全卸载,避免数据损坏,使用 umount 命令可以卸载设备,但需先确保没有程序正在访问该设备。
umount /dev/sdb1
如果设备正被占用,umount 会提示设备忙碌,此时可以通过 fuser -km /dev/sdb1 强制结束占用进程(需谨慎使用)。

直接写入设备(原始写入)
对于需要制作启动盘、固件更新或磁盘镜像的场景,通常需要将数据直接写入 USB 设备的原始扇区,而非文件系统层面,Linux 提供了多种命令支持原始写入操作。
使用 dd 命令进行镜像写入
dd 是 Linux 下最常用的底层复制工具,可用于将镜像文件(如 .iso、.img)写入 USB 设备,基本语法为:
dd if=输入文件 of=输出设备 bs=块大小 status=进度
将 ubuntu.iso 写入 U 盘(假设设备为 /dev/sdb):
dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress
if:输入文件路径(镜像文件)of:输出设备路径(USB 设备,注意不要误写成分区,如/dev/sdb1)bs:块大小,设置为4M可提高写入速度status=progress:实时显示写入进度和速度
使用 pv 命令监控写入进度
pv(Pipe Viewer)可以与 dd 结合使用,提供更直观的进度条和传输速率信息,首先安装 pv(如 sudo apt install pv),然后执行:
pv ubuntu.iso | dd of=/dev/sdb bs=4M
pv 会显示已传输的数据量、剩余时间和当前速率,适合大文件写入。
使用 xzcat 解压并写入压缩镜像
若镜像文件为 .xz 压缩格式(如 Arch Linux 镜像),可通过管道直接解压并写入:
xzcat archlinux-xxx-x86_64.iso.xz | dd of=/dev/sdb bs=4M status=progress
文件系统级写入(格式化与挂载)
若需要对 USB 设备进行文件系统管理(如创建 FAT32、NTFS、ext4 分区),需使用 mkfs 系列命令和手动挂载操作。

分区与格式化
使用 fdisk 或 parted 对 USB 设备进行分区,然后用 mkfs 格式化,将 /dev/sdb 格式化为 FAT32:
# 使用 parted 分区(推荐处理大容量设备) sudo parted /dev/sdb mklabel gpt sudo parted /dev/sdb mkpart primary fat32 0% 100% sudo parted /dev/sdb set 1 esp on # 若需制作启动盘 # 格式化分区为 FAT32 sudo mkfs.vfat -F 32 /dev/sdb1
手动挂载与写入
创建挂载点并挂载分区:
sudo mkdir /mnt/usb sudo mount /dev/sdb1 /mnt/usb
此时可通过 cp、rsync 等命令将文件复制到 /mnt/usb,完成后卸载:
sudo umount /mnt/usb
常见问题与注意事项
| 问题场景 | 可能原因及解决方案 |
|---|---|
dd 写入后设备无法启动 |
检查镜像是否为可启动格式,确认写入设备为整设备(非分区),尝试使用 --target-file-size 参数调整 |
| 设备权限不足 | 使用 sudo 执行命令,或通过 chmod 修改 /dev/sd* 权限(不推荐,建议使用 sudo) |
| 写入速度过慢 | 尝试调整 dd 的 bs 参数(如 8M、16M),避免使用 SD 卡适配器(可能影响速度) |
| 设备识别失败 | 检查 USB 接口接触,使用 dmesg | tail 查看系统日志确认设备是否被正确识别 |
高级应用:批量操作与脚本自动化
对于需要频繁操作 USB 设备的场景(如批量制作启动盘),可通过 Shell 脚本实现自动化,以下是一个简单的批量写入脚本示例:
#!/bin/bash
IMAGE="ubuntu.iso"
DEVICE="/dev/sdb"
# 检查设备是否存在
if [ ! -e "$DEVICE" ]; then
echo "错误:设备 $DEVICE 不存在!"
exit 1
fi
# 确认写入操作
read -p "即将将 $IMAGE 写入 $DEVICE,此操作将清除所有数据,是否继续?(y/N) " confirm
if [ "$confirm" != "y" ]; then
echo "操作已取消。"
exit 0
fi
# 执行写入
echo "开始写入..."
pv "$IMAGE" | dd of="$DEVICE" bs=4M status=progress
echo "写入完成!"
将脚本保存为 usb_writer.sh,赋予执行权限(chmod +x usb_writer.sh),即可通过 ./usb_writer.sh 运行。
Linux 系统下写 USB 操作涵盖了从设备识别、原始写入到文件系统管理的完整流程,无论是使用 dd 制作启动盘,还是通过 mkfs 格式化分区,掌握这些命令都能让用户更灵活地管理 USB 设备,在实际操作中,务必注意设备路径的准确性,避免误系统分区,同时结合 pv、dmesg 等工具监控和排查问题,确保数据写入的安全性和可靠性,通过本文介绍的方法,读者可以高效完成各类 USB 写入任务,并逐步探索更高级的自动化应用场景。


















