11. 부팅가능한 CD-ROM 제작

참고: 이 절은 Rizwan Mohammed Darwe() 씨가 담당해 주셨습니다.

이 절은 당신이 이미 리눅스에서 CD 를 만드는 작업을 잘 알고 있다고 가정합니다. 이 절을 부팅 CD 를 굽는 간단한 안내서로 생각해 주십시요. CD-Writing-HOWTO 문서에는 더 깊이있는 내용이 실려있습니다.

11.1. 엘 토리토(El torito) 란 무엇인가?

x86 플랫폼의 많은 BIOS 제작사들이 CD 부팅을 지원하기 시작했습니다. mkisofs 에 대한 패치는 엘 토리토 라는 표준에 기반하고 있습니다. 간단히 말해 엘 토리토란 CD 로 직접 부팅하기 위해서는 시디롬이 어떻게 포맷되어야 하는가에 관한 표준 규약입니다.

엘 토리토 규약에는 BIOS 가 엘 토리토를 지원하는 한 어떠한 시디롬으로도 부팅할 수 있다고 되어있습니다만, 지금 현재 SCSI 컨트롤러들중 엘 토리토를 지원하는 것은 전혀 없으며, 단지 EIDE 드라이브들만이 엘 토리토를 지원하고 있습니다. 마더보드가 반드시 엘 토리토를 지원해야 합니다. 자신의 마더보드가 엘 토리토를 지원하는지 어떻게 알수 있냐고요? 엘 토리토가 지원되는 마더보드는 BIOS 설정에서 하드 디스크, 플로피 디스크, 네트웍 또는 시디롬 중 어떤 매체로 부팅할 지를 선택할 수 있습니다.

11.2. 작동 원리

엘 토리토 규약은 BIOS 호출을 이용해서 시디 드라이브를 마치 플로피 드라이브인 양 속여서 동작합니다. 이 방법을 써서 당신은 어떠한 플로피 크기의 이미지(예를 들면 1.44 M 플로피의 경우 1440 Kbyte)라도 ISO 파일 시스템속에 넣어둘 수 있습니다. ISO 파일 시스템의 헤더속에 이 이미지에 대한 포인터를 넣어주면 됩니다. 그러면 BIOS 가 이 이미지를 CD 에서 찾아서 마치 플로피 드라이브로부터 부팅하는 것과 똑같이 부팅하게 됩니다. 한 예로, LILO 부트디스크조차도 똑같이 동작하게 됩니다.

간단히 말해, 시디롬의 첫번째 1.44 MByte(2.88 M 디스크라면 2.88 Mbyte) 부분에 당신이 넣어놓은 플로피 디스크의 이미지가 들어갑니다. 이 이미지는 BIOS 에 의해 플로피로 인식되어져 여기서 부팅이 이루어집니다. (결국, 이 가상의 플로피로 부팅하는 동안은 이게 A: 가 되므로 원래의 진짜 A:(/dev/fd0) 로는 액세스할 수 없으며, /dev/fd1 를 통해 액세스해야 합니다)

11.3. 제작 방법

먼저 화일을 하나 만듭시다. boot.img 라고 합시다. 이것은 CD-ROM 을 통해 부트하고자 하는 부팅가능한 플로피 디스켓의 이미지입니다. 이것은 반드시 1.44 MB 의 부팅가능한 플로피여야 합니다. 명령은 아래와 같습니다.
dd if=/dev/fd0 of=boot.img bs=10k count=144
플로피는 A: 드라이브에 있다고 가정했습니다.

이 이미지를 iso9660 화일 시스템의 디렉토리계층 속 어딘가에 넣어둡시다. 부팅에 관련있는 화일들을 모두 한 디렉토리에 모아두는 것이 좋은 방법입니다(예를 들면 iso9660 파일시스템의 루트디렉토리 밑에 boot/ 로 모아두는 방법).

잠깐! -- 당신의 부트 플로피는 반드시 LILO 를 통해서만 초기 램디스크를 로드해야 합니다. 커널 램디스크 드라이버를 사용해서는 안됩니다! 그 이유는 일단 리눅스 커널이 시작되고나면 BIOS 가 CD 를 플로피 디스크로 속였던 것이 더이상 유효하지 않게되어 부팅에 실패하게 되기 때문입니다. LILO 는 BIOS 의 디스크 호출을 통해 초기 램 디스크를 로드하므로, CD 를 계속 플로피로 인식시킬 수 있습니다.

또한, 엘 토리토 규약에는 "부트 카탈로그" 라는 것을 만들어야 한다고 되어있습니다. 이것은 2048 byte 의 파일로서, 어떤 기능을 하는 것은 아니며 단지 규정으로 그렇게 정해진 것입니다. 패치된 mkisofs 프로그램을 쓰면 자동으로 이 부트 카탈로그를 만들어 줍니다만, mkisofs 실행시에 부트 카탈로그를 iso9660 파일시스템의 어디에 넣을 것인지를 지정해주어야 합니다. 보통은 부트이미지와 같은 곳에 boot.catalog 이라는 이름으로 넣어두면 좋습니다.

이제 우리는 boot.img 이라는 파일속에 부트이미지를 담았고, 이제 이것을 iso9660 파일시스템의 루트 디렉토리 밑의 boot/ 디렉토리에 넣을 것입니다. boot.catalog 이라는 이름으로 부트 카탈로그도 같은 디렉토리에 넣겠습니다. bootcd.iso 이라는 화일속에 iso9660 파일시스템을 만드는 명령은 다음과 같습니다:
mkisofs -r -b boot/boot.img -c boot/boot.catalog -o bootcd.iso .
옵션 -b 는 원하는 부트이미지의 이름이고(패스가 iso9660 디스크의 루트를 기준한 것임에 주목하세요), 옵션 -c 는 부트 카탈로그 파일을 지정한 것입니다. 옵션 -r 은 적절한 화일 소유권과 모드를 지정한 것입니다(mkisofs 맨 페이지를 보세요). 마지막의 "." 은 현재의 디렉토리에 소스들이 있다는 뜻입니다.

이제 보통의 cdrecord 명령으로 CD 를 구워 부팅하면 됩니다.

11.4. 부팅가능한 Win9x 시디롬 만들기

해야 할 일은 원본 시디에 사용된 부팅 이미지를 뽑아내는 것입니다. 하지만 단순히 리눅스상에서 CD 를 마운트해 dd 로 앞부분의 1440k 를 뽑아 플로피디스크로 복사하거나 boot.img 같은 화일로 만들 수가 없습니다. 우선 소스 시디롬으로 부트합시다.

일단 Win98 CD 로 부팅했다면 당신은 A: 이라는 프롬프트를 보게될텐데 이것은 사실 램디스크입니다. 그리고 D: 나 Z: 등은 모든 인스톨매체들이 됩니다. 도스의 diskcopy 명령어를 써서 A: 이미지를 실제의 플로피 드라이브인 B: 로 복사합니다. 명령어는 아래와 같습니다.
diskcopy A: B:
이것은 dd 와 같은 역할을 합니다. 이렇게 제작된 디스크로부터 부팅한 후, 부팅 과정이 소스시디에서와 비슷한지를 테스트해보십시요. 이상이 없다면 이 플로피에 dd 명령을 써서 boot.img 같은 파일로 만드세요. 그 다음 과정은 위에서 설명한 것과 동일합니다.