$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
此外,我试图手动挂载“net”子系统但没有成功:
# mkdir -p /sys/fs/cgroup/net # mount -t cgroup -o net net /sys/fs/cgroup/net/ mount: special device net does not exist
有人可以帮忙吗?
解决方法
> net_prio已经在Linux Kernel 3.3中引入了,所以你不会在Ubuntu LTS 12.04中看到它是正常的,除非你安装了LTS硬件支持堆栈(它可以获得Linux内核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
这告诉你net_cls是一个模块而不是作为内核(m)的一部分编译.
既然你知道你有模块,那就让我们来看看吧:
$find /lib/modules/`uname -r` -iname "*cgroup*" /lib/modules/3.2.0-38-generic/kernel/net/sched/cls_cgroup.ko
所以现在你知道模块名为cls_cgroup,只需加载它:
$sudo modprobe cls_cgroup
跳完了!现在让我们进行安装.对于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
现在你应该能够为tc标记你的数据包了.
net_prio配置
对于net_prio,该过程非常相似.但是你需要安装一个更新的内核. Ubuntu 12.04 LTS支持他们称之为LTS Hardware Enablement Stack的内容,它为您提供了一个新的内核版本3.5.要安装它:
$sudo apt-get install linux-generic-lts-quantal xserver-xorg-lts-quantal
重新启动后,您将使用Linux Kernel 3.5.如果您使用上面给出的grep命令,它将返回一个略有不同的列表.值得注意的是,你现在有了另一个模块CONFIG_NETPRIO_CGROUP = m.您可以使用与上面相同的find命令再次查找模块,您将找到netprio_cgroup,只需加载它:
$sudo modprobe netprio_cgroup
然后像以前一样,你现在可以挂载cgroup:
$sudo mkdir /sys/fs/cgroup/net_prio $sudo mount -t cgroup -o net_prio none /sys/fs/cgroup/net_prio
请参阅文档(请参阅第一个链接)以了解如何使用net_prio cgroup,或者您也可以参考此Red Hat documentation.
这些变化并不持久
正如标题所说,在下次重启时,更改将会丢失.
如果你想要持久编辑文件/etc/rc.local并添加上面创建目录并挂载cgroup的步骤.并将模块(两者或其中一个,取决于您要使用的)添加到文件/ etc / modules中,只需在新行上添加每个名称,例如:
sudo bash -c "echo cls_cgroup >> /etc/modules"
警告:如果您不小心修改/ etc下的文件,则可能会破坏引导过程.没有一个知识渊博的人无法修复,但你最好小心,要么知道你要做什么,要么有朋友帮助你.此外,备份您宝贵的数据总是一个好主意!