b.l0g.jp     About     Archive     Feed

NICのリンクスピードを監視するNagiosスクリプト

Nagiosのプラグインには、NICのステータス(up/downとか)をチェックする check_ifstatus がある。しかし、ネゴシエーションなどの関係で、リンクアップはしているがリンクスピードが1Gbps full duplexであってほしいのに10Mbps halfとかになっているということはよくあること。

探してみた感じこれをチェックするためのNagiosプラグインはなさそうだったので、シェルスクリプト書いてみた。本当はcheck_ifstatus(perl)を拡張するのがいいのかもしれないが。

Linuxがモノリシックカーネルである理由

Quoraの問答は本当に面白いものばかり。技術的でないのもかなり興味深いものが多いが、またLinuxについてのネタで分かりやすいのがあったので訳してみた。

Linuxがモノリシックカーネルであるというのはどういう意味か?

モノリシックカーネル

モノリシックカーネルは、プロセスやメモリの管理、例外の取扱い、入出力のやり取り、ファイルシステムなどほとんどの基本的なシステムサービスを実行する。層構造になっており、基礎的なプロセス管理からOSの他の部分(ライブラリ群や、層の最上位であるアプリケーション)とのインタフェースからなっている。基本的なサービスをカーネルスペースに含めることは、次のような大きな3つの欠点となる。

  • カーネルサイズが大きくなる
  • 拡張性に乏しい
  • メンテナンス性が悪い

マイクロカーネル

カーネルの機能を基本的なプロセス間通信と入出力制御のみに絞り、ユーザスペースの他のシステムサービスを普通のプロセス(「サーバ」と呼ばれる)としてしまうのがコンセプトである。あるサーバはメモリに関する管理を行い、別のサーバはプロセス管理、さらに他のサーバはドライバの管理…といった具合だ。サーバはカーネルスペースでは実行されないので、ユーザプロセスが特権モードに入ったり出たりするためにいわゆるコンテキストスイッチが発生してしまう。この方式では、マイクロカーネルはもはやシステムサービスの塊ではなく、プロセス間通信とプロセスとその下のハードウェアとの通信を制御するための、単にいくつかの基本的な抽象化とプリミティブを提供するだけである。通信は直接行われないので、独立した通信と拡張性をもたらす、メッセージングの仕組みが使われる。

ここでLinuxカーネルの話に入ろう。Linuxカーネルは、モノリシックカーネルである。しかし、Linuxの美しいところは、どちらとしてもコンパイルできることである!

モノリシックカーネル

  • 1つのバイナリファイル
  • 全ドライバがカーネル自体に含まれる

モジュラーカーネル

  • 複数のカーネルのファイル
  • ドライバはmodprobeコマンドなどでカーネルにロードしたりアンロード可能。lsmodやmodprobeのmanページを参照
  • ほとんど全てのドライバはカーネルに対してビルドされてリンクされる

以下のカーネルコンフィグオプションの設定でモジュラーカーネルをビルドすることができる。

  
Enable loadable module support (CONFIG_MODULES) [Y/n/?]
  

このオプションにYと答えるとモジュラーカーネルとなり、各機能やドライバそれぞれに関して3つの選択肢が現われる。

m ドライバをモジュールとしてコンパイルできる
y カーネル自身に組み込む
n 機能・ドライバを含まない

(CONFIG_MODULES)オプションを n に設定した場合モノリシックカーネルとなり、各機能やドライバそれぞれに2つの選択肢がある。

y 機能・ドライバを含む
n 機能・ドライバを含まない

 

MySQLコマンドラインツールで使えるコマンド小ネタ

知らなくても何とかなるけど、知っておくと役に立つmysqlシェルから使えるコマンド。

systemコマンド

MySQLのプロンプトを開いたままで、ロードアベレージを見たいとか、SQLを書いておいたファイル名を見たい、という時は、OSのシェルで実行できるコマンドをMySQLシェルから実行するsystemコマンドを使えばよい。

  
mysql> system uptime
  
10:47:48 up 24 min, 5 users, load average: 3.94, 3.68, 2.57

mysql> system ls
  
test.sh sample01.sql
  

teeコマンド

実行結果をターミナルにも表示するがファイルにも保存しておきたい時はteeコマンド。ファイルへの書き出しをやめる時はnotee。ファイルには、プロンプトから入力した文字列なども全部追記されていく。

  
mysql> tee output.txt
  
mysql> show tables;
  
+-------------+
  
| Tables\_in\_test |
  
+-------------+
  
| TABLE01 |
  
| TABLE02 |
  
| TABLE03 |
  
+-------------+
  
3 rows in set (0.00 sec)
  
mysql> notee
  
Outfile disabled.
  
mysql> quit

$ cat output.txt
  
mysql> show tables;
  
+-------------+
  
| Tables\_in\_test |
  
+-------------+
  
| TABLE01 |
  
| TABLE02 |
  
| TABLE03 |
  
+-------------+
  
3 rows in set (0.00 sec)
  
3 rows in set (0.00 sec)
  
mysql> notee
  
$
  

pagerコマンド

  
mysql> pager less;
  

で、ページャをlessにできるので、実行結果が長い時などに重宝する。これは結構有名な気がするが、それだけではなく、grepなどのコマンドをセットすることもできるので、いろんなことができる。ちなみにlessの -S オプションをつけると、カラムが多くて横に広がってしまう結果も横スクロールできるようになる。

  
mysql> pager grep Behind
  
PAGER set to 'grep Behind'
  
mysql> show slave status\G
  
Seconds\_Behind\_Master: 3133
  
1 row in set (0.00 sec)
  

こんな感じで必要な行だけを取り出すこともできる。また、パイプも使うことができるので、以下のように組み合わせることも可能。あんまりいい例が考え付かなくて微妙w

  
mysql> select * from test;
  
+--+--+--+--+--+--+--+--+
  
| a | b | c | d | e | f | g | h |
  
+--+--+--+--+--+--+--+--+
  
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
  
+--+--+--+--+--+--+--+--+
  
1 row in set (0.01 sec)

mysql> pager grep -v '-' | tr -d '|'
  
PAGER set to 'grep -v '-' | tr -d '|"
  
mysql> select * from test;
  
a b c d e f g h
  
1 2 3 4 5 6 7 8
  
1 row in set (0.00 sec)
  

ページャを元に(標準出力に)戻すには

  
mysql> nopager;
  
PAGER set to stdout