USB 闪存操作指南

尼科·绍尔

高级研究部门
比勒陀利亚大学,南非


           
       

修订历史
修订版 0.062004-03-10修订者:ns
添加了关于 Linux-2.6 的章节。
修订版 0.052003-12-26修订者:ejh
技术审查。
修订版 0.042003-12-11修订者:ns
修订版 0.032003-12-02修订者:ejh
技术审查。
修订版 0.022003-10-30修订者:ns
更改于 2003-11-20

本文档描述了安装 USB 闪存设备的步骤,以及将它们格式化为各种文件系统的方法,例如 vfat(它们通常的格式)和 ext2(更适合 Linux 的格式)。本文档还描述了如何将设备分区为具有不同文件类型的两个部分。


目录
1. 目的
2. 物理设备
3. 购买闪存盘
4. 阅读材料
5. 硬件和内核
5.1. 设置
5.2. 内核选项
5.3. 注释
6. 一些基本概念
6.1. /proc 文件系统
6.2. SCSI 设备
6.3. USB 设备文件系统
6.4. ext2 文件系统
6.5. vfat 文件系统
6.6. 命令选项说明
7. 基本验证
7.1. 快速检查
7.2. 探测 /proc 文件系统
7.3. 挂载 USB 文件系统
7.4. 测试 -- vfat
8. 设置 Ext2 文件系统
8.1. 分区
8.2. 创建 ext2 设备
8.3. 测试 -- ext2
9. 设置双分区
9.1. 分区
9.2. 创建双 ext2/vfat 系统
9.3. 测试 -- ext2 和 vfat
9.4. 为双分区配置 Linux
10. 让用户可以访问闪存盘
11. 维护
11.1. 文件系统检查
11.2. 然后呢?
12. Linux-2.6 内核
12.1. 有什么新功能?
12.2. 内核选项
12.3. 注释
12.4. 热插拔和命名
13. 形式
13.1. 版权信息
13.2. 免责声明
13.3. 鸣谢
13.4. 反馈

1. 目的

本文档的目的是描述在 Linux 上实现 USB 闪存设备(闪存盘)的步骤。这包括以下内容

本文档中描述的步骤应适用于任何可以作为读写设备操作的 USB 闪存盘设备。只读设备不属于此类别。如果设备的写入功能被禁用(即,如果写保护开关打开),则这些步骤将不起作用。

特别是针对特定文件系统进行格式化和维护的步骤(原则上)可以适用于其他文件系统,例如 ext3 和 reiserfs。这些尚未尝试和测试。也没有关注将这些步骤调整到其他相关操作系统。

Warning

重新格式化用于数码相机的闪存可能很危险。相机可能因此无法识别它。请使用相机内置的菜单系统为您进行重新格式化。


2. 物理设备

闪存设备主要以小型便携式设备的形式出现,通常被称为闪存盘钥匙链,以及作为数码相机的一部分。它们是非易失性设备,其工作原理是使用电荷以二进制格式表示数据。这些电荷可以几乎无限期地保持不变,但更改(例如写入设备)会限制设备的寿命(每次 8MB 的 100000 次写入)。

闪存盘直接插入计算机背面的 USB 端口。它所需的电源由 USB 端口提供。有时使用 USB 延长线将设备放在容易触及的地方很方便。

闪存盘通常具有写保护开关,如果您想将其用作读写设备,则应将其关闭。如果开关处于“打开”位置,则设备是只读的。这些设备通常配备有 LED(发光二极管),指示设备正在运行。当数据传输到设备或从设备传输数据时,LED 也会闪烁。

数码相机使用闪存进行图像存储。这些由相机供电,并通过电子接口连接到计算机的 USB 端口。为了能够连接到计算机,必须在接口连接期间打开相机的电源,并且只有在设备从计算机卸载后才能关闭电源。重要的是要记住,设备从相机的电池获取电力。因此,应尽快终止操作。


3. 购买闪存盘

购买闪存盘时的重要考虑因素如下

内存大小

这将取决于您的用途。 128MB 似乎是一个流行的选择。

是否已知它在 Linux 上工作?

知名品牌在其网站中可能会明确说明这一点。或者,询问供应商。但请注意:销售人员可能不知道您在说什么。说明书也可能会提到类似内容:适用于 Linux-2.4,或者可能有 Linux 企鹅的图片。如果这些询问都失败了,那么最好不要购买。

延长线和钥匙链

闪存盘通常与延长线(第 2 节)和钥匙链一起包装。后者提供了一种安全且时尚的方式来运输设备。确保包含这些。您可能需要额外的延长线,具体取决于情况。笔记本电脑和上网本通常不需要它们。

文件系统

市面上销售的闪存盘通常格式化为 vfat (msdos),这在 Linux 中可以使用,但您将无法获得标准 ext2(或其他)文件系统的强度和多功能性。这不是问题。它可以被赋予其他文件系统,这将在本文档后面描述。

