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

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

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

Ubuntu 13.10 がリリースされましたね。

世間では、同日にリリースされたWindows8.1の方が注目されているかもしれません。 が、思ったほどニュースになっていないようにも思います。
PC一強時代の終焉(の始まり)を、ひしひしと感じますね…。

それはさておき、今回の見どころは、Phone などのエディションの追加、 新しいディスプレイサーバ「Mir」、Unityのバージョンアップなどなど、 多数あるように感じられます。

Mirはまだオプションですが、 試しに入れてみて、独自の機能を確認してみたり、 既存のXサーバと比較をしてみたいですね。

しかし、最近、新しいものをインストールして、 ちょっと使っておしまいにしているケースが、個人的に増えています。

それだと、使ってみただけで印象に残らないことが多く、大半は、 数日後には忘却の彼方へと追いやられてしまいます。

ちゃんと中身を勉強して、自分なりに工夫した使い方を試して、 脳みそに刻み込まないといけないなー、と思っているところです。

また、すべてに対してそうするだけの時間も根気もやる気もありませんので、 むやみに飛びつかず、自分のやりたいこと、やるべきことから、 必要なものを取捨選択せねば、とも思っています。

それ以前に、そもそもやりたいことがよくわかっていない、 という大きな問題があるのですが、めげずにはりきってまいりたいと思います。

今回のお題 - システムのいろんな情報をかき集める (レベル:初級)

システム管理において重要なことのひとつに、システムの異常にいち早く気づき、 迅速かつ的確な対処を行うこと、が挙げられます。

異常に気付くには、Zabbixとか Hinemosなどの運用管理ツールを使うのが、 王道だと思います。

ただ、詳細の確認や対処の際には、どうしても手動であれこれやる必要がありますよね。

対処の方は、こう対処すればよいという王道を示しにくいのですが、 確認の方は、ある程度実行するコマンドが決まっているように思います。

というわけで今回は、システムの状態を確認するコマンドを、種類別に、 思いつくままご紹介していこうと思います。

ユーザに関する情報

何かおかしな状態になった原因が、とあるユーザのとある行動に起因していた、 というケースは、意外と多いように思われます。
そんなときの、犯人探し? に必要なコマンドを、いくつかご紹介します。

ログインしているユーザを確認するコマンドには、「who」や「w」などがあります。 どちらも、utmp というファイルを読み込んで、 ログイン中のユーザの情報を出力してくれます。

  $ who
  root     tty1         2013-10-20 02:38
  usu      pts/0        2013-10-20 11:18 (192.168.1.1)

  $ w
   16:08:41 up  3:32,  2 users,  load average: 0.01, 0.05, 0.01
  USER    TTY     FROM           LOGIN@   IDLE   JCPU   PCPU WHAT
  root    tty1    -             02:38    3:54   1.75s  1.75s -bash
  usu     pts/0   192.168.1.1   11:18    0.00s  0.02s  0.00s w

 

ログインの履歴を見るには、「last」コマンドを使います。
こちらは、wtmp というファイルをもとにして、 ログイン中もしくは過去のログイン情報を出力します。

  $ last
  usu    pts/0   192.168.1.211   Sun Oct 20 11:25   still logged in
  root   tty1                    Sun Oct 20 02:38   still logged in
  sasha  pts/0   192.168.1.211   Sat Oct 19 12:41 - 14:09  (01:28)
  ...後略...

wtmp がでかいと膨大に出力されますので、たとえば、 直近の20個だけを確認するには、以下のように実行します。

  $ last -20
  ...後略...

ローテートされた過去のファイル /var/log/wtmp.1 の内容を確認したいときは、 「-f」オプションとそのファイルを指定します。

  $ last -f /var/log/wtmp.1
  ...後略...

で、それらの中に、このユーザってどんな人だ? という疑問を感じたら、 「id」コマンドを実行します。
引数に指定したユーザの、ユーザIDやグループを出力してくれます。

  $ id usu
  uid=123(usu) gid=100(users) groups=100(users),10(wheel)

ちなみに、wtmp と utmp については、太古の昔にご紹介しています。
内容は変わっていないはずですので、よろしければご覧ください。

