tmpfs是一种基于内存的文件系统,它将一部分系统内存用作临时存储空间。在Linux系统中,tmpfs常用于挂载临时目录,如/run、/tmp和var等目录,用于存储临时文件、进程运行时数据和其他临时性数据。
tmpfs的优点:
快速访问:由于tmpfs将数据存储在内存中,读写速度非常快,比传统的磁盘文件系统更高效。
自动分配和释放内存:tmpfs会根据需要动态分配和释放内存空间,根据文件的使用情况进行调整(
tmpfs内部使用了一种称为"page cache"的机制来管理内存。Page cache是一种内核中的缓存机制,用于将文件数据从磁盘加载到内存中,并在需要时进行读取和写入操作。tmpfs使用page cache来缓存tmpfs文件系统中的数据。
当文件被写入tmpfs时,内核会将数据存储在page cache中,并将其标记为属于tmpfs文件系统。如果系统内存足够,数据将保留在内存中,以提供快速的读写访问。如果系统内存不足,内核会根据一定的策略将部分数据写回到磁盘,以释放内存空间。
)
临时性:tmpfs中的数据在系统重启后会被清除,因此适合存储临时文件和临时数据。
要在Linux系统上使用tmpfs,可以使用mount命令将其挂载到指定的目录。以下是一个示例:
sudo mount -t tmpfs -o size=1G tmpfs /var
这将创建一个1GB大小的tmpfs实例,并将其挂载到指定的目录。可以根据需要调整size参数的值。
tmpfs的大小和使用方式可以通过挂载选项进行配置。在挂载tmpfs时,可以指定其大小、文件系统权限等参数。下面是一些常用的挂载选项:
rw
:挂载为可读写的文件系统。seclabel
:启用安全标签(SELinux)支持。nosuid
:禁止设置文件的SUID和SGID权限位。nodev
:禁止在文件系统上创建特殊设备文件。size
:指定tmpfs文件系统的最大大小。这个值表示以字节为单位的大小,可以使用K(千字节)、M(兆字节)或G(千兆字节)作为后缀,例如size=1G表示1GB大小的tmpfs文件系统。nr_inodes
:指定tmpfs文件系统的最大inode数量(文件和目录的索引节点)。这个值表示tmpfs文件系统可以支持的最大文件和目录数量。mode
:指定tmpfs文件系统的默认权限模式。这个值表示文件和目录的默认权限,通常以八进制表示,例如mode=1777表示权限为rwxrwxrwt。通过设置不同的挂载选项,可以为不同的目录(如/run和/tmp)创建不同大小的tmpfs实例,并为其设置不同的权限和所有者,这些参数可以根据需要进行调整。例如,可以根据系统的内存情况和使用需求来设置size参数,以控制tmpfs文件系统的大小。nr_inodes参数可以用于限制tmpfs文件系统中的文件和目录数量,以防止过多的文件占用内存。
例如,可以使用以下命令将一个1GB大小的tmpfs挂载到/run目录:
sudo mount -t tmpfs -o size=1G tmpfs /run
有时看到系统启动后可以看到多个tmpfs目录,并且每个目录大小不同,其就是通过size来指定的,如下:
# df | grep tmpfs
tmpfs 326460 1128 425632 1% /run
tmpfs 326460 0 526760 0% /sys/fs/cgroup
tmpfs 326460 2840 323620 1% /var/cache
再比如一些多参数解析:
tmpfs /run tmpfs rw,seclabel,nosuid,nodev,size=481160k,nr_inodes=12545,mode=755 0 0
这里主要介绍后两位0 0,其他参考上述参数含义。
0 0
:这是用于文件系统检查和备份的选项,表示在启动时不进行文件系统检查,并且不进行备份。
0
:表示在系统启动时对该文件系统进行检查的顺序。0
表示不进行检查,1
表示首先检查,2
表示在其他文件系统之后检查。0
:表示备份选项。0
表示不进行备份,1
表示备。0 0
只是用于指定文件系统检查和备份的选项,并不直接执行备份操作,如需备份需通过tar
、rsync
、cp
等来进行文件系统的备份操作。 /etc/fstab
和/etc/mtab
是两个不同的文件,用于存储关于文件系统挂载和已挂载文件系统的信息。
/etc/fstab
(文件系统表)是一个静态的配置文件,用于定义系统在启动时应该如何挂载文件系统。它包含了文件系统的设备名、挂载点、文件系统类型以及挂载选项等信息。通过编辑/etc/fstab
文件,可以配置系统在启动时自动挂载所需的文件系统。
/etc/mtab
(挂载表)是一个动态的文件,记录了当前已挂载的文件系统的信息。它包含了已挂载文件系统的设备名、挂载点、文件系统类型、挂载选项以及挂载的状态等息。/etc/mtab
文件是由系统自动生成和更新的,它反映了当前系统中的挂载情况。可以看到mtab是软链接到/proc/self/mounts中的,而mounts是由内核生成的节点。
ls -l /etc/mtab
lrwxrwxrwx 1 root root 19 Nov 25 10:29 /etc/mtab -> ../proc/self/mounts
对于如何调用以及在哪里调用的,由上可知mtab是由内核来记录的。对于fstab,通常是这样的:
内核代码init_main.c(kernel_init函数)----->try_to_run_init_process("/sbin/init")----->systemd----->systemd 会读取并解析 /etc/fstab
文件,然后根据其中的配置信息挂载文件系统。
对于 dump
标志,一般设置为 0 或 1。其中,0 表示不需要备份,1 表示需要备份。通常,对于不需要备份的文件系统,可以将其设置为 0。
对于 fsck
标志,一般设置为 0、1 或 2。其中,0 表示不需要进行文件系统检查,1 表示在启动时进行文件系统检查,2 表示进行文件系统检查,但如果文件系统标记为 "clean",则跳过检查。通常,对于根文件系统,建议将其设置为 1,以确保在系统启动时进行文件系统检查。
以下是一个示例 /etc/fstab
文件的片段,展示了如何设置 dump
和 fsck
标志:
/dev/sda1 / ext4 defaults 1 1
/dev/sdb1 /data ext4 defaults 0 2
说明:/sbin/init
实际上是一个符号链接,指向真正的初始化程序,如systemd
、SysV init等。
systemd有systemd-tmpfiles-clean.service相关服务,可借助此来完成。
/etc/tmpfiles.d/tmp-cleanup.conf
# 清除tmp目录下的临时文件和目录
# 清除规则的格式为:d <路径> <权限> <所有者> <组> <延迟>
# - 表示删除文件或目录
# L 表示遵循符号链接
# r 表示递归删除目录中的文件和子目录
# /tmp/whitelist 表示白名单文件路径
# /tmp/blacklist 表示黑名单文件路径
# 清除tmp目录下的所有文件和目录
/tmp/* - - - - -
# 从白名单文件中读取要保留的文件和目录
/tmp/whitelist r! - - - -
# 从黑名单文件中读取要删除的文件和目录
/tmp/blacklist r - - - -
# 设置清除间隔为每周一次
d /tmp - - - 7d
其中使用1d
表示每天一次,1w
表示每周一次,1m
表示每月一次等。