Linux文件系统

在 Linux 中文件和存储设备的使用与 Windows 中不同。虽然同样有文件和分层目录结构,但是除此以外您还需要建立一种不同的思维方式。

清单 1. 目录结构
/
|-- bin
|-- boot
|-- dev
|-- etc
|-- mnt
|-- opt
|   |-- IBM
|   |   |-- WebSphereStudio
|   |   `-- db2
|   |-- IBMHttpServer
|-- root
|-- sbin
|-- tmp
|-- usr
|   |-- X11R6
|   |   |-- bin
|   |   |-- include
|   |   |-- lib
|   |   |-- man
|   |   `-- share
|   |-- bin
|   |-- dict
|   |-- doc
|   |-- etc
|   |-- include
|   |-- lib
|   |-- libexec
|   |-- local
|   |   |-- OpenOffice
|   |   |   |-- sbin

没有驱动器字母!

在 Linux 中没有驱动器字母,这确实相当有用。如果您曾经在复杂的网络环境中使用过 Windows 系统,并且运行这个系统的机器带有若干个设备,那么您可能会发现字母表中的字母不够用。在 Linux 中,只有一个文件结构。它以 root (/) 开始,所有的本地文件系统,所有本地设备,以及所有的远程文件系统都表示为这个结构中的子目录。

当 Linux 第一次引导时,它根据 /etc/fstab 文件中的信息构建这个文件结构。Windows 为硬盘驱动器分区和其他存储设备分配驱动器字母,而 Linux 在 root 文件结构中为它们分配目录。这个分层的结构是完全可配置的,并且可以动态地修改。

 

装载!

将一个设备添加到文件系统中,术语上称为 装载。Linux 会自动装载一个 / (root) 文件系统。也可能会有一个单独的 /boot 文件系统,其中存放的是核心的内核引导文件。Linux 还将装载一些特殊的文件系统。交换分区并不表示为文件系统的一部分,但是内核会处理它。不过,其他特殊的文件系统,比如 proc,被看作是文件系统的常规部分,可以像普通文件一样对它进行处理。

什么是 /proc?

/proc 文件系统是 Windows 思想与 Linux 思想不同之处的极好示例。 /proc 存储的是对正在运行的系统各个方面的虚拟描述。在那里有 IRQ 设置、内存使用、加载的设备驱动器、网络状态等很多信息。甚至有一个叫做 /proc/kcore 的文件,是所有用到的系统内存的虚拟描述。这里的每一个文件都可以像普通文件或二进制文件一样解析。可以编写某些文件来改变运行着的内核的行为,而不用重新引导。例如,为打开系统中启用的第一个以太网设备的 IP 转发,您可以使用一个文件命令:

echo 1 > /proc/sys/net/ipv4/conf/eth0/forwarding

这种系统的主要好处在于,您只需要使用简单的脚本技术,就可以对您的正在运行的系统进行深入而有效的操作。

其他文件系统,比如可移动的媒体或者远程文件系统,需要手工装载。装载一个文件系统时,您需要知道在 Linux 中对它进行引用的正确方法,还需要有一个空目录作为 装载点。对于可移动媒体,Linux 可能在安装时就为您创建了装载点。在 Red Hat Linux 中,cdrom 设备被设置装载到 /mnt/cdrom 目录。也就是说,当您将一张 CD 放入 CDROM 设备后,输入命令:

mount /mnt/cdrom

CD 就会被添加到文件系统中,CDROM 设备会被锁定以使它不会被意外弹出。只需要到 /mnt/cdrom 目录就可以访问 CD 中的内容。当不再使用 CD 时,您可以用下面的命令将它从文件系统中移除:

umount /mnt/cdrom

/mnt/cdrom 目录将变空,CDROM 设备的锁定被解除。您现在可以安全地弹出 CD。对其他可移动媒体也是如此,比如软盘驱动器 (/mnt/floppy)。

运行不带参数的 mount 命令会显示出当前已装载的文件系统。

为什么都需要加锁?

不要忘记,Linux 不仅是多用户的,而且是多会话的。也就是说几个用户可以同时登录到系统中、运行程序、使用资源。这与 Windows 中的登录后使用共享文件不同。每一个用户都可以像自己坐在控制台前一样使用系统。为了保持稳定,Linux 不允许任意释放当前正在使用的文件系统,通过锁定 CD,在直到没有人再使用之前 CD 不会被弹出。

 

/etc/fstab 文件

设备与其装载点之间的关联关系在 /etc/fstab 中配置。这个文件可以直接修改,也可以由管理工具来维护。下面是一个 /etc/fstab 示例:

