Linux 커 널 / sys 파일 시스템 소개 4


uevent 사용 하기
    sysfs 의 많은 kobject 에 uevent 속성 이 있 는데 주로 커 널 과 udev (자동 장치 발견 프로그램) 간 의 통신 인터페이스 에 사 용 됩 니 다.udev 자체 와 커 널 의 통신 인터페이스 netlink 프로 토 콜 소켓 으로 볼 때 장치 의 uevent 속성 파일 을 알 필요 가 없 지만 uevent 와 같은 인터페이스 가 많아 서 udevmonitor 가 커 널 을 통 해 udevd (udev 배경 프로그램) 에 메 시 지 를 보 낼 수도 있 고 자체 가 지원 하 는 netlink 메시지 의 환경 변 수 를 검사 하 는 데 도 사용 할 수 있 습 니 다.이 기능 은 일반적으로 개발 자 들 이 udev 규칙 파일 을 디 버 깅 하 는 데 사 용 됩 니 다. udevtrigger 라 는 디 버 깅 도구 자체 가 각 장치 의 uevent 속성 파일 로 이 루어 집 니 다.
    이 uevent 속성 파일 들 은 일반적으로 쓸 수 있 습 니 다. 그 중에서 / sys / devices / 트 리 아래 의 많은 uevent 속성 은 새로운 커 널 에서 읽 을 수 있 습 니 다.
 # find /sys/ -type f -name uevent -ls     11    0 -rw-r--r--   1 root     root         4096 12 월 12 일 21: 10 / sys / devices / platform / uevent  1471    0 -rw-r--r--   1 root     root         4096 12 월 12 일 21: 10 / sys / devices / platform / pcspkr / uevent  3075    0 -rw-r--r--   1 root     root         4096 12 월 12 일 21: 10 / sys / devices / platform / vesafb. 0 / uevent  3915    0 -rw-r--r--   1 root     root         4096 12 월 12 일 21: 10 / sys / devices / platform / serial 8250 / uevent  3941    0 -rw-r--r--   1 root     root         4096 12 월 12 일 21: 10 / sys / devices / platform / serial 8250 / tty / ttyS 2 / uevent  3950    0 -rw-r--r--   1 root     root         4096 12 월 12 일 21: 10 / sys / devices / platform / serial 8250 / tty / ttyS 3 / uevent  5204    0 -rw-r--r--   1 root     root         4096 12 월 12 일 21: 10 / sys / devices / platform / i8042 / uevent [...]   912    0 -rw-r--r--   1 root     root         4096 12 월 12 일 21: 17 / sys / devices / pci 0000: 00 / 000: 00: 02.5 / uevent [...]
    위 에서 캡 처 한 마지막 은 SCSI 하 드 디스크 컨트롤 러 장치 의 uevent 속성 파일 입 니 다. 이 / devices / 속성 파일 들 은 모두 기록 을 지원 합 니 다. 현재 기록 을 지원 하 는 매개 변 수 는 "add", "remove", "change", "move", "online", "offline" 입 니 다."add" 를 쓰 면 udevd 에 netlink 메 시 지 를 보 내 서 관련 udev 규칙 파일 을 다시 한 번 보 낼 수 있 습 니 다.이 기능 은 개발 자 들 이 udev 규칙 파일 을 디 버 깅 하 는 데 매우 유용 하 다.
 # echo add > /sys/devices/pci0000:00/0000:00:02.5/uevent
    드라이브 (PCI) 를 사용 하 는 sysfs 속성 파일, bid, unbid 와 newid
    장치 구동 / sys / bus / * / driver /... 에서 많은 구동 이 bind, unbind, new 가 있 음 을 볼 수 있 습 니 다.id 이 세 가지 속성,
 
