デバイスに情報を渡すためのドライバーを作成したいので、sysfsエントリを作成しました。正常に動作しますが、管理者としてログインしていない限り、書き込み権限がないという問題があります。オープンな読み取りおよび書き込み権限が必要です。
ドライバーを作成するようにアドバイスされた方法で、次のマクロを使用してsysfs属性を設定しました。
__ATTR(status_vector,0660,status_vector_is_read,status_vector_is_written);
問題は明らかです。許可として666ではなく660を使用しました。
ただし、権限を666として設定するか、定義済みのS_IWUGO |を使用しようとするとS_IRUGO、エラーが発生します。オープンな読み取り権限を設定できますが、書き込みはできません。どうやら this 人も同じ問題を抱えていたようですが、そのスレッドで答えが出ていません。
私はいつでもchmodを使用してアクセス許可を設定できましたが、それは不格好で面倒な解決策のようです。むしろ、実際にドライバーを適切に作成する方法を学びたいと思います。 S_IWUGOを設定できないのはなぜですか?
__ATTR
マクロは次の[1]に展開されます。
#define __ATTR(_name, _mode, _show, _store) { \
.attr = {.name = __stringify(_name), \
.mode = VERIFY_OCTAL_PERMISSIONS(_mode) }, \
.show = _show, \
.store = _store, \
}
マクロVERIFY_OCTAL_PERMISSIONS
の使用に注意してください。そのマクロは次のように展開されます[2]:
#define VERIFY_OCTAL_PERMISSIONS(perms) \
(BUILD_BUG_ON_ZERO((perms) < 0) + \
BUILD_BUG_ON_ZERO((perms) > 0777) + \
/* USER_READABLE >= GROUP_READABLE >= OTHER_READABLE */ \
BUILD_BUG_ON_ZERO((((perms) >> 6) & 4) < (((perms) >> 3) & 4)) + \
BUILD_BUG_ON_ZERO((((perms) >> 3) & 4) < ((perms) & 4)) + \
/* USER_WRITABLE >= GROUP_WRITABLE */ \
BUILD_BUG_ON_ZERO((((perms) >> 6) & 2) < (((perms) >> 3) & 2)) + \
/* OTHER_WRITABLE? Generally considered a bad idea. */ \
BUILD_BUG_ON_ZERO((perms) & 2) + \
(perms))
取得するBUILD_BUG_ON_ZERO
のバージョンは、追跡しなかったマクロによって異なりますが、上記のマクロのコメント「OTHER_WRITABLE?一般的には悪い考えと見なされます」に注意してください。
呼び出しパスをトレースしませんでしたが、コードはo+w
をフィルタリング/無視していると思います。
とはいえ、特権のないユーザーがハードウェアの一部と直接対話できるようにするのはなぜですか?
[1] http://elixir.free-electrons.com/linux/v4.14/source/include/linux/sysfs.h#L101
[2] http://elixir.free-electrons.com/linux/v4.14/source/include/linux/kernel.h#L94