【解決】 chmod: changing permissions of ‘file’: Operation not permitted の解決方法と原因 | Linux トラブルシューティング

「chmod: changing permissions of ‘file’: Operation not permitted」というエラーメッセージに遭遇し、お困りでしょうか?
ご安心ください。このエラーは、Linuxファイルシステム上でファイルのアクセス権限(パーミッション)を変更しようとした際に、権限不足などの理由で操作が許可されなかったことを示す一般的な問題です。
特にWindowsユーザーの皆様が、WSL(Windows Subsystem for Linux)やSSH接続を通じてLinux環境を操作している際に、このエラーに遭遇することがよくあります。
この記事では、このエラーの原因をわかりやすく解説し、Windows環境からすぐに実行できる最も速い解決策から、恒久的な再発防止策までをロジカルに説明します。これを読めば、あなたの問題はきっと解決するでしょう。

1. chmod: changing permissions of ‘file’: Operation not permitted とは?(概要と緊急度)

このエラーメッセージは、あなたがLinux/Unix系のシステム上で、chmodコマンドを使ってファイルやディレクトリのアクセス権限を変更しようとしたときに、その操作が許可されなかったことを意味します。これは、ファイルシステムが持つセキュリティ機構があなたの操作をブロックしている状態です。
Windowsユーザーの皆様がこのエラーを目にする可能性のある代表的なシナリオは以下の通りです。

  • WSL(Windows Subsystem for Linux)内で、Linuxコマンドとしてchmodを実行している。
  • PowerShellなどのSSHクライアントからリモートのLinuxサーバーに接続し、そこでchmodコマンドを実行している。

具体的な発生原因としては、以下のようなケースが考えられます。

  • 所有者ではない: 変更しようとしているファイルの所有者があなたではない。
  • 読み取り専用: ファイルが読み取り専用として設定されている、またはファイルシステム自体が読み取り専用モードでマウントされている。
  • 管理者権限の不足: 必要な変更を行うための管理者(ルート)権限を持っていない。
  • 特殊な属性: ファイルに不変属性(immutable attribute)などが設定されている。
  • WSL環境でのWindowsファイル: WSLからWindows側のファイルシステム(例: /mnt/c/Users/...)のパーミッションを変更しようとしたが、WindowsのNTFSパーミッションが優先されているため変更できない。

緊急度: 中〜高
このエラーが発生すると、目的のファイル操作(スクリプトの実行、設定ファイルの書き換えなど)が妨げられるため、速やかな対応が求められます。しかし、データが失われるような直接的な危険性は低く、ほとんどの場合は適切な権限で再試行することで解決可能です。

2. 【最速】今すぐ試すべき解決策

解決策1:管理者権限(sudo)で再試行する

最も一般的な原因は、操作に必要な権限が不足していることです。Linux環境では、ファイルの所有者であるか、またはシステム管理者(root)権限を持っている必要があります。Windowsユーザーの皆様がPowerShellやコマンドプロンプトからWSLを起動したり、SSH接続でリモートLinuxサーバーに接続している場合でも、そのLinux環境内でsudoコマンドを使用することで、一時的に管理者権限を得てコマンドを実行できます。

実行手順:

  1. 対象のLinux環境にアクセスします。
    • WSLの場合: PowerShellやコマンドプロンプトで wsl と入力するか、WSLのディストリビューション名(例: ubuntu)を入力してWSLターミナルを起動します。
    • リモートLinuxサーバーの場合: PowerShellで ssh ユーザー名@サーバーIPアドレスまたはホスト名 を実行して接続します。
  2. 以下のコマンドで、sudoを付けてchmodを再実行します。
# WSLターミナル、またはSSH接続先のLinuxターミナルで実行します。
# 例: ファイル 'your_file.sh' に実行権限 (755) を付与する場合
sudo chmod 755 /path/to/your_file.sh

# または、ディレクトリ 'your_directory' に必要な権限 (755) を付与する場合
sudo chmod 755 /path/to/your_directory

sudoコマンドは、実行中のユーザーがsudoersリストに登録されており、パスワードを知っている場合に管理者権限でコマンドを実行できます。パスワードを求められたら入力してください。

WSLでWindows側のファイル(例: /mnt/c/Users/…)を操作している場合の注意点:
WSLからWindows側のファイルシステム上のファイルに対してchmodを実行しても、WindowsのNTFSパーミッションが優先されるため、変更が反映されないか、再度同様のエラーが発生する場合があります。この場合は、Windowsのエクスプローラーからファイルのプロパティを開き、「セキュリティ」タブでNTFSパーミッションを変更する必要があります。

# (WSL環境で) 現在のディレクトリがWindowsパスにマウントされているか確認
# 例: /mnt/c/... のようなパスであればWindowsパスです。
pwd

# (WindowsのPowerShellまたはコマンドプロンプトで) Windowsエクスプローラーを起動してパーミッションをGUIで変更
# 対象ファイルのパスを直接指定してエクスプローラーを開く例
explorer.exe /select,"C:\Path\To\Your\File.txt"
# ファイルを右クリック -> プロパティ -> セキュリティ タブでアクセス許可を編集してください。

3. chmod: changing permissions of ‘file’: Operation not permitted が発生する主要な原因(複数)

「Operation not permitted」エラーの背景には、いくつかの異なる原因が考えられます。これらの原因を理解することで、より根本的な解決につながります。

3.1. ファイルの所有者ではない、またはグループに属していない

Linuxでは、各ファイルやディレクトリには「所有者」と「グループ」が設定されており、所有者またはグループのメンバーだけが特定の操作(特に書き込み権限の変更)を行うことができます。あなたのアカウントがファイルの所有者でもなく、所属するグループも許可されていない場合にこのエラーが発生します。

