在 Ubuntu 12.04 LTS 上的 cgroup 中找不到网络子系统

use*_*136 4 networking linux linux-kernel cgroup ubuntu-12.04

我正在尝试使用 cgroups 来限制进程的网络带宽,如本答案中所述。但是,我无法找到他们所指的“文件”。我正在使用安装了 cgroup-bin 的 Ubuntu 12.04 LTS。cgroups 自动挂载在 /sys/fs/cgroup 下,但是,我只看到以下子系统:

$ ls -l /sys/fs/cgroup/
total 0
drwxr-xr-x 3 root root 0 Mar  8 09:51 cpu
drwxr-xr-x 3 root root 0 Mar  8 09:51 cpuacct
drwxr-xr-x 3 root root 0 Mar  8 09:51 devices
drwxr-xr-x 3 root root 0 Mar  8 09:51 freezer
drwxr-xr-x 3 root root 0 Mar  8 09:51 memory
Run Code Online (Sandbox Code Playgroud)

此外,我尝试手动挂载“net”子系统但没有成功:

# mkdir -p /sys/fs/cgroup/net
# mount -t cgroup -o net net /sys/fs/cgroup/net/
mount: special device net does not exist
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

Huy*_*ens 11

我只知道 2 个与网络相关的 cgroup,net_prio(设置网络流量的优先级)和net_cls(标记数据包以允许 Linux 识别tc)。

  • net_prio已在 Linux Kernel 3.3 中引入,因此您在 Ubuntu LTS 12.04 中看不到它是正常的,除非您安装了 LTS 硬件启用堆栈(它为您提供了 Linux Kernel 3.5),请参见最后。
  • net_cls,我不知道它是什么时候引入的,但是有一个模块,它带有 Ubuntu 12.04 LTS 提供的股票 3.2 内核。

net_cls 配置

如何设置net_cls显然不是自动完成的。首先检查你是否支持它(只有你知道我是怎么发现的!):

$ grep CGROUP /boot/config-`uname -r`
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_MEM_RES_CTLR=y
CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y
CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NET_CLS_CGROUP=m
Run Code Online (Sandbox Code Playgroud)

这告诉您net_cls是一个模块,而不是作为内核 ( m) 的一部分进行编译。

现在你知道你有这个模块,让我们寻找它:

$ find /lib/modules/`uname -r` -iname "*cgroup*"
/lib/modules/3.2.0-38-generic/kernel/net/sched/cls_cgroup.ko
Run Code Online (Sandbox Code Playgroud)

所以现在您知道该模块名为cls_cgroup,只需加载它:

$ sudo modprobe cls_cgroup
Run Code Online (Sandbox Code Playgroud)

跳完成!现在让我们进行安装。对于随 Ubuntu 12.04 LTS 提供的内核,您获得的信息相当不正确。这不是因为 Ubuntu,而是因为 cgroups 的 API 可能已经改变了。由于以下符合内核官方文档:

$ sudo mkdir /sys/fs/cgroup/net_cls
$ sudo mount -t cgroup -o net_cls none /sys/fs/cgroup/net_cls
Run Code Online (Sandbox Code Playgroud)

现在您应该能够为您的数据包标记tc.

net_prio 配置

对于net_prio,过程非常相似。但是您需要安装较新的内核。Ubuntu 12.04 LTS 支持他们所谓的LTS 硬件启用堆栈,它为您提供了一个新的内核版本 3.5。要安装它:

$ sudo apt-get install linux-generic-lts-quantal xserver-xorg-lts-quantal
Run Code Online (Sandbox Code Playgroud)

重新启动后,您将使用 Linux Kernel 3.5。如果您使用grep上面给出的命令,它会返回一个稍微不同的列表。值得注意的是,您现在拥有的CONFIG_NETPRIO_CGROUP=m是另一个模块。您可以使用与find上述相同的命令再次查找模块,您会发现netprio_cgroup,只需加载它:

$ sudo modprobe netprio_cgroup
Run Code Online (Sandbox Code Playgroud)

然后像以前一样,您现在可以挂载 cgroup:

$ sudo mkdir /sys/fs/cgroup/net_prio
$ sudo mount -t cgroup -o net_prio none /sys/fs/cgroup/net_prio
Run Code Online (Sandbox Code Playgroud)

请参阅文档(请参阅第一个链接)以了解如何使用 net_prio cgroup,或者您也可以参阅此Red Hat 文档

这些变化不是持久的

正如标题所说,在下次重新启动时,更改将丢失。

如果您希望这是持久的,请编辑文件/etc/rc.local并添加上面创建目录和挂载 cgroup 的步骤。并将模块(两者或其中一个,取决于您要使用的模块)/etc/modules添加到文件中,只需在新行中添加每个名称,例如:

sudo bash -c "echo cls_cgroup >> /etc/modules"
Run Code Online (Sandbox Code Playgroud)

警告:修改下面的文件时,/etc如果不小心,可能会破坏启动过程。没有什么是知识渊博的人无法修复的,但你最好小心点,要么知道自己要做什么,要么让朋友帮助你。此外,备份您的宝贵数据始终是个好主意!