Fstab (简体中文)

From ArchWiki
Revision as of 14:48, 30 July 2011 by Smerik (talk | contribs) (The mount point for the filesystem should be 'none' for swap partitions (see man fstab)))
Jump to navigation Jump to search

This template has only maintenance purposes. For linking to local translations please use interlanguage links, see Help:i18n#Interlanguage links.


Local languages: Català – Dansk – English – Español – Esperanto – Hrvatski – Indonesia – Italiano – Lietuviškai – Magyar – Nederlands – Norsk Bokmål – Polski – Português – Slovenský – Česky – Ελληνικά – Български – Русский – Српски – Українська – עברית – العربية – ไทย – 日本語 – 正體中文 – 简体中文 – 한국어


External languages (all articles in these languages should be moved to the external wiki): Deutsch – Français – Română – Suomi – Svenska – Tiếng Việt – Türkçe – فارسی

什么是fstab

文件fstab包含了你的电脑上的存储设备及其文件系统的信息。它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件。

这个文件的全路径是/etc/fstab。它只是一个文本文件,你能够用你喜欢的编辑器打开它,但是必须是root用户才能编辑它。同时fsck、mount、umount的等命令都利用该程序。

具体来说: 用fstab可以自动挂载各种文件系统格式的硬盘、分区、可移动设备和远程设备等。 对于Windows与arch双操作系统用户,用fstab挂载FAT格式和NTFS格式的分区,可以在Linux中共享windows系统下的资源。

fstab文件示例

现在让我们看一下一个典型的fstab文件:

# <file system>        <dir>         <type>    <options>             <dump> <pass>
none                   /dev/pts      devpts    defaults                0      0
none                   /dev/shm      tmpfs     defaults                0      0
 
/dev/cdrom             /media/cd     iso9660   ro,user,noauto,unhide   0      0
/dev/dvd               /media/dvd    udf       ro,user,noauto,unhide   0      0
/dev/fd0               /media/fl     auto      user,noauto             0      0
 
/dev/hda1              none          swap      defaults                0      0
/dev/hda4              /             ext3      defaults                0      1
/dev/hda3              /home         xfs       rw,suid,exec,auto,nouser,async 0      2

下面是另外一个例子,其中使用了更多的挂载选项,并以 LABEL= 的方法来作为可挂载设备的标识。

proc    /proc           proc        rw,relatime                                             0 0
udev    /dev            devtmpfs    rw,nosuid,relatime,size=10240k,nr_inodes=94876,mode=755 0 0
sys     /sys            sysfs       rw,relatime                                             0 0
devpts  /dev/pts        devpts      rw,relatime,mode=600,ptmxmode=000                       0 0
none    /dev/shm        tmpfs       defaults,rw,relatime,size=400M                          0 0
tmpfs   /tmp            tmpfs       defaults,noatime,mode=1777                              0 0

LABEL=BOOT      /boot           ext2 defaults              0 1
LABEL=ROOT      /               ext4 defaults,noatime      0 1
LABEL=USR       /usr            ext4 defaults,noatime      0 0
LABEL=VAR       /var            ext4 defaults,noatime      0 0
LABEL=OPT       /opt            ext4 defaults,noatime      0 0
LABEL=HOME      /home           ext4 defaults,noatime      0 0

fstab 文件组成

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

