新千年的软盘

作者:Rick Moen

2002 年末,我的妻子给我买了一个 Easy Disk USB 闪存设备,它基于 NAND 型闪存芯片和 ARM7 控制器。这是一个可爱的小塑料玩意,大小和形状像粗短的雪茄或宽笔,为了方便起见,我经常把它放在口袋里。这个特殊的设备容量为 32MB,在您当地的 PC 兼容机商店售价约为 10-20 美元,但有各种容量可供选择,以 2 的幂递增,最高可达 2GB,售价约为 600 美元。今天市场上最划算的选择可能是 256MB,售价约为 80-90 美元;尽管随着制造商不断扩大市场,产品和价格都在不断变化(表 1)。较小的单元似乎正在随着库存耗尽而消失,而 2GB 的单元才刚刚进入市场。

表 1. 典型市场价格

容量价格(美元)每 MB 价格
8MB$28$3.50
16MB$21$1.31
32MB$30$0.93
64MB$40$0.63
128MB$58$0.45
256MB$91$0.36
512MB$170$0.33
1GB$321$0.31
2GB$600$0.29
Floppies for the New Millennium

图 1. 两个 USB 闪存驱动器。左:我的 32MB Easy Disk。右:我妻子的 128MB Soyo Pen Drive Pro。Easy Disk 的连接点在其防尘帽上,因此当业务端在使用时,防尘帽仍留在您的钥匙链、皮带或其他任何地方。Soyo(像大多数闪存驱动器一样,不幸的是)错误地将其连接点放在了错误的一端。

对于一些计算机用户来说,最终使 USB 成为日常计算一部分的小工具是数码相机或扫描仪,或者 USB 鼠标或键盘。对我来说,它是这个朴实无华的小部件。为什么?因为它解决了我们过去用软盘解决的相同问题,并更新到现代性能和容量标准。

软盘本身由于容量、速度和可靠性低而过时了,但是机器之间临时文件传输的需求比以往任何时候都更加强烈,特别是对于我们这些携带笔记本电脑旅行的人来说。理想情况下,每个人都应该拥有兼容的 802.11a、b 或 g 无线或红外网络,或者能够插入可用的以太网集线器,但这在近期内不会可靠地实现。即使是交叉以太网电缆,在硬件层面上是万无一失且紧凑的,也需要两端的软件协作,但这通常不会发生。

Iomega Zip 磁盘对于高达 100MB 的容量来说很可爱,但大多数人没有驱动器。CD-R/CD-RW 驱动器更像是一种存档介质,而不是随意的磁盘存储,因为必须组装和刻录会话数据才能创建它们。按照现代标准,软盘太慢、太容易出错且太小。因此,存在一个功能缺口,USB 闪存驱动器很好地填补了这个缺口。它们速度快、容量大、非易失性、耐用、紧凑、便宜,并且与所有最新的 PC 和 Mac 兼容,无论操作系统如何。

当 USB 首次出现在 PC 上时,物理连接像 Easy Disk 这样的设备需要费力地绕到系统单元的后面板才能找到 USB 端口。您仍然有时会遇到这种情况,尤其是在 USB 端口一直未使用的 PC 上。经常使用这些端口的人倾向于将 USB 集线器连接到它们以方便访问,例如越来越多地内置到当前生产的显示器中的集线器。此外,许多较新的工作站机箱设计将其 USB 端口移至前面板。

物理特性和磨损

硬塑料外壳内部的存储介质是 NAND 型闪存,它既不是鱼也不是鸟。它不像经典的(但奇特的)电子磁盘驱动器那样是易失性的。写入闪存盘的材料将保持良好状态十年或更长时间,无需交流电源或电池。它不像硬盘那样脆弱,也没有像硬盘、软盘和 Zip 磁盘那样的移动部件。它的写入操作速度约为 1MB/s,比 CD-R 甚至 CD-RW 驱动器慢得多,并且与硬盘驱动器相比速度较慢。另一方面,读取操作速度快约五倍,并且不会磨损设备。

关于 NAND 闪存盘的文献表明,它们在约 10,000 次擦除/写入循环后会磨损,考虑到您听不到任何故障迹象,这很可能会悄悄发生。任何写入操作都需要板载控制器芯片首先将一个相当大的数据块(通常为 8 或 16KB)归零。最终的块故障将因过多的擦除/写入循环而导致疲劳而发生,最好的情况是需要控制器芯片的硬件级 ECC 功能将整个块标记为坏块,最坏的情况是导致设备故障,如果关键的文件系统信息存储在那里。

关键是,尽管设计鼓励您将闪存盘视为随机访问设备,但它们的磨损特性更像磁带等顺序介质。因此,当使用闪存盘作为 Linux 大容量存储时,您应该在软件层面采取措施来限制磨损。

