第4章:よくあるエラーと対処法

4.0 この章で学ぶこと

  • よくあるエラーの原因の見当を付けられる
  • エラーメッセージから次に取るべき行動を判断できる
  • トラブルシューティング用コマンドで状況を確認できる
切り分けの基本:実務では「直前の変更」「再現性」「影響範囲」「ログ(いつ / どこで / 誰が)」「現在の状態(CPU / メモリ / ディスク / ネットワーク)」を整理すると、対応が速くなります。

4.1 初心者が遭遇しやすいエラー TOP 8

Linux エラーメッセージ診断チャート 1. Permission denied 権限がありません 確認: id / ls -l / namei -l 必要な権限と正規手順を確認 2. Command not found コマンドが見つかりません 解決: apt / yum / dnf でインストール または PATH を確認 3. No such file or directory ファイルが存在しません 解決: パスを確認 pwd と ls で現在地確認 4. Is a directory ディレクトリです(ファイルではない) 解決: cd でディレクトリに移動 または正しいファイル名を指定 5. Device or resource busy 使用中のため操作できません 解決: lsof でプロセス確認 必要なら kill で終了 6. No space left on device ディスク容量不足 解決: df -h で容量確認 不要ファイルを削除 7. Connection refused 接続が拒否されました 解決: サービスが起動しているか確認 systemctl status でチェック 8. Syntax error 構文エラー 解決: スペルミスや記号を確認 特にスペースや引用符に注意

4.2 エラー別対処法詳細

Permission denied

bash: /etc/hosts: Permission denied

原因:

対象ファイルだけでなく、親ディレクトリの探索権限、所有者、読み取り専用マウント、セキュリティポリシー等が原因になる場合があります。

確認と対処:

$ id # 自分のユーザーと所属グループを確認
$ ls -l /etc/hosts # 対象の所有者と権限を確認
$ namei -l /etc/hosts # 親ディレクトリを含めて確認
$ chmod u+rw file.txt # 自分が所有する練習用ファイルで、必要な権限だけを追加
$ sudoedit /etc/hosts # 管理対象ファイルは許可された手順で編集

注意:原因を確認せずに sudo を付けたり、chmod 777 や chown -R を実行したりしないでください。共有環境や管理対象ファイルでは、管理者と運用手順を確認します。

Command not found

git: command not found

原因:

コマンドがインストールされていない、または PATH が通っていない

解決方法:

$ sudo apt install git # Ubuntu/Debian
$ sudo yum install git # CentOS/RHEL
$ sudo dnf install git # Fedora/RHEL8+
$ which git # インストール確認
$ echo $PATH # PATH 確認
$ export PATH="$PATH:<directory-path>" # 例: <directory-path> を /opt/bin へ置換

No such file or directory

cat: test.txt: No such file or directory

原因:

指定したファイルやディレクトリが存在しない

解決方法:

$ pwd # 現在のディレクトリを確認
$ ls # ファイル一覧を確認
$ ls -la # 隠しファイルも含めて確認
$ find . -name "test.txt" # ファイルを検索

Is a directory

cat: mydir: Is a directory

原因:

ディレクトリをファイルとして扱おうとした(例: cat や cp の引数にディレクトリを指定)

解決方法:

$ ls -la mydir # 種類(ファイル/ディレクトリ)を確認
$ cd mydir # ディレクトリなら移動して中身を見る
$ ls -la # 中のファイルを確認して正しいファイル名を指定

No space left on device

cp: error writing './large.file': No space left on device

原因:

ディスクの空き容量が不足

解決方法:

$ df -h # ディスク使用状況確認
$ du -sh * # 各ディレクトリのサイズ確認
$ sudo apt autoremove # 不要パッケージ削除
$ sudo apt clean # キャッシュクリア
$ find /tmp -type f -mtime +7 -print # 例: 7日より古いファイルをまず確認
$ find /tmp -type f -mtime +7 -delete # 確認後に削除(慎重に)

