Linux中fstab文件详解
2009-11-22 12:11:33 阿炯

我们在linux中常常用mount命令把硬盘分区或者光盘挂载到文件系统中,/etc/fstab就是在开机引导的时候自动挂载到linux的文件系统。 用fstab可以自动挂载各种文件系统格式的硬盘、分区、可移动设备和远程设备等。在linux中/etc/fstab的项目如下所示:
/dev/device    mountpoint   type    rules   0   order

例如这是一个普通的/etc/fstab:
/dev/hda2      /                      ext3         defaults   0 1
/dev/hda3      swap               swap       defaults   0 0
/dev/hda5      /usr                ext3          defaults   0 0
/dev/fdo          /mnt/flopy      ext3         noauto      0 0
/dev/cdrom     /mnt/cdrom   iso9660  noauto,ro 0 0

/dev/device就是需要挂载的设备,/hda2就是第一个IDE插槽上的主硬盘的第二个分区。如果是第二个IDE插槽主硬盘的第三个分区,那就是 /dev/hdc3,具体可以在linux下使用fdisk -l  查看。
mountpoint 就是挂载点,/、 /usr、 swap 都是系统安装时分区的默认挂载点。如果你要挂载一个新设备,你就要为这个新设备将作为文件系统永久的一部分,需要根据FSSTND(文件系统标准),以及它的作用,用户需求来决定。比如你想把它做为一个共享资源,放在/home下面就是一个不错选择。

type 是指文件系统类形。
rules 是指挂载时的规则。下面列举几个常用的:
auto 开机自动挂载
default 按照大多数永久文件系统的缺省值设置挂载定义
noauto 开机不自动挂载
nouser 只有超级用户可以挂载
ro 按只读权限挂载
rw 按可读可写权限挂载
user 任何用户都可以挂载

请注意光驱和软驱只有在装有介质时才可以进行挂载,因此它是noauto。

0 是指dump(系统备份工具)。这一项为0,就表示从不备份。如果上次用dump备份,将显示备份至今的天数。

order 指fsck(启动时fsck检查的顺序)。为0就表示不检查,(/)分区永远都是1,其它的分区只能从2开始,当数字相同就同时检查(但不能有两1)。

如果我要把第二个IDE插槽主硬盘上的windows C 区挂到文件系统中,那么数据项是:
/dev/hdc1 /c vfat defaults 0 0

现行的系统已经可以通过其uuid( blkid 命令将显示已挂载设备的 UUID 值)或lable(标识设备你可以使用一些通用工具,如 e2label 对 ext2,ext3, ext4分区进行标记。gparted也是一个不错的工具。需要注意的是,并不是所有格式的分区都支持标记 ,如 FAT 文件系统就不支持标记)方式来挂载和识别不同的分区,同时也可以轻松识别网络文件系统(nfs、samba)。

fstab 文件内容

让我们对fstab的用法进行一个详细的了解。/etc/fstab由下面的 fields 组成 (fields之间以空格或tab分开):

<file system> <dir> <type> <options> <dump> <pass>

<file systems> - 存储设备的标识 (i.e. /dev/sda1).

<dir> - 告诉 mount 命令应该将文件设备挂载到哪里。

<type> - 定义了要挂载的设备或是分区的文件系统类型,支持许多种不同的文件系统,如 ext2, ext3, reiserfs, xfs, jfs, smbfs, iso9660, vfat, ntfs, swap 以及 auto。 'auto' 类型使 mount 命令对这文件系统类型进行猜测,这对于如 CDROM 和 DVD 之类的可移动设备是非常有用的。