成本

给定大小的闪存盘价格可能会有很大差异。了解价格范围是个好主意。互联网非常适合此目的。


4. 阅读材料

本文档的用户可能需要熟悉以下内容: [1]


5. 硬件和内核

5.1. 设置

以下是对用于开发以下描述步骤的设置的显着特征的描述。所有步骤都经过了尝试和测试,也适用于 Linux-2.6。类似屏幕的显示是我屏幕上显示的精确副本。

  • 硬件:Intel (R) Celeron (TM) 1100 MHz
  • 发行版:RedHat Linux 7.0(经过大量修改)
  • 内核:Linux-2.4.20(来自 www.kernel.org)。另请参阅 第 12 节,了解 Linux-2.6.x。
  • 工具:util-linux-2.11z (mountumountfdisk);e2fsprogs-1.32 (mke2fsdumpe2fsfsck.ext2);mkdosfs-2.2

5.2. 内核选项

不确定早于 2.4.xx 的内核中 USB 支持是否足够。以下与本文档相关的支持已编译到内核中。也可以采用模块化方法。


5.2.1. SCSI 支持

  • SCSI 支持 (CONFIG_SCSI scsi_mod.o)
  • SCSI 磁盘支持 (CONFIG_BLK_DEV_SD sd_mod.o)

5.2.2. 文件系统

  • DOS FAT fs 支持 (CONFIG_FAT_FS fat.o)
  • MSDOS fs 支持 (CONFIG_MSDOS_FS msdos.o)
  • VFAT (Windows 95) fs 支持 (CONFIG_VFAT_FS vfat.o)
  • /proc 文件系统 (CONFIG_PROC_FS)
  • 第二扩展 fs 支持 (ext2fs) (CONFIG_EXT2_FS ext2.o)

5.2.3. USB 支持

  • USB 支持 (CONFIG_USB usbcore.o)
  • 初步 USB 设备文件系统 (CONFIG_USB_DEVICEFS)
  • USB 大容量存储支持 (CONFIG_USB_STORAGE usb-storage.o)

5.3. 注释

在上面的列表中,大写实体指的是在.config文件中找到的变量名,该文件位于内核源代码的顶层目录中(/usr/src/linux/)。实体xxx.o指的是在采用模块化方法时创建的模块。当没有模块引用时,该选项只能硬编译到内核中。

当运行make menuconfig make xconfig时,不同的内核版本可能有不同的选项指示。变量(例如 CONFIG_USB)可以从各种 help 选项中收集,可能是更可靠的指示。

最新的 Linux 发行版,例如 RedHatSuSE,可能已经编译了适当的内核选项。

在 USB 支持下,提供了许多数码相机的选项。

如果您考虑(重新)编译内核,请查阅 第 4 节 中列出的相关文本。


6. 一些基本概念

在本节中,我们将非常简要地讨论一些基本的 Linux 概念,这些概念应有助于理解以下描述的步骤。


6.1. /proc 文件系统

/proc 文件系统充当一个窗口,通过该窗口我们可以看到 Linux 设置的运行情况。对于本文档最感兴趣的对象是目录/proc/bus/usb//proc/scsi/。这些将用于验证内核是否已为我们的目的正确设置(第 7.2 节)。


6.2. SCSI 设备

您的闪存盘将被视为 USB 大容量存储设备,伪装成可移动 SCSI 磁盘 (sd)。SCSI 磁盘设备映射到/dev(设备)目录下的/dev/sda , /dev/sdb, ... 当存在不同的磁盘设备时,它们将被映射到/dev/sda, /dev/sdb, 等。例如,如果插入了闪存盘和数码相机,则一个将被映射到/dev/sda,另一个将被映射到/dev/sdb。测试表明,首先检测到的设备会被映射到sda,并在目录/proc/scsi/usb-storage-0中表示。第二个将被映射到sdb并在/proc/scsi/usb-storage-0中表示。如果两个设备都在启动时存在,会发生什么情况尚不清楚。要了解与本文档相关的分区概述,可以查阅文件/proc/partitions。查找类似sda, sda1, sdb的条目。在 Linux-2.6 系列内核下,这个问题可以得到非常巧妙的解决(第 12 节)。

在接下来的描述中,将假定只有一个闪存盘存在,因此映射到/dev/sda.

在大多数发行版中,这些点大量存在。您应该检查您的设置是否是这种情况(ls /dev/sda*)。如果没有,您可以执行以下操作来创建它们(以 root 用户身份,用井号表示)。

             # mknod /dev/sda  b 8 0
             # mknod /dev/sda1 b 8 1
             # mknod /dev/sda2 b 8 2
   

