all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Thomas Lamprecht <t.lamprecht@proxmox.com>
To: Proxmox Backup Server development discussion
	<pbs-devel@lists.proxmox.com>,
	Stefan Reiter <s.reiter@proxmox.com>
Subject: Re: [pbs-devel] [PATCH proxmox-backup-restore-image 9/9] add debug initramfs as seperate package
Date: Thu, 6 May 2021 20:07:18 +0200	[thread overview]
Message-ID: <27e28abc-d369-7555-c9b4-2aec01aca890@proxmox.com> (raw)
In-Reply-To: <20210506152624.12605-10-s.reiter@proxmox.com>

On 06.05.21 17:26, Stefan Reiter wrote:
> "proxmox-backup-restore-image-debug", containing only the debug
> initramfs, so depends on the base "proxmox-backup-restore-image" for the
> kernel.
> 
> Adapt the init-shim to start an agetty on ttyS1, which the host
> can use to connect to a root shell for debugging, and use
> create_dir_all, since some debug packages seem to create /sys and /proc
> as empty dirs already.
> 
> The build_initramfs.sh script is modified to include dependency
> resolution via apt-rdepends, so debug packages like agetty (util-linux),
> busybox and gdb can easily be added. This now builds both the regular
> and the debug binary at once, to avoid downloading shared packages
> twice.
> 
> Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
> ---
> 
> The updated build_initramfs script should also make further additions to the
> initrd easier, e.g. adding lvm and zfs tooling if necessary.
> 
>  Makefile                                      | 13 +++--
>  debian/control                                | 10 +++-
>  ...proxmox-backup-restore-image-debug.install |  1 +
>  ...ckup-restore-image-debug.lintian-overrides |  2 +
>  ...roxmox-backup-restore-image-debug.triggers |  1 +
>  src/Makefile                                  |  5 +-
>  src/build_initramfs.sh                        | 55 +++++++++++++------
>  src/init-shim-rs/src/main.rs                  | 46 +++++++++++++++-
>  8 files changed, 106 insertions(+), 27 deletions(-)
>  create mode 100644 debian/proxmox-backup-restore-image-debug.install
>  create mode 100644 debian/proxmox-backup-restore-image-debug.lintian-overrides
>  create mode 100644 debian/proxmox-backup-restore-image-debug.triggers
> 
> diff --git a/Makefile b/Makefile
> index d11ac3e..92aa791 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2,11 +2,14 @@ include /usr/share/dpkg/pkg-info.mk
>  include /usr/share/dpkg/architecture.mk
>  
>  PACKAGE=proxmox-backup-restore-image
> +PACKAGE_DBG=proxmox-backup-restore-image-debug
>  
>  BUILDDIR=${PACKAGE}-${DEB_VERSION_UPSTREAM_REVISION}
>  
>  DEB=${PACKAGE}_${DEB_VERSION}_${DEB_BUILD_ARCH}.deb
>  DSC=${PACKAGE}_${DEB_VERSION}.dsc
> +DEB_DBG=${PACKAGE_DBG}_${DEB_VERSION}_${DEB_BUILD_ARCH}.deb
> +DSC_DBG=${PACKAGE_DBG}_${DEB_VERSION}.dsc
>  

multiple source control files do not really make sense. There's only one source
per d/control instance (normally per repo) for Debians POV...

