4. 루트 파일시스템의 제작

루트 파일시스템을 만들 때는 시스템 구동에 필수적인 파일들을 고르는 작업이 필요합니다. 이 절에서는 압축된 루트 파일시스템의 제작법을 설명합니다. 별로 많이 쓰이지는 않지만 압축안된 파일시스템을 디스켓상에 만들어 직접 루트로 마운트시키는 방법도 가능합니다. 이 방법은 9.1절 부분에서 설명합니다.

4.1. 개요

루트 파일시스템은 풀 사이즈의 완전한 리눅스 시스템을 지원하기 위한 모든 것을 갖추어야 합니다. 이를 위해서는 리눅스 시스템의 최소요건만큼은 루트디스크에 반드시 구비되어야 합니다.

물론, 어떤 시스템이 됐든간에 원하는 프로그램을 실행시킬 수 있을 때 비로소 이용가치가 있는 거겠지요. 그런 점에 미루어 볼때, 루트 디스켓으로 다음과 같은 작업을 할수 있어야 할것입니다.

이제 압축 파일시스템을 어떻게 만드는지 설명하겠습니다. 압축 파일시스템이라는 말은 파일시스템이 디스크에 압축된 상태로 있다가 부트시에 램디스크로 압축이 풀리면서 복사되는 것을 말합니다. 압축 파일시스템을 쓰면 표준 1440K 디스켓상에 훨씬 많은 파일(약 6메가 가량)들을 넣을 수 있습니다. 파일시스템이 디스켓의 용량보다 훨씬 크기 때문에, 디스켓 위에 파일 시스템을 직접 작성하는 것은 불가능합니다. 일단 다른 곳에서 파일 시스템을 완전히 만든 후, 이를 압축한 다음, 그 압축된 것을 디스켓에 복사해넣어야 합니다.

4.2. 파일 시스템 만들기

압축된 루트 파일시스템을 만들기 위해서는 압축전에 먼저, 필요한 모든 파일들을 담을 수 있는 충분한 크기의 빈 공간이 필요합니다. 약 4 메가바이트 가량을 담을수 있는 디바이스가 필요합니다. 몇 가지 방법이 있습니다.

위에서 말한 세가지 방법 중 어느 하나를 선택하기로 마음먹었다면 이제 DEVICE 에 다음 명령을 주세요.
   dd if=/dev/zero of=DEVICE bs=1k count=4096

이 명령은 디바이스의 내용을 모두 0 으로 채웁니다.

중요: 디바이스를 0 으로 채우는 작업이 중요한 이유는 디바이스상의 파일 시스템은 나중에 압축되게 되므로 사용되지않는 모든 영역은 0 으로 채워야 최대한으로 압축할수 있기 때문입니다. 파일시스템상에서 파일을 지우거나 이동시킬때는 이 점을 꼭 명심하십시요. 파일시스템은 해당 블록의 할당을 회수함으로서 화일을 삭제, 이동시킵니다만 이때 그 블록의 내용까지 다시 0 으로 채워주는 것은 아닙니다. 파일의 삭제및 복사가 빈번한 경우, 최종적인 당신의 압축 파일시스템은 훨씬 커져버릴 수 있습니다.

그 다음, 파일시스템을 만듭니다. 리눅스 커널을 자동으로 램디스크로 복사되도록 해주는 루트 디스크용 파일시스템은 minix 와 ext2 파일시스템 단 두가지 뿐입니다. 이중에서 ext2 파일시스템이 보다 선호되는 파일 시스템입니다. ext2 를 쓰면 -N 옵션을 주어 디폴트값보다 더 많은 inode 를 설정할 수 있어 편리합니다. -N 2000 정도로 설정하면 inode 가 부족해지는 일은 없을 것입니다. 그밖에, /dev 디렉토리 밑의 불필요한 파일들을 제거해서 inode 를 절약하는 방법도 있습니다. mke2fs 는 디폴트로 1.44 Mb 디스켓에 360 개의 inode를 생성합니다. 필자가 쓰는 복구용 루트디스켓에는 120개 의 inode 가 있고 이 정도로 충분하지만 만일 당신이 /dev 디렉토리내의 디바이스 파일들을 전부 포함시키려 한다면 필요한 inode 수는 360 개를 쉽게 초과해 버립니다. 압축 루트파일시스템을 사용하면 보다 큰 파일시스템을 담을 수 있고 따라서 디폴트로 보다 많은 inode를 쓸 수 있습니다만 그래도 역시 파일의 수를 줄이거나 inode 수를 늘일 필요가 있을 것입니다.