等等,直到/dev/sda15如有必要。整个设备映射到/dev/sda,而/dev/sdax (x = 1 ... 15)代表设备的各个分区。我们将在稍后描述如何为不同的文件系统创建不同的分区(请参阅 第 8 节第 9 节)。如果您打算将闪存盘与单个分区(文件系统)一起使用,/dev/sda1就足够了。


6.3. USB 设备文件系统

此动态生成的文件系统应挂载在/proc/bus/usb/。因此,此挂载点必须存在。一旦挂载,应该在/proc/bus/usb//proc/scsi/中看到更多内容(第 7.3 节)。要查找存在哪些 USB 设备,请读取文件/proc/bus/usb/devices less /proc/bus/usb/devices)。解释屏幕上的文字需要一点努力,但这并不困难。闪存盘由 Mass Storage Device 指示。


6.4. ext2 文件系统

ext2(第二扩展)文件系统仍然是 Linux 设置中最流行的文件系统。它用途广泛且复杂,带有权限(读-写-执行,谁被允许做什么)、所有权(用户、组、其他)、时间戳(上次修改时间)等。此外,还存在用于正确维护配备 ext2 的设备的工具(第 11 节)。如果闪存设备仅在 Linux 设置中使用,则最好将其格式化为 ext2(请参阅 第 8 节)。


6.5. vfat 文件系统

在内核中启用 vfat 可以使在 Dos/Windows 下创建的文件系统挂载到 Linux 系统中。大多数闪存盘都格式化为直接在 Windows 上使用,因此应将其视为 vfat 格式。vfat 文件系统不如 ext2 复杂,因此在内存空间方面更经济。它不像 ext2 那样携带权限,因此保存在 vfat 中的 ext2 文件将以更改的权限重新出现。尽管如此,如果闪存盘用于在 Linux 和 Windows 机器之间传输数据,则最好将其保持 vfat 格式。一种折衷方案是将闪存盘分区为两部分:一部分为 vfat,另一部分为 ext2。至少 Linux 机器应该能够处理两者。这在 第 9 节 中描述


6.6. 命令选项说明

以下是本文档中出现的命令选项的简短列表

  • mount -t ext2 /dev/sda1 /mnt/memstick以 ext2 文件类型挂载设备 sda1 到挂载点 /mnt/memstick
  • ls -l创建完整列表(模式、所有权等)
  • mkdosfs -F 32 /dev/sda1在分区 /dev/sda1 上创建 ms-dos 文件系统,FAT 大小为 32
  • ln -s /dev/sda1 /dev/flash将现有的 /dev/sda1 符号链接到符号 /dev/flash
  • mkdir -m 777 /mnt/memstick/superdir创建一个新目录,用户、组和其他人具有 rwx 模式
  • dumpe2fs -h /dev/sda1显示 ext2 分区 /dev/sda1 的标头

7. 基本验证

Important

为了确保您查看和写入的设备是预期的设备,最好在开始这些步骤之前从 USB 总线中移除类似的设备。


7.1. 快速检查

您的系统可能已经设置为处理 USB 闪存设备。要检查这一点,只需发出命令$ mount从 X 终端。如果输出中出现类似

           none on /proc/bus/usb type usbfs (rw)
      

的内容,则您可以转到 第 7.4 节 并从那里继续。但是,浏览一下中间的章节可能是明智之举。如果测试不成功,一切都还没有结束。请继续阅读。


7.2. 探测 /proc 文件系统

可以检查/proc目录中的一些内容,以查看内核选项是否已正确包含,或者是否已正确插入了相应的模块。作为第一个检查,查看目录/proc/bus/usb是否存在。如果存在,则您的内核正确支持 USB 子系统。如果不是这种情况,则必须重新编译内核并包含适当的 USB 支持(请参阅 第 5.2.3 节),或者必须更新内核。接下来,检查目录/proc/scsi是否存在。如果存在,则您进展顺利。如果不存在,则 SCSI 支持尚未编译到您的内核中(请参阅 第 5.2.1 节)。

/proc中,应该为 USB 文件系统提供挂载点。该点是/proc/bus/usb。如果它存在,则内核已正确设置。


7.3. 挂载 USB 文件系统

如果上一节的验证结果为肯定,则下一步是挂载 USB 文件系统。这需要以 root 用户身份发出以下命令

             # mount -t usbfs none /proc/bus/usb 
   

Note

在较旧的内核版本中,上面的挂载命令可能需要通过将usbfs替换为usbdevfs来更改。在 Linux-2.4.20 中,这两种形式都有效。

如果没有投诉,请进行更多测试。第一个是快速测试(第 7.1 节)。更深入的探测是发出命令# ls -l /proc/bus/usb。这应该给出类似于

             dr-xr-xr-x 1 root root 0  Sep 19  14:21  001
             dr-xr-xr-x 1 root root 0  Sep 19  14:21  002
             -r--r--r-- 1 root root 0  Sep 19  22:30  devices 
             -r--r--r-- 1 root root 0  Sep 19  22:30  drivers
   