>  all: deb
>  
> @@ -32,21 +35,23 @@ ${BUILDDIR}: submodules.prepared
>  deb: ${DEB}
>  ${DEB}: ${BUILDDIR}
>  	cd ${BUILDDIR}; dpkg-buildpackage -b -us -uc
> -	lintian ${DEB}
> +	lintian ${DEB} ${DEB_DBG}
> +${DEB_DBG}: ${DEB}
>  
>  .PHONY: dsc
>  dsc: ${DSC}
>  ${DSC}: ${BUILDDIR}
>  	cd ${BUILDDIR}; dpkg-buildpackage -S -us -uc -d
> -	lintian ${DSC}
> +	lintian ${DSC} ${DSC_DBG}
> +${DSC_DBG}: ${DSC}
>  
>  .PHONY: dinstall
>  dinstall: deb
> -	dpkg -i ${DEB}
> +	dpkg -i ${DEB} ${DEB_DBG}
>  
>  .PHONY: upload
>  upload: ${DEB}
> -	tar cf - ${DEB} | ssh -X repoman@repo.proxmox.com upload --product pbs,pve --dist buster
> +	tar cf - ${DEB} ${DEB_DBG} | ssh -X repoman@repo.proxmox.com upload --product pbs,pve --dist buster
>  
>  .PHONY: clean
>  clean:
> diff --git a/debian/control b/debian/control
> index 5b50392..b87c903 100644
> --- a/debian/control
> +++ b/debian/control
> @@ -2,7 +2,8 @@ Source: proxmox-backup-restore-image
>  Section: admin
>  Priority: optional
>  Maintainer: Proxmox Support Team <support@proxmox.com>
> -Build-Depends: asciidoc-base,
> +Build-Depends: apt-rdepends,
> +               asciidoc-base,
>                 automake,
>                 bc,
>                 bison,
> @@ -34,3 +35,10 @@ Description: Kernel/initramfs images for Proxmox Backup single-file restore.
>   Preconfigured images used as base for single file restore of Proxmox Backup
>   Server snapshots. Not really useful on their own, so best used together with
>   the proxmox-backup-file-restore package, which provide the actual tools.
> +
> +Package: proxmox-backup-restore-image-debug
> +Architecture: amd64
> +Depends: proxmox-backup-restore-image
> +Description: Debug initramfs image for Proxmox Backup single-file restore.
> + Not required for production use, only useful for manual inspection of file
> + restore VMs. Includes busybox and gdb.
> diff --git a/debian/proxmox-backup-restore-image-debug.install b/debian/proxmox-backup-restore-image-debug.install
> new file mode 100644
> index 0000000..02ffb49
> --- /dev/null
> +++ b/debian/proxmox-backup-restore-image-debug.install
> @@ -0,0 +1 @@
> +build/initramfs/initramfs-debug.img /usr/lib/x86_64-linux-gnu/proxmox-backup/file-restore/
> diff --git a/debian/proxmox-backup-restore-image-debug.lintian-overrides b/debian/proxmox-backup-restore-image-debug.lintian-overrides
> new file mode 100644
> index 0000000..ad59aad
> --- /dev/null
> +++ b/debian/proxmox-backup-restore-image-debug.lintian-overrides
> @@ -0,0 +1,2 @@
> +missing-depends-on-sensible-utils
> +uses-dpkg-database-directly
> diff --git a/debian/proxmox-backup-restore-image-debug.triggers b/debian/proxmox-backup-restore-image-debug.triggers
> new file mode 100644
> index 0000000..948d898
> --- /dev/null
> +++ b/debian/proxmox-backup-restore-image-debug.triggers
> @@ -0,0 +1 @@
> +activate-noawait proxmox-backup-restore-image-update
> diff --git a/src/Makefile b/src/Makefile
> index 37f385f..a398ea1 100644
> --- a/src/Makefile
> +++ b/src/Makefile
> @@ -9,12 +9,13 @@ SHIM_DIR=init-shim-rs
>  
>  KERNEL_IMG=${BUILDDIR}/bzImage
>  INITRAMFS_IMG=${INITRAMFS_BUILDDIR}/initramfs.img
> +INITRAMFS_IMG_DBG=${INITRAMFS_BUILDDIR}/initramfs-debug.img
>  
>  CONFIG=config-base
>  
>  RUST_SRC=$(wildcard ${SHIM_DIR}/**/*.rs) ${SHIM_DIR}/Cargo.toml
>  
> -all: ${KERNEL_IMG} ${INITRAMFS_IMG}
> +all: ${KERNEL_IMG} ${INITRAMFS_IMG_DBG}
>  
>  ${BUILDDIR}.prepared: ${CONFIG}
>  	rm -rf ${BUILDDIR}
> @@ -54,6 +55,8 @@ ${INITRAMFS_IMG}: ${BUILDDIR}.prepared ${RUST_SRC} build_initramfs.sh
>  	cd ${SHIM_DIR}; cargo build --release
>  	sh build_initramfs.sh
>  
> +${INITRAMFS_IMG_DBG}: ${INITRAMFS_IMG}
> +
>  .PHONY: test-run
>  test-run: ${KERNEL_IMG} ${INITRAMFS_IMG}
>  	# note: this will always fail since /proxmox-restore-daemon is not
> diff --git a/src/build_initramfs.sh b/src/build_initramfs.sh
> index 4efa29b..c4ee95c 100755
> --- a/src/build_initramfs.sh
> +++ b/src/build_initramfs.sh
> @@ -6,29 +6,36 @@ ROOT="root"
>  BUILDDIR="build/initramfs"
>  INIT="../../init-shim-rs/target/release/init-shim-rs"
>  
> -PKGS=" \
> -    libc6:amd64 \
> -    libgcc1:amd64 \
> -    libstdc++6:amd64 \
> -    libssl1.1:amd64 \
> -    libattr1:amd64 \
> -    libacl1:amd64
> -"
> -
>  echo "Using build dir: $BUILDDIR"
>  rm -rf "$BUILDDIR"
>  mkdir -p "$BUILDDIR"
>  cd "$BUILDDIR"
>  mkdir "$ROOT"
>  
> -# add necessary packages to initramfs
> -for pkg in $PKGS; do
> -    apt-get download "$pkg"
> -    dpkg-deb -x ./*.deb "$ROOT"
> +# adds necessary packages to initramfs build root folder
> +add_pkgs() {
> +    DEPS=""
> +    for pkg in $1; do
> +        LOCAL_DEPS=$(apt-rdepends -f Depends -s Depends "$pkg" | grep -v '^ ')
> +        DEPS="$DEPS $LOCAL_DEPS"
> +    done
> +    # debconf and gcc are unnecessary
> +    DEPS=$(echo "$DEPS" |\
> +        sed -E 's/debconf(-2\.0)?//' |\
> +        sed -E 's/gcc-.{1,2}-base//')
> +    apt-get download $DEPS
> +    for deb in ./*.deb; do
> +        dpkg-deb -x "$deb" "$ROOT"
> +    done
>      rm ./*.deb
> -done
> +}
>  
> -rm -rf ${ROOT:?}/usr/share # contains only docs and debian stuff
> +make_cpio() {
> +    fakeroot -- sh -c "
> +        cd '$ROOT';
> +        find . -print0 | cpio --null -oV --format=newc -F ../$1
> +    "
> +}
>  
>  cp $INIT "$ROOT/init"
>  chmod a+x "$ROOT/init" # just to be sure
> @@ -36,7 +43,19 @@ chmod a+x "$ROOT/init" # just to be sure
>  # tell daemon it's running in the correct environment
>  touch "$ROOT/restore-vm-marker"
>  
> -fakeroot -- sh -c "
> -    cd '$ROOT';
> -    find . -print0 | cpio --null -oV --format=newc -F ../initramfs.img
> +add_pkgs "
> +    libstdc++6:amd64 \
> +    libssl1.1:amd64 \
> +    libacl1:amd64 \
>  "
> +rm -rf ${ROOT:?}/usr/share # contains only docs and debian stuff
> +make_cpio "initramfs.img"
> +
> +# add debug helpers for debug initramfs, packages from above are included too
> +add_pkgs "
> +    util-linux:amd64 \
> +    busybox-static:amd64 \
> +    gdb:amd64 \
> +"
> +# leave /usr/share here, it contains necessary stuff for gdb
> +make_cpio "initramfs-debug.img"
> diff --git a/src/init-shim-rs/src/main.rs b/src/init-shim-rs/src/main.rs
> index 89aff7b..641218f 100644
> --- a/src/init-shim-rs/src/main.rs
> +++ b/src/init-shim-rs/src/main.rs
> @@ -1,6 +1,8 @@
> -use anyhow::Error;
> +use anyhow::{bail, Error};
>  use std::ffi::CStr;
>  use std::fs;
> +use std::path::PathBuf;
> +use std::process::Command;
>  
>  const URANDOM_MAJ: u64 = 1;
>  const URANDOM_MIN: u64 = 9;
> @@ -21,15 +23,54 @@ fn main() {
>          do_mknod("/dev/urandom", URANDOM_MAJ, URANDOM_MIN)
>      });
>  
> +    if let Err(err) = run_agetty() {
> +        // not fatal
> +        println!("[init-shim] debug: agetty start failed: {}", err);
> +    }
> +
>      let uptime = read_uptime();
>      println!("[init-shim] reached daemon start after {:.2}s", uptime);
>  
>      do_run("/proxmox-restore-daemon");
>  }
>  
> +fn run_agetty() -> Result<(), Error> {
> +    use nix::unistd::{fork, ForkResult};
> +
> +    if !PathBuf::from("/sbin/agetty").exists() {
> +        bail!("/sbin/agetty not found, probably not running debug mode and safe to ignore");
> +    }
> +
> +    if !PathBuf::from("/sys/class/tty/ttyS1/device/driver/serial8250").exists() {
> +        bail!("ttyS1 device does not exist or is not a 8250");
> +    }
> +
> +    let dev = fs::read_to_string("/sys/class/tty/ttyS1/dev")?;
> +    let (tty_maj, tty_min) = dev.trim().split_at(dev.find(':').unwrap_or(1));
> +    do_mknod("/dev/ttyS1", tty_maj.parse()?, tty_min[1..].parse()?)?;
> +
> +    match unsafe { fork() } {
> +        Ok(ForkResult::Parent { .. }) => {}
> +        Ok(ForkResult::Child) => loop {
> +            // continue to restart agetty if it exits, this runs in a forked process
> +            println!("[init-shim] Spawning new agetty");
> +            let res = Command::new("/sbin/agetty")
> +                .args(&["-a", "root", "-l", "/bin/busybox", "-o", "sh", "115200", "ttyS1"])
> +                .spawn()
> +                .unwrap()
> +                .wait()
> +                .unwrap();
> +            println!("[init-shim] agetty exited: {}", res.code().unwrap_or(-1));
> +        },
> +        Err(err) => println!("fork failed: {}", err),
> +    }
> +
> +    Ok(())
> +}
> +
>  fn do_mount(target: &str, fstype: &str) -> Result<(), Error> {
>      use nix::mount::{mount, MsFlags};
> -    fs::create_dir(target)?;
> +    fs::create_dir_all(target)?;
>      let none_type: Option<&CStr> = None;
>      mount(
>          none_type,
> @@ -63,7 +104,6 @@ fn read_uptime() -> f32 {
>  
>  fn do_run(cmd: &str) -> ! {
>      use std::io::ErrorKind;
> -    use std::process::Command;
>  
>      let spawn_res = Command::new(cmd).env("RUST_BACKTRACE", "1").spawn();
>  
> 





  reply	other threads:[~2021-05-06 18:07 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-06 15:26 [pbs-devel] [PATCH 0/9] Debug mode and smaller fixes for single file restore Stefan Reiter
2021-05-06 15:26 ` [pbs-devel] [PATCH proxmox-backup 1/9] file-restore: add debug mode with serial access Stefan Reiter
2021-05-06 15:26 ` [pbs-devel] [PATCH proxmox-backup 2/9] file-restore: try to kill VM when stale Stefan Reiter
2021-05-07  7:04   ` [pbs-devel] applied: " Thomas Lamprecht
2021-05-06 15:26 ` [pbs-devel] [PATCH proxmox-backup 3/9] file-restore: add more RAM for VMs with many drives or debug Stefan Reiter
2021-05-07  7:04   ` [pbs-devel] applied: " Thomas Lamprecht
2021-05-06 15:26 ` [pbs-devel] [PATCH proxmox-backup 4/9] file-restore: support more drives Stefan Reiter
2021-05-07  7:04   ` [pbs-devel] applied: " Thomas Lamprecht
2021-05-06 15:26 ` [pbs-devel] [PATCH proxmox-backup 5/9] file-restore-daemon: work around tokio DuplexStream bug Stefan Reiter
2021-05-06 18:12   ` Thomas Lamprecht
2021-05-07  7:26     ` Fabian Grünbichler
2021-05-06 15:26 ` [pbs-devel] [PATCH proxmox-backup 6/9] file-restore-daemon: watchdog: add inhibit for long downloads Stefan Reiter
2021-05-06 15:26 ` [pbs-devel] [PATCH proxmox-backup 7/9] file-restore-daemon: limit concurrent download calls Stefan Reiter
2021-05-06 15:26 ` [pbs-devel] [PATCH proxmox-backup-restore-image 8/9] kernel: power off on panic Stefan Reiter
2021-05-06 15:26 ` [pbs-devel] [PATCH proxmox-backup-restore-image 9/9] add debug initramfs as seperate package Stefan Reiter
2021-05-06 18:07   ` Thomas Lamprecht [this message]
2021-05-25 11:50 ` [pbs-devel] applied-series: [PATCH 0/9] Debug mode and smaller fixes for single file restore Thomas Lamprecht

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=27e28abc-d369-7555-c9b4-2aec01aca890@proxmox.com \
    --to=t.lamprecht@proxmox.com \
    --cc=pbs-devel@lists.proxmox.com \
    --cc=s.reiter@proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal