いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.240 / 読者数:2381名

こんばんは、うすだです。

黄金週間は、有意義に、楽しく過ごされましたでしょうか。
(あるいは現在進行中で、満喫中でいらっしゃいますでしょうか)。

私は、毎年恒例の筍掘りに参加し、 実質ファーストインパクトのご家族とお会いする機会がありました。

また、ここ最近の1ヶ月は、私にしてはめずらしく、 社外の集まりに何度か参加する機会があり、 知らない人とがんばってお話してきました。

なんやかんや言って、私は変化より安定を求める傾向が強いので、 いまの仕事かその延長で生きていけるならそれでいいや…と思っていました。

ですが、たった一度の自分の人生、それでいいのか? という疑問も、 頭の片隅の奥底の片鱗に、ぽつねんと、かすかにあったりもします。

ですので、なにか選ばないといけないときは、心のハードルを越える必要のある方を、 なるべく選ぶよう心がけています。
(…というほど大層な選択を迫られることは、今のところありませんが。)

というわけで、今日(5/5)も、よめのお友達夫婦がやってくるため、 気分的にはちょっと重たいのですが、 なにかしらお互いにいい刺激になるかもしれないと、 前向きにとらえて挑もうと思います。(大げさ!)

結局、すべては自分次第だと割り切って、今回もはりきってまいります。

今回のお題 - sysctl でカーネルパラメータを変更する

普通は、ディストリビューションが提供するカーネルそのままでも、 特に大きな支障や問題などなく、普通に使えているのではないかと思います。

しかし、デスクトップでも、なんらかのサービスを提供するサーバでも、 同じですべて丸くおさまる、というわけにはいかないことがあります。

たとえば、IPパケットの転送はデフォルトで行わない設定になっていますが、 ルータとして動作させたいときは、行うようにする必要があります。

他にも、ものすごく大きな共有メモリが使えると、 サービスの提供速度を格段に向上させられる、などということがあるかもしれません。

そんなとき、いちいちカーネルの再構築を行わなくても、 リソースの上限や振る舞いを変更できれば、カーネルをそのまま使えて便利ですよね。

というわけで今回は、「sysctl」というコマンドを使って、 カーネル内のパラメータを変更し、前述のようなことを実現する方法をご紹介します。

まずはお約束の、sysctl とは?

sysctl は、 Linuxカーネルのパラメータを参照したり変更したりするためのインタフェースです。

前述のように、ある機能を有効(あるいは無効)にしたり、振る舞いを変更したり、 上限や下限などの値を変更したりなど、カーネル再構築や再起動を行うことなく、 動的に実施できます。

具体的には、sysctl コマンドを用いて、それらを行います。
さしあたって、「-a」オプションを指定して実行すると、 パラメータ一覧と値を確認できます。

  $ sysctl -a
  dev.cdrom.autoclose = 1
  dev.cdrom.autoeject = 0
  dev.cdrom.check_media = 0
  ...中略...
  sysctl: permission denied on key 'kernel.cad_pid'
  ...後略...

一般ユーザの権限でも実行できますが、上記のように、 root権限がないと参照できないパラメータもあります。

また、パラメータ名を指定して実行すると、そのパラメータの情報だけを出力します。

  $ sysctl net.ipv4.conf.all.forwarding net.ipv6.conf.all.forwarding
  net.ipv4.conf.all.forwarding = 0
  net.ipv6.conf.all.forwarding = 0

パラメータ値を変更してみる

見るばっかりではなく、パラメータ値を変えてみましょう。
値を変更するには、「-w」オプション、 パラメータ名と値を「=」で連結したものを指定して実行します。

  # sysctl -w net.ipv4.ip_forward=1
  net.ipv4.ip_forward = 1

ここでは、IPv4パケットの転送を行う設定をしています。
/proc/sys/net/ipv4/ip_forward に直接読み書きすることでも、 同じ効果が得られます。

  # echo 1 > /proc/sys/net/ipv4/ip_forward
  # cat /proc/sys/net/ipv4/ip_forward
  1