除了 USB 外形尺寸外,您还可以在 PC 卡 (PCMCIA) 设备中找到 NAND 型闪存——以及半打或更多种密切相关的物理格式,这些格式通常用于数码相机、PDA、手机等中的数据存储:CF(CompactFlash)、MMC(MultiMedia Card)、SD(Secure Digital)、SmartMedia、Memory Stick、XD-Picture、Microdrive 和 Memory Gate。后几种闪存类型中的大多数甚至可能全部都省略了使 USB 闪存盘能够自我监控 ECC 目的、支持启动代码等的逻辑电路,更接近于具有标准访问端口的简单闪存存储。您将遇到的大多数关于闪存设备的提及都将证明与 CF 型介质或类似介质有关;注意不要将这些与 USB 闪存驱动器混淆。

给定一个 64MB 的 USB 闪存盘,应该能够将整个 Linux 迷你发行版(例如 LNX-BBC)放在上面。如果您的机器的 BIOS 支持从 USB 启动,那么进行实验可能是值得的。

在 Linux 上配置 USB

我们这些老式 x86 Linux 用户一直对 USB 不太感冒。在 2.2 内核时代,我们最初听说人们需要解决驱动程序问题才能使用他们花哨的数码相机,并认为“让他们去折腾吧,反正不是我们”。Linux USB 支持最初由 Inaky Perez Gonzalez 开创,然后由 Linus Torvalds、Greg Kroah-Hartman 和其他人重写,最初进展艰难。

然后,USB 扫描仪、打印机、鼠标、摄像机、ISDN 和 xDSL 设备、调制解调器、软盘驱动器、扬声器、操纵杆、数字平板电脑、MP3 播放器、无线设备、PDA、各种大容量存储设备以及几乎所有其他东西都涌入了市场——USB 开始看起来不再像我们过去经常嘲笑的无用串行总线。幸运的是,内核的驱动程序支持在过渡期间赶上了,但它的架构对于许多人来说可能有点陌生。如果您幸运的话,您的发行版会让混乱的细节淡化到后台,但如果不是这样,请继续阅读。

Linux 的 USB 支持首先需要内核识别您主板的 USB 芯片组,它将是 UHCI(Intel)或 OHCI 类(Compaq 和其他公司)设备,分别需要 usb-uhci 或 usb-ohci 内核驱动程序。(两者也都需要 usbcore 驱动程序。)如果lspci -v返回的 USB 信息包括I/O 端口在,那么您有一个 UHCI 控制器。如果返回的 USB 控制器文本包括内存位于,那么它是 OHCI。

当您完成模块加载调整(如有必要)后,lsmod的输出应包括所有三个必需的驱动程序。例如,我的笔记本电脑列出了

Module              Size  Used by    Not tainted
usb-uhci           20676   0  (unused)
usb-storage        97120   1
usbcore            48000   1  [usb-uhci usb-storage]

usb-storage 驱动程序是一个转换器,它允许使用 SCSI 块设备名称来寻址随机访问类型的 USB 设备——我们稍后将回到这一点。如果没有它,您将需要一些其他中介来从 USB 层访问文件,例如 gPhoto2 应用程序。

如果您运行的是 2.3.38 或更高版本的内核(并且此时您真的应该升级到 2.4.x 或更高版本),您还应该将以下行添加到 /etc/fstab 以启用 USB 设备跟踪

none  /proc/bus/usb  usbdevfs  defaults  0  0

在此之后,输入mount -a。现在,除了挂载实际的大容量存储设备外,您都完成了。上述步骤不会挂载设备——usbdevfs 严格来说是一个类似于 /proc 的抽象支持文件系统,供 USB 子系统使用。

以上所有 USB 配置细节都应由现代 Linux 安装程序自动处理,但此处介绍它是为了以防万一。如果您足够幸运,您所需要做的就是将驱动器插入 USB 端口或集线器并挂载它。

挂载和管理闪存驱动器

我创建了一个挂载点目录 /mnt/fob,用于挂载闪存驱动器。这个名称源于驱动器的大小与钥匙扣或旧怀表(fob watch)大致相同,以大致相同的方式潜伏在人的裤子口袋里。

那是容易的部分。接下来是一段疯狂的旅程,试图弄清楚如何正确挂载它。我浏览的在线资料表明,USB 闪存驱动器与 Iomega Zip 磁盘一样,将被视为 SCSI。插入 Easy Disk 后,快速浏览 /proc/scsi/scsi 可以清楚地看到它被识别为第一个 SCSI 设备,而且它还是 M-Systems, Inc. OEM 生产的重新命名的 DiskOnKey 设备。因此,直觉建议挂载 /dev/sda1(在其他基于 IDE 的系统上),但事实证明直觉在 Easy Disk 的情况下是完全错误的。尝试这样做导致了这个令人困惑的错误

