Cent 6で sysctl コマンドからカーネルパラーメータを更新しようとするとエラーが発生する。
% cat /etc/redhat-release CentOS release 6.3 (Final) % sysctl -p net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key error: "net.bridge.bridge-nf-call-iptables" is an unknown key error: "net.bridge.bridge-nf-call-arptables" is an unknown key kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 % echo $? 255
"net.bridge.bridge-nf-call-***"
の箇所で “an unknown key” というエラーが発生し、終了ステータスも異常(255)だ。
インストーラースクリプトが sysctl を叩いていたら失敗するし、コマンドのステータスコードを見る処理が入っていても失敗する。
エラーの原因
libvirt 関連で、ブリッジ上で iptables を無効にする設定を sysctl.conf に入れたことに起因し、関係ないシステムが煽りを食っている。
Bug 512206 – Disable net.bridge.bridge-nf-call-*tables by default
https://bugzilla.redhat.com/show_bug.cgi?id=512206
解決策(姑息編)
姑息な解決策は 3 通り有る。
1.bridge カーネルをロードする
キー “net.bridge.bridge-nf-call-***” が unknown にならないよう、対応する bridge モジュールをロードする
% modprobe bridge # modprobe : program to add and remove modules from the Linux Kernel % lsmod | grep bridge # lsmod : program to show the status of modules in the Linux Kernel bridge 79078 0 stp 2173 2 bridge,garp llc 5546 3 bridge,garp,stp % sysctl -p net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296
2.エラーが起きている設定をコメントアウトする
% grep -i bridge /etc/sysctl.conf # Disable netfilter on bridges. # net.bridge.bridge-nf-call-ip6tables = 0 # net.bridge.bridge-nf-call-iptables = 0 # net.bridge.bridge-nf-call-arptables = 0
3. sysctl 実行時にエラーを無視するオプションを渡す
当然ながら sysctl が自分の手の届かないプログラム内で呼び出されている場合は、この方法は使えない。
% sysctl -e -p net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 % echo $? 0
解決策(根本)
この現象は 2010 年には Red Hat の Bugzilla で報告されている。
Bug 639821 – sysctl -p gives error: “net.bridge.bridge-nf-call-ip6tables” is an unknown key
https://bugzilla.redhat.com/show_bug.cgi?id=639821
バグだから直せと何人もの利用者がコメントをつける一方で、Red Hat の中の人はバグでないと言い返していて、平行線をたどっていた。ここ以外にも、少し探すだけでも同様の報告がちらほらみつかる。
今月になって、RedHat の中の人もようやく RedHat の不具合と認識してくれたみたいなので、近いうちに % sysctl -p するだけで反映されるようになるのではないかと思う。
Bug 919472 – sysctl -p gives error: “net.bridge.bridge-nf-call-ip6tables” is an unknown key
https://bugzilla.redhat.com/show_bug.cgi?id=919472
Leave a Reply