Udev/ko
udev는 리눅스 커널용 장치 관리자입니다. /dev의 장치 노드를 관리하며 장치를 추가하고 제거할 때 모든 사용자 공간 처리 동작을 관리합니다. 이 글의 독자 여러분은 udev의 포크 버전인 eudev도 살펴보셔야 합니다.
udev from the sys-apps/systemd-utils package is used as the default device manager for Gentoo systems using the OpenRC init system, independently of systemd.
udev란 무엇인가요?
/dev 디렉터리
대부분의 리눅스 사용자는 /dev/sda1을 첫 번째 주 하드 드라이브의 처음 분할 영역을 가리킨다고 이해합니다. 참 쉽죠?
그런데 USB, IEEE 1394, 탈부착 가능 PCI 등의 탈부착 가능 장치를 고려해보죠. 어떤 장치가 첫 번째 장치일까요? 얼마나 오래동안 첫 번째 장치일까요? 처음 장치를 떼어냈을 때, 다른 장치에 이름을 어떻게 붙일까요? 작동 중이었던 하드웨어와의 상호 작용은 어떻게 될까요? 누군가가 (마침 첫 번째 프린터에 해당하던)고성능 레이저 프린터의 전원 플러그를 뽑기로 해서 인쇄 작업이 거의 맛이 간 매트릭스 프린터로 옮겨간다면 재밌는 일이 되지 않을까요?
- 사용자 영역에서 실행됩니다.
- 동적으로 장치 파일en을 만들고 제거합니다.
- 일관성 있는 이름을 제공합니다.
- 사용자 영역 프로그램 인터페이스(API)를 제공합니다.
항상 변경은 장치 구조내에서 일어나며 커널에서는 udev에서 받을 uevent를 쏴보냅니다. udev 는 /etc/udev/rules.d, /run/udev/rules.d, /lib/udev/rules.d 디렉터리에 선언한 규칙을 따릅니다. uevent에 들어간 정보를 기반으로 규칙 또는 실행이 필요한 규칙을 찾고 요구한 동작을 수행합니다. 이 동작은 장치 파일을 만들거나 삭제하는 행위가 될 수 있겠지만 펌웨어 파일을 커널 메모리로 불러오는 작업을 실행하는 동작이 될 수도 있습니다.
설치
udev를 업데이트할 때 시스템을 부팅하지 못하게 하는 상황으로 못가도록 막을 수 있는 정보를 보려면 udev 업그레이드 안내서 를 확인하십시오.
커널
udev 에서는 다음 커널 옵션이 필요합니다:
General setup --->
[*] Configure standard kernel features (expert users) --->
[ ] Enable deprecated sysfs features to support old userspace tools
[*] Enable signalfd() system call
Enable the block layer --->
[*] Block layer SG support v4
Networking support --->
Networking options --->
<*> Unix domain sockets
Device Drivers --->
Generic Driver Options --->
() path to uevent helper
[*] Maintain a devtmpfs filesystem to mount at /dev
< > ATA/ATAPI/MFM/RLL support (DEPRECATED) --->
File systems --->
[*] Inotify support for userspace
Pseudo filesystems --->
[*] /proc file system support
[*] sysfs file system support
USE 플래그
포티지는 다른 꾸러미에서 udev 기능을 지원하는 udev
전역 USE 플래그를 인지합니다. 이 USE 플래그 값을 USE 플래그 목록에 추가(모든 리눅스 프로파일 기본값)하면 sys-fs/udev 꾸러미를 자동으로 끌어옵니다:
USE="udev"
Emerge
USE 변수를 설정한 후, 시스템을 업데이트하여 바뀐 설정을 적용하십시오:
root #
emerge --ask --changed-use --deep @world
설정
서비스
부팅 시간에 udev를 시작하려면 sysinit 런레벨에 추가하십시오. 다음 명령을 루트 권한으로 실행하면 처리할 수 있습니다:
root #
rc-update add udev sysinit
고급 설정
규칙
udev에서는 uevents(커널에서 보낸 이벤트)에서 내보낸 값과 발견한 장치의 속성에 일치하는 규칙 모음을 제공합니다. 일치하는 규칙은 아마도 이름일 것이며, 장치 노드를 만들고, 장치를 설치하고 설정할, 조건을 미리 갖춰놓은 프로그램을 실행합니다.
정의 규칙은 다음 두군데에 저장합니다:
- /lib/udev/rules.d/ - 이 디렉터리의 규칙은 각각의 꾸러미가 설치하며, 보통 사용자가 바꾸어선 안됩니다.
- /etc/udev/rules.d/ - 이 폴더에는 최종 사용자가 설정한 규칙이 있습니다. 어떤 새로운 규칙이든 이 디렉터리에 추가해야합니다.
이 디렉터리에서 (.rules로 끝나는) 여러 규칙 파일은 알파벳 및 숫자 순서대로 확인합니다. 규칙 파일 안에서 udev는 uevent와 상태가 일치(장치를 추가하거나 제거하기 때문에 uevent가 됩니다)하는 조건 설정과 실행할 명령을 찾습니다.
이벤트 비교는 다음과 같은 정보를 기반으로 합니다:
- uevent SUBSYSTEM (uevent의 어떤 형식의 장치를 실행했는가)
- 취한 ACTION (추가, 변경, 제거)
- 장치 클래스, 제조사, 다른 장치 정보 등의 하나 이상의 속성(ATTR 또는 ATTRS)
- sd* (SCSI/SATA 디스크) 또는 input* (마우스, 키보드 같은 입력 장치)과 같은 커널 제공 이름 (KERNEL),
- 여러 규칙에 정보를 보낼 때 활용할 하나 이상의 환경 변수 설정(ENV)
이 정보를 기반으로 다음의 조건에 따라, 규칙을 세울 수 있습니다:
- 일부 정보는 (환경 변수로)최종 이벤트와 공유해야 합니다
- /dev에 링크를 만들어야 합니다
- 명령을 실행해야 합니다
udev는 유연한 장치 관리 방식을 허용하는 모든 규칙(첫번째 일치 요소가 있다고 해서 멈추진 않음)에 대해 이러한 동작을 수행합니다.
영속 장치 이름
커널은 장치를 순차적으로 발견하고 udev는 커널의 sysfs 파일 시스템을 미러링하며, 장치에 이름과 숫자를 발견한 순서대로 부여합니다. 따라서 기본적으로 udev에서는 비영속적 장치 이름을 제공합니다. 허나 일부 장치 클래스에 대한 기법에는 다음과 같은 특징이 있습니다:
- udev는 장치 ID, label, UUID, 경로를 기반으로 저장장치 추가 심볼릭 링크를 만듭니다. /dev/disk/by-* 디렉터리를 살펴보십시오. 따라서, 장치 파일 /dev/sda 을 사용하는 대신 /dev/disk/by-label/SOME_LABEL 파일을 활용합니다.
- /dev/input 디렉터리의 입력 장치는 동일합니다.
- 사용자 규칙을 활용은 사용자로 하여금 자체 장치 파일을 만들 수 있습니다.
Predictable network interface naming
The new network interface naming convention is not the same. So the symlinks used by netifrc will need to be re-linked. Use /etc/init.d/net.lo as a link target for whatever interface names need to be added. Be sure to replace <interface_name>
in the commands below with the Ethernet interface names present on the system. It is possible to discover which interfaces exist by running the ip link command:
user $
ip link
Create a symbolic link for the existing interfaces in the /etc/init.d/ directory:
root #
ln -s /etc/init.d/net.lo /etc/init.d/net.<interface_name>
Edit /etc/conf.d/net with any necessary configuration for all interfaces.
Add the script(s) to the default runlevel to have the interface(s) start automatically:
root #
rc-update add net.<interface_name> default
Optional: Disable or override predictable network interface naming
Network device names such as eth0
or wlan0
as provided by the kernel are normally changed on system boot (see dmesg) by the /lib/udev/rules.d/80-net-setup-link.rules udev rule and the NamePolicy in /lib/systemd/network/99-default.link.
This behavior may be disabled in several ways:
- Symlink /etc/systemd/network/99-default.link to /dev/null: ln -s /dev/null /etc/systemd/network/99-default.link.
- Create a lower-numbered .link file in /etc/systemd/network which assigns a different name to the interface.
- Pass
net.ifnames=0
on the kernel command line.
사용법
몇가지 쓸모있는 명령이 있습니다.
- udev 활동을 감시합니다:
root #
udevadm monitor
root #
udevadm monitor
- 주어진 장치에 대한 모든 메시지를 보여줍니다;
root #
udevadm info --query=all --name=/dev/DEVICE_FILE
root #
udevadm info --query=all --name=/dev/DEVICE_FILE
- Show udev info about a given sys path device file (might be obtained via udevadm monitor):
root #
udevadm info --attribute-walk --path=/devices/DEVICE_FILE
- 이더넷 장치에 영속 명칭을 할당하십시오:
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="01:23:45:67:89:ab", NAME="eth6789ab"
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="01:23:45:67:89:ab", NAME="ethernet0"
- After changing a rules file in /etc/udev/rules.d/, either reboot or make udev reload them with:
root #
udevadm control --reload-rules
- For already added devices (plugged USB, etc.), the reloaded rules take effect either after changing the device (replugging USB, etc.) or by making udev request kernel events again via udevadm trigger. Various event actions can be triggered. By default, the change event action is triggered:
root #
udevadm trigger
더 많은 정보는 udevadm 맨 페이지en를 참고하십시오
문제 해결
감시 메시지 기록
udevadm monitor를 실행할 때 모든 메시지를 기록하려면 다음 설정 파일을 수정하십시오:
udev_monitor="YES"
/run/udev/udevmonitor.log에 새 로그 파일을 만듭니다
디버깅 모드
디버깅 모드를 활성화하면 더 많은 기록 메시지를 출력합니다:
udev_debug="YES"
기록 우선순위를 설정하십시오:
udev_log="debug"
/run/udevdebug.log 기록 파일을 만들겠지만 어떤 메시지도 기록하지 않습니다. 최근의 udev 버전에서는 dmesg에 모든 메시지를 기록합니다.
/dev/null 과 /dev/console 장치가 빠졌다고 합니다
일부 udev 버전에서는 udev가 제대로 동작하려면 /dev/null과 /dev/console이 필요합니다. 그러나 자체적으로 만들 수는 없습니다. 이 파일을 직접 만들려면 루트 권한으로 다음 명령을 실행하십시오:
root #
mkdir test
root #
mount --bind / test
root #
cd test/dev
root #
mknod -m 660 console c 5 1
root #
mknod -m 660 null c 1 3
root #
cd ../..
root #
umount test
root #
rmdir test
NIC에 eth0을 할당했는데 eth1으로 바뀌네요
메인 보드에 네트워크 카드가 둘 있는 상황은 ifconfig에서 eth0 또는 eth1을 보여주지 못하는 상호아에 갈 수도 있습니다. dmesg는 eth0으로 발견한 NIC 카드를 보여주고 그 다음 eth1으로 옮깁니다. ifconfig -a 를 실행하면 NIC를 eth1으로 보여줍니다. 이러한 현상은 처음에 커널에서 부여한 이름 때문에 일어납니다. 사용자는 lan0 또는 wireless0 처럼 자유로운 이름을 사용하거나 (udev 197 버전부터 기본값으로 활성화한) 유추 가능 인터페이스 이름을 사용하도록 /etc/udev/rules.d/70-my-network.rules와 같은 개별 설정 규칙 파일을 작성해야 합니다.
또한 이전 버전의 udev에 있던 오래된 파일의 제거를 잊지 마십시오.
root #
rm /etc/udev/rules.d/70-persistent-net.rules /etc/systemd/network/99-default.link
또는 커널 명령행에 net.ifnames=0
키 값을 전달했는지 확인하십시오. 이 설정은 udev의 추정 가능한 장치 명칭을 설정하는 기능을 끕니다.
추가 참조
eudev - 젠투에서 관리하는 udev 포크 버전.
외부 자료
Bug 575718 - Request for council decision regarding virtual/udev default provider - 기본 virtual/udev 제공 대상을 sys-fs/eudev로 바꿈