挂载文件系统选项nodiratime、noatime等集合小结

Linux系统文件有三个主要的时间属性,分别是ctime(changetime),atime(accesstime),mtime(modifytime)。这三个时间很容易混淆,准备深入了解Linux的童鞋请区分这三者的区别

atime:Accesstime,是在读取文件或者执行文件时更改,即文件最后一次被读取的时间。

说明:st_atime

Timewhenfiledatawaslastaccessed.Changedbythe

followingfunctions:creat(),mknod(),pipe(),

utime(2),andread(2).

mtime:Modifiedtime,是在写入文件时随文件内容的更改而更改,是指文件内容最后一次被修改的时间。

说明:st_mtime

Timewhendatawaslastmodified.Changedbythefol-

lowingfunctions:creat(),mknod(),pipe(),utime(),

andwrite(2).

ctime:Changetime,是在写入文件、更改所有者、权限或链接设置时随Inode的内容更改而更改,即文件状态最后一次被改变的时间。

说明:st_ctime

Timewhenfilestatuswaslastchanged.Changedbythe

followingfunctions:chmod(),chown(),creat(),

link(2),mknod(),pipe(),unlink(2),utime(),and

write().

很多人把它理解成createtime,包括很多误导人的书籍也是这么写。实际上ctime是指changetime。

注意:

1、修改是文本本身的内容发生了变化(mtime)

改变是文件的索引节点发生了改变(ctime)

2、如果修改了文件内容,则同时更新ctime和mtime

3、如果只改变了文件索引节点,比如修改权限,则只是改变了ctime

4、如果使用ext3文件系统的时候,在mount的时候使用了noatime参数则不会更新atime的信息,即访问文件之后atime不会被修改,而这个不代表真实情况

小知识:这三个timestamp都放在inode中。若mtime,atime修改,inode就一定会改,相应的inode改了,那ctime也就跟着要改了,之所以在mountoption中使用noatime,就是不想filesystem做太多的修改,从而改善读取性能.

查看文件的atime、ctime和mtime。

#ls-lcfilename列出文件的ctime

#ls-lufilename列出文件的atime

#ls-lfilename列出文件的mtime

例子

1:#echo"HelloWorld">>myfileatime不变,同时改变了ctime和mtime

2:#catmyfilectime和mtime不变,只改变atime

#lsmyfile

ctime和mtime以及atime都不改变

3:#chmodu+xmyfilemtime和atime不变,只改变ctime

4:#mvmyfile../

mtime和atime不变,只改变ctime

其他扩展:

relatime属性

从kernel2.6.29开始,默认集成了一个relatime的属性。使用这个特性来挂装文件系统后,只有当mtime比atime更新的时候,才会更新atime。

使用场景:

在文件读操作很频繁的系统中,atime更新所带来的开销很大,所以在挂装文件系统的时候使用noatime属性来停止更新atime。但是有些程序需要根据atime进行一些判断和操作,这个时候relatime特性就派上用场了。其实在事实上,这个时候atime和mtime已经是同一个time,所以可以理解这个选项就是为了实现对atime的兼容才推出的,并不是一个新的时间属性。

使用方法:#mount-orelatime/dir##挂载目录的时候加relatime参数

---------------------------------------------------------------------

默认的方式下linux会把文件访问的时间atime做记录,文件系统在文件被访问、创建、修改等的时候记录下了文件的一些时间戳,比如:文件创建时间、最近一次修改时间和最近一次访问时间;这在绝大部分的场合都是没有必要的。

因为系统运行的时候要访问大量文件,如果能减少一些动作(比如减少时间戳的记录次数等)将会显著提高磁盘IO的效率、提升文件系统的性能。

如果遇到机器IO负载高或是CPUWAIT高的情况,可以尝试使用noatime和nodiratime禁止记录最近一次访问时间戳。

修改/etc/fstab中

[plain]viewplaincopy

UUid="4231b126-7e67-45c4-b8bf-554006291d35"/sdb_mntxfsdefaults02

[plain]viewplaincopy

