ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ubuntu U盘挂载与卸载实战:设备识别、权限与fstab避坑

Ubuntu U盘挂载与卸载实战:设备识别、权限与fstab避坑 1. 先把设备认明白Ubuntu眼里的U盘到底是谁在Ubuntu下折腾U盘十次里有八次卡在第一步——不知道U盘是哪个设备。这个坎看着小实际是后面所有挂载、卸载、写fstab操作的地基。地基歪了轻则报个错重则把系统盘上的分区给格了那画面我见过不止一次当事人脸都白了。Ubuntu对U盘的挂载和卸载这一整套动作本质上就是找到设备→挂到某个目录→用完摘下来流程比你想象的简单但每一步都有它的脾气。这篇文章我按自己这些年在一堆服务器、开发板、虚拟机、还有同事的笔记本上处理U盘问题的经验从头到尾讲一遍新手照着敲能跑通老手也能在里面找到几个平时容易忽略的坑比如权限、脏标志、fstab写错导致系统起不来这些。先给一个心理预期Linux不讲盘符这个概念。Windows给你个D盘、E盘插上就能点开Ubuntu没有这套它把每一块存储设备都当成一个文件放在/dev目录里你需要手动或让桌面环境帮你把这个设备接到某个目录上这个动作就叫挂载接的那个目录叫挂载点。用完把连接解开就是卸载。理解了这个模型后面所有的命令都只是在操作这两件事。1.1 为什么你的U盘经常叫/dev/sdb而不是/dev/sdaUbuntu识别块设备用的是SCSI子系统的命名规则按发现顺序排队第一块被识别到的是sda第二块是sdb以此类推。系统盘通常最先被内核发现所以占了sda你后来插的U盘一般就落到sdb。但这只是一般不是铁律。如果你的机器上挂了两块硬盘那系统盘可能是sda和sdb你的U盘就是sdc。更要命的是如果你插的是那种做过系统启动盘的U盘网上常见的那种用rufus或者大白菜、老毛桃之类的工具做出来的安装盘它内部往往有多个分区命名就是sdb1、sdb2、sdb3。我见过有人想清空U盘dd命令里手一抖写成了sda整台机器重装那滋味不好受。所以我现在形成了一个肌肉记忆任何对U盘做破坏性操作之前先跑一条lsblk看清楚容量和型号确认这个设备确实是U盘。这一步花三秒钟能省掉三小时的抢救。lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL输出大概长这样NAME SIZE TYPE MOUNTPOINT MODEL sda 476.9G disk Samsung SSD 870 ├─sda1 512M part /boot/efi └─sda2 476.4G part / sdb 14.8G disk SanDisk Cruzer └─sdb1 14.8G part /media/you/USBMODEL这一列就是你的护身符。看到SanDisk Cruzer、Kingston这种字样就知道是U盘看到Samsung SSD、WDC那是硬盘别动。如果MODEL显示不出来用sudo hwinfo --disk或者sudo lshw -class disk也能拿到更详细的信息。1.2 四条命令组成一套设备侦察流程光靠lsblk还不够实战里我一般按这四条命令依次看各有各的用处lsblk看整体拓扑谁是谁的子分区容量对不对有没有已经挂上。sudo fdisk -l /dev/sdb看分区表和分区类型判断这U盘是MBR还是GPT分区是FAT32还是NTFS。sudo blkid看每个分区的UUID和文件系统类型这个信息后面写fstab必须用。sudo dmesg -T | tail -n 30看内核刚插U盘时打印了什么报错信息全在这里。dmesg这条我最推荐。插上U盘之后立刻跑一次你能看到内核完整的识别过程包括USB版本、容量、分区扫描结果。如果U盘有问题比如供电不足、坏块、分区表损坏dmesg里几乎一定会留下线索。典型的正常输出是这样[Mon Mar 11 10:22:31 2024] usb 1-2: new high-speed USB device number 4 using xhci_hcd [Mon Mar 11 10:22:31 2024] usb 1-2: New USB device found, idVendor0781, idProduct5567 [Mon Mar 11 10:22:31 2024] sd 4:0:0:0: [sdb] 31116288 512-byte logical blocks: (15.9 GB/14.8 GiB) [Mon Mar 11 10:22:31 2024] sdb: sdb1如果只看到new high-speed USB device后面迟迟没有sdb: sdb1这样的分区识别行多半是U盘本身的问题分区表坏了或者供电不够。换个USB口尤其是台式机后置的、直连主板的那个口再试很多问题当场消失。1.3 卸载这个词在Linux里跟你想的不是一回事这里必须先澄清一个高频误解。你在搜索引擎里搜卸载跳出来一堆如何卸载oracle19c注册表homebrew卸载残留卸载qtwin工具箱怎么卸载那些说的都是软件卸载也就是uninstall把程序从系统里删掉。但U盘的卸载完全是另一件事英文是umount注意不是unmount少一个n意思是把文件系统从目录树上摘下来。U盘上的数据一个字节都不会动只是系统不再认这个挂载点缓存里的数据会被刷回设备之后你才能安全地把它拔掉。这两个概念混在一起导致很多新手看教程时一脸懵我不是要卸载U盘吗怎么让我删软件其实没关系记住一点就行本文讲的卸载全部指umount操作对象是设备或挂载点不是软件包。顺带提一句挂载这个概念在Linux世界里外延很广。你看到的alist挂载夸克网盘cifs挂载共享文件夹重启后失效飞牛nas存储空间未挂载这些说法本质上都是同一套逻辑——把某种存储资源接到本地目录树上。理解了U盘挂载这些场景你也能举一反三无非是后端从块设备换成了网络协议。2. 挂载U盘的三种方式按场景挑一种认清了设备接下来就是接上去。Ubuntu下挂U盘有三条路桌面环境自动挂、手动mount、以及给非root用户准备的udisksctl。三条路没有优劣之分只看你在什么环境、要干什么活。服务器上没有图形界面那就得手动挂自己的笔记本插上U盘想复制个文件自动挂最省事写脚本做批量备份那udisksctl或者fstab更合适。选错方式最常见的后果是两个一是权限不对文件能读不能写二是挂载点乱七八糟回头自己都忘了挂在哪卸载的时候找不到目标。下面把三种方式拆开讲清楚。2.1 桌面环境自动挂载方便背后发生了什么装了Ubuntu桌面版GNOME/KDE都一样你插上U盘文件管理器里立刻出现一个盘点进去就能用。这套自动挂载是udisks2这个守护进程在背后干活它监听内核的uevent检测到新块设备就自动执行挂载挂载点固定在/media/你的用户名/卷标名比如卷标是USB就挂在/media/you/USB。这个路径是udisks2约定的你不要去改它也不要把这个目录预先创建成别的用途否则自动挂载会失败或者挂到奇怪的地方。自动挂载的好处是省心坏处是不够透明。有几点要注意它默认按当前登录用户的uid/gid挂载权限基本是对的但如果U盘是NTFS而且有脏标志udisks2可能会以只读方式挂上去这时候你在文件管理器里怎么改都保存不了。它只在有活跃图形会话时工作。你用SSH连上去或者在CtrlAltF3的纯文本终端里自动挂载是不生效的盘不会自己出现。同一个U盘反复插拔挂载点一般不变但如果卷标是空的会变成/media/you/1a2b-3c4d这种UUID形式看着有点丑但不影响使用。如果你在服务器或者开发板上发现明明插了U盘却什么都没发生别怀疑U盘坏了先确认有没有图形会话再看udisks2服务是不是在跑systemctl status udisks22.2 手动mount参数怎么给才不踩权限的坑手动挂载的完整流程就三步建挂载点、挂上去、用完摘下来。听着简单但参数不给对权限问题立刻找上门。sudo mkdir -p /mnt/usb sudo mount /dev/sdb1 /mnt/usb就这两条U盘挂上了。但如果你不是root进/mnt/usb会发现文件要么读不了要么写不进去。原因在于mount默认按照U盘文件系统里记录的所有者信息来定权限FAT32/exFAT这两种文件系统根本不存储Unix的权限和属主信息内核只能给一个默认值通常归到root权限还可能是755或者700。解决办法是在挂载时显式指定归属sudo mount -o uid1000,gid1000,umask022 /dev/sdb1 /mnt/usbuid1000把文件所有者设成你的用户id -u可以查自己的uid。gid1000组也设成你的主组id -g查。umask022控制权限掩码022意味着目录755、文件644也就是别人能读不能写你自己能读写。这三个参数只对vfat、exfat、ntfs这类不存储Unix权限的文件系统有意义。挂ext4格式的分区时给这些参数反而会报错。记住这条规则就不会乱。还有一个容易被忽略的点挂载点目录本身最好提前建好并且是空的。如果你往一个已经有文件的目录上挂东西那些文件会被临时盖住卸载后才重新出现容易让人误以为是数据丢了。我一般用/mnt/usb或者/media/usb这种专门留出来的空目录别拿/home/you去挂那是自找麻烦。2.3 udisksctl不切root也能挂盘的办法手动mount需要sudo在多人共用的机器上或者你只是临时挂一下读个文件切root有点重。这时候可以用udisksctl它调用的还是udisks2那套机制但提供了命令行接口普通用户就能操作udisksctl mount -b /dev/sdb1执行后会告诉你挂到了哪个目录通常是/media/you/卷标。卸载同理udisksctl unmount -b /dev/sdb1-b后面跟的是块设备路径不是挂载点这一点跟umount正好相反别搞混。udisksctl还支持power-off可以在卸载后直接给U盘断电udisksctl power-off -b /dev/sdb这条命令的意思是卸载所有分区然后通知USB控制器断电。这是最安全的拔盘方式比你在文件管理器里点个弹出更彻底适合脚本里用。我写自动备份脚本的时候结尾一定会加上这条避免缓存没刷完就被人拔走。2.4 挂载点规划一个被严重低估的细节很多人挂U盘随手就是sudo mount /dev/sdb1 /mnt把整个/mnt当挂载点。用一次没事第二次换了个U盘还挂/mnt两次内容混在一起自己都分不清哪个是哪个。更糟的是有些系统在/mnt下有别的用途被你一挂就盖住了。我的习惯是给每类设备留固定目录命名按用途走挂载点用途备注/mnt/usb临时挂载U盘用完卸载不写fstab/mnt/backup备份盘长期挂载配合fstab自动挂/media/$USER/xxx桌面自动挂载别手动占用/mnt/iso临时挂载ISO或镜像用完就摘目录权限也要注意。如果你用sudo mkdir /mnt/usb建的目录属主是root普通用户写不进去挂载之后虽然挂载点权限会被U盘文件系统的权限覆盖但卸载之后你回头看这个空目录还是root的下次挂载如果参数没给对问题重现。干脆一开始就chown一下sudo mkdir -p /mnt/usb sudo chown $USER:$USER /mnt/usb这两句花不了十秒钟能避免后面一堆为什么我写不进去的困惑。3. 文件系统兼容性U盘插上打不开的真正原因U盘挂不上九成问题出在文件系统上而不是硬件。U盘常见的格式有四种FAT32vfat、exFAT、NTFS、以及少数被格式化成ext4的。前三种Ubuntu都能读但支持程度和需要的软件包不一样尤其exFAT和NTFS不同Ubuntu版本处理方式差别不小。还有一个高频现象U盘在Windows上好好的拿到Ubuntu上变成只读能打开但一个字都存不进去。这不是权限问题多半是文件系统有脏标志或者写保护需要单独处理。3.1 vfat、exFAT、NTFS在Ubuntu上的支持现状先说结论省得你一条条试vfatFAT32内核原生支持不用装任何东西。缺点是单文件不能超过4GB现在动不动就几个G的视频很容易撞墙。exFAT大文件友好跨平台通吃。Ubuntu 20.04之后内核里已经带了exfat驱动基本开箱可用更老的版本需要装exfat-fuse和exfat-utils。NTFSWindows的原生格式。现代内核支持读写但要用ntfs-3g这个用户态驱动才稳Ubuntu桌面版通常预装服务器版可能要手动补。ext4Linux自己的格式权限和属主信息齐全挂载参数最少缺点是Windows原生读不了除非装第三方工具。判断手上U盘是什么格式前面提到的blkid一句话搞定sudo blkid /dev/sdb1 # /dev/sdb1: LABELUSB UUID1A2B-3C4D TYPEvfat如果TYPE是exfat但系统里没有对应驱动挂载时会报wrong fs type, bad option, bad superblock这时候补包就行sudo apt update sudo apt install exfat-fuse exfatprogsNTFS这边如果mount报unknown filesystem type ntfs装ntfs-3gsudo apt install ntfs-3g装完之后mount -t ntfs-3g或者直接mount让它自动识别都可以。我个人建议显式写-t ntfs-3g避免内核自带的只读驱动抢先把盘挂成只读那种情况下你能看到文件但保存时提示只读文件系统非常迷惑。3.2 挂载参数对照表照着抄就行不同文件系统的挂载参数不一样给错了要么报错要么权限不对。下面这张表是我反复用过、验证没问题的组合你直接照抄文件系统推荐参数说明vfatuid1000,gid1000,umask022,iocharsetutf8iocharset解决中文文件名乱码exfatuid1000,gid1000,umask022exFAT默认UTF-8不需要iocharsetntfs-3guid1000,gid1000,umask022,windows_nameswindows_names禁止创建Windows非法字符文件名ext4defaults权限由文件系统自身记录不要覆盖完整命令示例sudo mount -t vfat -o uid1000,gid1000,umask022,iocharsetutf8 /dev/sdb1 /mnt/usb sudo mount -t exfat -o uid1000,gid1000,umask022 /dev/sdb1 /mnt/usb sudo mount -t ntfs-3g -o uid1000,gid1000,umask022,windows_names /dev/sdb1 /mnt/usb这里有个小细节值得多说一句umask和fmask/dmask的区别。umask同时作用于文件和目录fmask只管文件dmask只管目录。如果你想精确控制比如目录要可执行能进入文件不需要可以用fmask133,dmask022效果是文件644、目录755。多数情况下umask022就够了别给自己找麻烦。3.3 只读、乱码、脏标志三个高频顽疾的解法第一种挂上就是只读。典型报错是mount: /mnt/usb: WARNING: device write-protected, mounted read-only.或者dmesg里出现FAT-fs (sdb1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.这说明U盘上次在Windows或者其他系统上没有被正常弹出文件系统标记为脏。Linux对脏的FAT/NTFS会保守处理直接只读挂载防止你越写越坏。处理FAT32的脏标志sudo umount /dev/sdb1 # 先确保没挂上 sudo dosfsck -a /dev/sdb1 # 或 fsck.vfat -a-a表示自动修复。修完再挂如果dmesg没有告警就能正常读写了。处理NTFS的脏标志有个常用命令ntfsfixsudo ntfsfix -d /dev/sdb1注意ntfsfix只是清除脏标志、重置日志它不是完整修复工具。如果NTFS真的坏了它会把盘标记成需要检查最终还得回到Windows下用chkdsk /f跑一遍。这个认知很重要别指望在Linux下把损坏的NTFS彻底修好能救回文件就赶紧拷出来。第二种中文文件名变乱码。这是老生常谈根因是vfat不存储编码信息内核按默认字符集解释。解决办法就是挂载时加iocharsetutf8。如果加了还有问题检查你的locale设置localeLANG是zh_CN.UTF-8的话基本没问题。有些老U盘里存的是GBK编码的文件名那属于历史遗留只能拷出来之后自己改名挂载参数救不了。第三种物理写保护。有些U盘侧面有个小开关拨到锁定位置就只写不进去跟软件没关系。还有一种情况是U盘寿命到了闪存颗粒进入只读模式保护数据这种基本没救赶紧把重要文件拷出来换盘。dmesg里会反复出现I/O错误这是明确信号。4. 卸载U盘umount失败时的完整排查思路卸载这个动作顺的时候一条命令解决不顺的时候能把人折腾半小时。最常见的报错就一句umount: /media/you/USB: target is busy.翻译过来就是这个挂载点有人正在用我不让你摘。Linux这么设计是出于安全如果某个进程正在读这个目录你强行把文件系统摘掉轻则进程拿到一堆I/O错误重则数据写一半丢失。所以umount宁可失败也不硬来。4.1 target is busy 的三种成因和定位方法有人正在用分几种情况定位手法不一样情况一有进程的工作目录在这个挂载点里。比如你cd /mnt/usb之后忘了回来哪怕没在读文件只要shell还停在那个目录里umount就会失败。这种情况换个终端或者cd ~回去再卸就行属于最好解决的一种。情况二有程序打开了里面的文件。打开的文件句柄没释放比如你用编辑器开着里面的txt或者有个后台程序在扫描。定位命令sudo lsof D /mnt/usb这条会列出所有打开挂载点下文件的进程包括PID和进程名。看到之后要么正常退出那个程序要么kill掉。情况三文件管理器或者缩略图生成器偷偷在读。GNOME的文件管理器、图片查看器、甚至播放器都可能在你没注意的时候持有句柄。这类最难缠因为界面上看不出任何异常。fuser是另一个好用的工具一条命令看全sudo fuser -vm /mnt/usb输出会列出占用该目录的所有进程。确认那些进程可以杀掉之后sudo fuser -km /mnt/usb-k表示发送SIGKILL-m表示按挂载点匹配。执行完再umount基本就成功了。但要提醒一句fuser -km是强杀如果有程序正在往U盘写数据强杀可能导致文件不完整。所以优先用lsof看清是什么进程能正常退出的就正常退出。4.2 不同场景下的卸载命令除了标准的umount还有几个变体和配套命令按场景选场景命令说明普通卸载sudo umount /mnt/usb最常用按设备卸载sudo umount /dev/sdb1找不到挂载点时用非root卸载udisksctl unmount -b /dev/sdb1桌面自动挂载的盘懒卸载sudo umount -l /mnt/usb立刻从目录树摘掉等空闲再真正释放强制卸载sudo umount -f /mnt/usb网络文件系统常用本地盘慎用umount -llazy我偶尔会用比如批量脚本里不想被挂载点占用卡住。它的效果是路径立刻消失但文件系统在最后一个句柄释放前其实还活着。用完之后你直接拔盘数据仍有丢失风险所以这个参数适合我知道没人在写只是想快点摘掉的场景不适合当成万能解药。umount -f是强制对本地USB设备效果有限反而容易导致内核报一堆I/O错误我一般不用。还有一个高级玩法是用挂载点做卸载时不指定路径让umount自己找sudo umount /dev/disk/by-uuid/1A2B-3C4D用UUID定位的好处是不管你挂到哪个目录它都能找到对应的文件系统。写脚本的时候我倾向用这个比硬编码/dev/sdb1稳因为设备名插拔之后可能变UUID不会。4.3 卸载之后什么时候拔盘才安全这一步被无数人忽略然后抱怨我明明卸载了怎么文件还是坏的。原因在于Linux有写缓存。你往U盘拷文件cp命令返回时数据可能还在内存里没真正落到U盘。umount会自动触发一次同步把该写的都写下去所以正常卸载之后拔盘是安全的。但如果你用的是umount -l或者进程占用导致卸载不完全数据可能在缓存里。这时候多做一个动作syncsync把所有脏页刷到磁盘跑完再拔盘风险就小多了。养成习惯拔U盘之前敲一次sync尤其是刚从服务器上拷完大文件的时候。这个命令不花什么时间但能救你的数据。另外提一句udisksctl power-off -b /dev/sdb之所以最安全就是因为它先卸载再断电一步到位。如果你用的是桌面环境文件管理器里那个弹出按钮本质上就是这个操作。听到U盘指示灯灭或者系统提示可以安全移除再拔别抢那两秒钟。5. 让U盘开机自动挂载fstab写法和避坑指南到这里为止都是临时挂载重启就没了。如果你有个U盘或者移动硬盘是长期插着当备份盘用的每次开机手动挂太烦那就得写/etc/fstab。这是把双刃剑写对了省心写错了系统可能直接进不了图形界面掉到emergency mode里。所以这一节我要把字段含义和救援方法都讲透。5.1 为什么一定要用UUID而不是/dev/sdb1设备名不稳定这是核心原因。今天系统盘是sda你U盘是sdb明天你插了个读卡器识别顺序变了系统盘变sdbU盘变sdc你fstab里写的/dev/sdb1就指向系统盘的分区了。后果有多严重不用我多说。UUID是每个文件系统在格式化时生成的唯一标识跟插拔顺序无关跟设备名无关。用blkid查sudo blkid /dev/sdb1 # /dev/sdb1: LABELBACKUP UUID1A2B-3C4D TYPEvfat注意这里有两种UUID容易混vfat/exfat的UUID是1A2B-3C4D这种短格式叫FAT UUID长度短碰撞概率比ext4的高一些ext4/NTFS的是0E4A5B6C-7D8E-9F10...这种长格式。写fstab时用哪一种都行只要跟blkid输出的完全一致。如果确实碰到UUID冲突极少见可以用LABEL代替但卷标可能重复所以我更倾向UUID。5.2 fstab六个字段逐个拆解配一个能用的实例/etc/fstab每行六个字段用空格或Tab分隔设备 挂载点 文件系统 挂载参数 dump fsck顺序拿一个NTFS备份盘做例子UUID0E4A5B6C7D8E9F10 /mnt/backup ntfs-3g defaults,uid1000,gid1000,umask022,windows_names,nofail,x-systemd.device-timeout10 0 0逐项解释UUID...从blkid抄来的一个字符都不能错。/mnt/backup挂载点必须提前创建好否则挂载失败。ntfs-3g文件系统类型。defaults,uid...,...挂载参数defaults是基础项后面追加具体的。第一个0dump备份标志现代系统基本不用填0。第二个0开机fsck顺序。系统盘根分区一般是1其他分区填2或者0。U盘这类可插拔设备填0别让开机自检去检查它。vfat和exfat的例子UUID1A2B-3C4D /mnt/usb vfat defaults,uid1000,gid1000,umask022,iocharsetutf8,nofail 0 0 UUID1234-ABCD /mnt/exfat exfat defaults,uid1000,gid1000,umask022,nofail 0 0写完之后不要急着重启先用这条命令测试sudo mount -a它会按fstab把所有还没挂载的条目挂一遍。没有报错就说明语法正确。再df -h确认一下挂上了然后卸载再测一次。这个流程能帮你提前发现绝大多数问题别跳过。5.3 nofail和x-systemd.automount不写可能开不了机的两个关键字nofail是保命参数强烈建议所有非系统盘的fstab条目都加上。它的作用是开机时如果这个设备不存在或者挂载失败不要卡住启动流程继续往下走。没有nofail的话你哪天把U盘拔了再开机系统会等的等不到超时之后掉进emergency mode弹出个root密码提示不熟悉的人当场就慌。另一个值得加的现代写法是x-systemd.automountUUID1A2B-3C4D /mnt/usb vfat defaults,uid1000,gid1000,umask022,nofail,x-systemd.automount,x-systemd.idle-timeout60 0 0这个组合会让systemd按需挂载开机时不挂等你第一次访问/mnt/usb那一刻才挂上如果60秒没人用自动卸掉。对于那种偶尔才读一次的备份盘能省点资源也能避免设备不在时开机卡顿。代价是第一次访问会有轻微延迟能感觉到卡一下。万一fstab写错了开机进了emergency mode别慌按提示输入root密码然后mount -o remount,rw / nano /etc/fstab把自己写坏的那行删掉或者改成nofail存盘退出reboot。remount那一步是关键因为emergency mode下根分区默认是只读的不改写权限你连文件都保存不了。这个救援流程我建议你在虚拟机里先演练一遍真遇到的时候手就不抖了。6. 实战故障速查与几个特殊U盘的识别问题前面几节把原理和操作串完了这一节收拢一下给一份能直接查的表再聊聊那些长得不像普通U盘的设备怎么处理。6.1 常见故障速查表现象大概率原因处理办法插上无反应供电不足、USB口问题换后置USB口跑dmesg看识别日志有设备但没分区分区表损坏用fdisk看分区表必要时重建先备份数据挂载报wrong fs type缺驱动装exfat-fuse或ntfs-3g挂上只读脏标志或写保护dosfsck/ntfsfix检查物理开关写文件权限不足缺uid/gid/umask参数卸载后用正确参数重挂umount报target is busy进程占用lsof D或fuser -vm定位退出后再卸卸载后文件损坏缓存未刷卸载前sync或用udisksctl power-off开机卡在emergency modefstab写错进root shellremount后修fstab排查顺序我一般固定成一条线lsblk看设备在不在blkid看文件系统是什么dmesg看内核报什么错mount试一次看具体报错lsof处理卸载占用。按这个顺序走九成的U盘问题十分钟内能定位。6.2 系统启动盘、多分区U盘设备名看着奇怪怎么办用rufus或者某些装机工具做的Windows启动盘插到Ubuntu里lsblk会显示两个甚至三个分区。典型结构是一个大FAT32分区放安装文件加一个16MB左右的小分区叫Microsoft basic data或者msftres。你去挂那个小分区十有八九挂不上报wrong fs type或者cant read superblock。这不是U盘坏了是那个小分区的用途很特殊里面不是常规文件系统是给UEFI引导用的。它本来就不该被挂载。你只要挂那个大的FAT32分区就行小分区别去动。还有一种情况是U盘被做成混合分区表同时有MBR和GPTfdisk会提示Detected GPT and MBR之类的警告。这种盘在Linux下看分区可能和Windows下不一致因为两套表描述的布局有出入。碰到这种我的建议是如果只是要拷贝文件挂上能用的那个分区就行如果是要重新格式化这个U盘用wipefs清干净再重建分区表sudo wipefs -a /dev/sdb sudo parted /dev/sdb mklabel msdos sudo parted /dev/sdb mkpart primary fat32 1MiB 100% sudo mkfs.vfat -F 32 /dev/sdb1wipefs -a会把所有旧的文件系统签名清掉避免残留信息干扰。这一步是破坏性操作执行前务必用lsblk再看一眼设备名确认是sdb而不是sda。顺便说一句现在有些U盘出厂就是exFAT格式容量大单文件不受4GB限制很适合用来装视频素材。但如果你要拿它做Linux启动盘很多老主板不支持从exFAT引导还是得转成FAT32。这类格式转换的需求我在做安装盘的时候遇到过好几次用mkfs.vfat重新格式化是最省事的办法。6.3 一个真实场景开发板插U盘识别不到最后讲一个我在开发板上遇到的坑跟前文不重复。有些开发板通过USB口给设备供电同时想接U盘。这时候如果供电不足U盘会不停地重新枚举dmesg里反复出现new USB device和device disconnected。判断方法跑dmesg -w实时看如果几秒内反复刷同一个设备被识别又断开基本就是供电问题。解决办法有两个一是给开发板接独立电源二是用带独立供电的USB Hub。软件层面怎么调都治不了这个病。还有一种情况是开发板的USB控制器驱动不完整dmesg里能看到设备识别了但lsblk里死活不出分区。这种通常得看内核有没有加载对应的存储驱动模块lsmod | grep usb_storage确认一下。模块没加载就modprobe usb_storage手动加能识别之后写进/etc/modules让它开机自动加载。这类问题排查下来你会发现U盘本身没问题是宿主设备的环境不完整。所以每次遇到U盘挂不上先别急着骂U盘顺着dmesg往下看线索都在日志里。我自己这些年的体会是U盘挂载和卸载这件事命令加起来不到十条但真正能用顺靠的是对设备识别、文件系统、权限归属、缓存同步这四件事的理解。你不理解权限就会一直被只读困扰不理解缓存就会丢数据不理解设备命名就可能在某个困倦的下午敲错一个字母然后面对一台没法启动的机器。花半小时把这篇里的命令在自己机器上跑一遍尤其是lsblk、blkid、dmesg、fuser这几条比存一堆教程链接有用得多。真要给个最实用的建议那就是任何对U盘的写操作之前先lsblk看清设备名任何拔盘之前先sync一次这两个习惯能帮你躲掉九成的麻烦。
返回列表