당신은 이제 커널과 압축 루트 파일시스템을 가지고 있습니다. 한장짜리 boot/root 디스크를 만들겠다면 커널과 압축 루트 파일시스템을 합친 용량이 한 장의 디스켓에 다 들어가는지 확인해 보십시요. 만일 두장짜리 boot+root 디스크를 만든다면 루트 파일시스템이 한장의 디스켓에 다 들어가는지 확인해 보십시요.
또한, 부트디스크의 커널을 부트시키는데 있어 부트로더의 일종인 LILO 를 사용할 지 여부를 결정해야 합니다. 다른 방법으로는 LILO 를 쓰지 않고 커널을 직접 디스켓에 카피해서 그 디스켓으로 부팅하는 방법도 있습니다. LILO 를 쓰면 하드웨어를 어떻게 초기화시킬지에 대한 파리메터를 부팅시에 커널에 지시할 수 있다는 장점이 있습니다(당신 시스템의 /etc/lilo.conf 파일을 체크해 보십시오. 만일 이 파일이 있고 그 안에 "append=..." 하는 라인이 있다면 당신은 이미 이 기능을 쓰고있는 것입니다). LILO 를 썼을 때의 단점은 부트디스크를 만드는 과정이 더 복잡해지고 용량도 조금 더 차지한다는 것입니다. LILO 를 쓰자면 소위 커널 파일시스템이라 불리우는 별도의 작은 파일 시스템을 만들어 거기에다 커널과 그 밖에 LILO 가 필요로 하는 몇몇 파일들을 담아야만 합니다.
LILO 를 사용하겠다면 계속 읽어나가시고 직접 커널을 전송하는 방법을 택하겠다면 6.2절 부분으로 건너뛰시기 바랍니다.
먼저 최근 버전의 LILO 를 가지고 있는지 확인하십시요.
LILO 를 위한 작은 설정파일을 만들어야 합니다. 다음과 비슷한 내용이 됩니다.
boot =/dev/fd0 install =/boot/boot.b map =/boot/map read-write backup =/dev/null compact image = KERNEL label = Bootdisk root =/dev/fd0 |
이 파일을 bdlilo.conf 라는 이름으로 저장하십시오.
이제 커널 파일시스템이라 불리우는 작은 파일시스템을 만들어야만 합니다. 이것은 루트 파일시스템과는 별개의 것입니다.
먼저, 파일시스템의 크기를 얼마로 해야할지 알아내야 합니다. 만들어낸 커널의 블록 단위 크기가 얼마인지 확인하고("ls -s KERNEL" 명령으로 알수 있습니다), 거기에 50 을 더합니다. 50 블록은 inode 와 그 밖의 몇 가지 파일들에 필요한 대략적인 크기입니다. 원하신다면 정확히 계산해 볼 수도 있습니다. 아니면 그냥 50 을 사용하세요. 두장의 디스켓으로 만든다면 첫번째 디스크는 어쨌든 커널전용으로만 사용될테니 이 크기를 더 넉넉하게 잡아도 좋습니다. 계산한 숫자를 KERNEL_BLOCKS 라고 부르기로 합시다.
플로피 디스켓을 드라이브에 넣고 그 위에 ext2 커널 파일시스템을 만듭시다(편의상 드라이브의 이름은 /dev/fd0라 가정합니다).
mke2fs -N 24 -m 0 /dev/fd0 KERNEL_BLOCKS |
mount -o dev /dev/fd0 /mnt rm -rf /mnt/lost+found mkdir /mnt/{boot,dev} |
그 다음, 디바이스 /dev/null 과 /dev/fd0 를 만듭니다. 디바이스 넘버를 찾는 대신 그냥 당신 시스템의 하드디스크로부터 -R 옵션을 주어 복사해오면 됩니다.
cp -R /dev/{null,fd0} /mnt/dev |
cp /boot/boot.b /mnt/boot |
cp bdlilo.conf KERNEL /mnt |
lilo -v -C bdlilo.conf -r /mnt |
total 361 1 –rw–r––r–– 1 root root 176 Jan 10 07:22 bdlilo.conf 1 drwxr–xr–x 2 root root 1024 Jan 10 07:23 boot/ 1 drwxr–xr–x 2 root root 1024 Jan 10 07:22 dev/ 358 –rw–r––r–– 1 root root 362707 Jan 10 07:23 vmlinuz boot: total 8 4 –rw–r––r–– 1 root root 3708 Jan 10 07:22 boot.b 4 –rw––––––– 1 root root 3584 Jan 10 07:23 map dev: total 0 0 brw–r––––– 1 root root 2, 0 Jan 10 07:22 fd0 0 crw–r––r–– 1 root root 1, 3 Jan 10 07:22 null |
당신이 만든 것과는 파일 크기가 약간 틀릴 수도 있으니 걱정하지 마십시요.
이제 드라이브의 디스켓은 그대로 두고 6.3절 편으로 가시기 바랍니다.
LILO 를 사용하지 않겠다면 dd 명령을 써서 커널을 부트디스크에 담아야 합니다.
% dd if=KERNEL of=/dev/fd0 bs=1k 353+1 records in 353+1 records out |
마지막으로 루트디바이스를 디스켓 자체로 설정한 후, 루트가 읽기/쓰기가 가능하게 로드되도록 설정합시다.
rdev /dev/fd0 /dev/fd0 rdev -R /dev/fd0 0 |
커널 이미지 내에는 램디스크 워드라는 것이 있습니다. 이것은 다른 옵션들과 더불어서 루트 파일시스템을 어디에서 찾을 것인지를 설정합니다. 이 워드는 rdev 명령을 써서 확인 및 설정이 가능합니다. 램디스크 워드의 내용은 다음과 같이 해석합니다.
Bit field | 의미 |
---|---|
0-10 | 1024 byte 블록기준, 램디스크가 시작하는 오프셋 |
11-13 | 사용 않음 |
14 | 램디스크로 로딩될지를 나타내는 플래그 |
15 | 루트 파일시스템을 로드하기 직전에 한번 멈출지를 결정하는 플래그 |
만약 15번 비트가 설정되어 있으면 부팅시에 새로운 디스켓을 집어넣으라는 메시지를 받게 될 것입니다. 이 기능은 두 개의 디스크로 부팅할 경우 필요합니다.
한 개의 boot/root 디스켓을 만들 것인지, 아니면 두개의 "boot+root" 디스켓 세트를 만들 것인지에 따라 다음 두 가지 경우가 생길 수 있습니다.
한 개의 디스켓를 만든다면 압축 루트파일 시스템은 커널 바로 뒤에 연이어 위치하게 되므로 그 오프셋은 빈 블럭의 첫번째(KERNEL_BLOCKS 값과 동일)가 됩니다. 비트 14 는 1 로, 비트 15 는 0 으로 설정해야 합니다.
예를 들어, 당신이 한장짜리 디스크를 만드는데 루트 파일시스템이 253 블록(십진수)에서 시작한다고 칩시다. 램디스크 워드의 값은 253(십진수)에다 비트 14 는 1, 비트 15 는 0 으로 세팅한 값입니다. 이 램디스크 워드 값을 구하려면 단순히 모두 십진수로 변환해 더하면 됩니다. 253 + (2^14) = 253 + 16384 = 16637 입니다. 이 값이 어디서 온 건지 아무래도 이해를 못시겠다면 전자계산기를 써서 이 값을 이진수로 변환해 보시면 이해가 가실 것입니다.
두개의 디스켓 세트를 만든다면 루트 파일시스템은 두 번째 디스켓의 0 번 블록부터 시작할 것이고 따라서 그 오프셋은 0 입니다. 비트 14는 1 로, 비트 15 도 1 로 설정합니다. 따라서 램디스크 워드의 십진수 값은 이 경우 2^14 + 2^15 = 49152 가 됩니다.
램디스크 워드에 해당하는 값을 주의깊게 계산한 다음, 그 값대로 rdev -r 명령으로 설정합니다. 십진수를 사용해야 함에 주의하십시요. LILO를 사용하겠다면 마운트될 커널의 경로, 예를 들면 /mnt/vmlinuz 같은 것을 rdev 명령어에 파라메터로 써주어야 합니다. LILO 를 쓰지 않고 커널을 직접 dd 명령으로 복사하겠다면 대신 플로피 디바이스의 이름을 써줍니다 (예를들면 /dev/fd0).
rdev -r KERNEL_OR_FLOPPY_DRIVE VALUE |
LILO를 사용한다면 이제 디스켓을 언마운트 시키십시오.
중요: rdev 의 맨페이지에 적혀있는 ramsize 관한 사항중 램디스크 크기에 관한 내용은 믿지 마십시요. 그 맨페이지의 내용은 옛날 것입니다. 커널 2.0 대부터는 더이상 램디스크 워드가 램디스크 크기를 결정하지 않습니다; 그대신 이제 램디스크 워드는 6.3절 절의 첫부분에 소개된 테이블에 따라서 해석됩니다. 보다 자세한 해설은 ramdisk.txt 문서나 http://www.linuxhq.com/kernel/v2.4/doc/ramdisk.txt.html 을 보십시요.
마지막 단계는 루트 파일시스템을 플로피 디스켓에 담는 것입니다.
루트 파일시스템을 커널과 같은 디스켓에 담는다면, dd 명령에 seek 옵션을 주십시오. 이 옵션은 얼마만큼의 블록을 건너뛰어야 하는지를 설정합니다.
dd if=rootfs.gz of=/dev/fd0 bs=1k seek=KERNEL_BLOCKS |
만일 루트 파일시스템을 두번째 디스켓에 담는다면, 첫번째 디스켓을 빼고 두번째 디스켓을 드라이브에 넣은 후 루트 파일시스템을 담습니다.
dd if=rootfs.gz of=/dev/fd0 bs=1k |
축하합니다. 이제 끝났습니다!
중요: 응급상황용으로 따로 보관해 두기전에 먼저 이 부트디스크가 제대로 동작하는지 확실히 테스트해보시기 바랍니다. 만일 부트에 실패하셨다면 이 문서를 계속 읽어나가십시오.