diff --git a/Dockerfile b/Dockerfile index 3ce91fd..9b2954c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,10 +2,75 @@ FROM debian:stretch-slim RUN apt-get update && apt-get install -y --no-install-recommends \ ovmf \ - qemu-system \ - qemu-utils \ +# qemu-system \ +# qemu-utils \ && rm -rf /var/lib/apt/lists/* +COPY *.patch /qemu-patches/ + +# https://www.qemu.org/download/#source +ENV QEMU_VERSION 2.11.0 + +RUN set -eux; \ + \ + savedAptMark="$(apt-mark showmanual)"; \ + \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + ca-certificates \ + wget \ + xz-utils \ + \ + patch \ + \ + gcc \ + libc-dev \ + libglib2.0-dev \ + libpixman-1-dev \ + make \ + pkg-config \ + python \ + zlib1g-dev \ + ; \ + rm -rf /var/lib/apt/lists/*; \ + \ + wget -O qemu.tar.xz "https://download.qemu.org/qemu-2.11.0.tar.xz"; \ +# TODO verify signature + mkdir /usr/src/qemu; \ + tar -xvf qemu.tar.xz -C /usr/src/qemu --strip-components=1; \ + rm qemu.tar.xz; \ + \ + cd /usr/src/qemu; \ + \ + for p in /qemu-patches/*.patch; do \ + patch --strip 1 --input "$p"; \ + done; \ + rm -rf /qemu-patches; \ + \ + ./configure --help; \ + ./configure; \ + make -j "$(nproc)"; \ + make install; \ + \ + cd /; \ + rm -rf /usr/src/qemu; \ + \ + libs="$( \ + find /usr/local -type f -executable -exec ldd '{}' ';' \ + | awk '/=>/ { print $(NF-1) }' \ + | sort -u \ + | xargs dpkg-query --search \ + | cut -d: -f1 \ + | sort -u \ + )"; \ + savedAptMark="$savedAptMark $libs"; \ + \ + apt-mark auto '.*' > /dev/null; \ + [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; \ + apt-get purge -y --auto-remove + +STOPSIGNAL SIGHUP + EXPOSE 22 EXPOSE 5900 diff --git a/qemu-signals.patch b/qemu-signals.patch new file mode 100644 index 0000000..cbd86f7 --- /dev/null +++ b/qemu-signals.patch @@ -0,0 +1,20 @@ +Origin: https://bugs.launchpad.net/qemu/+bug/1217339/comments/2 +Origin: https://lists.nongnu.org/archive/html/qemu-devel/2017-03/msg03039.html + +diff --git a/vl.c b/vl.c +index 1ad1c04637..9e07fe1dbb 100644 +--- a/vl.c ++++ b/vl.c +@@ -1898,7 +1898,11 @@ void qemu_system_killed(int signal, pid_t pid) + /* Cannot call qemu_system_shutdown_request directly because + * we are in a signal handler. + */ +- shutdown_requested = SHUTDOWN_CAUSE_HOST_SIGNAL; ++ if (signal == SIGHUP) { ++ powerdown_requested = 1; ++ } else { ++ shutdown_requested = SHUTDOWN_CAUSE_HOST_SIGNAL; ++ } + qemu_notify_event(); + } +