Linux Professional Institute Learning Logo.
main contentにスキップ
  • ホーム
    • 全てのリソース
    • LPI学習教材
    • コントリビューターになる
    • Publishing Partners
    • Publishing Partnerになる
    • About
    • FAQ
    • コントリビューター
    • Roadmap
    • 連絡先
  • LPI.org
4.3 レッスン 2
課題 1: Linuxコミュニティとオープンソースのキャリア
1.1 ポピュラーなOSとLinuxの発展
  • 1.1 レッスン 1
1.2 主なオープンソースのアプリケーション
  • 1.2 レッスン 1
1.3 オープンソースソフトウエアとライセンス
  • 1.3 レッスン 1
1.4 ICTスキルとLinuxでの作業
  • 1.4 レッスン 1
課題 2: Linuxシステムで自分の手法を見つける
2.1 コマンドラインの基本
  • 2.1 レッスン 1
  • 2.1 レッスン 2
2.2 コマンドラインのヘルプ機能の利用
  • 2.2 レッスン 1
2.3 ディレクトリの利用とファイルの一覧
  • 2.3 レッスン 1
  • 2.3 レッスン 2
2.4 ファイルの作成、移動と削除
  • 2.4 レッスン 1
課題 3: コマンドラインの力
3.1 コマンドラインでのファイル圧縮
  • 3.1 レッスン 1
3.2 ファイルの検索と展開
  • 3.2 レッスン 1
  • 3.2 レッスン 2
3.3 コマンドをスクリプトにする
  • 3.3 レッスン 1
  • 3.3 レッスン 2
課題 4: Linuxオペレーティングシステム
4.1 オペレーティングシステムの選択
  • 4.1 レッスン 1
4.2 コンピュータハードウエアの理解
  • 4.2 レッスン 1
4.3 データの保管場所
  • 4.3 レッスン 1
  • 4.3 レッスン 2
4.4 ネットワーク上のコンピュータ
  • 4.4 レッスン 1
課題 5: セキュリティとファイルパーミッション
5.1 セキュリティの基本と、ユーザタイプの確認
  • 5.1 レッスン 1
5.2 ユーザとグループの作成
  • 5.2 レッスン 1
5.3 ファイルのパーミッションと所有権の管理
  • 5.3 レッスン 1
5.4 特別なディレクトリとファイル
  • 5.4 レッスン 1
How to get certified
  1. 課題 4: Linuxオペレーティングシステム
  2. 4.3 データの保管場所
  3. 4.3 レッスン 2

4.3 レッスン 2

Certificate:

Linux Essentials

Version:

1.6

Topic:

4 Linuxオペレーティングシステム

Objective:

4.3 データの格納先

Lesson:

2 of 2

はじめに

このレッスンでは、まずプログラムと設定ファイルについて調べた後に、コマンドがプロセスとして実行される方法を学びます。また、システムからのメッセージとして、カーネルリングバッファや、systemd とそのジャーナルデーモン journald がシステムログのこれまでの方法をどのように変えたかを説明します。

プロセス

ユーザーがコマンドを発行する度に、プログラムが実行されて1つ以上のプロセスが生成されます。

プロセスは階層構造を作ります。ブート時にカーネルがメモリにロードされた後に、最初のプロセスが起動して、それが他プロセスを起動し、さらにそれらが他のプロセスを起動していきます。それぞれのプロセスは、一意の識別子( PID )と親プロセスの識別子( PPID)を持っています。これらは正の整数で、順に割り当てられていきます。

プロセスを動的に調べる top

実行中のプロセスの状態は、top コマンドで見ることができます。

$ top