guido:~# mount -t vfat /dev/sda1 /mnt/fob
mount: block device /dev/sda1 is write-protected,
mounting read-only
mount: /dev/sda1 is not a valid block device

据报道,其他一些 USB 闪存驱动器确实以这种方式精确挂载,而我发现 Easy Disk 作为 /dev/sda 挂载,而不是 /dev/sda1 或任何其他分区号——也就是说,它将驱动器视为缺少容纳分区表的能力的设备。对这种好奇心的解释原来在于 1997 年 Compaq 和 Phoenix 制定的 ATAPI 可移动媒体设备 (ARMD) BIOS 规范,该规范概括了软盘式驱动器在 ATA 总线上应如何表现,以预测传统软盘驱动器将走向没落。ARMD 设备基本上是大型软盘,根据规范,它们没有分区表。因此,Easy Disk 碰巧是 ARMD(软盘式)设备。显然,相比之下,许多其他 USB 闪存盘被视为常规 ATAPI 驱动器。

像大多数闪存设备一样,Easy Disk 预格式化了 MS-DOS FAT 文件系统。当然,这引发了一个问题,即是否可以将其重写为使用不那么古老的磁盘格式。我从未对此进行测试,部分原因是 FAT 尽管有其缺点,但几乎所有 UNIX 工作站、Mac 和 MS Windows 计算机都支持它。部分原因是,为了减少设备疲劳,我避开了尝试其他文件系统。

现在,进一步详细说明 mount 命令

# mount -o uid=1000,gid=1000,noatime -t vfat \
/dev/sda /mnt/fob/

uid 和 gid 挂载选项是我自己的登录帐户的选项,用于设置文件所有权。更重要的是 noatime,提供它是为了消除不必要的擦除/写入循环。不要忘记,仅仅在任何目录上执行ls操作也会增加文件的 atime(访问时间)。

眼尖的读者可能会想:“等等,FAT 文件系统上没有 atime!”没错。每个文件或目录只有一个时间戳字段,但 Linux 通过在通常会更新 atime、mtime 或 ctime 的任何场合更新该单个时间值来处理这个问题。因此,即使在 FAT 上,禁用 atime 仍然可以减少擦除/写入操作的频率。

所有这些挂载选项都可以并且应该放在 /etc/fstab 中

/dev/sda  /mnt/fob  vfat
↪uid=1000,gid=1000,user,noauto,noatime 0 0

还有一个奇怪之处——无论您做什么,闪存盘始终以只读方式挂载

mount: block device /dev/sda is write-protected,
mounting read-only

即使您在挂载选项中指定了 rw,也会发生这种情况。但是,您随后可以通过使用 rw 选项重新挂载来在挂载闪存盘后启用写入访问权限

# mount -o rw,remount /mnt/fob

究竟为什么 /bin/mount 坚持认为闪存盘是写保护的并且必须以只读方式挂载是一个真正的谜。尽管据报道,一些闪存盘的塑料外壳上装有写保护开关,但 Easy Disk 没有。我最好的猜测是,mount 正在听取 Easy Disk 的内置控制器芯片的请求,旨在最大限度地减少意外的设备疲劳。而且它奏效了。作为一项附带好处,只读默认设置似乎使您在不可避免地忘记先卸载设备时拔下设备变得无害——使其真正成为热插拔设备。

口袋里的硬盘驱动器

在应对了为闪存驱动器(或笔式驱动器,因为它们有时被称为)配置 Linux 支持的障碍和细微的怪癖之后,最令人印象深刻的是这些设备如何融入背景。您只是简单地依赖它们并认为它们是理所当然的,这是任何真正成功的技术的标志。您经常使用的文档和应用程序、GnuPG 和其他加密密钥以及您需要在计算机之间传输的文件(无论操作系统如何)都存储在闪存盘上并放入您的口袋。您不必担心磁场、机械冲击、自发性位腐烂或任何其他问题。它只是插入一个空闲端口并工作。没有其他任何东西能与之媲美。

资源

关于在闪存驱动器上使用 Linux 的文章,该驱动器注册为 /dev/sda1 而不是 /dev/sda:www.gctglobal.com/Download/3rd_LED/PalmKey/palmkey.html

ATAPI 可移动媒体设备 (ARMD) BIOS 规范,以前称为 ATAPI 可移动驱动器 (ARMD) 规范:www.phoenix.com/resources/specs-atapi.pdf

Linux 还支持 CF 设备,并且可以从中启动。请参阅 Linux 站点的内存技术设备 (MTD) 子系统:www.linux-mtd.infradead.org

Rick Moen 是旧金山湾区的系统管理员、作家和 IT 人员,他是该地区 Linux 社区的长期成员,他为该社区运营一个即将发生的事件的在线日历,BALE(湾区 Linux 事件,linuxmafia.com/bale)。

加载 Disqus 评论