게시물 1,376건
   
udev rule
글쓴이 : 최고관리자 날짜 : 2013-05-15 (수) 09:26 조회 : 7834
글주소 :
                                
출처 : http://visionmaru.com/wp/?p=147


이 문서는 http://www.reactivated.net/writing_udev_rules.html 를 요약 정리한 것으로, udev의 rule을 정의하는 방법에 관한 글이다.


udev란?

    리눅스 hotplug 프로젝트의 하위(?) 프로젝트로 장치가 추가되었을때의 처리에 관해 커널의 uevent를 이용하여 처리하는 프로젝트이다. 자세한 사항은 여기를 참조하시라.
    udev rule은 udev가 동작하는 규칙을 말하는 것으로, 어떠한 uevent가 발생 했을때 어떻게 처리할 지를 명시해 둔 텍스트로 구성된 규칙 파일이다.


rule 파일 규칙

    /etc/udev/udev.d/ 디렉토리에 존재해야하며, suffix는 .rules 이어야 한다.


기본 문법

    모든 룰은 key-value pair로 구성되고, 기본 문법은 다음과 같다.

    match[, <match>]*, assignment[, <assignment>]*\n

    1개이상의 match와 1개이상의 assignment가 ,(콤마)로 연결되고 공백으로 구분되어져 있고 하나의 라인으로 구성된다.

    • match는 조건이다. 만족할 경우 해당 rule에 기재된 assignment가 실행된다. <match-key>와 <조건>사이에 “==”으로 연결된다.
    • assignment는 일종의 action이다. match조건이 만족할 경우만 실행된다. <assignment-key>와 사이에 “=”으로 연결된다.



기본 사항

    match key는 다음과 같은것이 있다.

    • KERNEL – 커널에서 사용하는 장치명
    • SUBSYSTEM – 장치가 속한 SUBSYSTEM
    • DRIVER – 장치 드라이버의 이름

    assignment key는 다음과 같은것이 있다.

    • NAME – 장치 노드의 이름
    • SYMLINK – NAME외에 symbolic으로 링크할 이름

    KERNEL=="hdb", NAME="my_spare_disk"
    hdb장치가 추가되면 /dev/my_spare_disk 노드를 생성한다.

    KERNEL=="hdb", DRIVER=="ide-disk", SYMLINK+="my_spare_disk"
    hdb장치가 추가되고 hdb의 드라이버가 ide-disk이면 (/dev/hdb노드를 생성하고) /dev/my_spare_disk로 symbolic link 한다. NAME assignment가 생략되면 default node를 생성하는데 여기서는 /dev/hdb가 된다.

    KERNEL=="hdc", SYMLINK+="cdrom cdrom0"
    hdc장치가 추가되면 (/dev/hdc노드를 생성하고) /dev/cdrom과 /dev/cdrom0로 symbolic link한다.