ちなみに、転送は、ネットワークインタフェースごとに設定できますが、 上記を設定すると、のきなみすべて設定されます。

  $ sysctl -a | grep 'ipv4\..*\.forward'
  net.ipv4.conf.all.forwarding = 1
  net.ipv4.conf.default.forwarding = 1
  net.ipv4.conf.eth0.forwarding = 1
  net.ipv4.conf.lo.forwarding = 1
  net.ipv4.conf.wlan0.forwarding = 1

さらにちなみに、net.ipv4.conf.all.forwarding でも、 すべてに対して設定できます。

  # sysctl -w net.ipv4.conf.all.forwarding=0
  net.ipv4.conf.all.forwarding = 0
  # sysctl -a | grep 'ipv4\..*\.forward'
  net.ipv4.conf.all.forwarding = 0
  net.ipv4.conf.default.forwarding = 0
  net.ipv4.conf.eth0.forwarding = 0
  net.ipv4.conf.lo.forwarding = 0
  net.ipv4.conf.wlan0.forwarding = 0

さらにさらにちなみに、IPv6 に対しては、 上記の ipv4 を ipv6 に脳内で変換して実行してください。
ただし、net.ipv6.ip_forward というパラメータはありません。
(net.ipv4.ip_forward は、過去の互換性のためにあるようです。)

恒久的に変更する

sysctlコマンドでカーネルパラメータの値を変更しても、 システム再起動(つまりreboot)すると、もとに戻ってしまいます。

これを、常にその値に設定されるようにするには、 「/etc/sysctl.conf」に記述します。たとえば、 共有メモリの上限を 1GB にするには、以下を追加します。

  kernel.shmmax = 1073741824
  kernel.shmall = 67108864
kernel.shmmax は、1プロセスあたりの共有メモリの最大バイト数です。
kernel.shmall は、システム全体の共有メモリのページ数です。 こちらはこの値でないといけない、というわけではありません。

あとは、再起動すれば反映されますが、「-p」オプションをつけて実行をすることで、 即座に反映できます。

  # sysctl -p
  kernel.shmmax = 1073741824
  kernel.shmall = 67108864

おわりに

以上、sysctl について、簡単にご紹介しました。

正直に申し上げますと、いつになくひねった内容が全然盛り込まれてない原因は、 夜遅くまでずっと、よめのお友達夫婦と喋っていたためです。

ヘロヘロになりながら書いたんだな、と思っていただけますと幸いです。
…ではなく、中途半端な内容になってしまったことをお詫びいたします。

宿題の答え

前回の宿題は、

  lshw コマンドの情報源を調べてみましょう。

でした。

てっとり早いのは、lshwコマンドに関する情報がWebにないか、 検索することでしょうか。ですが、 lshwの使い方が書いてあるページは大量にあるものの、 中身を解説しているページには遭遇できませんでした。
(その記述が正しいかどうか、確認も必要ですし…。)

というわけで、ソースコードを読むか、 straceコマンドの出力結果をもとに推測するか、 という作業が必要になってまいります。
ここでは、straceコマンドに頼ってみたいと思います。

  # strace -o lshw.log lshw

と実行しますと、 呼び出しているシステムコールを lshw.log に出力してくださいます。
ただ、それでも数万行も吐き出してくださいますので、 うまいこと要所をたどる必要があります。

  $ grep '^open' lshw.log | grep -v ENOENT | less

ざっくり眺めた結果を、以下にお知らせいたします。

  • /dev/mem
    物理メモリを読み書きするためのものです。直前に DMI とか出力していますので、 DMI(Direct Media Interface)の情報を参照しているようです。
  • /proc/meminfo
    ご存じ、メモリに関する情報です。
  • /proc/cpuinfo
    ご存じ、CPUに関する情報です。
  • /sys/bus/pci/devices/<domain>:<bus>:<slot>.<func>/...
    PCIの各デバイスの情報です。
    /usr/share/misc/pci.ids や /usr/share/hwdata/pci.ids などで一般名称を引っ張って来たりもしているようです。
  • /proc/devices
    キャラクタデバイスとブロックデバイスの一覧が得られます。
    PCMCIAとフレームバッファの情報(メジャー番号)を得るのに使います。
  • /dev/sdなんとか
    ハードディスクの情報を、ioctlの各種リクエストで得ています。
  • /dev/sgなんとか, /proc/scsi/sg/
    SCSIに関する情報を、ioctlの各種リクエストなどで得ています。
  • /proc/mounts
    ご存じ、マウントしているファイルシステムの情報です。
  • /proc/net/dev, /sys/class/net/インタフェース名/...
    ネットワークインタフェースの情報です。
    他に、socketとioctlなどでも情報を得ているようです。

