2017-12-27 17:08:03 +01:00
|
|
|
#!/bin/bash
|
2017-12-31 22:58:55 +01:00
|
|
|
##############################################################################
|
|
|
|
# parabola-arm-imagebuilder #
|
|
|
|
# #
|
|
|
|
# Copyright (C) 2017 Andreas Grapentin #
|
|
|
|
# #
|
|
|
|
# This program is free software: you can redistribute it and/or modify #
|
|
|
|
# it under the terms of the GNU General Public License as published by #
|
|
|
|
# the Free Software Foundation, either version 3 of the License, or #
|
|
|
|
# (at your option) any later version. #
|
|
|
|
# #
|
|
|
|
# This program is distributed in the hope that it will be useful, #
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
|
|
|
# GNU General Public License for more details. #
|
|
|
|
# #
|
|
|
|
# You should have received a copy of the GNU General Public License #
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
|
|
|
|
##############################################################################
|
2017-12-27 17:08:03 +01:00
|
|
|
|
2017-12-28 16:09:01 +01:00
|
|
|
set -eu
|
2017-12-27 17:08:03 +01:00
|
|
|
|
2017-12-28 16:09:01 +01:00
|
|
|
_builddir=build
|
|
|
|
mkdir -p $_builddir
|
|
|
|
|
|
|
|
_imagefile=$1
|
2018-01-02 07:59:56 +01:00
|
|
|
_pidfile=$_builddir/qemu-$$.pid
|
|
|
|
_bootdir=$_builddir/boot-$$
|
2017-12-28 16:09:01 +01:00
|
|
|
|
|
|
|
_loopdev=$(sudo losetup -f --show $_imagefile)
|
2018-01-02 07:59:56 +01:00
|
|
|
sudo partprobe $_loopdev
|
|
|
|
_localport=$((2022 + $(find $_builddir -iname 'qemu-*.pid' | wc -l)))
|
|
|
|
touch $_pidfile
|
2017-12-27 17:08:03 +01:00
|
|
|
|
2017-12-28 16:09:01 +01:00
|
|
|
# register a cleanup error handler
|
2017-12-27 17:08:03 +01:00
|
|
|
function cleanup {
|
2017-12-28 16:09:01 +01:00
|
|
|
test -f $_pidfile && (sudo kill -9 $(cat $_pidfile) || true)
|
|
|
|
rm -f $_pidfile
|
2017-12-27 17:08:03 +01:00
|
|
|
sudo umount ${_loopdev}p1
|
|
|
|
sudo losetup -d $_loopdev
|
|
|
|
rm -rf $_bootdir
|
|
|
|
}
|
2017-12-28 16:09:01 +01:00
|
|
|
trap cleanup ERR
|
2017-12-27 17:08:03 +01:00
|
|
|
|
2017-12-28 16:09:01 +01:00
|
|
|
# start the VM
|
2017-12-27 17:08:03 +01:00
|
|
|
mkdir -p $_bootdir
|
|
|
|
sudo mount ${_loopdev}p1 $_bootdir
|
2018-01-31 13:10:24 +01:00
|
|
|
# FIXME: archlinuxarm rust will SIGILL on cortex-a9 cpus, using cortex-a15 for now
|
2017-12-28 16:09:01 +01:00
|
|
|
QEMU_AUDIO_DRV=none qemu-system-arm \
|
2017-12-27 17:08:03 +01:00
|
|
|
-M vexpress-a9 \
|
2018-01-31 13:10:24 +01:00
|
|
|
-cpu cortex-a15 \
|
2017-12-28 16:09:01 +01:00
|
|
|
-m 1G \
|
2017-12-27 17:08:03 +01:00
|
|
|
-dtb $_bootdir/dtbs/vexpress-v2p-ca9.dtb \
|
|
|
|
-kernel $_bootdir/zImage \
|
2018-01-31 13:10:24 +01:00
|
|
|
--append "root=/dev/mmcblk0p3 rw roottype=ext4 console=ttyAMA0" \
|
2017-12-28 16:09:01 +01:00
|
|
|
-drive if=sd,driver=raw,cache=writeback,file=$_imagefile \
|
|
|
|
-display none \
|
2018-01-02 07:59:56 +01:00
|
|
|
-net user,hostfwd=tcp::$_localport-:22 \
|
2017-12-28 16:09:01 +01:00
|
|
|
-net nic \
|
|
|
|
-daemonize \
|
|
|
|
-snapshot \
|
|
|
|
-pidfile $_pidfile
|
|
|
|
|
2018-01-31 13:10:24 +01:00
|
|
|
|
|
|
|
# wait for ssh to be up
|
2017-12-28 16:09:01 +01:00
|
|
|
_sshopts="-o StrictHostKeyChecking=no -o ConnectTimeout=5"
|
2018-01-02 07:59:56 +01:00
|
|
|
while ! ssh -p $_localport -i keys/id_rsa root@localhost $_sshopts true 2>/dev/null; do
|
2017-12-28 16:09:01 +01:00
|
|
|
echo -n . && sleep 5
|
|
|
|
done && echo
|
|
|
|
|
|
|
|
# open a session
|
2018-01-02 07:59:56 +01:00
|
|
|
ssh -p $_localport -i keys/id_rsa parabola@localhost
|
2017-12-28 16:09:01 +01:00
|
|
|
|
|
|
|
# shutdown the VM
|
2018-01-02 07:59:56 +01:00
|
|
|
ssh -p $_localport -i keys/id_rsa root@localhost "nohup shutdown -h now &>/dev/null & exit"
|
2017-12-28 16:09:01 +01:00
|
|
|
while sudo kill -0 $(cat $_pidfile) 2> /dev/null; do echo -n . && sleep 5; done && echo
|
|
|
|
rm -f $_pidfile
|
|
|
|
|
|
|
|
# cleanup
|
|
|
|
sudo umount ${_loopdev}p1
|
|
|
|
sudo losetup -d $_loopdev
|
|
|
|
rm -rf $_bootdir
|