Vol.025 - ログイン情報を知る
http://www.usupi.org/sysad/025.html
Vol.026 - ログイン情報をでっちあげる
http://www.usupi.org/sysad/026.html
Vol.027- utmp - もうひとつのログイン情報
http://www.usupi.org/sysad/027.html

プロセス関連の情報

とあるプロセスが悪さをしていたり、暴走していたりといったケースも、 結構な割合で発生しているように思います。

プロセスと言えば、「ps」コマンドが最強ではないかと思います。
そのまま実行すると、今の端末で動作中のプロセスの情報を出力します。

  $ ps
    PID TTY          TIME CMD
   1884 pts/0    00:00:00 bash
   3193 pts/0    00:00:00 ps

引数に「u」を指定するともっとたくさんの情報、 「x」を指定すると今の端末以外のプロセス、 「a」を指定すると自分以外のユーザのプロセスを出力します。

  $ ps axu
  USER   PID %CPU %MEM   VSZ   RSS TTY  STAT START   TIME COMMAND
  root     1  0.0  0.1  2060   644 ?    Ss    2011   4:56 init [3]      
  root  1029  0.0  0.5  7592  1888 ?    S     2011   2:46 dovecot-
  root  1078  0.0  0.5  6736  1772 ?    Ss    2011  15:44 /usr/lib
  ...後略...

上記のようにプロセス名が切れてしまうときは、「w」を指定します。

  $ ps axuw
  USER   PID %CPU %MEM   VSZ   RSS TTY  STAT START   TIME COMMAND
  root     1  0.0  0.1  2060   644 ?    Ss    2011   4:56 init [3]      
  root  1029  0.0  0.5  7592  1888 ?    S     2011   2:46 dovecot-auth
  root  1078  0.0  0.5  6736  1772 ?    Ss    2011  15:44 /usr/libexec/postfix/master
  ...後略...

「-C」オプションとプロセス名を引数に指定すると、そのプロセスだけに限定できます。

  $ ps -C httpd -u
  USER     PID %CPU %MEM    VSZ   RSS TTY STAT START  TIME COMMAND
  apache  1227  0.0  2.0  19660  6564 ?   S    09:50  0:00 /usr/sb
  apache  1573  0.0  2.0  19660  6564 ?   S    10:40  0:00 /usr/sb

「-o」オプションと項目名を指定すると、指定した情報だけ出力します。

  $ ps -C httpd -o pid,%cpu,%mem,vsz,rss
    PID %CPU %MEM    VSZ   RSS
   1227  0.0  2.0  19660  6564
   1573  0.0  2.0  19660  6576

psコマンドには、他にも様々なオプションがあります。man などをみて、 いろいろ試してみてください。

 

