本文记录了我在 Centos 7 系统上升级 systemd 并切换 cgroupv2 的一些尝试。
背景
在 linux 4.5 版本中 cgroup v2 已经作为新特性加入到了内核代码,用户升级系统内核后,可以通过以下命令查看是否支持 cgroup v2 能力:
1
2
3
4
5
|
grep cgroup /proc/filesystems
# OUTPUT
nodev cgroup
nodev cgroup2
|
kubernetes 1.25.0 版本已经全面支持 cgroup v2,官方文档 建议:将 cgroupDriver 配置为 systemd,这样将 kubelet 可以通过 systemd 在 cgroup 的 v1 和 v2 版本之间进行自适应。因此对 kubernetes/cri-runtime 进行 cgroup v2 适配,实际上是将 systemd 从默认的 cgroup v1 切换到 cgroup v2。
由于 centos 7 系统的 systemd-219 版本过于老旧,并不支持 cgroup v2。因此我尝试通过源码安装的方式将 systemd 升级到 247,再通过配置系统引导参数的方式将 systemd 默认 cgroup 版本切换到 v2。
issues/23109 中,systemd 官方明确指出 centos 7 由于年代过于久远,可能无法升级高版本的 systemd
升级 systemd
1. 方案一:源码安装
该方案有几率使系统崩溃
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
# 安装编译工具
yum install centos-release-scl
yum install devtoolset-7
scl enable devtoolset-7 bash
source /opt/rh/devtoolset-7/enable
# 默认情况下上述命令安装的 gcc 版本是 gcc-4.8.5-36,使用该版本 gcc 编译 systemd 会失败,参考 https://github.com/systemd/systemd/pull/14726
# 可以通过以下命令升级 gcc 版本为 gcc-4.8.5-44
yum -y update gcc
# 安装python3.6
wget https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tgz
tar -xf Python-3.6.15.tgz && cd Python-3.6.15
./configure --prefix=/usr/local --with-ssl
make altinstall
ln -s /usr/local/bin/python3.6 /usr/bin/python3
ln -s /usr/local/bin/pip3.6 /usr/bin/pip3
pip3 install --upgrade pip
# 安装其他依赖
yum install http://repo.okay.com.mx/centos/7/x86_64/release/okay-release-1-1.noarch.rpm
yum install -y libcap-devel ninja-build meson m4
# 安装 gperf
wget http://ftp.gnu.org/pub/gnu/gperf/gperf-3.1.tar.gz
tar -zxvf gperf-3.1.tar.gz && cd gperf-3.1
./configure && make && make install
cd -
# 安装 cmake
yum -y install openssl-devel
wget https://github.com/Kitware/CMake/releases/download/v3.22.4/cmake-3.22.4.tar.gz
tar -zxvf cmake-3.22.4.tar.gz && cd cmake-3.22.4
./bootstrap --prefix=/usr --datadir=share/cmake --docdir=doc/cmake && make
make install
cd -
# 安装 util-linux(https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/)
wget https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.30/util-linux-2.30.2.tar.gz
tar zxf util-linux-2.30.2.tar.gz && cd util-linux-2.30.2
./configure --disable-all-programs --enable-mount --enable-libmount --enable-libblkid --enable-libuuid
make && make install
cp mount /usr/bin/mount
cp umount /usr/bin/umount
ln /usr/lib/libmount.so /usr/lib64/libmount.so
cp ./libmount/mount.pc /usr/lib64/pkgconfig/mount.pc
cp ./libblkid/blkid.pc /usr/lib64/pkgconfig/blkid.pc
cp ./libuuid/uuid.pc /usr/lib64/pkgconfig/uuid.pc
cd -
# 升级 systemd
wget https://github.com/systemd/systemd/archive/v247.tar.gz
tar -zxvf systemd-247.tar.gz && cd systemd-247
./configure && make && make install
cd -
|
2. 方案二:yum 方式升级
参考 systemd-231-latest-in-centos-7-thx-to-facebook 这篇博客,facebook 提供了一个第三方 Yum 仓库,通过该仓库可以将 systemd 最高升级到 234 版本。
1
2
3
4
5
6
7
8
9
10
|
[copr:copr.fedorainfracloud.org:jsynacek:systemd-backports-for-centos-7]
name=Copr repo for systemd-backports-for-centos-7 owned by jsynacek
baseurl=https://download.copr.fedorainfracloud.org/results/jsynacek/systemd-backports-for-centos-7/epel-7-$basearch/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://download.copr.fedorainfracloud.org/results/jsynacek/systemd-backports-for-centos-7/pubkey.gpg
repo_gpgcheck=0
enabled=1
enabled_metadata=1
|
需要注意:升级 systemd 后如果重启服务器会导致网卡设备名称会发生变化,用户需要重新配置网卡信息。
升级 systemd 后,用户需要重新编译系统内核启用新版本的 systemd , 如何升级内核本文不再赘述。
通过 dmesg 命令可以查看到当前使用的 systemd 版本:

开启 CGroup V2
编译 /etc/default/grub 文件,创建 GRUB_CMDLINE_LINUX 变量并添加 cgroup_no_v1=all systemd.unified_cgroup_hierarchy=1 参数,执行以下命令重建 grub 文件并重启服务器。
1
|
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
|
通过以下命令判断 systemd 是否正常启用:
1
|
stat -fc %T /sys/fs/cgroup/
|
参考