【初心者向け】Linuxサーバーの基本的な調査について

# はじめに
Linuxサーバーの運用・保守をする際に、サーバーがどのような状態であるかを把握することはとても大切です。

サーバーの用途、スペック、動作しているサービスやプロセスなどを把握することで、そのサーバーへの理解が深まり、調査や設定変更、障害対応等で役立てることができます。

# 基本的な調査コマンド
まず何から調査すればいいのか悩むことがあると思います。
以下に調査時に使用する基本的なコマンドと実行例を記載しますので、ぜひ試してみてください。

### ①ip a
「ip a」コマンドは、サーバーに設定されているネットワークインターフェースに関する情報を表示します。
IPアドレスやMACアドレス、インターフェースの状態などを確認できます。

`実行例`
```
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::111:22ff:fe33:4455/64 scope link
       valid_lft forever preferred_lft forever
```
**実行例の注目する箇所**
- eth0：インターフェース名になります
- inet 192.168.1.100/24：IPv4アドレス情報です
- inet6 fe80::～：IPv6アドレス情報です
- UP,LOWER_UP：インターフェースの状態です。この例では正常に動作している状態を示します。

※インターフェースの状態でその他によく見られるのは以下になります。
 - DOWN,LOWER_DOWN：
インターフェースが論理的に停止していて、物理的なリンクも確立していない状態。管理上の理由等で意図的に停止されている場合や、物理的な接続の問題が考えられます。
- UP,LOWER_DOWN：
インターフェースが論理的に起動しているが物理的なリンクが確立していない状態。ケーブルの接続不良、相手側デバイスの電源断、ポートの故障などが考えられます。

### ②ip r
「ip r」コマンドはサーバーのルーティングテーブルを表示します。
パケットがどの経路を通ってネットワークに送信されるかを確認できます。

`実行例`
```
$ ip r
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 metric 100
```
**実行例の注目する箇所**
- default via 192.168.1.1 dev eth0：フォルトゲートウェイが192.168.1.1であり、eth0インターフェースを経由することを表しています。
- 192.168.1.0/24 dev eth0：192.168.1.0/24 のネットワーク宛のトラフィックは eth0 インターフェースを直接使用することを表しています。


### ③ps aux
「ps」コマンドは実行中のプロセスに関する情報を表示するためのコマンドです。
オプションで「aux」を付けると現在実行中の全てのプロセスに関する詳細な情報を表示することができます。

※オプションの意味
- a: 他のユーザーのプロセスを含む全てのプロセスを表示する
- u: プロセスの所有者に関する詳細情報を表示する
- x: 制御端末を持たないプロセスも表示する

`実行例`
```
$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           5  0.0  0.0      0     0 ?        I<    2024   0:00 [rcu_gp]
root          55  0.2  0.5   6800  3920 ?        Ss    2025   1:00 /usr/sbin/crond -n
```
**実行例の注目する箇所**

ヘッダー行の内容は以下になります。
どんなプロセスが動作していて、誰が動かしているのか、CPUやメモリはどのくらい使用しているのかなどを見ると良いと思います。

- USER: プロセスの所有者
- PID: プロセスのID
- %CPU: CPU使用率（全CPU時間の割合）
- %MEM: メモリ使用率（物理メモリの割合）
- VSZ: 仮想メモリサイズ (KB)
- RSS:プロセスが実際に使用している物理メモリ量 (KB)
- TTY: 制御端末。? はデーモンプロセスなど、端末を持たないプロセスを示します
- STAT: プロセスの状態（例:S=スリープ,R=実行中,I=アイドル状態など）
- START: プロセスの開始時刻
- TIME: CPUの総使用時間
- COMMAND: 実行されたコマンド

### ④systemctl list-units --type=service --state=running
「systemctl list-units --type=service --state=running」コマンドはsystemd が管理している「ユニット」の中からユニットのタイプが「service」でユニットの現在の状態が「running（実行中）」であるものを一覧で表示します。
簡単に言うと、サーバー上で実行中のサービスを確認できます。

`実行例`
```
$ systemctl list-units --type=service --state=running
  UNIT                       LOAD   ACTIVE SUB     DESCRIPTION
  crond.service              loaded active running Command Scheduler
  NetworkManager.service     loaded active running Network Manager
  sshd.service               loaded active running OpenSSH server daemon
```


**実行例の注目する箇所**

ヘッダー行の内容は以下になります。
- UNIT：サービスユニットの名前を示します
- LOAD：ユニットの設定ファイルが systemd に読み込まれたかどうかを示します (loaded は読み込み済み)
- ACTIVE：ユニットの現在の高レベルの状態を示します (active は正常に動作している状態)
- SUB：ユニットのより詳細な状態を示します (running はサービスが実行中の状態)
- DESCRIPTION：サービスユニットの簡単な説明です

今回の例ではcrond、NetworkManager、sshdのサービスが動作していることが分かります。

### ⑤ss
「ss」コマンドは、ソケットの情報を表示するためのコマンドです。
ネットワーク接続、リスニングポート、ソケットの状態など、ネットワークの状態を監視およびトラブルシューティングする際に役立つコマンドです。

個人的によく使うオプションは以下になります。
- t：TCPソケットのみを表示する
- u：UDPソケットのみを表示する
- n：アドレスとポート番号を数値で表示する
- l：リッスン状態のソケットのみを表示する。サーバーがどのポートでサービスを提供しているかを確認できる。
- p：ソケットを使用しているプロセス名とPIDを表示する。どのプロセスが特定のポートを使用しているか特定できる。


