udev 장치 규칙 설정

USB 시리얼 장치, Arduino, 자동 마운트, 네트워크 인터페이스 이름 고정, 스크립트 자동 실행을 위한 udev 규칙 템플릿입니다.

Gist
# /etc/udev/rules.d/99-custom.rules
# 사용자 정의 udev 규칙
#
# 규칙 즉시 적용 (재부팅 없이):
#   sudo udevadm control --reload-rules
#   sudo udevadm trigger
#
# 장치 속성 조회 (연결된 장치의 속성 확인):
#   udevadm info --name=/dev/ttyUSB0 --attribute-walk
#   udevadm info --query=all --name=/dev/sdb
#
# 규칙 매칭 테스트 (실제 적용 전 확인):
#   udevadm test $(udevadm info --query=path --name=/dev/ttyUSB0)

# ============================================================
# [섹션 1] USB 시리얼 장치 권한 설정
# SUBSYSTEM: 장치가 속한 커널 서브시스템 ("tty", "usb", "block" 등)
# ATTRS{idVendor}: USB 벤더 ID (16진수)
# ATTRS{idProduct}: USB 제품 ID (16진수)
# MODE: 파일 권한 (0666 = 모든 사용자 읽기/쓰기)
# GROUP: 장치 파일 그룹 소유자
# ============================================================

# Arduino Uno (벤더: 2341, 제품: 0043)
# 그룹에 추가: sudo usermod -aG dialout $USER
SUBSYSTEM=="tty", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0043", \
    GROUP="dialout", MODE="0664", \
    SYMLINK+="arduino"

# Arduino Leonardo / Micro
SUBSYSTEM=="tty", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="8036", \
    GROUP="dialout", MODE="0664", \
    SYMLINK+="arduino_leonardo"

# CH340/CH341 USB-시리얼 변환기 (저가형 Arduino 클론에 많이 사용)
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", \
    GROUP="dialout", MODE="0664", \
    SYMLINK+="usb_serial"

# FTDI USB-시리얼 변환기 (FT232R)
# SYMLINK+: /dev/ftdi 심볼릭 링크 생성 (경로 고정)
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", \
    GROUP="dialout", MODE="0664", \
    SYMLINK+="ftdi_serial"

# ============================================================
# [섹션 2] USB 장치별 영구 심볼릭 링크
# 동일 제품을 여러 개 연결할 때 시리얼 번호로 구분
# ATTRS{serial}: 장치 고유 시리얼 번호
# ============================================================

# 시리얼 번호로 Arduino 구분 (여러 대 동시 연결 시)
SUBSYSTEM=="tty", ATTRS{idVendor}=="2341", \
    ATTRS{serial}=="ABCDE12345", \
    SYMLINK+="arduino_robot_arm", \
    GROUP="dialout", MODE="0664"

SUBSYSTEM=="tty", ATTRS{idVendor}=="2341", \
    ATTRS{serial}=="FGHIJ67890", \
    SYMLINK+="arduino_conveyor", \
    GROUP="dialout", MODE="0664"

# ============================================================
# [섹션 3] USB 저장장치 자동 마운트
# ACTION: "add" (장치 연결), "remove" (장치 제거)
# KERNEL: 커널이 장치에 부여한 이름 패턴 (sd[b-z]: SCSI 디스크)
# RUN: 규칙 매칭 시 실행할 명령 또는 스크립트
# ============================================================

# USB 드라이브 연결 시 자동 마운트 스크립트 실행
# 스크립트가 파티션 감지 및 /media/usb에 마운트 처리
ACTION=="add", KERNEL=="sd[b-z][0-9]", \
    SUBSYSTEMS=="usb", \
    RUN+="/usr/local/bin/usb-mount.sh add %k"

# USB 드라이브 제거 시 언마운트
ACTION=="remove", KERNEL=="sd[b-z][0-9]", \
    SUBSYSTEMS=="usb", \
    RUN+="/usr/local/bin/usb-mount.sh remove %k"

# ============================================================
# [섹션 4] 네트워크 인터페이스 이름 고정
# MAC 주소 기반으로 인터페이스 이름을 고정
# (eth0, eth1 등 예측 가능한 이름 사용)
# NAME: 지정할 인터페이스 이름
# ============================================================

# MAC 주소로 인터페이스 이름 고정
SUBSYSTEM=="net", ACTION=="add", \
    ATTR{address}=="aa:bb:cc:dd:ee:01", \
    NAME="wan0"

SUBSYSTEM=="net", ACTION=="add", \
    ATTR{address}=="aa:bb:cc:dd:ee:02", \
    NAME="lan0"

SUBSYSTEM=="net", ACTION=="add", \
    ATTR{address}=="aa:bb:cc:dd:ee:03", \
    NAME="mgmt0"

# ============================================================
# [섹션 5] 특정 USB 장치 연결 시 스크립트 자동 실행
# ENV{ID_FS_LABEL}: 파티션 레이블 (blkid로 확인 가능)
# ENV{ID_VENDOR_ID}: USB 벤더 ID (환경 변수 형식)
# ============================================================

# 특정 USB 메모리 (레이블 "BACKUP") 연결 시 백업 스크립트 실행
ACTION=="add", SUBSYSTEM=="block", \
    ENV{ID_FS_LABEL}=="BACKUP", \
    RUN+="/usr/local/bin/auto-backup.sh"

# YubiKey (Yubico, idVendor=1050) 연결/제거 감지
# 연결: 화면 잠금 해제 / 제거: 화면 잠금
ACTION=="add", SUBSYSTEM=="usb", \
    ATTRS{idVendor}=="1050", \
    RUN+="/usr/local/bin/yubikey-connect.sh"

ACTION=="remove", SUBSYSTEM=="usb", \
    ATTRS{idVendor}=="1050", \
    RUN+="/usr/local/bin/yubikey-remove.sh lock"

# ============================================================
# [섹션 6] 비디오/오디오 장치 그룹 권한
# ============================================================

# USB 웹캠 — video 그룹에 접근 권한 부여
SUBSYSTEM=="video4linux", \
    GROUP="video", MODE="0660"

# USB 오디오 장치
SUBSYSTEM=="sound", \
    GROUP="audio", MODE="0664"

# GPIO 장치 (Raspberry Pi 등 SBC)
SUBSYSTEM=="gpio", \
    GROUP="gpio", MODE="0660"