From 25ef69650687f0fca9951bdcb16b2b3679a0601d Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 9 Sep 2020 15:04:52 +0200 Subject: Updates to private install infrastructure and instructions --- etc/private/README | 45 +++++++++++++++++++++++++++++++++++--- etc/private/install/brep-startup | 15 ++++++++++++- etc/private/install/vm-gen-service | 7 ++++-- etc/private/vm-login | 3 +-- etc/private/vm-start-base | 27 +++++++++++++++++++---- etc/private/vm-stop | 29 +++++++++++++++++------- 6 files changed, 106 insertions(+), 20 deletions(-) diff --git a/etc/private/README b/etc/private/README index daecc6a..f59201a 100644 --- a/etc/private/README +++ b/etc/private/README @@ -214,7 +214,7 @@ If the VM fails to start, study the log for a possible cause: # journalctl -u vm-brep@brep -If the VM has started successfully, perform the same verifications as on step +If the VM has started successfully, perform the same verifications as on Step 4 above. To login to the VM running as a systemd service (for example, to verify IP @@ -239,7 +239,7 @@ After this you may also want to reboot the host machine and confirm the VM is started on boot. -6. Managing the repository state. +6. Manage the repository state. While you can submit packages to the repository using bdep-publish(1), you can also add them manually. Also, packages can only be removed manually. @@ -263,7 +263,7 @@ Putting it all together, the steps could look like this: # systemctl stop vm-brep@brep # su - brep $ cd state/bpkg/pkg -$ ... +$ $ rm 1/packages.manifest $ exit # systemctl start vm-brep@brep @@ -278,3 +278,42 @@ $ ~/bin/vm-login ~/brep-con.sock # systemctl status brep-startup # journalctl -u brep-startup + + +7. Upgrade the VM. + +To upgrade to the new version of the VM, first download and unpack the new +VM archive similar to Step 2: + +$ curl -fO https://download.build2.org/X.Y.Z/linux-debian-N-brep-X.Y.Z.tar.xz +$ sha256sum -b linux-debian-N-brep-X.Y.Z.tar.xz + +Verify the checksum matches the one from https://build2.org/download.xhtml + +$ tar -xf linux-debian-N-brep-X.Y.Z.tar.xz + +Next read the linux-debian-N-brep-X.Y.Z/NEWS file for changes and potential +backwards compatibility issues. Unless instructed otherwise by the NEWS file, +the upgrade procedure is as follows: + +# systemctl stop vm-brep@brep + +$ cd +$ mkdir bak +$ mv -t bak/ bin etc vm/brep.img vm-brep@.service README NEWS +$ mv -t ./ linux-debian-N-brep-X.Y.Z/* +$ rm state/bpkg/pkg/1/packages.manifest + +# cp ~brep/vm-brep@.service /etc/systemd/system/ +# chmod 644 /etc/systemd/system/vm-brep@.service +# systemctl daemon-reload +# systemctl start vm-brep@brep +# systemctl status vm-brep@brep + +If the VM has started successfully, perform the same verifications as on Step +4 above. If everything is functioning correctly, you can remove the backup +files: + +$ rm -r bak + +If there are any issues, investigate as on Step 6. diff --git a/etc/private/install/brep-startup b/etc/private/install/brep-startup index 7a5f262..780a2c0 100755 --- a/etc/private/install/brep-startup +++ b/etc/private/install/brep-startup @@ -35,7 +35,20 @@ fi r="$d/pkg/1" if [ ! -f "$r/repositories.manifest" ]; then - echo ": 1" >"$r/repositories.manifest" + cat <"$r/repositories.manifest" +: 1 +#summary: Private repository +#description: \\ +#This is a private repository. +#And this description can contain multiple lines. +#\\ +#email: admin@example.org + +#: +#role: prerequisite +#location: https://pkg.cppget.org/1/stable +#trust: ... +EOF fi if [ ! -f "$r/packages.manifest" ]; then diff --git a/etc/private/install/vm-gen-service b/etc/private/install/vm-gen-service index c4938c2..ae49a49 100755 --- a/etc/private/install/vm-gen-service +++ b/etc/private/install/vm-gen-service @@ -180,13 +180,16 @@ ExecStart=$bin/vm-start \\ --ram \${RAM} \\ --tap \${TAP} \\ --mac \${MAC} \\ + --pid $run/%i.pid \\ --monitor $run/%i-mon.sock \\ --console $run/%i-con.sock \\ $var/%i.img -ExecStop=$bin/vm-stop $run/%i-mon.sock +ExecStop=$bin/vm-stop $run/%i.pid $run/%i-mon.sock -# Make systemd wait for ExecStop completion. +# This makes sure systemd waits for the ExecStart command to exit rather +# than killing it as soon as ExecStop exits (this is necessary since our +# vm-stop may exit just before vm-start). # KillMode=none TimeoutStopSec=60 diff --git a/etc/private/vm-login b/etc/private/vm-login index 4573cba..28e8864 100755 --- a/etc/private/vm-login +++ b/etc/private/vm-login @@ -6,8 +6,7 @@ # usage="usage: $0 " -owd="$(pwd)" -trap "{ cd '$owd'; exit 1; }" ERR +trap "{ exit 1; }" ERR set -o errtrace # Trap in functions. function info () { echo "$*" 1>&2; } diff --git a/etc/private/vm-start-base b/etc/private/vm-start-base index a88ea2d..4a81661 100755 --- a/etc/private/vm-start-base +++ b/etc/private/vm-start-base @@ -15,6 +15,9 @@ # --mac # MAC address to use for the machine. # +# --pid +# PID file path, /tmp/vm-.pid if unspecified. +# # --monitor # Monitor UNIX socket path, /tmp/vm--mon.sock if unspecified. # @@ -22,15 +25,16 @@ # Console UNIX socket path, /tmp/vm--con.sock if unspecified. # # --stdio -# Connect both console and monitor to stdio (multiplexed). +# Connect both console and monitor to stdio (multiplexed). This disables +# the creation of the monitor and console sockets. # # --stdio-monior -# Connect only monitor to stdio. +# Connect only monitor to stdio. This disables the creation of the monitor +# socket. # usage="usage: $0 [] []" -owd="$(pwd)" -trap "{ cd '$owd'; exit 1; }" ERR +trap "{ exit 1; }" ERR set -o errtrace # Trap in functions. function info () { echo "$*" 1>&2; } @@ -46,6 +50,7 @@ cpu=1 ram=2G tap= mac="de:ad:be:ef:b8:da" +pid= mon= con= stdio= @@ -73,6 +78,11 @@ while [ "$#" -gt 0 ]; do mac="$1" shift ;; + --pid) + shift + pid="$1" + shift + ;; --monitor) shift mon="$1" @@ -133,6 +143,11 @@ if [ -z "$tap" ]; then del_tap=true fi +if [ -z "$pid" ]; then + pid="/tmp/vm-$tap.pid" +fi +echo "$$" >"$pid" + if [ -z "$mon" ]; then mon="/tmp/vm-$tap-mon.sock" fi @@ -182,6 +197,10 @@ fi "${qemu[@]}" "${ops[@]}" -boot c "$@" +if [ "$pid" -o "$mon" -o "$con" ]; then + rm -f "$pid" "$mon" "$con" +fi + if [ "$del_tap" ]; then sudo ip tuntap delete "$tap" mode tap fi diff --git a/etc/private/vm-stop b/etc/private/vm-stop index d3b8330..cf64dee 100755 --- a/etc/private/vm-stop +++ b/etc/private/vm-stop @@ -2,23 +2,36 @@ # Stop virtual machine started with vm-start. # -usage="usage: $0 " +usage="usage: $0 " -owd="$(pwd)" -trap "{ cd '$owd'; exit 1; }" ERR +trap "{ exit 1; }" ERR set -o errtrace # Trap in functions. function info () { echo "$*" 1>&2; } function error () { info "$*"; exit 1; } -mon="$1" -if [ -z "$mon" ]; then - error "missing monitor socket" +if [ -z "$1" -o ! -f "$1" ]; then + error "missing or invalid PID file" fi +pid="$(sed -nr -e 's/([0-9]+)/\1/p' "$1")" + +if [ -z "$pid" ]; then + error "PID file $1 does not contain valid PID" +fi + +if [ -z "$2" -o ! -S "$2" ]; then + error "missing or invalid monitor socket" +fi + +mon="$2" + echo system_powerdown | socat - "UNIX-CONNECT:$mon" >/dev/null -# Wait for QEMU to close the socket. This is racy so ignore errors. +# An alternative way to implement this would be to connect a pipe to the +# monitor socket and wait for it to be closed. # -socat "UNIX-CONNECT:$mon" - >/dev/null 2>&1 || true +while [ -e "/proc/$pid" ]; do + sleep 0.2 +done -- cgit v1.1