Programmer Application Note

2015년 5월 5일 화요일

udev를 이용한 usb mount

오후 7:22 Posted by PAN.SPOT No comments

udev를 이용한 usb auto mount

임베디드 리눅스 시스템에서 usb를 auto mount/umount 할 수 있는 방법을 알아보자.
  1. 먼저 타켓 시스템에서 udevd daemon 동작 하고 있는지 확인 한다.
  • $ps -ef | grep udevd 검색되는게 없다면 데몬이 돌지 않는 것이다.
  • which udevd 또는 find / -name "udevd"로 설치되어 있는지 확인 한다.
  1. udevd daemon이 없다면, udev source 에서 다운받아서 타켓 시스템에 맞게 cross compile 후 타겟 시스템에 추가 한다.
  • 각각의 타켓 시스템에 맞게 컴파일 한 후 rootfs에 복사하여 적용 한다.
  1. 이벤트가 발생 할 때 실행 되는 rules 파일 생성 etc/udev/rules.d/XX-XXXX.rules
  • 기본적으로 etc/udev/rules.d/ 폴더에 있는 rules 스크립트를 차례로 실행 하게 되는데 해당 폴더에 스크립트를 작성한다. 여기서는 샘플로 파일명을 10-local.rules로 생성한다.
    udevd --daemon --debug로 실행 해보면 만약 rules.d 경로가 틀리면 error 메세지가 출력되며 폴더 경로가 어디인지 확인 할 수 있다.
     아래와 같이 스크립트를 작성 한다.스크립트 작성방법은 여러가지가 있다.
     
     ACTION=="add",KERNEL=="sd??",SUBSYSTEM=="block", RUN+="/usr/local/sbin/usbmount.sh 1 %k"
     ACTION=="remove",KERNEL=="sd??",SUBSYSTEM=="block", RUN+="/usr/local/sbin/cstusbmount.sh 2 %k"
     #ACTION=="remove",ENV{DEVNAME}=="/dev/sd[a-z][0-9]",SUBSYSTEM=="block",RUN+="/usr/local/etc/udev/rules.d/cstusbmount.sh 2 %k
    
    • ACTION : 이벤트가 발생 했을 때
    • KERNEL,SUBSYSTEM... : udevadm info를 이용하여 해당 usb를 삽입 한 후 정보를 확인 해보고 알맞는 정보를 사용 하면 된다.
    • RUN : 해당 상태가 맞으면 실행되는 스크립트
    첫번째줄은 해석 하면 삽입(add)이 발생 하였고 kernel 이 sdXX 이고 subsystem이 block 이면 usbmount.sh를 실행 하라는 스크립트 이다. 두번째,세번째줄은 반대로 usb가 제거 되었을때 umount 하려는 스크립트 이며 두개중에 아무거나 사용하여도 무방하다. 단 정보를 확인 하여 타겟시스템에 맞는 것을 사용하도록 한다. %k는 $KERNEL 과 같다. 보다 자세한 정보를 원한다면 udev rules를 이용 한다.
  1. 실제 usb를 마운트 하는 script 생성
     #!/bin/sh
     case $1 in
     1)
     #echo $2 >> /etc/udev/rules.d/add.txt
     mkdir -p /mnt/usb/$2
     mount /dev/$2 /mnt/usb/$2
     ;;
     2)
     #!/bin/sh
     #echo $2 > /etc/udev/rules.d/remove.txt
     umount /mnt/usb/$2
     rmdir /mnt/usb/$2
    
    단순히 rules 동작만 확인 하고 싶다면 RUN에 주석을 제거 하고 확인 해본다.
  2. 시작시에 udevd daemon이 동작 할 수 있도록 시작 script에 추가
    임베디드 리눅스의 경우 대부분 /etc/init.d/rcS에 추가 하면 된다. udevd --daemon 추가
참고로 busybox에서 제공하는 mdev도 있으니 mdev가 있다면 mdev를 사용하자.

0 개의 댓글:

댓글 쓰기