udev를 사용할 때 매우 이상한 문제가 발생했습니다. 내가 이미 설명했듯이여기일부 폴더/파일에 액세스하려고 합니다.루트 사용자 없음 내 gpio 폴더에 대한 udev 규칙은 다음과 같습니다.
KERNEL=="gpio*", SUBSYSTEM=="gpio", ACTION=="add", PROGRAM="/bin/sh -c 'chown -R dave:users /sys/class/gpio; chmod -R 777 /sys/class/gpio'"
KERNEL=="gpio*", SUBSYSTEM=="gpio", ACTION=="add", PROGRAM="/bin/sh -c 'chown -R dave:users /sys/class/virtual/gpio; chmod -R 777 /sys/class/virtual/gpio'"
KERNEL=="gpio*", SUBSYSTEM=="gpio", ACTION=="add", PROGRAM="/bin/sh -c 'chown -R dave:users /sys%p; chmod -R 770 /sys%p'"
의도한 대로 올바른 방식으로 적용됩니다. 실제로 재부팅 후 규칙에 정의된 권한을 얻었습니다.
dave@arm:~$ ls -l /sys/class/gpio/
total 0
-rwxrwxrwx 1 dave users 4096 Jan 9 20:56 export
lrwxrwxrwx 1 dave users 0 Jan 9 20:56 gpiochip0 -> ../../devices/platform/ocp/44e07000.gpio/gpio/gpiochip0
lrwxrwxrwx 1 dave users 0 Jan 9 20:56 gpiochip32 -> ../../devices/platform/ocp/4804c000.gpio/gpio/gpiochip32
lrwxrwxrwx 1 dave users 0 Jan 9 20:56 gpiochip64 -> ../../devices/platform/ocp/481ac000.gpio/gpio/gpiochip64
lrwxrwxrwx 1 dave users 0 Jan 9 20:56 gpiochip96 -> ../../devices/platform/ocp/481ae000.gpio/gpio/gpiochip96
-rwxrwxrwx 1 dave users 4096 Jan 9 20:56 unexport
지금: 아주 이상한 일이 일어나고 있습니다. 저는 부스트 라이브러리를 사용하여 파일에 액세스하고 쓰는 간단한 C++ 프로그램을 작성했습니다. 여기에 수업을 예로 들어 내 프로그램의 일부를 게시하고 있습니다.
/*
* @brief drives the gpio-pin high or low
* @param the pin number, the state (high or low)
* @return the success of the operation
*
*/
int GPIOclass::digitalWrite( unsigned int pin_label, unsigned int state )
{
/* Check whether the Pin state has been correctly set or not */
if( ( state != HIGH ) && ( state != LOW ) ) {
std::cerr << "WARNING: Check again the value you want to write. It must be HIGH or LOW!" << std::endl;
return EXIT_FAILURE;
}
/* Write the desired Pin value */
boost::filesystem::fstream fs;
boost::filesystem::path path_pin = "/sys/class/gpio";
path_pin /= "/gpio" + std::to_string( pin_label );
path_pin /= "/value";
fs.open( path_pin, std::fstream::out );
if( fs.is_open() ) {
fs << state;
fs.close();
} else {
std::cerr << "ERROR: I couldn't open " << path_pin << " file" << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
이상하게도 내보낸 폴더에는 링크만 찾을 수 있고 GPIO를 구동하는 일반적인 파일과 폴더는 찾을 수 없기 때문에 필요한 핀에 액세스할 수 없습니다. 내가 찾은 것은 유일한 항목이었습니다.
dave@arm:~$ ls -l /sys/class/gpio/gpio60
lrwxrwxrwx 1 dave users 0 Jan 9 20:58 /sys/class/gpio/gpio60 -> ../../devices/platform/ocp/4804c000.gpio/gpio/gpio60
하지만디렉터리로 이동하면 위보다 더 많은 파일과 폴더를 볼 수 있습니다.
dave@arm:/sys/class/gpio/gpio60$ ls -l
total 0
-rwxrwx--- 1 dave users 4096 Jan 9 21:11 active_low
lrwxrwxrwx 1 dave users 0 Jan 9 21:11 device -> ../../../4804c000.gpio
-rwxrwx--- 1 dave users 4096 Jan 9 21:11 direction
-rwxrwx--- 1 dave users 4096 Jan 9 21:11 edge
drwxrwx--- 2 dave users 0 Jan 9 21:11 power
lrwxrwxrwx 1 dave users 0 Jan 9 21:11 subsystem -> ../../../../../../class/gpio
-rwxrwx--- 1 dave users 4096 Jan 9 21:11 uevent
-rwxrwx--- 1 dave users 4096 Jan 9 21:11 value
그래서 가시성 규칙이나 그런 것이 있는 것 같습니다. 왜 2개의 다른 결과가 나오는가?외부에서 폴더를 봅니다.아니면 만약에폴더를 살펴보니?
sudo를 사용하여 동일한 프로그램을 시작하면 문제가 없습니다.
고쳐 쓰다:아래 답변에서 제안한 대로 정확하게 수행했습니다. 답변은 맞지만 내보낸 gpio를 일반 사용자로 사용할 수 없습니다. 그래서 저는 링크된 폴더의 그룹과 소유자를 변경할 수 있는 새로운 규칙을 찾고 있습니다.
/sys/devices/platform/ocp/4804c000.gpio
답변에서 제안한대로.
이제 문제는 이를 달성하기 위해 새로운 규칙을 작성하려고 한다는 것입니다. 다음 정보를 검색하면 다음과 같습니다.
@arm:~/workspace/auto/build$ udevadm info --path=/sys/devices/platform/ocp/4804c000.gpio --attribute-walk
Udevadm i...
looking at device '/devices/platform/ocp/4804c000.gpio':
KERNEL=="4804c000.gpio"
SUBSYSTEM=="platform"
DRIVER=="omap_gpio"
ATTR{driver_override}=="(null)"
looking at parent device '/devices/platform/ocp':
KERNELS=="ocp"
SUBSYSTEMS=="platform"
DRIVERS==""
ATTRS{driver_override}=="(null)"
looking at parent device '/devices/platform':
KERNELS=="platform"
SUBSYSTEMS==""
DRIVERS==""
기존 udev 규칙에 다음 규칙을 추가했습니다.
KERNEL=="gpio*", SUBSYSTEM=="gpio", ACTION=="add", PROGRAM="/bin/sh -c 'chown -R bbb:gpio /sys/class/gpio; chmod -R 777 /sys/class/gpio'"
KERNEL=="gpio*", SUBSYSTEM=="gpio", ACTION=="add", PROGRAM="/bin/sh -c 'chown -R bbb:gpio /sys/class/virtual/gpio; chmod -R 777 /sys/class/virtual/gpio'"
KERNEL=="gpio*", SUBSYSTEM=="gpio", ACTION=="add", PROGRAM="/bin/sh -c 'chown -R bbb:gpio /sys%p; chmod -R 776 /sys%p'"
KERNEL=="4804c000.gpio", SUBSYSTEM=="platform", ACTION=="add", PROGRAM="/bin/sh -c 'chown -R bbb:gpio /sys/devices/platform/ocp/4804c000.gpio; chmod -R 777 /sys/devices/platform/ocp/4804c000.gpio'"
KERNEL=="481ae000.gpio", SUBSYSTEM=="platform", ACTION=="add", PROGRAM="/bin/sh -c 'chown -R bbb:gpio /sys/devices/platform/ocp/481ae000.gpio; chmod -R 777 /sys/devices/platform/ocp/481ae000.gpio'"
KERNEL=="481ac000.gpio", SUBSYSTEM=="platform", ACTION=="add", PROGRAM="/bin/sh -c 'chown -R bbb:gpio /sys/devices/platform/ocp/481ac000.gpio; chmod -R 777 /sys/devices/platform/ocp/481ac000.gpio'"
KERNEL=="44e07000.gpio", SUBSYSTEM=="platform", ACTION=="add", PROGRAM="/bin/sh -c 'chown -R bbb:gpio /sys/devices/platform/ocp/44e07000.gpio; chmod -R 777 /sys/devices/platform/ocp/44e07000.gpio'"
일반 사용자로 실행해도 여전히 다음 오류가 발생합니다.
ERROR: I couldn't open "/sys/class/gpio/gpio67/value" file
ERROR: I couldn't open "/sys/class/gpio/gpio69/value" file
ERROR: I couldn't open "/sys/class/gpio/gpio66/value" file
ERROR: I couldn't open "/sys/class/gpio/gpio69/value" file
위의 C++ 프로그램에서.
권한이 올바르게 설정되어 있기 때문에 정말 이해할 수 없습니다.
bbb@arm:~/workspace/build$ ls -l /sys/class/gpio/gpio60/
total 0
-rwxrwxrw- 1 bbb gpio 4096 Jan 11 17:50 active_low
lrwxrwxrwx 1 bbb gpio 0 Jan 11 17:50 device -> ../../../4804c000.gpio
-rwxrwxrw- 1 bbb gpio 4096 Jan 11 17:50 direction
-rwxrwxrw- 1 bbb gpio 4096 Jan 11 17:50 edge
drwxrwxrw- 2 bbb gpio 0 Jan 11 17:50 power
lrwxrwxrwx 1 bbb gpio 0 Jan 11 17:50 subsystem -> ../../../../../../class/gpio
-rwxrwxrw- 1 bbb gpio 4096 Jan 11 17:50 uevent
-rwxrwxrw- 1 bb gpio 4096 Jan 11 17:50 value
연결된 문제는 이제 해결된 것 같습니다.
bbb@arm:~/workspace/build$ ls -l /sys/class/gpio
total 0
-rwxrwxrwx 1 bbb gpio 4096 Jan 11 17:50 export
lrwxrwxrwx 1 bbb gpio 0 Jan 11 17:50 gpio48 -> ../../devices/platform/ocp/4804c000.gpio/gpio/gpio48
lrwxrwxrwx 1 bbb gpio 0 Jan 11 17:50 gpio60 -> ../../devices/platform/ocp/4804c000.gpio/gpio/gpio60
lrwxrwxrwx 1 bbb gpio 0 Jan 11 17:50 gpio66 -> ../../devices/platform/ocp/481ac000.gpio/gpio/gpio66
lrwxrwxrwx 1 bbb gpio 0 Jan 11 17:50 gpio67 -> ../../devices/platform/ocp/481ac000.gpio/gpio/gpio67
lrwxrwxrwx 1 bbb gpio 0 Jan 11 17:50 gpio68 -> ../../devices/platform/ocp/481ac000.gpio/gpio/gpio68
lrwxrwxrwx 1 bbb gpio 0 Jan 11 17:50 gpio69 -> ../../devices/platform/ocp/481ac000.gpio/gpio/gpio69
lrwxrwxrwx 1 bbb gpio 0 Jan 11 17:49 gpiochip0 -> ../../devices/platform/ocp/44e07000.gpio/gpio/gpiochip0
lrwxrwxrwx 1 bbb gpio 0 Jan 11 17:49 gpiochip32 -> ../../devices/platform/ocp/4804c000.gpio/gpio/gpiochip32
lrwxrwxrwx 1 bbb gpio 0 Jan 11 17:49 gpiochip64 -> ../../devices/platform/ocp/481ac000.gpio/gpio/gpiochip64
lrwxrwxrwx 1 bbb gpio 0 Jan 11 17:49 gpiochip96 -> ../../devices/platform/ocp/481ae000.gpio/gpio/gpiochip96
-rwxrwxrwx 1 bbb gpio 4096 Jan 11 17:49 unexport
내가 뭘 잘못했나요?
고쳐 쓰다:저는 이 배포판에서 무슨 일이 일어나고 있는지 이해하는 데 정말 어려움을 겪고 있습니다. 나는 이것을 생각해 냈다.최소한의 예(이 밑에협회cmakelists를 찾아 컴파일하여 각 핀의 내보내기 폴더를 열고 쓸 수 있습니다. 저는 현재 우분투와 함께 비글본을 사용하고 있습니다. uder 규칙은 위에 정의되어 있습니다. 나는 그것들을 바꾸지 않았습니다.
내 사용자 "bbb"를 사용하여 프로그램을 실행하려고 하면 다음 오류가 발생합니다.
bbb@arm:~/workspace/auto/test/build$ ./myprog
ERROR: the direction of pin "/sys/class/gpio/gpio67/direction" cannot be set.
Reason: Permission denied
ERROR: the value of the "/sys/class/gpio/gpio67/value" cannot be defined.
Reason: Permission denied
...
기본 사용자 "ubuntu"에 속한 모든 그룹에 사용자 "bbb"를 추가했습니다.
어떡해?
답변1
/sys/class/gpio/gpio60
는심볼릭 링크. 이것은 다른 파일을 가리키는 특별한 유형의 파일입니다. 파일 내용에 액세스할 때 심볼릭 링크는 투명합니다. 즉, 대상(가리키는 파일)처럼 작동합니다. 그러나 디렉토리를 나열할 때 기호 링크는 맨 왼쪽 열에 해당 기호 링크와 함께 표시되고 ls -l
해당 대상은 오른쪽에 표시됩니다. 메타데이터에 액세스하는 경우 상황에 따라 다릅니다.l
->
chmod -R … /sys/class/gpio
에서 시작하는 디렉토리 트리에 영향을 줍니다 /sys/class/gpio
. 여기에는 와 같은 항목이 포함됩니다 /sys/class/gpio/gpio60
. 그러나 /sys/class/gpio/gpio60
디렉토리 트리의 다른 위치를 가리키는 기호 링크입니다. 이 chmod
명령은 기호 링크의 대상에 영향을 주지 않습니다.
/sys/class/gpio/gpio60
또는 run 아래의 파일에 액세스하려고 하면 cd /sys/class/gpio/gpio60
심볼릭 링크가 가리키는 디렉터리에 액세스합니다(디렉토리의 내용에 액세스). 루트로 실행할 수 있지만 디렉터리는 루트로만 액세스할 수 있으므로 루트가 아닌 사용자로는 실행할 수 없습니다.
다른 사용자가 디렉토리에 액세스할 수 있도록 하려면 를 실행해야 합니다 chmod … /sys/devices/platform/ocp/4804c000.gpio/gpio/gpio60
.
그러나 그룹에 사용자를 추가하는 것은 소유권을 변경하는 것보다 간단합니다 gpio
.
adduser dave gpio