理解 /etc/fstab
/dev/hda5 ext3defaults1 1
/dev/hda2 /boot ext3 exec,dev,duid,rw 1 2
/dev/hda6 swap swap defaults 0 0
/dev/scd0 /mnt/cdrom auto ro,noauto,exec 0 0
none /dev/pts devpts id=5,mode=620 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0

每一行表示一个要装载的文件系统。第一列指出的是要装载的设备。第二列是装载点,也就是设备在文件系统中的位置。第三列指出了文件系统的类型。第四列是处理文件系统的选项。最后一列是文件系统的标志位。第一个数字是 1 或者 0,指定系统是否应该用 dump(系统备份的一个选项)进行复制。第二个数字是 0、1 或者 2,指定了在引导时检查文件系统的次序。0 表示完全不检查。1 表示要最先检查, root (/) 文件系统需要指定为 1。其他文件系统应该是 2。

在上面列出的 fstab 文件中,root 文件系统位于第一个 IDE 硬盘驱动器的第五个分区中,这个分区是扩展分区的第一个逻辑驱动器。/boot 文件系统位于第一个 IDE 硬盘驱动器的第二个主分区中,其中存放的是内核启动文件。交换分区位于第一个 IDE 硬盘驱动器的第六个分区,也就是扩展分区的第二个逻辑驱动器。列表中的其他文件系统相应的设备是“none”。我们马上就要阐述这一问题。现在我们先来关注物理磁盘。

什么都是文件

在 Linux 中,文件系统由类似于文件的名称来表示。在 /dev 目录下的所有文件都是称为 nodes 的特殊文件,它们通过设备驱动程序链接到物理设备。这就使得您可以做一些有趣的事情。例如,为制作一张 CD 的 ISO 映像,您可以使用 cp (copy) 命令:

cp /dev/cdrecorder MyCD.iso

这样复制的是一个二进制映像而不是 CD 的文件结构。

以文件为中心的方法还允许您可以为设备名称指定有意义的别名。例如,通常有一个叫做 /dev/cdrom 的别名,指向物理 CDROM 设备,而这个设备通常是 /dev/hdc。 一旦创建了别名,您就可以通过 /dev/cdrom 访问那个设备,这样更好记。别名技术还允许您标准化脚本,使这些脚本可以在物理配置不同的系统上使用。

第四列中的选项将随文件系统类型而不同。在上面的例子中,/ 和 /boot 的装载选项为“default”。也就是说,它们使用异步 I/O 以可读写方式自动装载。只有 root 可以装载或者缷载设备,但是用户可以执行二进制文件和使用“sticky bit”(稍后介绍)。文件系统将被作为块字符设备来处理。然而,对 /mnt/cdrom 来说,选项就不同了。它不会被自动装载,并且将会作为只读文件系统装载。用户将可以在该文件系统中执行脚本和程序。

 

添加文件系统

在 /etc/fstab 文件中添加新的一行,您就可以将文件系统添加到 /etc/fstab。作为一个实际的例子,我有一个 RAID 设备,存储的是部门所用到的文件资源。这个设备中只有数据文件,并且保持与操作系统分离,这样在出现硬件故障时可以将它转移到另一个系统。RAID 已经配置好,在 Linux 中识别为 /dev/sdc,即第三个 SCSI 设备。在第一个分区上创建了带日志的 ext3 文件系统,这样我们通过 /dev/sdc1 就可以访问它。我希望在计算机引导时自动将这个 RAID 装载到文件系统中。

我在 /etc/fstab 中添加了如下一行:

/dev/sdc1 /data ext3 defaults 0 0

这样在引导时 RAID 就会像 / 和 /boot 系统一样被装载。现在我只要再创建一个目录作为指定的装载点:

mkdir /data

一旦创建了这个空目录,我们可以将文件系统装载到它:

mount /data

RAID 现在关联到了 /data。如果系统被重新引导,/data 将自动装载。

 

分区

在 Linux 中分区与 Windows 中本质上相同。控制台命令 fdisk 可以创建和管理分区。当您使用 fdisk 时,您必须指明它要操作哪个设备。可使用命令 fdisk -l 来查看可用设备。

清单 2. 使用 fdisk
[root@cmw-t30 root]# fdisk -l
Disk /dev/hda: 240 heads, 63 sectors, 7752 cylinders
Units = cylinders of 15120 * 512 bytes
   Device Boot    Start       End    Blocks   Id  System
/dev/hda1             1         8     60448+  8e  Linux LVM
/dev/hda2             9        15     52920   83  Linux
/dev/hda3   *        16      1403  10493280    c  Win95 FAT32 (LBA)
/dev/hda4          1404      7751  47990880    f  Win95 Ext‘d (LBA)
/dev/hda5          1404      5565  31464688+  83  Linux
/dev/hda6          5566      5635    529168+  82  Linux swap
/dev/hda7          5636      7751  15996928+   b  Win95 FAT32