3.2. ファイルシステムが読み取り専用(Read-Only)でマウントされている

対象のファイルシステムが、何らかの理由で読み取り専用モード(roオプション)でマウントされている場合があります。これは、システム起動時のエラーや、意図的に読み取り専用に設定されている場合に起こります。

# WSLターミナルまたはSSH接続先のLinuxターミナルで実行
# マウントされているファイルシステムの一覧とオプションを確認
mount | grep '/path/to/your_file'
# または、fstabの設定を確認 (管理者権限が必要な場合があります)
cat /etc/fstab

出力に ro が含まれていたら、それが原因である可能性が高いです。

3.3. 不変属性(Immutable Attribute)が設定されている

Linuxには、ファイルに対して「不変属性」(Immutable Attribute)を設定する機能があり、これによりrootユーザーでさえもファイルの変更、削除、リネーム、リンク作成などができなくなります。これはchattr +iコマンドで設定され、高度なセキュリティ目的で利用されます。

# WSLターミナルまたはSSH接続先のLinuxターミナルで実行
# ファイルの属性を確認
lsattr /path/to/your_file

出力に i が含まれていたら、それが原因です。解除するにはchattr -i /path/to/your_fileを実行します(管理者権限が必要)。

3.4. SELinuxやAppArmorなどのセキュリティモジュールによる制限

RHEL/CentOS系のSELinuxやUbuntu系のAppArmorといったセキュリティモジュールが有効になっている場合、通常のファイルパーミッションとは別に、より厳格なアクセス制御が行われます。これらのポリシーにより、特定の操作がブロックされることがあります。

# WSLターミナルまたはSSH接続先のLinuxターミナルで実行
# SELinuxの状態を確認
sestatus
# AppArmorの状態を確認
aa-status

3.5. WSL環境でのWindowsファイルシステムに対する操作

前述の通り、WSL内で/mnt/c/のようなWindows側のパスにあるファイルに対してchmodを実行した場合、LinuxのパーミッションシステムではなくWindowsのNTFSパーミッションが適用されるため、エラーが発生することがあります。この場合、Windows側でパーミッションを調整する必要があります。

4. Linuxで恒久的に再発を防ぐには

一時的な解決策だけでなく、今後同じ問題で悩まないための恒久的な対策を講じることも重要です。

4.1. 適切な所有者とグループを設定する(chown)

ファイルの所有権を、そのファイルを頻繁に操作するユーザーまたはグループに変更することで、sudoなしでパーミッション変更が可能になります。

# WSLターミナルまたはSSH接続先のLinuxターミナルで実行
# 所有者をuser1に、グループをgroup1に変更
sudo chown user1:group1 /path/to/your_file
# 再帰的にディレクトリ内のすべてのファイルの所有権を変更する場合
sudo chown -R user1:group1 /path/to/your_directory

4.2. ファイルシステムのマウントオプションを確認・変更する

ファイルシステムが読み取り専用でマウントされている場合、/etc/fstabファイルを編集して読み書き(rw)モードでマウントされるように変更します。

# WSLターミナルまたはSSH接続先のLinuxターミナルで実行
# /etc/fstab をエディタで開く (例: nano)
sudo nano /etc/fstab
# 該当行の 'ro' を 'rw' に変更し、保存してシステムを再起動または再マウントします。
# 再マウントの例:
sudo mount -o remount,rw /path/to/mountpoint

4.3. WSLでWindowsファイルシステムを扱う場合のパーミッション設定

WSL環境でWindows側のファイルを扱う場合、/etc/wsl.confファイルを使って自動マウント時のパーミッション動作を調整できます。

# WSLターミナルで実行
# /etc/wsl.conf をエディタで開く (もし存在しない場合は新規作成)
sudo nano /etc/wsl.conf

以下のような設定を追加または変更します。

[automount]
enabled = true
options = "metadata,uid=1000,gid=1000,umask=022,fmask=111,dmask=000"
  • metadata: ファイルのメタデータ(所有者、パーミッションなど)をWSL側で処理できるようにします。
  • uid=1000,gid=1000: マウントされたファイルのデフォルト所有者/グループを、現在のWSLユーザー(通常はUID/GID 1000)に設定します。
  • umask=022: 新しく作成されるファイルのデフォルトパーミッションを制御します。
  • fmask, dmask: ファイルとディレクトリのパーミッションマスクをそれぞれ設定します。

変更後、WSLをシャットダウンし再起動して設定を適用します。

# PowerShellまたはコマンドプロンプトで実行
wsl --shutdown
# その後、再度WSLを起動します。
wsl

4.4. ACL(Access Control List)の利用

よりきめ細やかなパーミッション管理が必要な場合は、ACLを使用できます。これにより、標準の所有者・グループ・その他、という3つの権限セットでは表現できない、特定のユーザーやグループへの追加的なアクセス権限を設定できます。

# WSLターミナルまたはSSH接続先のLinuxターミナルで実行
# ACLがインストールされているか確認し、必要であればインストール
# 例 (Ubuntu): sudo apt-get install acl

# ACLの確認
getfacl /path/to/your_file

# 特定のユーザーに読み書き権限を付与する例
sudo setfacl -m u:username:rw /path/to/your_file

これらの対策を講じることで、「chmod: changing permissions of ‘file’: Operation not permitted」エラーの発生を大幅に減らし、スムーズな作業環境を維持できるようになります。
どの解決策があなたの状況に最も適しているかを見極め、ぜひ試してみてください。