web-dev-qa-db-ja.com

Sysfs属性に書き込み権限を与える方法は?

デバイスに情報を渡すためのドライバーを作成したいので、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を設定できないのはなぜですか?

2
J Amos

__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

3
Andy Dalton