上面的清单来自于一台膝上型电脑,所以它显示的结构与服务器有些不同。它显示了一个有若干个分区的 IDE 硬盘驱动器。如果有其他设备,同样也将会被列出。例如,第二个 IDE 硬盘驱动器可能会显示为 /dev/hdb。

指定一个设备再次运行 fdisk ,您会得到一个简短的提示。

清单 3. 对一个设备运行 fdisk
[root@cmw-t30 root]# fdisk /dev/hda
The number of cylinders for this disk is set to 7752.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)
Command (m for help):

输入“m”可以查看命令菜单。您可以使用“p”来显示当前的分区表。您可以创建、删除和修改现有分区的类型。“l”将为您列出可用分区类型的完全列表。用“w”将您的修改写入到分区表并退出程序,或者使用“q”不保存修改而退出。一些修改会立即生效。有一些修改需要系统重新引导方能生效。

Linux 下的分区规则与 Windows 中相同。您可以使用 4 个主分区,每个都可以成为扩展分区。

 

文件系统类型

Linux 可以处理内核所能识别的任何文件系统类型。相当多的类型是默认编译到内核中的,并且可以再添加新的文件系统。下面是一些重要的文件系统类型:

  • ext2:标准 Linux 文件系统
  • ext3:带日志的标准 Linux 文件系统
  • vfat:Microsoft 的 Fat32 文件系统
  • jfs:IBM 的日志文件系统
  • reiserfs:另一个流行的日志文件系统

日志节约时间,保全数据

日志文件系统有助于在非正常关闭时保护数据。如果一个卷没有缷载就被关闭,可能还遗留下未完成的工作,以及处于 in-between 状态的文件。在典型的文件系统中,需要对这个卷进行全面的检查,对较大的卷来说这需要比较长的时间。日志文件系统会对磁盘的每一个写操作的事务记录保持一段时间(比如 5 秒)。当这个卷没有被完全地缷载时,文件系统只需要回滚到最后一个已知的正常状态。原来恢复一个卷需要 20 分钟时间,现在只需要几秒!

 

格式化分区

分区创建完成后,用适当版本的 mkfs 命令对其进行格式化。文件系统将有其自己版本的 mkfs ,比如 mkfs.ext2 或者 mkfs.ext3 。这些助手脚本让您可以只需要指定分区就可以创建一个文件系统。下面是一些例子:

清单 4. 使用 mkfs
 # Create an ext2 file system on the third
 # parition of the first IDE hard drive
mkfs.ext2 /dev/hda3
 # Create an ext3 file system on the first
 # partition of the 2nd SCSI hard drivemkfs.ext2
mkfs.ext3 /dev/sdb1
 # Create a jfs file system in an extended
 # partition on the first IDE hard drive.
mkfs.jfs /dev/hda5

有一些高级的参数会影响分区如何格式化,但是对通常的用途来说,使用默认的参数就可以了。一旦分区经过了格式化,它就可以装载到 / 文件系统中。一个文件系统必须在被缷载后才可以重新格式化。

 

其他文件系统工具

让我们来看一看其他有用的工具。

控制台工具

有几个工具可以查看磁盘和文件系统的状态。

df
df 表示“disk free”。它会报告装载的文件系统上已用的和可用的磁盘空间的大小。有用的开关:

检查磁盘空间
df -h人类可读的格式;以易读的 k、M、G 而不是以字节为单位来显示文件的大小
df -l 仅列出本地文件系统;默认情况下,远程文件系统也会被列出

du
du 表示“disk usage”。它会报告特定的文件和每个子目录 (参数中指定的目录) 所使用的磁盘空间大小。有用的开关:

检查磁盘使用情况
du -a列出所有文件所占的空间,而不仅是目录
du -h 人类可读的格式;以易读的 k、M、G 而不是以字节为单位来显示文件的大小
du -c 在所有的参数处理完成后输出一个总计;可以用来得到给定的一组文件或目录所占的总的磁盘空间
du -s 只显示出每个参数指定的文件大小的总和

fsck
这个程序用来检查和修复文件系统,相当于 Windows 中的 chkdsk 。如同 mkfs 一样,对应不同的文件系统类型它有不同的版本。 fsck 必须运行于已缷载的卷上,虽然除非是在文件系统没有缷载完全的时候,否则很少会用到它。 man fsck 和 info fsck ,以及本文最后的 参考资料中都提供了详细的资料。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。