こんにちは、フルスタックエンジニアのryuです。
Linuxでファイルを削除したら、Permission deniedと表示された。
rm -fやsudoを付けるべきか迷いますよね?
やみくもに権限を広げてはいけません。
Linuxでは、親ディレクトリの権限が削除に関係します。
この記事では、Permission deniedの原因と、安全な切り分け手順を解説します。
Permission deniedとは?¶
Permission deniedは、現在のユーザーに操作権限がないことを表します。
ファイルを削除する場合は、次のように表示されます。
rm sample.txt
rm: cannot remove 'sample.txt': Permission denied
ファイル削除は名前をディレクトリから外す操作¶
Linuxのファイル削除は、親ディレクトリから名前を取り除く操作です。
削除には、親ディレクトリのwとxが必要です。
例えば/var/www/app/sample.txtを削除する場合は、親の/var/www/appに対する権限が重要です。
ファイル自身が読み取り専用でも削除できる場合がある¶
次のファイルには、所有者の書き込み権限がありません。
-r--r--r-- 1 user1 user1 100 Jul 15 10:00 sample.txt
親ディレクトリに権限があれば削除できます。
反対に、親ディレクトリへ書き込めなければ削除できません。
最初に確認すること¶
Permission deniedが出たら、すぐにchmod 777やsudo rm -rfを実行しないようにしましょう。
現在地、実行ユーザー、親ディレクトリの順に確認します。
削除対象と現在地を確認する¶
最初に、どの場所で何を削除しようとしているのか確認します。
pwd
ls -la
絶対パスでも削除対象を表示します。
ls -ld /path/to/directory
ls -l /path/to/directory/sample.txt
現在のユーザーと所属グループを確認する¶
現在のユーザーは、idで確認できます。
id
実行結果の例です。
uid=1001(user1) gid=1001(user1) groups=1001(user1),1002(developers)
対象の所有グループに所属しているか確認します。
親ディレクトリの権限を確認する¶
ls -ldで、親ディレクトリ自身の権限を表示します。
ls -ld /var/www/app
drwxr-xr-x 2 root root 4096 Jul 15 10:00 /var/www/app
この例では、書き込み権限があるのはrootだけで、一般ユーザーは削除できません。
パスの途中に権限不足がないか確認する¶
パスの途中にある各ディレクトリへもアクセスできる必要があります。
途中のどこかにx権限がなければ、対象へ到達できません。
nameiコマンドで階層を確認する¶
namei -lを使うと、パスを階層ごとに確認できます。
namei -l /var/www/app/sample.txt
f: /var/www/app/sample.txt
drwxr-xr-x root root /
drwxr-xr-x root root var
drwxr-x--- root web www
drwxrwx--- user web app
-rw-r----- user web sample.txt
各階層を通過できるか確認します。
ACLが設定されていないか確認する¶
rwx表示だけでは、ACLによる追加設定が分からない場合があります。
ファイル名の権限表示に+が付いていたら、ACLを確認しましょう。
drwxrwx---+ 2 user1 developers 4096 Jul 15 10:00 app
確認にはgetfaclを使います。
getfacl /var/www/app
ACLで現在のユーザーに権限が与えられているか、マスクによって権限が制限されていないかを確認します。
権限不足を修正する方法¶
原因が権限や所有者なら、必要な範囲だけ修正します。
全ユーザーへ権限を与える必要はありません。
所有者が間違っている場合¶
本来、そのディレクトリを管理するユーザーが所有者になるべき場合は、chownで変更します。
sudo chown user1:developers /var/www/app
ディレクトリ以下も変更する場合は-Rを付けますが、対象範囲に注意してください。
sudo chown -R user1:developers /var/www/app
実行前に、現在地と対象パスを確認しましょう。
pwd
ls -ld /var/www/app
【関連記事】Linuxのchownコマンドの使い方
グループへ書き込み権限を追加する場合¶
複数ユーザーで管理するディレクトリなら、所有グループとグループ権限を調整します。
sudo chown :developers /var/www/app
sudo chmod g+rwx /var/www/app
変更後はdevelopersグループへの所属を確認します。
id user1
chmod 777を避ける¶
chmod 777は、すべてのユーザーへ全権限を許可します。
本来変更できないユーザーまで削除できる状態になります。
chmod 777 /var/www/app
所有者やグループを確認し、必要な権限だけを追加しましょう。
【関連記事】Linuxのファイル権限とchmodの使い方
rm -fでは権限エラーを解決できない¶
元記事のrm -rfでは、アクセス権限を突破できません。
-fは、存在しないファイルのエラーを無視し、確認を表示しないためのオプションです。
-rと-fの違い¶
-rは、ディレクトリの中を再帰的に削除します。
rm -r directory/
-fは、削除確認を行わず、存在しないファイルをエラーにしません。
rm -f sample.txt
親ディレクトリに権限がなければ、rm -fでも解消しません。
rm -rfを安易に実行しない¶
rm -rfは、指定したディレクトリ以下を確認なしで削除します。
パスを間違えると、必要なファイルまで削除されます。
削除前に、対象を一覧表示してください。
pwd
ls -la /path/to/directory
対話形式で確認しながら削除する場合は、-iを使えます。
rm -ri /path/to/directory
【関連記事】Linuxのrmコマンドの使い方
sudoを使って削除する前の注意点¶
管理者所有のファイルでは、sudoが必要な場合があります。
ただし、Permission deniedが出たからという理由だけでsudoを付けるのは危険です。
本当に削除してよいファイルか確認する¶
最初に、所有者と用途を確認します。
ls -ld /path/to/directory
ls -l /path/to/directory
設定、データベース、ログなどではないか確認します。
必要性を確認したうえで削除します。
sudo rm /path/to/file
サービスが管理するファイルは停止手順を確認する¶
サービスが利用するファイルを削除すると、正常に動かなくなる可能性があります。
サービス側の削除手順も確認しましょう。
エンジニアとして10年以上サーバーを扱っていますが、sudoの前に削除できない設計理由を確認します。
権限以外で削除できない原因¶
権限表示が正しくても、Operation not permittedやRead-only file systemで削除できない場合があります。
ここでは、代表的な原因を確認します。
スティッキービットが設定されている¶
/tmpのような共有ディレクトリには、スティッキービットが設定されています。
ls -ld /tmp
drwxrwxrwt 10 root root 4096 Jul 15 10:00 /tmp
末尾のtがスティッキービットです。
共有ディレクトリでも、通常はファイル所有者などだけが削除できます。
他人のファイルでは、Operation not permittedになることがあります。
immutable属性が設定されている¶
ファイルにimmutable属性が設定されていると、rootでもそのままでは削除できません。
確認にはlsattrを使います。
lsattr important.conf
----i-------------- important.conf
iがimmutable属性です。
解除してよいか確認してから変更します。
sudo chattr -i important.conf
その後、必要な操作を行います。
ファイルシステムが読み取り専用になっている¶
次のエラーでは、ファイルシステムが読み取り専用になっています。
rm: cannot remove 'sample.txt': Read-only file system
対象が置かれているマウントポイントを確認します。
findmnt -T sample.txt
OPTIONSにroがあれば読み取り専用です。
障害で読み取り専用になった可能性もあるため、原因を確認せず再マウントしないようにします。
使用中のファイルは削除できる?¶
Linuxでは、使用中のファイルでも多くの場合は削除できます。
そのプロセスがファイルを閉じるまで、使用していたディスク領域は解放されません。
使用中であることはPermission deniedの一般的な原因ではない¶
Windowsなどの動作とは異なり、Linuxでは使用中という理由だけでrmが拒否されるとは限りません。
使用中なら削除できない、という元記事の説明は修正しました。
削除したのにディスク容量が戻らない場合は、削除済みファイルを開いているプロセスを確認します。
sudo lsof +L1
プロセスをむやみに終了せず、サービスへの影響を確認してください。
Permission deniedの確認手順まとめ¶
ファイルやディレクトリを削除できない場合は、次の順番で確認します。
pwdとlsで削除対象を確認するidで現在のユーザーとグループを確認するls -ldで親ディレクトリの権限を確認するnamei -lで途中のディレクトリを確認する- 必要に応じてACL、スティッキービット、属性を確認する
findmnt -Tで読み取り専用ではないか確認する- 必要最小限の権限や所有者だけを変更する
削除できないからといって、rm -rf、chmod 777、sudoを順番に試すのは危険です。
どの権限や設定が削除を止めているのか確認してから、必要な部分だけを修正しましょう。
Linuxの権限を実際に学びたい方へ¶
InfraAcademyでは、ブラウザ上のLinux環境でファイルを作成し、所有者や権限を変更しながら学習できます。
基本的なファイル操作から学びたい方は、Linux入門講座を確認してみてください。
権限、ユーザー、グループ管理まで学びたい方は、Linux中級講座がおすすめです。