<options> - 定义了不同文件系统的特殊参数,不同文件系统的参数不尽相同。其中一些比较通用的参数有以下这些:

 auto - 文件系统将在启动时,或被键入了 'mount -a' 的命令时自动被挂载。
 noauto - 文件系统只在你的命令下被挂载。
 exec - 允许执行此分区的二进制文件(默认值)。
 noexec - 不允许此文件系统上的二进制文件被执行。
 ro - 以只读模式挂载文件系统。
 rw - 以读写模式挂载文件系统。
 sync - I/O 同步进行。
 async - I/O 异步进行。
 flush - 指定 FAT 格式更加频繁地刷新数据,使得如复制对话框或是进度条持续到文件被写入到磁盘中。
 user - 允许任意用户来挂载这一设备(同时有 noexec, nosuid, nodev 参数的属性)。
 nouser - 只能被 root 挂载(默认值)。
 defaults - 默认的挂载设置(即 rw, suid, dev, exec, auto, nouser, async)。
 suid - 允许 suid 操作和设定 sgid 位。这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。
 nosuid - 禁止 suid 操作和 sgid 位。
 noatime - 不要更新文件系统上 inode access 记录,可以提升性能。
 nodiratime - 不要更新文件系统上 directory access inode 的记录,可以提升性能。
 relatime - 实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能。

<dump> dump utility 用来决定何时作备份. 安装之后 ( ArchLinux 默认未安装 ), dump 会检查其内容,并用数字来决定是否对这个文件系统进行备份。 允许的数字是 0 和 1 。0 表示忽略, 1 则进行备份。大部分的用户是没有安装 dump 的 ,对他们而言 <dump> 应设为 0。

<pass> fsck 读取 <pass> 的数值来决定需要检查的文件系统的检查顺序。允许的数字是0, 1, 和2。 根目录应当获得最高的优先权 1, 其它所有需要被检查的设备设置为 2. 0 表示设备不会被 fsck 所检查。

1、fstab文件的作用
使用权限 : 超级使用者
使用方式 : 使用编辑器来修改 /etc/fstab (eg. vi /etc/fstab)
说明 : 存放档案系统与目录结构对应资料的档案。
文件/etc/fstab存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过"mount/directoryname"命令来加载一个文件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。同时fsck、 mount、umount的等命令都利用该程序。

这个文件描述系统中各种文件系统的信息。一般而言,应用程序仅读取这个文件,而不对它进行写操作。对它的维护是系统管理员的工作。在这个文件中,每个文件系统用一行来描述,在每一行中,用空格或TAB符号来分隔各个字段,文件中以*开头的行是注释信息。Fstab文件中的纪录的排序十分重要。因为fsck,mount或umount等程序在做它们的工作时会按此顺序进行。

2、下面是/etc/fatab文件的一个示例行:
fs_spec fs_file fs_type fs_options fs_dump fs_pass
/dev/hda1 /   ext2  defaults    1    1

