Troubleshooting Methodology and Tools

Linuxトラブルシューティング方法論とツール 完全ガイド

目次

  1. はじめに
  2. 体系的トラブルシューティング方法論
  3. システム情報の収集
  4. ハードウェアトラブルシューティング
  5. プロセストラブルシューティング
  6. メモリトラブルシューティング
  7. ディスクトラブルシューティング
  8. ネットワークトラブルシューティング
  9. ブートトラブルシューティング
  10. ログ分析
  11. コアダンプ分析の基礎
  12. ランブックの作成
  13. トラブルシューティングツール比較表
  14. ベストプラクティス
  15. 参考資料

1. はじめに

Linuxシステムのトラブルシューティングは、体系的なアプローチと適切なツールの知識が不可欠である。問題の症状から根本原因を特定し、適切な対策を講じるためには、方法論に基づいた調査が重要である。

本ドキュメントでは、トラブルシューティングの方法論(USE、RED、TSA)、各分野のトラブルシューティングツール、そして実践的な調査手順を包括的に解説する。


2. 体系的トラブルシューティング方法論

2.1 USE メソッド

Brendan Gregg が提唱した方法論。各リソースについて Utilization(使用率)、Saturation(飽和度)、Errors(エラー)を確認する。

┌──────────────────────────────────────────────────────┐
│                   USE メソッド                         │
│                                                       │
│  U = Utilization (使用率)                             │
│      リソースがどれだけ使用されているか                 │
│      例: CPU使用率 80%                                │
│                                                       │
│  S = Saturation (飽和度)                              │
│      リソースがどれだけ過負荷状態か                    │
│      例: CPU のランキュー長                            │
│                                                       │
│  E = Errors (エラー)                                  │
│      エラーイベントの発生回数                          │
│      例: NIC のCRCエラー数                            │
└──────────────────────────────────────────────────────┘

USEメソッドのチェックリスト:

リソースUtilizationSaturationErrors
CPUmpstat -P ALL 1, sar -uvmstat 1 (r列), sar -qdmesg, MCEログ
メモリfree -m, vmstat 1 (si/so列)vmstat 1 (si/so列), sar -Bdmesg (OOMメッセージ)
ストレージI/Oiostat -xz 1, sar -diostat -xz 1 (avgqu-sz)smartctl -a, dmesg
ストレージ容量df -h, du -shdf -i (inode)dmesg, FS エラー
ネットワークsar -n DEV 1, ip -s linkss -s, netstat -sip -s link (エラーカウンタ)
# CPU の USE チェック
# U: CPU使用率
$ mpstat -P ALL 1 3
Linux 5.15.0-91-generic    01/15/2024
10:00:01 AM  CPU    %usr   %nice    %sys %iowait   %irq   %soft  %steal  %idle
10:00:02 AM  all   45.25    0.00   12.50    2.25    0.50    1.00    0.00  38.50
10:00:02 AM    0   50.00    0.00   15.00    3.00    1.00    2.00    0.00  29.00
10:00:02 AM    1   40.50    0.00   10.00    1.50    0.00    0.00    0.00  48.00

# S: CPUの飽和度(ランキュー)
$ 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
 5  0      0 1234567  89012 3456789   0    0     0    50 1234  567 45 12 38  2  0
# r列 > CPUコア数 → 飽和状態

# E: CPUエラー
$ dmesg | grep -i "mce\|machine check\|cpu error"
$ journalctl -k | grep -i "mce"

2.2 RED メソッド

Tom Wilkie が提唱した、マイクロサービス向けの方法論。各サービスについて Rate(リクエスト率)、Errors(エラー率)、Duration(応答時間)を確認する。

┌──────────────────────────────────────────────────────┐
│                   RED メソッド                         │
│                                                       │
│  R = Rate (リクエスト率)                              │
│      サービスが処理しているリクエスト数/秒             │
│                                                       │
│  E = Errors (エラー率)                                │
│      失敗したリクエストの割合                          │
│                                                       │
│  D = Duration (応答時間)                              │
│      リクエストの処理にかかる時間                      │
└──────────────────────────────────────────────────────┘
# RED メソッドの実践例(Webサーバ)

