docker之cgroup版本问题

文章讲述了在Linux5.x及以上内核使用cgroupv2时,Docker容器因不兼容cgroupv1报错的问题。解决方法是将宿主机cgroup版本降级为v1,通过编辑grub配置并重启系统来确保容器正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 环境

# Linux 版本

uname -a

Linux mingy-ecs 5.15.0-83-generic #92-Ubuntu SMP Mon Aug 14 09:30:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

image.png


# Docker 版本
Version:    24.0.7

# Cgroup 版本
Cgroup Version: 2

image.png

# 问题

docker容器无法启动,报错

image.png

WARNING: the "devices" cgroup should be in its own hierarchy.
WARNING: it looks like the "devices" cgroup is not mounted.
......
Error starting daemon: Devices cgroup isn't mounted

Failed to mount cgroup at /sys/fs/cgroup/systemd: Operation not permitted · Issue #4072 · lxc/lxc

# 原因

Linux 5.x 及以上内核改用了 cgroup v2 版本,而容器镜像环境需要的还是 cgroup v1 版本。

同时由于 cgroup v2 和 v1 不能兼容,因此导致容器启动后,容器内相关服务无法正常启动。

Linux 4.x 内核版本才用的 cgroup v1 版本,可正常使用,无影响。

# 解决

既然 docker 容器只支持 cgroup v1 版本,那么我们可以把宿主机(host)的 cgroup 版本改成 v1 即可

编辑修改配置文件 /etc/default/grup

# 注释掉之前的 GRUB_CMDLINE_LINUX 内容
sed -i '/GRUB_CMDLINE_LINUX=/s/^/# /' /etc/default/grub

# 插入新的 GRUB_CMDLINE_LINUX 内容
sed -i '/GRUB_CMDLINE_LINUX=/a\GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=0 systemd.unified_cgroup_hierarchy=0"' /etc/default/grub

image.png

# 更新 grub 配置
update-grub

# 重启系统
reboot

成功修改 Cgroup Version 为 v1 版本

image.png

成功解决问题

<think>好的,用户想了解如何在RedHat系统上将cgroup从v1升级到v2。首先,我需要回忆一下关于cgroup的基本知识。根据引用[4],cgroup是Linux内核提供的功能,用于资源控制。而cgroup v2是较新的版本,可能带来一些改进,但需要注意兼容性问题。 接下来,用户的需求是升级到v2,但可能还希望兼容v1,因为像Docker这样的服务可能依赖v1。根据引用[1]中的步骤,可能需要在Grub配置中添加参数,启用混合模式。不过这里用户明确问的是升级到v2,所以可能需要先确认当前系统使用的是哪个版本。根据引用[2]的方法,可以通过stat命令查看cgroup版本。 然后,我需要考虑RedHat系统特定的步骤。RedHat 8和9可能默认还是使用v1,或者需要手动切换。步骤可能包括修改内核参数,比如设置systemd.unified_cgroup_hierarchy=1,同时可能需要启用v1的控制器,如引用[3]提到的v2支持的控制器较少,需要检查所需控制器是否在v2中可用。 另外,升级到v2后,用户可能需要验证服务是否兼容,比如Docker是否支持。如果不支持,可能需要回退或采用混合模式。引用[1]提到同时兼容v1和v2的方法,可能对用户有帮助,但用户的问题是升级到v2,所以需要明确步骤是否包括完全迁移还是混合模式。 需要确保步骤正确,比如编辑grub配置文件后更新grub,然后重启系统。同时,用户可能需要检查应用程序的兼容性,尤其是容器运行时如Docker或Kubernetes是否支持cgroup v2。 最后,生成相关问题时要围绕升级步骤、验证方法、兼容性检查和回滚方案,帮助用户全面了解迁移过程中可能涉及的问题。</think>### RedHat系统升级cgroup v1到v2操作步骤 #### 1. **验证当前cgroup版本** 使用命令检查当前cgroup版本: ```bash stat -fc %T /sys/fs/cgroup/ ``` - 输出为`cgroup2fs`表示已使用v2 - 输出为`tmpfs`表示仍为v1[^2] #### 2. **修改内核启动参数** 编辑GRUB配置文件以启用cgroup v2: ```bash sudo vi /etc/default/grub ``` 在`GRUB_CMDLINE_LINUX`行追加参数: ```bash systemd.unified_cgroup_hierarchy=1 cgroup_no_v1=all ``` - `systemd.unified_cgroup_hierarchy=1`:强制使用cgroup v2 - `cgroup_no_v1=all`:禁用所有v1控制器[^1] #### 3. **更新GRUB配置并重启** ```bash sudo grub2-mkconfig -o /boot/grub2/grub.cfg sudo reboot ``` #### 4. **验证升级结果** 重启后再次执行: ```bash stat -fc %T /sys/fs/cgroup/ ``` 若输出为`cgroup2fs`,则升级成功。 #### 5. **兼容性处理(可选)** 若需同时支持v1和v2(混合模式): - 修改GRUB参数为`systemd.unified_cgroup_hierarchy=0` - 更新GRUB并重启[^1] #### 6. **检查服务兼容性** 确认关键服务(如Docker、Kubernetes)是否支持cgroup v2: ```bash docker info | grep Cgroup ``` 若输出包含`Cgroup Version: 2`则兼容[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值