😎

Linuxコマンドとトラブルシューティングの基礎知識

に公開

インターンのケース面接で、どう答えていいかわからなかったので、まとめておきます。
この記事では、Linux環境で作業をする上で不可欠な基本的なコマンドとシステムやネットワークのトラブルシューティング時に役立つコマンドをまとめておきます。

1.Linuxの基本的なコマンド

日常的に使用する基本的なコマンドをカテゴリ別にまとめておきます。

1.1.ファイルとディレクトリの操作

コマンド 説明 主なオプション/使用例
pwd 現在のディレクトリのパスを表示 pwd
cd ディレクトリを移動 cd /home/user/documents(絶対パス)
cd ..(親ディレクトリ)
cd ~(ホームディレクトリ)
cd -(前回のディレクトリ)
ls ディレクトリの内容を表示 ls -l(詳細情報)
ls -a(隠しファイルも表示)
ls -h(ファイルサイズを人間が読める形式で表示)
mkdir 新しいディレクトリを作成 mkdir new_dir(単一ディレクトリ)
mkdir -p dir1/dir2(ネストしたディレクトリ)
rmdir 空のディレクトリを削除 rmdir dir(空のディレクトリ)
rm ファイルを削除 rm file.txt(ファイル)
rm -r dir(ディレクトリ)
rm -f(強制的に削除)
cp ファイルをコピー cp file.txt new_dir/(ディレクトリにコピー)
cp -r dir1 dir2(ディレクトリをコピー)
mv ファイルやディレクトリを移動または名前を変更 mv file.txt new_dir/(ディレクトリに移動)
mv file.txt new_name.txt(名前を変更)
touch ファイルのタイムスタンプを更新 touch file.txt(ファイルのタイムスタンプを更新)

1.2.ファイルの内容表示と編集

コマンド 説明 主なオプション/使用例
cat ファイルの内容を表示 cat file.txt(ファイルの内容を表示)
more ファイルの内容を一ページずつ表示 more file.txt(ファイルの内容を一ページずつ表示)
less ファイルの内容を一ページずつ表示 less file.txt(ファイルの内容を一ページずつ表示)
head ファイルの先頭部分を表示 head -n 10 file.txt(ファイルの先頭10行を表示)
tail ファイルの末尾部分を表示 tail -n 10 file.txt(ファイルの末尾10行を表示)
grep ファイル内のテキストを検索 grep "keyword" file.txt(ファイル内の"keyword"を検索)
grep -r "keyword" dir/(ディレクトリ内の"keyword"を検索)
grep -i "keyword" file.txt(大文字小文字を無視して検索)
sort ファイル内のテキストを並べ替え sort file.txt(ファイル内のテキストを並べ替え)
sort -r file.txt(ファイル内のテキストを逆順に並べ替え)
uniq ファイル内の重複行を削除 uniq file.txt(ファイル内の重複行を削除)
uniq -c file.txt(ファイル内の重複行をカウント)
wc ファイルの行数、単語数、文字数をカウント wc file.txt(ファイルの行数、単語数、文字数をカウント)
wc -l file.txt(ファイルの行数をカウント)
wc -w file.txt(ファイルの単語数をカウント)
wc -c file.txt(ファイルの文字数をカウント)
cut ファイル内のテキストを分割 cut -d ',' -f 1 file.txt(ファイル内の","で区切った1列目を表示)
cut -d ',' -f 1,2 file.txt(ファイル内の","で区切った1列目と2列目を表示)

1.3.権限管理と所有者

コマンド 説明 主なオプション/使用例
chmod ファイルやディレクトリの権限を変更 chmod 755 file.txt(ファイルの権限を755に変更)
chmod -R 755 dir/(ディレクトリとその中身の権限を755に変更)
chown ファイルやディレクトリの所有者を変更 chown user:group file.txt(ファイルの所有者をuser:groupに変更)
chown -R user:group dir/(ディレクトリとその中身の所有者をuser:groupに変更)
chgrp ファイルやディレクトリのグループを変更 chgrp group file.txt(ファイルのグループをgroupに変更)
chgrp -R group dir/(ディレクトリとその中身のグループをgroupに変更)
whoami 現在のユーザー名を表示 whoami(現在のユーザー名を表示)
id 現在のユーザーのIDを表示 id(現在のユーザーのIDを表示)
groups 現在のユーザーのグループを表示 groups(現在のユーザーのグループを表示)
su 別のユーザーに切り替え su user(userユーザーに切り替え)
su - user(userユーザーに切り替え)

