挂载文件系统选项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