Provided by: depthcharge-tools_0.6.2-1_all bug

NAME

       mkdepthcharge - Build boot images for the ChromeOS bootloader

SYNOPSIS

       mkdepthcharge -o FILE [options] [VMLINUZ] [INITRAMFS ...] [DTB ...]

DESCRIPTION

       mkdepthcharge  wraps the mkimage(1) and vbutil_kernel(1) programs with reasonable defaults to package its
       inputs into the format the ChromeOS  bootloader  expects.  It  also  automates  preprocessing  steps  and
       initramfs support hacks that a user would have to do manually or write a script for.

       The  VMLINUZ should be a kernel executable, INITRAMFS should be a ramdisk image that the kernel should be
       able to use on its own, and DTB files should be device-tree binary files appropriate for the kernel.

       mkdepthcharge tries to determine the type of each input file by some heuristics on  their  contents,  but
       failing  that  it  assumes  a  file  is  whatever  is  missing  in  the  VMLINUZ,  INITRAMFS,  DTB order.
       Alternatively, these files can be specified as options instead of positional arguments.

OPTIONS

   Input files
       -d VMLINUZ, --vmlinuz VMLINUZ
              Kernel executable. If a compressed file is given here, it is decompressed  and  its  contents  are
              used in its place.

       -i INITRAMFS [INITRAMFS ...], --initramfs INITRAMFS [INITRAMFS ...]
              Ramdisk image. If multiple files are given (e.g. for CPU microcode updates), they are concatenated
              and used as a single file.

       -b DTB [DTB ...], --dtbs DTB [DTB ...]
              Device-tree binary files.

   Global options
       -A ARCH, --arch ARCH
              Architecture  to  build  the  images for.  The following architectures are understood: arm, arm64,
              aarch64 for ARM boards; x86, x86_64, amd64 for x86 boards. If not given, the build architecture of
              the VMLINUZ file is used.

       --format FORMAT
              Kernel image format to use, either fit or zimage. If not given, architecture-specific defaults are
              used.

              fit    This is the default on ARM boards. The VMLINUZ and the optional INITRAMFS,  DTB  files  are
                     packaged  into the Flattened Image Tree (FIT) format using mkimage(1) and that is passed to
                     vbutil_kernel(1).

              zimage This  is  the  default  for  x86  boards.  The  VMLINUZ  is  passed  mostly  unmodified  to
                     vbutil_kernel(1),   except  for  decompression  and  padding  for  self-decompression.  The
                     INITRAMFS file is passed as the --bootloader argument and the kernel header is modified  to
                     point to where it will be in memory. It does not support packaging DTB files.

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

       --kernel-start ADDR
              Start  of  the  Depthcharge  kernel buffer in memory. Depthcharge loads the packed data to a fixed
              physical address in memory, and some initramfs support hacks require this value to be known.  This
              is  exactly  the  board-specific  CONFIG_KERNEL_START  value  in  the  Depthcharge source code and
              defaults to 0x100000 for the x86 architecture.

       -o FILE, --output FILE
              Write the image to FILE. The image isn't generated  at  the  output,  but  copied  to  it  from  a
              temporary working directory. This option is mandatory.

       --pad-vmlinuz, --no-pad-vmlinuz
              Pad the VMLINUZ file so that the kernel's self-decompression has enough space to avoid overwriting
              the  INITRAMFS file during boot.  This has different defaults and behaviour depending on the image
              format, see explanations in their respective sections.

       --tmpdir DIR
              Create and keep temporary files in DIR. If not given, a  temporary  mkdepthcharge-*  directory  is
              created in /tmp and removed at exit.

       -v, --verbose
              Print info messages, mkimage(1) output and vbutil_kernel(1) output to stderr.

       -V, --version
              Print program version and exit.

   FIT image options
       -C TYPE, --compress TYPE
              Compress  the  VMLINUZ before packaging it into a FIT image, either with lz4 or lzma. none is also
              accepted, but does nothing.

       -n DESC, --name DESC
              Description of the VMLINUZ to put in the FIT image.

       --pad-vmlinuz, --no-pad-vmlinuz
              Pad the VMLINUZ file so that the kernel's self-decompression has enough space to avoid overwriting
              the INITRAMFS file during boot.  The necessary padding  is  calculated  based  on  compressed  and
              decompressed kernel sizes and the --kernel-start argument.

              On earliest boards U-Boot moves the INITRAMFS away to a safe place before running the VMLINUZ, and
              on ARM64 boards Depthcharge itself decompresses the VMLINUZ to a safe place. But 32-bit ARM boards
              with  Depthcharge lack FIT ramdisk support and run the VMLINUZ in-place, so this initramfs support
              hack is necessary on those.

              This option is enabled by default when --patch-dtbs is given, use the --no-pad-vmlinuz argument to
              disable it.

       --patch-dtbs, --no-patch-dtbs
              Add linux,initrd-start and linux,initrd-end properties to the  DTB  files'  /chosen  nodes.  Their
              values  are  based  on  the --kernel-start or the --ramdisk-load-address argument, one of which is
              required if this argument is given.

              These properties are normally added by Depthcharge, but 32-bit ARM Chromebooks were released  with
              versions before FIT ramdisk support was introduced, so this initramfs support hack is necessary on
              those.

       --ramdisk-load-address ADDR
              Add  a  load  property  to the FIT ramdisk subimage section. The oldest ARM Chromebooks use an old
              custom U-Boot that implements the same verified boot flow as Depthcharge. Its FIT ramdisk  support
              requires an explicit load address for the ramdisk, which can be provided with this argument.

   zImage image options
       --pad-vmlinuz, --no-pad-vmlinuz
              Pad the VMLINUZ file so that the kernel's self-decompression has enough space to avoid overwriting
              the INITRAMFS file during boot.  The necessary padding is calculated based on values in the zImage
              header and the --kernel-start argument.

              If  the  VMLINUZ  and  INITRAMFS  are  small  enough  (about 16 MiB in total) they may fit between
              --kernel-start and the start of the decompression buffer. In this case the padding is  unnecessary
              and not added.

              The  padding  is  usually  larger  than  the  decompressed version of the kernel, so it results in
              unbootable images for older boards with  small  image  size  limits.  For  these,  it  is  usually
              necessary to use --set-init-size, or custom kernels to make the parts fit as described above.

              This is disabled by default in favour of --set-init-size, use the --pad-vmlinuz argument to enable
              it.

       --set-init-size, --no-set-init-size
              Increase  the  init_size  kernel  boot  parameter so that the kernel's self-decompression does not
              overwrite the INITRAMFS file during boot. The modified value is calculated based on values in  the
              zImage header and the --kernel-start argument.

              This  only  works  if  the  kernel  has KASLR enabled (as is the default), because then the kernel
              itself tries to avoid overwriting the INITRAMFS during decompression. However it does not do  this
              when first copying the VMLINUZ to the end of the decompression buffer. Increasing init_size shifts
              copy this upwards to avoid it overlapping INITRAMFS.

              If  the  VMLINUZ  and  INITRAMFS are small enough, they may fit before the first compressed copy's
              start. In this case changing the value is unnecessary and skipped.

              This is enabled by default, use the --no-set-init-size argument to disable it.

   Depthcharge image options
       --bootloader FILE
              Bootloader stub for the very first Chromebooks that use H2C as their firmware. Beyond those,  this
              field is ignored on the firmware side except as a ramdisk for the multiboot and zbi formats.

              If  an INITRAMFS is given for the zimage format, it is placed here as part of an initramfs support
              hack for x86 boards. Otherwise, an empty file is used.

       -c CMD [CMD ...], --cmdline CMD [CMD ...]
              Command-line parameters for the kernel. Can be used multiple times to append new  values.  If  not
              given, -- is used.

              The ChromeOS bootloader expands any instance of %U in the kernel command line with the PARTUUID of
              the  ChromeOS  kernel  partition it has chosen to boot, e.g. root=PARTUUID=%U/PARTNROFF=1 will set
              the root partition to the one after the booted partition.

              As knowing the currently booted partition is generally useful, mkdepthcharge prepends kern_guid=%U
              to the given kernel command line parameters to capture it. Use --no-kern-guid to disable this.

       --kern-guid, --no-kern-guid
              Prepend kern_guid=%U to kernel command-line parameters.  This  is  enabled  by  default,  use  the
              --no-kern-guid argument to disable it.

       --keydir KEYDIR
              Directory   containing   verified   boot   keys   to   use.   Equivalent   to   using   --keyblock
              KEYDIR/kernel.keyblock,    --signprivate    KEYDIR/kernel_data_key.vbprivk,    and    --signpubkey
              KEYDIR/kernel_subkey.vbpubk.

       --keyblock FILE, --signprivate FILE, --signpubkey FILE
              ChromiumOS  verified  boot  keys.  More  specifically:  kernel key block, private keys in .vbprivk
              format, and public keys in .vbpubk format.

              If not given, defaults to files set in depthcharge-tools configuration.  If  those  are  not  set,
              mkdepthcharge  searches  for  these  keys  in  /etc/depthcharge-tools and /usr/share/vboot/devkeys
              directories, the latter being test keys that may be distributed with vbutil_kernel(1).

              You can set these in depthcharge-tools configuration by the vboot-keyblock, vboot-private-key  and
              vboot-public-key options under a depthcharge-tools config section.