UUid="4231b126-7e67-45c4-b8bf-554006291d35"/sdb_mntxfsdefaults,noatime02

修改后重新挂载

[plain]viewplaincopy

mount-oremount/sdb_mnt

或者手动临时挂载

[plain]viewplaincopy

mount-onoatime-onodiratime-oremount/sdb_mnt

做实验看看具体有什么区别:

[plain]viewplaincopy

[root@centos7~]#mount-txfs-onoatime-onodiratime/dev/sdc1/mnt_test

[root@centos7~]#touch/mnt_test/f1.txt

[root@centos7~]#stat/mnt_test/f1.txt

File:‘/mnt_test/f1.txt’

Size:0Blocks:0IOBlock:4096regularemptyfile

Device:821h/2081dInode:131Links:1

Access:(0644/-rw-r--r--)Uid:(0/root)Gid:(0/root)

Access:2017-10-1311:26:18.057992489+0800

Modify:2017-10-1311:26:18.057992489+0800

Change:2017-10-1311:26:18.057992489+0800

Birth:-

[root@centos7~]#sellp1;echohello>>/mnt_test/f1.txt;stat/mnt_test/f1.txt

bash:sellp:commandnotfound...

File:‘/mnt_test/f1.txt’

Size:6Blocks:8IOBlock:4096regularfile

Device:821h/2081dInode:131Links:1

Access:(0644/-rw-r--r--)Uid:(0/root)Gid:(0/root)

Access:2017-10-1311:26:18.057992489+0800

Modify:2017-10-1311:26:58.310992121+0800

Change:2017-10-1311:26:58.310992121+0800

Birth:-

[root@centos7~]#cat/mnt_test/f1.txt;stat/mnt_test/f1.txt

hello

File:‘/mnt_test/f1.txt’

Size:6Blocks:8IOBlock:4096regularfile

Device:821h/2081dInode:131Links:1

Access:(0644/-rw-r--r--)Uid:(0/root)Gid:(0/root)

Access:2017-10-1311:26:18.057992489+0800

Modify:2017-10-1311:26:58.310992121+0800

Change:2017-10-1311:26:58.310992121+0800

Birth:-

可以看到

指定"noatime,nodiratime"的情况下

read文件的时候不会导致atime、mtime、ctime改变

write文件只会导致mtime和ctime更新,不会导致atime更新

[plain]viewplaincopy

[root@centos7~]#umount/mnt_test/

[root@centos7~]#mount/dev/sdc1/mnt_test

[root@centos7~]#touch/mnt_test/f2.txt

[root@centos7~]#stat/mnt_test/f1.txt

File:‘/mnt_test/f1.txt’

Size:6Blocks:8IOBlock:4096regularfile

Device:821h/2081dInode:131Links:1

Access:(0644/-rw-r--r--)Uid:(0/root)Gid:(0/root)

Access:2017-10-1311:28:30.220991280+0800

Modify:2017-10-1311:28:47.527991122+0800

Change:2017-10-1311:28:47.527991122+0800

Birth:-

[root@centos7~]#stat/mnt_test/f2.txt

File:‘/mnt_test/f2.txt’

Size:0Blocks:0IOBlock:4096regularemptyfile

Device:821h/2081dInode:132Links:1

Access:(0644/-rw-r--r--)Uid:(0/root)Gid:(0/root)

Access:2017-10-1311:30:24.526990235+0800

Modify:2017-10-1311:30:24.526990235+0800

Change:2017-10-1311:30:24.526990235+0800

Birth:-

[root@centos7~]#sellp1;echohello>>/mnt_test/f2.txt;stat/mnt_test/f2.txt

bash:sellp:commandnotfound...

File:‘/mnt_test/f2.txt’

Size:6Blocks:8IOBlock:4096regularfile

Device:821h/2081dInode:132Links:1

Access:(0644/-rw-r--r--)Uid:(0/root)Gid:(0/root)

Access:2017-10-1311:30:24.526990235+0800

Modify:2017-10-1311:30:45.416990044+0800

Change:2017-10-1311:30:45.416990044+0800

Birth:-

