zram 也称为 zRAM,先前称为 compcache。是 Linux 内核的核心功能,可提供虚拟内存压缩。

zram 通过在 RAM 内压缩块设备的分页,直到必须使用硬盘的交换空间,避免在磁盘进行分页,从而提高性能。

在本教程中,我们将详细说明如何在 Ubuntu 20.04 配置或者启用 zRAM,设置 zRAM的大小以及如何持久化 zRAM的配置参数。

开启/加载 zRAM 模块

zRAM 是 Linux 内核的模块,要启用 zRAM 请使用 modprobe 命令加载 zRAM 模块。运行命令 modprobe zram num_devices=1 。

num_devices 是 zRAM模块的参数,zram num_devices=1 表示仅创建一个设备文件,该文件将会保存在设备目录,文件名称是 /dev/zram0。

如果 num_devices 的数值不等于 1,内核将会创建多个 zram 文件 /dev/zram{0,1,2,3...}。

然后运行 lsmod 命令 lsmod  | grep zram 确认是否成功加载。命令将会打印消息 zram   32768  0 。

sudo modprobe zram num_devices=1
lsmod  | grep zram
zram                   32768  0

持久化开启/加载 zRAM 模块

modprobe 加载的模块仅在当前运行时可用,要在重新启动计算机后,加载 zram 模块,则需要创建内核模块载入文件和模块的配置文件。

要载入 zRAM 模块在/etc/modules-load.d/目录创建文件zram.conf,运行命令 echo "zram" | sudo tee -a /etc/modules-load.d/zram.conf。

然后创建模块的配置文件 zram.conf 在目录 /etc/modules-load.d/,运行命令 echo "options zram num_devices=1" | sudo tee -a /etc/modprobe.d/zram.conf 。

echo "zram" | sudo tee -a /etc/modules-load.d/zram.conf

echo "options zram num_devices=1" | sudo tee -a /etc/modprobe.d/zram.conf

配置 zRAM

通常 zRAM 最常用的设置选项是 zRAM 的大小 disksize 和 zRAM 的压缩算法 comp_algorithm。

控制 zRAM 的大小的文件是 /sys/block/zram0/disksize ,压缩算法文件是 /sys/block/zram0/comp_algorithm 。

可以运行 cat 命令查看两个文件来确定 zRAM 文件的大小和压缩算法,例如命令cat /sys/block/zram0/disksize 查看 zRAM 大小。

同样也可以通过两个文件设置 zRAM 文件的大小和压缩算法,例如命令 echo "512M" | sudo tee /sys/block/zram0/disksize 修改 zRAM 的大小。

echo "512M" | sudo tee /sys/block/zram0/disksize
echo "lzo" | sudo tee /sys/block/zram0/comp_algorithm

持久化 zRAM 配置

由于 /sys 目录是基于内存的文件系统,因此重启系统后,你设置的 zRAM 参数将不再存在。要持久化 zRAM 的参数,请使用 udev 进行设置。

udev 是一个用户空间系统,简单来说就是 Linux 设备管理器。它使操作系统管理员能够为设备事件运行用户指定的程序或者脚本,也可以在添加设备时指定设备参数。

要设置 zRAM 的大小,可以在 udev 规则文件的 ATTR 指定 zRAM 大小 disksize,ATTR{disksize}="512M" 表示设置 zRAM 的大小是 512M。

要设置 zRAM 的其它属性,可以在 udev 规则文件指定多个 ATTR 属性设置设备参数。例如设置 zRAM 压缩算法 ,可以添加属性 ATTR{comp_algorithm}="lzo"。

# Persistent

echo 'KERNEL=="zram0", ATTR{disksize}="512M",TAG+="systemd"' | sudo tee  /etc/udev/rules.d/99-zram.rules

echo 'KERNEL=="zram0", ATTR{disksize}="512M", ATTR{comp_algorithm}="lzo", TAG+="systemd"' | sudo tee  /etc/udev/rules.d/99-zram.rules

激活 zRAM

要在当前运行时启用 zRAM 可以将 zRAM 当作交换空间一样的方式启用。首先需要将 zRAM 文件进行格式化,运行命令 sudo mkswap /dev/zram0 。

当格式化完成后,为了让系统识别 zRAM 文件,因此还需要启用 zRAM 文件。可以运行命令 sudo swapon /dev/zram0 启用 zRAM 文件。

如果你系统已经存在交换空间,那么总的交换空间的大小是zRAM的大小加交换空间的大小。

sudo mkswap /dev/zram0
sudo swapon /dev/zram0

自动挂载 zRAM

现在已经在内核启用 zRAM 模块,接下来创建 SystemD 单元文件,在系统启动时自动激活 zRAM 文件并作为交换空间挂载。

使用你喜欢的文本编辑器创建文件 /etc/systemd/system/zram.service 。在本教程中,我们使用vim 创建并编辑文件 SystemD 单元文件

编辑完成后,保存文件并退出 vim 编辑器,然后运行命令 sudo systemctl enable zram 启用 zram 服务,最后重启计算机。

sudo vim /etc/systemd/system/zram.service
sudo systemctl enable zram
[Unit]
Description=Swap with zram
After=multi-user.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStartPre=/sbin/mkswap /dev/zram0
ExecStart=/sbin/swapon /dev/zram0
ExecStop=/sbin/swapoff /dev/zram0

[Install]
WantedBy=multi-user.target
/etc/systemd/system/zram.service
如何自定义Linux systemd单元文件 | myfreax
在本教程中,我们将讨论systemctl命令,它是用于控制初始化系统的中央管理工具。我们将介绍如何查看服务依赖,单元文件的定义,使用配置文件,检查单元属性
如何自定义Linux systemd单元文件