web-dev-qa-db-ja.com

Ubuntu 12.04LTSのcgroupでネットワークサブシステムが見つかりません

この回答 で説明されているように、cgroupを使用してプロセスのネットワーク帯域幅を制限しようとしています。しかし、私は彼らが参照している「ファイル」を見つけることができません。 cgroup-binがインストールされたUbuntu12.04LTSを使用しています。 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

さらに、「net」サブシステムを手動でマウントしようとしましたが、成功しませんでした。

# mkdir -p /sys/fs/cgroup/net
# mount -t cgroup -o net net /sys/fs/cgroup/net/
mount: special device net does not exist

誰か助けてもらえますか?

4
user1202136

ネットワークに関連する2つのcgroup、 net_prio (ネットワークトラフィックの優先度を設定)と net_cls (Linuxで識別できるようにパケットにタグを付けるtc)しか知りません。 。

  • net_prioはLinuxカーネル3.3で導入されたため、LTSハードウェアイネーブルメントスタックをインストールしない限り、Ubuntu LTS 12.04では表示されないのが普通です( Linuxカーネル3.5)を取得します。最後を参照してください。
  • net_cls、いつ導入されたかはわかりませんが、Ubuntu 12.04LTSで提供されるストック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.04LTSで提供されるカーネルではかなり正しくありません。これは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カーネル3.5を使用することになります。上記のgrepコマンドを使用すると、わずかに異なるリストが返されます。特に、もう1つのモジュールである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ドキュメント

これらの変更は永続的ではありません

タイトルが示すように、次の再起動時に変更は失われます。

これを永続的にしたい場合は、ファイル/etc/rc.localを編集し、ディレクトリを作成してcgroupをマウントする上記の手順を追加します。そして、モジュール(使用するモジュールに応じて両方または一方)をファイル/etc/modulesに追加し、新しい行に各名前を追加します。例:

Sudo bash -c "echo cls_cgroup >> /etc/modules"

警告/etcの下のファイルを変更するときに、注意しないと、起動プロセスが中断する可能性があります。知識のある人が修理できなかったことは何もありませんが、注意して、自分が何をしようとしているのかを知っているか、友人に助けてもらうほうがよいでしょう。さらに、貴重なデータのバックアップは常に良い考えです!

11
Huygens