일부 정보를 장치에 전달하는 드라이버를 작성하고 이를 위해 sysfs 항목을 만들었습니다. 잘 작동하지만 문제는 관리자로 로그인하지 않으면 쓸 수 있는 권한이 없다는 것입니다. 공개 읽기 및 쓰기 권한을 갖고 싶습니다.
드라이버를 작성하라는 조언을 받은 방식에 따라 다음 매크로를 사용하여 sysfs 속성을 설정했습니다.
__ATTR(status_vector,0660,status_vector_is_read,status_vector_is_written);
문제는 분명합니다. 666 대신 660을 권한으로 사용했습니다.
그러나 권한을 666으로 설정하거나 정의된 S_IWUGO | S_IRUGO를 사용하려고 하면 오류가 발생합니다. 공개 읽기 권한은 설정할 수 있지만 쓰기 권한은 설정할 수 없습니다. 확실히이것누군가 같은 문제를 겪었지만 해당 스레드에 제공된 답변을 볼 수 없었습니다.
권한을 설정하기 위해 언제든지 chmod를 사용할 수 있지만 이는 투박하고 성가신 솔루션처럼 보이며 드라이버를 올바르게 작성하는 방법을 배우고 싶습니다. S_IWUGO를 설정할 수 없는 이유는 무엇입니까?
답변1
이 __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#L940