top - 11:10:29 up  2:21,  1 user,  load average: 0,11, 0,20, 0,14
Tasks:  73 total,   1 running,  72 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0,0 us,  0,3 sy,  0,0 ni, 99,7 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
KiB Mem :  1020332 total,   909492 free,    38796 used,    72044 buff/cache
KiB Swap:  1046524 total,  1046524 free,        0 used.   873264 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
   436 carol     20   0   42696   3624   3060 R  0,7  0,4   0:00.30 top
     4 root      20   0       0      0      0 S  0,3  0,0   0:00.12 kworker/0:0
   399 root      20   0   95204   6748   5780 S  0,3  0,7   0:00.22 sshd
     1 root      20   0   56872   6596   5208 S  0,0  0,6   0:01.29 systemd
     2 root      20   0       0      0      0 S  0,0  0,0   0:00.00 kthreadd
     3 root      20   0       0      0      0 S  0,0  0,0   0:00.02 ksoftirqd/0
     5 root       0 -20       0      0      0 S  0,0  0,0   0:00.00 kworker/0:0H
     6 root      20   0       0      0      0 S  0,0  0,0   0:00.00 kworker/u2:0
     7 root      20   0       0      0      0 S  0,0  0,0   0:00.08 rcu_sched
     8 root      20   0       0      0      0 S  0,0  0,0   0:00.00 rcu_bh
     9 root      rt   0       0      0      0 S  0,0  0,0   0:00.00 migration/0
    10 root       0 -20       0      0      0 S  0,0  0,0   0:00.00 lru-add-drain
    (...)

例に示したように、top はそれぞれのプロセスだけではなく、システム全体のメモリおよびCPUの使用状態も表示します。

top では、対話的な操作が行えます。

デフォルトでは、プロセスが使用するCPU時間の割合の降順で出力がソートされます。top で以下のキーを押すことで、この動作を変更する事ができます。

M

メモリ使用量でソートします。

N

プロセスIDでソートします。

T

実行時間でソートします。

P

CPU利用率でソートします。

昇順と降順を切り替えるには、R を押します。

Tip

top のより洗練されたユーザーフレンドリーなバージョンとして htop があります。より網羅的な atop もあります。システムにインストールされていない場合は、パッケージマネージャを使ってインストールして試してみることがお勧めです。

プロセスのスナップショット ps

プロセスに関する情報を得るためのもう一つの非常に重要なコマンドは ps です。top が動的な情報を提供するのに対して、ps は静的な情報を提供します。

オプションなしで起動した場合の ps の出力は限定的で、現在のシェルにアタッチされているプロセスのみを表示します。

$ ps
  PID TTY          TIME CMD
 2318 pts/0    00:00:00 bash
 2443 pts/0    00:00:00 ps

表示される情報は、プロセス識別子( PID )、プロセスが実行されているターミナル( TTY )、プロセスが使用したCPU時間( TIME )、プロセスを開始したコマンド( CMD )です。

ps に便利なオプション -f を指定すると、より長い形式のリストを表示します:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
carol     2318  1682  0 08:38 pts/1    00:00:00 bash
carol     2443  2318  0 08:46 pts/1    00:00:00 ps -f

他のスイッチと組み合わせると、-f はプロセスの親子関係を表示します。

$ ps -uf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
carol       2318  0.0  0.1  21336  5140 pts/1    Ss   08:38   0:00 bash
carol       2492  0.0  0.0  38304  3332 pts/1    R+   08:51   0:00  \_ ps -uf
carol       1780  0.0  0.1  21440  5412 pts/0    Ss   08:28   0:00 bash
carol       2291  0.0  0.7 305352 28736 pts/0    Sl+  08:35   0:00  \_ emacs index.en.adoc -nw
(...)

ps コマンドに -v オプションを付けて実行すると、使用メモリの割合を表示することもできます。

$ ps -v
  PID TTY      STAT   TIME  MAJFL   TRS   DRS   RSS %MEM COMMAND
 1163 tty2     Ssl+   0:00      1    67 201224 5576  0.1 /usr/lib/gdm3/gdm-x-session (...)
 (...)
Note

プロセスの階層をわかりやすく示すコマンドに pstree があります。主なディストリビューションには含まれています。

/proc ディレクトリのプロセス情報

既に /proc ファイルシステムを見ました。/proc には、システムで実行中のプロセス毎に名前が番号のサブディレクトリ(番号はプロセスの PID )が含まれています。

carol@debian:~# ls /proc
1    108  13   17   21   27   354  41   665  8    9
10   109  14   173  22   28   355  42   7    804  915
103  11   140  18   23   29   356  428  749  810  918
104  111  148  181  24   3    367  432  75   811
105  112  149  19   244  349  370  433  768  83
106  115  15   195  25   350  371  5    797  838
107  12   16   2    26   353  404  507  798  899
(...)

つまり、特定のプロセスに関するすべての情報が、そのディレクトリに含まれています。PID が 1 である最初のプロセスの内容を見てみましょう。(読みやすいように出力を省略しています)。

