Provided by: bdebstrap_0.7.0-2_all bug

NAME

       bdebstrap - YAML config based multi-mirror Debian chroot creation tool

SYNOPSIS

       bdebstrap  [-h|--help]  [-c|--config  CONFIG]  [-n|--name  NAME] [-e|--env ENV] [-s|--simulate|--dry-run]
       [-b|--output-base-dir OUTPUT_BASE_DIR]  [-o|--output  OUTPUT]  [-q|--quiet|--silent|-v|--verbose|--debug]
       [-f|--force]                      [-t|--tmpdir                     TMPDIR]                     [--variant
       {extract,custom,essential,apt,required,minbase,buildd,important,debootstrap,-,standard}]          [--mode
       {auto,sudo,root,unshare,fakeroot,fakechroot,chrootless}]                                        [--format
       {auto,directory,dir,tar,squashfs,sqfs,ext2,null}]  [--aptopt  APTOPT]  [--keyring   KEYRING]   [--dpkgopt
       DPKGOPT]  [--hostname  HOSTNAME]  [--install-recommends]  [--packages|--include  PACKAGES]  [--components
       COMPONENTS] [--architectures ARCHITECTURES] [--hook-dir DIRECTORY] [--setup-hook COMMAND] [--extract-hook
       COMMAND] [--essential-hook COMMAND] [--customize-hook COMMAND] [--cleanup-hook  COMMAND]  [--skip  STAGE]
       [--suite SUITE] [--target TARGET] [--mirrors MIRRORS] [SUITE [TARGET [MIRROR...]]]

DESCRIPTION

       bdebstrap  creates  a Debian chroot of SUITE into TARGET from one or more MIRRORs and places meta-data in
       the OUTPUT directory: A config.yaml containing the configuration for the build (useful for rebuilds)  and
       a  manifest  listing  all installed packages and versions.  If TARGET is just a filename (and not include
       the path), it will be placed in the OUTPUT directory as well.  bdebstrap extents  mmdebtrap  to  make  it
       configurable via YAML configuration files for more complex builds.

       The  configuration  parameters  can  be  passed  to bdebstrap as command line arguments or in one or more
       configuration YAML files.  The content of YAML files will be merged by appending  lists  and  recursively
       merging  maps.   Arguments specified on the command line will take precedence over values provided in the
       YAML configuration file.  The final  merged  parameters  will  be  stored  in  the  output  directory  as
       config.yaml.

