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, 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指用户名)。

相关内容

参考资料