먼저 원하는 바닐라버전의 커널을 컴파일하면
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
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 |