부트디스크란 기본적으로 플로피 디스켓 상에 쏙 들어가는 미니어처, 즉 축소판 리눅스 시스템입니다. 부트디스크는 완전한 풀 사이즈의 리눅스 시스템의 기능 중 많은 부분을 그대로 수행할 수 있어야만 합니다. 부트 디스크 제작에 앞서 당신은 기본적인 리눅스의 부트 프로세스를 이해해야만 합니다. 여기서는 이 문서의 내용을 이해할수 있을 정도의 기본적인 내용만을 설명할 것입니다. 많은 세부적인 사항과 기타 옵션에 대한 것은 생략했습니다.
모든 PC 시스템들은 롬(정확히는 BIOS)내의 코드를 실행시켜서 부트프로세스를 시작합니다. 이 코드는 부트 드라이브의 섹터 0, 실린더 0 부분의 섹터를 읽어들입니다. 부트드라이브는 보통 첫번째 드라이브(도스로 말하자면 A:, 리눅스로 말하자면 /dev/fd0)를 말합니다. 그 다음, 바이오스는 읽어들인 이 섹터의 내용을 실행합니다. 대부분의 부트 가능한 디스크들은 섹터 0, 실린더 0 영역에 다음 내용 중 하나를 담고 있습니다.
만일 리눅스 커널이 디스켓에 직접 복사된 경우(raw copy)라면 디스크의 첫번째 섹터는 리눅스 커널 그 자체의 첫번째 섹터가 됩니다. 이 첫번째 섹터는 부트 디바이스로부터 커널의 나머지 부분을 계속 읽어들임으로써 부트 프로세스를 진행합니다.
일단 커널이 완전히 로드되면, 이제 기본적인 디바이스들을 초기화시키게됩니다. 그 다음, 특정 디바이스에서 루트 파일시스템을 찾아 ''/''에 마운트하려고 시도합니다. 이때 커널은 어디에서 루트 파일시스템을 찾아야 하는지를 반드시 알고 있어야만 합니다. 만일 커널이 그 위치에서 로드 가능한 이미지를 찾지 못한다면 시스템은 멈춰버리게 됩니다.
어떤 부트방법은 -- 주로 디스켓에서 부팅하는 경우 -- 루트 파일시스템을 램디스크로 로드하기도 합니다. 램디스크란 시스템의 RAM 의 일부를 마치 디스크처럼 취급하는 것입니다. 시스템을 램디스크로 로드하는 이유는 두가지입니다. 첫째, 램은 플로피디스크보다 수천배 이상 빠르기 때문에 시스템 구동이 빠릅니다. 둘째, 루트 파일시스템을 압축시켜 플로피에 담은 경우, 커널은 이 압축을 풀면서 램디스크로 로드할 수 있습니다. 따라서 좀 더 많은 파일들을 디스켓 상에 압축시켜 둘 수 있는 장점이 있습니다.
일단 루트 파일시스템이 적재되어 마운트되면 다음과 같은 메시지를 볼 수 있을 것입니다.
VFS : Mounted root (ext2 filesystem) readonly.
이 시점에 이르면 시스템은 루트 파일시스템에 있는 init 프로그램을 찾아서 실행시킵니다 (/bin 이나 /sbin 에 들어있습니다). init 는 설정파일인 /etc/inittab 에서 sysinit 라인을 찾아 그에 해당하는 스크립트를 실행시킵니다. sysinit 스크립트는 보통 /etc/rc 나 /etc/init.d/boot 같은 것들입니다. 이 스크립트는 쉘 명령어로 짜여진 것으로서 아래와 같은 기본적인 시스템서비스를 제공합니다.
이 스크립트는 대개 다른 여러가지 스크립트들을 또 동작시킵니다. 즉, 초기화 과정을 모듈화시킨 것입니다. 예를 들면 일반적인 SysVinit 구조에서는 /etc/rc.d/ 디렉토리 밑에 복잡한 구조의 하위디렉토리가 있고 각각의 하위디렉토리에는 수많은 시스템 서비스들을 어떻게 온오프 시키는지를 정해놓은 파일들이 있습니다. 하지만 부트디스크에서 사용하는 sysinit 스크립트는 보통 매우 간단한 것입니다.
sysinit 스크립트가 종료되면 다시 init 프로세스로 조종권이 돌아오고, 이번에는 default runlevel 단계로 들어갑니다. default runlevel 은 inittab 파일에 initdefault 키워드로 지정되어 있습니다. runlevel 라인은 주로 콘솔이나 tty 들을 통한 통신을 책임지는 getty 같은 프로그램을 지정합니다. 우리에게 익숙한 ''login:'' 같은 프롬프트를 표시해 주는 것이 바로 getty 류 프로그램입니다. 이제 getty 프로그램은 로그인 인증을 처리하는 login 프로그램을 구동시킨 후 user 세션을 마련합니다.
기본적인 부트 프로세스를 살펴보았으므로, 이제 필요한 디스크들을 종류별로 정의해봅시다. 디스크를 4가지 종류로 나눠봅시다. 이 문서에서 ''디스크'' 라는 단어는 특별한 언급이 없는 한 플로피디스켓을 의미합니다만 대부분의 경우 그 내용은 하드디스크에도 그대로 해당될 수 있습니다.
부트 가능한 커널을 포함한 디스크. 이 디스크는 커널을 부트시키는 용도로 사용되며, 이렇게 로드된 커널은 또다른 디스크에 위치하고 있는 루트 파일시스템을 로드할 수 있습니다. 보통, 부트디스크상의 커널은 루트 파일시스템이 어디에 위치하고 있는지를 반드시 알고 있어야만 합니다.
대부분, 부트디스크는 다른 디스켓으로부터 루트 파일시스템을 로드하지만 때로는 하드디스크에 있는 루트 파일시스템을 로드하도록 설정할 수도 있습니다. 이런 기법은 주로 새로운 커널을 테스트해볼 때 사용됩니다(사실 ''make zdisk'' 명령은 커널 소스코드로부터 자동으로 부트디스크를 만드는 명령입니다).
리눅스 시스템의 운용에 필요한 파일들을 가진 파일시스템을 루트 파일 시스템이라 하며 이 루트 파일시스템을 담은 디스크가 root 디스크입니다. 루트 디스크가 반드시 커널이나 부트로더를 가지고 있을 필요는 없습니다.
일단 커널이 부트된 상태라면 루트디스크는 다른 어떤 디스크도 필요없이 독자적으로 시스템을 운용할 수 있습니다. 보통, 루트디스크는 자동적으로 램디스크로 복사됩니다. 램디스크를 사용하면 루트 파일시스템에 대한 액세스가 훨씬 빠르며, 또한 디스크 드라이브를 비워 유틸리티 디스크를 넣을 수 있습니다.
커널과 루트 파일시스템을 한장에 모두 가지고 있는 디스크를 말합니다. 바꾸어 말하면, 하드디스크 없이도 이 디스크는 리눅스 시스템을 부트하고 운용하는데 필요한 모든 것을 다 가지고 있는 것입니다. 이러한 류의 디스크의 장점은 콤팩트하다는 것입니다 -- 필요한 모든 것이 한 장의 디스크에 들어갑니다. 하지만 리눅스의 모든 것이 점차 커져가는 추세에 있기 때문에 비록 압축해서 담을 수 있다고는 해도 한 장의 디스켓에 모든 것을 담는 것은 점점 어려워지고 있습니다.
그 밖의 여러가지 데이터를 담은 디스켓으로서 파일시스템을 가지고 있지만 루트 파일시스템으로서 마운트되는 것은 아닙니다. 루트 디스크 한장에 다 담기 힘들 경우 여분의 유틸리티들을 이 디스크에 담게 됩니다.
일반적으로 ''부트디스크를 제작" 한다고 말할 때는 boot(kernel) 와 root(files) 부분을 모두 만드는 것을 뜻합니다. 두 부분을 하나의 디스크에 담을 수도 있고(a single boot/root disk) 두 장의 디스크로 분리하여 담을수도 있습니다(boot + root disks). 아마도 boot 디스켓과 root 디스켓을 따로 만들고 그래도 모자라는 경우 한두 장의 utility 디스켓을 더 만드는 것이 복구 디스켓을 제작하는 가장 유연한 방법일 것입니다.