sysfs attributes를 match key로 사용하기

    SUBSYSTEM=="block", ATTR{SIZE}=="234441648", SYMLINK+="my_disk"
    block 장치 중에서 크기가 234441648인 장치를 /dev/my_disk로 symbolic link 한다. /sys/block/*/size가 출력하는 값을 사용한 것이다.


문자열 대입

    %k 커널 이름에 대응한다. “sda”, “sda1″ 등.
    %n 장치 번호에 대응한다. “sda1″에서 “1″이 여기에 해당한다.
    %% escape로서 “%”를 표현한다.
    $$ 이것 역시 escape로서 “$”를 나타낸다.

    KERNEL=="mice", NAME="input/%k"
    디폴트로 mice장치가 추가되면 /dev/mice를 생성해야 하지만, 이룰에 의해 /dev/input/mice 를 생성한다.

    KERNEL=="loop0", NAME="loop/%n", SYMLINK+="%k"
    loop0가 추가되면 /dev/loop/0를 생성하고 추가로 /dev/loop0를 symbolic으로 link한다.


문자열 비교

    • “*” 0이상의 어떠한 문자
    • “?” 1개의 공백이 아닌 문자
    • “[]” 대괄호 안에 존재하는 문자 중 하나(range 허용)

    KERNEL=="fd[0-9]*", NAME="floppy/%n", SYMLINK+="%k"
    fd0, fd1, …, fd9, fd10, fd11, … 등이 추가되면 /dev/floppy/번호 노드를 생성하고 /dev/floppy번호 symbolic link도 생성한다.

    KERNEL=="hiddev*", NAME="usb/%k"
    hiddev로 시작하는 장치가 추가되면 /dev/usb/장치명으로 노드를 생성한다.


권한 및 소유권 제어

    KERNEL=="fb[0-9]*", NAME="fb/%n", SYMLINK+="%k", GROUP="video"
    GROUP assignment key이다. 지정된 그룹명으로 소속 그룹을 지정한다.

    KERNEL="fb[0-9]*", OWNER="john"
    OWNER assignment key이다. 지정된 사용자명으로 소유자를 지정한다.

    KERNEL="inotify", NAME="misc/%k", SYMLINK+="%k", MODE="0666"
    MODE assignment key이다. 파일의 모드를 설정한다.


네이밍을 위해 외부 프로그램 사용하기

    PROGRAM assignment key와 “%c” substitution이 사용된다.
    PROGRAM=”absolute-path-to-executable arg1 arg2 … argN”

    KERNEL==”hda”, PROGRAM=”/bin/device_namer %k”, SYMLINK+=”%c”
    hda장치가 추가되면 “/bin/device_namer hda”를 실행하고, stdout으로 나온 결과 문자열을 이용해서 symbolic link한다.

    KERNEL==”hda”, PROGRAM=”/bin/device_namer %k”, NAME=”%c{1}”, SYMLINK+=”%c{2}”
    hda장치가 추가되면 “/bin/device_namer hda”를 실행하고, stdout으로 나온 결과 문자열중에 1번째 결과값으로 노드를 생성하고, 2번째 결과값을 이용해서 symbolic link한다.

    KERNEL==”hda”, PROGRAM=”/bin/device_namer %k”, NAME=”%c{1}”, SYMLINK+=”%c{2+}”
    hda장치가 추가되면 “/bin/device_namer hda”를 실행하고, stdout으로 나온 결과 문자열중에 1번째 결과값으로 노드를 생성하고, 2번째부터 모든 결과값을 이용해서 symbolic link한다.


외부 프로그램 동작시키기

    위에서는 네이밍을 위해 외부 프로그램을 동작 시켰으나, 특정한 액션을 취하게 하기위해 외부 프로그램을 수행 시킬 수 있다. 수행 시점은 노드가 생성된 이후이다. 주의점은 즉시 수행이 완료되어야 한다. 이 프로그램이 동작중에 udev는 멈춰있는다. 이 프로그램은 udev의 환경변수를 자신의 환경변수로 사용할 수 있다. 예를들어 val = getenv(“ACTION”); 을 통해 val이 “add”일 경우와 “remove”일 경우에 각각 동작을 달리 할 수 있다.

    KERNEL=="sdb", RUN+="/usr/bin/my_program"
    sdb장치가 추가되면(추가되고 노드가 생성되면) /usr/bin/my_program을 수행한다.


환경변수 사용

    ENV는 matching key와 assignment key 두가지로 사용할 수 있다.

      assignment key로 사용하기
      KERNEL=="fd0", SYMLINK+="floppy", ENV{some_var}="value"
      fd0라 추가되면 $some_var가 value로 설정된다.
      matching key로 사용하기
      KERNEL=="fd0", ENV{an_env_var}=="yes", SYMLINK+="floppy"
      fd0가 추가되고 환경변수 $an_env_var의 값이 “yes” 일 경우 /dev/floppy로 symbolic link 한다.

이름 패스워드
비밀글 (체크하면 글쓴이만 내용을 확인할 수 있습니다.)
왼쪽의 글자를 입력하세요.
   

 



 
사이트명 : 모지리네 | 대표 : 이경현 | 개인커뮤니티 : 랭키닷컴 운영체제(OS) | 경기도 성남시 분당구 | 전자우편 : mojily골뱅이chonnom.com Copyright ⓒ www.chonnom.com www.kyunghyun.net www.mojily.net. All rights reserved.