#!/bin/sh # shellcheck source=./default.conf . "./default.conf" # builds a hard disk image for a stage 1 system: # no ramdisk, no modules, no fancy startup, just a shell script cd $CROSS_HOME || exit 1 umount mnt rm -rf mnt sudo /sbin/losetup -d /dev/loop2 sudo rm -f arch486.img # prepare a plain image qemu-img create arch486.img 4g chmod 666 arch486.img sudo /sbin/losetup /dev/loop2 arch486.img sudo dd if=/dev/zero of=/dev/loop2 bs=512 count=32130 echo ';' | sudo /sbin/sfdisk --no-reread /dev/loop2 sudo sfdisk -A /dev/loop2 1 sudo partx --show /dev/loop2 sudo partx -v --add /dev/loop2 sudo mkfs.ext4 -O ^64bit /dev/loop2p1 mkdir mnt sudo mount /dev/loop2p1 mnt sudo cp -a i486-root/* mnt/. sudo chown -R cross:cross mnt/. cd mnt || exit 1 # A simple ISOlinux boot loader booting from first partition, starting # uinit wich start /etc/init/boot mkdir boot/syslinux echo 'default /boot/vmlinuz-linux root=/dev/hda1 init=/sbin/init console=ttyS0 console=tty0' \ > boot/syslinux/syslinux.cfg sudo dd bs=440 count=1 if=/usr/lib/syslinux/bios/mbr.bin of=/dev/loop2 cp /usr/lib/syslinux/bios/*.c32 boot/syslinux/. sudo extlinux --install boot/syslinux/ mkdir -p etc/init # the unit boot script configuring virtual filesystems, the network # and starts an SSH daemon cat >etc/init/boot < etc/resolv.conf < etc/hosts <> etc/group <> etc/passwd <> etc/ssh/sshd_config <> etc/group <> etc/passwd < root/test.c < #include #include int main( int argc, char *argv[] ) { puts( "hello" ); exit( EXIT_SUCCESS ); } EOF cat > root/test.cpp < #include int main( void ) { std::cout << "hello" << std::endl; std::exit( EXIT_FAILURE ); } EOF # put proper pacman.conf in place mv etc/pacman.conf.pacnew etc/pacman.conf # fix permissions (we only have root on the image) chmod 0700 root/.ssh sudo chown -R root:root . sudo chmod 0775 etc/init/boot # umount and clean up partitions and loopback devices cd .. || exit 1 sudo umount mnt sudo partx -v --delete /dev/loop2 sudo losetup -d /dev/loop2