56 lines
1.4 KiB
Bash
Executable File
56 lines
1.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -eo pipefail
|
|
|
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )"
|
|
ORIG_DISK_IMAGE=$1
|
|
|
|
function usage {
|
|
cat<<EOF
|
|
Usage: $0 </chemin/vers/image_disque>
|
|
Éxecute l'image disque donnée avec Qemu
|
|
EOF
|
|
exit 1
|
|
}
|
|
|
|
function find_available_port {
|
|
read lower_port upper_port < /proc/sys/net/ipv4/ip_local_port_range
|
|
while :; do
|
|
for (( port = lower_port ; port <= upper_port ; port++ )); do
|
|
(echo > /dev/tcp/0.0.0.0/$port) 2>/dev/null >/dev/null
|
|
if [ $? -ne 0 ]; then
|
|
echo $port
|
|
return
|
|
fi
|
|
done
|
|
done
|
|
}
|
|
|
|
[ -z "$ORIG_DISK_IMAGE" ] && usage
|
|
|
|
DISK_IMAGE_DIR="$DIR/../.run/$(dirname $ORIG_DISK_IMAGE)"
|
|
ORIG_DISK_IMAGE=$(readlink -f "$ORIG_DISK_IMAGE")
|
|
DISK_IMAGE_NAME=$(date -r "$ORIG_DISK_IMAGE" | shasum - | cut -f1 -d ' ').img
|
|
DISK_IMAGE="$DISK_IMAGE_DIR/$DISK_IMAGE_NAME"
|
|
|
|
if [ -f "$DISK_IMAGE" ]; then
|
|
echo "Using existing qcow2 image '$DISK_IMAGE'..."
|
|
else
|
|
mkdir -p "$(dirname $DISK_IMAGE)"
|
|
rm -f "$DISK_IMAGE_DIR"/*.img
|
|
cd "$(dirname $DISK_IMAGE)"
|
|
echo "Generating qcow2 image '$DISK_IMAGE'..."
|
|
qemu-img create -f qcow2 -b "$ORIG_DISK_IMAGE" "$(basename $DISK_IMAGE)"
|
|
cd -
|
|
fi
|
|
|
|
SSH_PORT=$(find_available_port)
|
|
echo "Starting VM... SSH will be available on '127.0.0.1:${SSH_PORT}'"
|
|
|
|
qemu-system-x86_64 -boot once=d \
|
|
-device virtio-net,netdev=user.0 \
|
|
-m 1024M -machine type=pc,accel=kvm \
|
|
-display sdl \
|
|
-hda "${DISK_IMAGE}" \
|
|
-netdev user,id=user.0,hostfwd=tcp::${SSH_PORT}-:22
|