본문 바로가기

Programming

Compile a x86 vanilla Linux and test with QEMU

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

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/



'Programming' 카테고리의 다른 글

Linux kernel slab allocator  (0) 2013.08.10
Extracting Kernel ELF image from bzImage  (0) 2013.08.09
using IPv6 address  (0) 2013.07.20
Linux ARM system call table  (0) 2013.07.18
Linux x64 system call table  (0) 2013.07.17