如何在Linux(RHEL/CentOS 7)中更改tmpfs分区大小
在本文中,我将分享在Linux中更改(增加/减少)tmpfs分区大小的步骤。借助RHEL 7,Linux内核为用户空间提供了多种不同的通信方式。
对于许多设施而言,存在系统调用,其他设施则隐藏在netlink接口的后面,甚至其他设施也通过虚拟文件系统(如/proc
或者/sys
)公开。这些文件系统是编程接口,实际上并没有真正的持久存储支持。他们仅使用内核的文件系统接口作为各种不相关机制的接口。
现在,默认情况下,systemd将物理内存的特定部分分配给这些分区作为阈值。 "但是如果要求要求我们更改tmpfs分区大小怎么办?"
对于某些tmpfs分区,可以使用fstab
更改阈值大小。对于在运行时创建的其他分区(例如(//run/user /)),我们不能使用fstab更改此类运行时目录的tmpfs分区大小。
以下是RHEL 7中可用的tmpfs
分区列表。
Filesystem Size Used Avail Use% Mounted on tmpfs 187G 0 187G 0% /dev/shm tmpfs 187G 41M 187G 1% /run tmpfs 187G 0 187G 0% /sys/fs/cgroup tmpfs 38G 0 38G 0% /run/user/1710 tmpfs 38G 0 38G 0% /run/user/0
说明:
我们可能会注意到/etc/fstab不包含这些tmpfs分区的条目,但是df -h仍会显示这些分区。
更改/dev/shm的tmpfs分区大小
如果应用程序符合POSIX或者在Red Hat Enterprise Linux系统上使用GLIBC(2.2及更高版本),则通常将使用/dev/shm作为共享内存(shm_open,shm_unlink)。/dev/shm是从/etc/fstab挂载的临时文件系统(tmpfs)。因此,tmpfs支持的标准选项(例如" size")可用于增加或者减少/dev/shm
上tmpfs的大小(默认情况下,它是可用系统RAM的一半)。
例如,要将/dev/shm
的大小设置为2GiB,请在/etc/fstab
中更改以下行:
默认:
none /dev/shm tmpfs defaults 0 0
到:
none /dev/shm tmpfs defaults,size=2G 0 0
为了使更改生效,请立即重新挂载/dev/shm
:
# mount -o remount /dev/shm
说明:
如果在较小的tmpfs大小的新限制内未分配任何块或者索引节点,则挂载-o重新挂载以缩小tmpfs的操作将成功。无法预测或者控制它,但是如果无法重新安装,将无法正常工作。在这种情况下,请使用tmpfs停止所有进程,将其卸载,然后使用新的大小重新安装。
最后验证新尺寸
# df -h /dev/shm Filesystem Size Used Avail Use% Mounted on tmpfs 2.0G 0 2.0G 0% /dev/shm
更改/run的tmpfs分区大小
/run是一个文件系统,应用程序使用的文件系统与以前版本的RHEL中使用/var/run的方式相同。现在/var/run
是指向/run
文件系统的符号链接。以前的早期启动程序曾经将运行时数据放置在/dev中的众多隐藏点目录下。他们之所以在/dev
目录中使用目录,是因为它在机器启动过程中很早就可以使用了。由于/var/run在启动过程中很晚才可用,因为/var可能驻留在单独的文件系统上,所以实现了目录/run。
默认情况下,我们可能找不到/run的任何/etc/fstab
条目,因此我们可以在下面的行中添加
none /run tmpfs defaults,size=600M 0 0
为了使更改生效,请立即重新安装/run
:
# mount -o remount /run
最后验证新尺寸
# df -h /run Filesystem Size Used Avail Use% Mounted on tmpfs 600M 9.6M 591M 2% /run
更改/run/user/$UID的tmpfs分区大小
/run/user/$UID是pam_systemd使用的文件系统,用于存储该用户正在运行的进程使用的文件。在以前的版本中,这些文件通常存储在/tmp
中,因为它是FHS指定的唯一本地位置,并且所有用户均可写入。但是使用/tmp
可能会引起问题,因为任何人都可以写它,因此访问控制很有挑战性。使用/run/user/$UID
解决了这个问题,因为它只能由目标用户访问。
重要的提示:
我们不能使用/etc/fstab
来更改/run/user/$UID
的tmpfs分区大小。
/run/user/$UID的tmps分区大小基于/etc/systemd/logind.conf中的RuntimeDirectorySize值得出。
# grep -i runtime /etc/systemd/logind.conf RuntimeDirectorySize=10%
默认情况下,这些运行时目录的默认阈值为总物理内存的" 10%"。
从logind.conf的man页面中
RuntimeDirectorySize= Sets the size limit on the $XDG_RUNTIME_DIR runtime directory for each user who logs in. Takes a size in bytes, optionally suffixed with the usual K, G, M, and T suffixes, to the base 1024 (IEC). Alternatively, a numerical percentage suffixed by "%" Jan be specified, which sets the size limit relative to the amount of physical RAM. Defaults to 10%. Note that this size is a safety limit only. As each runtime directory is a tmpfs file system, it will only consume as much memory as is needed.
将此变量修改为我们所需的值,例如,我提供了" 100M"的阈值
# grep -i runtime /etc/systemd/logind.conf RuntimeDirectorySize=100M
接下来重新启动systemd-logind
服务
重要的提示:
需要重新启动节点才能激活更改。
更改/sys/fs/cgroup的tmpfs分区大小
/sys/fs/cgroup是一个接口,通过它可以访问控制组。缺省情况下,/sys/fs/cgroup中可能有/etc/fstab内容,因此请添加一个新条目
/sys/fs/cgroup的当前值
# df -h /sys/fs/cgroup Filesystem Size Used Avail Use% Mounted on tmpfs 63G 0 63G 0% /sys/fs/cgroup
在"/etc/fstab"中添加以下行,以将阈值更改为" 2GB"
none /sys/fs/cgroup tmpfs defaults,size=2G 0 0
重新挂载分区"/sys/fs/cgroup"
# mount -o remount /sys/fs/cgroup
最后验证更新的更改
# df -h /sys/fs/cgroup Filesystem Size Used Avail Use% Mounted on tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup