#!/bin/sh example_runtime_usage() { echo 'Examples:' echo ' qemu -kernel /boot/bzImage -append "root=/dev/hda init=/sbin/init rootfstype=ext2 ro" ../root_fs' echo ' qemu -kernel /usr/src/linux/arch/i386/boot/bzImage -append "root=/dev/hda init=/sbin/init rootfstype=ext2 ro" ../root_fs' echo ' qemu -kernel /usr/src/linux/arch/i386/boot/bzImage -append "root=/dev/hda ro" ../root_fs' echo ' qemu -kernel bzImage -append "root=/dev/hda ro" root_fs' echo ' qemu-system-x86_64 -kernel bzImage -append "root=/dev/hda ro force_personality32" root_fs' # initrd... qemu -no-kqemu -m 64 -initrd initrd.img -append "console=ttyS0,115200n8 console=tty0 clocksource=pit root=/dev/hda vga=ext" -kernel vmlinux linux-0.2.img-localtime -nographic } if [ ! -d "$1" ]; then example_runtime_usage exit 1 fi if ! cd $1 ; then echo Unable to cd $1 >&2 exit 1 fi umask 022 rom=/rom mkdir -p {usr/,}{s,}bin etc/init.d proc/self dev/shm root tmp ./${rom} chmod 700 root chmod 1777 tmp ################ ################ cat < etc/init.d/rcS #!/bin/sh rom=$rom mount -a mount tmpfs \$rom -t tmpfs mkdir -p \$rom/proc \$rom/dev \$rom/ro \$rom/tmp mount -o bind /dev \$rom/dev mount -o bind /proc \$rom/proc busybox cp -a bin etc lib root sbin usr \$rom/ chmod 1777 \$rom/tmp pivot_root \$rom/ \$rom/ro EOF chmod +x etc/init.d/rcS ################## ## /etc/inittab ## ################## cat < etc/inittab null::sysinit:/bin/mount -o remount,ro / null::sysinit:/bin/mount -t proc proc /proc null::sysinit:/bin/mount -a null::sysinit:/sbin/sysctl -w kernel.hostname=qemu null::sysinit:/sbin/sysctl -w kernel.domainname=busybox.net null::sysinit:/sbin/ifconfig lo 127.0.0.1 up null::sysinit:/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo ::sysinit:/etc/init.d/rcS #::askfirst:-/bin/sh ::respawn:/bin/sh #tty1::respawn:/sbin/getty 38400 tty1 #tty2::askfirst:-/bin/sh #tty3::askfirst:-/bin/sh #tty4::askfirst:-/bin/sh #tty4::respawn:/sbin/getty 38400 tty5 #tty5::respawn:/sbin/getty 38400 tty6 ::restart:/sbin/init ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r ::shutdown:/sbin/swapoff -a EOF cp /bin/busybox bin/ for f in $(ldd bin/busybox | awk '{print $3}' ) $(readelf -e bin/busybox | grep "program interpreter:"|awk '{print $4}'|sed s/']'//); do [[ -f $f ]] && { mkdir -p ./$(dirname $f); cp ${f} ./${f} ; } done if [ ! -L proc/self/exe ]; then cd proc/self ln -s /bin/busybox exe if [ -e /proc/self/fd ] ; then ln -fs /proc/self/fd fd 2> /dev/null ln -fs fd/0 stdin ln -fs fd/1 stdout ln -fs fd/2 stderr fi cd ../../ fi cd etc ln -sf ../proc/mounts mtab cp /etc/protocols . #grep -v ^# /etc/protocols > protocols # | awk '{print $1, $2, $3}'|grep [0-9] > protocols cd .. cd dev ln -sf /proc/kcore core # ttys for i in `seq 0 9`; do [ ! -e tty$i ] && mknod tty$i c 4 $i done [ ! -e tty ] && (mknod -m 666 tty c 5 0 2> /dev/null || echo cant mknod for tty) [ ! -e null ] && (mknod -m 666 null c 1 3 2> /dev/null || echo cant mknod for null) [ ! -e zero ] && (mknod -m 666 zero c 1 5 2> /dev/null || echo cant mknod for zero) [ ! -e urandom ] && (mknod -m 644 urandom c 1 9 2> /dev/null || echo cant mknod for urandom) [ ! -e random ] && mknod random c 1 8 [ ! -e console ] && mknod console c 5 1 [ ! -e full ] && mknod full c 1 7 [ ! -e kmem ] && mknod kmem c 1 2 [ ! -e mem ] && mknod mem c 1 1 [ ! -e port ] && mknod port c 1 4 # IDE devs [ ! -e hda ] && mknod hda b 3 0 [ ! -e hdb ] && mknod hdb b 3 64 [ ! -e hdc ] && mknod hdc b 22 0 [ ! -e hdd ] && mknod hdd b 22 64 # loop devs for i in `seq 0 7`; do [ ! -e loop$i ] && mknod loop$i b 7 $i; done # ram devs for i in `seq 0 9`; do [ ! -e ram$i ] && mknod ram$i b 1 $i ; done [ ! -L ram ] && ln -s ram1 ram # virtual console screen devs for i in `seq 0 9`; do [ ! -e vcs$i ] && mknod vcs$i b 7 $i; done chown root:tty tty 2> /dev/null chown root:sys null zero 2> /dev/null cd - ################ ## /etc/fstab ## ################ cat < etc/fstab #/dev/root / ro,defaults defaults 0 0 proc /proc proc defaults 0 0 #none /dev devfs defaults 0 0 devpts /dev/pts devpts defaults,gid=5,mode=620 0 0 tmpfs /tmp tmpfs defaults 0 0 tmpfs $rom tmpfs defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 EOF chroot . /bin/busybox --install -s #mksquashfs . root_fs -noappend -e root_fs #chmod 755 root_fs if type -p genext2fs > /dev/null; then REALSIZE=$(LANG=C du ./ -s -c -k | grep total | awk '{print $1}') ADDTOROOTSIZE=$([ $REALSIZE -ge 20000 ] && echo 16384 || echo 16) ADDTOROOTSIZE=$([ $REALSIZE -ge 20000 ] && echo 16384 || echo 16384) SIZE=$(( $REALSIZE + $ADDTOROOTSIZE )) #[[ $SIZE -le 2600 ]] && SIZE=2600 INODES=$(($(find . | wc -l) + 400)) genext2fs -U -P -i ${INODES} -b ${SIZE} -q -d . ../root_fs fi example_runtime_usage