OPTIONS

       -h, --help
              Show a help message and exit

       -c CONFIG, --config CONFIG
              Configuration  YAML  file.   See YAML CONFIGURATION below for the expected structure of this file.
              This parameter can be specified multiple times.  The content of  YAML  files  will  be  merged  by
              appending lists and recursively merging maps.

       -n NAME, --name NAME
              name of the generated golden image.  If no output directory is specified, the golden image will be
              placed in OUTPUT_BASE_DIR/NAME.

       -e ENV, --env ENV
              Add  an  additional environment variable.  These environment variable will be set when calling the
              hooks.

       -s, --simulate, --dry-run
              Run apt-get with --simulate.  Only the package cache is initialized but  no  binary  packages  are
              downloaded  or  installed.   Use this option to quickly check whether a package selection within a
              certain suite and variant can in principle be installed as far as their dependencies go.   If  the
              output is a tarball, then no output is produced.  If the output is a directory, then the directory
              will be left populated with the skeleton files and directories necessary for apt to run in it.

       -b OUTPUT_BASE_DIR, --output-base-dir OUTPUT_BASE_DIR
              output base directory.  By default it is the current directory.

       -o OUTPUT, --output OUTPUT
              output directory (default: output-base-dir/name)

       -q, --quiet, --silent
              Do  not  write  anything  to  standard  error  except  errors.  If used together with --verbose or
              --debug, only the last option will take effect.

       -v, --verbose
              Write informational messages (about configuration files, environment variables,  mmdebstrap  call,
              etc.)   to  standard  error.   Instead of progress bars, mmdebstrap writes the dpkg and apt output
              directly to standard error.  If used together with --quiet or --debug, only the last  option  will
              take effect.

       --debug
              In  addition to the output produced by --verbose, write detailed debugging information to standard
              error.  Errors of mmdebstrap will print a backtrace.  If used together with --quiet or  --verbose,
              only the last option will take effect.

       -f, --force
              Remove existing output directory before creating a new one

       -t TMPDIR, --tmpdir TMPDIR
              Temporary directory for building the image (default: /tmp)

       --variant {extract,custom,essential,apt,required,minbase,buildd,important,debootstrap,-,standard}
              Choose which package set to install.

       --mode {auto,sudo,root,unshare,fakeroot,fakechroot,chrootless}
              Choose  how  to  perform  the  chroot operation and create a filesystem with ownership information
              different from the current user.

       [--format {auto,directory,dir,tar,squashfs,sqfs,ext2,null}
              Choose the output format.

       --aptopt APTOPT
              Pass arbitrary options or configuration files to apt.

       --keyring KEYRING
              Change the default keyring to use by apt.

       --dpkgopt DPKGOPT
              Pass arbitrary options or configuration files to dpkg.

       --hostname HOSTNAME
              Write the given HOSTNAME into /etc/hostname in the target chroot.

       --install-recommends
              Consider recommended packages as a dependency for installing.

       --packages PACKAGES, --include PACKAGES
              Comma or whitespace separated list of packages which will be installed in addition to the packages
              installed by the specified variant.

       --components COMPONENTS
              Comma or whitespace separated list of components like main, contrib and  non-free  which  will  be
              used for all URI-only MIRROR arguments.

       --architectures ARCHITECTURES
              Comma  or  whitespace  separated  list  of  architectures.   The  first architecture is the native
              architecture inside the chroot.

       --hook-dir DIRECTORY
              Execute scripts in DIRECTORY with filenames  starting  with  “setup”,  “extract”,  “essential”  or
              “customize”,  at  the  respective  stages  during  an  mmdebstrap  run.   The files must be marked
              executable.  Their extension is ignored.  Subdirectories are not  traversed.   This  option  is  a
              short‐hand  for  specifying  the  remaining  four  hook  options individually for each file in the
              directory.  If there are more than one script for a stage, then  they  are  added  alphabetically.
              This  is useful in cases, where a user wants to run the same hooks frequently.  This option can be
              specified multiple times.

       --setup-hook COMMAND
              Execute arbitrary COMMAND right after initial setup (directory creation, configuration of apt  and
              dpkg,  ...)   but  before  any  packages  are  downloaded or installed.  At that point, the chroot
              directory does not contain any executables and thus cannot be chroot-ed into.  This option can  be
              specified multiple times.

       --extract-hook COMMAND
              Execute  arbitrary  COMMAND  after  the  Essential:yes  packages  have  been  installed but before
              installing them.  This option can be specified multiple times.

       --essential-hook COMMAND
              Execute arbitrary COMMAND after  the  Essential:yes  packages  have  been  installed,  but  before
              installing the remaining packages.  This option can be specified multiple times.

       --customize-hook COMMAND
              Execute  arbitrary  COMMAND  after  the chroot is set up and all packages got installed but before
              final cleanup actions are carried out.  This option can be specified multiple times.

       --cleanup-hook COMMAND
              Execute arbitrary COMMAND after all customize hooks  have  been  executed.   This  option  can  be
              specified multiple times.

       --skip STAGE
              Comma  or  whitespace  separated  list  of  actions and safety checks to skip.  This option can be
              specified multiple times.

       --suite SUITE, SUITE
              The suite may be a valid release code name (eg, sid, stretch, jessie)  or  a  symbolic  name  (eg,
              unstable, testing, stable, oldstable).

       --target TARGET, TARGET
              The  optional  target  argument  can  either  be  the  path  to a directory, the path to a tarball
              filename, the path to a squashfs image or -.

       --mirrors MIRRORS, MIRRORS
              Comma separated list of mirrors.  If no mirror option is provided, http://deb.debian.org/debian is
              used.

YAML CONFIGURATION

       This section describes the expected data-structure hierarchy of  the  YAML  configuration  file(s).   The
       top-level structure is expected to be a mapping.  The top-level mapping may contain following keys:

   env
       mapping  of  environment  variables  names  to  their values.  Environment variables can be overridden by
       specifying them with --env using the same name.  These environment variable are set  before  calling  the
       hooks.

   name
       String.  Name of the generated golden image.  Can be overridden by --name.

   mmdebstrap
       mapping.  The values here are passed to mmdebstrap(1).  Following keys might be specified:

       aptopts
              list  of  arbitrary options or configuration files (string) to apt.  Additional apt options can be
              specified with --aptopt.

       architectures
              list of architectures (string).  The first architecture is  the  native  architecture  inside  the
              chroot.  Additional architectures can be specified with --architectures.

       components
              list  of  components  (string) like main, contrib and non-free which will be used for all URI-only
              MIRROR arguments.  Additional components can be specified with --components.

       dpkgopts
              list of arbitrary options or configuration files (string) to dpkg.  Additional dpkg options can be
              specified with --dpkgopt.

       format Choose the output format.  It needs to be one of auto, directory, dir, tar, squashfs, sqfs,  ext2,
              null.  See mmdebstrap(1) for details.  Can be overridden by --format.

       hostname
              String.   If  specified,  write  the given hostname into /etc/hostname in the target chroot.  This
              parameter does not exist in mmdebstrap and is implemented as customize hook for  mmdebstrap.   Can
              be overridden by --hostname.

       install-recommends
              Boolean.   If  set  to True, the APT option Apt::Install-Recommends “true” is passed to mmdebstrap
              via --aptopt.  Can be overridden by --install-recommends.

       keyrings
              list of default keyring to use by apt.  Additional keyring files can be specified with --keyring.

       mirrors
              list of mirrors (string).  Additional mirrors can be specified with --mirrors.

       mode   Choose how to perform the chroot operation and create  a  filesystem  with  ownership  information
              different  from  the  current  user.   It  needs to be one of auto, sudo, root, unshare, fakeroot,
              fakechroot, or chrootless.  See mmdebstrap(1) for details.  Can be overridden by --mode.

       packages
              list of packages (string) which will be installed in addition to the  packages  installed  by  the
              specified  variant.   Additional  packages  can  be  specified with --packages or --include.  This
              setting is passed to mmdebstrap using the --include parameter.

       hook-dirs
              list of hook directories (string).  Execute scripts in the specified  directories  with  filenames
              starting  with  “setup”, “extract”, “essential” or “customize”, at the respective stages during an
              mmdebstrap run.  The files must be marked executable.  Their extension is ignored.  Subdirectories
              are not traversed.  This option is a short‐hand for specifying the  remaining  four  hook  options
              individually  for each file in the directory.  If there are more than one script for a stage, then
              they are added alphabetically.  This is useful in cases, where a user wants to run the same  hooks
              frequently.  Additional hook directories can be specified with --hook-dir.

       setup-hooks
              list  of  setup  hooks  (string).  Execute arbitrary commands right after initial setup (directory
              creation, configuration of apt  and  dpkg,  ...)   but  before  any  packages  are  downloaded  or
              installed.   At  that point, the chroot directory does not contain any executables and thus cannot
              be chroot-ed into.  See HOOKS in mmdebstrap(1) for  more  information  and  examples.   Additional
              setup hooks can be specified with --setup-hook.

       extract-hooks
              list  of extract hooks (string).  Execute arbitrary commands after the Essential:yes packages have
              been installed but before installing them.  See HOOKS in mmdebstrap(1) for  more  information  and
              examples.  Additional extract hooks can be specified with --extract-hook.

       essential-hooks
              list  of  essential  hooks  (string).  Execute arbitrary commands after the Essential:yes packages
              have been installed, but before installing the remaining packages.  See HOOKS in mmdebstrap(1) for
              more information and examples.  Additional essential hooks can be specified with --essential-hook.

       customize-hooks
              list of customize hooks (string).  Execute arbitrary commands after the chroot is set up  and  all
              packages  got  installed  but  before  final  cleanup  actions  are  carried  out.   See  HOOKS in
              mmdebstrap(1) for more information and examples.  Additional customize hooks can be specified with
              --customize-hook.

       cleanup-hooks
              list of cleanup hooks (string).  Cleanup hooks are just hooks that  are  run  directly  after  all
              other customize hooks.  See customize-hooks above.  Additional cleanup hooks can be specified with
              --cleanup-hook.

       skip   list  of  stages  to skip (string).  mmdebstrap tries hard to implement sensible defaults and will
              try to stop you before shooting yourself in the foot.  This option is for when you  are  sure  you
              know  what  you  are  doing and allows one to skip certain actions and safety checks.  See section
              OPERATION in mmdebstrap(1) for a list of possible arguments and their context.  Additional  stages
              to skip can be specified with --skip.

       suite  String.   The suite may be a valid release code name (eg, sid, stretch, jessie) or a symbolic name
              (eg, unstable, testing, stable, oldstable).  Can be overridden by --suite.

       target String.  The target argument can either be the  path  to  a  directory,  the  path  to  a  tarball
              filename, the path to a squashfs image or -.  Can be overridden by --target.

       variant
              Choose  which  package  set  to  install.   It needs to be one of extract, custom, essential, apt,
              required, minbase, buildd, important, debootstrap, -, standard.  See  mmdebstrap(1)  for  details.
              Can be overridden by --variant.

HOOKS

       bdebstrap  enhances  the hooks provided by mmdebstrap.  Hooks can use the environment variables specified
       via the env configuration option or the --env parameter.  bdebstrap sets following environment  variables
       by default to be consumed by the hooks:

       BDEBSTRAP_HOOKS
              Path to the hooks provided by bdebstrap.

       BDEBSTRAP_NAME
              name  of  the  generated golden image which is set via the name configuration option of the --name
              parameter.

       BDEBSTRAP_OUTPUT_DIR
              Path of a temporary directory inside the chroot.  Files and directories  that  are  placed  inside
              this  directory  will  be  copied  out  of  the  image  into the output directory.  This temporary
              directory will be removed in a final cleanup hook.

       Following hook scripts are shipped with bdebstrap:

       disable-units
              Disable services / systemd units.

       enable-units
              Enable services / systemd units.

       Example usage for the hook scripts:

              ---
              mmdebstrap:
                customize-hooks:
                  - $BDEBSTRAP_HOOKS/disable-units "$1" apt-daily.timer cron
                  - $BDEBSTRAP_HOOKS/enable-units "$1" systemd-timesyncd
                suite: bullseye
                target: root.tar
                variant: important

EXAMPLES

   Minimal Debian unstable tarball
       This example shows how to use a small YAML configuration to build  a  minimal  Debian  unstable  tarball.
       Assume following configuration is stored in unstable.yaml:

              ---
              mmdebstrap:
                keyrings:
                  - /usr/share/keyrings/debian-archive-keyring.gpg
                mode: unshare
                suite: unstable
                target: root.tar.xz
                variant: minbase

       Then the tarball can be generated by running

              $ bdebstrap -c unstable.yaml --name example1
              $ ls example1/
              config.yaml  manifest  root.tar.xz

   Debian live system
       This  example  shows how to use a YAML configuration to build a Debian 11 (bullseye) live system.  Assume
       following configuration is stored in live.yaml:

              ---
              mmdebstrap:
                architectures:
                  - amd64
                cleanup-hooks:
                  - cp /dev/null "$1/etc/hostname"
                  - if test -f "$1/etc/resolv.conf"; then cp /dev/null "$1/etc/resolv.conf"; fi
                customize-hooks:
                  - cp --preserve=timestamps -v "$1"/boot/vmlinu* "$1${BDEBSTRAP_OUTPUT_DIR?}/vmlinuz"
                  - cp --preserve=timestamps -v "$1"/boot/initrd.img* "$1${BDEBSTRAP_OUTPUT_DIR?}/initrd.img"
                  - mkdir -p "$1/root/.ssh"
                  - upload ~/.ssh/id_rsa.pub /root/.ssh/authorized_keys
                keyrings:
                  - /usr/share/keyrings/debian-archive-keyring.gpg
                mode: unshare
                packages:
                  - init
                  - iproute2
                  - less
                  - libpam-systemd
                  - linux-image-cloud-amd64
                  - live-boot
                  - locales
                  - openssh-server
                suite: bullseye
                target: root.squashfs
                variant: minbase

       This example assumes that ~/.ssh/id_rsa.pub  exists,  because  it  will  be  copied  into  the  image  to
       /root/.ssh/authorized_keys to allow SSH access using the user’s SSH key.

       The squashfs image can be generated by running

              $ bdebstrap -c live.yaml --name example2
              $ ls example2/
              config.yaml  initrd.img  manifest  root.squashfs  vmlinuz

       The kernel and initrd are copied out of the squashfs image using customize hooks to allow them to be used
       directly  by  QEMU.  To launch this image locally with QEMU, the root.squashfs image needs to be provided
       by a HTTP server:

              $ python3 -m http.server -b localhost --directory example2 8080

       This command exposes the generated image via HTTP on localhost on port 8080.  QEMU can be started passing
       the TCP traffic on port 8080 to the webserver:

              $ cd example2
              $ qemu-system-x86_64 -machine accel=kvm -m 1G -device virtio-net-pci,netdev=net0 -monitor vc \
                  -netdev user,id=net0,hostfwd=tcp::2222-:22,guestfwd=tcp:10.0.2.252:8080-tcp:localhost:8080,hostname=debian-live \
                  -kernel ./vmlinuz -initrd ./initrd.img -append "boot=live fetch=http://10.0.2.252:8080/root.squashfs quiet"

       To print the output on the launching terminal, add -nographic -serial stdio to the QEMU command line  and
       console=ttyS0 to the -append parameter.  Once the virtual machine is started, it can be accessed via SSH:

              $ ssh -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no -p 2222 root@localhost

SEE ALSO

       mmdebstrap(1), debootstrap(8)

AUTHOR

       Benjamin Drung bdrung@posteo.de

bdebstrap                                          2023-12-02                                       BDEBSTRAP(1)