EXIT STATUS

       In general, exits with zero on success and non-zero on failure.

FILES

       /etc/depthcharge-tools/config, /etc/depthcharge-tools/config.d/*
              The  depthcharge-tools  configuration  files.  These  might  be  used  to specify locations of the
              ChromiumOS verified boot keys as system configuration.

       /etc/depthcharge-tools
              The depthcharge-tools configuration directory. mkdepthcharge searches this directory for  verified
              boot keys.

       /usr/share/vboot/devkeys
              A directory containing test keys which should have been installed by vbutil_kernel(1).

       KEYDIR/kernel.keyblock
              Default kernel key block file used for signing the image.

       KEYDIR/kernel_subkey.vbpubk
              Default public key used to verify signed images.

       KEYDIR/kernel_data_key.vbprivk
              Default private key used for signing the image.

EXAMPLES

       mkdepthcharge -o depthcharge.img /boot/vmlinuz
              The  simplest invocation possible. If tried on an ARM board, the firmware might refuse to boot the
              output image since it doesn't have a dtb for the board. Otherwise, even if the firmware  runs  the
              /boot/vmlinuz  binary,  it  might not correctly boot due to non-firmware causes (e.g. kernel panic
              due to not having a root).

       mkdepthcharge -o system.img --cmdline "root=/dev/mmcblk0p2" --compress lz4 -- /boot/vmlinuz.gz
       /boot/initrd.img rk3399-gru-kevin.dtb
              A command someone using a Samsung Chromebook Plus (v1) might  run  on  their  board  to  create  a
              bootable image for their running system.

       mkdepthcharge -o veyron.img -c "root=LABEL=ROOT gpt" --kernel-start 0x2000000 --patch-dtbs --
       /boot/vmlinuz /boot/initramfs-linux.img /boot/dtbs/rk3288-veyron-*.dtb
              Build  an  image intended to work on veyron boards like ASUS Chromebook C201PA and Chromebook Flip
              C100PA. The stock Depthcharge on these boards doesn't process the FIT ramdisk, so the  dtbs  needs
              to be patched to boot with initramfs.

       mkdepthcharge -o peach-pit.img -c "console=null" --ramdisk-load-address 0x44000000 -- vmlinuz initramfs
       exynos5420-peach-pit.dtb exynos5420-peach-pit.dtb
              Build an image intended to work on a Samsung Chromebook 2 (11").  This board uses a custom U-Boot,
              so  needs  an  explicit  ramdisk load address. Its firmware has a bug with loading the device-tree
              file, so needs the file twice for the result to be actually bootable.

SEE ALSO

       depthchargectl(1), mkimage(1), vbutil_kernel(1), futility(1)

v0.6.2                                             2023-06-30                                   MKDEPTHCHARGE(1)