的内容。路径/proc/scsi/usb-storage-0/现在应该存在,并且末尾的文件之一将显示这一点。在我的设置中,命令$ less /proc/scsi/usb-storage-0/1给出

                Host scsi1: usb-storage  
                    Vendor: Generic  
                   Product: Mass Storage Device  
             Serial Number: None  
                  Protocol: Transparent SCSI  
                 Transport: Bulk  
                      GUID: 0ed166800000000000000000  
                  Attached: Yes/No  
   

如果闪存驱动器存在,则最后一行将有条目“Yes”。如果未插入,则条目将为“No”。


7.4. 测试 -- vfat

您现在可以确定闪存盘是否工作。假设您从柜台购买了它。其说明书很可能会告诉您如何为 Windows 设置它。这表明它已格式化为 vfat。在您尝试挂载它之前,请为其创建一个挂载点。执行类似# mkdir -m 777 /mnt/memstick的操作。挂载命令很可能是

    # mount -t vfat /dev/sda1 /mnt/memstick
   

如果一切顺利,您应该能够看到设备# ls /mnt/memstick.

。现在尝试一些标准操作,例如在设备上创建一个目录并将您喜欢的文本文件复制到其中

             # mkdir /mnt/memstick/apollo 
             # cp /home/myname/myfavourite_file /mnt/memstick/apollo/.
   