# find /sys/bus/*/drivers/ -name bind -ls
... 

    모든 장치 드라이버 는 프로그램 내 에서 어떤 하드웨어 에 사용 할 수 있 는 지 를 어떤 방식 으로 표시 합 니 다. 예 를 들 어 모든 PCI 드라이버 는 MODULE 을 사용 합 니 다.DEVICE_TABLE 은 구동 할 수 있 는 PCI 하드웨어 의 PCI 장치 번 호 를 밝 혔 다.그러나 드라이버 는 미래 를 예측 할 수 없다. 미래 에 생산 될 새로운 하드웨어 는 기 존 하드웨어 의 작업 방식 을 호 환 할 수 있 고 기 존 하드웨어 드라이버 를 사용 하여 작업 할 수 있다.bind 와 unbind 가 발명 되 기 전에 이러한 상황 은 PCI 장치 드라이버 를 수정 하 는 DEVICE 를 제외 하고TABLE 단락 은 드라이버 를 다시 컴 파일 하 는 것 외 에 다른 방법 이 없습니다. 2.6 커 널 에 bid 와 unbid 를 추가 한 후에 다시 컴 파일 하지 않 은 상태 에서 장치 와 드라이브 사 이 를 수 동 으로 연결 할 수 있 습 니 다.
    또한 일부 하드웨어 장치 에 대해 여러 개의 드라이버 를 사용 할 수 있 지만 구체 적 인 시간 에 한 개의 드라이버 만 이 하드웨어 를 구동 할 수 있 습 니 다. 이 때 는 bid / unbid 를 사용 하여 어떤 드라이버 를 강제 적 으로 사용 하고 사용 하지 않 을 수 있 습 니 다.(여러 드라이버 의 선택 에 주의 하 십시오. 더 좋 은 관리 방법 은 modprobe. conf 설정 파일 을 사용 하 는 것 입 니 다. 다시 시작 해 야 효력 이 발생 합 니 다. bid / unbid 는 즉시 효력 이 발생 하지 않 아 도 되 는 임시 경 로 를 제공 합 니 다.)
    이 를 사용 하면 특정한 장 치 를 강제로 연결 하거나 특정한 드라이버 를 사용 하지 않도록 강제 할 수 있 습 니 다. 조작 방법 은 bid 와 unbid 인 터 페 이 스 를 통 해 이 루어 집 니 다.
 
#find /sys/-type f ( -name bind -or -name unbind -or -name new_id )
 -ls
    69    0 -rw-r--r--   1 root     root         4096 12  12 22:12 
/sys/devices/virtual/vtconsole/vtcon0/bind
  3072    0 --w-------   1 root     root         4096 12  12 22:15 
/sys/bus/platform/drivers/vesafb/unbind
[...]
  6489    0 --w-------   1 root     root         4096 12  12 22:09 
/sys/bus/pci/drivers/8139too/unbind
  6490    0 --w-------   1 root     root         4096 12  12 22:09 
/sys/bus/pci/drivers/8139too/bind
  6491    0 --w-------   1 root     root         4096 12  12 22:15 
/sys/bus/pci/drivers/8139too/new_id 

    이 결 과 는 8139 too 라 는 드라이버 의 이 세 가지 속성 파일 을 언급 하 였 습 니 다.
   
 
# find /sys/bus/pci/drivers/8139too/ -ls
  6435    0 drwxr-xr-x   2 root     root            0 12  12 22:08 
/sys/bus/pci/drivers/8139too/
  6436    0 lrwxrwxrwx   1 root     root            0 12  12 22:08 
/sys/bus/pci/drivers/8139too/0000:00:0e.0 ->
 ../../../../devices/pci0000:00/0000:00:0e.0
  6485    0 lrwxrwxrwx   1 root     root            0 12  12 22:08 
/sys/bus/pci/drivers/8139too/module -> ../../../../module/8139too
  6488    0 --w-------   1 root     root         4096 12  12 22:08 
/sys/bus/pci/drivers/8139too/uevent
  6489    0 --w-------   1 root     root         4096 12  12 22:08 
/sys/bus/pci/drivers/8139too/unbind
  6490    0 --w-------   1 root     root         4096 12  12 22:08 
/sys/bus/pci/drivers/8139too/bind
  6491    0 --w-------   1 root     root         4096 12  12 22:08 
/sys/bus/pci/drivers/8139too/new_id
# echo 0000:00:0e.0 > /sys/bus/pci/drivers/8139too/unbind
-bash: echo: write error:       
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc 
pfifo_fast state 
UNKNOWN qlen 1000
    link/ether 00:14:2a:d1:16:72 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.102/24 brd 192.168.1.255 scope global eth0