따라서 다음과 비슷한 명령이 필요합니다.
mke2fs -m 0 -N 2000 DEVICE

(루프백 디바이스를 사용한다면 위의 DEVICE 대신 파일이름을 써야 합니다.)

mke2fs 명령은 자동으로 사용가능한 용량을 인지하고 그에 맞춰 파일시스템을 설정합니다. "-m 0" 파라메터는 mke2fs 로 하여금 root 용 공간을 할당하지 못하게 함으로써 사용가능한 디스크 용량을 더 많이 확보합니다.

이제 디바이스를 마운트하세요.
mount -t ext2 DEVICE /mnt
(만약 /mnt 디렉토리가 없다면 사전에 마운트포인트가 될 /mnt 디렉토리를 만들어 주어야만 합니다). 앞으로 우리가 만들 모든 디렉토리들은 /mnt 아래에 있는 것으로 가정하겠습니다.

4.3. 파일시스템의 구성

다음은 아마도 당신의 루트 파일시스템에 들어있어야할 최소한의 디렉토리들입니다. [1]

루트 화일시스템상에서 위의 디렉토리 중 3 개는 빈 디렉토리가 됩니다. 따라서 그 3 개는 mkdir 명령으로 디렉토리만 만들어 주면 됩니다. /proc 디렉토리는 단순히 proc 파일 시스템이 위치하게 되는 장소(stub)일 뿐입니다. /mnt/usr 디렉토리들은 boot/root 시스템이 가동된 후에야 사용되는 마운트포인트입니다. 따라서 다시 말씀드리지만 이 3 개의 디렉토리는 단지 디렉토리만 만들어주면 됩니다.

이제 나머지 4 개의 디렉토리에 대해 설명드리겠습니다.

4.3.1. /dev

/dev 디렉토리에는 시스템이 사용하는 모든 디바이스들 각각에 대응하는 특수파일들이 위치하게 됩니다. /dev 디렉토리는 모든 리눅스 시스템에 반드시 있어야만 하는 강제사항입니다. /dev 디렉토리 자체는 보통의 디렉토리와 다를바 없으므로 mkdir 명령어로 그냥 만들어주면 됩니다. 하지만 /dev 디렉토리 내에 위치하는 디바이스 파일들 만큼은 특수한 파일들이므로 mknod 명령을 사용하는 특수한 방식으로 만들어주어야 합니다.

하지만 보다 간단한 방법이 있습니다. — 당신 시스템의 하드디스크에 있는 /dev 디렉토리에서 필요한 디바이스 화일들을 복사해오는 것입니다. 이때 유념해야 할 것은 특수 디바이스 파일들을 복사해 올 때는 -R 옵션을 써서 복사해야 한다는 점입니다. 이렇게 해야 디렉토리가 복사될 때 파일들의 내용들은 복사되지 않게 됩니다. 대문자 R 임에 주의하십시오. 명령어의 예는 다음과 같습니다.
cp -dpR /dev/fd[01]* /mnt/dev
cp -dpR /dev/tty[0-6] /mnt/dev
위의 명령은 디스켓이 /mnt 에 마운트 되었다고 가정한 것입니다. dp 스위치들은 각각 심볼릭 링크가 복사될 때 타겟파일들이 복사되는 것이 아니라 링크로서 복사되도록 해주며 원래의 파일 속성들이 그대로 유지된 채 복사되도록 해줍니다. 따라서 파일 소유권 정보가 그대로 유지됩니다.

어려운 방법으로 해보고 싶다면 ls -l 로 원하는 디바이스의 메이저와 마이너 디바이스 넘버를 출력해서 확인한 후 mknod 명령을 써서 직접 그대로 만들어 주면 됩니다.

디바이스 화일들을 다 만들었다면, 필요한 특수 디바이스들이 복구디스켓에 제대로 들어갔는지 확인하십시요. 예를 들어 ftape 명령은 테이프 디바이스를 사용하므로, 당신이 부트 디스크를 써서 테이프 드라이브 장치들을 액세스할 작정이라면 테이프 장치에 관련된 디바이스 화일들을 다 포함시켜야 할겁니다.

