必须先挂载u盘才能复制文件,因设备节点(如/dev/sdb1)仅为块设备,不可直接写入;真正可操作的是挂载后的目录(如/mnt/usb)。

能直接复制,但必须先挂载U盘,否则 cp 会报错“没有那个文件或目录”——因为U盘设备节点(如 /dev/sdb1)不是可写路径,它只是块设备;真正能写入的是挂载后的目录(如 /mnt/usb)。
怎么确认U盘设备名和文件系统类型
插上U盘后立刻运行 lsblk -f,比 fdisk -l 更简洁直观:它会列出所有块设备、挂载点、FSTYPE(如 vfat、exfat、ntfs)和 UUID。重点关注最后一行或标有“removable”的设备,比如:
NAME FSTYPE LABEL UUID MOUNTPOINT sdb └─sdb1 vfat KINGSTON 1234-5678 /run/media/user/KINGSTON
如果 MOUNTPOINT 为空,说明没自动挂载;如果值是 /run/media/...,说明已被桌面环境自动挂载(此时可跳过手动挂载步骤)。
-
vfat或msdos:对应 FAT32,最常见,兼容性最好 -
exfat:适合大文件(>4GB),但需确认系统已安装exfat-utils和fuse-exfat -
ntfs:Linux 可读写,但部分老U盘用此格式时需加-o rw,uid=1000,gid=1000才能避免权限问题
挂载U盘时为什么不能直接用 /mnt
/mnt 是通用挂载点,但多个设备共用它容易冲突——比如你刚挂了U盘,又去挂硬盘,后者会覆盖前者,导致原U盘路径失效甚至数据损坏。更稳妥的做法是:
- 为U盘单独建挂载目录:
sudo mkdir /mnt/usb - 挂载时显式指定类型(尤其对非
vfat):sudo mount -t vfat /dev/sdb1 /mnt/usb - 若遇中文乱码(常见于FAT32),加字符集参数:
sudo mount -t vfat -o iocharset=utf8,shortname=mixed /dev/sdb1 /mnt/usb
注意:不要用 sudo mount /dev/sdb1 /mnt 后直接 cp——万一之前挂的是别的设备,/mnt 下内容就不是U盘的。
cp 复制时的关键参数和坑
普通文件用 cp source /mnt/usb/ 即可,但以下情况必须加参数:
- 复制整个目录:必须带
-r(cp -r myfolder /mnt/usb/),否则报“省略目录”错误 - 想保留时间戳、权限、符号链接:用
-a(等价于-r -p -d -l),比如备份配置目录:cp -a /etc/nginx /mnt/usb/ - 覆盖前强制确认:加
-i,避免误删已有同名文件 - 大文件传输时想看进度:
cp本身不支持,改用rsync -avh --progress source /mnt/usb/
特别注意:U盘默认是 FAT32 时,不支持 Linux 权限位和长文件名(超255字符会截断),所以 -a 中的权限部分实际无效;rsync 的 -a 在 FAT32 上也会静默忽略权限同步。
卸载前为什么一定要检查进程占用
执行 sudo umount /mnt/usb 报 “device is busy” 不是因为U盘正在读写,而是当前 shell 还在该目录下,或有程序(如 ls、编辑器、find)正访问其中文件。解决方法只有两个:
- 退出挂载点:
cd /或其他非U盘路径 - 查占用进程:
lsof +D /mnt/usb或fuser -v /mnt/usb,然后kill或关闭对应程序
强行拔U盘而不 umount,轻则文件系统损坏(下次插入提示“需要格式化”),重则FAT表错乱导致部分文件不可读——这不是警告,是真实发生过的高频故障。