<file system>	<dir>	<type>	<options>	<dump>	<pass>
  • <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 记录,可以提升性能(参见 atime_options)。
  • nodiratime - 不要更新文件系统上 directory access inode 的记录,可以提升性能(参见 atime_options)。
  • relatime - 实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新。(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能(参见 atime_options)。
  • <dump> dump utility 用来决定何时作备份. 安装之后 ( ArchLinux 默认未安装 ), dump 会检查其内容,并用数字来决定是否对这个文件系统进行备份。 允许的数字是 0 和 1 。0 表示忽略, 1 则进行备份。大部分的用户是没有安装 dump 的 ,对他们而言 <dump> 应设为 0。
  • <pass> fsck 读取 <pass> 的数值来决定需要检查的文件系统的检查顺序。允许的数字是0, 1, 和2。 根目录应当获得最高的优先权 1, 其它所有需要被检查的设备设置为 2. 0 表示设备不会被 fsck 所检查。

文件系统标识

Template:Filename配置文件中你可以以三种不同的方法表示文件系统:通过 kernal naming 描述, 通过 UUID 或者通过 label。使用 UUID 或是 label 的好处在于它们与磁盘顺序无关。如果你在 BIOS 中改变了你的存储设备顺序,或是重新拔插了存储设备,或是因为一些 BIOS 可能会随机地改变存储设备的顺序,那么用 UUID 或是 label 来表示将更有效。

Kernel naming

你可以使用 Template:Codeline 来获得 kernal naming 表示:

# fdisk -l
...
  
Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        2550    20482843+   b  W95 FAT32
/dev/sda2            2551        5100    20482875   83  Linux
/dev/sda3            5101        7650    20482875   83  Linux
/dev/sda4            7651      121601   915311407+   5  Extended
/dev/sda5            7651       10200    20482843+  83  Linux
/dev/sda6           10201       17849    61440561   83  Linux
/dev/sda7           17850       18104     2048256   82  Linux swap / Solaris
/dev/sda8           18105       18113       72261   83  Linux
/dev/sda9           18114      121601   831267328+   7  HPFS/NTFS

UUID

UUID 由生成工具 (Template:Codeline) 在创建文件系统时生成。 Template:Codeline 命令将显示已挂载设备的 UUID 值:

# blkid
/dev/sda1: UUID="76E4F702E4F6C401" LABEL="vista" TYPE="ntfs"
/dev/sda2: LABEL="Root" UUID="24f28fc6-717e-4bcd-a5f7-32b959024e26" TYPE="ext4"
/dev/sda6: LABEL="Home" UUID="03ec5dd3-45c0-4f95-a363-61ff321a09ff" TYPE="ext4" 
/dev/sda7: LABEL="swap" UUID="4209c845-f495-4c43-8a03-5363dd433153" TYPE="swap"
/dev/sda10: UUID="0ea7a93f-537c-4868-9201-0dc090c050e4" TYPE="crypto_LUKS"
/dev/mapper/sda10: UUID="d3560bbb-b5d5-46c5-a7a8-434c885217c7" UUID_SUB="425ab275-d520-4636-8d16-55fb2b957971" TYPE="btrfs"

一个使用 UUID 标识的 Template:Filename 配置文件例子如下所示:

# <file system>        <dir>         <type>    <options>             <dump> <pass>
none                   /dev/pts      devpts    defaults                0      0
none                   /dev/shm      tmpfs     defaults                0      0

/dev/cdrom             /media/cd     iso9660   ro,user,noauto,unhide   0      0
/dev/dvd               /media/dvd    udf       ro,user,noauto,unhide   0      0
/dev/fd0               /media/fl     auto      user,noauto             0      0
 
UUID=24f28fc6-717e-4bcd-a5f7-32b959024e26 /     ext4 defaults,noatime  0      1
UUID=03ec5dd3-45c0-4f95-a363-61ff321a09ff /home ext4 defaults,noatime  0      2
UUID=4209c845-f495-4c43-8a03-5363dd433153 none  swap defaults          0      0

Label

使用这一方法,设备或是分区一定要被标识。标识设备你可以使用一些通用工具,如 Template:Codeline 对 ext2,ext3, ext4分区进行标记。Template:Package Official也是一个不错的工具。需要注意的是,并不是所有格式的分区都支持标记 (如 FAT 文件系统就不支持标记)。

在尝试对设备进行标识时设备不能被挂载。你可以通过一个 LiveCD/DVD/USB 启动,用如 Template:Package Official 或是 Template:Codeline 来对设备进行标识。

 e2label /dev/<disk-or-partition> Arch_Linux

label 最多可以有 16 个字符长。理论上 label 可以包含空格,但是如果这样做将无法让 Template:Filename 或是 GRUB 配置文件识别出来。

label 命名应该足够清晰以防止可能的冲突。在 Template:Filename 中以 label 来标识设备如下例所示:

# <file system>        <dir>         <type>    <options>             <dump> <pass>
none                   /dev/pts      devpts    defaults                0      0
none                   /dev/shm      tmpfs     defaults                0      0
 
/dev/cdrom             /media/cd     iso9660   ro,user,noauto,unhide   0      0
/dev/dvd               /media/dvd    udf       ro,user,noauto,unhide   0      0
/dev/fd0               /media/fl     auto      user,noauto             0      0
 
LABEL=Arch_Linux       /             ext4      defaults,noatime        0      1
LABEL=Arch_Swap        none          swap      defaults                0      0

建议

atime 参数

使用 Template:Codeline, Template:Codeline or Template:Codeline 可以提升 ext2, ext3 及 ext4 格式磁盘的性能。 Linux 在默认情况下每次在磁盘上读取(或写入)数据时都会产生一个记录。这是在 Linux 用于服务器而设计的,在桌面使用中意义不大。这些参数对于大部分的程序来说都是有效的。但对于 mutt (它需要这些记录信息),你应该仅仅使用 Template:Codeline 选项。

tmpfs

Tmpfs 是一个临时文件系统,驻留于你的交换分区或是内存中(取决于你的使用情况)。它的意义在于提高系统一些部分的速度,并能在重启时自动清除一些文件。

tmpfs 可以被安全使用在的目录有 /tmp, /var/lock and /var/run. 不要将之使用于 /var/tmp, 因为这一目录中的临时文件在重启过程中还是被保留。

Warning: 一些 daemon 进程仍然将一些文件(或目录)安装在 /var/lock 和 /var/run 下。因此需要编辑 Template:Filename 下的脚本来使它们正常工作 (如 lighttpd)。

默认情况下, tmpfs 分区被设置为你总的内存的一半,当然你可以自由设定这一值。注意实际中内存和交换分区的使用情况取决于你的使用情况,而 tmpfs 分区在其真正使用前是不会占用存储空间的。

要在 /tmp,/var/lock 和 /var/run 下使用 tmpfs,在 Template:Filename 中添加如下几行:

 tmpfs /tmp      tmpfs defaults,nodev,nosuid,mode=1777                 0 0
 tmpfs /var/lock tmpfs defaults,nodev,nosuid,noexec,mode=1777,size=10m 0 0
 tmpfs /var/run  tmpfs defaults,nodev,nosuid,noexec,mode=0755,size=10m 0 0

你可以在这里指定其大小,但是在这种情况下你应该突出 mode 部分,以确保它们可以有正确的权限设置。在上面的例子中, /tmp 将会占用你的一半内存,其它的两个目录被设置为各占用 10 MB 大小。

参阅 mount 命令 man 手册以获得更多的内容。

重启后方能生产。注意尽管这样做非常地诱人和有效,但是千万不要直接执行 mount -a 命令,因为可能造成当下这些目录的不可访问 (比如你应该保证 lockfiles 的正常存在)。然而,如果它们都是空的,那么就可以直接执行 mount -a 而不必重启电脑。在重启前你可以执行 mount /tmp 等来激活其中一些选项,其余的则要在重启后生效。

在进行了如上面的改动后,要检验它是否如愿起作用你可以用 df 命令( df -h):

 tmpfs                 2.0G   20K  2.0G   1% /tmp
 tmpfs                  10M     0   10M   0% /var/lock
 tmpfs                  10M   48K   10M   1% /var/run

修正因 /var 分区造成关机异常问题

将 /var/lock 和 /var/run 挂载为 tmpfs 时, 如果是一个独立的分区 /var 将不能在关机时被卸载。这是因为 tmpfs 文件系统不被 rc.shutdown 所卸载。

要修复这一问题,需要创建 Template:Filename 文件,在其中加入

clean_umount() {
    umount /var/lock
    umount /var/run
}
add_hook shutdown_postkillall clean_umount
# vim: set ft=sh :

这将使 /var/lock 和 /var/run 在所有进程和守护进程结束后,在卸载 /var 之前被卸载。

解决包含有空格的路径名无法使用的问题

你可以使用 "\040" 转义字符来表示空格(以三位八进制数来进行表示)

/dev/sda7                /home/username/Camera\040Picures   ext4  defaults,noatime       0  2
UUID=7D4500B3071E18B2    /media/100\040GB\040(Storage)      ntfs  defaults,noatime,user  0  0

外部设备

外部设备可以被即时地挂载,但是如果加入了 Template:Codeline 选项将被忽略。这用于阻止启动时的报错。

/dev/sdg1 /media/backup jfs noauto,nofail,rw,noatime,nodiratime 0 2

用fstab自动挂载FAT32和NTFS分区

1.先在用fdisk -l(可能需要在root权限下)得到硬盘信息表,例如:

#  Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        2397    19253871    b  W95 FAT32
/dev/sda2            2398        3144     6000277+  83  Linux
/dev/sda3            3145        9729    52894012+   5  Extended
/dev/sda5            3145        3152       64228+  83  Linux
/dev/sda6            3153        3276      995998+  82  Linux swap / Solaris
/dev/sda7            3277        7340    32644048+  83  Linux
/dev/sda8            7341        9729    19189611    7  HPFS/NTFS

从上面知道,这台电脑上只有一个硬盘,其中分区sda1和sda8为NTFS格式,sda1为可以启动的,因而可能为window的系统所在盘。 下面把系统盘以只读方式持载上去,非系统盘sda8以读写方式挂载上去(不能挂载在"/"及其以下的任何目录)。

2.用你喜欢的编辑器在终端中打开/etc/fstab,例如: nano /etc/fstab

在文件末尾加入:

/dev/sda1 /mnt/WindowsC vfat defaults,codepage=936,iocharset=cp936,umask=0222 0 0
/dev/sda8 /mnt/WindowsD ntfs defaults,iocharset=utf8,umask=000,nls=utf8 0 0

保存,退出。

Warning: 使用936的codepage挂在fat32分区可能会造成linux下识别中文正常但是到windows下反而出现乱码,推荐替换成utf8,但是dmesg提示警告,没有关系,n多人用了这么长时间都没有问题
/dev/sda1 /mnt/WindowsC vfat user,utf8,umask=000 0 0

3.在终端中输入 Template:Codeline ,你就应该能在/mnt/WindowsC下找到你的系统分区sda1内容,在/home/username/WindowsD中找到sda8的内容(其中username指用户名)。

相关内容

参考资料