• ベストアンサー

/proc/sys/net/ipv4/route/flushは無効な引数?

/proc/sys/net/ipv4/route/flush というファイルをcatの引数に指定すると 「無効な引数です」と言われます。 普通、読めないファイルの場合は 「許可がありません」というメッセージなのに、 このファイルだけは「無効な引数です」と言われるのです。 エラーメッセージが異なるということは別のエラーということだと思うのですが、 「無効な引数です」というメッセージはどのような場合に表示されるものなのですか。 たとえばwcの引数に指定した場合、次のようにエラーメッセージと通常の結果の両方を表示します。 $ wc /proc/sys/net/ipv4/route/flush wc: /proc/sys/net/ipv4/route/flush: 無効な引数です 0 0 0 /proc/sys/net/ipv4/route/flush ですのでエラーメッセージをリダイレクトしてしまえば、何の問題もないように思えるのですが・・・ これでいいのかなぁ。

質問者が選んだベストアンサー

  • ベストアンサー
  • chirubou
  • ベストアンサー率37% (189/502)
回答No.2

Linux で /proc 以下のファイルは特殊なファイルです。/proc以下のファイルは、カーネルとのインターフェイスになっていて、ファイルとしての実体はありません(man 5 proc 参照)。カーネルの中に、/proc 以下のこのディレクトリにアクセスがあったら、こういう値を出力する(読み込みの場合)、その値をカーネルのこの変数に代入する(書き込みの場合)というようなプログラムが書かれています。 ということで、属性が変更できないのは当然です。ちなみに CentOS 4.4 では $ ls -l /proc/sys/net/ipv4/route/flush --w------- 1 root root 0 Nov 21 10:39 /proc/sys/net/ipv4/route/flush となっています。これを $ strace wc /proc/sys/net/ipv4/route/flush とするとどこで、どういうエラーになったか分かります。CentOSの場合、沢山の出力の後、 .... open("/proc/sys/net/ipv4/route/flush", O_RDONLY|O_LARGEFILE) = -1 EACCES (Permission denied) write(2, "wc: .... となります。まあ、これはrootでないので当然の結果ですが。

zyousuke
質問者

お礼

chirubouさん、ご回答ありがとうございます。 なるほど/procは特殊なファイルが置いてある場所なのですね。 普段、何気なく使っているコマンドの引数に、ここのファイルを指定すると想定外の結果が返ってくるのだと覚えておきます。 今、指定したディレクトリー中の全ファイルに対してwcするシェルスクリプトを作成中でして、 まず手始めに、このスクリプトの引数に/を指定してテストしたところ /proc/sys/net/ipv4/route/flushの所だけ他と違うエラーが返ってきたため、疑問に思って質問に参ったというわけです。 今回は、このような奇妙なエラーが返ってきたのは、このファイルだけですが、 /proc中には、これ以外にも引数に指定した場合、予期せぬエラーを返すファイルがいっぱい潜んでいるというわけですね。

その他の回答 (3)

  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.4

こんばんは。 カーネルソースを修正して再構築した事はありますか? あなたの環境が一言も書いていないので回答できませんが、たとえば 以下のカーネルソースの、flushのmodeを「0644」から「0200」に変更して、 カーネルコンパイルすれば、flushの属性を変えられます。 一度試してみてください。(自己責任で) ●カーネルソースを修正してコンパイルする 「/usr/src/linux-2.4.20-8/net/ipv4/route.c」 ctl_table ipv4_route_table[] = {     {         ctl_name:    NET_IPV4_ROUTE_FLUSH,         procname:    "flush",         data:      &flush_delay,         maxlen:     sizeof(int),         mode:      0644, <-これを0200に変更         proc_handler:  &ipv4_sysctl_rtcache_flush,         strategy:    &ipv4_sysctl_rtcache_flush_strategy,     }, ●ソース変更前の属性は644 # ls -l /proc/sys/net/ipv4/route/flush -rw-r--r--  1 root   root      0 11月 22 00:08 /proc/sys/net/ipv4/route/flush # wc /proc/sys/net/ipv4/route/flush wc: /proc/sys/net/ipv4/route/flush: 無効な引数です    0    0    0 /proc/sys/net/ipv4/route/flush ●ソース変更後の属性は200になった # ls -l /proc/sys/net/ipv4/route/flush --w-------  1 root   root      0 11月 22 00:50 /proc/sys/net/ipv4/route/flush # wc /proc/sys/net/ipv4/route/flush wc: /proc/sys/net/ipv4/route/flush: 許可がありません 以上、参考にしてください。

zyousuke
質問者

お礼

xjdさん、ご返信ありがとうございます。 カーネルコンパイルですか。 xjdさんのアドバイス文を見ながら ソース修正まではできましたが、 カーネルコンパイルというのは、よく分からないので、やめておきますw とにかく、これでカーネルコンパイルというのをやれば、 できないと思っていた/proc/sys/net/ipv4/route/flushの属性を変更することもできてしまうのですね! ところでみなさん、そろって--w-------という属性に変更しているようですが、これはどういう理由からなのでしょうか。 それとも環境によってデフォルトの属性が違うだけなのでしょうか。 ちなみに申し遅れましたが私の環境はRed Hat Linux8.0の最小インストール+α(サンバとかの各種サーバー)です。

  • Lean
  • ベストアンサー率72% (435/603)
回答No.3

>なるほど/procは特殊なファイルが置いてある場所なのですね。 /procは、プロセス情報を含む擬似的なファイルシステムですので、ディスク上には存在しませんのでファイルが置いてあるというよりは、ファイルとして見えているという事になります。 /proc/sys配下だけに限定すると、カーネルにはチューニング等を行うためのカーネルパラメータというものが存在するのですが、それが/porc/sys配下に階層構造でファイルとして見えています。 例えば、パケット転送の有効・無効を設定するパラメータとしてnet.ipv4.ip_forward というのがあるのですが、これは、/proc/sys/net/ipv4/ip_forward として見えます。 例 # sysctl -a | grep net.ipv4.ip_forward net.ipv4.ip_forward = 0 # sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0 # ls -l /proc/sys/net/ipv4/ip_forward -rw-r--r-- 1 root root 0 11月 21 22:19 /proc/sys/net/ipv4/ip_forward # cat /proc/sys/net/ipv4/ip_forward 0 また、カーネルパラメータはカーネル起動中でもsysctlコマンドを使用する事で参照・変更する事が可能なものがあるのですが、このsyscltコマンドを使用しなくとも/proc/sys配下の該当するファイルに対してread/writeする事で同様事が可能です。 例 # sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0 # sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1 # sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1 # cat /proc/sys/net/ipv4/ip_forward 1 # echo "0" > /proc/sys/net/ipv4/ip_forward # cat /proc/sys/net/ipv4/ip_forward 0 # sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0

zyousuke
質問者

お礼

Leanさん、ご返信ありがとうございます。 /procは概念自体、理解しがたいものですね。 ファイルが存在するのではなく、見えるのですね・・・^^ /proc中のほとんどのファイルサイズは0ですが、中には0でないものもあります。 こういうファイルも実際のディスク領域に書き込まれているわけではなく、どこかの設定ファイルへのリンクのようなものなのでしょうかね。 カーネルパラメータの2通りの変更方法もためになりました。 まあ、これらを使用するためには、各カーネルパラメータの意味を学習する必要がありますけどね。 /proc/sys/net/ipv4/ip_forwardはcatできるのですね。

  • mtfoggy
  • ベストアンサー率14% (37/255)
回答No.1

うちのFedoraCore5では特に問題ないです。 $ pwd /proc/sys/net/ipv4/route $ ls -l flush --w------- 1 root root 0 11月 20 22:25 flush $ wc flush wc: flush: 許可がありません $ cat flush cat: flush: 許可がありません

zyousuke
質問者

お礼

mtfoggyさん、早速のご回答ありがとうございます。 mtfoggyさんの実行結果を見てふと気になったのがflushの属性です。 私の環境では-rw-r--r--となっているのです。 ですので、これをmtfoggyさんと同じ属性に変更しようとしたところ・・・ 「許可されていない操作です」と怒られてしまいました。 なんとrootユーザーは全ての操作を実行できると認識していたのですが、 この謎めいたファイルには効きませんでした。 mtfoggyさんのflushには読み取り属性がないため、 「無効な引数です」と怒られるところまで行き着いていないのではと思い、 それを実験してみようと思ったのですが、属性すら変更できないとは予想外でした!! ところでmtfoggyさんのflushの属性ってデフォルトでその設定なのですか。 所有者の書き込みのみ許可されているとは、これまた謎めいたファイルですね。 うーーん、どうしたもんだろう??

関連するQ&A