6. 만든 것들을 하나로 모으기 : 디스켓 제작

당신은 이제 커널과 압축 루트 파일시스템을 가지고 있습니다. 한장짜리 boot/root 디스크를 만들겠다면 커널과 압축 루트 파일시스템을 합친 용량이 한 장의 디스켓에 다 들어가는지 확인해 보십시요. 만일 두장짜리 boot+root 디스크를 만든다면 루트 파일시스템이 한장의 디스켓에 다 들어가는지 확인해 보십시요.

또한, 부트디스크의 커널을 부트시키는데 있어 부트로더의 일종인 LILO 를 사용할 지 여부를 결정해야 합니다. 다른 방법으로는 LILO 를 쓰지 않고 커널을 직접 디스켓에 카피해서 그 디스켓으로 부팅하는 방법도 있습니다. LILO 를 쓰면 하드웨어를 어떻게 초기화시킬지에 대한 파리메터를 부팅시에 커널에 지시할 수 있다는 장점이 있습니다(당신 시스템의 /etc/lilo.conf 파일을 체크해 보십시오. 만일 이 파일이 있고 그 안에 "append=..." 하는 라인이 있다면 당신은 이미 이 기능을 쓰고있는 것입니다). LILO 를 썼을 때의 단점은 부트디스크를 만드는 과정이 더 복잡해지고 용량도 조금 더 차지한다는 것입니다. LILO 를 쓰자면 소위 커널 파일시스템이라 불리우는 별도의 작은 파일 시스템을 만들어 거기에다 커널과 그 밖에 LILO 가 필요로 하는 몇몇 파일들을 담아야만 합니다.

LILO 를 사용하겠다면 계속 읽어나가시고 직접 커널을 전송하는 방법을 택하겠다면 6.2절 부분으로 건너뛰시기 바랍니다.

6.1. LILO 를 써서 커널을 로딩하는 경우

먼저 최근 버전의 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
이들 파라메터에 대해서는 LILO 사용자 설명서를 참조하십시오. 또한 당신의 하드디스크의 /etc/lilo.conf 파일에 적혀있는 append = ... 라인을 보고 위의 화일 끝에 그대로 추가해야할 것입니다.

이 파일을 bdlilo.conf 라는 이름으로 저장하십시오.

이제 커널 파일시스템이라 불리우는 작은 파일시스템을 만들어야만 합니다. 이것은 루트 파일시스템과는 별개의 것입니다.

먼저, 파일시스템의 크기를 얼마로 해야할지 알아내야 합니다. 만들어낸 커널의 블록 단위 크기가 얼마인지 확인하고("ls -s KERNEL" 명령으로 알수 있습니다), 거기에 50 을 더합니다. 50 블록은 inode 와 그 밖의 몇 가지 파일들에 필요한 대략적인 크기입니다. 원하신다면 정확히 계산해 볼 수도 있습니다. 아니면 그냥 50 을 사용하세요. 두장의 디스켓으로 만든다면 첫번째 디스크는 어쨌든 커널전용으로만 사용될테니 이 크기를 더 넉넉하게 잡아도 좋습니다. 계산한 숫자를 KERNEL_BLOCKS 라고 부르기로 합시다.

플로피 디스켓을 드라이브에 넣고 그 위에 ext2 커널 파일시스템을 만듭시다(편의상 드라이브의 이름은 /dev/fd0라 가정합니다).
          mke2fs -N 24 -m 0 /dev/fd0 KERNEL_BLOCKS
"-N 24 " 는 inode 수를 24 개로 설정합니다. 이 파일시스템에 필요한 inode 수는 24 개면 됩니다.그 다음, 이 파일시스템을 마운트하고 lost+found 디렉토리를 삭제한 후 LILO 를 위한 devboot 디렉토리를 만듭니다.
        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
LILO 는 그 부트로더인 boot.b 의 복사본을 필요로 하는데, 이 boot.b 는 하드디스크에서 가져오면 됩니다. 보통, 이 파일은 /boot 디렉토리에 있습니다.
          cp /boot/boot.b /mnt/boot
마지막으로, 앞 절에서 만든 LILO 설정파일과 커널을 플로피로 복사해 넣습니다. 두 가지 모두 루트 디렉토리에 들어갑니다.
          cp bdlilo.conf KERNEL /mnt