# R: リクエスト率
$ awk '{print $4}' /var/log/nginx/access.log | cut -d: -f1-3 | uniq -c | tail -5
    125 [15/Jan/2024:10:00
    130 [15/Jan/2024:10:01
    142 [15/Jan/2024:10:02
    128 [15/Jan/2024:10:03
    135 [15/Jan/2024:10:04

# E: エラー率
$ awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
  45000 200
   2000 304
    500 404
    100 500
     50 502
     20 503

# D: 応答時間(Nginxのログに$request_timeが含まれる場合)
$ awk '{print $NF}' /var/log/nginx/access.log | sort -n | tail -20

# curl でレスポンスタイムを測定
$ curl -o /dev/null -s -w "time_total: %{time_total}s\n" http://localhost/
time_total: 0.045s

2.3 TSA メソッド

Thread State Analysis(スレッド状態分析)。プロセスの各スレッドが何をしているかを分析する。

┌──────────────────────────────────────────────────────┐
│                   TSA メソッド                         │
│                                                       │
│  1. スレッドの状態を特定                              │
│     - On-CPU (実行中)                                 │
│     - Off-CPU (待機中: I/O, ロック, スリープ)         │
│                                                       │
│  2. 状態の分布を分析                                  │
│     - CPU使用が高い → プロファイリング                │
│     - Off-CPU時間が長い → Off-CPUプロファイリング     │
│                                                       │
│  3. 根本原因を特定                                    │
│     - スタックトレースの分析                          │
│     - ホットスポットの特定                            │
└──────────────────────────────────────────────────────┘
# スレッド状態の確認
$ ps -eLf | head -20
UID          PID    PPID     LWP  C NLWP STIME TTY          TIME CMD
root           1       0       1  0    1 Jan15 ?        00:00:05 /usr/lib/systemd/systemd

# プロセスのスレッド一覧
$ ps -T -p $(pgrep -f httpd | head -1)
    PID    SPID TTY          TIME CMD
  12345   12345 ?        00:00:01 httpd
  12345   12346 ?        00:00:00 httpd
  12345   12347 ?        00:00:00 httpd

# strace でシステムコールを追跡
$ sudo strace -c -p 12345 -f -e trace=all
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 45.00    0.450000           5     90000           read
 30.00    0.300000           4     75000           write
 15.00    0.150000          10     15000           futex
  5.00    0.050000           3     16667           epoll_wait

2.4 方法論の比較

方法論対象焦点適用場面
USEハードウェアリソースリソースの枯渇状態インフラ/OS層の問題
REDサービス/アプリケーションユーザー体験マイクロサービスの問題
TSAプロセス/スレッド実行状態の分析アプリケーションの問題

3. システム情報の収集

# カーネルとOS情報
$ uname -a
Linux server1 5.15.0-91-generic #101-Ubuntu SMP x86_64 GNU/Linux

$ uname -r        # カーネルバージョンのみ
5.15.0-91-generic

# ディストリビューション情報
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
ID=ubuntu
VERSION_ID="22.04"

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.3 LTS
Release:        22.04
Codename:       jammy

# ホスト情報
$ hostnamectl
   Static hostname: server1
         Icon name: computer-vm
           Chassis: vm
        Machine ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
           Boot ID: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
    Virtualization: kvm
  Operating System: Ubuntu 22.04.3 LTS
            Kernel: Linux 5.15.0-91-generic
      Architecture: x86-64

# ハードウェア情報の詳細
$ sudo dmidecode -t system | head -20
System Information
        Manufacturer: QEMU
        Product Name: Standard PC
        Serial Number: Not Specified
        UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

$ sudo dmidecode -t memory | head -30
Physical Memory Array
        Location: System Board Or Motherboard
        Use: System Memory
        Maximum Capacity: 64 GB
        Number Of Devices: 4

# CPU情報
$ lscpu
Architecture:            x86_64
CPU(s):                  4
Model name:              Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz
Thread(s) per core:      1
Core(s) per socket:      4

# 稼働時間と負荷
$ uptime
 10:00:00 up 45 days, 12:30,  3 users,  load average: 1.50, 1.20, 0.95

# システムリソースの概要
$ cat /proc/meminfo | head -10
MemTotal:       16384000 kB
MemFree:         2048000 kB
MemAvailable:    8192000 kB
Buffers:          512000 kB
Cached:          5632000 kB

4. ハードウェアトラブルシューティング

# PCI デバイスの一覧
$ lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI
00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:04.0 SCSI storage controller: Red Hat, Inc. Virtio block device

# 詳細なPCI情報
$ lspci -v -s 00:03.0
00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
        Subsystem: Red Hat, Inc. Virtio network device
        Flags: bus master, fast devsel, latency 0, IRQ 11
        I/O ports at c000 [size=32]
        Memory at feb90000 (32-bit, non-prefetchable) [size=4K]
        Kernel driver in use: virtio-pci

# USB デバイスの一覧
$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0627:0001 Adomax Technology Co., Ltd Keyboard

# ブロックデバイスの一覧
$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   100G  0 disk
├─sda1   8:1    0     1G  0 part /boot
├─sda2   8:2    0    50G  0 part /
└─sda3   8:3    0    49G  0 part /home
sr0     11:0    1  1024M  0 rom

# ディスクの健全性チェック(SMART)
$ sudo smartctl -a /dev/sda
=== START OF INFORMATION SECTION ===
Model Family:     Western Digital Blue
Device Model:     WDC WD10EZEX-00RKKA0
Serial Number:    WD-XXXXXXXXX
Firmware Version: 80.00A80
User Capacity:    1,000,204,886,016 bytes [1.00 TB]

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

SMART Attributes Data Structure revision number: 16
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       0
  3 Spin_Up_Time            0x0027   138   138   021    Pre-fail  Always       4091
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       0
  9 Power_On_Hours          0x0032   095   095   000    Old_age   Always    4123
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       0
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      0

# SMART テストの実行
$ sudo smartctl -t short /dev/sda    # 短時間テスト(約2分)
$ sudo smartctl -t long /dev/sda     # 長時間テスト(数時間)
$ sudo smartctl -l selftest /dev/sda # テスト結果の確認

# メモリテスト
$ sudo memtester 1024M 1     # 1GBのメモリテスト、1回
memtester version 4.5.1 (64-bit)
Loop 1/1:
  Stuck Address       : ok
  Random Value        : ok
  Compare XOR         : ok
  Compare SUB         : ok
  ...

# ハードウェアエラーログ
$ sudo mcelog --client    # Machine Check Exception ログ
$ sudo rasdaemon --record    # RAS (Reliability, Availability, Serviceability) ログ

5. プロセストラブルシューティング

# プロセス一覧
$ ps aux | head -20
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0 169588 12936 ?        Ss   Jan15   0:05 /usr/lib/systemd/systemd
root           2  0.0  0.0      0     0 ?        S    Jan15   0:00 [kthreadd]
...

# CPU使用率の高いプロセス
$ ps aux --sort=-%cpu | head -10

# メモリ使用量の多いプロセス
$ ps aux --sort=-%mem | head -10

# 特定プロセスの詳細情報
$ ps -fp $(pgrep -f httpd | head -1)

# top / htop - リアルタイムプロセスモニタ
$ top -bn1 | head -20
top - 10:00:00 up 45 days, 12:30,  3 users,  load average: 1.50, 1.20, 0.95
Tasks: 256 total,   2 running, 254 sleeping,   0 stopped,   0 zombie
%Cpu(s): 45.0 us, 12.5 sy,  0.0 ni, 38.5 id,  2.0 wa,  0.5 hi,  1.0 si,  0.0 st
MiB Mem :  16000.0 total,   2000.0 free,   8000.0 used,   6000.0 buff/cache
MiB Swap:   4000.0 total,   3800.0 free,    200.0 used.   7000.0 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
  12345 www-data  20   0  600000 200000  50000 S  85.0   1.2   5:30.00 httpd
  23456 mysql     20   0 2000000 800000 100000 S  25.0   5.0  10:15.00 mysqld

# プロセスの検索
$ pgrep -la httpd
12345 /usr/sbin/httpd -DFOREGROUND
12346 /usr/sbin/httpd -DFOREGROUND

# プロセスツリー
$ pstree -p 12345
httpd(12345)─┬─httpd(12346)
             ├─httpd(12347)
             ├─httpd(12348)
             └─httpd(12349)

# シグナルの送信
$ kill -15 12345     # SIGTERM(正常終了)
$ kill -9 12345      # SIGKILL(強制終了)
$ kill -1 12345      # SIGHUP(設定再読み込み)

# strace - システムコールの追跡
$ sudo strace -p 12345 -f -e trace=network
[pid 12345] accept4(3, {sa_family=AF_INET, sin_port=htons(54321), ...
[pid 12345] read(5, "GET / HTTP/1.1\r\n", 8192) = 16
[pid 12345] write(5, "HTTP/1.1 200 OK\r\n", 17) = 17

# strace の統計出力
$ sudo strace -c -p 12345 -f
^C
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 35.00    0.350000           5     70000           read
 25.00    0.250000           4     62500           write
 20.00    0.200000          10     20000           accept4
 10.00    0.100000           3     33333           epoll_wait
  5.00    0.050000           8      6250           close
  5.00    0.050000          15      3333           stat

# ltrace - ライブラリコールの追跡
$ sudo ltrace -p 12345 -e malloc+free
malloc(1024)                                     = 0x55e8a1b00000
malloc(4096)                                     = 0x55e8a1b00400
free(0x55e8a1b00000)                             = <void>

# /proc からプロセス情報を取得
$ cat /proc/12345/status | head -20
Name:   httpd
State:  S (sleeping)
Tgid:   12345
Pid:    12345
PPid:   1
Threads:        4
VmPeak:   600000 kB
VmRSS:    200000 kB

# ファイルディスクリプタの確認
$ ls -la /proc/12345/fd/ | head -20
$ cat /proc/12345/limits

6. メモリトラブルシューティング

# メモリ使用状況の確認
$ free -mh
               total        used        free      shared  buff/cache   available
Mem:            16Gi       8.0Gi       2.0Gi       256Mi       6.0Gi       7.0Gi
Swap:          4.0Gi       200Mi       3.8Gi

# vmstat - メモリと仮想メモリの統計
$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0 204800 2048000 512000 5632000   0    0     5    20 1500  800 45 12 38  2  0
 1  0 204800 2040000 512100 5632500   0    0     0    50 1450  780 40 10 45  2  0

# si: スワップイン(ディスク→メモリ)
# so: スワップアウト(メモリ→ディスク)
# si/so > 0 → メモリ不足の兆候

# /proc/meminfo の詳細
$ cat /proc/meminfo
MemTotal:       16384000 kB
MemFree:         2048000 kB
MemAvailable:    7168000 kB
Buffers:          512000 kB
Cached:          5632000 kB
SwapCached:        10000 kB
Active:          8000000 kB
Inactive:        5000000 kB
SwapTotal:       4096000 kB
SwapFree:        3891200 kB
Dirty:             12000 kB
Shmem:            256000 kB
Slab:             800000 kB
SReclaimable:     600000 kB
SUnreclaim:       200000 kB

# OOM (Out of Memory) の分析
$ dmesg | grep -i "oom\|out of memory\|killed process"
[12345.678901] Out of memory: Killed process 23456 (mysqld) total-vm:2048000kB, anon-rss:1500000kB
[12345.678902] oom_reaper: reaped process 23456 (mysqld), now anon-rss:0kB

# OOMスコアの確認
$ cat /proc/12345/oom_score
150

$ cat /proc/12345/oom_score_adj
0    # -1000 ~ 1000 (-1000 = OOMされない)

# OOMの防止設定
$ echo -1000 > /proc/12345/oom_score_adj    # このプロセスをOOMから保護

# slab メモリの分析
$ sudo slabtop -o | head -20
 Active / Total Objects (% used)    : 2500000 / 3000000 (83.3%)
 Active / Total Slabs (% used)      : 80000 / 80000 (100.0%)

 OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME
50000  48000  96%    0.19K   2500       20     10000K dentry
30000  28000  93%    0.57K   2143       14     17144K inode_cache
20000  19000  95%    0.12K    625       32      2500K kernfs_node_cache

# メモリリークの調査
$ sudo smem -t -k
  PID User     Command                         Swap      USS      PSS      RSS
12345 mysql    mysqld                          100M     800M     820M     850M
23456 www-data httpd                             0     150M     160M     200M

# ページキャッシュのドロップ(緊急時のみ)
$ sudo sync; echo 3 > /proc/sys/vm/drop_caches
# 1 = ページキャッシュ, 2 = dentryとinode, 3 = 全て

7. ディスクトラブルシューティング

# I/O統計の確認
$ iostat -xz 1 3
Device       r/s   rkB/s  rrqm/s  %rrqm r_await rareq-sz   w/s   wkB/s  wrqm/s  %wrqm w_await wareq-sz  d/s   dkB/s  drqm/s  %drqm d_await dareq-sz  f/s f_await  aqu-sz  %util
sda        50.00 2000.00    5.00  10.00    2.50    40.00  30.00 1500.00   10.00  25.00    5.00    50.00 0.00    0.00    0.00   0.00    0.00     0.00 0.00    0.00    0.35  45.00

# 重要な指標:
# %util: ディスク使用率(100%に近いと飽和状態)
# await: I/O待ち時間(高いとパフォーマンス低下)
# aqu-sz: キューの平均長(高いと飽和)

# I/Oを発生させているプロセスの特定
$ sudo iotop -oP
Total DISK READ:       5.00 MB/s | Total DISK WRITE:       3.00 MB/s
Actual DISK READ:      5.00 MB/s | Actual DISK WRITE:      3.00 MB/s
    PID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
  12345 be/4  mysql      4.00 MB/s   2.50 MB/s  0.00 %  35.00 % mysqld
  23456 be/4  root       1.00 MB/s   0.50 MB/s  0.00 %  10.00 % rsync

# ディスク容量の確認
$ df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda2      ext4       50G   35G   13G  73% /
/dev/sda3      xfs        49G   40G   9.0G  82% /home
/dev/sda1      ext4      976M  150M  760M  17% /boot

# inode使用率の確認
$ df -i
Filesystem       Inodes   IUsed    IFree IUse% Mounted on
/dev/sda2       3276800 1500000  1776800   46% /
/dev/sda3       3211264 2800000   411264   87% /home

# 大きなファイルの検索
$ sudo find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -hr | head -20

# ディレクトリごとの使用量
$ sudo du -sh /var/* | sort -hr | head -10
15G     /var/lib
5.0G    /var/log
2.0G    /var/cache
500M    /var/tmp

# ファイルシステムの整合性チェック
# ext4
$ sudo e2fsck -f /dev/sda2    # アンマウント状態で実行

# xfs
$ sudo xfs_repair /dev/sda3   # アンマウント状態で実行

# ディスクI/Oの詳細追跡(blktrace)
$ sudo blktrace -d /dev/sda -o - | blkparse -i -
  8,0    0        1     0.000000000  12345  Q   R 1234567 + 8 [mysqld]
  8,0    0        2     0.000001000  12345  G   R 1234567 + 8 [mysqld]
  8,0    0        3     0.000002000  12345  D   R 1234567 + 8 [mysqld]
  8,0    0        4     0.002000000  12345  C   R 1234567 + 8 [0]

8. ネットワークトラブルシューティング

# ソケットの確認
$ ss -tlnp
State   Recv-Q  Send-Q  Local Address:Port   Peer Address:Port  Process
LISTEN  0       128     0.0.0.0:22            0.0.0.0:*          users:(("sshd",pid=1234))
LISTEN  0       511     0.0.0.0:80            0.0.0.0:*          users:(("nginx",pid=2345))
LISTEN  0       128     0.0.0.0:443           0.0.0.0:*          users:(("nginx",pid=2345))

# ss の主要オプション
# -t: TCP, -u: UDP, -l: リスニング, -n: 数値表示, -p: プロセス表示
# -s: 統計, -a: 全て, -4: IPv4のみ, -6: IPv6のみ

# 接続の統計
$ ss -s
Total: 350
TCP:   250 (estab 200, closed 10, orphaned 5, timewait 20)
Transport Total     IP        IPv6
RAW       1         0         1
UDP       15        10        5
TCP       240       200       40
INET      256       210       46

# TCP接続の状態分布
$ ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn
    200 ESTAB
     20 TIME-WAIT
     10 CLOSE-WAIT
      5 FIN-WAIT-2
      5 LISTEN

# パケットキャプチャ
$ sudo tcpdump -i eth0 -n port 80 -c 20
10:00:01.000000 IP 192.168.1.10.54321 > 192.168.1.100.80: Flags [S], seq 1234567
10:00:01.000100 IP 192.168.1.100.80 > 192.168.1.10.54321: Flags [S.], seq 2345678, ack 1234568
10:00:01.000200 IP 192.168.1.10.54321 > 192.168.1.100.80: Flags [.], ack 1

# ファイルに保存して後で分析
$ sudo tcpdump -i eth0 -w /tmp/capture.pcap -c 1000
$ tcpdump -r /tmp/capture.pcap -n | head -20

# ネットワーク到達性の確認
$ ping -c 4 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.534 ms

# traceroute / mtr
$ mtr -r -c 10 google.com
Start: 2024-01-15T10:00:00+0900
HOST: server1                     Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- gateway                    0.0%    10    0.5   0.6   0.4   1.0   0.2
  2.|-- isp-router                 0.0%    10    5.0   5.2   4.8   6.0   0.4
  3.|-- google.com                 0.0%    10   10.0  10.5   9.5  12.0   0.8

# ポートスキャン
$ nmap -sT -p 1-1000 192.168.1.100
PORT    STATE  SERVICE
22/tcp  open   ssh
80/tcp  open   http
443/tcp open   https
3306/tcp open  mysql

# 帯域幅テスト
$ iperf3 -s                           # サーバ側
$ iperf3 -c 192.168.1.100 -t 10      # クライアント側
[  5]   0.00-10.00  sec  1.09 GBytes   935 Mbits/sec    0             sender
[  5]   0.00-10.00  sec  1.09 GBytes   935 Mbits/sec                  receiver

# DNS の確認
$ dig google.com +short
142.250.80.46

$ dig @8.8.8.8 google.com
$ nslookup google.com

# ARP テーブル
$ ip neigh show
192.168.1.1 dev eth0 lladdr 00:11:22:33:44:55 REACHABLE

9. ブートトラブルシューティング

# ブートプロセスの分析
$ systemd-analyze
Startup finished in 3.500s (firmware) + 1.200s (loader) + 2.800s (kernel) + 15.500s (userspace) = 23.000s
graphical.target reached after 15.200s in userspace

$ systemd-analyze blame | head -10
10.500s  NetworkManager-wait-online.service
 3.200s  plymouth-quit-wait.service
 1.500s  systemd-udev-settle.service
 1.200s  lvm2-monitor.service
 0.800s  firewalld.service

$ systemd-analyze critical-chain
graphical.target @15.200s
└─multi-user.target @15.200s
  └─sshd.service @5.000s +0.100s
    └─network.target @4.900s

# GRUB レスキュー
# GRUB メニューでの操作:
# 'e' キー: エントリの編集
# linux 行の末尾に追加:
#   single           → シングルユーザーモード
#   rd.break         → initramfs でシェルを取得
#   systemd.unit=emergency.target → エマージェンシーモード
#   systemd.unit=rescue.target    → レスキューモード
#   init=/bin/bash   → bash で起動

# ルートパスワードのリセット
# 1. GRUB で 'e' を押して編集
# 2. linux 行の末尾に rd.break を追加
# 3. Ctrl+X でブート
# 4. initramfs シェルで:
switch_root:/# mount -o remount,rw /sysroot
switch_root:/# chroot /sysroot
sh-5.1# passwd root
sh-5.1# touch /.autorelabel    # SELinux環境の場合
sh-5.1# exit
switch_root:/# reboot

# initramfs の再構築
$ sudo dracut --force                    # RHEL/CentOS
$ sudo update-initramfs -u              # Ubuntu/Debian

# GRUB の再インストール
$ sudo grub2-install /dev/sda           # RHEL (BIOS)
$ sudo grub2-install --target=x86_64-efi --efi-directory=/boot/efi  # UEFI
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg

# Ubuntu
$ sudo grub-install /dev/sda
$ sudo update-grub

# ブートログの確認
$ journalctl -b        # 現在のブート
$ journalctl -b -1     # 前回のブート
$ journalctl --list-boots
 -2  xxxxxx  Mon 2024-01-13 10:00:00 — Mon 2024-01-14 08:00:00
 -1  yyyyyy  Mon 2024-01-14 08:05:00 — Mon 2024-01-15 09:00:00
  0  zzzzzz  Mon 2024-01-15 09:05:00 — Mon 2024-01-15 10:00:00

# systemd のユニット失敗の確認
$ systemctl --failed
  UNIT                        LOAD   ACTIVE SUB    DESCRIPTION
  nginx.service               loaded failed failed nginx web server
  postfix.service             loaded failed failed Postfix Mail Transport Agent

$ systemctl status nginx.service
$ journalctl -u nginx.service --since "1 hour ago"

10. ログ分析

# journalctl - systemd ジャーナルの確認
# 基本的な使い方
$ journalctl                          # 全ログ
$ journalctl -f                       # リアルタイム追跡
$ journalctl -n 50                    # 最新50行
$ journalctl --since "2024-01-15"     # 日付指定
$ journalctl --since "1 hour ago"     # 相対時間
$ journalctl -u sshd.service          # 特定ユニット
$ journalctl -k                       # カーネルメッセージのみ
$ journalctl -p err                   # エラー以上の優先度

# 優先度レベル
# 0: emerg, 1: alert, 2: crit, 3: err, 4: warning, 5: notice, 6: info, 7: debug

# ログファイルの分析
$ tail -f /var/log/syslog              # Ubuntu
$ tail -f /var/log/messages            # RHEL

# 認証ログ
$ tail -f /var/log/auth.log            # Ubuntu
$ tail -f /var/log/secure              # RHEL

# 失敗したSSHログインの分析
$ grep "Failed password" /var/log/auth.log | \
    awk '{print $11}' | sort | uniq -c | sort -rn | head -10
    500 192.168.1.50
    200 10.0.0.25
     50 172.16.0.100

# ログの集計と分析
$ journalctl --since "1 hour ago" -p err --no-pager | \
    awk '{for(i=6;i<=NF;i++) printf "%s ",$i; print ""}' | \
    sort | uniq -c | sort -rn | head -10

# ログローテーションの確認
$ cat /etc/logrotate.d/syslog
/var/log/syslog
{
    rotate 7
    daily
    missingok
    notifempty
    delaycompress
    compress
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}

# ログの検索パターン
$ journalctl --since "2024-01-15 09:00" --until "2024-01-15 10:00" \
    -u httpd -p warning..err --no-pager

11. コアダンプ分析の基礎

# コアダンプの設定確認
$ ulimit -c
0    # 0 = コアダンプ無効

# コアダンプの有効化
$ ulimit -c unlimited    # 現在のシェルセッション
$ echo "* soft core unlimited" >> /etc/security/limits.conf    # 永続化

# systemd でのコアダンプ設定
$ cat /etc/systemd/coredump.conf
[Coredump]
Storage=external
Compress=yes
ProcessSizeMax=2G
ExternalSizeMax=2G

# コアダンプの保存先
$ coredumpctl list
TIME                            PID   UID   GID SIG COREFILE  EXE
Mon 2024-01-15 10:00:00 JST   12345  1000  1000  11 present   /usr/bin/myapp

# コアダンプの情報表示
$ coredumpctl info 12345
           PID: 12345
           UID: 1000
           GID: 1000
        Signal: 11 (SEGV)
     Timestamp: Mon 2024-01-15 10:00:00 JST
  Command Line: /usr/bin/myapp --config /etc/myapp.conf
    Executable: /usr/bin/myapp

# GDB でコアダンプを分析
$ coredumpctl gdb 12345
# または
$ gdb /usr/bin/myapp /var/lib/systemd/coredump/core.myapp.12345.xxx

(gdb) bt                    # バックトレース
#0  0x00007f1234567890 in strlen () from /lib64/libc.so.6
#1  0x0000555555555678 in process_request (req=0x0) at main.c:42
#2  0x0000555555555abc in main (argc=2, argv=0x7fffffffe000) at main.c:100

(gdb) bt full               # 詳細なバックトレース(ローカル変数含む)
(gdb) info threads           # スレッド情報
(gdb) thread apply all bt    # 全スレッドのバックトレース

12. ランブックの作成

# ランブックテンプレート

## インシデント: [問題名]

### 概要
- 影響範囲: [サービス名、ユーザー数]
- 重要度: [Critical/High/Medium/Low]
- 最終更新: [日付]

### 症状
1. [症状1]
2. [症状2]

### 診断手順
1. サービスの状態確認
   ```bash
   systemctl status [service]
  1. ログの確認
    journalctl -u [service] --since "30 minutes ago"
    
  2. リソースの確認
    top -bn1 | head -20
    free -mh
    df -h
    

復旧手順

  1. [手順1]
  2. [手順2]
  3. [手順3]

エスカレーション

  • L1: [担当チーム/連絡先]
  • L2: [担当チーム/連絡先]
  • L3: [担当チーム/連絡先]

根本原因と予防策

  • 根本原因: [説明]
  • 予防策: [説明]

### 一般的なランブック例

```bash
# ランブック: ディスク容量不足

## 診断
$ df -h /
$ du -sh /var/* | sort -hr | head -10
$ find /var/log -name "*.log" -size +100M

## 即時対応
# 1. 古いログの削除
$ sudo journalctl --vacuum-size=500M
$ sudo find /var/log -name "*.gz" -mtime +30 -delete

# 2. パッケージキャッシュの削除
$ sudo dnf clean all           # RHEL
$ sudo apt-get clean           # Ubuntu

# 3. 一時ファイルの削除
$ sudo rm -rf /tmp/*
$ sudo rm -rf /var/tmp/*

## 恒久対策
# 1. ログローテーションの設定確認
# 2. ディスク使用量の監視設定
# 3. 必要に応じてディスクの拡張

13. トラブルシューティングツール比較表

カテゴリツール用途推奨度
システム情報uname, hostnamectlOS/カーネル情報
dmidecodeハードウェア情報
lscpuCPU情報
プロセスps, top, htopプロセス監視
straceシステムコール追跡
ltraceライブラリコール追跡
pgrep, pkillプロセス検索/キル
メモリfreeメモリ使用状況
vmstat仮想メモリ統計
smemプロセス別メモリ使用量
slabtopカーネルslabメモリ
ディスクiostatI/O統計
iotopプロセス別I/O
blktraceブロックI/O追跡
smartctlディスク健全性
ネットワークssソケット情報
tcpdumpパケットキャプチャ
mtrネットワーク経路
nmapポートスキャン
iperf3帯域幅テスト
ブートsystemd-analyzeブート分析
journalctl -bブートログ
ログjournalctlsystemdログ
/var/log/従来のログファイル

14. ベストプラクティス

トラブルシューティングの原則

  1. 仮説を立てて検証する: 闇雲にコマンドを実行せず、仮説に基づいて調査する。

  2. 変更を一つずつ行う: 複数の変更を同時に行うと、どの変更が効果があったか分からなくなる。

  3. 記録を残す: 調査手順、発見事項、実施した対策を記録する。

  4. 再現性を確認する: 問題が再現可能か確認し、根本原因の特定に役立てる。

  5. 最近の変更を確認する: 問題が発生する前に何が変更されたかを確認する。

  6. エスカレーションのタイミングを見極める: 解決に時間がかかりすぎる場合は早めにエスカレーションする。

調査の優先順位

# 1. 影響範囲の把握
$ systemctl status <service>
$ pcs status    # HAクラスタの場合

# 2. リソースの確認(USEメソッド)
$ uptime              # ロードアベレージ
$ free -mh            # メモリ
$ df -h               # ディスク
$ iostat -xz 1 3      # ディスクI/O

# 3. エラーの確認
$ journalctl -p err --since "30 minutes ago"
$ dmesg | tail -20

# 4. 最近の変更の確認
$ last                 # ログイン履歴
$ rpm -qa --last | head -10    # パッケージの変更履歴
$ find /etc -mmin -60 -type f  # 最近変更された設定ファイル

# 5. 詳細な調査
$ strace -p <PID>
$ tcpdump -i eth0 ...

15. 参考資料

書籍

  • Brendan Gregg, "Systems Performance: Enterprise and the Cloud"
  • Brendan Gregg, "BPF Performance Tools"
  • Michael Kerrisk, "The Linux Programming Interface"

Webリソース

重要なディレクトリとファイル

パス説明
/proc/プロセスとカーネル情報の仮想FS
/sys/デバイスとドライバ情報の仮想FS
/var/log/システムログディレクトリ
/var/log/messages汎用システムログ (RHEL)
/var/log/syslog汎用システムログ (Ubuntu)
/var/log/auth.log認証ログ (Ubuntu)
/var/log/secure認証ログ (RHEL)
/var/log/kern.logカーネルログ
/var/log/dmesgブート時のカーネルメッセージ

ドキュメント情報:

  • 作成日: 2024年1月
  • 対象: Linux トラブルシューティング方法論とツール
  • バージョン: 1.0
  • 著者: AI Generated Technical Documentation