[root@centos7~]#cat/mnt_test/f2.txt;stat/mnt_test/f2.txt

hello

File:‘/mnt_test/f2.txt’

Size:6Blocks:8IOBlock:4096regularfile

Device:821h/2081dInode:132Links:1

Access:(0644/-rw-r--r--)Uid:(0/root)Gid:(0/root)

Access:2017-10-1311:31:24.637989686+0800

Modify:2017-10-1311:30:45.416990044+0800

Change:2017-10-1311:30:45.416990044+0800

Birth:-

可以看到未指定"noatime,nodiratime"的情况下

read文件的时候会导致atime更新,不会导致mtime和ctime更新

write文件只会导致mtime和ctime更新,不会导致atime更新

扩展知识,fstab格式,参照网上

/etc/fstab是用来存放文件系统的静态信息的文件。位于/etc/目录下,可以用命令less/etc/fstab来查看,如果要修改的话,则用命令vi/etc/fstab来修改。

当系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录。下面我来介绍如何在此文件下填写信息。

文件示例

一个简单的/etc/fstab,使用内核名称标识磁盘:

/etc/fstab

#<filesystem><dir><type><options><dump><pass>

tmpfs/tmptmpfsnodev,nosuid00

/dev/sda1/ext4defaults,noatime01

/dev/sda2noneswapdefaults00

/dev/sda3/homeext4defaults,noatime02

字段定义

/etc/fstab文件包含了如下字段,通过空格或Tab分隔:

<filesystem><dir><type><options><dump><pass>

<filesystems>-要挂载的分区或存储设备.

<dir>-<filesystems>的挂载位置。

<type>-要挂载设备或是分区的文件系统类型,支持许多种不同的文件系统:ext2,ext3,ext4,reiserfs,xfs,jfs,smbfs,iso9660,vfat,ntfs,swap及auto。设置成auto类型,mount命令会猜测使用的文件系统类型,对CDROM和DVD等移动设备是非常有用的。

<options>-挂载时使用的参数,注意有些mount参数是特定文件系统才有的。一些比较常用的参数有:

auto-在启动时或键入了mount-a命令时自动挂载。

noauto-只在你的命令下被挂载。

exec-允许执行此分区的二进制文件。

noexec-不允许执行此文件系统上的二进制文件。

ro-以只读模式挂载文件系统。

rw-以读写模式挂载文件系统。

user-允许任意用户挂载此文件系统,若无显示定义,隐含启用noexec,nosuid,nodev参数。

users-允许所有users组中的用户挂载文件系统.

nouser-只能被root挂载。

owner-允许设备所有者挂载.

sync-I/O同步进行。

async-I/O异步进行。

dev-解析文件系统上的块特殊设备。

nodev-不解析文件系统上的块特殊设备。

suid-允许suid操作和设定sgid位。这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。

nosuid-禁止suid操作和设定sgid位。

noatime-不更新文件系统上inode访问记录,可以提升性能(参见atime参数)。

nodiratime-不更新文件系统上的目录inode访问记录,可以提升性能(参见atime参数)。