Device or resource busy

umount: /mnt: target is busy

原因:

ファイルやディレクトリが使用中

解決方法:

$ lsof /mnt # 使用中のプロセスを確認
$ fuser -v /mnt # 使用中のプロセスを表示
$ cd / # ディレクトリから移動
$ sudo umount /mnt # 通常のアンマウント
$ sudo umount -l /mnt # 最終手段(遅延アンマウント)

Connection refused

curl: (7) Failed to connect to localhost port 80: Connection refused

原因:

サービスが起動していない、またはポートが閉じている

解決方法:

$ sudo systemctl status apache2 # Debian/Ubuntu
$ sudo systemctl status httpd # RHEL 系
$ sudo systemctl start apache2 # Debian/Ubuntu
$ sudo systemctl start httpd # RHEL 系
$ sudo ss -tlnp # ポート確認
$ sudo ufw status # Debian/Ubuntu(UFW)
$ sudo firewall-cmd --state # RHEL 系(firewalld)
$ sudo ufw allow 80/tcp # Debian/Ubuntu
$ sudo firewall-cmd --permanent --add-service=http && sudo firewall-cmd --reload # RHEL 系

Syntax error

bash: syntax error near unexpected token `then'

原因:

スペルミス、引用符(' / ")の閉じ忘れ、if / fi の対応漏れなど

解決方法:

$ bash -n script.sh # 実行せず構文だけチェック
$ nl -ba script.sh | sed -n '1,120p' # 行番号付きで該当箇所を確認

4.3 エラーメッセージの読み方

エラーメッセージの構造

bash: /usr/bin/foo: No such file or directory

この例を分解すると:

  • bash: エラーを出したプログラム
  • /usr/bin/foo: 問題のあるファイルやコマンド
  • No such file or directory: エラーの内容

デバッグのコツ

  1. エラーメッセージを最後まで読む - 重要な情報は最後にあることが多い
  2. ファイル名やパスを確認 - タイポが原因の場合が多い
  3. 権限を確認 - ls -l で確認
  4. 対象のログを見る - systemd環境では対象unitのjournal、その他はlogging設定で確認したfileを調べる
  5. エラーメッセージで検索 - Web 検索や公式ドキュメントで情報を確認する

4.4 トラブルシューティングコマンド

システム情報確認

$ uname -a # システム情報
$ cat /etc/os-release # OS 情報
$ free -h # メモリ使用状況
$ df -h # ディスク使用状況
$ top # プロセス監視

ログ確認(systemd環境)

$ systemctl status <unit-name> --no-pager # unit名・状態・直近の記録
$ journalctl -u <unit-name> -b -n 100 --no-pager # 現在bootの対象unit
$ journalctl -u <unit-name> --since "<start-time>" --until "<end-time>" --no-pager # 時刻範囲
$ journalctl -p err -b -n 100 --no-pager # 現在bootのerror以上
$ journalctl -f -u <unit-name> # 対象unitの新着を追跡
$ dmesg # カーネルメッセージ
$ last # ログイン履歴

ネットワーク診断

$ ping -c 4 1.1.1.1 # 接続確認(環境により ICMP が遮断されることがある)
$ ip addr # IP アドレス確認
$ ss -tlnp # ソケット / ポート確認
$ netstat -tlnp # ポート確認(net-tools)
$ traceroute 1.1.1.1 # 経路確認(環境により UDP / ICMP が遮断されることがある)
ログが見つからないときの確認順:
  1. 対象:systemctl status <unit-name>でunit名を確定し、-uと-bで現在bootの対象serviceへ絞ります。
  2. 時刻・priority:障害時刻を--since/--untilで指定します。-p errはerrorとそれより重大なpriorityだけを表示するため、情報が足りなければpriority filterを外します。
  3. 権限:permission errorまたはsystemの記録が見えない場合は、所属groupと運用ルールを確認し、許可されている場合だけ同じ照会をsudoで再実行します。
  4. 保存期間:journalctl --list-bootsで参照可能なbootを確認します。journalはvolatileな/run/log/journalまたはpersistentな/var/log/journal等へ保存され、設定・保持期間・disk状況により過去bootが残らない場合があります。
  5. file出力:/var/log/syslogや/var/log/messagesは、rsyslog等のlogging daemonと設定がfileへ書く場合の例です。systemctl status rsyslog --no-pagerと/etc/rsyslog.conf、/etc/rsyslog.d/を確認し、設定で確定したfileだけをtailします。

journalctl -xeの-eは末尾へ移動し、-xは利用可能なcatalog説明を追加しますが、unit・boot・時刻を自動では絞りません。本書では万能な初手にせず、上の目的別filterを先に使います。根拠と確認日は付録のLogging Source Notesを参照してください。

4.5 よくある質問と回答

Q: sudo で求められるパスワードを忘れました

A: 多くの環境では、sudo で求められるのは自分のログインパスワードであり、専用の「sudo パスワード」ではありません。思い出せない場合は、許可された手順でリカバリーモード等から再設定するか、管理者に依頼します。

# passwd <user-name> # リカバリーモードのrootシェルまたは管理者が実行

Q: ファイルを誤って削除しました

A: Linux では通常、削除したファイルの復元は困難です。まずはバックアップ / スナップショットの有無を確認し、再発防止として定期的なバックアップを運用します。

Q: システムが重い/遅い

A: top コマンドで CPU / メモリ使用率の高いプロセスを確認します。

$ top # qで終了

Q: パッケージ管理で依存関係やトランザクションのエラーが出ました

A: ディストリビューションと症状を特定し、パッケージを変更しない確認から始めます。Ubuntu/Debianではapt --fix-broken installの実行内容を確認します。RHEL 8/9・Fedora等のDNF系では、次の順で切り分けます。

$ sudo apt --fix-broken install --simulate # Ubuntu/Debian: 変更候補だけを確認
$ cat /etc/os-release # distributionとversion
$ dnf --version # DNF世代
$ dnf check # インストール済みパッケージDBを検査(パッケージ変更なし)
$ dnf history list # トランザクションの成功・中止を確認(パッケージ変更なし)
$ dnf history info <transaction-id> # 対象の詳細(パッケージ変更なし)
  • インストール済みRPMの不整合:dnf checkの対象パッケージと問題種別を記録し、ベンダー手順または管理者判断へ渡します。
  • 中断したトランザクション:dnf history listでIDと結果を確認します。history undoやrollbackはパッケージの削除・downgradeを伴い、旧バージョンがなければ失敗するため、一般的な修復として実行しません。
  • リポジトリメタデータ:リポジトリ設定・subscription・networkを確認後、sudo dnf clean metadataとsudo dnf makecacheでメタデータcacheだけを再作成します。インストール済みパッケージは変更しません。
  • リポジトリとのバージョン差:sudo dnf --assumeno distro-syncで候補を事前確認します。パッケージ指定がなければ全インストール済みパッケージが対象で、実行時はupgradeまたはdowngradeが起こり得ます。期待するリポジトリ・パッケージ・保守時間・バックアップを確認できるまで承認しません。

旧YUMのyum-complete-transactionは、電源断やクラッシュで中断した旧YUMトランザクションを再開する専用ツールです。依存関係エラー一般の解決策でも、RHEL 8/9のDNF基本導線でもありません。根拠と確認日は付録のDNF/YUM Source Notesを参照してください。

4.6 まとめ

  • まずはエラーメッセージを読み、「存在しない」「権限不足」「場所が違う」などを切り分ける
  • 必要に応じて top / df / journalctl などで状況を確認する
  • 再発防止には、手順の記録とバックアップが有効
次章予告:次章では、これまでのコマンドを組み合わせて簡単なシェルスクリプトを作成し、定期実行まで扱います。