3. 부트디스크와 부팅 과정

부트디스크란 기본적으로 플로피 디스켓 한장에 쏙 들어가는 축소판 리눅스 시스템입니다. 부트디스크는 완전한 풀 사이즈의 리눅스 시스템의 기능 중 많은 부분을 그대로 수행할 수 있어야 합니다. 부트 디스크 제작에 앞서, 당신은 리눅스의 부팅 과정의 기본 원리를 이해해야만 합니다. 여기서는 이 문서의 내용을 이해할수 있을 정도의 기본적인 내용만을 설명할 것입니다. 많은 세부적인 사항과 기타 옵션들에 관한 것은 생략했습니다.

3.1. 부팅 과정

모든 PC 시스템들은 롬(정확히는 BIOS)내의 코드를 실행시키는 것으로 부팅을 시작합니다. 이 코드는 부트 드라이브의 섹터 0, 실린더 0 부분을 읽어들입니다. 부트 드라이브는 보통 첫번째 드라이브(도스로 말하자면 A:, 리눅스로 말하자면 /dev/fd0)를 말합니다. 그 다음, BIOS 는 읽어들인 이 섹터의 내용을 실행합니다. 대부분의 부트 가능한 디스크들은 섹터 0, 실린더 0 영역에 다음 내용 중 한 가지를 담고 있습니다.

만일 리눅스 커널이 디스켓에 직접 복사된 경우(raw copy)라면 디스크의 첫번째 섹터는 리눅스 커널 그 자체의 첫번째 섹터가 됩니다. 이 첫번째 섹터는 부트 디바이스로부터 커널의 나머지 부분을 계속 읽어들임으로써 부트 프로세스를 진행합니다.

일단 커널이 완전히 로드되면, 커널은 기본적인 디바이스들과 그 내부 데이터 구조를 초기화시킵니다. 초기화가 완료되면 커널 이미지내의 특정한 위치에 있는 램디스크 워드라는 것을 읽습니다. 이 워드는 루트 파일시스템을 어디에서 어떻게 찾아야 하는지를 나타내고 있습니다. 루트 파일시스템이란 단순히 "/" 에 마운트되는 파일시스템을 말합니다. 커널은 어디에서 루트 파일시스템을 찾아야 하는지를 알아야만 합니다. 만일 커널이 그 위치에서 로드 가능한 이미지를 찾지 못한다면 시스템은 멈춰버리게 됩니다.

어떤 부팅의 경우에는 — 주로 디스켓에서 부팅하는 경우 — 루트 파일시스템을 램디스크로 로드하기도 합니다. 램디스크란 시스템의 램의 일부를 마치 디스크처럼 취급하는 것입니다. 램은 플로피디스크보다 수천배 이상 빠르기 때문에 시스템을 빠르게 구동시킬 수 있습니다. 또한, 루트 파일시스템을 압축시켜 플로피에 담은 경우, 커널은 플로피로부터 이 압축을 풀면서 램디스크로 로드할 수 있습니다. 따라서 좀 더 많은 파일들을 디스켓 상에 압축시켜 둘 수 있습니다.

일단 루트 파일시스템이 로드되어 마운트되면 다음과 같은 메시지를 볼 수 있을 것입니다.
VFS : Mounted root (ext2 filesystem) readonly.

일단 시스템이 루트 파일시스템을 로드하는데 성공하면, 다음으로 루트 파일시스템에 있는 init 프로그램을 찾아 실행을 시도합니다(/bin 이나/sbin 에 들어있습니다). init 는 그 설정파일인 /etc/inittab 에서 sysinit 라인을 찾아 그에 해당하는 이름의 스크립트를 실행시킵니다. sysinit 스크립트는 보통 /etc/rc/etc/init.d/boot 같은 것들입니다. 이 스크립트는 쉘 명령어로 짜여진 것으로서 하드디스크에 대해 fsck 를 실행하거나, 필요한 커널 모듈들을 로드하기도 하고, 스와핑을 초기화시키고, 네트웍을 초기화시키며 /etc/fstab 에 적힌 디스크들을 마운트하기도 합니다.

이 스크립트는 대개 다른 여러가지 스크립트들을 또 동작시킵니다. 즉, 초기화 과정을 모듈화시킨 것입니다. 예를 들면, 일반적인 SysVinit 구조에서는 /etc/rc.d/ 디렉토리 밑에 복잡한 구조의 하위디렉토리가 있고 각각의 하위디렉토리에는 수많은 시스템 서비스들을 어떻게 온오프 시키는지를 정해놓은 파일들이 있습니다. 하지만 부트디스크에서 사용하는 sysinit 스크립트는 보통 매우 간단한 것입니다.

