루트 파일시스템을 만들 때는 시스템 구동에 필수적인 파일들을 고르는 작업이 필요합니다. 이 절에서는 압축된 루트 파일시스템의 제작법을 설명합니다. 별로 많이 쓰이지는 않지만 압축안된 파일시스템을 디스켓상에 만들어 직접 루트로 마운트시키는 방법도 가능합니다. 이 방법은 램디스크 아닌 루트 파일시스템 부분에서 설명합니다.
루트 파일시스템은 풀 사이즈의 완전한 리눅스 시스템을 지원하기 위한 모든 것을 갖추어야 합니다. 이를 위해서는 리눅스 시스템에 꼭 필요한 최소요건만큼은 루트디스크에 반드시 구비되어야 합니다.
어떤 시스템이 됐든간에 그위에서 원하는 프로그램을 돌릴 수 있을 때 비로소 이용가치가 있는 거겠지요. 루트 디스켓으로 다음과 같은 작업을 할수 있어야만 합니다.
이제 압축 파일시스템을 어떻게 만드는지 설명하겠습니다. 압축 파일시스템이라는 말은 파일시스템이 디스크에 압축된 상태로 있다가 부트시에 램디스크로 압축이 풀리면서 복사되는 것을 말합니다. 압축 파일시스템을 쓰면 표준 1440K 디스켓에 훨씬 많은 파일(약 6메가 가량)들을 넣을 수 있습니다. 파일시스템이 디스켓의 용량보다 훨씬 크기 때문에 디스켓 위에 이를 직접 작성하는 것은 불가능합니다. 일단 다른 곳에서 파일 시스템을 완전히 만들어 압축한 다음, 그 압축된 것을 디스켓에 복사하는 방법을 써야 합니다.
압축된 루트 파일시스템을 만들기 위해서는 압축하기 전에 일단 필요한 모든 파일들을 담을 수 있는 충분한 크기의 빈 공간이 필요합니다. 약 4 메가바이트 가량을 담을수 있는 디바이스가 필요합니다. 몇 가지 선택이 가능합니다.
RAMDISK_SIZE = nnn이것은 램디스크로 할당가능한 램의 최대치를 설정하는 것입니다. 디폴트는 4096K 인데 이 정도면 충분할 것입니다. 만약 시스템의 램이 8M 미만이라면 램디스크를 사용하는 방법은 피하는 것이 좋습니다. /dev/ram0, /dev/ram, /dev/ramdisk 등의 디바이스를 가지고 있는지 확인하십시오. 만일 없다면 mknod 명령(major number 1, minor 0)으로 /dev/ram0를 만들어야 합니다.
mknod /dev/loop0 b 7 0'' 명령으로 만들어야만 합니다. 해당하는 마운트/언마운트 프로그램들을 설치했다면, 아래의 명령을 써서 하드디스크 상에 충분한 크기의 임시파일을 만드십시오(예를 들면 /tmp/fsfile).
dd if=/dev/zero of=/tmp/fsfile bs=1k count=<it/nnn/위의 명령으로 block 크기가 nnn인 파일을 만들 수 있습니다. 이 이후로 "DEVICE" 라는 부분이 나오면 해당 파일이름을 써주세요. 그리고 루프백 디바이스를 마운트하기 위해서는 마운트 명령에 "-o loop" 옵션을 주어야 합니다. 예를 들면 다음과 같습니다.
mount -o loop -t ext2 /tmp/fsfile /mnt위의 명령은 (루프백 디바이스를 통해) /tmp/fsfile 를 마운트 포인트 /mnt 에 마운트 시킵니다. df 명령으로 마운트 되었는지 확인해 볼수 있습니다.
위에서 말한 세가지 방법 중 어느 하나를 선택하기로 마음먹었다면 이제 “ DEVICE ” 에 대해 다음 명령을 주세요.
dd if=/dev/zero of=DEVICE bs=1k count=3000
이 명령은 디바이스의 내용을 모두 0 으로 채웁니다. 이 과정이 중요한 이유는 디바이스상의 파일 시스템은 나중에 압축되게 되므로 사용되지않은 모든 영역은 0 으로 채워야 최대한으로 압축할수 있기 때문입니다.
그 다음, 파일 시스템을 만듭니다. 리눅스 커널에 있어 자동으로 램디스크로 카피될수 있는 루트 디스크 화일 시스템은 minix 와 ext2 파일 시스템 단 두가지 뿐입니다. 이중에서 ext2 파일시스템이 보다 선호되는 파일 시스템입니다. ext2 를 쓰면 -i 옵션을 주어 디폴트값보다 더 많은 inode 를 설정할 수 있어 편리합니다. -i 2000 정도로 설정하면 inode 가 부족해지는 일은 없을 것입니다. 또다른 방법으로는 불필요한 많은 /dev 파일들을 제거해서 inode 를 절약하는 방법도 있습니다. mke2fs 는 디폴트로 1.44 M 디스켓에 360 개의 inode를 생성합니다. 필자가 쓰는 복구용 루트디스켓에는 120개 의 inode 가 있고 이 정도로 충분하지만 만일 당신이 /dev 내의 디바이스 파일들을 전부 포함시키려 한다면 필요한 inode 수는 360개 를 쉽게 초과해 버립니다. 압축된 루트 파일시스템을 사용하면 보다 큰 파일시스템을 담을 수 있고 따라서 디폴트로 보다 많은 inode를 쓸 수 있습니다만 그래도 역시 파일의 수를 줄이거나 inode 수를 늘릴 필요가 있을 것입니다.
따라서 다음과 비슷한 명령이 필요합니다.
mke2fs -m 0 -i 2000 DEVICE
(루프백 디바이스를 사용하신다면 DEVICE 대신 파일이름을 써야 합니다. 이 경우 mke2fs 는 정말로 그러겠느냐고 물어올 텐데 yes 하세요)
mke2fs 명령은 자동으로 사용가능한 용량을 인지하고 그에 맞춰 파일시스템을 설정합니다. -m 0 파라메터는 mke2fs 로 하여금 root 용으로 공간을 할당하지 못하게 함으로써 사용가능한 디스크 용량을 더 많이 확보합니다.
이제 디바이스를 마운트하세요.
mount -t ext2 DEVICE /mnt
(만약 /mnt 디렉토리가 없다면 마운트 포인트가 될 /mnt 디렉토리를 만들어 주어야만 합니다)
앞으로 우리가 만들 모든 디렉토리들은 /mnt 아래에 있는 것으로 가정하겠습니다.
다음은 일반적인 루트 파일시스템에 들어있어야할 최소한의 디렉토리들입니다.
(여기에 제시된 디렉토리 구조는 루트디스켓에 해당되는 것만 적은 것입니다. 실제의 리눅스 시스템은 보다 복잡하고 세련된 디렉토리구조에 관한 규약을 가지고 있습니다. 이를 파일시스템 표준(FSS, File System Standard)이라 부르는데 요컨대 각 파일들을 어느 디렉토리에 두어야 하는가에 대한 규약입니다)
루트 화일시스템에서 위의 디렉토리 중 3 개는 빈 디렉토리가 됩니다. 따라서 그 3 개는 mkdir 명령으로 만들면 됩니다. /proc 디렉토리는 단순히 proc 파일 시스템이 위치하게 되는 장소일 뿐입니다. /mnt 와 /usr 디렉토리들은 boot/root 시스템이 가동된 후에야 사용되는 마운트포인트입니다. 따라서 다시 말씀드리지만 이 3 개의 디렉토리는 단지 디렉토리만 만들어주면 됩니다.
이제 나머지 4 개의 디렉토리에 대해 설명드리겠습니다.
/dev 디렉토리에는 시스템이 사용하는 모든 디바이스들 각각에 대응하는 특수파일들이 위치하게 됩니다. /dev 디렉토리는 모든 리눅스 시스템에 반드시 있어야만 하는 강제사항입니다. /dev 디렉토리 자체는 보통의 디렉토리와 같으므로 mkdir 명령어로 만들어 주면 됩니다. 하지만 /dev 디렉토리 내에 위치하는 디바이스 파일들만큼은 특수한 파일들이므로 mknod 명령을 사용하는 특수한 방식으로 만들어주어야만 합니다.
하지만 보다 간단한 방법이 있습니다. -- 당신 시스템의 /dev 디렉토리의 내용들을 복사해 온 후 필요없는 것들을 지우는 것입니다. 이때 유념해야 할 것은 특수 디바이스 파일들을 복사해 올 때는 -R 옵션을 써서 복사해야 한다는 점입니다. 이렇게 하면 파일들의 내용물은 제외하고 그 디렉토리만 복사해오게 됩니다. 대문자 R 임에 주의하십시오. 만일 소문자 -r 을 쓴다면 당신 하드디스크의 내용을 몽땅 복사해오려 할 것이고 결국 복사 도중에 디스켓의 용량 초과로 중단되어 버립니다. 따라서 주의해서 다음 명령어를 사용하십시오.
cp -dpR /dev /mnt
위의 명령은 디스켓이 /mnt 에 마운트 되었다고 가정한 것입니다. dp 스위치들은 심볼릭 링크가 복사될 때 타겟파일들이 복사되는 것이 아니라 링크로서 복사되도록 해주며, 원래의 파일 속성들이 그대로 유지된 채 복사되도록 해줍니다. 따라서 파일 소유권 정보가 그대로 유지됩니다.
어려운 방법으로 해보고 싶다면 ls -l 로 원하는 디바이스의 메이저와 마이너 디바이스 넘버를 출력해서 확인한 후 mknod 명령을 써서 직접 만들어 주는 방법도 있습니다.
이제 디바이스들을 복사했으면, 원하는 특수 디바이스들이 복구디스켓에 제대로 들어갔는지 확인해보십시요. 예를 들면 ftape 명령은 테이프 디바이스를 사용하므로 당신이 부트 디스크를 써서 테이프 드라이브 장치들을 액세스할 작정이라면 테이프 디바이스들이 제대로 들어갔는지 확인해 볼 필요가 있습니다.
각각의 특수 디바이스 파일은 하나씩의 inode 를 필요로 하기 때문에, 경우에 따라서는 inode 가 부족해질 수 있음에 유의하세요. 특히나 디스켓 파일 시스템에서는 더욱 그렇습니다. 따라서 필요없는 디바이스 파일들은 디스켓의 /dev 디렉토리에서 제거하는 것이 좋습니다. 상당수의 디바이스들이 이런 디스켓 시스템과 같은 특수한 시스템에는 불필요합니다. 예를 들어 SCSI 디스크를 가지고 있지 않다면 sd 로 시작하는 모든 디바이스 파일들은 삭제해도 무방합니다. 마찬가지로 시리얼 포트를 사용할 일이 없다면 cua 로 시작하는 모든 디바이스 파일들은 지워도 됩니다.
/dev 디렉토리에 다음 화일들은 반드시 있어야 함을 명심하세요: console, kem, mem, null, ram, tty1.
/etc 디렉토리에는 설정파일들이 위치합니다. 대부분의 시스템에 있어, 설정파일들은 세가지 정도로 분류할 수 있습니다.
필수적인 파일인지 아닌지는 다음과 같이 확인해 보실 수 있습니다.
ls -ltru
이 명령은 마지막으로 액세스된 시간순으로 파일들을 출력합니다. 따라서 최근에 액세스된 적이 없는 파일들은 루트디스켓에서 제외시켜도 됩니다.
필자의 루트디스켓에는 약 15 개 정도의 설정파일이 들어있습니다. 용도에 따라 세가지 정도로 나누어 보겠습니다.
필자는 이 중에서 두 가지 파일만큼은 반드시 설정해주는데 그 내용은 무척이나 간단합니다.
#!/bin/sh
/bin/mount -av
/bin/hostname Kangaroo
디렉토리가 맞는지 확인하십시오. 사실 hostname 명령을 실행시킬 필요는 없지만 hostname 을 쓰면 좀 더 멋져 보입니다.
/dev/ram0 / ext2 defaults
/dev/fd0 / ext2 defaults
/proc /proc proc defaults
현재 사용하고 있는 fstab 의 엔트리를 복사해 와도 좋습니다. 하지만 당신의 하드디스크 피티션을 자동으로 마운트하게 해서는 안됩니다. 하드디스크의 각 파티션에 noauto 키워드를 써 주세요. 하드디스크가 손상되었거나 죽어버려서 부트디스크를 사용해야할 경우도 있기 때문입니다.
inittab 파일내의 sysinit 라인은 rc 나 그 밖의 기본적인 부트스크립트를구동시킬수 있도록 수정되어야만 합니다. 또한, 시리얼 포트쪽으로 사용자가 접속하는 것을 금지시키려면 getty 에 해당하는 줄 끝부분의 tty 나 ttyS 디바이스를 포함한 모든 엔트리를 제거(comment out)해야 합니다. 단, 당신이 콘솔로 로그인할 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/shutdown 은 reboot 명령의 위치를 /etc/reboot 라고 간주하여 코딩되었습니다. 만일 필자가 reboot 파일을 /bin/reboot 에 둔 후 shutdown 명령을 내린다면, /etc 디렉토리에서 reboot 를 찾을 수 없으므로 shutdown 명령은 실패할 것입니다.
그 밖의 나머지 파일들의 경우 /etc 디렉토리의 모든 텍스트 파일들을 복사하시고, 만일 뭐가 뭔지 정확히 모르시겠다면 /etc 디렉토리의 실행파일들도 모두 복사하십시오. 루트디스크 견본 절을 참고하시기 바랍니다. 아마도 거기에 나온 파일들을 복사하는 것으로 충분하겠지만 시스템은 서로 많은 차이가 있을 수 있기 때문에 당신의 시스템상의 파일들이 견본의 파일들과 같은 역할을 한다고 장담할 수는 없습니다. 가장 확실한 유일한 방법은 inittab 에서부터 시작해서 필요한 것들을 하나하나 확인해 나가는 방법 뿐 입니다.
현재 대부분의 시스템들은 각각의 런레벨에 해당하는 쉘 스크립트들을 /etc/rc.d/ 디렉토리 밑에 두고 있습니다. 가장 단순하게 하려면 rc 스크립트 하나면 되지만, 당신의 원래 시스템으로부터 일단 inittab 와 /etc/rc.d 디렉토리를 통째로 복사해온 후 디스켓 시스템에 필요없는 쉘 스크립트들을 지워나가는 방법이 보다 편리할 것입니다.
/bin 디렉토리는 기본적인 작업에 필요한 ls, mv ,cat, dd 등등의 추가적인 유틸리티들을 두기에 편리한 곳입니다. 부록의 "루트디스크 견본" 에 나온 /bin 과 /sbin 디렉토리의 파일들을 참고하세요. cpio, tar, gzip 같은 백업에 필요한 유틸리티들은 포함시키지 않았습니다. 필자의 경우 그런 유틸리티들은 boot/root 디스켓의 용량을 아끼기 위해 따로 유틸리티 디스크에 넣어둡니다. 일단 boot/root 디스켓이 부팅이 되어 램디스크로 로딩되고나면, 유틸리티 디스켓으로 바꿔넣은 후 마운트 할 수 있습니다. 필자는 보통 이 유틸리티 디스켓을 /usr 에 마운트합니다.
유틸리티 디스켓을 만드는 방법은 아래의 유틸리티 디스크 만들기 편에 나와있습니다. 백업을 할 때에는 백업본 외에도 백업을 만드는데 사용된 백업 유틸리티들 역시 동일 버전으로 하나 복사해두는 편이 바람직합니다. 이렇게 해두면 나중에 최신 백업 유틸리티들이 버전의 차이로 인해 옛날 백업 테이프를 읽지 못하는 불상사를 피할 수 있습니다.
다음 프로그램들이 포함되었는지 확인하세요: init, getty 류의 프로그램, login, mount, rc 스크립트를 실행시킬 수 있는 쉘 프로그램, 그리고 쉘을 sh 에 링크시켰는지도 확인하십시요.
/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)시킬 필요가 있습니다. 사용법은 "루트파일시스템의 크기를 줄이기" 절을 참조하세요.
또한, /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
QMAGIC 은 4.7.2 가 a.out 라이브러리용이고, ELF 는 5.4.33 과 2.1.1 이 ELF 라이브 러리용임을 나타내고 있습니다.
만들고자 하는 루트 파일시스템에 필요한 로더들을 골라 복사하세요. 라이브러리와 로더들이 과연 바이너리에 맞는 것인지 주의깊게 체크해 보아야만 합니다. 만일 커널이 필요한 라이브러리를 로드하지 못하면 대부분의 경우 에러메시지조차 없이 그냥 멈추어 버립니다.
당신 시스템에는 ldd 로 확인할 수 없는 동적으로 로드되는 라이브러리가 필요할 수도 있습니다.
만일 당신의 시스템이 PAM (Pluggable Authentication Modules)을 쓰고 있다면 부트디스크 상에 PAM을 위한 몇가지 준비를 해주어야 합니다. 그러지 않으면 로그인이 불가능할 것입니다. 간단히 말해서 PAM 이란 사용자를 인증하고 그 사용자들의 서비스에 대한 액세스를 컨트롤하는 정교하게 모듈화된 방법입니다. 시스템이 PAM 을 쓰고있는지 쉽게 확인해보려면 하드디스크의 /etc 디렉토리에서 pam.conf 파일이나 pam.d 디렉토리가 있는지 체크해 보십시요. 그런 것이 있다면 틀림없이 최소한의 pam 지원은 하고 있는 것입니다(다른 방법으로는, login 실행파일에 대해 ldd 를 해보는 것입니다. libpam.so 라는 말이 출력되면 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 를 실행시켰을 적에 이미 이 의존성을 눈치채셨을 것입니다.
만일 glibc(일명 libc6)를 사용하고 있다면 name services 에 대한 준비를 해주어야만 합니다. 그렇지 않으면 로그인이 불가능할 것입니다. 파일 /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.1 을 포함시켜야 합니다. 이것은 파일 열람(file lookup)을 처리할 때 동적으로 로드되는 라이브러리입니다.
부트디스크에서 네트웍에 액세스할 작정이라면 보다 정교한 nsswitch.conf 파일을 만들 필요가 있습니다. 자세한 것은 nsswitch 맨 페이지를 참고하세요. 당신이 설정한 각각의 서비스를 위해서는 /lib/libnss_service.so.1 파일을 포함시켜야만 한다는 점도 명심하십시오.
모듈화된 커널을 사용한다면 부팅 후 부트디스크로부터 어떤 모듈을 로드해야 할지 고려해야만 합니다. 만약 백업 테이프들이 플로피 테이프상에 있다면 ftape 와 zftape 모듈을 포함시켜야 하고, SCSI 장비를 가지고 있다면 SCSI 관련 모듈을 포함시켜야 하며 만일 응급상황하에서 네트웍에 액세스해야 한다면 PPP 나 SLIP 관련 모듈을 포함시켜야 합니다.
이러한 모듈들은 /lib/modules 에 두면 됩니다. 당신은 또 insmod, rmmod, lsmod 프로그램을 포함시켜야 합니다. 모듈을 자동으로 로드하고싶다면 modprobe, depmod, swapout 도 포함시켜야 합니다. kerneld 를 사용한다면 kerneld 를 /etc/conf.modules 의 설정에 맞게 포함시켜야 합니다.
하지만, 모듈을 씀으로서 얻는 주된 이점은 상대적으로 덜 중요한 모듈들을 유틸리티 디스크에 넣어버리고 필요할 때만 로드함으로써 루트디스크의 공간을 절약하는데 있습니다. 만일 많은 디바이스들을 다루어야만 하는 상황이라면 이러한 방법이 자체에 많은 드라이버를 내장한 거대한 단일 커널을 쓰는 것보다 더 좋은 방법입니다.
압축된 ext2 파일 시스템을 부트하기 위해서는 ramdisk 와 ext2 에 대한 지원을 반드시 커널에 내장시켜야만 합니다. 이 두가지는 모듈로 설정해서는 절대 안됩니다.
login 같은 일부 시스템 프로그램들은 /var/run/utmp 파일이나 /var/log 디렉토리가 없는 경우 문제를 일으킬 수 있습니다. 따라서 다음과 같이 해주십시요.:
mkdir -p /mnt/var/{log,run}
touch /mnt/var/run/utmp
마지막으로, 필요한 모든 라이브러리들을 다 설치했다면 ldconfig 를 실행시켜서 루트 파일시스템 상의 /etc/ld.so.cache 를 리메이크 해주십시오. 캐쉬는 로더에게 어디서 라이브러리를 찾아야 할지를 지시합니다. ld.so.cache 를 리메이크 하려면 다음 명령어를 실행합니다.
chdir /mnt; chroot /mnt /sbin/ldconfig
ldconfig 는 언제나 루트 파일시스템에 대해서만 캐쉬를 리메이크 하므로 반드시 chroot 명령이 필요합니다.
일단 루트 파일시스템을 다 만들었다면 언마운트시키고 파일로 카피한 다음 압축시켜야 합니다.
umount /mnt
dd if=DEVICE bs=1k | gzip -v9 > rootfs.gz
이 과정이 끝나면 rootfs.gz 라는 파일을 얻게 될텐데 바로 이것이 당신의 압축된 루트 파일시스템입니다. 그 크기를 확인해서 과연 한 장의 플로피 디스켓에 다 들어가는지를 체크해야만 합니다; 만일 다 들어가지 않는다면 되돌아가서 몇 가지 파일들을 지워야 합니다. 루트 파일시스템의 크기를 줄이기 부분을 참조하면 루트 파일시스템의 크기를 줄이는 몇 가지 힌트를 얻을수 있을 것입니다.