Sysfs

如何賦予 Sysfs 屬性寫入權限?

  • November 14, 2017

我想編寫一個驅動程序來將一些資訊傳遞給設備,為此我創建了一個 sysfs 條目。它工作正常,但問題是我沒有權限寫入它,除非我以管理員身份登錄。我希望它具有開放的讀寫權限。

按照建議我編寫驅動程序的方式,我使用以下宏來設置 sysfs 屬性:

__ATTR(status_vector,0660,status_vector_is_read,status_vector_is_written);

問題很明顯,我使用的是 660 而不是 666 作為權限。

但是,當我嘗試將權限設置為 666 或使用定義的 S_IWUGO | S_IRUGO,我收到一個錯誤。我可以設置開放讀取權限,但不能寫入。顯然這個人有同樣的問題,但我沒有看到該執行緒上給出的任何答案。

我總是可以使用 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?通常被認為是個壞主意”。

雖然我沒有追踪呼叫路徑,但我的猜測是程式碼 filters/ignores 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#L940

引用自:https://unix.stackexchange.com/questions/404347