1.4.プロセス管理

コマンド 説明 主なオプション/使用例
ps プロセスの一覧を表示 ps aux(すべてのプロセスを表示)
ps -ef(すべてのプロセスを詳細に表示)
top プロセスの一覧を表示 top(プロセスの一覧を表示)
kill プロセスを終了 kill pid(pidで指定したプロセスを終了)
kill -9 pid(pidで指定したプロセスを強制的に終了)
htop プロセスの一覧を表示 htop(プロセスの一覧を表示)

1.5.システム情報とユーティリティ

コマンド 説明 主なオプション/使用例
df ディスクの使用状況を表示 df -h(ディスクの使用状況を表示)
du ディレクトリの使用状況を表示 du -h(ディレクトリの使用状況を表示)
free メモリの使用状況を表示 free -h(メモリの使用状況を表示)
uname システムの情報を表示 uname -a(システムの情報を表示)
hostname ホスト名を表示 hostname(ホスト名を表示)
history コマンドの履歴を表示 history(コマンドの履歴を表示)
echo 文字列を表示 echo "Hello, World!"(Hello, World!を表示)

1.6.パイプとリダイレクト

コマンド 説明 主なオプション/使用例
| コマンドの出力を次のコマンドに渡す ls -l | grep "file.txt"(ls -lの出力をgrep "file.txt"に渡す)
> コマンドの出力をファイルに保存 ls -l > file.txt(ls -lの出力をfile.txtに保存)
>> コマンドの出力をファイルに追加 ls -l >> file.txt(ls -lの出力をfile.txtに追加)
< コマンドの入力をファイルから取得 wc -l < file.txt(file.txtの行数をカウント)
<< コマンドの入力をファイルから取得 wc -l << EOF(EOFまでの入力をカウント)
&> コマンドの出力とエラーをファイルに保存 ls -l &> file.txt(ls -lの出力とエラーをfile.txtに保存)
&>> コマンドの出力とエラーをファイルに追加 ls -l &>> file.txt(ls -lの出力とエラーをfile.txtに追加)
2>&1 エラー出力を標準出力にリダイレクト ls -l 2>&1(ls -lのエラー出力を標準出力にリダイレクト)

2.Linuxのトラブルシューティング

2.1.トラブルシューティングの一般的な思考プロセス

このような思考は経験で培うものだと思いますが、まとめてあった方が良いと考えました。
問題対処は、以下のような順番で行うことが多いです。

2.1.1.問題の明確化

  • 何が起きているか。
  • いつから起きているか。
  • どこで起きているのか。
  • 誰に影響が出ているのか。
  • どうすれば再現可能か。
  • 以前は正常の動作していたのか。変更があったのか。
  • エラーメッセージは何か

2.1.2.影響範囲の特定

  • 単一ユーザか、複数ユーザか。
  • 特定のアプリケーションか、すべてのアプリケーションか。
  • 特定のサーバか、すべてのサーバか。
  • ローカルの問題か、リモートの問題か。
  • ネットワークの問題か、サーバの問題か。
  • ハードウェアの問題か、ソフトウェアの問題か。

2.1.3.OSI参照モデルを下位層から順番に確認

  • 物理層
    • LANケーブルは刺さっているか。LEDは点灯しているか。
  • データリンク層
    • NICは認識されているか。(ip a,dmesg)
    • MACアドレスは正しいか。(ip neigh)
  • ネットワーク層
    • IPアドレスは正しいか。ルーティングは正しいか。(ip a, ip route, traceroute)
  • トランスポート層
    • ポートは開いているか。サービスはリッスンしてるか。(telnet,nc,ss,netstat)
    • ファイアウォールは通過できているのか(iptables -L)
  • アプリケーション層
    • アプリケーションは起動しているか。
    • ログにエラーが出ていないか。(systemctl status <サービス名>, journalctl -u <サービス名>)