relatime-实时更新inodeaccess记录。只有在记录中的访问时间早于当前访问才会被更新。(与noatime相似,但不会打断如mutt或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能(参见atime参数)。

flush-vfat的选项,更频繁的刷新数据,复制对话框或进度条在全部数据都写入后才消失。

defaults-使用文件系统的默认挂载参数,例如ext4的默认参数为:rw,suid,dev,exec,auto,nouser,async.

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

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

文件系统标识

在/etc/fstab配置文件中你可以以三种不同的方法表示文件系统:内核名称、UUID或者label。使用UUID或是label的好处在于它们与磁盘顺序无关。如果你在BIOS中改变了你的存储设备顺序,或是重新拔插了存储设备,或是因为一些BIOS可能会随机地改变存储设备的顺序,那么用UUID或是label来表示将更有效。参见持久化块设备名称。

要显示分区的基本信息请运行:

$lsblk-f

NAMEFSTYPELABELUUIDMOUNTPOINT

sda

├─sda1ext4Arch_Linux978e3e81-8048-4ae1-8a06-aa727458e8ff/

├─sda2ntfsWindows6C1093E61093B594

└─sda3ext4Storagef838b24e-3a66-4d02-86f4-a2e73e454336/media/Storage

sdb

├─sdb1ntfsGames9E68F00568EFD9D3

└─sdb2ext4Backup14d50a6c-e083-42f2-b9c4-bc8bae38d274/media/Backup

sdc

└─sdc1vfatCamera47FA-4071/media/Camera

内核名称

你可以使用fdisk-l来获得内核名称,前缀是dev.

标签

注意:使用这一方法,每一个标签必须是唯一的.

要显示所有设备的标签,可以使用lsblk-f命令。在/etc/fstab中使用LABEL=作为设备名的开头:

/etc/fstab

#<filesystem><dir><type><options><dump><pass>

tmpfs/tmptmpfsnodev,nosuid00

LABEL=Arch_Linux/ext4defaults,noatime01

LABEL=Arch_Swapnoneswapdefaults00

UUID

所有分区和设备都有唯一的UUID。它们由文件系统生成工具(mkfs.*)在创建文件系统时生成。

lsblk-f命令将显示所有设备的UUID值。/etc/fstab中使用UUID=前缀:

/etc/fstab

#<filesystem><dir><type><options><dump><pass>

tmpfs/tmptmpfsnodev,nosuid00

UUID=24f28fc6-717e-4bcd-a5f7-32b959024e26/ext4defaults,noatime01

UUID=03ec5dd3-45c0-4f95-a363-61ff321a09ff/homeext4defaults,noatime02

UUID=4209c845-f495-4c43-8a03-5363dd433153noneswapdefaults00

提示和技巧

自动挂载

如果/home分区较大,可以让不依赖/home分区的服务先启动。把下面的参数添加到/etc/fstab文件中/home项目的参数部分即可:

noauto,x-systemd.automount

这样/home分区只有需要访问时才会被挂载。内核会缓存所有的文件操作,直到/home分区准备完成。

注意:这样做会使/home的文件系统类型被识别为autofs,造成mlocate查询时忽略该目录。实际加速效果因配置而异,所以请自己权衡是否需要。

挂载远程文件系统也是同理。如果你仅想在需要的时候才挂载,也可以添加noauto,x-systemd.automount参数。另外,可以设置x-systemd.device-timeout=#参数,设置超时时间,以防止网络资源不能访问的时候浪费时间。

如果你的加密文件系统需要密钥,则需要添加noauto参数到/etc/crypttab文件中的对应位置。systemd开机的时候就不会打开这个加密设备,会一直等待到设备被访问时再使用密钥文件挂载。比如在使用加密RAID设备的时候可以节省一定的时间,因为systemd不必等到设备可用后才能访问。例如:

/etc/crypttab

data/dev/md0/root/keynoauto

交换分区UUID

如果交换分区没有UUID,可以手动加入。如果使用lsblk-f命令没有列出交换分区的UUID就说明发生了这种情况。下面是为交换分区指定UUID的步骤:

确定交换分区:

#swapon-s

禁用交换分区:

#swapoff/dev/sda7

用新UUID重新创建交换分区:

#mkswap-Urandom/dev/sda7

激活交换分区:

#swapon/dev/sda7

路径名有空格

如果挂载的路径中有空格,可以使用"\040"转义字符来表示空格(以三位八进制数来进行表示)

/etc/fstab

UUID=47FA-4071/home/username/Camera\040Picturesvfatdefaults,noatime02

/dev/sda7/media/100\040GB\040(Storage)ext4defaults,noatime,user00

.....</nowiki>}}

外部设备

外部设备在插入时挂载,在未插入时忽略。这需要nofail选项,可以在启动时若设备不存在直接忽略它而不报错.

/etc/fstab

/dev/sdg1/media/backupjfsdefaults,nofail02

atime参数

使用noatime,nodiratime或relatime可以提升ext2,ext3及ext4格式磁盘的性能。Linux在默认情况下使用atime选项,每次在磁盘上读取(或写入)数据时都会产生一个记录。这是为服务器设计的,在桌面使用中意义不大。默认的atime选项最大的问题在于即使从页面缓存读取文件(从内存而不是磁盘读取),也会产生磁盘写操作!

