help: @echo "Build a minimal Linux system" @echo "" @echo "source - download source code" @echo "" @echo "all - create all images" @echo "qemu - create an image for QEMU" @echo "vdi - create an image for VirtualBox" @echo "vmdk - create an image for VMware" @echo "" @echo "clean - cleanup build artifacts" @echo @echo "run-qemu - run in QEMU" @echo "" @echo "run minimal Linux for example with 'qema -hda minilinux.img'" .PHONY: help run-qemu all step1 step2 step3 step4 step5 mount-disk umount-disk mount-root umount-root # software versions SYSLINUX_VERSION=4.07 KERNEL_VERSION=3.1.4 UCLIBC_VERSION=0.9.32 BUSYBOX_VERSION=1.27.2 ACPID_VERSION=1.0.10 GPM_VERSION=1.20.7 PERL_VERSION=5.12.1 LUA_VERSION=5.1.4 PARALLEL=-j12 # TODO: make it a build option depending on the target # architecture we want to build #LIBDIR=lib LIBDIR=lib64 all: qemu vdi vmdk zip-vdi zip-vmdk vdi: -rm -f minilinux.vdi ./vditool DD minilinux.vdi minilinux.img ./vditool SHRINK minilinux.vdi chmod 666 minilinux.vdi vmdk: qemu-img convert -f raw minilinux.img -O vmdk minilinux.vmdk chmod 666 minilinux.vmdk chmod 777 minilinux.vmx zip-vdi: zip -9 -v -u minilinux.zip minilinux.vdi mv minilinux.zip minilinux-virtualbox.zip zip-vmdk: zip -9 -v -u minilinux minilinux.vmx minilinux.vmdk mv minilinux.zip minilinux-vmware.zip qemu: clean step1 step2 step3 step4 step5 umount-root step1: # step2: initial setup, image, directory layout, device inodes step2: disk-image mount-root directory-layout initial-devices # step3: boot loader step3: syslinux syslinux-loader # step4: kernel, uclibc C-library, busybox, basic tools, ACPI daemon step4: kernel busybox acpid # step5: additional user space tools: # - GPM for mouse copy-pate # - Miniperl # - Lua step5: gpm perl lua # disk image and directories directory-layout: cd target && mkdir bin boot dev etc home $(LIBDIR) mnt root sbin tmp usr var proc sys cd target/boot && mkdir extlinux cd target/var && mkdir lock log run spool cd target/usr && mkdir bin include lib local sbin share src cd target/usr/share && mkdir man cd target/usr/share/man && mkdir man1 man2 man3 man4 man5 man6 man7 man8 man9 cd target/usr && ln -s share/man man cd target/etc && mkdir init.d cp inittab passwd group nsswitch.conf hosts motd issue target/etc cp rcS target/etc/init.d initial-devices: rm -rf target/dev/* mknod target/dev/console c 5 1 mknod target/dev/null c 1 3 mknod target/dev/zero c 1 5 mknod target/dev/hda b 3 0 mknod target/dev/hda1 b 3 1 mknod target/dev/tty0 c 4 0 mknod target/dev/tty1 c 4 1 mknod target/dev/tty2 c 4 2 mknod target/dev/tty3 c 4 3 mknod target/dev/tty4 c 4 4 mknod target/dev/tty5 c 4 5 mknod target/dev/tty6 c 4 6 mknod target/dev/ttyS0 c 4 64 mknod target/dev/psaux c 10 1 disk-image: qemu-img create minilinux.img 16450560 chmod 666 minilinux.img /sbin/losetup /dev/loop0 minilinux.img dd if=/dev/zero of=/dev/loop0 bs=512 count=32130 echo ',2,L,*' | /sbin/sfdisk -H 255 -S 63 -C 2 --no-reread /dev/loop0 sync && sleep 1 /sbin/losetup -d /dev/loop0 /sbin/losetup -o 512 /dev/loop0 minilinux.img /sbin/mke2fs /dev/loop0 sync && sleep 1 losetup -d /dev/loop0 mkdir target # syslinux boot loeader syslinux: tar jxf tarballs/syslinux-$(SYSLINUX_VERSION).tar.gz cd syslinux-$(SYSLINUX_VERSION) && make $(PARALLEL) syslinux-$(SYSLINUX_VERSION)/extlinux/extlinux -i target/boot/extlinux/. cp extlinux.conf target/boot/extlinux/. syslinux-loader: /sbin/losetup /dev/loop1 minilinux.img cat syslinux-$(SYSLINUX_VERSION)/mbr/mbr.bin > /dev/loop1 sync && sleep 1 /sbin/losetup -d /dev/loop1 syslinux-clean: -rm -rf syslinux-build -rm -rf syslinux-$(SYSLINUX_VERSION) # Linux kernel kernel: -rm -rf linux-$(KERNEL_VERSION) tar jxf tarballs/linux-$(KERNEL_VERSION).tar.bz2 cp kernel-config.`uname -m` linux-$(KERNEL_VERSION)/.config cd linux-$(KERNEL_VERSION) && ( yes '' | make $(PARALLEL) bzImage ) cp linux-$(KERNEL_VERSION)/arch/x86/boot/bzImage target/boot/bzImage-$(KERNEL_VERSION) kernel-clean: -rm -rf linux-$(KERNEL_VERSION) # micro C library uclibc: -rm -rf uClibc-$(UCLIBC_VERSION) tar jxf tarballs/uClibc-$(UCLIBC_VERSION).tar.bz2 cp uclibc-config uClibc-$(UCLIBC_VERSION)/.config cd uClibc-$(UCLIBC_VERSION) && make $(PARALLEL) CROSS=i486-pc-linux-gnu- cd uClibc-$(UCLIBC_VERSION) && make install DESTDIR=/tools uclibc-clean: -rm -rf uClibc-$(UCLIBC_VERSION) # busybox busybox: -rm -rf busybox-$(BUSYBOX_VERSION) tar jxf tarballs/busybox-$(BUSYBOX_VERSION).tar.bz2 cp busybox-config busybox-$(BUSYBOX_VERSION)/.config cd busybox-$(BUSYBOX_VERSION) && make $(PARALLEL) cd busybox-$(BUSYBOX_VERSION) && make install cp /$(LIBDIR)/libcrypt.so.1 target/$(LIBDIR) cp /$(LIBDIR)/ld-linux-x86-64.so.2 target/$(LIBDIR) cp /$(LIBDIR)/libm.so.6 target/$(LIBDIR) cp /$(LIBDIR)/libc.so.6 target/$(LIBDIR) cp /$(LIBDIR)/libdl.so.2 target/$(LIBDIR) cp /$(LIBDIR)/libpthread.so.0 target/$(LIBDIR) -cp /$(LIBDIR)/libpcre.so.0 target/$(LIBDIR) #??? # -cp /usr/$(LIBDIR)/libpcre.so.3 target/$(LIBDIR) busybox-clean: -rm -rf busybox-$(BUSYBOX_VERSION) gpm: -rm -rf gpm-$(GPM_VERSION) tar jxf tarballs/gpm-$(GPM_VERSION).tar.bz2 cd gpm-$(GPM_VERSION) && ./autogen.sh cd gpm-$(GPM_VERSION) && ./configure --prefix=/usr --without-curses cd gpm-$(GPM_VERSION) && make LDFLAGS="-lm" $(PARALLEL) cd gpm-$(GPM_VERSION) && cp src/gpm ../target/usr/sbin gpm-clean: -rm -rf gpm-$(GPM_VERSION) acpid: -rm -rf acpid-$(ACPID_VERSION) -rm -rf target/etc/acpi tar zxf tarballs/acpid-$(ACPID_VERSION).tar.gz cd acpid-$(ACPID_VERSION) && make $(PARALLEL) cd acpid-$(ACPID_VERSION) && cp acpid ../target/usr/sbin/acpid mkdir target/etc/acpi mkdir target/etc/acpi/events cp acpid-anything target/etc/acpi/events cp acpid-handler.sh target/etc/acpi/handler.sh chmod 775 target/etc/acpi/handler.sh acpid-clean: -rm -rf acpid-$(ACPID_VERSION) perl: -rm -rf perl-$(PERL_VERSION) tar zxf tarballs/perl-$(PERL_VERSION).tar.gz cp {Makefile.micro,miniperlmain.c} perl-$(PERL_VERSION) cd perl-$(PERL_VERSION) && make -f Makefile.micro $(PARALLEL) cd perl-$(PERL_VERSION) && cp microperl ../target/usr/bin/perl perl-clean: -rm -rf perl-$(PERL_VERSION) lua: -rm -rf lua-$(LUA_VERSION) tar zxf tarballs/lua-$(LUA_VERSION).tar.gz cd lua-$(LUA_VERSION) && make posix $(PARALLEL) cd lua-$(LUA_VERSION) && cp src/lua ../target/usr/bin/lua lua-clean: -rm -rf lua-$(LUA_VERSION) # helpers mount-disk: /sbin/losetup /dev/loop0 minilinux.img umount-disk: /sbin/losetup -d /dev/loop0 mount-root: /sbin/losetup -o 512 /dev/loop0 minilinux.img mount /dev/loop0 target umount-root: umount target /sbin/losetup -d /dev/loop0 # global clean clean: syslinux-clean uclibc-clean kernel-clean busybox-clean acpid-clean gpm-clean perl-clean -umount target -/sbin/losetup -d /dev/loop0 -rm minilinux.img -rm minilinux.vdi *-vditool-*.log -rm minilinux.vmdk minilinux.nvram minilinux.vmem minilinux.vmsd minilinux.vmss vmware*.log minilinux.vmxf minilinux*.zip -rm -rf target # download sources to tarballs source: -test -d tarballs || mkdir tarballs -test -r tarballs/syslinux-$(SYSLINUX_VERSION).tar.gz || \ wget -O tarballs/syslinux-$(SYSLINUX_VERSION).tar.gz \ http://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx//syslinux-$(SYSLINUX_VERSION).tar.bz2 -test -r tarballs/linux-$(KERNEL_VERSION).tar.bz2 || \ wget -O tarballs/linux-$(KERNEL_VERSION).tar.bz2 \ http://www.kernel.org/pub/linux/kernel/v3.0//linux-$(KERNEL_VERSION).tar.bz2 -test -r tarballs/uClibc-$(UCLIBC_VERSION).tar.bz2 || \ wget -O tarballs/uClibc-$(UCLIBC_VERSION).tar.bz2 \ http://www.uclibc.org/downloads/uClibc-$(UCLIBC_VERSION).tar.bz2 -test -r tarballs/busybox-$(BUSYBOX_VERSION).tar.bz2 || \ wget -O tarballs/busybox-$(BUSYBOX_VERSION).tar.bz2 \ http://www.busybox.net/downloads/busybox-$(BUSYBOX_VERSION).tar.bz2 -test -r tarballs/acpid-$(ACPID_VERSION).tar.gz || \ wget -O tarballs/acpid-$(ACPID_VERSION).tar.gz \ http://downloads.sourceforge.net/sourceforge/acpid/acpid-$(ACPID_VERSION).tar.gz -test -r tarballs/gpm-$(GPM_VERSION).tar.bz2 || \ wget -O tarballs/gpm-$(GPM_VERSION).tar.bz2 \ http://www.nico.schottelius.org/software/gpm/archives/gpm-$(GPM_VERSION).tar.bz2 -test -r tarballs/perl-$(PERL_VERSION).tar.gz || \ wget -O tarballs/perl-$(PERL_VERSION).tar.gz \ http://www.cpan.org/src/perl-$(PERL_VERSION).tar.gz -test -r tarballs/lua-$(LUA_VERSION).tar.gz || \ wget -O tarballs/lua-$(LUA_VERSION).tar.gz \ http://www.lua.org/ftp/lua-$(LUA_VERSION).tar.gz run-qemu: /usr/libexec/qemu-kvm -hda minilinux.img & vncviewer localhost & run-qemu: minilinux.img qemu-system-x86_64 -curses -enable-kvm -hda minilinux.img