장치 파일 시스템의 진화: devfs의 핵심 역할
Linux 커널 2.4 시대(2001년)에 등장한 devfs는 /dev 디렉터리 관리의 혁신을 이끌었습니다. 기존 수동 생성 방식의 한계를 해결하기 위한 가상 파일 시스템으로, 장치 연결 시 자동으로 파일 노드를 생성하고 해제하는 기능을 제공했습니다.
기존 /dev 관리의 문제점
- 수동 생성 불편성:
mknod /dev/ttyS0 c 4 64와 같은 명령으로 장치 파일을 직접 생성해야 했습니다. - 장치 번호 충돌: 주 장치 번호(4=시리얼, 8=SATA)가 중복되면 드라이버 로드 실패 발생.
- 핫플러그 미지원: USB 드라이브 연결 시
/dev/sdb1생성을 수동으로 확인해야 했습니다.
devfs는 이러한 문제를 해결하기 위해 장치 드라이버와 실시간 통신하는 가상 파일 시스템으로 설계되었습니다. 디스크 공간을 사용하지 않고 메모리 내 동적으로 장치 노드를 관리합니다.
핵심 기능 분석
1. 동적 장치 노드 관리
장치 연결 시 드라이버가 devfs에 알리면 자동 생성, 해제됩니다.
# 예시: USB 드라이브 삽입 시
usb-storage 드라이버 → devfs에 "8, 16" 주/부 번호 전달
devfs → /dev/sdb1 생성 (기본 권한 rw-rw----)
2. 장치 번호 자동 할당
드라이버가 주 장치 번호를 요청하면 devfs가 충돌 검사 후 할당:
// 드라이버 로딩 시
devfs_register(NULL, "serial0", DEVFS_FL_CHAR, 192, 0, 0660, NULL);
// 192: ch340 드라이버 주 번호, 0: 첫 번째 장치
3. 유연한 권한 관리
기본 권한 설정과 devfsd를 통한 커스터마이징:
# /etc/devfsd.conf 예시
REGISTER ^serial0$ PERMISSIONS root serialgroup 660
사용자 그룹 serialgroup에 추가하면 일반 사용자도 접근 가능.
4. 계층적 디렉터리 구조
기존 /dev 혼잡 구조 대신 유형별 분류:
/dev/serial/: 시리얼 장치/dev/block/: 블록 장치/dev/usb/: USB 장치
작동 메커니즘 (USB 시리얼 예시)
- 드라이버 등록
ch340드라이버가devfs_register()호출:
devfs_register(NULL, "serial0", DEVFS_FL_CHAR, 192, 0, 0660, NULL);
-
노드 생성 devfs가
/dev/serial/serial0생성 및 정보 기록 -
사용자 접근
open("/dev/serial/serial0", O_RDWR)시 드라이버의open()함수로 전달 -
장치 분리 드라이버가
devfs_unregister("serial0")호출로 노드 삭제
제한 사항과 대체 기술
devfs는 다음 한계로 udev로 대체되었습니다:
- 장치 번호 고정: 주 번호(192)가 드라이버에 묶여 확장성 부족
- 구성 복잡성:
devfsd.conf규칙 문법 난해 - 핫플러그 취약성: 동시 장치 삽입 시 처리 실패 가능성
- 이름 불일정성: 재부팅 후
/dev/serial0→/dev/serial1변경
udev는 sysfs 기반으로 유일한 하드웨어 ID를 활용해 장치 이름을 고정합니다. 예시:
SUBSYSTEM=="tty", KERNEL=="serial[0-9]*", GROUP="serialgroup", MODE="0660"
역사적 의미
devfs는 장치 관리의 자동화를 처음 도입한 기술로, udev의 설계 철학을 정립했습니다. 현대 Linux 시스템에서 udev가 대체했지만, "장치 파일 동적 관리"라는 핵심 개념은 여전히 적용됩니다.