tmpfs文件系统介绍

一、概述

        tmpfs是一种基于内存的文件系统,它将一部分系统内存用作临时存储空间。在Linux系统中,tmpfs常用于挂载临时目录,如/run、/tmp和var等目录,用于存储临时文件、进程运行时数据和其他临时性数据。

tmpfs的优点:

  1. 快速访问:由于tmpfs将数据存储在内存中,读写速度非常快,比传统的磁盘文件系统更高效。

  2. 自动分配和释放内存:tmpfs会根据需要动态分配和释放内存空间,根据文件的使用情况进行调整(

    tmpfs内部使用了一种称为"page cache"的机制来管理内存。Page cache是一种内核中的缓存机制,用于将文件数据从磁盘加载到内存中,并在需要时进行读取和写入操作。tmpfs使用page cache来缓存tmpfs文件系统中的数据。

    当文件被写入tmpfs时,内核会将数据存储在page cache中,并将其标记为属于tmpfs文件系统。如果系统内存足够,数据将保留在内存中,以提供快速的读写访问。如果系统内存不足,内核会根据一定的策略将部分数据写回到磁盘,以释放内存空间。

  3. 临时性:tmpfs中的数据在系统重启后会被清除,因此适合存储临时文件和临时数据。

要在Linux系统上使用tmpfs,可以使用mount命令将其挂载到指定的目录。以下是一个示例:

sudo mount -t tmpfs -o size=1G tmpfs /var

这将创建一个1GB大小的tmpfs实例,并将其挂载到指定的目录。可以根据需要调整size参数的值。

二、tmpfs挂载

        tmpfs的大小和使用方式可以通过挂载选项进行配置。在挂载tmpfs时,可以指定其大小、文件系统权限等参数。下面是一些常用的挂载选项:

  1. rw:挂载为可读写的文件系统。
  2. seclabel:启用安全标签(SELinux)支持。
  3. nosuid:禁止设置文件的SUID和SGID权限位。
  4. nodev:禁止在文件系统上创建特殊设备文件。
  5. size:指定tmpfs文件系统的最大大小。这个值表示以字节为单位的大小,可以使用K(千字节)、M(兆字节)或G(千兆字节)作为后缀,例如size=1G表示1GB大小的tmpfs文件系统。
  6. nr_inodes:指定tmpfs文件系统的最大inode数量(文件和目录的索引节点)。这个值表示tmpfs文件系统可以支持的最大文件和目录数量。
  7. 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只是用于指定文件系统检查和备份的选项,并不直接执行备份操作,如需备份需通过tarrsynccp等来进行文件系统的备份操作。

三、fstab和mtab区别和调用

  /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 文件,然后根据其中的配置信息挂载文件系统。

  1. 文件系统设备或UUID:指定要挂载的文件系统的设备名称或UUID。
  2. 挂载点:指定文件系统要挂载到的目录。
  3. 文件系统类型:指定文件系统的类型,如 ext4、ntfs、tmpfs 等。
  4. 挂载选项:指定挂载时的选项,如读写权限、自动挂载等。
  5. dump:用于备份的标志,一般设置为 0 或者 1。
  6. fsck:指定系统启动时是否需要进行文件系统检查,一般设置为 0、1 或者 2。

对于 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实际上是一个符号链接,指向真正的初始化程序,如systemdSysV init等。

四、tmp清除规则

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表示每月一次等。

你可能感兴趣的:(linux,systemd,文件系统,tmpfs)