부팅 디스켓 두장으로 작은 리눅스를 만드는 방법을 설명하고 있다. 참고 여기서 설명하는 내용들은 http://pain.kernel.pe.kr/sgml/boot-disk/index.html 를 참고했다.
들어가기 전에
몇가지 준비해야 할 것들이 있다. 준비물은 다음과 같다.
- 플로피 디스켓 2장
- 미지리눅스 2.0
- busybox(busybox-0.60.3.tar.gz)
총 2 개의 디스켓 중에서 하나는 커널과 부트로더를 넣을 것이고, 나머지 하나에는 루트(/) 파일시스템을 넣을 것이다. 미지리눅스의 경우, 커널과 부트로더를 위해서 필요하다. 2.0 의 경우 총 3장으로 되어 있지만, 여기서 필요한 것은 첫장 뿐이다.
먼저 커널과 부트로더를 만들어보겠다.
Floppy Disk 1 (부트로더 & 커널)
앞에서 준비한 미지리눅스를 마운트해서 보면, images 아래에 boot.img 파일이 있다. 그것을 복사해와서, 마운트한다.
#mkdir /tmp/boot_image #mount -o loop boot.img /tmp/boot_image #cd /tmp/boot_image #ls -l total 1411 -rw-r--r-- 1 root root 710804 12월 17 17:46 initrd.img -rw-r--r-- 1 root root 406 8월 29 2001 menu.lst -rw-r--r-- 1 root root 974 8월 29 2001 menu.lst.all -rw-r--r-- 1 root root 14505 8월 3 2001 mizios.msg.gz -rw-r--r-- 1 root root 512 8월 3 2001 stage1 -rw-r--r-- 1 root root 132736 8월 3 2001 stage2 -rw-r--r-- 1 root root 570980 11월 1 2001 vmlinuz #
여기서는 menu.lst, stage1, stage2를 제외하고 모두 삭제하도록 한다.
이름 | 설명 |
menu.lst | GRUB 부트 로더의 config 파일로 커널이미지의 위치, root 디바이스의 위치 및 커널 파라메터 값을 셋팅할 수 있다(LILO로 치자면 lilo.conf 에 해당한다) |
stage1 | GRUB에 있어 필수적인 파일이며 부트 섹터나 MBR에 꼭 들어가야 하는 파일이다. PC의 부트 섹터가 512Byte 인것처럼 stage1 역시 512Byte의 사이즈를 가진다 |
stage2 | GRUB 이미지 파일이다. GRUB에 관한 더 상세한 내용은 http://www.gnu.org/software/grub/ 참고하기 바란다 |
이제 커널이미지를 복사해줄 차례다. 플로피 디스켓 한장에 넣을 수 있는 크기여야 하기 때문에, 현재 설치되어 있는 vmlinuz 를 사용할 수는 없다. 가장 좋은 방법은 직접 커널 컴파일을 해서 용량을 줄이는 방법이다. 하지만, 여기서는 편의상 기존의 커널 이미지를 사용하도록 한다.
바로 부팅디스켓을 만들 때, 생성되는 커널 이미지를 사용할 것이다.
공 디스켓 한장을 드라이브에 넣고,
#/sbin/mkbootdisk --device /dev/fd0 현재커널버전
위의 명령을 실행한다. 그리고 나서 마운트해서 보면, vmlinuz 라는 파일이 생성되었을 것이다.
#cp vmlinuz /tmp/boot_image/
이제는 부트로더를 수정할 차례다. menu.lst 파일을 다음과 같이 수정한다.
timeout 10 color default title floppy-boot root (fd0) append = "devfs=mount" # 부팅시 devfs 사용을 위해 kernel /vmlinuz root=/dev/fd0 vga=0x307 # 커널이미지와 루트 디바이스의 위치및 해상도
위의 작업이 끝났으면, /tmp/boot_image을 언마운트 한다.
#umount /tmp/boot_image
앞에서 만든 boot.img 파일을 실제 플로피 디스켓에 쓴다.
#dd if=boot.img of=/dev/fd0
Floppy Disk 2 (루트 파일시스템)
busybox 라고 하는 패키지를 사용해서 손쉽게(?) 루트(/) 파일시스템을 만들어 볼 것이다.
먼저 플로피 디스켓 한장 분량의 root.img 파일을 만들어보자!
#dd if=/dev/zero of=root.img bs=1024 count=1440 #mke2fs -F root.img #mkdir /tmp/root_image #mount -o loop root.img /tmp/root_image
앞에서 준비한 busybox 의 압축을 풀고 컴파일을 해줄 차례다.
#tar xzf busybox-0.60.3.tar.gz #cd busybox-0.60.3
컴파일을 하기전에 Makefile 에서 다음을 수정한다.
DOSTATIC = true
정적 라이브러리를 사용한다는 말인데, true 로 하면 바이너리 파일의 용량이 동적 라이브러리로 했을 때보다 더 커진다.
수정했으면 컴파일하고 설치한다.
#make #make PREFIX=/tmp/root_image install
아래와 같은 디렉토리를 만든다. 이 중에서 /dev, /proc, /tmp는 어떤 파일도 포함하지 않는 단지 이름뿐인 디렉토리이다.
#ls -l total 6 drwxr-xr-x 2 root root 1024 6월 15 17:22 bin/ drwxr-xr-x 2 root root 1024 6월 11 19:56 dev/ drwxr-xr-x 3 root root 1024 6월 15 16:48 etc/ drwxr-xr-x 2 root root 1024 6월 11 19:56 proc/ drwxr-xr-x 2 root root 1024 6월 11 19:59 sbin/ drwxr-xr-x 2 root root 1024 6월 12 18:23 tmp/
이것으로 끝이 아니다. 몇가지 파일들이 더 필요하다.
/etc
#ls -l total 2 -rw-r--r-- 1 root root 137 6월 11 20:00 fstab drwxr-xr-x 2 root root 1024 6월 15 17:13 init.d/ -rw-r--r-- 1 root root 0 5월 2 2001 mtab
위와 같이 만든다. 다음은 fstab 내용이며 mtab은 그냥 touch 명령으로 만들면 된다.
none /proc proc defaults 0 0 none /dev/pts devpts mode=0622 0 0 tmpfs /dev/shm tmpfs defaults 0 0 /dev/fd0 / ext2 defaults 1 1
init.d 아래에는 rcS 라는 파일을 만들고 퍼미션은 실행권한을 붙여주자. busybox의 init에서 이 rcS을 실행하기 때문에 꼭 실행권한(755)이 있어야 한다. 파일의 내용은 아래와 같다.
#!/bin/sh /bin/mount -a #exec /etc/rc.local # 만약 실행시킬 스크립트가 있다면 exec 로 # 그 파일을 실행할 수 있다.
권한을 부여한다.
#chmod 755 rcS
/dev
모든 /dev 파일을 복사할 필요는 없고, 몇가지 파일만 있으면 된다.(console, fd0, pts, shm, tty0, tty1, tty2, tty3, tty4)
기존의 리눅스 시스템에서 복사하면 된다.
#cd /tmp/root_image #cp -dpR /dev/console . ... ... ...
이제 언마운트하자.
#umount /tmp/root_image
두번째 플로피 디스크를 넣고 방금 만든 루트 이미지를 쓴다.
#dd if=root.img of=/dev/fd0
테스트 하기
이제 모든 작업이 끝났다. 앞서 만든 플로피를 넣고, 부팅한다. 여기서 플로피 부팅으로 바이오스에서 설정되어 있어야 한다. 커널부팅중에 'VFS: Insert root floppy and press ENTER' 메세지가 나오면, 두번째 디스켓을 넣고 엔터키를 누른다.
무사히 쉘 프롬프트가 떳다면 성공이다.