sysinit 스크립트의 실행이 끝나면 다시 init 프로세스로 조종권이 돌아오고, 이번에는 default runlevel 단계로 들어갑니다. default runlevel 은 inittab 파일내에 initdefault 키워드로 지정되어 있습니다. runlevel 라인은 주로 콘솔이나 tty 를 통한 통신을 책임지는 getty 같은 프로그램을 지정합니다. 우리에게 익숙한 "login:" 프롬프트 따위를 출력해 주는 것이 바로 getty 프로그램입니다. 이제 getty 프로그램은 로그인 인증 처리와 user 세션을 마련해주는 login 프로그램을 구동시킵니다.

3.2. 디스크의 종류

기본적인 부팅 과정을 살펴보았으므로 이제 필요한 디스크들을 종류별로 정의해봅시다. 디스크를 4 가지 종류로 나눠봅시다. 이 문서에서 "디스크" 라는 단어는 특별한 언급이 없는 한 플로피디스켓을 의미합니다만 대부분의 경우 그 내용은 하드디스크에도 그대로 적용될 수 있습니다.

boot

부트 가능한 커널을 포함한 디스크. 이 디스크는 커널을 부트시키는 용도로 사용되며, 이렇게 로드된 커널은 또다른 디스크에 위치하고 있는 루트 파일시스템을 로드할 수 있습니다. 보통, 부트디스크상의 커널은 루트 파일시스템이 어디에 위치하고 있는지를 미리 지정받아 알고 있어야만 합니다.

대부분의 경우 부트디스크는 다른 디스켓상의 루트 파일시스템을 로드하게 되지만, 때로는 하드디스크에 있는 루트 파일시스템을 로드하도록 설정할 수도 있습니다. 이런 기법은 주로 새로운 커널을 테스트해볼 때 사용됩니다(사실 "make zdisk" 명령도 커널 소스코드로부터 자동으로 이런 부트디스크를 만드는 명령입니다).

root

리눅스 시스템 구동에 필요한 파일들을 가진 파일시스템을 루트 파일 시스템이라 하며, 이 루트 파일시스템을 담은 디스크가 루트 디스크입니다. 루트 디스크가 꼭 커널이나 부트로더를 함께 담고 있을 필요는 없습니다.

일단 커널이 부트된 상태라면 루트 디스크는 다른 어떤 디스크도 필요없이 독자적으로 시스템을 운용할 수 있습니다. 보통, 루트 디스크는 자동적으로 램디스크로 복사됩니다. 램디스크를 사용하면 루트 디스크에 대한 액세스가 훨씬 빠르며, 또한 디스크 드라이브를 비울수 있어 거기에 유틸리티 디스크를 넣을 수 있습니다.

boot/root

커널과 루트 파일시스템을 한장에 모두 담고있는 디스크를 말합니다. 바꾸어 말하면, 하드디스크 없이도 이 디스크는 리눅스 시스템을 부트하고 운용하는데 필요한 모든 것을 다 가지고 있는 것입니다. 이러한 타입의 디스크의 장점은 콤팩트하다는 것입니다 — 필요한 모든 것이 한 장의 디스크에 들어갑니다. 하지만 리눅스의 모든 것이 점차 커져가는 추세에 있기 때문에, 비록 압축해서 담을 수 있다고는 해도 한 장의 디스켓에 모든 것을 담는 것은 점점 어려워지고 있습니다.

utility

그 밖의 여러가지 데이터를 담은 디스켓으로서, 파일시스템을 담고는 있지만 루트 파일시스템으로서 마운트되는 것은 아닙니다. 이것은 추가적인 데이터 디스크입니다. 루트 디스크 한장에 다 담기 힘들 경우, 여분의 유틸리티들을 이 디스크에 담게 됩니다.

일반적으로 "부트디스크를 제작"한다고 말할 때는 boot(커널) 와 root(파일들) 부분을 모두 만드는 것을 뜻합니다. 두 부분을 하나의 디스크에 담을 수도 있고(boot/root 디스크) 두 장의 디스크로 분리하여 담을수도 있습니다(boot + root 디스크들). 아마도 boot 디스켓과 root 디스켓을 각각 따로 만들고 그래도 모자라는 경우 한두 장의 utility 디스켓을 더 만드는 것이 복구 디스켓들을 제작하는 가장 유연한 방법일 것입니다.