再次列出(# ls -l /mnt/memstick),并注意权限。

卸载设备(# umount /dev/sda1),然后再次如上所述挂载它。再次列出并检查权限。您最喜欢的文本文件现在很可能会具有 x 权限。它变成了可执行文件。这在 vfat 文件系统中是正常的。如果您对此感到满意,请卸载设备并跳到 第 10 节


8. 设置 Ext2 文件系统

此处描述的步骤将为整个闪存设备提供一个分区,并赋予 ext2 文件系统。这将使该设备更适合在 Linux 机器之间使用。如果该设备需要在 Linux 和 Windows 机器之间操作,请不要这样做。

Important

/dev/sda关联的设备将被重新格式化。其上的任何数据都将被销毁。为了确保您使用的设备是预期的设备,请在开始这些步骤之前从 USB 总线中移除类似的设备。


8.1. 分区

假设闪存内存映射到/dev/sda。在本节中,我们讨论整个闪存设备将专用于单个 ext2 分区的情况。在下面显示的示例步骤中,128MB 闪存被格式化为 ext2。这就是为什么出现 131MB 和 888 个柱面等数字的原因。fdisk 工具只是从设备中读取这些信息。

所有操作均由 root 用户完成。单个分区将在/dev/sda上创建(请注意:不是/dev/sda1)。该步骤在一系列步骤中描述,并附有注释。fdisk 的标准提示是命令(输入 m 获取帮助),您可以在任何阶段输入m以查看可用命令。如果您这样做,结果将是

             Command   action 
                a      toggle a bootable flag 
                b      edit bsd disklabel 
                c      toggle the dos compatibility flag 
                d      delete a partition 
                l      list known partition types 
                m      print this menu 
                n      add a new partition 
                o      create a new empty DOS partition table 
                p      print the partition table 
                q      quit without saving changes 
                s      create a new empty Sun disklabel 
                t      change a partition's system id 
                u      change display/entry units 
                v      verify the partition table 
                w      write table to disk and exit 
                x      extra functionality (experts only) 
   

您的闪存盘必须已插入,但未挂载。注意写保护已关闭。

开始操作

             # fdisk /dev/sda 
             Command (m for help):d {enter }
             Selected partition 1  
             Command (m for help):n {enter} 
             Command action  
                e  extended  
                p  primary partition (1-4)  
             p {enter}  
             Partition number (1-4):1 {enter} 
             First cylinder (1-888, default 1): {press enter} 
             Using default value 1  
             Last cylinder ... (1-888, default 888): {press enter} 
             Using default value 888  
   

现在是验证一切是否顺利的好时机,方法是打印出分区详细信息和表。

             Command (m for help): p 
             Disk /dev/sda: 131 MB, 131072000 bytes  
             9 heads, 32 sectors/track, 888 cylinders  
             Units = cylinders of 288 * 512 = 147456 bytes 

             Device     Boot Start End Blocks Id System 
	  
             /dev/sda1         1   888 127856 83 Linux 
   

确保分区未设置为可启动。分区表的“Boot”标题下不应有星号。此外,“Id”和“System”标题应与上面显示的打印输出中的标题相同。这表明您可以将设备格式化为 ext2(下一节)。这些是默认值。如果不是,则可以通过

             Command (m for help): a [toggle a bootable flag] 
             Command (m for help): t [change a partition's system id] 
   

来更改。如果(或当)分区表正确时,您可以完成以下步骤

             Command (m for help): w [write table to disk and exit] 
    

就这样!


8.2. 创建 ext2 设备

完成分区部分后,我们直接进行“格式化”设备为 ext2。为此,我们使用工具 mke2fs。这很简单。

             # mke2fs /dev/sda1 
   

您可能想在发生这种情况时观察闪存盘上的 LED 闪烁。当它停止时,工作就完成了。


8.3. 测试 -- ext2

要查看您是否成功,基本上重复 第 7.3 节第 7.4 节 中描述的步骤,但有两个细节例外。首先,挂载命令应该是

             # mount -t ext2 /dev/sda1 /mnt/memstick 
   

第二个例外是您喜欢的文本文件上的权限不应再更改。


9. 设置双分区

9.1. 分区

此处描述的步骤会将闪存设备分区为两部分——其中一个分区将格式化为 ext2,另一个分区将格式化为 vfat。当设备用于在两台(或多台)Linux 机器(ext2)之间以及 Linux 和 Windows 机器(vfat)之间传输数据时,这可能很方便

Important

映射到/dev/sda关联的设备将被重新格式化。其上的任何数据都将被销毁。为了确保您使用的设备是预期的设备,请在开始这些步骤之前从 USB 总线中移除类似的设备。

的设备。在本节中,我们描述如何为闪存盘设置双分区:设备的一半将专用于 vfat 文件系统,另一半将专用于 ext2。这样,您的设备将更通用,但也有些分散。该步骤将比 第 8.1 节 中的步骤更少详细。请注意,重复了上一节的步骤,并且显式输入了每种文件类型的十六进制代码(条目“t”后的行:Win95 = b;Linux = 83)。当分区仅用于 Linux 时,这是不必要的——Linux 是默认值。另请注意,vfat 分区首先进行——这是 Windows 的方式。

             # fdisk /dev/sda
	    
             Command (m for help): d
             Selected partition 1

             Command (m for help): n
             Command action
                e   extended
                p   primary partition (1-4)
             p
             Partition number (1-4): 1
             First cylinder (1-888, default 1): 
             Using default value 1
             Last cylinder or +size or +sizeM or +sizeK (1-888,
                   default 888):444
             Command (m for help): t
             Selected partition 1
             Hex code (type L to list codes): b
             
              Changed system type of partition 1 to b (Win95 FAT32)
             
             Command (m for help): n
             Command action
                e   extended
                p   primary partition (1-4)
             p
             Partition number (1-4): 2
             First cylinder (445-888, default 445): 
             Using default value 445
             
              Last cylinder or +size or +sizeM or +sizeK (445-888,
              default 888): 
             
             Using default value 888

             Command (m for help): t
             Partition number (1-4): 2
             Hex code (type L to list codes): 83

             Command (m for help): p

             
				 Disk /dev/sda: 131 MB, 131072000 bytes
             9 heads, 32 sectors/track, 888 cylinders
             Units = cylinders of 288 * 512 = 147456 bytes

                Device Boot    Start       End    Blocks   Id  System
             /dev/sda1             1       444     63920    b  Win95 FAT32
             /dev/sda2           445       888     63936   83  Linux
				 

             Command (m for help):w

   

Note

请注意,我们在写入之前继续进行第二个分区。

将设备正好在中间分割(对于 128 MB 闪存盘,为 1--444;445--888)的选择是任意的。任何其他经过深思熟虑的分割都可以。

如果您一开始有多个分区,“删除”部分步骤将不得不重复。


9.2. 创建双 ext2/vfat 系统

此步骤是 第 8.2 节 的重复。第一步创建 dos 分区,第二步创建 Linux ext2 分区。

             # mkdosfs -F 32 /dev/sda1
             # mke2fs /dev/sda2
   

9.3. 测试 -- ext2 和 vfat

只需分别对两个设备执行 第 7.4 节第 8.3 节 的测试。挂载命令将是

             # mount -t vfat /dev/sda1 /mnt/fatstick 
             # mount -t ext2 /dev/sda2 /mnt/memstick
   

以将两个分区都挂载到您的设备上。


9.4. 为双分区配置 Linux

您在其上进行分区的 Linux 机器将配置为双分区。显然,您需要将钥匙链带到另一台 Linux 机器。在那里您会发现它只看到/dev/sda1。这可能是内核的一个缺点。解决方法如下:在新主机上执行以下操作(钥匙链已插入但未挂载)

             # fdisk /dev/sda
                   Choose p; check partition table
                   If satisfied, choose w
             # less /proc/partitions
  

您的设备及其分区应该在那里。钥匙链上的数据应保持不变。对于单个分区,这是不必要的。


10. 让用户可以访问闪存盘

到目前为止,我们描述的只是设置系统和格式化闪存盘的步骤。我们必须使 USB 文件系统的挂载更持久,并且我们必须使非 root 用户更容易挂载此类设备。只有几件事要做。

下面描述的步骤适用于具有双分区的闪存盘的更复杂情况(第 9 节)。如果分区是单个 ext2,则应通过省略引用 vfat 部分的行并将sda2更改为sda1.

来简化该步骤。假设挂载点/mnt/memstick/mnt/fatstick已创建。您不必使用这些词,它们甚至不必是/mnt

的子目录。为了更容易记住,创建以下符号链接

 
             # ln -s /dev/sda1 /dev/fatflash
             # ln -s /dev/sda2 /dev/flash 
   

为了更平滑和更容易地挂载,请将以下行添加到/etc/fstab:( 请参阅 第 7.3 节 末尾的注释

             none          /proc/bus/usb usbfs       defaults       0 0 
             /dev/flash    /mnt/memstick ext2,vfat   rw,user,noauto 0 0 
             /dev/fatflash /mnt/fatstick vfat        rw,user,noauto 0 0 
   

中间行允许以 ext2 或 vfat 格式挂载。最后两行使任何用户都可以通过命令

             $ mount /dev/flash  [for ext2 or vfat] 
             $ mount /dev/fatflash  [for vfat] 
   

挂载设备。可以同时挂载两个分区。请参阅 第 9 节

在 ext2 格式的设备的情况下,用户(root 用户除外)似乎无法以读写模式挂载。解决方案是在闪存盘上创建一个由特定用户拥有的目录,并具有完全权限。Root 用户应该这样做

             # mount /dev/flash 
             # mkdir -m 777 /mnt/memstick/superdir 
             # chown charles:charles /mnt/memstick/superdir 
   

如果设备采用 vfat 格式,则此步骤是不必要的。

总之,这是我用来挂载和卸载我的 (ext2) 闪存驱动器的小脚本

             #!/bin/bash 
             EXCODE="keepit" 
             green='\033[0;32m' 
             yellow='\033[0;33m' 
             ## ___________________________ 
             ## Function to echo in colours 
             echo_in_color () 
             { 
                  message=$2 
                  message1=$4 
                  color=$1 
                  color1=$3 
                  echo -e -n $color 
		      echo -n $message 
                  echo -e -n $color1 " " 
                  echo  -n $message1 " " 
                  tput sgr0 
                  return 
             } 
             ## ___________________________ 
             clear 
             mount /dev/flash 
             echo_in_color $green "Flash drive mounted" 
             sleep 2 
             while [ $EXCODE != "flexit" ] 
                  do 
                     clear 
                     echo_in_color $yellow "Enter [flexit] to unmount and exit:" 
                     read EXCODE 
                  done 
             umount /dev/flash 
             exit 
   

我通过从 FVWM 菜单中调用它Exec exec xterm -geometry 43x2+1250+0 -e /home/nikos/bin/flashdrive将其放置在屏幕一角的一个很小的 x-term 终端中。水平位移 1250 可能需要根据您屏幕的水平分辨率进行修改。


11. 维护

11.1. 文件系统检查

定期检查闪存上的 ext2 文件系统是一个良好的习惯。为此,可以使用 dumpe2fs 工具,方法如下# dumpe2fs -h /dev/sda1(您必须是 root 用户,并且设备不应被挂载)。结果应类似于以下内容

             Filesystem volume name:   <none>
             Last mounted on:          <not available>
             Filesystem UUID:          c42a6963-5e6a-4cd2-b7d7-c8f09dca6c52
             Filesystem magic number:  0xEF53
             Filesystem revision #:    1 (dynamic)
             Filesystem features:      dir_index filetype sparse_super
             Default mount options:    (none)
             Filesystem state:         clean
             Errors behavior:          Continue
             Filesystem OS type:       Linux
             Inode count:              32000
             Block count:              127856
             Reserved block count:     6392
             Free blocks:              116456
             Free inodes:              31922
             First block:              1
             Block size:               1024
             Fragment size:            1024
             Blocks per group:         8192
             Fragments per group:      8192
             Inodes per group:         2000
             Inode blocks per group:   250
             Filesystem created:       Sat Sep 20 12:43:00 2003
             Last mount time:          Tue Oct 28 14:13:03 2003
             Last write time:          Tue Oct 28 14:28:27 2003
             Mount count:              13
             Maximum mount count:      35
             Last checked:             Sat Oct 18 11:28:26 2003
             Check interval:           15552000 (6 months)
             Next check after:         Thu Apr 15 11:28:26 2004
             Reserved blocks uid:      0 (user root)
             Reserved blocks gid:      0 (group root)
             First inode:              11
             Inode size:               128
             Default directory hash:   tea
             Directory Hash Seed:      118bee0a-efa5-4771-967e-41a0badd0355
   

有几个重要的方面需要指出。

  • 当 ext2 文件系统被创建时,默认情况下会给予其最大使用次数,之后才需要进行检查。这些可以在最大挂载计数 (35) 和检查间隔 (到期日期) 中看到。

  • 迄今为止的使用情况:挂载计数上次检查

  • 损坏文件(坏块)的存在情况:文件系统状态

当您挂载设备或尝试从设备读取文件时,您可能会收到关于这些事项的警告。


11.2. 接下来呢?

当使用分配用完,或者有文件损坏的迹象时,应该做的是运行# fsck.ext2 /dev/sda1在设备未挂载的情况下。之后,使用参数将被重新分配,坏块将消失。

Note

当处理 vfat 系统时,dump 似乎不存在。命令# dumpe2fs -f /dev/sda1对于 ext2 以外的文件系统,不适用于 vfat。dosfsck 工具存在 (它仍然是 Alpha 版本),并且在您自己未格式化的设备上使用可能存在风险。


12. Linux-2.6 内核

12.1. 有什么新功能?

按照上述针对 Linux-2.4.x 内核的描述设置您的系统将非常有效,但对于 Linux-2.6.x 内核 (在撰写本文时 x = 0, 1, 2, 3) 来说,更多功能成为可能

  • USB 设备的即插即用功能已得到极大改进。这意味着可以从 USB 端口连接和移除设备,而系统完全知晓。如果连接了设备,它将显示在 /proc 文件系统中。一旦移除,它将不再显示。

  • sysfs 系统已被引入。通过使用此功能,可以非常严格地控制连接的设备、它们的属性和连接节点。

  • 用于处理热插拔的实用程序已得到改进或变得可用。借助这些实用程序,可以轻松区分已连接的设备,而无需考虑它们的连接顺序。


12.2. 内核选项

内核配置选项与 第 5.2 节 中描述的非常相似。配置菜单 (# make menuconfig) 的组织方式不同,也更加系统化。以下是相关的选择


12.2.1. 总线选项

  • 支持热插拔设备 (CONFIG_HOTPLUG)

12.2.2. 设备驱动程序

  • SCSI 设备支持
  • SCSI 设备支持 (CONFIG_SCSI scsi_mod)
  • 遗留 /proc/scsi 支持 (CONFIG_SCSI_PROC_FS)
  • SCSI 磁盘支持 (CONFIG_BLK_DEV_SD sd_mod)
  • USB 支持
  • USB 支持 (CONFIG_USB usbcore)
  • USB 设备文件系统 (CONFIG_USB_DEVICEFS)
  • UHCI HCD 支持 (CONFIG_USB_UHCI_HCD uhci_hcd)
  • USB 大容量存储支持 (CONFIG_USB_STORAGE usb_storage)

12.2.3. 文件系统

  • 第二扩展 (CONFIG_EXT2_FS ext2)
  • DOS/FAT/NT 文件系统
  • DOS FAT fs 支持 (CONFIG_FAT_FS fat)
  • MSDOS fs 支持 (CONFIG_MSDOS_FS msdos)
  • VFAT (Windows 95) fs 支持 (CONFIG_VFAT_FS vfat)
  • 伪文件系统
  • /proc 文件系统支持 (CONFIG_PROC_FS)

12.3. 注释

您可能有兴趣查阅 迁移到 Linux Kernel 2.6,但不必遵循无法遵循的步骤。


12.4. 热插拔和命名

第 6.2 节 中讨论了同时插入两个 USB 设备的情况。困难在于用户很难区分这两个设备。Linux Hotplug Project (搜索 hotplug) 最近取得的进展,并在 2.6 系列内核中实现,使得有效解决此问题成为可能。为了实现,需要一些实用程序


12.4.1. 安装

sysfs 文件系统。

sysfs 文件系统是 Linux-2.6 内核系列的固有特性。udevsysfstools 使用它来获取关于内核对象 (设备等)、它们的属性和相互链接的信息。激活按照以下步骤进行

              # cd /
              # mkdir sys
              # mount -t sysfs none /sys
            

如果你执行 ls -F /sys, 将显示一个完整的目录结构,其中包含诸如 block/bus/ 等条目。您已成功。现在应通过将以下行添加到/etc/fstab:

              none  /sys   sysfs  defaults  0  0
            

Sysfsutils。

这以常用方式之一安装,无需进行特殊的配置选项。README 文件中的说明非常清楚。但是,您应该首先确保条目/usr/local/lib已输入到/etc/ld.so.conf以便libsysfs.so库可以被系统识别。安装后,检查实用程序/usr/local/bin/lsbus/usr/local/bin/systool已安装。还要检查上面提到的库是否已正确链接 (ldconfig -p | grep libsysfs).

Hotplug。

接下来安装hotplug脚本。首先要做的是检查热插拔是否在您的系统上工作。执行 less /proc/sys/kernel/hotplug。结果应该是/sbin/hotplug。如果不是这样,您应该添加行echo "/sbin/hotplug" > /proc/sys/kernel/hotplug到适当的初始化脚本,例如/etc/rc.d/rc.local。也可以在检查一切正常之前 (以 root 身份) 给出此命令。安装非常简单。执行# make install。之后检查脚本/sbin/hotplug是否存在。

Udev。

这是最后一次安装。研究 README 文件并按照必要的说明进行操作,以便能够运行make USE_KLIBC=true。如果您已编译 Linux-2.6.x 内核,这应该不会太困难。快速检查是找出/sbin/udev/sbin/udevinfo是否存在。还有其他情况,一个非常重要的是/etc/udev/udev.rules。如果您有一个用于记忆棒的工作设置 (如上所述) 并且插入了一个记忆棒,您可以尝试ls /udev, 您应该看到设备 (sda, sda1, ...)。如果在那里,拔下设备并再次列出。它应该消失了!


12.4.2. 命名记忆棒

通过使用 udev 实用程序,可以基于某些内置属性识别记忆棒。其中一个有效的方法是 vendor 标识。要查找已连接设备的此标识,请执行systool -vb scsi | grep vendor。这应该给出已连接 SCSI 设备列表 (请记住,您的记忆棒充当 SCSI 设备 第 6.2 节)。假设您同时插入了两个记忆棒,并找到 (就像我一样) 两个 vendor Id,即 "UFD" 和 "STORAGE"。然后添加到文件/etc/udev/udev.rules以下行 (如果您愿意,可以放在顶部)

              ## Flash Memory 1
              BUS="scsi", SYSFS_vendor="UFD*", NAME="namib%n"

              ## Flash Memory 2
              BUS="scsi", SYSFS_vendor="STORAGE*", NAME="kalahari%n"
           

vendor 标识可能带有尾随空格,因此通配符星号是有目的的。不要忽略它们。移除并更换记忆棒,然后执行ls /udev。而不是不带任何名称的sda, sda1, 等等,现在应该有kalahari, kalahari1, namibnamib1。设备已根据其中的 "vendor" 信息命名。因此,我们可以识别设备,无论它被映射到哪里。剩下要做的就是创建适当的挂载点,例如/mnt/namibkalahari并创建如下条目

             /udev/namib1     /mnt/namib     vfat,ext2  user,noauto,rw  0 0 
             /udev/kalahari1  /mnt/kalahari  vfat,ext2  user,noauto,rw  0 0         
            

/etc/fstab中,以允许从其他位置挂载。

这非常有趣... 并且请记住,地球上还有其他沙漠。


13. 正式声明

13.1. 版权信息

本文档版权归 (c) 2003 Niko Sauer 所有,并根据以下 Linux 文档项目 (LDP) 许可条款分发。

除非另有说明,Linux HOWTO 文档的版权归其各自作者所有。Linux HOWTO 文档可以完整或部分地以任何物理或电子媒介复制和分发,只要所有副本都保留此版权声明。允许并鼓励商业再分发;但是,作者希望收到任何此类分发的通知。

所有翻译、衍生作品或包含任何 Linux HOWTO 文档的集成作品都必须受此版权声明的约束。也就是说,您不得从 HOWTO 生成衍生作品,并对其分发施加额外限制。在特定条件下可以批准对这些规则的例外情况;请通过下面给出的地址联系 Linux HOWTO 协调员。

简而言之,我们希望通过尽可能多的渠道促进此信息的传播。但是,我们确实希望保留 HOWTO 文档的版权,并希望收到任何重新分发 HOWTO 的计划通知。

如果您有任何问题,请联系


13.2. 免责声明

对于本文档内容的准确性不承担任何责任。使用本文档的概念、示例和其他内容,风险自负。由于这是一份新文档,可能存在错误和不准确之处,当然这可能会对您的系统造成损害。请谨慎操作,尽管这种情况极不可能发生,但作者对此不承担任何责任。

所有版权均由其各自所有者持有,除非另有明确说明。在本文档中使用术语不应被视为影响任何商标或服务标志的有效性。

对特定产品或品牌的命名不应被视为认可。

强烈建议您在进行重大安装之前备份您的系统,并定期进行备份。


13.3. 鸣谢

我要向我的儿子 Paul 和 Philip 表示衷心的感谢,他们在 1995 年说服我转向 Linux。Philip 给了我深刻的建议和见解,使这个项目成为一次愉快的学习经历。

Emma Jane Hogbin 在她的评论中提出了一些重要问题,这些问题极大地改进了本文档。我向她表示最诚挚的感谢。


13.4. 反馈

非常欢迎本文档的用户通过电子邮件向我发送关于改进演示方式和可能增加其范围的建议。

注释

[1]

本文档很大程度上依赖于标有星号的文本