Programming

Compile a x86 vanilla Linux and test with QEMU

daehee87 2013. 8. 8. 10:06

먼저 원하는 바닐라버전의 커널을 컴파일하면 

arch/x86/boot 밑에 bzImage 커널 이미지파일이 생성된다.

이 이미지를 qemu-system-i386 의 -kernel 옵션으로 넘겨주고


dd if=/dev/zero of=ramdisk.img bs=1M count=4


이렇게 dd 로 램디스크를 생성해준다음에


mkfs.ext2 ramdisk.img


mkfs 틀로 파일시스템 포맷으로 만들어주고


mount -o loop ramdisk.img rootfs


마운트 한다음 그 안에 dev 디렉토리를 만들고 캐릭터 디바이스 드라이버 파일을

아래처럼 만들어준다.


mkdir rootfs/dev

mknod rootfs/dev/console c 5 1

mknod rootfs/dev/ram b 1 0

umount rootfs


그리고 static 컴파일된 간단한 C 프로그램을 넣어준다음 이를 아래처럼 커널옵션의 init 인자로 지정해주면


qemu -kernel arch/x86/boot/bzImage  -initrd ../qemu-i386/ramdisk.img  -append "root=/dev/ram init=/init"


커널이 부팅된이후 최초로 해당 프로그램이 실행된다.

이런식으로 커널 부팅후 간단한 C 프로그램을 돌리면 돌아간다.


이제 램디스크에 busybox 로 온갖 툴들을 모두 static 컴파일하여 넣어주면

우분투같은 제대로된 리눅스 시스템을 만들수 있다.

일단 busybox 소스를 다운받고 컴파일...


wget http://www.busybox.net/downloads/busybox-1.21.0.tar.bz2

tar xvf busybox-1.21.0.tar.bz2

cd busybox-1.21.0

make menuconfig     # This creates a file called ".config"

# Busybox Settings  --->Build Options  --->[*] Build BusyBox as a static binary (no shared libs)

make -j 2           # This creates the "busybox" executable


* menuconfig 화면에서 BusyBox 를 static 으로 컴파일하는 옵션을 설정해줘야함.


커파일했으면 BusyBox 의 모든 바이너리를 램디스크에 아래처럼 넣을수 있음.


mount -o loop ramdisk.img rootfs # mount it again

make CONFIG_PREFIX="Path-to/rootfs" install

# to fix the the /dev/tty? no found 

for i in {1..4} ; do sudo mknod dev/tty$i c 4 $i; done;  # 정확히 왜하는지 모르겠음

umount rootfs


이렇게 BusyBox 를 램디스크에 세팅해주고 이번에는 시작프로그램으로 쉘을 지정해주면


qemu-system-i386 -kernel bzImage  -initrd ramdisk.img -append "root=/dev/ram init=/ash"


아래처럼 쉘을 띄울수 있는 리눅스를 부팅할 수 있다.

다만 init 프로세스로부터 시작하지 않고 /proc 파일시스템이 마운트가 안되어있다.

/proc 파일시스템의 경우 램디스크상에 proc 디렉토리를 생성해두고


mount -t proc /proc /proc


이렇게 런타임에 마운트 할 수 있다.



세팅 다되었을때 작업디렉토리의 모습



요약하자면 linux-3.8.1 의 커널소스를 컴파일하여 arch/x86/boots/bzImage 를 얻고, ramdisk.img 를 dd 로 생성하여 그 속에 busybox 를

컴파일하여 생성된 static 바이너리들을 집어넣고 /dev 세팅해주고, 커널 option(-append) 로 루트파일시스템과 init 프로세스 세팅해준것임.

참조 : http://blog-junstrix.rhcloud.com/2013/01/23/compiling-linux-kernel-and-running-on-qemu/