使用noatime选项阻止了读文件时的写操作。大部分应用程序都能很好工作。只有少数程序如Mutt需要这些信息。Mutt的用户应该使用relatime选项。使用relatime选项后,只有文件被修改时才会产生文件访问时间写操作。nodiratime选项仅对目录禁用了文件访问时间。relatime是比较好的折衷,Mutt等程序还能工作,但是仍然能够通过减少访问时间更新提升系统性能。

注意:noatime已经包含了nodiratime。不需要同时指定。

tmpfs

tmpfs是一个临时文件系统,驻留于你的交换分区或是内存中(取决于你的使用情况)。使用它可以提高文件访问速度,并能保证重启时会自动清除这些文件。

经常使用tmpfs的目录有/tmp,/var/lockand/var/run.不要将之使用于/var/tmp,因为这一目录中的临时文件在重启过程中需要被保留。使用tmpfs/run目录,/var/run和/var/lock是为了兼容老版本建立的链接。默认/etc/fstab中的的/tmp也是tmpfs.

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

要将/tmp放到tmpfs,将下行加入/etc/fstab:

/etc/fstab

.....

tmpfs/tmptmpfsnodev,nosuid00

.....

可以指定大小,但不要修改mode选项,以保证文件具有正确的访问权限(1777)。在上例中/tmp将最多使用一半内存,要指定最大空间,使用size挂载选项:

/etc/fstab

.....

tmpfs/tmptmpfsnodev,nosuid,size=2G00

.....

这里有一个更高级的例子,展示如何为用户添加tmpfs挂载。这对于网站、mysql临时文件,~/.vim/,和其他情况很有用。尝试并获得理想的挂载选项来完成目标是很重要的。目标是尽量采用安全的策略来防止滥用。限制大小,同时指定uid和gid加上mode是非常安全的。更多信息.

/etc/fstab

tmpfs/www/cachetmpfsrw,size=1G,nr_inodes=5k,noexec,nodev,nosuid,uid=648,gid=648,mode=170000

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

重启后方能生效。注意不要直接执行mount-a命令,因为可能造成无法访问当前目录中的文件(比如你应该保证lockfiles的正常存在)。然而,如果它们都是空的,那么就可以直接执行mount-a而不必重启电脑。

应用更改后,可以通过findmnt检查是否生效:

$findmnt--target/tmp

TARGETSOURCEFSTYPEOPTIONS

/tmptmpfstmpfsrw,nosuid,nodev,relatime

使用

一般需要大量读写操作的程序在使用tmpfs时都会提升性能。有些程序把共享内存放到tmpfs上时性能会大幅提升,例如将FirefoxProfile文件夹放到内存后,Firefox性能大幅提升。

Note:tmpfs目录(/tmp)挂载时需要去掉noexec参数,否则有些编译程序无法执行,此外,tmpfs的默认大小是内存的一般,可能会产生空间不够的问题。

下面命令可以让makepkg在tmpfs目录进行编辑,也可以在在/etc/makepkg.conf中进行设置:

$BUILDDIR=/tmp/makepkgmakepkg

普通用户读写FAT32

为了取得对FAT32分区的写权限,你必须修改/etc/fstab文件。

/etc/fstab

/dev/sdxY/mnt/some_foldervfatuser,rw,umask=00000

“users”标签的意思是任何用户(甚至非root用户)都可以挂载或卸载分区'/dev/sdX'。“rw”标签则分配读写的使用权。但我不知道“umask”标签的意义(umask是权限掩码命令umask=000指任何人没有特权,且权限为777,即所有人都可以读、写、执行)。我曾试图在“manmount”中查询,但是没有什么结果。

比如你的FAT32分区在'/dev/sda9',你想将其挂载到'/mnt/fat32',那么你需要输入并运行

/etc/fstab

/dev/sda9/mnt/fat32vfatuser,rw,umask=111,dmask=00000

相关推荐