난이도 : 초급 Daniel Robbins, President/CEO, Gentoo Technologies, Inc
2001 년 10 월 01 일 Linux 2.4에는 Reiserfs, XFS, GFS와 같은 새로운 파일시스템 기능이 추가되었다. 파일시스템은 좋은 것이긴 하지만 실제 생산환경에 적용하는 방법에 대해서는 정확히 모르고 있는 것도 사실이다. 이 시리즈를 통해 필자는 Linux 2.4에 새롭게 향상된 파일시스템을 설치하는 과정을 설명한다. 이번에는 devfs를 시스템에 실행시키기 위한 준비 작업에 대해 설명한다.
Part 4에서 devfs가
무엇인지, 그리고 디바이스 관리 문제를 해결하는 방법에 대해서 살펴보았다. 이제는 devfs를 시스템에 실행시켜보자. 이
글에서는, 시스템을 "devfs-ready 시스템"으로 만드는 과정을 설명하겠다. 다음 글에서는 devfs로
실제 변환을 할 것이다. 각 단계를 완벽히 숙지하기 바란다. devfs로의 전향 할 시점이 멀지 않았다.
필요조건
devfs를 실행시키기 위해서는, Linux 2.4 (2.4.6 또는 2.4.8도 무방하다)와 glibc 2.1.3 버전을 사용해야
한다. Xfree86 4.0을 사용할 것을 권장한다. 또는 Xfree86 4.1을 업그레이드 하라.
비상용 bash
다음 글에서, Linux 시스템에서 부팅에있어서 치명적인 영향을 끼칠 수 있는 부분에 변경을 할 예정이다. 무엇인가 잘못되었을
경우 부팅 프로세스에 심각한 영향을 초래할 수 있기 때문에 시스템을 시작시키고 bash 쉘을 실행시키는
방법 부터 설명하겠다. init 스크립트나 /sbin/init 와 관련한 문제로 인해서 시스템이 부팅되지
않을 경우 비상 부팅 프로세스를 사용할 수 있다.
가장 쉬운 비상 부팅 방법은 부팅 타임에 GRUB 이나 LILO를 사용하여 init=/bin/bash
옵션을 커널로 전달하는 것이다. GRUB을 이용하면 필요한 만큼 옵션을 상호적으로 전달 할 수 있다. 실시간으로 현재의 메뉴
엔트리를 에디팅(editing) 하기 위해 e를 입력한다. LILO의 경우, 진행하기 전에 커널 부팅 옵션 전달
방법을 반드시 설정하고, 필요할 경우 새로운 "비상" LILO 부팅 옵션을 만든다.
프로세스
기본적인 "구급(rescue)" 프로세스는 다음과 같다. 우선 init=/bin/bash
를 커널로 전달한다. 커널이 부팅되면 첫 번째 프로세스로서 정상적인 /sbin/init 대신 /bin/bash
가 시작 될 것이다. 로그인 하기 위한 프롬프트 없이 root 배쉬 프롬프트가 나올 것이다:
주의:
root bash 프롬프트를 보게 되더라도, root 파일시스템이 마운트(읽기 전용)된다. 기존의
파일시스템이 완벽하게 언마운트 되지 않았다면 그것들을 우선 fsck 한다. root 파일시스템에서 fsck
-a 를 수행된 후 fsck -R -A -a 으로 다른 파일시스템들을 살펴야 한다:
# fsck -a /dev/hda1
# fsck -R -A -a
|
파일시스템이 영속적인 것이기 때문에 읽기-쓰기(read-write)로 root 파일시스템을 간단히 리마운트 할 수 있고 다음과
같이 /proc을 마운트 할 수 있다:
# mount / -o remount,rw
# mount /proc
|
그런 다음, 다른 파티션에 있는 중요한 파일시스템 트리를 마운트한다. 예를 들어, 다른 파티션에 /usr가 있다면 다음과
같이 한다:
에디터를 실행하는 것보다 더 나은 것을 실행할 계획을 가지고 있다면 swap을 활성화시키는 것도 좋은 생각이다. emacs를
사용하고 있다면 더욱 필요할 것이다.:)
이제, 에디터를 실행하고 부팅 문제를 해결하기 위해 어떤 파일이든지 편집 할 수 있다. 그런 다음, 그것들을 마운트하기 위해
읽기 전용으로 파티션을 리마운트 한다. 예를들어 개별적인 /usr 파티션을 가지고 있다면 다음을 입력하여 파일시스템을 영속적으로
(재부팅이 준비된) 갖게되는 것이다:
# mount /usr -o remount,ro
# mount / -o remount,ro
|
이제 안전하게 재부팅 할 수 있다. 부팅 문제는 해결되었고 정상적인 LILO 또는 GRUB 옵션으로 시스템을 실행시킨다:
devfs를 위한 준비작업
Devfs 설정
비상사태가 발생할 경우, 대처 방법에 대해서도 알고 있기 때문에 devfs를 위한 시스템을 실행할 준비가 되었다고 볼 수 있다.
다음 글에서는 Linux로의 약간 복잡한 변경 작업을 수행할 것이다. 이것이 필요한 이유는 커널에서 매우 간단한 devfs 기능을
이용할 수 없기 때문이다. 또한 devfsd (디바이스 관리 데몬)를 특별 모드에 설치하여 디바이스 권한과
소유권을 백업하고 저장 할 수 있도록 할 것이다. 새로운 시스템을 완벽하게 작동시키기 위해서는 많은 트릭이 필요하다. 하지만
그 결과에 분명히 만족할 것이다.
Devfs 커널 지원
시스템에 devfs를 실행시키는 첫 번째 단계는 쉽다: 커널에 devfs 지원을 가능토록 할 필요가 있다. 이를 위해서는 2.4
시리즈 커널이 필요하다. make menuconfig 또는 make xconfig을
사용하여 Code maturity level options 섹션으로 옮기고 Prompt for development
and/or incomplete code/drivers 옵션을 사용가능하도록 한다. 그런 다음, File systems
커널 설정 섹션으로 가서 /dev file system support (EXPERIMENTAL) 옵션을 찾는다.
이것을 작동시킨다. 방금 작동시킨 옵션 밑에 두 개의 추가 옵션이 있을 것이다. 첫 번째 것은 커널이 부팅될 때 devfs가
/dev 에 자동적으로 마운트 될 것인지를 제어하는 것이다. 이 옵션을 실행시키지 말라; 특별한 스크립트를 사용하여 수동으로
/dev를 마운트 할 것이다. 두 번째 옵션인, Debug devfs는 실행 불가로 된다.
Disable /dev/pts
File systems 커널 설정 섹션이 스크린상에 있는 동안, 이것을 실행시켜야 한다면 /dev/pts file
system for Unix98 PTYs에 대한 지원을 수행하지 말라. Devfs는 비슷한 기능을 제공한다. 그래서 devpts
파일시스템이 더 이상 필요하지 않다. 이제 커널 설정을 저장하자; 새로운 커널을 컴파일 하고 설치 할 것이다. 다음 단계로 가기
전에, /etc/fstab에 /dev/pts 엔트리가 있는지를 점검하라. 있다면 부팅 타임에 더 이상
마운트 되지 않도록 주석을 제거하라.
기타 설정 팁
그런 다음 /etc/securetty 파일을 에디터에 로딩(loading)한다. 이 파일은 login
에 의해 사용되고, tty 를 지정하여 root 사용자가 로그인에 사용할 수 있도록 한다. 일반적으로,
이것은 디바이스 tty1 에서 tty12 까지, 라인당 한 개씩 포함하고 있다.
이 파일을 devfs용으로 준비시키기 위해서, tty용으로 적절한 devfs 스타일로 이름을 추가해야 한다. 기존의 tty?
이름들을 저장하라. devfs를 작동시키지 않고 부팅할 경우를 대비해서이다. /etc/securetty의 밑에 다음의 라인을
추가시킨다.
vc/1
vc/2
vc/3
vc/4
vc/5
vc/6
vc/7
vc/8
vc/9
vc/10
vc/11
vc/12
|
devfsd
다음 단계는 devfsd (devfs helper 데몬)을 시스템에 설치하는 것이다. Devfsd는 "old-style"
호환 디바이스 노드를 만드는 것을 관리하고 드라이버가 등록/등록해지 되었을 때 자동화된 기능을 수행한다. 그리고 root 파일시스템
상의 디렉토리에 대한 디바이스 권한과 소유권에 대한 변경을 백업을 관리한다. devfsd를 설치하려면 가장 최신의 devfsd
tarball을 다운로드한다.(참고자료):
# tar xzvf devfsd-1.3.16.tar.gz
# cd devfsd
# make
|
devfsd가 컴파일 되고 설치 준비가 되었다. man 페이지가 /usr/man에 저장되어 있다면, make install을
타이핑한다. FHS호환 시스템을 사용하고 있고 man 페이지가 /usr/share/man에 있다면, make mandir=/usr/share/man
install을 타이핑한다.
 |
