This directory contains a tool for partitioning disk images for Brillo
and Android.

-- FILES AND DIRECTORIES

 Android.mk

   Build instructions.

 bpttool

   A tool written in Python for partioning disk images.

 bpttool_test

   Unit tests for bpttool.

 test/

   Contains test data used in unit tests.

-- PARTITION DEFINITION FILES

Partitioning directives are expressed in JSON and the file extension
".bpt" is typically used. A typical .bpt-file looks like this

  {
      "settings": {
          "disk_size": "4 GiB"
      },
      "partitions": [
          {
              "ab": true,
              "label": "boot",
              "size": "32 MiB",
              "guid": "auto",
              "type_guid": "brillo_boot"
          },
          {
              "ab": true,
              "label": "system",
              "size": "512 MiB",
              "guid": "auto",
              "type_guid": "brillo_system"
          },
          [...]
          {
              "label": "userdata",
              "grow": true,
              "guid": "auto",
              "type_guid": "brillo_userdata"
          }
      ]
  }

The two root objects are "settings" and "partitions". Well-known
key/value-pairs for "settings" are

 ab_suffixes:    List of suffixes to use for A/B partitions, for example
                 ["-A", "-B"] or ["0", "1", "2"]. Default is ["_a",
                 "_b"].

 disk_size:      The size of the target disk to use, in bytes. This has
                 no default value.

 partitions_offset_begin :
                 The size of the disk partitions offset begin, in bytes.
                 Default is 0.

 disk_alignment: The alignment, in bytes, to use when laying out
                 partitions. Default is 4096.

 disk_guid:      The GUID to use for the disk or 'auto' to make bpttool
                 generate it. The default is 'auto'.

Each of these settings can be overriden or set using command-line
options in bpttool.

The "partitions" object is an array of objects with the following
well-known key/value pairs:

 label:       The label of the partition. This must be able to fit in 36
              UTF-16 code-points.

 offset:      Offset of the partition, in bytes. This will always be
              re-calculated when using bpttool.

 size:        Size of the partition, in bytes.

 grow:        If 'true', the partition will be grown to use available free
              space. Default value is 'false'.

 guid:        The GPT instance GUID. Default value is 'auto'.

 type_guid:   The GPT type GUID. A RFC-4122 style GUID is accepted as
              are the following special values:

                brillo_boot
                brillo_bootloader
                brillo_system
                brillo_odm
                brillo_oem
                brillo_userdata
                brillo_misc
                brillo_vbmeta
                brillo_vendor_specific
                linux_fs
                ms_basic_data

              for well-known GPT partition GUIDs. If unset, the value
              'brillo_vendor_specific' is used.

 flags:       A 64-bit integer (decimal or hexadecimal representations are
              accepted) for GPT flags. Default value is 0.

 ignore:      If 'true', the partition will not be included in the final
              output.

 ab:          Set to 'true' if the partition should be expanded for A/B.
              Default value is 'false'.

 ab_expanded: Set to 'true' only if this partition has already been
              expanded for A/B. Default value is 'false'.

 position:    The position for the partition, used to determine the sequence
              of partitions (and, indirectly, partition numbers) or 0 if
              position doesn't matter. Partitions with low 'position'
              numbers will be laid out before partitions with high
              'position' numbers. Default value is 0.

For key/value-pairs involving sizes, either integers can be used, e.g.

 "size": 1048576

means 1 mebibyte. Strings with base-10 units (kB, MB, GB, TB, PB) and
base-2 units (KiB, MiB, GiB, TiB, PiB) are also supported. For
example:

 "size": "1 MiB"

means 1,048,576 bytes and

 "size": "1 MB"

means 1,000,000 bytes.

If a partition size is not a multiple of the disk sector size, it will
be rounded up and if a disk size is not a multiple, it will be rounded
down.

The bpttool program reads one or more of .bpt-files and the order
matters. Partitions are identified by label and if a partition has
already been mentioned in a previous file, directives in the latter
file will override the existing entry. This allows for setups where
e.g. a file with the following content

  {
      "partitions": [
          {
              "label": "system",
              "size": "128 MiB"
          }
      ]
  }

can be used on top to specify that system partitions should be 128 MiB
instead of 512 MiB. Similarly, a file with the content

  {
      "partitions": [
          {
              "label": "my_app_data",
              "size": "512 MiB",
              "type_guid": "linux_fs"
          }
      ]
  }

can be used on top to have a new 512 MiB partition "my_app_data" in
addition to existing partitions. Notably the "userdata" data partition
will be shrunk in order to make room for the newly added partition.

Additionally, 'bpttool make_table' generates a .bpt-file - in addition
to the binary GPT partition tables - that is complete in the sense
that it can be used as input to generate the same output without
additional command-line options.

Also, expanded A/B partitions in input files are folded and then
expanded again. This allows for setups as the following:

 $ bpttool make_table \
    --input prev_output.bpt \
    --ab_suffixes "-A,-B,-C" \
    --output_json new_output.bpt
    [...]

where if prev_output.bpt contained the partitions "system_a",
"system_b" (for the default A/B suffixes) then new_output.bpt would
contain partitions "system-A", "system-B", and "system-C".

-- DISK IMAGE GENERATION

Disk images may be created given an unfolded .bpt file. 'bpttool
make_disk_image' generates the output disk image file.

To generate a disk image, use the following subcommand:

  $ bpttool make_disk_image \
      --output disk-image.bin \
      --input /path/to/bpt-file.bpt \
      --image system_a:/path/to/system.img \
      --image boot_a:/path/to/boot.img \
      [...]

where the 'output' argument specifies the name and location of the outputted
disk image and the 'input' argument is the .bpt file containing valid labels and
offsets for each partition.  The 'image' argument specifies a mapping  from
partition name/label to the path of the corresponding image partition image.
All partitions specified in the .bpt file must be passed in via the 'image'
argument.

Typically, each of the 'image' argument files are located in the
ANDROID_PRODUCT_OUT directory after a build is complete.

-- BUILD SYSTEM INTEGRATION NOTES

To generate partition tables in the Android build system, simply add
the path to a .bpt file to the BOARD_BPT_INPUT_FILES variable.

 BOARD_BPT_INPUT_FILES += "hardware/bsp/vendor/soc/board/board-specific.bpt"

The variable BOARD_BPT_DISK_SIZE can be used to specify or override
the disk size, for example:

 BOARD_BPT_DISK_SIZE := "10 GiB"

Additional arguments to 'bpttool make_table' can be specified in the
variable BOARD_BPT_MAKE_TABLE_ARGS.

If BOARD_BPT_INPUT_FILES is set, the build system generates two files

 partition-table.img
 partition-table.bpt

in ${ANDROID_PRODUCT_OUT} using 'bpttool make_table'. The former is
the binary partition tables generated using bptool's --output_gpt
option and the latter is a JSON file generated using the --output_json
option. These files will also be put in the IMAGES/ directory of
target-files.zip when running 'm dist'.