全部確認した、と胸を張って主張できるほどではありませんので、 抜けはあるかもしれません。ご了承ください。

ちなみに、ソースコードの src/core/名前.cc を見れば、 具体的な処理がそれとなくわかります。

packages/lshwのreleases - ezIX
http://ezix.org/project/browser/packages/lshw/releases

今回の宿題

今回の宿題は、

  違う名前で同じ意味を持つカーネルパラメータを探してみましょう。

です。

コマンド一発的に確認する方法はなさそうな気がしていますが、 もし発見できた暁には、それをご紹介したいと思います。

案の定ないという場合は、 同じであることを確認する方法をご紹介しようと思っております。

あとがき

わたしがこの世界に入るきっかけは、8bitなパソコンでした。

8ビットパソコン - Wikipedia
https://ja.wikipedia.org/wiki/8ビットパソコン

1980年代の頃の話ですので、当然インターネットは普及しておらず、 情報源は雑誌や書籍がメインでした。

本などを書いている著名な人はみな、月刊誌を数冊定期購入して勉強するとよい、 的なことを書いていらっしゃいました。
貧乏な中学生であった私は、なんとか1冊買ってもらって、 むさぼるように眺めていた記憶があります。
(つまり、あまり読んではいませんでした。コードも多かったですし。)

会社に入ってからは、UNIXマガジンやSoftware Design、UNIX USER、bitなど、 会社で定期購読されている雑誌は、のきなみ読んでいました。
それとは別に、WIREDとかTransTECHとか、会社では買ってもらえなさそうな雑誌を、 自分で買って読んでいました。

それがいまでは、インターネットや電子書籍が当たり前な世の中になり、 スラドにこんな記事が掲載されるに至ったようです。

雑誌、定期的に読んでますか? | スラッシュドット・ジャパン
http://askslashdot.slashdot.jp/story/13/04/15/2346233/

個人的には、年を食ってじっくり読む気がなくなった、というのもあるのですが、 上記で指摘もあるように、情報源としても資料としても、 値段に相応する価値を見出せなくなったからかも、と思ったりしています。

たとえば、とあるCPUや文字コード、 画像フォーマットなどの特集記事が掲載されたインターフェースの雑誌は、 10年以上前のモノでも、いまだに捨てないで保存してあります。 いまだに参照することもあります。

ですが、ここ数年、永久保存しようと思える雑誌には、 ひとつも(…はちょっと言い過ぎかもしれません)遭遇していません。 自分の記事が掲載されているモノくらいです。(←単に捨てられないだけです)

逆に、このWebのページは永久保存(?)したい! というところがあります。

裏を返せば、いまは情報源が多岐に渡っているので、必要に応じて選べばいいのだ、 ということなのかもしれないですね。

電子書籍に関しても、上記で指摘のあった、 紙媒体をスキャンしただけに近いものから、 電子書籍ならではの工夫がなされたものがどんどん増えていくのかと思うと、 今後が楽しみであります。

 

…あ、楽しみですねとかいう以前に、電子書籍をたしなむためのプラットフォームを、 いまだに所有しておりませんでした。
まずは、Kindle あたりを購入して活用する計画を立てたいと思います。

こんなガラパゴスな筆者ですが、今後ともよろしくお願いいたします。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、5月19日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- GW中の皆様の反応の少なさに、精進すべしと思いました。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)
http://twitter.com/kuriking/ (栗つぶやき)
http://facebook.com/kuriking3 (栗顔本)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本