help: @echo "Build a minimal Linux system" @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 minimal Linux for example with 'qema -hda minilinux.img'" .PHONY: help run all step1 step2 step3 step4 step5 mount-disk umount-disk mount-root umount-root 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: disk-image mount-root directory-layout initial-devices step3: grub grub-loader #step4: kernel uclibc busybox step4: kernel busybox gpm step5: perl # disk image and directories directory-layout: cd target && mkdir bin boot dev etc home lib mnt root sbin tmp usr var proc sys cd target/boot && mkdir grub 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 16065 chmod 666 minilinux.img /sbin/losetup /dev/loop0 minilinux.img dd if=/dev/zero of=/dev/loop0 bs=1024 count=2048 dd if=mbr of=/dev/loop0 bs=512 count=1 echo ',2,L' | /sbin/sfdisk -H 255 -S 63 -C 2 --no-reread /dev/loop0 /sbin/losetup -d /dev/loop0 /sbin/losetup -o 512 /dev/loop0 minilinux.img /sbin/mke2fs /dev/loop0 losetup -d /dev/loop0 mkdir target # grub boot loeader grub: tar zxf tarballs/grub-0.97.tar.gz mkdir grub-build && cd grub-build && ../grub-0.97/configure --prefix=`pwd` cd grub-build && make cd grub-build && make install cp grub-build/lib/grub/i386-pc/stage1 target/boot/grub cp grub-build/lib/grub/i386-pc/stage2 target/boot/grub cp menu.lst target/boot/grub grub-loader: -umount target -mknod /dev/loop0 b 7 0 -mknod /dev/loop1 b 7 0 -/sbin/losetup -d /dev/loop0 -/sbin/losetup -d /dev/loop1 /sbin/losetup -o 512 /dev/loop1 minilinux.img ln -s /dev/loop1 /dev/loop01 /sbin/losetup /dev/loop0 minilinux.img grub-build/sbin/grub --batch --no-floppy --device-map=devices.map < grub.install /sbin/losetup -d /dev/loop0 /sbin/losetup -d /dev/loop1 rm /dev/loop01 /sbin/losetup -o 512 /dev/loop0 minilinux.img mount /dev/loop0 target grub-clean: -rm -rf grub-build -rm -rf grub-0.97 # Linux kernel kernel: -rm -rf linux-2.6.28.8 tar jxf tarballs/linux-2.6.28.8.tar.bz2 cp kernel-config linux-2.6.28.8/.config cd linux-2.6.28.8 && make bzImage cp linux-2.6.28.8/arch/i386/boot/bzImage target/boot/bzImage-2.6.28.8 kernel-clean: -rm -rf linux-2.6.28.8 # micro C library uclibc: -rm -rf uClibc-0.9.30.1 tar jxf tarballs/uClibc-0.9.30.1.tar.bz2 cp uclibc-config uClibc-0.9.30.1/.config cd uClibc-0.9.30.1 && make CROSS=i486-pc-linux-gnu- cd uClibc-0.9.30.1 && make install DESTDIR=/tools uclibc-clean: -rm -rf uClibc-0.9.30.1 # busybox busybox: -rm -rf busybox-1.13.3 tar jxf tarballs/busybox-1.13.3.tar.bz2 cp busybox-config busybox-1.13.3/.config cd busybox-1.13.3 && make cd busybox-1.13.3 && make install cp /lib/libcrypt.so.1 target/lib cp /lib/ld-linux.so.2 target/lib cp /lib/libm.so.6 target/lib cp /lib/libc.so.6 target/lib cp /lib/libdl.so.2 target/lib cp /lib/libpthread.so.0 target/lib -cp /lib/libpcre.so.0 target/lib -cp /usr/lib/libpcre.so.3 target/lib busybox-clean: -rm -rf busybox-1.13.3 gpm: -rm -rf gpm-1.20.6 tar jxf tarballs/gpm-1.20.6.tar.bz2 cd gpm-1.20.6 && ./configure --prefix=/usr --without-curses cd gpm-1.20.6 && make LDFLAGS="-lm" cd gpm-1.20.6 && cp src/gpm ../target/usr/sbin gpm-clean: -rm -rf gpm-1.20.6 perl: -rm -rf perl-5.10.0 tar zxf tarballs/perl-5.10.0.tar.gz cd perl-5.10.0 && make -f Makefile.micro cd perl-5.10.0 && cp microperl ../target/usr/bin/perl perl-clean: -rm -rf perl-5.10.0 # 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: grub-clean uclibc-clean kernel-clean busybox-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/busybox-1.13.3.tar.bz2 || \ wget -O tarballs/busybox-1.13.3.tar.bz2 http://www.busybox.net/downloads/busybox-1.13.3.tar.bz2 -test -r tarballs/grub-0.97.tar.gz || \ wget -O tarballs/grub-0.97.tar.gz ftp://alpha.gnu.org/gnu/grub/grub-0.97.tar.gz -test -r tarballs/perl-5.10.0.tar.gz || \ wget -O tarballs/perl-5.10.0.tar.gz http://www.cpan.org/src/perl-5.10.0.tar.gz -test -r tarballs/linux-2.6.28.8.tar.bz2 || \ wget -O tarballs/linux-2.6.28.8.tar.bz2 http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.8.tar.bz2 -test -r tarballs/gpm-1.20.6.tar.bz2 || \ wget -O tarballs/gpm-1.20.6.tar.bz2 http://unix.schottelius.org/gpm/archives/gpm-1.20.6.tar.bz2 -test -r tarballs/uClibc-0.9.30.1.tar.bz2 || \ wget -O tarballs/uClibc-0.9.30.1.tar.bz2 http://www.uclibc.org/downloads/uClibc-0.9.30.1.tar.bz2