简介:这份PDF面向Linux系统运维初学者与需要了解传统存储介质管理的开发者,系统梳理了在Linux命令行下对软盘进行格式化与备份的完整知识。内容涵盖软盘设备文件识别(如/dev/fd0、/dev/fd1)、fdformat低级格式化、mke2fs创建ext2文件系统、mount挂载访问,以及setfdprm调整软盘参数等关键操作,并延伸介绍taper备份程序在软盘、硬盘与磁带等介质上的档案管理用法。资源包共1个PDF文件,约129KB,篇幅精炼,适合作为系统开发与存储设备管理的参考文献随时查阅。目前已有112人学习,读者可从中掌握软盘格式化的命令流程、设备参数配置思路与备份恢复工具的使用方法,为理解更复杂的存储设备管理打下基础。
1. 软盘格式化在 Linux 下到底还能不能干:一次把 fdformat 与 mkfs.fat 讲透
手里还攥着一盒 3.5 英寸软盘的人,多半不是怀旧,而是被某台老设备卡住了——数控机床、老式示波器、九十年代的工控机,它们只认 1.44MB 的 FAT12 软盘。把软盘插进 Linux 机器,lsblk能看到/dev/sdb,可双击挂载报错,dd写进去的镜像设备又不认。问题往往不在数据,而在软盘本身没被正确格式化。Linux 下软盘格式化这件事,核心就两条命令:fdformat负责物理低级格式化,mkfs.fat负责写文件系统。听起来简单,但软盘这种介质有它自己的脾气——磁头脏了、盘片老化、USB 软驱主控芯片千奇百怪,任何一环出问题都会让你怀疑人生。这篇笔记面向两类人:一类是手上有老设备必须喂软盘的运维和嵌入式工程师,另一类是好奇 Linux 底层块设备操作、想拿软盘练手的学习者。下面从设备识别一路讲到坏盘判定,命令都能直接抄。
2. 先认清设备:软盘在 Linux 里长什么样
软盘和 U 盘最大的区别是它没有固件帮你兜底。U 盘主控会做坏块管理、磨损均衡,你只管写文件系统;软盘是裸磁介质,磁道、扇区、间隙都得靠主机端控制器和驱动去对齐。所以第一步不是急着敲命令,而是搞清楚/dev下哪个节点对应你的软驱,以及内核有没有把它当软盘对待。
2.1 内置软驱与 USB 软驱的设备节点差异
内置软驱走主板 FDD 接口,内核模块是floppy,设备节点固定为/dev/fd0,主设备号 2。你可以用lsmod | grep floppy确认模块加载,用dmesg | grep -i fd0看内核识别到的驱动器类型。如果/dev/fd0不存在,先modprobe floppy,再检查 BIOS 里软驱控制器是否被禁用——很多新主板默认关掉 FDD,插了排线也没用。
USB 软驱完全是另一回事。它本质是一个 USB 大容量存储设备,内核用usb-storage驱动,设备节点是/dev/sdX,和 U 盘一个待遇。这意味着fdformat对 USB 软驱通常无效,因为fdformat依赖floppy驱动提供的低级格式化 ioctl,而 USB 软驱的主控不暴露这个接口。这是新手最容易翻车的地方:照着老教程敲fdformat /dev/sdb,直接报Operation not supported。
# 查看所有块设备,找到软驱对应的节点 lsblk -o NAME,SIZE,TYPE,TRAN,MODEL # 内置软驱典型输出:fd0 1.4M disk # USB 软驱典型输出:sdb 1.4M disk usb # 确认内核识别到的软驱类型(内置) dmesg | grep -iE 'floppy|fd0' # 查看 USB 软驱的厂商和产品 ID lsusblsblk的TRAN列是关键:显示usb就是 USB 软驱,显示空或fd就是内置。SIZE显示 1.4M 基本可以确认是 1.44MB 软盘。如果显示 1.2M 或 720K,说明盘片类型或驱动器设置不对,后面格式化参数要跟着改。
2.2 用 setfdprm 处理非标准容量与驱动器参数
标准 3.5 英寸高密盘是 80 磁道、每道 18 扇区、每扇区 512 字节,合计 1.44MB。但市面上还有 720KB 低密盘、1.2MB 5.25 英寸盘,以及一些工控设备用的非标准格式。setfdprm用来告诉floppy驱动当前盘片的几何参数。
# 查看当前 fd0 的参数 setfdprm -p /dev/fd0 # 设置为 1.44MB 标准参数 setfdprm /dev/fd0 1440/1440 # 设置为 720KB 参数 setfdprm /dev/fd0 720/720 # 自定义:80 磁道 18 扇区 2 面 setfdprm /dev/fd0 80/18/2/512参数格式是磁道数/每道扇区数/面数/扇区字节数,简写1440/1440表示标准 1.44MB。改完参数后必须重新做低级格式化,否则文件系统按新几何写入会错位。这一步在 USB 软驱上同样无效,因为参数由主控固件决定,主机端改不了。
提示:
setfdprm只对内置软驱的floppy驱动有效。USB 软驱的几何参数是固定的,遇到非标准容量盘片只能换驱动器或换盘。
3. 低级格式化:fdformat 的正确用法与失败排查
低级格式化做的是在盘片上重新划分磁道和扇区,写入地址标记和间隙。这一步会抹掉盘上所有数据,包括文件系统。对内置软驱,fdformat是标准工具;对 USB 软驱,这一步通常跳过,直接进文件系统创建。
3.1 fdformat 命令拆解与验证写入
# 基本用法:对 /dev/fd0 做低级格式化并校验 fdformat /dev/fd0 # 不校验(快但不可靠,不推荐) fdformat -n /dev/fd0 # 指定设备时确认没有挂载 umount /dev/fd0 2>/dev/null # 执行格式化,观察输出 fdformat /dev/fd0 # 输出示例: # Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB. # Formatting ... done # Verifying ... donefdformat默认会做校验(verify),逐扇区读回比对。校验通过说明盘片物理状态良好;如果卡在某个百分比或报io error,说明该位置有坏道。-n跳过校验能省一半时间,但软盘这种介质跳过校验等于赌运气,我一般不用。
格式化完成后,fdformat只是把盘变成一张“白纸”,还没有文件系统。此时mount会报wrong fs type,这是正常的,下一步才是mkfs。
3.2 USB 软驱为什么 fdformat 报 Operation not supported
USB 软驱的主控芯片(常见的是 SMSC USB97C210 之类)把低级格式化封装在固件里,主机端只能通过 SCSI 命令集做有限操作。fdformat依赖的FDRAWCMDioctl 在usb-storage驱动上不存在,所以直接报错。
# USB 软驱上执行 fdformat 的典型报错 fdformat /dev/sdb # fdformat: /dev/sdb: Operation not supported # 确认设备走的是 usb-storage readlink -f /sys/block/sdb/device/driver # 输出:.../drivers/usb-storage遇到这种情况,不要折腾fdformat,直接跳到mkfs.fat。USB 软驱在写入文件系统时会由主控完成必要的磁道对齐,效果等同于低级格式化。如果mkfs.fat也失败,多半是盘片物理损坏或驱动器磁头脏了,换盘或清洁磁头。
注意:有些 USB 软驱对
mkfs.fat写入的 FAT12 参数敏感,必须显式指定-F 12,否则默认可能按 FAT16 处理导致老设备不认。
4. 写文件系统:mkfs.fat 参数怎么设才被老设备认
低级格式化完成后,盘上还没有任何文件系统结构。老设备认的是 FAT12,这是软盘时代的默认格式。Linux 下用mkfs.fat(属于dosfstools包)来创建,关键参数是-F 12和卷标。
4.1 FAT12 与 FAT16 的选择依据
1.44MB 软盘理论上 FAT12 和 FAT16 都能用,但 FAT12 是事实标准。FAT12 的簇数量上限是 4085,1.44MB 盘按 512 字节簇算正好 2880 个扇区,落在 FAT12 范围内。FAT16 虽然也能建,但很多老设备的固件只实现了 FAT12 解析,遇到 FAT16 直接报“磁盘未格式化”。
# 安装 dosfstools(如果系统没有) # Debian/Ubuntu apt install dosfstools # RHEL/CentOS/Rocky dnf install dosfstools # 创建 FAT12 文件系统,指定卷标 mkfs.fat -F 12 -n "DATA" /dev/fd0 # 输出示例: # mkfs.fat 4.2 (2021-01-31) # /dev/fd0 has 2880 sectors and 0.0 MiB free # 卷标 DATA 写入引导扇区 # USB 软驱同样命令,设备名换成 /dev/sdb mkfs.fat -F 12 -n "DATA" /dev/sdb-F 12强制 FAT12,-n指定卷标,卷标最长 11 字符,老设备有时靠卷标识别盘片。如果不指定-F,mkfs.fat会根据容量自动选择,1.44MB 通常选 FAT12,但显式指定更保险。
4.2 挂载验证与写入测试
格式化完必须挂载验证,确认文件系统可读写、容量正确。
# 创建挂载点 mkdir -p /mnt/floppy # 挂载 mount -t vfat /dev/fd0 /mnt/floppy # 查看容量和文件系统类型 df -h /mnt/floppy # 输出应显示约 1.4M 容量,Filesystem 类型 vfat # 写入测试文件 echo "hello floppy" > /mnt/floppy/test.txt # 同步并卸载 sync umount /mnt/floppy # 重新挂载确认数据还在 mount -t vfat /dev/fd0 /mnt/floppy cat /mnt/floppy/test.txtdf -h显示的容量会比 1.44MB 略小,因为 FAT 表和引导扇区占了一部分,正常现象。如果挂载报VFS: Can't find a valid FAT filesystem,说明mkfs.fat没写成功或设备节点不对。如果写入时报No space left on device但盘是空的,检查是不是 FAT16 被误建,用file -s /dev/fd0看文件系统类型。
提示:软盘写入速度慢,
sync命令必须执行,否则拔盘或断电会导致数据没落盘。老设备读取前也建议在 Linux 上先fsck.fat检查一遍。
5. 避坑与排查:软盘格式化最常见的 5 个翻车现场
软盘这东西,玄学成分不小。同样的命令,换台机器、换个驱动器、换盒盘,结果可能完全不同。下面这 5 条是我踩过的坑,按现象、原因、解决三段式记录。
5.1 现象:fdformat 卡在 Verifying 不动,最后报 io error
原因:盘片有物理坏道,或者驱动器磁头脏了。软盘是磁性介质,存放久了会退磁,磁头积灰也会导致读写失败。
解决:先换一张确认好的盘片试,排除盘的问题。如果换盘正常,说明原盘坏了,别浪费时间。如果换盘还报错,用清洁盘(专用清洁软盘)清洁磁头,或者拆开驱动器用无水酒精棉签轻擦磁头。注意别用棉花,纤维会挂在磁头上。
5.2 现象:mkfs.fat 成功,但老设备提示“磁盘未格式化”
原因:文件系统类型不对,或者引导扇区参数不被老设备固件接受。常见的是建成了 FAT16,或者 OEM 标识、BPB 参数与设备预期不符。
解决:用file -s /dev/fd0确认是 FAT12。如果显示 FAT16,重新mkfs.fat -F 12。如果已经是 FAT12 还不认,尝试用mkfs.fat -F 12 -I忽略一些检查,或者用dd写入一个已知可用的软盘镜像做对照。有些工控设备只认特定卷标,把卷标改成设备手册里写的。
5.3 现象:USB 软驱在 Linux 下识别为 /dev/sdb,但 mount 报 “no medium found”
原因:USB 软驱主控没有检测到盘片,或者盘片没插到位。软盘插入需要听到“咔哒”一声,弹出按钮弹起才算到位。
解决:重新插拔盘片,确认到位。用dmesg | tail看内核有没有报介质变化。如果还是不行,换一个 USB 口,有些 USB 3.0 口对老 USB 1.1 软驱兼容性差,换到 USB 2.0 口。另外检查lsblk的 SIZE 列,如果显示 0 或者没有,说明主控没识别到盘。
5.4 现象:格式化后容量只有 1.2MB 或 720KB
原因:setfdprm参数没设对,或者盘片本身是低密盘。1.44MB 盘片和 720KB 盘片外观一样,但磁介质不同,高密驱动器可以格式化低密盘,但容量只有一半。
解决:用setfdprm /dev/fd0 1440/1440强制标准参数,重新fdformat。如果还是 720KB,说明盘片是低密盘,只能按 720KB 用。低密盘在老设备上反而更常见,别扔。
5.5 现象:写入文件后老设备读出来是乱码或文件名不对
原因:字符编码或文件名格式问题。FAT12 用 8.3 短文件名,Linux 下mount -t vfat默认可能用 UTF-8 编码长文件名,老设备只认 ASCII 短名。
解决:挂载时加iocharset=ascii和shortname=lower选项,强制短文件名和小写。写入时文件名不超过 8 个字符,扩展名不超过 3 个,全用大写或小写 ASCII。
# 挂载时指定兼容老设备的选项 mount -t vfat -o iocharset=ascii,shortname=lower,utf8=0 /dev/fd0 /mnt/floppyiocharset=ascii确保文件名按 ASCII 解释,shortname=lower把长文件名截断为短名并转小写,utf8=0关闭 UTF-8 转换。这三个选项组合基本能兼容绝大多数老设备。
6. 进阶技巧:用 dd 做软盘镜像备份与批量复制
软盘最大的风险是物理损坏,一旦坏了数据就没了。所以格式化完、写入数据后,第一件事应该是做镜像备份。dd是软盘镜像的标准工具,但直接dd整个设备会包含未使用扇区,镜像大小固定 1.44MB。更精细的做法是按文件系统实际使用量做压缩镜像。
# 完整镜像备份:从软盘读到文件 dd if=/dev/fd0 of=floppy_backup.img bs=512 count=2880 # 从镜像恢复到软盘 dd if=floppy_backup.img of=/dev/fd0 bs=512 count=2880 # 压缩镜像(软盘数据通常重复度高,压缩率很好) gzip -9 floppy_backup.img # 恢复时先解压 gunzip floppy_backup.img.gz # 批量复制:一张母盘复制到多张目标盘 for i in 1 2 3 4 5; do echo "请插入第 $i 张目标盘,按回车继续" read dd if=floppy_backup.img of=/dev/fd0 bs=512 count=2880 sync echo "第 $i 张完成" donebs=512 count=2880精确对应 1.44MB 软盘的 2880 个扇区,不多不少。如果软驱是 USB 的,设备名换成/dev/sdb,但count可能因主控不同需要调整,用blockdev --getsize /dev/sdb查实际扇区数。批量复制时每张盘写完必须sync,否则拔盘会丢数据。
镜像文件还可以用mtools工具集在不挂载的情况下直接读写,适合脚本化处理。mcopy、mdir、mdel这些命令操作的是镜像文件,不碰物理设备,速度快且不依赖软驱。
# 安装 mtools apt install mtools # 配置 mtools 使用镜像文件 echo "drive a: file=\"$PWD/floppy_backup.img\" exclusive" > ~/.mtoolsrc # 列出镜像内容 mdir a: # 复制文件到镜像 mcopy test.txt a:/ # 从镜像复制出来 mcopy a:/test.txt ./mtools的配置文件里file=指向镜像路径,exclusive表示独占访问。这样操作镜像就像操作真实软盘,但速度快几个数量级,适合批量制作母盘镜像。
我自己的习惯是:每张软盘格式化完先做一次dd全盘镜像存着,写入数据后再做一次增量镜像。老设备现场出问题时,直接拿镜像恢复到新盘,比现场重新格式化快得多。软盘这东西,后悔药就是镜像。希望帮到你。
本文还有配套的精品资源,点击获取