深入理解 高效管理Linux的文件系统

来源:岁月联盟 编辑:zhuzhu 时间:2007-09-08
深入理解 高效管理Linux的文件系统内容简介:一、概述 Linux支持数量众多的本地文件系统类型和几种通过网络访问远程磁盘的文件系统,分析/proc/filesystems文件的内容即可找出当前Linux内核提供了对哪些文件系统的支持。 要在内核中增加对任意此类文件系统的

  一、概述
  Linux支持数量众多的本地文件系统类型和几种通过网络访问远程磁盘的文件系统,分析/proc/filesystems文件的内容即可找出当前Linux内核提供了对哪些文件系统的支持。

  要在内核中增加对任意此类文件系统的支持都是相当简单的,只需在构造新的内核时选中相应的配置选项即可。例如,对于makexconfig来说,只需在它的Filesystems下面选中想要的文件系统类型。如果你是为了从其他环境将磁盘移入Linux系统才需要增加文件系统类型,而且该磁盘原先的系统环境使用与Linux不同的分区表格式,则应当记住还必须启用相应的分区类型支持(通过Partition Types设置)。

  当前,ext2文件系统(即second extended filesystem)是Linux默认直接支持的文件系统。ext2文件系统和其他现代Unix使用的文件系统非常相似,但更接近于BSD系统所用的Berkeley Fast Filesystem。ext2文件系统的最大容量是4 TB,但目前它的最大文件大小被Linux内核限制为2 GB。

  ext2的核心是两个内部数据结构,即superblock和inode。superblock是一个包含文件系统重要信息的表格,比如标签、大小、inode的数量等,它是对文件系统结构的基础性的、全局性的描述。因此,没有了superblock的文件系统将不再可用。由于这个原因,文件系统中不同位置存放着superblock的多个副本。

  inode是基本的文件级数据结构,文件系统中的每一个文件都可以在其中一个inode中找到其描述。inode描述的文件信息包括:文件的创建和修改时间,文件大小,实际存放文件数据的块列表,等等。对于较大的文件,块列表可能包含附加数据块列表的磁盘位置(称为间接块),甚至有可能出现二重或三重的间接块列表。文件名字通过目录项(Directory Entry)关联到inode,目录项由“文件名字-inode”对构成。

  Linux提供了大量用于创建和管理文件系统的工具。接下来我们将以新增磁盘(或分区)为线索,介绍各种要用到的工具。尽管完成这一任务的过程并不复杂,但这些操作还得在Linux命令行进行,这是因为大多数图形界面的工具在这方面的支持非常有限。

把磁盘/分区加入到Linux系统

  在Linux文件系统中增加新的磁盘或者分区是相当简单的,其步骤如下:


把磁盘接入计算机
如有必要,对磁盘进行分区(fdisk或者cfdisk)
确定和新磁盘/分区关联的设备文件(MAKEDEV)
在分区上创建文件系统(mkfs)
检查文件系统是否存在一致性错误(fsck)
装配新文件系统(mount)
在文件系统配置文件(/etc/fstab)中设定文件系统的启动时行为和其他选项
在日常使用中,必要时修改文件系统的特征和选项(tune2fs)


  二、确定设备文件以及创建分区

1、确定设备文件

  为新加入的物理磁盘(或磁盘分区)创建文件系统之前,首先必须知道该磁盘具体的设备名字。我们可以用好几种方法来找出它的设备名字。例如,可以通过dmesg命令分析启动日志(通过管道传送给grep,并搜索[hs]d[a-z]);如果已经用syslog截取,则可以查看日志文件。另外,大多数Linux发行版都默认启用/proc文件系统,如果你也使用了它,则可以分析/proc/partitions文件,查看系统认可的所有磁盘分区的清单。

  有时我们需要手工为磁盘创建设备文件,但这种情况极其罕见。设备文件可以用/dev目录下面的MAKEDEV脚本创建。例如,下面的命令将为第六个SCSI磁盘创建设备文件:


# cd /dev; MAKEDEV sdf


2、创建分区

  确定磁盘的设备文件之后,接下来就要用fdisk之类的工具将磁盘分区。下面我们使用的是cfdisk,这是一个大多数Linux发行版都提供的仿图形界面工具。输入cfdisk命令并在参数中指定目标磁盘即可启动该工具:


# cfdisk /dev/sdf

 

磁盘分区工具cfdisk


  cfdisk的主窗口显示的是一个描述当前磁盘分区布局的表格,表格的各列依次表示:分区名字,分区的标记,分区的类型,分区的标签(如存在的话),以及以兆计的分区大小。用上、下箭头键可以在表格内移动表示选中的横条。


  适用于当前选中项目的命令显示在屏幕的下方,这些命令既可以用左、右箭头键访问,也可以用命令名字的首字母访问。例如,在上图中,cfdisk命令作用于磁盘的第一个分区,用于设定分区类型的Type命令是当前处于激活状态的命令(当然,该命令还没有执行)。

  对于包含未分区空间的磁盘,分区列表最后一项的FS Type将显示为Free Space。如果选中了该项,cfdisk将显示一个New命令。New命令用于创建新的分区。

  执行New命令时cfdisk会要求输入其他一些参数,比如分区大小。创建新的分区之后,我们可以用其他cfdisk命令来定义该分区的附属特征。

  用cfdisk修改好分区定义之后,可以用Write命令保存更新后的分区表,用Quit命令直接退出cfdisk则表示忽略所有已经作出的改动。只要对磁盘分区表作了任何实质性的改动(即,不仅仅指定分区标签或改变分区类型),则在继续处理之前应当重新启动系统。

