zhangguanzhang's Blog

永久关闭swap的正确姿势

字数统计: 617阅读时长: 3 min
2020/11/20

今天遇到了 kylin 系统上无法关闭 swap 的情况。记录下和方便别人搜到这个知识点。

环境信息

1
2
3
4
$ at /etc/issue
Kylin 4.0.2 \n \l
$ uname -a
Linux H-192-168-63-132 4.15.0- 58-generic #64kord1k1'SMP Thu Aug 1S15:51:97 csT 2919 aarch64 ......

尝试的步骤

fstab 里没有 swap 的挂载,

1
swapoff -a && sysctl -w vm.swappiness=0

重启后,内核参数是关闭的,但是实际没有关闭

1
2
3
4
5
6
7
$ sysctl -a |& grep vm.swappiness
vm.swappiness = 0

$ free -h
total used free shared buff/cache available
Mem: 127G 48G 70G 169M 7.8G 64G
Swap: 7.6G 0B 7.8G

应该有其他的挂载,据我所知, systemd 也会负责挂载的,查找下

1
2
3
4
5
6
7
8
9
10
11
12
13
$ systemctl list-units | grep swap
dev-sda3.swap loaded active active Swap Partition
swap.target loaded active active Swap
$ systemctl cat dev-sda3.swap
# /run/systemd/generator.late/dev-sda3.swap
# Automatically generated by systemd-gpt-auto-generator

[unit]
Description=Swap Partition
Documentation=man:systemd-gpt-auto-generator(8)

[Swap]
What=/dev/sda3

发现这个无法 disable ,会报错 no such file。

解决办法

查找了下文档,systemd-gpt-auto-generator 是一个 GPT 分区 自动发现 与 挂载。会自动生成 mount 和 swap 的 systemd unit 文件。找到了英文文档里有下面的话:

1
2
3
4
systemd-gpt-auto-generator understands the following kernel command line parameters:

systemd.gpt_auto, rd.systemd.gpt_auto
Those options take an optional boolean argument, and default to yes. The generator is enabled by default, and a negative value may be used to disable it.

我们可以通过添加 kernel boot cmdline 来关闭 systemd-gpt-auto-generator

先查找到 grub.cfg

1
2
$ find /boot  -type f -name 'grub*cfg' -exec grep -l '/vmlinuz' {} \;
/boot/grub/grub.cfg

进去备份下文件:

1
2
cd /boot/grub/
cp grub.cfg grub.cfg-20201120

找到类似下面的行:

1
2
3
linux /boot/vmlinuz-xxx
# 或者
linux /vmlinuz-xxx

后面加上 systemd.gpt_auto=false ,文档是写布尔值的,不过我看到有人 systemd.gpt_auto=0 也行。然后重启。

参考正则定位数据

第一行,改完的

1
2
3
4
root@user-PC:/boot/grub/# grep /vmlinuz- grub.cfg
linux /vmlinuz-4.19.0-arm64-server root=UUID=d6d053b2-86e8-4d19-b19b-2051e6d856b5 ro splash quiet console=tty plymouth.ignore-serial-consoles DEEPIN_GFXMODE=$DEEPIN_GFXMODE systemd.gpt_auto=0
linux /vmlinuz-4.19.0-arm64-server root=UUID=d6d053b2-86e8-4d19-b19b-2051e6d856b5 ro splash quiet console=tty plymouth.ignore-serial-consoles DEEPIN_GFXMODE=$DEEPIN_GFXMODE
linux /vmlinuz-4.19.0-arm64-server ro boot=live toram=filesystem.squashfs splash quiet locales=zh_CN.UTF-8 console=tty live-media-path=usr/doppel root=UUID=d6d053b2-86e8-4d19-b19b-2051e6d856b5

2021/03/23 测试了下面的不行。。。
改文件 /etc/default/grubGRUB_CMDLINE_LINUX 后面添加也行。

Azure Linux 的话有个

1
systemctl list-units | grep temp-disk-swapfile

参考

CATALOG
  1. 1. 环境信息
  2. 2. 尝试的步骤
  3. 3. 解决办法
    1. 3.1. 参考正则定位数据
  4. 4. 参考