/sys/bus/pci/devices の内容を編集できません

/sys/bus/pci/devices の内容を編集できません

実行しようとすると

#!/bin/sh

for i in /sys/bus/pci/devices/*/boot_vga; do
    if [ $(cat "$i") -eq 0 ]; then
        GPU="${i%/boot_vga}"
        AUDIO="$(echo "$GPU" | sed -e "s/0$/1/")"
        USB="$(echo "$GPU" | sed -e "s/0$/2/")"
        echo "vfio-pci" > "$GPU/driver_override"
        if [ -d "$AUDIO" ]; then
            echo "vfio-pci" > "$AUDIO/driver_override"
        fi
        if [ -d "$USB" ]; then
            echo "vfio-pci" > "$USB/driver_override"
        fi
    fi
done

modprobe -i vfio-pci

(shファイルとして)出力は次のようになりました

./a.sh: 8: cannot create /sys/bus/pci/devices/0000:17:00.0/driver_override: Permission denied
./a.sh: 10: cannot create /sys/bus/pci/devices/0000:17:00.1/driver_override: Permission denied

これらのファイルの場所を確認すると、/sys/bus/pci/devices/0000:17:00.0/driver_override と /sys/bus/pci/devices/0000:17:00.1/driver_override がすでに存在しており、その内容は「(null)」であることがわかりました。

答え1

この問題は、スクリプトをルート権限で実行していないために発生する可能性があります。Linux/sysのディレクトリは仮想ファイルシステムの一部であり、保護されています。ここでファイルを変更するには、多くの場合、ルート (またはスーパーユーザー) 権限が必要です。

あなたの場合、driver_overrideより高い権限が必要なファイルを変更しようとしています。

次のように、sudo を使用してスクリプトを実行してみてください。

sudo ./a.sh

このコマンドはスクリプトをルート権限で実行し、「アクセスが拒否されました」というエラーが表示されなくなります。

ただし、スクリプトをルート権限で実行する場合、特にシステム ファイルを変更する場合は、ミスによってシステムに損害を与える可能性があるため、注意が必要です。スクリプトをルート ユーザーとして実行する前に、必ずスクリプトが何を実行しているかを理解しておいてください。

ファイル内の「(null)」コンテンツは、driver_override現在のドライバーを上書きするドライバーが指定されていないことが原因である可能性があります。driver_overrideインターフェイスを使用すると、デバイス ドライバーの自動プローブが実行されるときに、デバイスにバインドする特定のドライバーを指定できます。これは高度な機能であるため、慎重に使用する必要があります。

関連情報