각각의 특수 디바이스 파일은 하나씩의 inode 를 필요로 하기 때문에 경우에 따라서는 inode 가 부족할 수 있습니다. 특히나 디스켓 파일 시스템에서는 더욱 그렇습니다. 따라서 필요한 디바이스들만 골라서 포함시키십시요. 예를 들어 SCSI 디스크를 가지고 있지 않다면 /dev/sd* 로 시작하는 디바이스 파일들은 무시해도 좋습니다. 마찬가지로, 시리얼 포트를 사용할 일이 없다면 /dev/ttyS* 로 시작하는 디바이스 파일들은 무시해도 좋습니다.

만일, 루트 파일시스템을 만들다가 No space left on device 이라는 에러가 떴는데 막상 df 명령을 내려보면 사용가능한 공간이 아직 남아있는 경우라면 아마도 inode 를 다써버린 경우일 겁니다. df -i 명령은 inode 의 사용상태를 보여줍니다.

중요: /dev 디렉토리에 다음 화일들은 반드시 포함되어야 함을 명심하세요: console, kmem, mem, null, ram0, tty1.

4.3.2. /etc

/etc 디렉토리에는 설정파일들이 들어갑니다. 사용하실 해당 프로그램들에 따라 필요한 설정파일들을 넣어야 합니다. 대부분의 시스템에 있어 설정파일들은 다음 세가지 정도로 분류할 수 있습니다.

  1. 언제나 반드시 필요한 파일들. 예를 들면 rc, fstab, passwd 등등.

  2. 반드시는 아니지만 대체로 필요하다고 생각되는 파일들.

  3. 그외 필요한 잡동사니들.

필수적인 파일인지 아닌지는 대략 다음과 같이 확인해 보실 수 있습니다.
ls -ltru
이 명령은 마지막으로 액세스된 시간순서로 파일들을 출력합니다. 따라서 최근에 액세스된 적이 없는 파일들은 루트디스켓에서 제외시킬수 있을 것입니다.

