第4章:よくあるエラーと対処法
4.0 この章で学ぶこと
- よくあるエラーの原因の見当を付けられる
- エラーメッセージから次に取るべき行動を判断できる
- トラブルシューティング用コマンドで状況を確認できる
4.1 初心者が遭遇しやすいエラー TOP 8
4.2 エラー別対処法詳細
Permission denied
原因:
対象ファイルだけでなく、親ディレクトリの探索権限、所有者、読み取り専用マウント、セキュリティポリシー等が原因になる場合があります。
確認と対処:
$ ls -l /etc/hosts # 対象の所有者と権限を確認
$ namei -l /etc/hosts # 親ディレクトリを含めて確認
$ chmod u+rw file.txt # 自分が所有する練習用ファイルで、必要な権限だけを追加
$ sudoedit /etc/hosts # 管理対象ファイルは許可された手順で編集
注意:原因を確認せずに sudo を付けたり、chmod 777 や chown -R を実行したりしないでください。共有環境や管理対象ファイルでは、管理者と運用手順を確認します。
Command not found
原因:
コマンドがインストールされていない、または PATH が通っていない
解決方法:
$ 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
原因:
指定したファイルやディレクトリが存在しない
解決方法:
$ ls # ファイル一覧を確認
$ ls -la # 隠しファイルも含めて確認
$ find . -name "test.txt" # ファイルを検索
Is a directory
原因:
ディレクトリをファイルとして扱おうとした(例: cat や cp の引数にディレクトリを指定)
解決方法:
$ cd mydir # ディレクトリなら移動して中身を見る
$ ls -la # 中のファイルを確認して正しいファイル名を指定
No space left on device
原因:
ディスクの空き容量が不足
解決方法:
$ 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
原因:
ファイルやディレクトリが使用中
解決方法:
$ fuser -v /mnt # 使用中のプロセスを表示
$ cd / # ディレクトリから移動
$ sudo umount /mnt # 通常のアンマウント
$ sudo umount -l /mnt # 最終手段(遅延アンマウント)
Connection refused
原因:
サービスが起動していない、またはポートが閉じている
解決方法:
$ 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
原因:
スペルミス、引用符(' / ")の閉じ忘れ、if / fi の対応漏れなど
解決方法:
$ nl -ba script.sh | sed -n '1,120p' # 行番号付きで該当箇所を確認
4.3 エラーメッセージの読み方
エラーメッセージの構造
この例を分解すると:
- bash: エラーを出したプログラム
- /usr/bin/foo: 問題のあるファイルやコマンド
- No such file or directory: エラーの内容
デバッグのコツ
- エラーメッセージを最後まで読む - 重要な情報は最後にあることが多い
- ファイル名やパスを確認 - タイポが原因の場合が多い
- 権限を確認 -
ls -lで確認 - 対象のログを見る - systemd環境では対象unitのjournal、その他はlogging設定で確認したfileを調べる
- エラーメッセージで検索 - Web 検索や公式ドキュメントで情報を確認する
4.4 トラブルシューティングコマンド
システム情報確認
$ cat /etc/os-release # OS 情報
$ free -h # メモリ使用状況
$ df -h # ディスク使用状況
$ top # プロセス監視
ログ確認(systemd環境)
$ 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 # ログイン履歴
ネットワーク診断
$ ip addr # IP アドレス確認
$ ss -tlnp # ソケット / ポート確認
$ netstat -tlnp # ポート確認(net-tools)
$ traceroute 1.1.1.1 # 経路確認(環境により UDP / ICMP が遮断されることがある)
- 対象:
systemctl status <unit-name>でunit名を確定し、-uと-bで現在bootの対象serviceへ絞ります。 - 時刻・priority:障害時刻を
--since/--untilで指定します。-p errはerrorとそれより重大なpriorityだけを表示するため、情報が足りなければpriority filterを外します。 - 権限:permission errorまたはsystemの記録が見えない場合は、所属groupと運用ルールを確認し、許可されている場合だけ同じ照会を
sudoで再実行します。 - 保存期間:
journalctl --list-bootsで参照可能なbootを確認します。journalはvolatileな/run/log/journalまたはpersistentな/var/log/journal等へ保存され、設定・保持期間・disk状況により過去bootが残らない場合があります。 - 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 パスワード」ではありません。思い出せない場合は、許可された手順でリカバリーモード等から再設定するか、管理者に依頼します。
Q: ファイルを誤って削除しました
A: Linux では通常、削除したファイルの復元は困難です。まずはバックアップ / スナップショットの有無を確認し、再発防止として定期的なバックアップを運用します。
Q: システムが重い/遅い
A: top コマンドで CPU / メモリ使用率の高いプロセスを確認します。
Q: パッケージ管理で依存関係やトランザクションのエラーが出ました
A: ディストリビューションと症状を特定し、パッケージを変更しない確認から始めます。Ubuntu/Debianではapt --fix-broken installの実行内容を確認します。RHEL 8/9・Fedora等のDNF系では、次の順で切り分けます。
$ 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などで状況を確認する - 再発防止には、手順の記録とバックアップが有効