3: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN 
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
# echo -n 0000:00:0e.0 > /sys/bus/pci/drivers/8139too/unbind
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
3: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN 
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
# echo -n 0000:00:0e.0 > /sys/bus/pci/drivers/8139too/bind
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
3: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN 
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
4: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state 
DOWN qlen 1000
    link/ether 00:14:2a:d1:16:72 brd ff:ff:ff:ff:ff:ff 

    이 작업 과정 은 PCI 장치 "0000: 00 e. 0" 에 대해 "8139 too" 구동 을 강제로 취소 하고 "8139 too" 구동 을 강제 하 는 방법 을 보 여 줍 니 다.
    unbid 속성 에 버스 번호 (bus id) 를 기록 하 는 것 은 바 인 딩 을 강제로 취소 하 는 것 입 니 다.    bind 속성 에 버스 번호 (bus id) 를 기록 하 는 것 은 강제 바 인 딩 입 니 다.    주의해 야 할 것 은 버스 번 호 를 기록 하 는 것 입 니 다. PCI 장치 에 대응 하 는 버스 번 호 는 'domain (4 비트): bus (2 비트): slot (2 비트): function 번호 (무제 한)' 의 방식 으로 조직 되 고 장치 kobject 노드 에서 찾 을 수 있 으 며 다른 유형의 버스 는 각각 다른 규칙 이 있 습 니 다.
    특히 주의: 이 예 에서 "echo 0000: 00: 00 e. 0 > / sys / bus / pci / drivers / 8139 too / unbind" 라 는 첫 번 째 기록 명령 은 "No such device" 를 오류 로 종료 하고, 후속 적 인 "echo - n" 명령 은 성공 할 수 있 습 니 다.이것 은 커 널 이 버스 번 호 를 일치 시 킬 때 너무 엄격 하기 때 문 입 니 다. 일반적인 "echo" 명령 은 문자열 을 기록 하면 줄 바 꿈 문자 로 출력 을 끝 냅 니 다. 커 널 은 이 줄 바 꿈 자 를 가 진 bus 를 받 습 니 다.id 문자열, 커 널 데이터 구조 에 있 는 진짜 busid 문자열 을 비교 하면 찾 을 수 없습니다.다행히 이 문 제 는 최신 2.6.28 개발 중인 커 널 에서 해결 되 었 습 니 다. 이 비교 함 수 를 특수 하 게 실 현 된 문자열 비교 로 바 꾸 고 끝 에 있 는 줄 바 꿈 자 를 자동 으로 무시 합 니 다. 2.6.28 - rc6 커 널 에서 테스트 합 니 다. '- n' 매개 변 수 를 가 진 echo 명령 은 성공 적 으로 기록 할 수 있 습 니 다.
    그리고 newid 속성 파일 도 다른 경로 로 새로운 장치 번호 문 제 를 해결 할 수 있 습 니 다. 이것 은 쓰기 만 하 는 구동 속성 으로 그 안에 새로운 장치 번 호 를 쓸 수 있 습 니 다.이 는 vendor, device, subvendor, subdevice, class, class 를 대표 하 는 16 진 성형 매개 변 수 를 2 ~ 7 개 기록 하 는 것 을 지원 합 니 다.mask, driver_data 가 최소 2 개 인 이 유 는 하나의 PCI 설비 가 공장 상호 (vendor) 와 설비 번호 (device) 로 유일 하 게 표시 되 어 있 기 때 문 입 니 다. 다른 5 개의 매개 변 수 를 입력 하지 않 으 면 부족 한 값 은 PCI 입 니 다.ANY_ID(0xffff)。
 5441    0 --w-------   1 root     root         4096 12 월 14 일 18: 15 / sys / bus / pci / drivers / 8139 too / newid
    8139 too 구동 에서 현재 정적 으로 지원 하 는 장치 번호 목록 을 볼 수 있 습 니 다. 그 중에서 현재 시스템 의 장치 10ec: 8139 를 포함 하고 앞으로 8140 장치 도 8139 장치 의 하드웨어 통신 협 의 를 만족 시 킬 것 이 라 고 가정 하면 8139 too 드라이버 로 구동 할 수 있 습 니 다. 조작 은 다음 과 같 습 니 다.
 
# echo '10ec 8140' > /sys/bus/pci/drivers/8139too/new_id 

    이것 은 드라이버 를 업데이트 하지 않 은 상태 에서 장 치 를 디 버 깅 하 는 데 매우 유용 하 다.

좋은 웹페이지 즐겨찾기