필자의 루트디스켓에는 약 15 개 정도의 설정파일이 들어있습니다. 용도에 따라 세가지 정도로 나누어 보겠습니다.

  1. boot/root 시스템을 설정하는데 꼭 필요한 설정파일들 :

    1. rc.d/* -- 시스템 기동 및 런레벨 변경 스크립트들

    2. fstab -- 마운트될 파일 시스템의 리스트

    3. inittab -- init 프로세스에 대한 파라메터들이 담겨있습니다. init 는 부팅시의 첫번째 프로세스입니다.

    4. gettydefs -- init 프로세스에 대한 파라메터들이 담겨있습니다. init 는 부팅시의 첫번째 프로세스입니다.

  2. boot/root 시스템의 정돈에 필요한 설정파일들 :

    1. passwd -- 사용자, 홈 디렉토리 등등이 기록된 극히 중요한 리스트

    2. group -- 사용자 그룹들

    3. shadow -- 사용자들의 패스워드. 사용하지 않을 수도 있습니다.

    4. termcap -- 터미널의 기능에 대한 데이터베이스

    보안이 중요한 경우라면 사용자 패스워드가 시스템을 떠나 존재하지 않도록 passwdshadow 는 디스켓으로 복사해오지 않는 것이 좋습니다. 이렇게 해두면 디스켓으로 부팅시 원치않는 사용자의 로그인을 막을 수 있습니다.

    passwd 는 적어도 root 만큼은 포함하고 있어야 합니다. 만일 다른 사용자들도 이 디스켓으로 로그인할 수 있게 하려면 이 화일로 그 사용자의 홈 디렉토리와 쉘을 마련해 주어야 합니다.

    termcap, 즉 터미널 데이터베이스는 보통 수백 킬로바이트 가량 됩니다. boot/root 디스켓에는 당신이 주로 사용하는 터미널들의 엔트리만 남기고 나머지는 삭제하세요. 보통은 linux 혹은 linux-console 엔트리만 남기면 될겁니다.

  3. 나머지 기타 설정파일들. 때로 필요한 경우가 있어서 필자는 남겨두고 있습니다.

필자는 이 중에서 두 가지 파일만큼은 반드시 설정해주는데 그 내용은 무척이나 간단합니다.

  • rc 에는 다음 내용이 들어있습니다.
                 #!/bin/sh
                 /bin/mount -av
                 /bin/hostname Kangaroo
    화일이 실행가능한 상태인지 확인하십시요. 화일 첫머리의 첫번째 라인이 "#!" 으로 시작해야 합니다. 화일의 절대경로가 맞는지도 확인하십시오. 사실 hostname 명령은 실행시키지 않아도 무방합니다 — 해주면 더 멋져 보일 뿐입니다.

  • fstab 에는 최소한 다음 내용은 들어있어야 합니다.
                 /dev/ram0       /               ext2    defaults
                 /dev/fd0        /               ext2    defaults
                 /proc           /proc           proc    defaults
    시스템에서 현재 사용하고 있는 fstab 의 엔트리를 베껴와도 좋습니다. 하지만 당신의 하드디스크 피티션을 자동으로 마운트하게 해서는 안됩니다. 하드디스크의 각 파티션에 noauto 키워드를 써 주세요. 하드디스크가 손상되었거나 죽어버려서 부트디스크를 사용해야할 경우도 있기 때문입니다.

inittab 파일내의 sysinit 라인은 rc 나 그 밖의 기본적인 부트스크립트를 구동시킬수 있도록 수정되어야만 합니다. 또한, 시리얼 포트쪽으로 사용자가 접속하는 것을 막으려면 getty 설정 엔트리중 라인 끝부분에 ttysttyS 디바이스가 적힌 엔트리들은 주석처리 하십시요. 단, 당신이 콘솔로 로그인할 tty 포트들 만큼은 남겨두세요.

가장 간단한 inittab 파일은 다음과 유사한 모습입니다.
          id:2:initdefault:
          si::sysinit:/etc/rc
          1:2345:respawn:/sbin/getty 9600 tty1
          2:23:respawn:/sbin/getty 9600 tty2
inittab 파일은 시스템 기동, 멀티유저 모드로의 이행 등등의 여러 단계에서 시스템이 무엇을 실행시켜야 하는지를 정의한 것입니다. 여기서 세심하게 체크해야할 것은 inittab 에서 언급된 화일들이 정말로 제자리에 있는지의 여부입니다. 만일 init 가 해당 파일을 찾지 못하면 부트디스크는 멈춰버리게 되며 에러메시지조차 뜨지 않을수도 있습니다.

어떤 프로그램들은 다른 위치에 있는 것이 허용되지 않고 반드시 정해진 디렉토리에 위치해야 합니다. 이는 다른 프로그램 속에 그 위치가 하드코딩되었기 때문입니다. 예를 들어 필자의 시스템의 경우, /etc/shutdownreboot 의 위치를 /etc/reboot 로 하드코딩 하였습니다. 만일 필자가 reboot 파일을 /bin/reboot 에 둔 후 shutdown 명령을 내린다면, /etc 디렉토리에서 reboot 파일을 찾을 수 없어 실패하고 말 것입니다.

그 밖의 나머지 파일들의 경우, /etc 디렉토리내의 텍스트 파일들은 그냥 몽땅 복사하십시요. /etc 디렉토리내의 실행화일들도 필요한 것인지 아닌지 정확히 모르시겠다면 그냥 모두 복사하십시오. 부록 C 절을 참고하시기 바랍니다. 아마도 거기에 나온 파일들을 복사하는 것으로 충분하겠지만 시스템은 서로 많은 차이가 있을 수 있으므로 당신의 시스템상의 파일들이 견본의 파일들과 같은 역할을 한다고 장담할 수는 없습니다. 가장 확실한 유일한 방법은 inittab 에서부터 시작해서 필요한 것들을 하나하나 확인해 나가는 방법 뿐입니다.

현재 대부분의 시스템들은 각각의 런레벨에 해당하는 쉘 스크립트들을 /etc/rc.d/ 디렉토리 밑에 두고 있습니다. 가장 간단한 경우라면 rc 스크립트 하나 뿐일수도 있겠지만 대개는 몇개의 스크립트 파일들이 연달아 수행됩니다. 따라서 당신의 원래 시스템으로부터 일단 inittab/etc/rc.d 디렉토리를 통째로 복사해온 후 디스켓 시스템에 필요없는 rc.d 디렉토리의 쉘 스크립트들을 하나씩 지워나가는 방법이 더 편리할 것입니다.

4.3.3. /bin 과 /sbin

/bin 디렉토리는 기본적인 작업에 필요한 ls, mv, cat, dd 등등의 추가적인 유틸리티들을 두기에 편리한 곳입니다. 부록의 부록 C 에 있는 /bin/sbin 디렉토리의 파일들을 참고하세요. cpio, tar, gzip 등과 같은 백업에 필요한 유틸리티들은 이 디렉토리에 포함시키지 않았습니다. 필자의 경우, 그런 유틸리티들은 boot/root 디스켓의 용량을 아끼기 위해 따로 유틸리티 디스크에 넣어둡니다. 일단 boot/root 디스켓이 부팅이 되어 램디스크로 로딩되고나면, 디스켓을 빼고 유틸리티 디스켓으로 바꿔넣은 후 이를 마운트 할 수 있습니다. 필자는 보통 이 유틸리티 디스켓을 /usr 로 마운트합니다.

유틸리티 디스켓을 만드는 방법은 아래의 9.2절 편에 나와있습니다. 백업을 할 때에는 백업본 외에도 백업을 만드는데 사용된 백업 유틸리티들 역시 동일 버전으로 하나 복사해두는 편이 바람직합니다. 이렇게 해두면 나중에 최신 백업 유틸리티들이 버전의 차이로 인해 옛날 백업 테이프를 읽지 못하는 불상사를 피할 수 있습니다.

중요: 다음 프로그램들이 포함되었는지 확인하세요: init, getty 류의 프로그램, login, mount, rc 스크립트를 실행시킬 수 있는 쉘 프로그램, 그리고 쉘을 sh 에 링크시켰는지도 확인하십시요.

4.3.4. /lib

/lib 에는 필요한 공유 라이브러리와 로더들을 두어야 합니다. 만일 필요한 라이브러리가 /lib 디렉토리에서 발견되지 않는다면 시스템은 부팅에 실패하게 됩니다. 운이 좋다면 왜 에러가 났는가하는 에러메시지 정도는 받을 수 있을지 모릅니다.

거의 모든 프로그램들이 적어도 libc 라이브러리인 libc.so.N 만큼은 반드시 필요로 합니다. 여기서 N 은 현재의 버전넘버를 뜻합니다. 당신의 /lib 디렉토리를 확인하세요. 보통, libc.so.N 은 완전한 버전넘버를 가진 파일이름에 심볼릭 링크되어 있습니다.

% ls -l /lib/libc.so*
  -rwxr-xr-x   1 root     root      4016683 Apr 16 18:48 libc-2.1.1.so*
  lrwxrwxrwx   1 root     root           13 Apr 10 12:25 libc.so.6 -> libc-2.1.1.so*

이 경우, 당신은 libc-2.1.1.so 가 필요합니다. 포함시키려고 하는 바이너리들이 어떤 라이브러리를 필요로 하고 있는지 그 의존성을 검사해 보려면 ldd 명령어를 ㅆ십시오. 예를 들면 다음과 같습니다.
          % ldd /sbin/mke2fs
          libext2fs.so.2 => /lib/libext2fs.so.2 (0x40014000)
          libcom_err.so.2 => /lib/libcom_err.so.2 (0x40026000)
          libuuid.so.1 => /lib/libuuid.so.1 (0x40028000)
          libc.so.6 => /lib/libc.so.6 (0x4002c000)
          /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
오른편의 각 파일들이 필요함을 알 수 있습니다. 출력된 라이브러리들은 심볼릭 링크일 수 있습니다.

일부 라이브러리들은 상당히 커서 당신의 루트 파일시스템에 쉽사리 들어가지 않을지도 모릅니다. 예를 들어 위에 나온 libc.so 는 약 4 메가나 됩니다. 이런 라이브러리들을 루트 화일시스템으로 옮기려면 스트립(strip)시킬 필요가 있습니다. 스트립시키는 방법은 8절 절을 참조하세요.

또한, /lib 에는 라이브러리용의 로더를 포함시켜야 합니다. 그 로더는 ld.so (A.OUT 라이브러리용으로, 현재 별로 사용되지 않음)이나 ld-linux.so (ELF 라이브러리용)일 것입니다. 최근 버전의 ldd 는 위의 예처럼 정확히 어떤 로더가 필요한지를 가르쳐주지만 옛날 버전은 그렇지 않습니다. 어떤 로더가 필요한지 자신이 없다면 라이브러리에 대해 file 명령을 실행시키세요. 예를 들면 다음과 같습니다.

% file/lib/libc.so.4.7.2 /lib/libc.so.5.4.33 /lib/libc-2.1.1.so
/lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC), stripped
/lib/libc.so.5.4.33: ELF 32-bit LSB shared object, Intel 80386, version 1, stripped
/lib/libc-2.1.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1, not stripped
   
QMAGIC4.7.2 가 A.OUT 라이브러리용이고, ELF5.4.332.1.1 이 ELF 라이브 러리용임을 나타내고 있습니다.

만들고자 하는 루트 파일시스템에 필요한 로더들을 골라 복사하세요. 라이브러리와 로더들이 과연 바이너리에 맞는 것인지 주의깊게 체크해 보아야만 합니다. 만일 커널이 필요한 라이브러리를 로드하지 못하면 대부분의 경우 에러메시지조차 없이 그냥 멈추어 버립니다.

4.4. PAM 과 NSS 에 대한 대책

당신 시스템에는 ldd 로 확인할 수 없는 동적 라이브러리가 필요할 수도 있습니다. 그런 경우를 무시했다가는 부트디스크로 로그인하거나 사용할 때 문제가 생길 수 있습니다.

4.4.1. PAM (Pluggable Authentication Modules)

만일 당신의 시스템이 PAM(Pluggable Authentication Modules)을 쓰고 있다면 부트디스크 상에 PAM 을 위한 몇가지 준비를 해주어야 합니다. 간단히 말해서 PAM 이란 사용자를 인증하고 그 사용자의 서비스에 대한 액세스를 컨트롤하는 정교하게 모듈화된 방법입니다. 시스템이 PAM 을 쓰고있는지 쉽게 확인해보려면 login 실행화일에 ldd 를 실행시켜 보십시요. libpam.so 등의 출력이 나오다면 PAM 이 필요한 것입니다.

운좋게도, 부트디스크에 있어서 보안은 보통 관심밖의 사항입니다. 이미 컴퓨터 본체에 이런 식의 물리적 액세스를 할 권한이 있는 사람이라면 부팅 디스켓 차원의 보안따위에 개의치 않고 무슨 수를 써서든 소기의 목적한 바를 달성할 수 있을테니까요. 따라서, 부팅 디스켓에서 굳이 PAM 까지 고려할 필요는 별로 없을 것입니다. 루트디스켓에 다음과 비슷한 형태의 간단한 /etc/pam.conf 파일을 만들어두면 쉽게 PAM 기능을 무력화시킬 수 있습니다.
OTHER   auth       optional     /lib/security/pam_permit.so
OTHER   account    optional     /lib/security/pam_permit.so
OTHER   password   optional     /lib/security/pam_permit.so
OTHER   session    optional     /lib/security/pam_permit.so
또한, /lib/security/pam_permit.so 파일을 루트 파일시스템으로 복사하십시오. 이 라이브러리는 겨우 8K 정도이므로 별로 부담스럽지 않습니다.

위와같이 설정하면 이 디스켓으로 당신 머신의 파일이나 서비스에 누구든 아무 제한없이 액세스할 수 있게됩니다. 만일 어떤 이유로 부트디스크상의 보안에도 신경을 써야 하는 상황이라면, 하드디스크의 PAM 설정의 일부 혹은 전부를 당신의 루트 파일시스템으로 복사해야만 합니다. PAM 에 관한 문서를 주의깊게 읽어본 다음 /lib/security 에서 필요한 라이브러리들을 루트 파일시스템으로 복사하십시오.

또한 /lib/libpam.so 를 부트디스크에 포함시켜야만 합니다. 앞에서 /bin/login 에 ldd 를 실행시켰을 적에 이미 이 의존성을 눈치채셨을 것입니다.

4.4.2. NSS (Name Service Switch)

만일 glibc(일명 libc6)를 사용하고 있다면 name service 에 대한 준비를 해주어야만 합니다. 그러지않으면 로그인이 불가능할 것입니다. 파일 /etc/nsswich.conf 는 여러가지 서비스에 대한 데이터베이스 열람을 컨트롤합니다. 만일 네트웍상의 서비스(예를 들면 DNS, NIS lookup 등)에 액세스할 필요가 없다면 다음과 같은 간단한 nsswitch.conf 파일만 준비하면 됩니다.
     passwd:     files 
     shadow:     files 
     group:      files 
     hosts:      files
     services:   files
     networks:   files
     protocols:  files
     rpc:        files
     ethers:     files
     netmasks:   files     
     bootparams: files
     automount:  files 
     aliases:    files
     netgroup:   files
     publickey:  files
이것은 모든 서비스가 오로지 로컬 파일에서 제공되는 것으로 설정한 것입니다. 또한 /lib/libnss_files.so.X 도 포함시켜야 합니다. 여기서 X 는 glibc2.0 에서는 1 이고 glibc2.1 에서는 2 가 됩니다. 이것은 파일 열람(file lookup)을 처리할 때 동적으로 로드되는 라이브러리입니다.

부트디스크에서 네트웍에 액세스할 작정이라면 보다 정교한 nsswitch.conf 파일을 만들 필요가 있습니다. 자세한 것은 nsswitch 맨 페이지를 참고하세요. 당신이 설정한 service 들에 대해, 각각에 해당하는 /lib/libnss_service.so.1 파일들을 포함시켜야만 한다는 점을 명심하십시오.

4.5. 모듈

모듈화된 커널을 사용한다면 부팅 후 부트디스크로부터 어떤 모듈을 로드해야할지를 고려해야만 합니다. 만약 백업 테이프들이 플로피 테이프상에 있다면 ftapezftape 모듈을 포함시켜야 하고 SCSI 장비를 가지고 있다면 SCSI 관련 모듈을 포함시켜야 하며 만일 응급상황하에서 네트웍에 액세스해야 한다면 PPP 나 SLIP 관련 모듈을 포함시켜야 합니다.

이러한 모듈들은 /lib/modules 에 두면 됩니다. 당신은 또 insmod, rmmod, lsmod 프로그램을 포함시켜야 합니다. 모듈을 자동으로 로드하고싶다면 modprobe, depmod, swapout 도 포함시켜야 합니다. kerneld 를 사용한다면 kerneld 와 그 설정화일인 /etc/conf.modules 도 포함시켜야 합니다.

하지만, 모듈을 사용함으로써 얻는 주된 이점은 상대적으로 덜 중요한 모듈들을 유틸리티 디스크에 넣어버리고 필요할 때만 로드함으로써 루트디스크의 공간을 절약하는데 있습니다. 많은 디바이스들을 다루어야 하는 상황이라면 모듈을 이용하는 것이 자체에 많은 드라이버를 내장한 거대한 단일 커널을 쓰는 것보다 더 바람직한 방법입니다.

중요: 압축된 ext2 파일 시스템을 부트하기 위해서는 램디스크와 ext2 에 대한 지원을 반드시 커널에 내장시켜야만 합니다.이 두가지는 모듈로 설정해서는 절대 안됩니다.

4.6. 마지막 세부사항들

login 같은 일부 시스템 프로그램들은 /var/run/utmp 파일과 /var/log 디렉토리가 없는 경우 문제를 일으킬 수 있습니다. 따라서 다음과 같이 해주십시요.

        mkdir -p /mnt/var/{log,run}
        touch /mnt/var/run/utmp

마지막으로, 필요한 모든 라이브러리들을 다 설치했다면 ldconfig 를 실행시켜서 루트 파일시스템 상의 /etc/ld.so.cache 를 리메이크 해주십시오. 캐쉬는 로더에게 어디서 라이브러리를 찾아야 할지를 지시합니다. 다음과 같이 하면 됩니다.
         ldconfig -r /mnt 

4.7. 만들어진 파일시스템을 포장하기

일단 루트 파일시스템을 다 만들었다면 언마운트시키고 파일로 복사한 다음 압축시켜야 합니다.
          umount /mnt
          dd if=DEVICE bs=1k | gzip -v9 > rootfs.gz
이 과정이 끝나면 rootfs.gz 라는 파일을 얻게 될텐데 바로 이것이 당신의 압축 루트 파일시스템입니다. 그 크기를 확인해서 과연 한 장의 플로피 디스켓에 다 들어가는지를 체크합니다; 만일 다 들어가지 않는다면 되돌아가서 몇 가지 파일들을 지워야 합니다. 8절 부분에 루트 파일시스템의 크기를 줄이는 몇가지 힌트가 있습니다.

주석

[1]

여기에 제시된 디렉토리 구조는 루트디스켓에 해당되는 것만 적은 것입니다. 실제의 리눅스 시스템은 보다 복잡하고 세련된 디렉토리구조에 관한 규약을 가지고 있습니다. 이를 파일시스템 계층 표준(FHS, Filesystem Hierarchy Standard)이라 부르는데, 요컨대 각 파일들을 어느 디렉토리에 두어야 하는가에 대한 규약입니다).