fs_spec - 该字段定义希望加载的文件系统所在的设备或远程文件系统,对于一般的本地块设备情况来说:IDE设备一般描述为 /dev/hdaXN,X是IDE 设备通道(a, b, or c),N代表分区号;SCSI设备一描述为/dev/sdaXN。对于NFS情况,格式一般为:,例如: `knuth.aeb.nl:/'。对于procfs,使用'proc'来定义。 对文件系统的定义(fs spec),它描述了将被装载的块设备或远程文件系统。对于通常的mount操作而言,这个字段应该包括一个将被装载的块设备的设备结点(通过mknod 命令来创建)或指向这类结点的连接(例如/dev/cdrom或/dev/sdb),对于NFS mount操作,这个字段应该包含host:dir格式的信息,例如:knuth.aeb.nl:/,对于进程文件系统procfs,使用proc。

除了显示的使用设备名,你可以使用设备的UUID或设备的卷标签,例如,你可以在这个字段写成“LABAL=root”或 “UUID=3e6be9de -8139-11d1-9106-a43f08d823a6”,这将使系统更具伸缩性。例如,如果你的系统添加或移除了一个SCSI硬盘,这有可以改变你的设备名,但它不会修改你的卷标签。

fs_file - 该字段描述希望的文件系统加载的目录点,对于swap设备,该字段为none;对于加载目录名包含空格的情况,用40来表示空格。描述文件系统的载入点,对于交换分区(swap),这个字段定义为none,如果在载入点的路径中包含空格符,可以用“\040”来替代空格符。

fs_type - 定义了该设备上的文件系统,一般常见的文件类型为ext2(Linux设备的常用文件类型)、vfat(Windows系统的fat32格式)、NTFS、iso9600等.文件系统类型(fs vfstype),主要用来定义文件系统的类型。Linux系统支持大量的文件类型,包括sdfs,affs,autofs,jfs,minix,msdos, ncpfs, nfs, ntfs, proc, qnx4, reiserfs, romfs,smbfs, sysv, tmpfs, udf, ufs, umsdos, vfat, xenix, xfs等等。如果想了解你的kernel目前支持哪些文件系统,可以查看/proc/filesystems的内容。如果这个字段定义为swap,这条纪录将关联到一个用于交换目的的文件或分区。如果这个字段定义为ignored,这行将被忽略。这对于显示目前没有使用的分区非常有用。

fs_options - 指定加载该设备的文件系统是需要使用的特定参数选项,多个参数是由逗号分隔开来。文件系统选项(fs mntops)在装载文件系统时使用的装载选项。多个选项之间用逗号做分隔符,这些选项列表包括了装载类型以及对于该文件系统合适的其它装载选项。对于非 NFS系统可用的装载选项可以参看mount命令的说明,对于nfs系统的选项可以查看关于nfs的文档。对于所有文件系统都适用的选项有noauto (当使用mount –a命令时不载入),user(允许用户进行装载),owner(允许设备所有人装载),_netdev(设备需要网络),后两个选项是linux系统所特有的。
对于大多数系统使用"defaults"就可以满足需要。其他常见的选项包括:
选项        含义
ro    以只读模式加载该文件系统
sync   不对该设备的写操作进行缓冲处理,这可以防止在非正常关机时情况下破坏文件系统,但是却降低了计算机速度
user   允许普通用户加载该文件系统
quota   强制在该文件系统上进行磁盘定额限制
noauto  不再使用mount -a命令(例如系统启动时)加载该文件系统

在 Linux 下面挂载文件系统的时候设置 noatime 可以显著提高文件系统的性能。默认情况下,Linux ext2/ext3 文件系统在文件被访问、创建、修改等的时候记录下了文件的一些时间戳,比如:文件创建时间、最近一次修改时间和最近一次访问时间。因为系统运行的时候要访问大量文件,如果能减少一些动作(比如减少时间戳的记录次数等)将会显著提高磁盘 IO 的效率、提升文件系统的性能。Linux 提供了 noatime 这个参数来禁止记录最近一次访问时间戳。mount可以有一个noatime选项可以提高文件系统性能。

noatime是Linux下文件系统的一个mount选项,表示在读文件时不去更改文件的access time属性了,而缺省时每次读文件,都要更新这个文件的last access time属性,相当于附加了额外的写操作,改这个noatime倒是很简单,在/etc/fstab中的文件系统的属性后加上noatime,再用 sudo mount -o remount / 就可以立即生效了(是的,不需要重启)。用mount命令验证,确实有了noatime的选项。

fs_dump - 该选项被"dump"命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0.文件系统频率(fs_freq),被dump程序使用来确定哪个文件系统需要dump,如果最后一个字段没有设置,系统将认为其值为0,而dump程序则认为此文件系统无需dump。

fs_pass - 该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统"/"对应该字段的值应该为1,其他文件系统应该为2。若该文件系统无需在启动时扫描则设置该字段为0.被fsck程序所使用来确定进行在系统重启进行文件系统检查时的顺序,对于根系统/这个值应设为1,其它文件系统可以设为2,在同一个物理硬盘内的文件系统应该被顺序检测,而不同硬盘中的文件系统则应该同时检测以充分利用系统的并行性。如果最后一个字段值为0或没有设置,fsck程序装跳过此文件系统的检测。在linux编程中可以用 getmntent过程来访问这个文件的内容。

3、修改/etc/fstab实现自动挂载Windows分区,并显示中文目录
LABEL=/            /               ext3      defaults                  1 1
none                  /dev/pts   devpts gid=5,mode=620 0 0
none                  /proc        proc    defaults                   0 0
none                  /dev/shm tmpfs defaults                   0 0
LABEL=/usr     /usr           ext3    defaults                   1 2
/dev/hda9          swap       swap defaults                    0 0
/dev/scd0         /media/cdrom0 udf,iso9660 ro,user,noauto 0 0
/media/Ubuntu-5.04-install-i386.iso /media/Ubuntu_5.04 iso9660 rw,loop 0 0
#添加如下几行
/dev/hda6 /mnt/win_e vfat codepage=936,iocharset=cp936 0 0

#soft选项告诉内核遇到网络问题时向用户进程发送I/O错误(EIO).默认的hard选项将导致进程被挂起,直到能够访问NFS服务器.
my.nfs.server.com:/path/on/server /path/on/client nfs rw,soft 0 0

4、对部分分区格式的支持需要编译相关的支持到内核了来实现或通过安装加载fuse模块(效率会低一些)来实现对第三方文件系统的支持,如NTFS及集群文件系统等。

查看Linux文件系统类型方法汇总

/etc/fstab文件是一个文件系统信息(比如挂载点、文件系统类型、挂载选项、开机自动挂载等等)文件。除了此文件中有记录外,还有其它的方式方法来进行对文件系统的查看:

1. df 命令报告分区空间利用率,使用-T选项显示特定分区的文件系统类型。

2.fsck 命令可以用来检测与修复文件系统,也可以输出指定磁盘分区的文件系统类型。-N 参数禁用检查文件系统错误,只是显示会做什么。

3.lsblk 命令显示块设备信息,当使用-f选项时,会打印分区的文件系统类型。

4.blkid 命令用来找出或打印块设备属性。

5.mount 命令是挂载文件系统用的,当不带任何参数运行时会打印包含文件系统类型在内的磁盘分区的信息。

6.file命令会识别文件类型,使用-s参数启用读取块设备或字符设备,-L启用符号链接跟随。

因误修改/etc/fstab导致无法开机:使用linux rescue(救援模式)修复/etc/fstab(改错配置,然后无法重启系统),用救援模式解决即可,救援模式下只支持vi:
vi /mnt/systp/etc/fstab ,将问题挂载项,注释或移除即可。

 
磁盘布局速览

1、分区

一个磁盘可分为多个分区,每个分区须先用格式化工具(如mkfs)格式化成指定格式的文件系统,才能用于存储文件。

磁盘文件系统布局


2、块

block,文件系统中的最小存储单位,大小在格式化时规定;在格式化时输入命令:
mke2fs -b 1024 # 通常1024,2048,或 4096

3、自举块/启动块/Boot Block

用于存放磁盘分区信息和启动信息,其大小是确定的,ext2文件系统启动块大小是1KB,由PC标准规定。任何文件系统都不能使用启动块,启动块之后,才是ext2文件系统。

4、柱面组/块组/Block Group

分区 = 自举块 + 超级块 + 柱面组0..n,每个柱面组大小一样。

而柱面组 = 超级块 + 配置信息 + i节点图 + 块位图 + i节点数组(i节点0..m) + 数据块

柱面组组成:

1)超级块/Super Block

描述整个分区的文件系统信息,例如块大小,文件系统版本号,上次mount(挂载)时间等。

超级块在每个块组开头都有一份拷贝(图中称为超级块副本)。

超级块丢失 => 整个块组的数据丢失

2)配置信息

在ext2~4文件系统中,这部分称为块组描述符表(GDT,Group Descriptor Table),由很多块组描述符组成,本分区有多少个块组就有多少个块组描述符。

每个块组描述符(Group Descriptor)存储一个块组的描述信息,如该块组从哪儿开始是inode表(i节点数组),从哪儿开始是数据块(Data Blocks),空闲inode和数据块还有多少个等。

同超级块,块组描述符在每个块组的开头也有一份拷贝。

块组描述符丢失 => 整个块组的数据丢失。

3)i节点图/inode Bitmap

本身占一个块,如4096byte (4KB), 其中每个bit表示一个inode(i节点)是否空闲。

4)块位图/Block Bitmap

每个bit位代表本块组中的一个块是否空闲,
- 1 表示该块已用;
- 0 表示该块空闲;

一个块组(Block Group,柱面组)中的块是这样利用的:

数据块存储所有文件的数据,如某个分区的块大小1024byte,某个文件2049byte,就需要3个数据块存储:前2个数据块都存放1024byte,第3个数据块存放1byte。

5)i节点数组/inode Table

inode这里的i可用理解成information node,inode Table专门用于存放文件的描述信息(区别于文件数据),如文件类型(常规、目录、FIFO文件、符号链接等),访问权限,文件大小,创建、最后一次修改/访问时间(可用ls -l命令查询)。

每个文件都有一个inode,一个块组(Block Group)中所有inode组成inode表。

inode表总共占多少个块在格式化的时候,就要决定并写入块组描述符,由GDT/配置信息管理。mke2fs(格式化工具)的默认策略是一个块组有多少个8KB,就分配多少个inode。'mke2fs -i'命令可以手动指定每多少个字节分配一个inode。



6)数据块/Data Blocks

不同文件类型,有不同的存储情况:

常规文件:文件的数据存储在数据块中

目录:目录下所有文件名和目录名存放在数据块中, 除文件名外,ls -l命令查看到的所有信息都保存在inode中。

注意:文件名是存放在所在目录的数据块中,而非inode中。

符号链接:符号链接的文件内容就是目标路径名。

如果目标路径名较短,则直接保存在inode中,以便快速查找; 如果目标路径名较长,则分配一个数据块来保存。

设备文件/FIFO/socket等特殊文件:没有数据块,设备文件的主设备号和此设备号,保存在inode中。
 
注意:
1.叶子目录(没有子目录的目录)链接计数为2,分别是"."和命名该目录的目录项(我的理解一般是"..");
2.普通文件(非目录)链接计数为1,因为只有当前目录(".",普通文件的父目录)指向普通文件;
3.(link)不允许构造指向目录的硬链接,因为一旦构成循环的硬链接,很难消除。



《深入理解Linux内核》把硬链接定义为:包含在一个目录中的文件名就是一个文件的硬链接(hard link),简称链接;在同一个目录或不同目录中,同一个文件可以由几个链接,因此对应几个文件名。

硬链接限制:
1)不允许给目录创建硬链接,因为可能把目录变为环形图,从而不能通过名字来定位文件;
2)只有同一文件系统中的文件之间才能创建硬链接。一个系统可能包含多个文件系统,这就需要用户注意。

针对以上限制,引入软链接,本质是一个包含了另一个文件路径名的文件;软链接可以指向任意一个文件,甚至指向不存在的文件。

硬链接和符号链接的区别:

1)inode链接计数
硬链接是文件的别名,每增加一个,文件对应的i节点的链接计数+1。链接计数表示目录块中指向i节点编号的目录项的个数;符号链接是文件的间接指针,其文件内容直接存储链接的文件的路径名,不会影响链接计数。

2)所处位置
硬链接一般要求链接和文件位于同一个文件系统中,符号链接没有这个限制。

3)创建权限
只有root用户才能创建硬链接,符号链接没有这个限制。

4)相关命令

创建硬链接
为已经存在的文件f1,创建硬链接f2
$ ln f1 f2

创建软链接
为已经存在的文件f1,创建硬链接sf3
$ ln -s f1 sf3

查看、验证方式:
$ ls -il
总用量 8
1575428 -rw-rw-r-- 2 freeoa freeoa 19 Oct 22 19:21 f1
1575428 -rw-rw-r-- 2 freeoa freeoa 19 Oct 22 19:21 f2
1575427 lrwxrwxrwx 1 freeoa freeoa 2 Oct 22 19:21 sf3 -> f1

10bit权限位"lrwxrwxrwx"中的第一位"l",就表示这是一个软链接(soft link);使用'ls -il'命令可以看到f1和硬链接inode是一样的,而和软链接sf3不同。


参考来源

Debian fstab

Fstab_wikipedia

Fstab(简体中文)