[Errno 13] Permission denied: '/dev/ttyACM0' 또는 /dev/ttyUSB0
Python의 serial 모듈을 사용하여 리눅스에서 시리얼 포트 접근시 다음과 같은 에러가 발생했습니다.
serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyACM0
[Errno 13] Permission denied: '/dev/ttyACM0'
검색해보니 /dev/ttyACM0 시리얼 포트에 대한 접근 권한이 없기 때문이라고 합니다. 이 문제를 해결하는 몇 가지 방법을 정리해봤습니다.
2024. 4. 10 최초작성
1. 현재 사용자를 `dialout` 그룹에 추가하기
대부분의 리눅스 배포판에서 dialout 그룹에 현재 로그인한 사용자를 추가하면 시리얼 포트에 접근할 수 있는 권한을 부여하게 된다고 합니다. 하지만 적용해봤는데 사용중인 우분투에서는 되지 않았습니다.
방법은 다음과 같습니다.
dialout 그룹에 현재 로그인한 사용자를 다음처럼 추가하고 재로그인합니다.
$ sudo usermod -a -G dialout $USER
2. `udev` 규칙 생성하기
`udev` 규칙을 사용하면 특정 장치에 대해 자동으로 권한을 설정할 수 있습니다.
예를 들어, `/etc/udev/rules.d/` 디렉토리에 새 규칙 파일을 생성하여 `/dev/ttyACM0`에 대한 권한을 설정할 수 있습니다.
적용해보니 사용중인 우분투에서 시리얼 포트 권한을 얻을 수 있었습니다.
방법은 다음과 같습니다.
2-1. 99-serial.rules 파일을 다음처럼 편집모드로 엽니다. 여기에선 nano 편집기를 사용했습니다.
$ sudo nano /etc/udev/rules.d/99-serial.rules
2-2.파일에 다음 내용을 추가합니다:
KERNEL=="ttyACM0", MODE="0666" |
2-3. Ctrl + O를 누르고 엔터를 눌러 변경 사항을 저장하고 Ctrl + X를 눌러 nano 편집기를 종료합니다.
2-4. udev 규칙을 적용하기 위해 다음 명령을 실행합니다.
$ sudo udevadm control --reload-rules
$ sudo udevadm trigger
3. 임시 권한 변경
보안상 권장하지 않기 때문에 시리얼 포트에 대한 임시로 접근 권한을 부여할 때에만 사용하세요.
시리얼 장치의 디바이스 파일이 /dev/ttyACM0라면 다음처럼 접근 권한을 부여할 수 있습니다.
$ sudo chmod 666 /dev/ttyACM0
이 방법은 재부팅 할때마다 해줘야 합니다.