이제 LILO 가 필요로 하는 모든 것들이 커널 파일시스템에 들어갔으므로 준비는 모두 끝났습니다. LILO 의 -r 플래그는 부트로더를 다른 루트에 설치할 때 사용됩니다.
         lilo -v -C bdlilo.conf -r /mnt
LILO가 아무 에러도 없이 제대로 동작했다면 커널 파일시스템은 다음과 비슷한 모습이 될 것입니다.
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절 편으로 가시기 바랍니다.

6.2. LILO 없이 커널이 스스로 자신을 로딩하는 경우

LILO 를 사용하지 않겠다면 dd 명령을 써서 커널을 부트디스크에 담아야 합니다.
          % dd if=KERNEL of=/dev/fd0 bs=1k
          353+1 records in
          353+1 records out
위의 예에서 dd 는 353 개의 완전한 레코드와 1개의 부분레코드를 써넣었습니다. 따라서 커널은 디스켓 앞부분의 354 블록들을 점유하게 됩니다. 이 숫자를 KERNEL_BLOCKS 라고 부르겠으니 기억해 두십시오. 다음 절에서 사용할 것입니다.

마지막으로 루트디바이스를 디스켓 자체로 설정한 후, 루트가 읽기/쓰기가 가능하게 로드되도록 설정합시다.
          rdev /dev/fd0 /dev/fd0
          rdev -R /dev/fd0 0
두 번째 줄의 rdev 명령에서 대문자 -R 을 써야함에 주의하세요.

6.3. 램디스크 워드의 설정

커널 이미지 내에는 램디스크 워드라는 것이 있습니다. 이것은 다른 옵션들과 더불어서 루트 파일시스템을 어디에서 찾을 것인지를 설정합니다. 이 워드는 rdev 명령을 써서 확인 및 설정이 가능합니다. 램디스크 워드의 내용은 다음과 같이 해석합니다.

Bit field의미
0-101024 byte 블록기준, 램디스크가 시작하는 오프셋
11-13사용 않음
14램디스크로 로딩될지를 나타내는 플래그
15루트 파일시스템을 로드하기 직전에 한번 멈출지를 결정하는 플래그

만약 15번 비트가 설정되어 있으면 부팅시에 새로운 디스켓을 집어넣으라는 메시지를 받게 될 것입니다. 이 기능은 두 개의 디스크로 부팅할 경우 필요합니다.

한 개의 boot/root 디스켓을 만들 것인지, 아니면 두개의 "boot+root" 디스켓 세트를 만들 것인지에 따라 다음 두 가지 경우가 생길 수 있습니다.

  1. 한 개의 디스켓를 만든다면 압축 루트파일 시스템은 커널 바로 뒤에 연이어 위치하게 되므로 그 오프셋은 빈 블럭의 첫번째(KERNEL_BLOCKS 값과 동일)가 됩니다. 비트 14 는 1 로, 비트 15 는 0 으로 설정해야 합니다.

    예를 들어, 당신이 한장짜리 디스크를 만드는데 루트 파일시스템이 253 블록(십진수)에서 시작한다고 칩시다. 램디스크 워드의 값은 253(십진수)에다 비트 14 는 1, 비트 15 는 0 으로 세팅한 값입니다. 이 램디스크 워드 값을 구하려면 단순히 모두 십진수로 변환해 더하면 됩니다. 253 + (2^14) = 253 + 16384 = 16637 입니다. 이 값이 어디서 온 건지 아무래도 이해를 못시겠다면 전자계산기를 써서 이 값을 이진수로 변환해 보시면 이해가 가실 것입니다.

  2. 두개의 디스켓 세트를 만든다면 루트 파일시스템은 두 번째 디스켓의 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 을 보십시요.

6.4. 루트 파일시스템을 디스켓에 담기

마지막 단계는 루트 파일시스템을 플로피 디스켓에 담는 것입니다.

축하합니다. 이제 끝났습니다!

중요: 응급상황용으로 따로 보관해 두기전에 먼저 이 부트디스크가 제대로 동작하는지 확실히 테스트해보시기 바랍니다. 만일 부트에 실패하셨다면 이 문서를 계속 읽어나가십시오.