`実行例`
```
$ ss
Netid  State      Recv-Q Send-Q  Local Address:Port                      Peer Address:Port
u_str  ESTAB      0      0                   * 123456789                                  * 987654321
u_str  ESTAB      0      0           /run/systemd/journal/stdout 11111                    * 22222
u_str  ESTAB      0      0           /run/dbus/system_bus_socket 33333                    * 44444
tcp    ESTAB      0      1000      192.168.1.10:ssh                     192.168.1.20:50000
tcp    ESTAB      0      0         192.168.1.10:54321                   10.0.0.5:microsoft-ds
```

**実行例の注目する箇所**
- Netid: u_str：サーバー内部で、Unixドメインソケット (u_str) を利用した通信がされていることが分かります
- Netid: tcp： TCPプロトコルを使用している接続がされていることが分かります。
今回の例では192.168.1.10（ローカルサーバー)から192.168.1.20のポート50000へのSSH接続が確立していることを示します。
また、10.0.0.5のmicrosoft-dsポートへの接続がされており、ファイル共有等で通信している可能性を示します。



### ⑥hostnamectl
「hostnamectl」コマンドは、Linuxサーバーのホスト名やOS情報等の基本情報を確認することができるコマンドです。

`実行例`
```
$ hostnamectl
 Static hostname: example-server
       Icon name: computer-server
         Chassis: server
      Machine ID: abcdef0123456789abcdef0123456789
         Boot ID: ghijk98765432100ghijk98765432100
Operating System: Generic Linux 8.x
      CPE OS Name: cpe:/o:generic:linux:8:ga
            Kernel: Linux 4.18.0-xxxx.yy.zz.el8_x.x86_64
      Architecture: x86-64
```

**実行例の注目する箇所**
- Static hostname：サーバーのホスト名を示します。
- Chassis：筐体の種類を示します。今回の例では「server」となっておりますが、他にも「vm（仮想マシン）」や「desktop（デスクトップ）」などがあります。
- Operating System：このサーバーにインストールされているOSの種類とバージョンを示します。



### ⑦top
「top」コマンドは、実行中のプロセスとシステム全体のパフォーマンスをリアルタイムに表示するコマンドです。
CPU 使用率やメモリ使用量、実行時間などの情報を一覧で表示します。
topコマンドはサマリーエリアとタスク・プロセスエリアに分かれて表示されます。

`実行例`
```
top - 14:00:00 up 1 day,  0:30,  1 user,  load average: 0.05, 0.03, 0.01
Tasks: 200 total,   1 running, 198 sleeping,   1 stopped,   0 zombie
%Cpu(s):  1.5 us,  0.3 sy,  0.0 ni, 98.0 id,  0.1 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem :  8175808 total,  1572864 free,  5598080 used,  1004864 buff/cache
KiB Swap:  2097152 total,  2097152 free,        0 used.  2380800 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 1234 root      20   0  175000   4500   3000 S   0.1  0.1   0:01.50 systemd
 5678 user      20   0  250000  12000   8000 S   0.1  0.1   0:05.20 web_server
 9012 root      20   0  300000   6000   4000 S   0.0  0.1   0:00.80 database_server
```
**実行例の注目する箇所**
- %Cpu(s):  1.5 us,  0.3 sy,  0.0 ni, 98.0 id,：CPUの使用率やアイドル状態のCPU使用率を示します。今回の例ではCPU使用率が1.5%、アイドル状態のCPU使用率が98%となっておりシステムに余裕がある状態を示します。（サマリーエリア）
- 1234 root 20 0 175000 4500 3000 S 0.0 0.1 0:01.50 systemd：プロセスの所有者がroot、CPUとメモリの使用率が0.1%、実行コマンドがsystemdであることが分かります。（タスク・プロセスエリア）


### ⑧cat /etc/passwd
「cat /etc/passwd」コマンドは、システムにどのようなユーザーが存在していて、どのような属性を持っているかを確認することができるコマンドです。

※catは指定されたファイルの内容を標準出力に表示するコマンド、/etc/passwdはシステムに登録されている各ユーザーのアカウント情報が載っているファイルです。


`実行例`
```
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
nobody:x:65534:65534:nobody:/:/sbin/nologin
messagebus:x:101:102::/var/run/dbus:/sbin/nologin
dbus:x:81:81:dbus user,,,:/var/run/dbus:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
user01:x:1000:1000:Example User 1:/home/user01:/bin/bash
user02:x:1002:1002:Another User:/home/user02:/bin/sh
```

**実行例の注目する箇所**
- user01,user02：今回の例では一般のユーザーアカウントとしてuser01とuser02が設定されていることが分かります。

※一般的に、UIDが1-999のユーザーは通常システムが内部的に使用するアカウント（サービスアカウントやデーモンなど）で、UIDが1000以上のユーザーはユーザーアカウントとなり、システムにログインして作業するために使用します。


# 最後に
本記事では、Linuxサーバーの基本的な情報を調査するための主要なコマンドを解説しました。
これらのコマンドを組み合わせることで、ネットワークの設定、実行中のプロセスやサービス、サーバーの基本的な情報、リソースの使用状況、そして登録されているユーザーアカウントといった、サーバーの状態を把握するための重要な情報を収集できます。

各コマンドには本記事で紹介した以外にも多くのオプションが存在します。また、この他にも調査用のコマンドはたくさん存在しますので、気になった方は調べてみてください。

Linuxサーバーの調査は最初は難しく感じることが多いと思いますが、一つ一つのコマンドの意味と出力結果を理解していくことで、サーバーの状態が分かるようになってきます。
色々なコマンドを試しながら、Linuxサーバーの理解を深めていきましょう。