난이도 : 초급 Daniel Robbins, President/CEO, Gentoo Technologies, Inc.
2001 년 9 월 01 일 "고급 파일시스템 개발자 가이드" 네 번째 시리즈이다. 이번에는 디바이스 관리 파일시스템인 devfs의 중요성과 점을 설명한다. 시스템에 devfs를 효과적으로 설치하는 방법도 설명되어 있다.
devfs
Devices, devices everywhere
Devfs 또는 다바이스 파일시스템(Device Filesystem)은 /dev를 설치하는 모든 블록과 문자 디바이스를 관리하는
새로운 방식을 제시한다. 여러분도 알고 있듯이 전형적인 /dev 트리에는 수 백개의 블록과 문자들의 스페셜 파일(special
file)들이 포함되어있다. 그들 모두 root 파일시스템에 있다. 이러한 스페셜 파일들이 커널 디바이스와 쉽게 상호 작동하기
위해서 사용자 공간 프로세스에 적용된다. 이러한 스페셜 파일에 대한 작동을 수행함으로서, X server는 비디오 하드웨어(video
hardware)에 액세스 할 수 있고, fsck는 파일시스템 검사를 수행할 수 있으며, lpd는 직렬
포트를 통해 프린터로 데이터를 전송할 수 있다.
디바이스 관리 문제
그러나 디바이스 스페셜 파일들이 그 자체로 좋은 것이긴 하지만 전형적인 Linux 시스템들은 이런 스페셜 파일들을 효과적이지
않은 방식으로 관리한다. 오늘날 Linux는 다양한 많은 종류의 하드웨어를 지원한다. 이것이 의미하는 것은 /dev에 이러한
디바이스들을 나타내는 수 백개의 스페셜 파일들을 가질 수 있다는 뜻이 된다. 뿐만 아니라, 이런 스페셜 파일의 대부분은 시스템상의
기존 디바이스에 매핑되지 않는다. (새로운 하드웨어/드라이버를 시스템에 추가할 경우 매핑할 필요가 있다).
devfs가 이러한 /dev 관리상의 문제점들을 해결하는 방법을 이해하기 위해 디바이스 드라이버의 관점에서 devfs를 살펴보자.
디바이스 관리 특징
devfs를 좀 더 잘 이해하려면 일단 디바이스 드라이버의 관점에서 devfs가 이러한 문제들을 어떻게 변화시키는 지를 이해하는
것이 중요하다. 일반적으로 (devfs가 없을 때에는), 커널 기반의 디바이스 드라이버는 register_blkdev()
또는 register_chrdev()을 호출하여 나머지 시스템에 디바이스를 등록한다. 이것이 블록 또는
문자 디바이스를 등록하는지에 따라 다르다.
넘버(number) 가져오기
개발자가 드라이버를 다른 세계와 공유하길 원한다면 (대부분의 Linux 개발자들은 이 같은 접근 방식을 택한다), 난데없이 메이저
넘버를 가져오거나 메이저 넘버 할당을 사용하면 안된다. 대신, Linux 커널 개발자와 연결하여 특정 디바이스가 "공식적인"
메이저 넘버로 지정될 수 있도록 해야 한다. 그렇게 되면 Linux 세계를 통해서 이 특별한 디바이스는 특별한 메이저 넘버와
연결될 것이다.
특별한 디바이스와 상호작용 하기 위해서 "공식적인" 메이저 넘버를 갖는 것은 중요하고 관리자는 /dev에
스페셜 파일을 만들어야 한다. 디바이스 노드(스페셜 파일)가 만들어지면, 이것은 커널에 의해 내부에서 사용되는 똑같은 메이저
넘버를 작동시켜야 한다. 그러한 방식으로 프로세스가 디바이스에 대한 작동을 수행할 때 커널은 어떤 디바이스 드라이버가 참조되는
지를 알 수 있다. 스페셜 파일에서 커널 드라이버로의 매핑은 non-devfs 시스템과 관련이 없는 실제 디바이스 이름이 아닌
메이저 넘버에 의해 이루어진다.
기존의 문제들
불행하게도 이러한 종류의 접근 방식에는 확장성 문제가 많이 있다. 이것은 공식적인 메이저 넘버를 받기 위해 커널 개발자들에게
접촉해야 하는 디바이스 드라이버 개발자들에게 고통일 뿐아니라, 이러한 메이저 넘버를 할당한 방법을 생각해야 하는 커널 개발자들에게도
성가신 일이다. 이러한 태스크는 기업 LAN 상에서 정적인 IP 주소의 할당을 트래킹 해야하는 sysadmin의 작업과 흡사하다.
재미있는 일은 아니다. sysadmin이 관리의 짐을 줄이기 위해 DHCP를 이용할 수 있는 것과 같이 디바이스를 등록하는 데에
비슷한 접근 방법이 있다면 좋을 것이다.
이 뿐만아니라 Linux는 메이저 넘버와 마이너 넘버를 다 써버린다. 이 문제는 메이저와 마이너 넘버에 사용되는 비트 넘버를
확장함으로서 해결할 수 있는 반면 이러한 메이저 넘버 매핑을 유지하는 것이 고통이다. 여기 devfs라는 해결책이 있다.
devfs 연구
devfs_register()
devfs가 이같은 모든 문제들을 풀어가는 방법에 대해서 간략하게 보도록 하자. 일단 devfs가 올바르게 설정되면 devfs
지원이 커널에 추가되고 스크립트를 시작하기 위해 많은 변경 트릭을 수행하게 된다. 수퍼유저는 시스템을 재부팅한다. 그리고 나서
커널은 부팅을 시작하고 디바이스 드라이버는 나머지 시스템에 디바이스를 등록하기 시작한다. non-devfs 시스템 상에서는 register_blkdev()
과 register_chrdev() 호출 (메이저넘버와 함께 제공됨)이 사용되었다는 것을 기억할 것이다. 하지만
devfs가 가능하기 때문에 디바이스 드라이버는 새롭고 향상된 커널 호출을 사용하여 devfs_register()라고
하는 디바이스를 등록한다.
Devfs 실행하기
일단 모든 디바이스 드라이버가 시작되고 커널에 적절한 디바이스가 등록되면 커널은 /sbin/init 을 시작하고
시스템 초기화 스크립트는 실행을 시작한다. 부트 프로세스 초기에 (파일시스템 체크 이전) rc 스크립트는 /dev에 devfs
파일시스템을 마운트한다. 여기에는 devfs 네임스페이스의 구현이 포함된다. /dev가 마운트 된 후에 등록된 모든 디바이스들(예를
들어 /dev/foo0)은 non-devfs 시스템 상에서와 마찬가지로 액세스 된다. 그것이 액세스 될 때 커널은
메이저 넘버가 아닌 devfs 디바이스 이름으로 적절한 디바이스 드라이버로 매핑한다.
devfs의 장점
devfs는 많은 작업을 훨씬 수월하게 한다. 부트 로더, initrd, loopback 파일시스템으로 구성된 Linux bootable(부팅
가능) CD-ROM을 만들어야 한다고 가정하자. CD가 부팅되면, 부트로더는 커널과 initrd를 로딩하고 그런 다음 initrd
에 있는 /linuxrc 스크립트는 커널에 의해 실행된다. /linuxrc의 주요한 태스크는 CD를
마운트하여 loopback 파일시스템이 자체적으로 마운트되고 액세스 될 수 있도록 하는것이다.
참고자료
필자소개  | 
| Daniel Robbins는 Gentoo Technologies, inc.의 사장/CEO이다. 또 PC용 고급 Linux인 Gentoo
Linux의 창설자이자, 차세대 Linux 포트 시스템인 Portage 시스템의 창시자이다. 또한 Macmillan사에서
출판하는 Caldera OpenLinux Unleashed, SuSE Linux Unleashed, Samba Unleashed에
집필활동을 하고 있다. |
기사에 대한 평가
|