# ls /proc/1/
attr        cmdline          environ  io        mem	      ns
autogroup   comm             exe      limits    mountinfo numa_maps
auxv        coredump_filter  fd       loginuid  mounts    oom_adj
...

例えば、プロセスの実行ファイルを見てみましょう:

# cat /proc/1/cmdline; echo
/sbin/init

このように、プロセス階層の先頭の実行ファイルは /sbin/init です。

Note

セミコロン( ; )で区切って複数のコマンドを連結することができます。上の例で echo を使用しているのは、改行を表示するためです。単純に cat /proc/1/cmdline を実行した時との違いを比べてみましょう。

システムの負荷

それぞれのプロセスは、システムリソースを消費する可能性があります。システムの負荷と言った場合には、システム全体の負荷を集約して1つの数値で示すことにします。現在の負荷は、uptime コマンドで見ることができます。

$ uptime
 22:12:54 up 13 days, 20:26,  1 user,  load average: 2.91, 1.59, 0.39

末尾の3つの数値がシステムの平均負荷(ロードアベレージ)を示しています。2.91 は直近の1分間、1.59 は5分前、0.39 は15分前の負荷をそれぞれ示しています。

これらの数値は、CPUリソースないしは入出力操作の完了を待っていたプロセスの数を示します。これは、プロセスが必要とするリソースを得ていれば、実行可能な状態であったことを意味しています。

システムログとシステムメッセージ

カーネルとプロセス群が実行され相互のやりとりが始まると、大量の情報が生成されます。ほとんどのものはログファイルないし簡単に ログ (log)と呼ばれるファイルに送られます。

ログがなければサーバーで発生したイベントを探すことがシステム管理者にとっての頭痛の種になりますから、システムイベントを追跡するための標準化および一元化された方法が必要です。さらにログは、統計や傾向予測を行うための信頼できる情報源であり、トラブルシューティングやセキュリティ対策の際の決定要因となるものです。

syslogデーモンによるロギング

伝統的に、システムメッセージは、syslog あるいはその派生である syslog-ng や rsyslog など、標準のロギング機能によって管理されてきました。ロギングデーモンは、他のサービスやプログラムからメッセージを集めて、それらを通常は /var/log にあるログファイルに保管します。ただし一部のサービス(例えば Apache HTTPD web server)は独自にログを処理します。また、Linuxカーネルは、ログメッセージをメモリ内のリングバッファに格納します。

/var/log にあるログファイル

ログは時間と共に変化するデータであるため、通常は /var/log に置かれます。

/var/log を覗いてみると、ログの名前は(程度の差はあれ)自明なことがわかるでしょう。いくつかの例を挙げます:

/var/log/auth.log

認証に関する情報を収めます。

/var/log/kern.log

カーネルの情報を収めます。

/var/log/syslog

システムの情報を収めます。

/var/log/messages

システムとアプリケーションのデータを収めます。

Note

ログファイルの名前と内容は、ディストリビューションによって異なります。

ログファイルにアクセスする

ログファイルを探索するときは、(読み出しパーミッションが無い場合)rootになることと、less の様なページャーを使用しましょう。