3、技巧:分区位置对性能的影响

  如果新增磁盘的系统中I/O性能极其重要,而且该磁盘又必须分成多个分区,仔细地规划一下分区的位置将显著地改善系统性能。

  例如,如果某个文件系统中随机I/O访问居多(比如,文件系统中保存了大型的数据库,或大量的小文件),则将该分区放在磁盘的物理中心是有好处的。这是因为随机I/O性能受到磁盘搜索时间的限制,将磁头移动距离减到最小将明显地提高I/O访问速度。

  因此,假设该随机访问分区的容量占总容量的一半,要想特别照顾该分区的I/O性能,可以创建三个分区,其容量分别为磁盘总容量的1/4、1/2和1/4。

  三、创建文件系统

  接下来是用mkfs命令创建文件系统(或者,更精确地说是用mke2fs命令。mkfs是一个统一的前端工具,为所有不同文件系统类型的创建命令提供)。如下例所示,该命令最简单的形式是通过-t参数指定文件系统的类型,然后加上创建该文件系统的分区。下面这个命令在第二个SCSI磁盘的第二个分区上创建一个ext2文件系统:


# mkfs -t ext2 /dev/sdb2
# mke2fs /dev/sdb2

 

  上面的第二个命令是直接使用mke2fs时的等价命令。部分mke2fs参数的说明可在本节后面找到。

  下面也是一个mke2fs命令,它在一个计划用于从大量化学模拟计算凑合出文件的分区上创建一个文件系统:


# mke2fs -L scratch -c -q
-m 2 -N 1000 /dev/hdc1

 

  该命令在检查第三个IDE磁盘第一个分区的坏块之后创建了一个文件系统,设置其标签为“scratch”,只保留百分之二的空间,只创建1000个inode。对于本例设想的情形来说创建1000个inode是合理的,这是因为该文件系统中文件和目录的数量永远不会超过100。当然,当该假设不成立时会出现问题。

  mke2fs的参数


-L label
指定分区的标签(最长11个字符)。
-b size
文件系统的块大小,以字节计,默认值1024。块是文件系统分配磁盘空间的单位。
-c
在创建文件系统之前检查分区的坏块。
-m percent
指定保留的文件系统空间百分比,这部分空间只能由root访问。默认值是磁盘的百分之五,这是传统Unix默认值的一半。在今天普遍使用大容量磁盘的情况下,即使是这个百分比也值得再加斟酌,比如可以将它降低到百分之二或者三。
-i ratio
指定每个inode的字节数,即为每个指定大小的字节块创建一个inode。默认值是4096,这个值所创建的inode通常超过实际可能用到的,但一般没有必要改变它,因为节省下来的磁盘空间非常有限。另外,用“-N 数字”可以显式地指定创建inode的数量。
-v -q
分别表示详细输出或简略输出


  四、检查文件系统

  接下来是用fsck工具检查新文件系统。这这里我们通过fsck的参数指定目标文件系统,并加上-f和-y选项(参见下面关于fsck参数的说明)。此时,fsck将对文件系统进行一致性检查,比较文件系统数据结构内众多互相交叉引用的条目。

  fsck能够查出并修正文件系统结构方面的问题,比如标记为空闲的磁盘块实际上正被使用(或相反),inode里面错误的链接计数(意味着存在丢失的或者多余的目录项),以及inode合计大小值和实际占用数据块总数的不一致,等等。

  正因为如此,fsck能够确保文件系统定义数据结构的一致性。但应注意这仅限于文件系统结构,对于丢失的或损坏的数据来说它是无能为力的。

1、fsck的参数


-f 即使磁盘看起来无需检查也强制执行。默认情况下,只有当文件系统“肮脏”时才需要进行检查。或者说,只有当文件系统没有正确卸载(dismount)、或者使用了一定的时间、系统重新启动一定次数后才需要进行检查。
-p 整理文件系统,自动修正所有可以安全地更正且不会导致数据丢失的问题。
-y 对所有问题回答yes。它的效果是:自动修正所有发现的问题,即使那些可能导致数据丢失的问题也要修正。
-b block 指定文件系统备用superblock的位置。在极其罕见的情况下,即当主superblock被损坏而文件系统主要部分仍完整的情况下,该选项的作用将是非常大的。备用superblock通常位于8193、13685等位置,创建文件系统时mkfs将输出该信息。
2、装配文件系统

  
用linuxconf将文件系统加入/etc/fstab

  现在我们只剩下装配(mount)新文件系统并将它加入文件系统配置文件/etc/fstab这一任务了,这可以用linuxconf之类带图形界面的工具来完成。图2显示了将新文件系统加入/etc/fstab的linuxconf。

  Linux下有许多用于检测现有ext2文件系统状态以及重新进行配置的工具。tune2fs就是其中一个,它的-l选项将列出指定ext2文件系统的各种属性。其中大多数属性的含义都非常明确,这些属性与可在mke2fs命令中指定的选项相对应。个别属性决定fsck何时对文件系统进行下一次检查。默认情况下,Linux将每隔20次系统启动或者30天对文件系统进行检查(这里的时间间隔周期以秒指定)。

  这些文件系统属性中的很大一部分都可以用tune2fs的相应参数进行修改。例如,下面的命令通过设置两次检查的时间间隔秒数(-i)为0禁止了根据时间周期执行的检查:

# tune2fs -i 0 /dev/hdb5
Setting interval between check 0 seconds