설정 시 유의사항
호환 디바이스를 완전히 지원하기 위해 devfsd 설정할 때에는 tty?
엔트리가 적절하다. 이러한 접근 방식을 이용하면, 문제가 생기고 devfsd 가 시작하지 않더라도
수퍼유저는 login: 프롬프트에서 아무런 문제없이 devfs를 이용하여 로그인할 수 있다.
|
|
새로운 커널 실행하기
최근에 설정된 파일을 컴파일하고 설치한다. 정상적으로 부팅되어야 하고 devfs 지원이 된다고 해도 현재 실행하고 있는 것과
차이가 없다. 새로운 커널이 설치되면 시스템을 재부팅한다.
Devfs 설정 방법
devfs 변환을 위해 시스템이 준비되었다. 자세한 사항은 다음 글에서 다루겠다. 우선 우리가 사용하고 있는 접근방식에 익숙해
질 필요가 있다. 영속적인 권한과 소유권과 같은 devfs 기능을 사용하고자 한다면 많은 트릭이 필요하다.
커널 자동화 문제
devfs 시스템을 만드는 데에는 다양한 방법이 있다. 하나는 부팅 시 커널이 /dev에 자동적으로 마운트 되도록 하는 것이다.
이러한 접근방식은 언뜻 보기에는 이치에 맞는 것 처럼 보인다. 왜냐하면 모든 devfs 스타일의 디바이스는 모든 프로세스에 가능하기
때문이다. 심지어 첫 번째 프로세스인 /sbin/init도 가능하다. 하지만 이러한 접근 방식에도 문제점은
있다. devfs가 모든 "새로운 스타일"의 디바이스를 제공하더라도 기존의 디바이스 노드는 devfsd
데몬에 의해 만들어진다. devfsd는 커널에 의해 시작되지 않는다. 부팅시에 커널을 마운트 했더라도
/sbin/init 시작되면서 디바이스 노드의 일부 세팅이 남겨진다. devfsd를
적시에 실행시키기 위해서는 시스템 초기화 스크립트에 약간의 조정 (tweak)이 필요하다. 이러한 접근 방식은 많은 트릭이 필요하고
많은 문제점을 가지고 있다.
커널 마운팅 접근방식의 문제점은 devfsd가 기존의 /dev 디렉토리의 콘텐츠에 액세스 할 때 가장
잘 실행된다는 것이다. 일반적으로 devfs가 /dev에 마운트되기 전에 /dev를 다른 위치에 바인드 마운팅하여 기존 디바이스에
액세스 할 수 있다.
기존의 /dev의 콘텐츠는 devfs가 마운트 된 후에도 /dev-state에서 여전히 액세스 가능하다. devfsd는
영속 디바이스 저장을 위해 디렉토리를 사용할 수 있다. 바인드 마운팅(bind mounting)을 하지않고, /dev에 devfs를
마운팅하면 그것들을 덮기 때문에 /dev의 기존 콘텐츠에 액세스 할 수 없다. 그리고 이것은 커널에서 devfs를 마운트 할
때 생기는 문제이다. 프로세스가 시작하기 전에 커널이 /dev에서 devfs 파일시스템을 마운트 하면 바인드 마운트
할 기회를 얻지 못하고 /dev의 원래의 내용은 완벽히 숨겨진다. 별로 좋은 방법은 아니다. (Part
3 참조)
최상의 솔루션
/sbin/init이 시작되면 바로 완벽한 세트의 디바이스 노드를 갖추고, devfs가 마운트 되기 전에
다른 위치에 /dev를 바인드 마운트하는 기회를 얻게 된다면 가장 이상적일 것이다.
init wrapper
/dev에서 /dev-state 까지 바인드 마운트를 수행하기 위해 커널 패치를 추가하는 것도 하나의 방법이다. 이것은 가능하고도
쉬운 일이지만 설치 할 모든 새로운 Linux 커널을 수동으로 패치해야 한다는 불편함이 있다. 따라서 devfs의 근본적인 문제를
해결하는 가장 좋은 방법은 init wrapper를 사용하는 것이다. 특별한 애플리케이션의 경우 init wrapper는
/sbin/init 대신 배쉬 스크립트가 될 수 있다. 우리의 init은 /sbin/init.system으로
이름을 바꿨다. 다음은 init wrapper 예제이다:
#!/bin/bash
mkdir -f /dev-state
mount --bind /dev /dev-state
mount -t devfs none /dev
devfsd /dev
exec /sbin/init.system
|
wrapper가 첫 번째로 한 일은 /dev-state가 존재한다는 것을 확인하는 일이다. 그런다음 /dev 트리가 /dev-state로
바인드 마운트되어서, /dev의 콘텐츠를 /dev-state 디렉토리를 통해 사용 할 수 있다. 그리고 나서 devfs 파일시스템은
/dev의 상단에 마운트 되고 devfsd 를 시작하여 호환 디바이스가 devfs를 이용하여 자동으로
등록된다. 마지막으로, 원래의 /sbin/init을 "exec"
한다. 이것은 /sbin/init.system 으로 이름이 바뀌었다. exec 명령어는 init.system이
실행 배쉬 프로세스를 대체하도록 한다. 이는 배쉬 스크립트가 종료되고 init.system 이 process
ID 1(init process의 프로세스 ID)을 상속받는다는 것을 의미한다. /sbin/init.system
이 시작되면 devfs가 현재 완벽히 작동한다는 것을 제외하고 시스템은 정상적으로 부팅된다. init wrapper를 사용하여
커널을 패치하고 시작 스크립트를 변경 해야 하는 수고를 덜 수 있었다.
참고자료
필자소개  | 
| Daniel Robbins는 Gentoo Technologies, inc.의 사장/CEO이다. 또 PC용 고급 Linux인 Gentoo
Linux의 창설자이자, 차세대 Linux 포트 시스템인 Portage 시스템의 창시자이다. 또한 Macmillan사에서
출판하는 Caldera OpenLinux Unleashed, SuSE Linux Unleashed, Samba Unleashed에
집필활동을 하고 있다. |
기사에 대한 평가
|