「pstree」という、動作中のプロセスの関係をツリーで出力するという、 素敵なコマンドもあります。

  $ pstree
  init-+-crond
       |-dovecot-+-dovecot-auth
       |         `-3*[pop3-login]
       |-httpd-+-12*[httpd]
       |       `-rotatelogs
       |-master-+-pickup
       |        `-qmgr
       |-monit
  ...後略...

プロセスの関係がわかりやすいですね。

ちなみに、「-a」オプションでコマンドラインの引数、 「-p」オプションでプロセスID、「-u」オプションでユーザIDを併記してくれます。

 

それから、忘れちゃいけないのが、「top」コマンドです。
実行すると、下記のような情報を、画面いっぱいに出力してくれます。

  top - 12:03:38 up  6:41,  8 users,  load average: 0.31, 0.39, 0.31
  Tasks: 277 total,   1 running, 276 sleeping,   0 stopped,   0 zombie
  %Cpu(s):  4.8 us,  1.5 sy,  0.0 ni, 91.9 id,  1.6 wa,  0.0 hi,  0.1 si,  0.0 st
  KiB Mem:   8069876 total,  4418456 used,  3651420 free,   192864 buffers
  KiB Swap:  8278012 total,        0 used,  8278012 free,  1925956 cached

    PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
   9255 usu       20   0 21588 1524 1016 R  12.6  0.0   0:00.02 top
   1937 www-data  20   0 81624 1728  464 S   6.3  0.0   0:02.10 nginx
      1 root      20   0 27160 3052 1444 S   0.0  0.0   0:01.50 init
      2 root      20   0     0    0    0 S   0.0  0.0   0:00.00 kthreadd
  ...後略...

システム起動時間、ロードアベレージ、プロセス数、 CPUやメモリの状態などを出力した後、プロセスを負荷の高い順に出力します。
(出力内容の詳細は、オンラインマニュアル(man top)にあります。)

いままでのコマンドとは異なり、5秒ごとに情報を更新しながら、 延々と動作し続けます。終了したくなったら「q」を押してください。
(あるいは、Ctrl+c でも終了します。)

「-b」オプションを指定すると、画面サイズに関係なくどばばっと出力をします。 また、「-n」オプションと数字を指定すると、指定した回数実行したら終了します。 ファイルに出力したり、別のコマンドにパイプで渡す際に、便利です。

  $ top -b -n 1 > /tmp/foo

CPU、メモリやディスクの情報

リソースの枯渇、というのもたいへん困った問題です。
すでにtopコマンドの出力でさらっと触れましたが、CPUやメモリに関する情報と、 ディスクに関する情報を確認するコマンドを、ご紹介します。

まずは、CPUの負荷です。
ロードアベレージというのは、アクティブなプロセス数の平均です。 連続して動作し続けるプロセスが1つあると、ロードアベレージは 1 です。
「uptime」というコマンドを実行すると、それがわかります。

  $ uptime
   13:29:41 up  8:07,  8 users,  load average: 0.09, 0.18, 0.17

現在時刻、システム起動時間、ログイン中のユーザ数、 ロードアベレージが1行で出力されます。
ロードアベレージには3つの値がありますが、それぞれ、 直近の1分、5分および15分間の平均値です。

そしてお気づきの通り、w と topコマンドにも、同じ情報が含まれます。

 

お次は、メモリです。
メモリの内訳は、「free」コマンドでわかります。

  $ free
               total     used     free  shared   buffers    cached
  Mem:       8069876  4547580  3522296       0    200816   2018992
  -/+ buffers/cache:  2327772  5742104
  Swap:      8278012        0  8278012

デフォルトの単位はキロバイトですが、「-m」オプションを指定すると、 メガバイト単位で出力されます。

「buffers」と「cached」は、 カーネル内のバッファやキャッシュで使用されている分です。 ディスクなどから同じ情報が読み出せますので、 枯渇しそうなときには解放して使いまわされます。

それでもメモリが足りなくなると、 ディスク上にある「Swap」にメモリの一部を退避して空きを作ります。ですので、 Swap の used がそれなりの場合は、わりと厳しい状態だと判断してよいと思います。

 

そして、最後にディスクです。
マウントしているファイルシステムの容量を知るには、「df」コマンドを使います。

  $ df
  Filesystem         1K-blocks      Used Available Use% Mounted on
  /dev/sda5           15006084   1108896  13134924   8% /
  tmpfs                 251124         0    251124   0% /dev/shm
  /dev/sda1             495844     32409    437835   7% /boot

「Filesystem」には、マウント対象となるディスクなどのデバイスが出力されます。 /dev から始まらない場合は、リモートにあるものか、 仮想的なファイルシステムだと思ってよいです。

これも、デフォルトはキロバイトですが、 「-m」オプションでメガバイト単位にできます。また、 「-h」オプションでもっと読みやすくなります。

  $ df -h
  Filesystem            Size  Used Avail Use% Mounted on
  /dev/sda5              15G  1.1G   13G   8% /
  tmpfs                 246M     0  246M   0% /dev/shm
  /dev/sda1             485M   32M  428M   7% /boot

この例では、ほとんど使われていなくてウハウハ状態ですが、 90%あたりを越えてくると、いらないファイルや古いログを消すなど、 対処した方がよいと思います。

 

これらリソースの状況をまとめて知るのに、 「vmstat」というコマンドが便利かもしれません。

  $ vmstat
  procs ---------memory---------- -swap-- ---io---- -system- -----cpu-----
   r  b swpd   free   buff  cache si   so  bi    bo  in  cs us sy id wa st
   0  0  788  83712  16272 310288  0    0  10    19  30   6  0  0 99  0  0

内訳は、以下の通りです。

項目名概要
r実行可能なプロセス数
b(シグナルなどの)割り込み不可のプロセス数
swpd使用中の仮想メモリ量
free空きメモリ量
buffバッファに使用されているメモリ量
cacheキャッシュに使用されているメモリ量
siスワップインしたメモリ量(秒ごと)
soスワップアウトしたメモリ量(秒ごと)
biブロックデバイス(ディスク)から読みだしたブロック数(秒ごと)
boブロックデバイス(ディスク)に書き込んだブロック数(秒ごと)
in割り込み発生数(秒ごと)
csプロセスを切り替えた回数(秒ごと)
usCPU時間のうち、ユーザモードで動作した時間
syCPU時間のうち、カーネルモードで動作した時間
idCPU時間のうち、アイドル状態の時間
waCPU時間のうち、I/O待ち状態の時間
stCPU時間のうち、仮想マシンに使われた時間

また、引数に秒数を指定すると、その秒数ごとに、連続して実行します。
さらに、引数に回数を指定すると、その回数に達したら終了します。

  $ vmstat 1 3
  procs ---------memory---------- -swap-- ---io---- -system- -----cpu-----
   r  b swpd   free   buff  cache si   so  bi    bo  in  cs us sy id wa st
   1  0    0  83712  16272 310288  0    0  22   110  11  51 11  3 52 33  0
   1  0    0  83556  16272 310812  0    0   0     0  91  57  1  1 98  0  0
   0  0    0  83556  16272 310812  0    0   0     0  89  51  2  1 98  0  0

おわりに

以上、システムの情報を得るコマンドを、いくつかご紹介しました。

いずれも、設定を変えたりしませんので、是非、実行してみてください。

それから、「sysstat」というのを仕込めば、 システムの状態を定期的に記録してくれるようになります。詳しくは、 以下をご覧ください。

Vol.177 - sysstat でシステムの状態を監視する
http://www.usupi.org/sysad/177.html
Vol.178 - sysstat でシステムの状態を定期的に監視する
http://www.usupi.org/sysad/178.html

宿題の答え

前回の宿題は、

  SSHのポートフォワーディングを使って接続したSSHで、VPNが動作する
  か、試してみましょう。

でした。

以下のような環境で、TUN での接続を試したところ、案の定、 うまく接続できましたので、手順をさらっと示します。

試した環境は、以下の通りです。

  [Client] ----------------- [Gateway]  ----------------- [Server] 
     192.168.1.2      192.168.1.1                    172.16.0.1
     10.0.0.2 <--------------SSH (TUN)---------------> 10.0.0.1

クライアント(192.168.1.2)とサーバ(172.16.0.1)は、直接 IP では通信できません。 代わりに、SSH を使った VPN 接続を目指します。

そのため、まず、ゲートウェイ(192.168.1.1)にSSHでログインしますが、 そのときポートフォワーディング機能を使って、 サーバの SSH につなげられるようにします。

そして、そのポートを使って VPN 接続してしまおう、という魂胆です。

サーバの設定は、前回紹介した内容と同じです。
クライアントで(ssh-keygen で)作成した公開鍵を、 authorized_keys に追加して、

  server# cat id_rsa.pub >> ~root/.ssh/authorized_keys
  server# chmod go-rwx ~root/.ssh/authorized_keys

その行の先頭に、下記の ssh-rsa の手前までを追加します。

no-X11-forwarding,no-agent-forwarding,no-pty,command="ifconfig tun0 10.0.0.1 pointopoint 10.0.0.2" ssh-rsa A...

/etc/ssh/sshd_config のキーワードの設定を下記のようにします。

  PermitRootLogin forced-commands-only  (yes などでも OK です)
  PermitTunnel point-to-point

変更したら、sshd を reload します。

ゲートウェイの設定は、特に必要ありません。
だれかのユーザで、SSH でログイン & ポートフォワーディングできれば問題ありません。 こんな感じで、あらかじめログインしておきます。

  client$ ssh -L 10022:172.16.0.1:22 gateway

クライアントでは、~/.ssh/config に以下のエントリを追加します。
上記により、サーバのSSHを、localhost の 10022/tcp にフォワードしているので、 そこへつなぎにいくよう設定します。

Host vpnoverssh
  Hostname localhost
  Port 10022
  IdentityFile ~/.ssh/id_rsa
  Tunnel point-to-point
  TunnelDevice 0:0
  RequestTTY no
  PermitLocalCommand yes
  LocalCommand ifconfig tun0 10.0.0.2 pointtopoint 10.0.0.1

そして、つなぎにいきます。

  client# ssh vpnoverssh

つながったことを確認します。(出力は省力しています)

  client# ifconfig tun0
  client# ping 10.0.0.1

ちなみに、authorized_keys は、パーミッションが緩かったり、 所有者が自分でなかったりすると、読み込んでくれません。ご注意ください。
(上記を試すとき、やらかしました。syslog を見るとよいですよ。)

今回の宿題

今回の宿題は、

  ロードアベレージが閾値を越えたら警告を発するモノを作りましょう。

です。

システムに常駐して常に監視し、というのは難しいと思いますので、 実行したらロードアベレージを見て、閾値を越えていたら、 メールを送信するなどのアクションを起こす、 くらいのシェルスクリプトで結構です。
(メールも、近頃は受け取ってもらえないことが多いですので、 テキスト出力するだけ、でもかまいません。)

ここで大切なのは、こういったツールを自分で作ることではなく、 世間で使われているツールがどう動いているのか、 そこそこ推測できるくらいの知識を得ることです。

実際に作ってみると、いろんな箇所で難しさを感じられます。
こういったツールを、オープンソースで提供してくださる方々に、 感謝をしつつ、試行錯誤してみてくださいませ。

あとがき

芸術の秋! ということで、ここ数日で2つほどまわってきました。

まず、名古屋といえば、ちょうど今、トリエンナーレをやっています。

あいちトリエンナーレ
http://aichitriennale.jp/

テーマが「揺れる大地」と言うだけあって、東日本大震災に関連する作品が、 多く展示されていました。(動くモノも多数ありました。)

アートを生業としないニンゲンが偉そうに言ってよいかわかりませんが、 震災に引っ張られすぎていて、単純に楽しめる作品が、 前回と比べてやや少なかったような印象を受けました。

いや、しかし、複数の会場に入れて1,300円(前売りペアチケット)というのは、 安いです。この値段でアートに触れられるのですから、 次回も是非大々的にやっていただきたいと思います。

もうひとつ行ったのが、松坂屋美術館でやっている、観世宗家展です。

観阿弥生誕六八〇年 世阿弥生誕六五〇年記念 観世宗家展
http://www.matsuzakaya.co.jp/nagoya/museum/2013_kanzesouke/

こちらは、観世宗家の貴重な能の面や装束を、どーんと一挙大公開! 的な展覧会です。古くは鎌倉時代のものから現在のものまで、 いずれも実際に今なお使われているものが、惜しげもなく展示されていました。
(足利家や徳川家から拝領されたものもあります。)

実は、日経達人塾というところが企画した特別鑑賞会に応募したところ、 めでたく当たったため参加をした、という次第です。

日経読みこなしサポートプログラム|日経達人塾!
http://www.nikkei4946.com/tatsujin-jyuku/

以前から能面には興味がありましたので、当日を楽しみにしていたのですが、 想定以上に面白かったです。
ホンモノを目の当たりにして、威圧感と言いますか怪しさと言いますか、 という感触を、素人な私でもひしひしと感じることができました。

 

芸術に関する催しは、決して安くはありませんが、 それによって非日常的な何かを感じることができるのであれば、 けっして高くはないと思います。

急に寒くなって、冬へまっしぐら! になりそうな気配も感じられますが、 興味と機会がありましたら、美術館などへ行かれることをお勧めします。

 

私の場合、帰ってきたらお腹が空いていましたので、 食欲の秋のほうもばっちり堪能してしまいましたが…。

 

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

 

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

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

「栗日記」- デパ地下に栗モノが大量にあり、テンションあがりました。
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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本