mdev vs udev, 작은 루트에선
작은 임베디드 루트파일시스템에서 디바이스 노드·핫플러그를 누가 맡을지 고를 때 선택지는 크게 둘입니다. BusyBox mdev(핫플러그 헬퍼 + mdev -s로 /dev 시드)와 풀 udev/systemd-udevd(커널 uevent를 받는 데몬 + .rules 매칭)입니다.
BusyBox docs/mdev.txt는 mdev의 두 기본 용도를 초기 채움(initial population) 과 동적 갱신(dynamic updates) 으로 설명합니다. 둘 다 /sys에 sysfs가 마운트되어 있어야 하고, 동적 갱신에는 커널 핫플러그도 필요합니다. udev(7) 계열은 udevd가 커널에서 디바이스 추가·제거·상태 변경 uevent를 직접 받아, 설정된 규칙과 디바이스 속성을 맞춰 노드·심볼릭 링크·부가 정보를 다룹니다.
이 글은 세 축만 다룹니다. mdev가 적당한 때 · udev가 필요할 때 · 규칙을 옮길 때 주의점. 보드 실측·가격·제휴 창작은 없습니다.
근거는 BusyBox mdev.txt(및 BusyBox 트리의 docs/mdev.txt / examples/mdev.conf), udev(7), systemd-udevd 계열 공개 문서입니다.
mdev가 적당한 때는?
한 줄 답: 루트가 작고 BusyBox가 이미 있으며, 노드 생성·권한·단순 rename/헬퍼면 충분할 때 mdev가 맞습니다. “udev 규칙 파일 그대로”가 필요하면 아닙니다.
BusyBox 문서상 전형적인 init 스케치는 다음과 같습니다.
mount -t proc proc /proc
mount -t sysfs sysfs /sys
echo /sbin/mdev > /proc/sys/kernel/hotplug # 또는 sysctl kernel.hotplug=/sbin/mdev
mdev -s
# 선택: tmpfs /dev, mkdir /dev/pts, mount -t devpts …
| 조건 | mdev 쪽 기울기 | 문서상 이유 |
|---|---|---|
| BusyBox 이미지·initramfs·복구 루트 | 강함 | 별도 udev 데몬 없이 applet 하나로 시드+핫플러그 |
기본 root:root 660 + 소수 권한 조정 | 강함 | /etc/mdev.conf가 선택적; 미매칭 시 기본 0:0 660 |
디바이스 이름 regex·maj/min·$ENV= 매칭 | 가능 | mdev.conf 1필드가 regex / @maj,min / $envvar= |
| rename·심링크·노드 억제 | 가능 | =path, >path(이동+심링크), !(노드 미생성) |
| add/remove 때 짧은 셸 명령 | 제한적 가능 | @/$/* + system(); /bin/sh 필요, stdio는 /dev/null |
| 펌웨어 로드 경로 | 지원 | /lib/firmware/에서 커널이 요청한 파일명을 로드 |
복잡한 ATTRS{} 부모 탐색·ID_* 영속 이름 | 약함 | udev 규칙 모델과 문법이 다름 |
mdev.conf 파싱은 첫 매칭 줄에서 멈춥니다. 줄 앞 -가 있으면 계속 읽습니다. 기본값을 바꾸려면 .* uid:gid mode 같은 전체 매칭 줄을 둡니다(문서 예시).
하지 말 것: “우리 보드에서 mdev가 N ms 더 빠르다” 같은 창작 실측으로 일반화하기. 선택은 루트 예산 × 필요한 매칭 깊이로 합니다.
udev가 필요할 때는?
한 줄 답: 속성 기반 매칭·영속 이름·배포판 .rules·udevadm 워크플로가 계약일 때 udev/systemd-udevd가 필요합니다. 작은 루트라도 그 계약이면 mdev로 대체하지 않습니다.
udev는 규칙 파일을 /usr/lib/udev/rules.d, /run/udev/rules.d, /etc/udev/rules.d 등에서 모아 파일명 사전순으로 처리합니다(동일 파일명은 경로 우선순위로 대체). 매칭 키는 KERNEL, SUBSYSTEM, ATTR{…}, 부모를 보는 ATTRS{…}/KERNELS/SUBSYSTEMS, ENV{…}, PROGRAM, RESULT 등이고, 결과로 NAME, SYMLINK, OWNER/GROUP/MODE, RUN 등을 부여합니다.
| 조건 | udev 쪽 기울기 | 이유 |
|---|---|---|
| USB/시리얼/디스크를 ID·경로 기반 심링크로 고정 | 강함 | ATTRS{idVendor} 등 + SYMLINK+=가 일상 패턴 |
벤더·배포판이 제공하는 .rules를 그대로 씀 | 강함 | mdev.conf와 문법이 호환되지 않음 |
udevadm test / monitor / control --reload-rules | 강함 | 디버그·재적재 계약이 udev 쪽 |
| systemd 기반 이미지에서 장치 유닛·Wants 연동 | 강함 | systemd-udevd + 장치 프로퍼티·태그 모델 |
PROGRAM/RUN으로 짧은 전경 작업 | 가능(주의) | 문서는 오래 도는 프로그램 금지; 긴 작업은 별 경로 |
| 노드만 만들고 권한만 바꾸면 됨 | 과함 | mdev로도 충분한 경우가 많음 |
요지: udev의 가치는 “노드를 만든다”만이 아니라 속성 그래프를 읽어 안정적인 이름·권한·후속 액션을 규칙으로 고정하는 데 있습니다. 그 규칙 집합이 제품 계약이면 작은 플래시라도 udev를 넣는 편이 맞습니다.
규칙을 옮길 때 주의점은?
한 줄 답: 1:1 기계 번역 금지. mdev.conf와 udev .rules는 매칭 모델·평가 순서·실행 환경이 다릅니다. 필요한 의도(누구 소유·어떤 이름·언제 헬퍼)를 다시 적습니다.
| 축 | BusyBox mdev | udev / systemd-udevd |
|---|---|---|
| 설정 | /etc/mdev.conf (선택) | *.rules 여러 디렉터리, 사전순 |
| 매칭 중단 | 첫 매칭에서 정지(앞에 -면 계속) | 여러 규칙이 연속 적용(할당·+=/:= 의미) |
| 키 | 디바이스명 regex, @maj,min, $ENV= | KERNEL/SUBSYSTEM/ATTR/ATTRS/ENV/PROGRAM… |
| 이름 변경 | =path / >path | NAME, SYMLINK+= |
| 헬퍼 | @/$/* → system() 셸 | RUN{program} 등; 짧은 전경; 절대 경로 권장 |
| 이벤트 경로 | /proc/sys/kernel/hotplug → mdev | 데몬이 netlink uevent 수신 |
| 순서 | /dev/mdev.seq로 SEQNUM 직렬화 옵션 | 데몬 큐·규칙 엔진(모델이 다름) |
이관 체크리스트(문서에 맞춘 실무 스케치):
1. 의도를 한 줄로: owner/mode? stable name? helper on add?
2. udev 규칙이 ATTRS/부모/ID_*에 의존하면 → mdev로 “비슷한 regex” 금지
3. mdev로 남기면: regex·첫매칭·- 지속 매칭을 다시 설계
4. 헬퍼: mdev는 /bin/sh·stdio=/dev/null; udev RUN은 장시간 프로세스 금지
5. 핫플러그 경로를 둘 다 켜 두지 말 것(헬퍼 vs udevd 충돌)
6. 타깃에서 실제 add/remove로 스모크 (호스트-only 검증 금지)
주의:
.rules파일을mdev.conf에 붙여 넣는 것은 동작하지 않습니다. 반대로 mdev의@modprobe "$MODALIAS"한 줄을 udev의 풍부한 모듈 로드·프로퍼티 규칙과 같다고 보지 마십시오.
자주 묻는 질문
mdev -s만으로 핫플러그까지 되나요?
아닙니다. mdev -s는 부팅 중 이미 생긴 장치를 /sys 기준으로 시드합니다. 이후 동적 추가·제거는 핫플러그 헬퍼로 mdev를 등록해야 합니다(echo /sbin/mdev > /proc/sys/kernel/hotplug 등, 문서 예시).
펌웨어는 mdev에서도 되나요?
BusyBox 문서는 펌웨어를 /lib/firmware/에 두고, 커널이 요청한 파일명을 mdev가 로드한다고 설명합니다. 파일명 자체는 커널 쪽에 하드코딩되어 있으므로 커널/드라이버 문서를 확인합니다.
udev 없이 systemd만 쓰면 장치가 자동인가요?
장치 관리의 주역은 보통 systemd-udevd와 규칙입니다. “systemd를 썼다”와 “udev 규칙 계약이 있다”는 별개로 설계합니다.
둘을 동시에 hotplug 헬퍼로 등록해도 되나요?
권장하지 않습니다. 커널 핫플러그 헬퍼 경로와 udevd의 uevent 처리가 같은 사건을 이중으로 다루면 노드·권한이 충돌합니다. 이미지당 하나의 장치 관리자를 고르십시오.
무엇을 기억하면 되나?
작은 루트·단순 노드/권한 → mdev, 속성·영속 이름·배포판 rules·udevadm 계약 → udev. 규칙 문법은 이식되지 않습니다. 의도만 옮기고 타깃에서 스모크하십시오. 보드 창작 실측·제휴 없습니다.
출처 (Sources)
- BusyBox docs/mdev.txt — 시드·핫플러그, mdev.conf, 펌웨어, SEQNUM
- BusyBox examples/mdev.conf — 샘플 문법·권한 예시
- udev(7) — 규칙 키, 디렉터리,
PROGRAM/RUN제약 - systemd-udevd.service — 현대 데몬 측 진입점