2.1.4.変更とテスト

  • 一度に一つの変更を行う。
  • 変更を行うたびにテストを行う。
  • 問題が解決しない場合は、変更を元に戻す。

2.1.5.ログの確認

  • システムログ(/var/log/syslog,/var/log/messages,journalctl)
  • カーネルログ(dmesg)
  • アプリケーションログ
  • セキュリティログ(/var/log/auth.log,/var/log/secure)
  • ネットワークログ(tcpdumpで取得したパケット)

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

以下ではネットワーク関連で頻出のコマンドを レイヤ別目的別 に整理し、実際の切り分けフローと合わせて紹介します。

2.2.1. ネットワーク状態の可視化

コマンド 主な目的 使用例
ip a / ip addr IP アドレスとサブネット確認 ip -br a (ブリーフ表示)
ip link インターフェース状態 (UP/DOWN)・MTU ip link set eth0 up
ip route ルーティングテーブル確認 ip route get 8.8.8.8
hostname -I ローカルに割当てられた IP 一覧
cat /etc/resolv.conf DNS リゾルバ設定確認
ethtool eth0 物理リンク速度・デュプレックス・エラー ethtool -S eth0 (統計)

2.2.2. 疎通テスト & 経路診断

コマンド 主な目的 使用例
ping ICMP Echo による到達確認 ping -c 4 8.8.8.8
traceroute 経路上の各ホップを可視化 traceroute github.com
mtr ping + traceroute をリアルタイムで統計 mtr -rwc 10 example.com

2.2.3. パケットキャプチャ & 解析

コマンド 主な目的 使用例
tcpdump パケットキャプチャ (CLI) sudo tcpdump -i eth0 port 80 -w web.pcap
wireshark GUI で詳細解析 (.pcap を開く)

🔍 Tip tcpdump でキャプチャした .pcap は Wireshark にドラッグ&ドロップして GUI 解析すると効率的です。


2.2.4. ポート & サービスの確認

コマンド 主な目的
ss -tunlp リッスン中の TCP/UDP ポートとプロセス
lsof -i :80 特定ポートを使用するプロセス特定
nc -zv host 22 ポート開放テスト (TCP)
netstat -tulnp (旧) ポート・ルート・統計

2.2.5. DNS 解決の検証

コマンド 主な目的
dig +short example.com A レコード確認
dig @8.8.8.8 example.com MX 特定 DNS へ MX 問い合わせ
nslookup example.com (legacy) 名前解決
host 8.8.8.8 逆引き確認

2.2.6. ルーティング & ARP/NDP

コマンド 主な目的
ip route show table all すべてのルーティングテーブル表示
ip neigh ARP/NDP キャッシュ確認
arp -a (legacy) ARP テーブル表示

2.2.7. ファイアウォールとパケットフィルタ

コマンド 主な目的
sudo iptables -L -n -v Netfilter ルール確認
sudo firewall-cmd --list-all firewalld ルール確認
sudo ufw status verbose UFW 状態確認

2.2.8. ネットワーク関連ログのウォッチ

コマンド 主な目的
journalctl -u NetworkManager -f NetworkManager のリアルタイムログ
tail -f /var/log/syslog Debian 系汎用ログ
tail -f /var/log/messages RHEL 系汎用ログ
dmesg -T grep -i eth

2.2.9. パフォーマンスと統計系ユーティリティ

コマンド 主な目的
ifstat -t インターフェースごとの転送速度
sar -n DEV 1 5 NIC 単位の送受信統計
ethtool -S eth0 ハードウェアエラーカウンタ

2.2.10. クイックチェックリスト

  1. リンク: ip link, ethtool で物理層 OK?
  2. IP / ルーティング: ip a, ip route 正しい?
  3. 疎通: ping, traceroute でどこまで届く?
  4. DNS: dig, nslookup 名称解決は?
  5. ポート: ss, lsof, nc で LISTEN / 通過確認。
  6. FW: iptables -L, firewall-cmd でブロック無し?
  7. パケット: tcpdump で実際に流れているか確認。
  8. ログ: journalctl, dmesg でエラーを洗う。
GitHubで編集を提案

Discussion