Sysfs 속성에 쓰기 권한을 부여하는 방법은 무엇입니까?

Sysfs 속성에 쓰기 권한을 부여하는 방법은 무엇입니까?

일부 정보를 장치에 전달하는 드라이버를 작성하고 이를 위해 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

관련 정보