# less /var/log/messages
Jun  4 18:22:48 debian liblogging-stdlog:  [origin software="rsyslogd" swVersion="8.24.0" x-pid="285" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Jun 29 16:57:10 debian kernel: [    0.000000] Linux version 4.9.0-8-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.130-2 (2018-10-27)
Jun 29 16:57:10 debian kernel: [    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-8-amd64 root=/dev/sda1 ro quiet

あるいは tail に -f オプションを指定して、ファイルの末尾に追加された直近のメッセージを動的に表示することもできます。

# tail -f /var/log/messages
Jul  9 18:39:37 debian kernel: [    2.350572] RAPL PMU: hw unit of domain psys 2^-0 Joules
Jul  9 18:39:37 debian kernel: [    2.512802] input: VirtualBox USB Tablet as /devices/pci0000:00/0000:00:06.0/usb1/1-1/1-1:1.0/0003:80EE:0021.0001/input/input7
Jul  9 18:39:37 debian kernel: [    2.513861] Adding 1046524k swap on /dev/sda5.  Priority:-1 extents:1 across:1046524k FS
Jul  9 18:39:37 debian kernel: [    2.519301] hid-generic 0003:80EE:0021.0001: input,hidraw0: USB HID v1.10 Mouse [VirtualBox USB Tablet] on usb-0000:00:06.0-1/input0
Jul  9 18:39:37 debian kernel: [    2.623947] snd_intel8x0 0000:00:05.0: white list rate for 1028:0177 is 48000
Jul  9 18:39:37 debian kernel: [    2.914805] IPv6: ADDRCONF(NETDEV_UP): enp0s3: link is not ready
Jul  9 18:39:39 debian kernel: [    4.937283] e1000: enp0s3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
Jul  9 18:39:39 debian kernel: [    4.938493] IPv6: ADDRCONF(NETDEV_CHANGE): enp0s3: link becomes ready
Jul  9 18:39:40 debian kernel: [    5.315603] random: crng init done
Jul  9 18:39:40 debian kernel: [    5.315608] random: 7 urandom warning(s) missed due to ratelimiting

出力には次のようなものが含まれます。

  • タイムスタンプ(日時)

  • メッセージを生成したホスト名

  • メッセージを生成したプログラム/サービスの名前

  • メッセージを生成したプログラムのPID

  • 行われた動作

ほとんどのログファイルはプレーンテキストファイルですが、/var/log/wtmp(成功したログインを記録する)のようにバイナリデータを含むものもあります。file コマンドを使ってどちらかを判断することができます。

$ file /var/log/wtmp
/var/log/wtmp: dBase III DBT, version number 0, next free block index 8

バイナリのファイルは、特別なコマンドを使って読み込むのが普通です。/var/log/wtmp のデータを解釈するには last を使います。

$ last
carol    tty2         :0               Thu May 30 10:53   still logged in
reboot   system boot  4.9.0-9-amd64    Thu May 30 10:52   still running
carol    tty2         :0               Thu May 30 10:47 - crash  (00:05)
reboot   system boot  4.9.0-9-amd64    Thu May 30 09:11   still running
carol    tty2         :0               Tue May 28 08:28 - 14:11  (05:42)
reboot   system boot  4.9.0-9-amd64    Tue May 28 08:27 - 14:11  (05:43)
carol    tty2         :0               Mon May 27 19:40 - 19:52  (00:11)
reboot   system boot  4.9.0-9-amd64    Mon May 27 19:38 - 19:52  (00:13)
carol    tty2         :0               Mon May 27 19:35 - down   (00:03)
reboot   system boot  4.9.0-9-amd64    Mon May 27 19:34 - 19:38  (00:04)
Note

/var/log/wtmp に類似した /var/log/btmp には、失敗したログイン試行に関する情報が記録されます。読み出すには、専用の lastb コマンドを使います。

ログローテーション

ログファイルは数週間・数ヶ月にわたって成長し続けて、すべての空きディスクを使い果たしてしまうかもしれません。これに対処するのが logrotate です。これは、ログファイルのアーカイブや圧縮、ファイル名の変更、古いものの削除、場合によってはシステム管理者へのメール送信など、ローテーションや循環を実装したものです。ローテートされたログファイルの命名規則は(サフィックスに日付を加えるなど)多岐にわたりますが、単に整数をサフィックスに追加するのが一般的です。

# ls /var/log/apache2/
access.log  error.log  error.log.1  error.log.2.gz  other_vhosts_access.log

error.log.2.gz は(サフィックス .gz で分かるように)既にgzipで圧縮されていることに注意しましょう。

カーネル リング バッファ

カーネルリングバッファは、カーネルからのメッセージを記録する固定サイズのデータ構造です。このバッファの極めて重要な役割は、syslog が利用可能となる前の、ブート時のカーネルからのメッセージを記録することです。dmesg コマンドは、このカーネルリングバッファーの内容(以前は /var/log/dmesg にも保存されていました)を表示します。リングバッファはかなり大きいので、このコマンドは通常、テキストをフィルタリングする grep や less と組み合わせて使用します。例えば、ブートメッセージを表示するには次のようにします:

$ dmesg | grep boot
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet
[    0.000000] smpboot: Allowing 1 CPUs, 0 hotplug CPUs
[    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet
[    0.144986] AppArmor: AppArmor disabled by boot time parameter
(...)
Note

カーネルリングバッファは、新しいメッセージで上書きされて、古いものは消えてしまいます。

sysstemd-journald のシステムジャーナル

2015年の時点で、ほとんどの主要なLinuxディストリビューションでは、systemd が 事実上の標準の システム/サービスマネージャとして SysV Init に取って代わりました。ジャーナルデーモン journald が標準的なロギングのコンポーネントとなり、ほとんどの面で syslog の代わりとなりました。データはプレーンテキストではなくバイナリ形式でストアされます。ログを参照するためには journalctl ユーティリティが必要です。journald は syslog と互換性があり統合することができます。

journalctl は、systemdのジャーナルを調べためのユーティリティです。オプションなしで起動すると、すべてのジャーナルを表示します:

# journalctl
-- Logs begin at Tue 2019-06-04 17:49:40 CEST, end at Tue 2019-06-04 18:13:10 CEST. --
jun 04 17:49:40 debian systemd-journald[339]: Runtime journal (/run/log/journal/) is 8.0M, max 159.6M, 151.6M free.
jun 04 17:49:40 debian kernel: microcode: microcode updated early to revision 0xcc, date = 2019-04-01
Jun 04 17:49:40 debian kernel: Linux version 4.9.0-8-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) )
Jun 04 17:49:40 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-8-amd64 root=/dev/sda1 ro quiet
(...)

-k ないし --dmesg オプションを指定すると、dmesg コマンドと同じになります。

# journalctl -k
[    0.000000] Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.168-1+deb9u2 (2019-05-13)
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet
(...)

journalctl の興味深いオブションを以下に示します:

-b, --boot

ブートに関する情報を表示します。

-u

指定のユニットに関するメッセージを表示します。ユニットとは大まかに、systemd が扱うリソースのことです。例えば、journalctl -u apache2.service は、apache2 Webサーバーに関連するメッセージを読み出します。

-f

直近のジャーナルメッセージを表示して、tail -f と同様に、ジャーナルに追加された新しくエントリを表示し続けます。

演習

  1. 次の top の出力を見て、以下の問題に答えて下さい:

    carol@debian:~$ top
    
    top - 13:39:16 up 31 min,  1 user,  load average: 0.12, 0.15, 0.10
    Tasks:  73 total,   2 running,  71 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  1.1 us,  0.4 sy,  0.0 ni, 98.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  1020332 total,   698700 free,   170664 used,   150968 buff/cache
    KiB Swap:  1046524 total,  1046524 free,        0 used.   710956 avail Mem
    
      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
      605 nobody    20   0 1137620 132424  34256 S  6.3 13.0   1:47.24 ntopng
      444 www-data  20   0  364780   4132   2572 S  0.3  0.4   0:00.44 apache2
      734 root      20   0   95212   7004   6036 S  0.3  0.7   0:00.36 sshd
      887 carol     20   0   46608   3680   3104 R  0.3  0.4   0:00.03 top
        1 root      20   0   56988   6688   5240 S  0.0  0.7   0:00.42 systemd
        2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd
        3 root      20   0       0      0      0 S  0.0  0.0   0:00.09 ksoftirqd/0
        4 root      20   0       0      0      0 S  0.0  0.0   0:00.87 kworker/0:0
    (...)
    • ユーザー carol が開始したプロセスは何ですか?

    • top コマンドに関するデータを見つけるには、/proc 仮想ディレクトリのどこを見ればよいですか?

    • 最初に実行されたプロセスは何でしょう? どうしてそれが分かりますか?

    • top の出力のどこを見ればそれぞれの情報が 分かるかを答えて、以下の表を完成させて下さい:

      情報 サマリー部 タスク部

      メモリ

      スワップ

      PID

      CPU時間

      コマンド

  2. 以下に示すバイナリ形式のログを見るために使用するコマンドは何でしょうか?

    • /var/log/wtmp

    • /var/log/btmp

    • /run/log/journal/2a7d9730cd3142f4b15e20d6be631836/system.journal

  3. Linuxシステムの以下の情報を調べるために、grep と組み合わせて使用するコマンドは何でしょうか?

    • システムが最後にいつリブートしたか( wtmp )

    • 接続されているハードディスク( kern.log )

    • いつ最後にログインしたか( auth.log )

  4. カーネルリングバッファを表示するために利用できる2つのコマンドは何でしょう?

  5. 以下のログメッセージは、どこにあるかを答えて下さい。

    • Jul 10 13:37:39 debian dbus[303]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'

      /var/log/auth.log

      /var/log/kern.log

      /var/log/syslog

      /var/log/messages

    • Jul 10 11:23:58 debian kernel: [ 1.923349] usbhid: USB HID core driver

      /var/log/auth.log

      /var/log/kern.log

      /var/log/syslog

      /var/log/messages

    • Jul 10 14:02:53 debian sudo: pam_unix(sudo:session): session opened for user root by carol(uid=0)

      /var/log/auth.log

      /var/log/kern.log

      /var/log/syslog

      /var/log/messages

    • Jul 10 11:23:58 debian NetworkManager[322]: <info> [1562750638.8672] NetworkManager (version 1.6.2) is starting…​

      /var/log/auth.log

      /var/log/kern.log

      /var/log/syslog

      /var/log/messages

  6. 以下のユニットに関する情報を得るには、journalctl にどのように問い合わせますか?

    ユニット コマンド

    ssh

    networking

    rsyslog

    cron

発展演習

  1. 演習にある top の出力を再度確認して、以下の問いに答えましょう:

    • apache Webサーバーを終了するために実行する2つのステップは何でしょう?

    • サマリー部において物理メモリとスワップ領域の情報をプログレスバーを使って表示するにはどうしますか?

    • メモリ使用量によってプロセスをソートしましょう:

    • ここまでに、メモリ情報をプログレスバーに表示して、メモリ使用量に応じてプロセスがソートされているはずです。この設定を保存して、次に top を使うときのデフォルトとするにはどうしますか?

    • top の設定を保存するファイルは何ですか? それはどこにありますか? 存在を確認してみましょう。

  2. Bashの exec コマンドを試して学びましょう。Bashのセッションを開始して、ps で Bashのプロセスをメモします。次に exec /bin/sh を実行してから、同じPIDを再度探してみましょう。

  3. 以下の手順を実行して、カーネルイベントと udevによる動的なデバイス管理を探索しましょう:

    • USBドライブをコンピュターセットします。dmesg を実行して、最後の行に注目します。最後の行はどうなっていますか?

    • 前のコマンドの出力を念頭において、ls /dev/sd* を実行してリストに USBドライブが現れることを確認します。出力は何ですか?

    • 次にUSBドライブを取り外して、再度 dmesg を実行します。最後の行はどうなっていますか?

    • 再度 ls /dev/sd* を実行して、リストからUSBドライブが無くなったことを確認します。出力は何ですか?

まとめ

このレッスンでは、データの格納場所について以下を学びました: プロセス管理、システムのログとメッセージ。

プロセス管理については、以下の事柄を学びました:

  • プログラムは階層構造の中にプロセスを生成します。

  • それぞれのプロセスは一意のID( PID )と、親プロセスのID( PPID )を持ちます。

  • top はシステムで実行中のプロセスを動的かつ対話的に探索するとても有用なコマンドです。

  • ps はシステムでその時に実行中のプロセスのスナップショットを取得します。

  • /proc ディレクトリには、システムで実行中のすべてのプロセスについて、そのPIDを名前とするサブディレクトリがあります。

  • ロードアベレージの概念。CPUの利用率や過負荷を確認できます。

ログについては、以下の事柄を覚えておきましょう:

  • ログはシステムイベントが記録されるファイルです。トラブルシューティングの際に極めて有用です。

  • 伝統的には、ログは syslog や syslog-ng、rsyslogといった専用のサービスで処理されていました。一部のプログラムは、独自のログデーモンを使用します。

  • ログは可変データであるため /var に置かれます。場合によっては、その名前が内容の手がかりになることがあります( kern.log や auth.log など)。

  • ほとんどのログはプレーンテキストで、パーミッションがあればテキストエディタで見ることができます。ただし、いくつかはバイナリファイルであり、特別なコマンドで見なくてはなりません。

  • ディスク容量の問題を避けるために、logrotate ユーティリティによって ログローテーション が行われます。

  • カーネルは リングバッファ という円環状のデータ構造にブート時のメッセージなどを保持します(古いメッセージは上書きされて消えていきます)。

  • システムとサービスのマネージャである systemd は、ほとんどのディストリビューションで System V init を journald で置き換えて、それをロギングサービスの標準としました。

  • システムジャーナルを読むには、journalctl ユーティリティが必要です。

このレッスンで使用したコマンド:

cat

ファイルの内容を結合ないし表示します。

dmesg

カーネルリングバッファを表示します。

echo

1行のテキストないし改行を表示します。

file

ファイルの種類を識別します。

grep

パターンに一致した行を表示します。

last

直近にログインしたユーザーのリストを表示します。

less

1ページずつファイルの内容を表示します。

ls

ディレクトリの内容を一覧表示します。

journalctl

systemd のジャーナルを取得します。

tail

ファイル末尾の行を表示します。

演習の解答

  1. 次の top の出力を見て、以下の問題に答えて下さい:

    carol@debian:~$ top
    
    top - 13:39:16 up 31 min,  1 user,  load average: 0.12, 0.15, 0.10
    Tasks:  73 total,   2 running,  71 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  1.1 us,  0.4 sy,  0.0 ni, 98.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  1020332 total,   698700 free,   170664 used,   150968 buff/cache
    KiB Swap:  1046524 total,  1046524 free,        0 used.   710956 avail Mem
    
      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
      605 nobody    20   0 1137620 132424  34256 S  6.3 13.0   1:47.24 ntopng
      444 www-data  20   0  364780   4132   2572 S  0.3  0.4   0:00.44 apache2
      734 root      20   0   95212   7004   6036 S  0.3  0.7   0:00.36 sshd
      887 carol     20   0   46608   3680   3104 R  0.3  0.4   0:00.03 top
        1 root      20   0   56988   6688   5240 S  0.0  0.7   0:00.42 systemd
        2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd
        3 root      20   0       0      0      0 S  0.0  0.0   0:00.09 ksoftirqd/0
        4 root      20   0       0      0      0 S  0.0  0.0   0:00.87 kworker/0:0
    (...)
    • ユーザー carol が開始したプロセスは何ですか?

      答え: ひとつの top だけです。

    • top コマンドに関するデータを見つけるには、/proc 仮想ディレクトリのどこを見ればよいですか?

      答え: /proc/887

    • 最初に実行されたプロセスは何でしょう? どうしてそれが分かりますか?

      答え: systemd です。PID が 1 だからです。

    • top の出力のどこを見ればそれぞれの情報が 分かるかを答えて、以下の表を完成させて下さい:

      情報 サマリー部 タスク部

      メモリ

      ○

      ○

      スワップ

      ○

      ×

      PID

      ×

      ○

      CPU時間

      ○

      ○

      コマンド

      ×

      ○

  2. 以下に示すバイナリ形式のログを見るために使用するコマンドは何でしょうか?

    • /var/log/wtmp

      答え: last

    • /var/log/btmp

      答え: lastb

    • /run/log/journal/2a7d9730cd3142f4b15e20d6be631836/system.journal

      答え: journalctl

  3. Linuxシステムの以下の情報を調べるために、grep と組み合わせて使用するコマンドは何でしょうか?

    • システムが最後にいつリブートしたか( wtmp )

      答え: last

    • 接続されているハードディスク( kern.log )

      答え: less /var/log/kern.log

    • いつ最後にログインしたか( auth.log )

      答え: less /var/log/auth.log

  4. カーネルリングバッファを表示するために利用できる2つのコマンドは何でしょう?

    dmesg と journalctl -k (あるいは journalctl --dmesg)

  5. 以下のログメッセージは、どこにあるかを答えて下さい。

    • Jul 10 13:37:39 debian dbus[303]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'

      /var/log/auth.log

      /var/log/kern.log

      /var/log/syslog

      ○

      /var/log/messages

    • Jul 10 11:23:58 debian kernel: [ 1.923349] usbhid: USB HID core driver

      /var/log/auth.log

      /var/log/kern.log

      ○

      /var/log/syslog

      /var/log/messages

      ○

      Jul 10 14:02:53 debian sudo: pam_unix(sudo:session): session opened for user root by carol(uid=0)

      /var/log/auth.log

      ○

      /var/log/kern.log

      /var/log/syslog

      /var/log/messages

    • Jul 10 11:23:58 debian NetworkManager[322]: <info> [1562750638.8672] NetworkManager (version 1.6.2) is starting…​

      /var/log/auth.log

      /var/log/kern.log

      /var/log/syslog

      /var/log/messages

      ○

  6. 以下のユニットに関する情報を得るには、journalctl にどのように問い合わせますか?

    ユニット コマンド

    ssh

    journalctl -u ssh.service

    networking

    journalctl -u networking.service

    rsyslog

    journalctl -u rsyslog.service

    cron

    journalctl -u cron.service

発展演習の解答

  1. 演習にある top の出力を再度確認して、以下の問いに答えましょう:

    • apache Webサーバーを終了するために実行する2つのステップは何でしょう?

      まず k を押して、kill する値を指定します。

    • サマリー部において物理メモリとスワップ領域の情報をプログレスバーを使って表示するにはどうしますか?

      m を1回ないし2回押します。

    • メモリ使用量によってプロセスをソートしましょう:

      M

    • ここまでに、メモリ情報をプログレスバーに表示して、メモリ使用量に応じてプロセスがソートされているはずです。この設定を保存して、次に top を使うときのデフォルトとするにはどうしますか?

      W

    • top の設定を保存するファイルは何ですか? それはどこにありますか? 存在を確認してみましょう。

      ファイルは ~/.config/procps/toprc で、ユーザーのホームディレクトリ( ~ )にあります。これは隠しファイル(ドットから始まる名前のディレクトリにあるので)なので、存在を確認するには ls -a (すべてのファイルをリストする)を使います。top の中で kbd:[Shift+W] を押すと生成されます。

  2. Bashの exec コマンドを試して学びましょう。Bashのセッションを開始して、ps で Bashのプロセスをメモします。次に exec /bin/sh を実行してから、同じPIDを再度探してみましょう。

    exec は、プロセスを他のコマンドで置き換えます。次の例では Bashのプロセスが /bin/sh に置き換えられることを確認できます( /bin/sh は子プロセスになりません)。

    $ echo $$
    19877
    $ ps auxf | grep 19877 | head -1
    carol  19877  0.0  0.0   7448  3984 pts/25   Ss   21:17   0:00  \_ bash
    $ exec /bin/sh
    sh-5.0$ ps auxf | grep 19877 | head -1
    carol  19877  0.0  0.0   7448  3896 pts/25   Ss   21:17   0:00  \_ /bin/sh
  3. 以下の手順を実行して、カーネルイベントと udevによる動的なデバイス管理を探索しましょう:

    • USBドライブをコンピュターセットします。dmesg を実行して、最後の行に注目します。最後の行はどうなっていますか?

      [ 1967.700468] sd 6:0:0:0: [sdb] Attached SCSI removable disk のような行が見れるはずです。

    • 前のコマンドの出力を念頭において、ls /dev/sd* を実行してリストに USBドライブが現れることを確認します。出力は何ですか?

      システムに何台のデバイスが接続されているかによりますが、/dev/sda /dev/sda1 /dev/sdb /dev/sdb1 /dev/sdb2 のような結果が得られるはずです。この例では、USBデバイス ( /dev/sdb )とその2つのパーティション( /dev/sdb1 と /dev/sdb2)があります。

    • 次にUSBドライブを取り外して、再度 dmesg を実行します。最後の行はどうなっていますか?

      [ 2458.881695] usb 1-9: USB disconnect, device number 6 のような行が見れるはずです。

    • 再度 ls /dev/sd* を実行して、リストからUSBドライブが無くなったことを確認します。出力は何ですか?

      ここの例では、/dev/sda /dev/sda1 です。

Linux Professional Insitute Inc. All rights reserved. 学習資料をご覧ください: https://learning.lpi.org
ここでの作成物は、Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Licenseの下でライセンスされています。

次のレッスン

4.4 ネットワーク上のコンピュータ (4.4 レッスン 1)

次のレッスンを読む

Linux Professional Insitute Inc. All rights reserved. 学習資料をご覧ください: https://learning.lpi.org
ここでの作成物は、Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Licenseの下でライセンスされています。

LPIは非営利団体です。

© 2023 Linux Professional Institute(LPI)は、オープンソースプロフェッショナル向けのグローバルな認定基準およびキャリアサポート組織です。200,000人以上の認定保持者を擁する、世界初かつ最大のベンダー中立Linuxおよびオープンソース認定機関です。LPIは180か国以上で認定プロフェッショナルを擁し、複数の言語で試験を実施し、何百ものトレーニングパートナーを擁しています。

私たちの目的は、オープンソースの知識とスキルの認定資格を世界中からアクセスできるようにすることで、誰にとっても経済的で創造的な機会を可能にすることです。

  • LinkedIn
  • flogo-RGB-HEX-Blk-58 Facebook
  • Twitter
  • お問い合わせ
  • 個人情報とCookieポリシー

間違いを見つけたり、このページを改善したいですか? 私たちに知らせてください。.

© 1999–2023 The Linux Professional Institute Inc. All rights reserved.