|(40 intermediate revisions by 13 users not shown)|
=== Introduction ===
=== Introduction ===
If you don't have a mainboard supported by
LinuxBIOS don't worry: Qemu can help you to emulate one.
If you don't have a mainboard supported by don't worry: can help you to emulate one.
This nice tutorial was written by
Alan Carvalho de Assis <firstname.lastname@example.org >, with additions by Ed Swierk <email@example.com >.
This nice tutorial was written by firstname.lastname@example.org , with additions by email@example.com .
While there are many ways to use
LinuxBIOS to load and run a Linux kernel, this tutorial covers two of the most common:
While there are many ways to use to load and run a Linux kernel, this tutorial covers two of the most common:
LinuxBIOS with FILO as payload, using FILO to load a Linux kernel and initramfs from a hard disk image.
LinuxBIOS with a Linux kernel and initramfs as payload.
FILOas payload, using FILO to load a Linux kernel and initramfsfrom a hard disk image.
* with a Linux kernel and initramfsas payload.
=== Requirements ===
=== Requirements ===
You need the following
You need the following :
GCC ie. v4. x
Qemu ie. v0. 8. 2
* FILO ie. v0. 4. 2
LinuxBIOS ie. r2394
=== Creating FILO ===
(I used filo -0.4.2.tar.bz2), decompress it, enter inside directory created.
Download FILOfilo directory
First invocation of make creates the
default Config file.
First invocation of make creates the file
Edit this file as you like. The default configuration worked to me.
this file as .
$ vi Config
Run make again to create filo.elf, the ELF FILO image.
You will need this file (filo.elf) to start Linux.
This is used as a payload in LinuxBIOS, when executed it can load Linux kernel.
=== Creating LinuxBIOS ===
Download LinuxBIOS source code (I used LinuxBIOSv2-2394).
Change to directory targets/emulation/qemu-i386 and modify Config.lb to point to your filo.elf.
Return to targets directory and execute:
$ . /buildtarget emulation/qemu-i386
Go to targets/ emulation/qemu-i386/qemu-i386 and execute:
It will create the file "qemu- bios.rom"
Rename this file to "bios. bin" and copy to your HOME directory.
this . to
=== Creating your disk image ===
Create a empty file (~ 200MB):
# dd if=/dev/zero of=disk.img bs=1M count=200
Format it as ext2:
# mkfs. ext2 -F disk. img
Mount it on somewhere:
# mount disk.img / mnt/ rootfs - t ext2 - o loop
Now you need copy a root filesystem to it.
you a .
I create a directory /debian and used debootstrap command to create a basic root filesystem , but you can use any root filesystem from your distro (i.e. copy one from diskboot. img):
to root filesystem you .
# cp - R /debian/* /mnt/rootfs
Open the file /mnt/rootfs/etc/inittab and change runlevel to level 1:
Change to /mnt/rootfs/boot and copy your default vmlinuz and initrd :
# cp /boot/vmlinuz-2.6. 16-2-686 vmlinuz
# cp /
boot/ initrd.img-2.6.16-2-686 initrd
# cp //
Change to /root and umount /mnt/rootfs:
# umount /mnt/rootfs
# umount /mnt/rootfs
of root account:
Exit root account:
=== Starting LinuxBIOS in Qemu ===
Execute Qemu using the followings parameters:
using the :
$ qemu -L ~ -hda disk.img -nographic -no-kqemu -d in_asm,exec
When appear "boot:" text enter it:
boot: hda:/boot/vmlinuz root=/dev/hda initrd=/boot/initrd console=tty0 console=ttyS0,115200
If you don't have a mainboard supported by coreboot don't worry: QEMU can help you to emulate one. Using coreboot with QEMU may serve the purpose to familiarize you as a developer with coreboot and may be a reference system during development.
This nice tutorial was written by Alan Carvalho de Assis, with additions by Ed Swierk (but please use the coreboot mailing list rather than emailing the authors directly).
While there are many ways to use coreboot to load and run a Linux kernel, this tutorial covers two of the most common:
- coreboot with SeaBIOS as payload, which is the default configuration on coreboot for Intel compatible mainboards.
- coreboot with FILO as payload, using FILO to load a Linux kernel (and optional initramfs) from a hard disk image. This approach involves a bit more mechanism (it relies on FILO's built-in disk and filesystem drivers) but it produces a tiny coreboot image.
- coreboot with a Linux kernel (and optional initramfs) as payload. This cuts FILO out of the picture, but the main challenge with this approach is squeezing the resulting coreboot image into QEMU's BIOS ROM area (currently 2 MB, but easy to extend by patching QEMU).
You need the following software packages:
plus a Linux kernel and root filesystem and a working development environment (make, gcc, etc.).
Building or finding a Linux kernel
If you are using FILO, you can simply grab a Linux kernel and initramfs from your favorite distribution.
For linux as payload, you will probably need to build a kernel and initramfs from scratch, ensuring that the final coreboot image does not exceed QEMU's BIOS size limit (2MB if qemu-bios-size patch applied, 256KB otherwise). Building the kernel and initramfs is beyond the scope of this tutorial; how you configure them depends on your application.
If you plan to use kexec to chain-boot another Linux kernel, tools from these projects can help automate the process of generating a kernel and initramfs:
Since SeaBIOS is the default payload option, you don't need to change anything in the payload section of the configuration menu, and don't need to download or prepare any source code either - the build system takes care of that.
Building a FILO payload
If you plan to build your Linux kernel and root filesystem directly into coreboot, you can skip this section.
Download FILO, and cd to the filo directory
First invocation of make creates the config file.
$ make menuconfig
Run make again to create build/filo.elf, the ELF FILO image.
You will use this file (filo.elf) as the coreboot payload later on.
Building a Linux kernel payload
If you are using FILO, skip this section.
Specify the Linux as payload type and the Linux kernel (bzImage file), initrd and kernel command line that should be used in `make menuconfig`'s Payload section
See the Build HOWTO for information on how to build coreboot for this board.
This creates the coreboot image (build/coreboot.rom).
Qemu used to require patches to work with coreboot, but any current standard build (as packaged by distributions) should be good enough.
Creating a hard disk image
If you are using FILO, you must create a hard disk image containing the Linux kernel and optional initramfs that FILO loads.
Whether or not you use FILO, you may also wish to populate the disk image with the root filesystem of whatever Linux distribution you want to run.
Create an empty disk image:
$ qemu-img create -f raw disk.img 200M
$ mkfs.ext2 -F disk.img
The remaining steps must be performed as root. Create a temporary mountpoint and mount the image:
# mkdir /mnt/rootfs
# mount -o loop disk.img /mnt/rootfs
Create a boot directory and copy your Linux kernel (vmlinuz) and initramfs (initrd) to it:
# mkdir /mnt/rootfs/boot
# cp vmlinuz /mnt/rootfs/boot/vmlinuz
# cp initrd /mnt/rootfs/boot/initrd
At this point, you can also copy a complete root filesystem to the disk image.
# cp -R /* /mnt/rootfs
Alternatively, with Debian you can use the debootstrap command to create a basic root filesystem:
# debootstrap --arch i386 sarge /mnt/rootfs http://ftp.debian.org/debian/
If you are using a debootstrap filesystem, open the file /mnt/rootfs/etc/inittab and change runlevel to level 1:
cd out of /mnt/rootfs and umount it:
# umount /mnt/rootfs
Exit from the root account:
Starting coreboot in QEMU
Execute QEMU using the following parameters:
$ qemu -bios path/to/coreboot.rom -hda disk.img -nographic
The -bios option tells QEMU to use path/to/coreboot.rom as its BIOS. The -nographic option suppresses the graphical VGA display and connects the virtual machine's serial port to your console. If you want to keep VGA display, you can use "-serial stdio" instead, which only redirects serial to the console.
You should now see all sorts of interesting coreboot messages, followed by Linux kernel boot messages or a FILO prompt.
If you are using FILO, enter at the boot: prompt:
kernel hda:/boot/vmlinuz root=/dev/hda