blob: 38685fb57d7f47e6663d67b0027473ac47d0a2f5 [file] [log] [blame] [view]
# Chromium OS Factory Bundle
[TOC]
## What is a factory bundle?
A *factory bundle* is an archive file containing all files you need to setup
and deploy Chromium OS factory environment.
Here is a list of files in a typical factory bundle:
complete/
complete_script_sample.sh
factory_shim/
factory_install_shim.bin
firmware/
chromeos-firmwareupdate
firmware_images/
bios.bin
ec.bin
pd.bin
hwid/
hwid_v3_bundle_SAMUS.sh
release_image/
chromeos_9334.72.0_samus_recovery_stable-channel_mp-v3.bin
test_image/
ChromeOS-test-R58-9334.72.0-samus.bin
toolkit/
install_factory_toolkit.run
netboot/
tftp/
chrome-bot/
samus/
cmdline.sample
vmlinuz
dnsmasq.conf
image.net.bin
setup/
.default_board
cgpt
cros_docker.sh
cros_payload
futility
image_tool
NETBOOT.md
README.md
setup_tools.par
README
### release_image/
There should be exactly one file in this folder, with arbitrary file name.
* This file will be imported by factory server as release image.
* `factory_installer` will deploy release image into DUTs.
You can get release images from [CPFE] (select image type `RECOVERY_IMAGE`).
### test_image/
There should be exactly one file in this folder, with arbitrary file name.
* This file will be imported by factory server as test image.
* `factory_installer` will deploy test image into DUTs.
You can get test images from [CPFE] (select image type `TEST_IMAGE_ARCHIVE`).
### toolkit/
There should be exactly one file in this folder, with arbitrary file name.
* This file will be imported by factory server as factory toolkit installer.
* `factory_installer` will deploy factory toolkit into DUTs.
* Goofy will try to update factory toolkit when running pytest `sync_shopfloor`.
You can get factory toolkit installers from [CPFE] (select image type
`FACTORY_IMAGE_ARCHIVE`)
### hwid/
There should be exactly one file in this folder, with arbitrary file name.
* This file will be imported by factory server as HWID bundle.
* `factory_installer` will deploy HWID bundle into DUTs.
* Goofy will try to update HWID bundle when running some specific pytests.
You can get HWID bundles from [Chrome OS Device Lifecycle Manager][DLM] (select
your device -> `Files` -> `Add a filter` -> `HWID_BUNDLE`).
### firmware/
There could be at most one file in this folder, with arbitrary file name.
* This file (if exists) will be imported by factory server as firmware updater.
* `factory_installer` will run firmware updater to flash firmware (EC, AP, and
possibly PD) when imaging finished.
* Goofy will try to update firmware when running pytest `update_firmware`.
You can get a firmware updater from a release image by running
`factory/setup/image_tool get_firmware -i /path/to/release_image`
### complete/
There could be at most one file in this folder, with arbitrary file name.
* This file (if exists) will be imported by factory server as complete script.
* `factory_installer` will run the complete script after firmware updater.
You can find a complete script template in
`factory/setup/complete_script_sample.sh`.
### firmware_images/
`finalize_bundle` will extract firmware images from firmware updater and put
them into this folder.
### factory_shim/
`finalize_bundle` will extract factory shim image from `FACTORY_IMAGE_ARCHIVE`,
patch its server address, and put it into this folder.
### netboot/
`finalize_bundle` will extract netboot firmware `image.net.bin` and netboot
kernel `vmlinuz` from `FACTORY_IMAGE_ARCHIVE`, patch their server address, and
put them into this folder.
Also, there will be two files, `cmdline.sample` and `dnsmasq.conf`, which are
generated by `finalize_bundle` to help you setup TFTP service for netboot.
When importing a bundle:
* `netboot/image.net.bin` will be imported as netboot_firmware.
* `netboot/tftp/chrome-bot/*/vmlinu*` will be imported as netboot_kernel.
* `netboot/tftp/chrome-bot/*/cmdline` will be imported as netboot_cmdline.
(Note that `cmdline.sample` will not be imported)
### setup/
This folder is extracted from `FACTORY_IMAGE_ARCHIVE` by `finalize_bundle`,
contains many useful scripts, such as:
* `cros_docker.sh`
* `image_tool`
## Creating a factory bundle
There are several ways to create a bundle.
### Using command "image_tool bundle"
This is the recommended way for Google Partners (ODM, OEM, SOC) with access to
[CPFE](https://www.google.com/chromeos/partner/fe/).
1. Download the factory Zip file (select Image Type as `FACTORY_IMAGE_ARCHIVE`)
from CPFE Release / Image Files, extract to somewhere, for example
`my_bundle` directory. This will provide the toolkit, factory shim, netboot
and setup.
2. Download the test image (select Image Type as `TEST_IMAGE_ARCHIVE` from CPFE
Release / Image files, extract all files to the `test_image` sub directory,
for example `my_bundle/test_image`.
3. Download the release (FSI) image (select Image Type as `RECOVERY_IMAGE` from
CPFE Release / Image files, save the files to the `release_image` sub
directory, for example `my_bundle/release_image`.
4. If you want to use a different version of firmware, download the right
`RECOVERY_IMAGE` that contains the right version of firmware updater,
and extract the updater from it by `image_tool get_firmware`:
image_tool get_firmware -i PATH_TO/image.bin
And copy the generated `chromeos-firmwareupdate` file to the `firmware` sub
directory, for example `my_bundle/firmware`. If you need to use a firmware
that is not included in any recovery images, download the firmware image
archive file with Image Type `FIRMWARE_IMAGE_ARCHIVE` from CPFE Release /
Image files, extract the `updater.sh` and use it.
Please be aware this will be a developer-key signed firmware and can't be
used in PVT or MP builds.
If you want to skip updating firmware in the imaging process, add
`--no-firmware` when you invoke `image_tool bundle` command.
5. If available, download the HWID bundle from CPFE Device File Repo / Manage
Files (Type `HWID_BUNDLE`) and save to the `hwid` sub directory, for example
`my_bundle/hwid`.
6. Enter the folder with all resource you've extracted and run `image_tool
bundle` command, and specify the build phase (from one of `proto`, `evt`,
`dvt`, `pvt`, `mp`) and an optional release note. If you plan to use network
based installation (netboot or factory shim), also specify the factory server
URL. For example:
cd my_bundle;
setup/image_tool bundle -p evt -n "First Release" -s http://192.168.0.1:8080
The host IP in server URL will also be used for TFTP server IP (since TFTP
port is fixed to 69).
This should generate a factory bundle as
`factory_bundle_${BOARD}_${DATETIME}_${PHASE}.tar.bz2`, for example
`factory_bundle_eve_201804120907_evt.tar.bz2`.
7. If you need to use any resources in different path, each of them can be
specified by `image_tool` command options. Run `image_tool help bundle`
to see a full list of available options. For example:
setup/image_tool bundle --release_image PATH_TO/image.bin \
--test_image PATH_TO/image2.bin --toolkit PATH_TO/my_toolkit \
--firmware PATH_TO/updater.sh
### Using Easy Bundle Creation Service
This is the recommended way for non-engineers with access to CPFE/cpcon, for
example Google Partners (ODM, OEM, SOC) or Google device PMs.
Open [cpcon](https://www.google.com/chromeos/partner/console), select
Tools / Factory Bundle, and in the menu select your board, device (project),
build phase, versions of toolkit (which implies netboot and factory shim), test
and release image, then click the CREATE button.
Wait for few minutes and you should see a mail notifying the address to download
the generated factory bundle.
### Create bundle manually
This is the recommended way for people who does not have access to CPFE nor
GoldenEye.
If you just want a bundle for [Factory Server](FACTORY_SERVER.md) to import, you
can manually create an archive file (zip file or {gzip|bzip2|xz} compressed
tarball) containing att least the following folders with corresponding files
inside:
* `release_image`
* `test_image`
* `toolkit`
Additionally, if you want to provide the optional components or override with
some more components, create the corresponding folders. For example,
* `complete`
* `firmware`
* `hwid`
Or you can just enter Factory Server web user interface, and partial update
the individual resource.
No need to always create a factory bundle for network installation.
### Using command "finalize_bundle"
This is the recommended way for Google developers with access to GoldenEye.
To create a complete factory bundle, you need to run `finalize_bundle`.
`finalize_bundle` takes a manifest file `MANIFEST.yaml` and produces a factory
bundle.
Here is a template `MANIFEST.yaml`:
board: samus
project: samus
bundle_name: 20170628_dvt
server_url: http://12.34.56.78:8080/
firmware: local
release_image: 9334.72.0
test_image: 9334.72.0
toolkit: 9688.0.0
#### Field `board`
Board name.
#### Field `project`
The Public Code Name (can be found on Golden Eye), or the "Google Name". Also
should be same as the "Model Name" displayed in firmware screen (which is
actually HWID), or reported on by command `cros_config / name`.
The `project` is made for projects sharing one board (overlay), especially for
Zerg projects.
For example, the projects `electro` and `basking` both share images built using
`BOARD=reef`, so you will set:
board: reef
project: electro
For projects having its own overlay, `board` and `project` may be same name.
For example, `pyro` is using `reef` as reference design but it does have its
own overlay, so you will need to set:
board: pyro
project: pyro
The `project` will be used to decide which HWID config file to use, and to
find right firmware (and signing keys).
#### Field `bundle_name`
`{YYYYMMDD}_{proto|evt|dvt|pvt}`
#### Field `server_url`
`http://{server ip}:{server port}/`
`finalize_bundle` will inject this address into netboot firmware and factory
shim.
This is an optional field.
#### Field `firmware`
There are three kinds of valid values:
* `local`: User manually prepares a firmware updater in `firmware/`.
* `release_image`: Use firmware updater in the release image.
* `release_image/xxxx.y.z`: Version of the **Release image** which contains the
firmware. Note that this is not the version of firmware itself.
This is an optional field. Default value is `release_image`.
#### Field `hwid`
There are two valid values:
* `real`: There should be a real HWID bundle in `hwid/`.
* `none`: `finalize_bundle` will create a dummy HWID bundle.
This is an optional field. Default value is `real`.
#### Field `release_image`
There are two kinds of valid values:
* `local`: User manually prepares a release image in `release_image/`.
* `{xxxx.y.z}`: Release image version for `finalize_bundle` to download.
If there is already one file in `release_image/`, `finalize_bundle` will
check whether the version matches or not.
#### Field `test_image`
There are two kinds of valid values:
* `local`: User manually prepares a test image in `test_image/`.
* `{xxxx.y.z}`: Test image version for `finalize_bundle` to download.
If there is already one file in `test_image/`, `finalize_bundle` will
check whether the version matches or not.
#### Field `toolkit`
There are two kinds of valid values:
* `local`: User manually extracts `FACTORY_IMAGE_ARCHIVE` in bundle directory.
* `{xxxx.y.z}`: `FACTORY_IMAGE_ARCHIVE` version for `finalize_bundle` to
download. `finalize_bundle` will always download `FACTORY_IMAGE_ARCHIVE` if
toolkit is set to non-local.
#### Non-local resources
Currently non-local resources can only be accessed by Google internally.
Partners can only use local resources.
#### Running finalize_bundle command
With `MANIFEST.yaml`, we can run `finalize_bundle` now.
**We strongly recommend you to install `lbzip2`,
which can help you reduce `finalize_bundle` execution time by a lot.**
To get `finalize_bundle`, please checkout factory repository:
git clone https://chromium.googlesource.com/chromiumos/platform/factory
Create a directory with name `factory_bundle_{board}_{bundle_name}`:
mkdir factory_bundle_samus_20170628_dvt
cd factory_bundle_samus_20170628_dvt/
Prepare firmware updater if you want to use local firmware updater:
ln /path/to/chromeos-firmwareupdate firmware/
Prepare release image if you want to use local release image:
ln /path/to/chromeos_9334.72.0_samus_recovery_stable-channel_mp-v3.bin release_image/
Prepare test image if you want to use local test image:
tar -JxvC test_image/ </path/to/ChromeOS-test-R58-9334.72.0-samus.tar.xz
Extract factory zip (`FACTORY_IMAGE_ARCHIVE`) if you want to use a local one:
unzip /path/to/ChromeOS-factory-R61-9688.0.0-samus.zip
Prepare HWID bundle if you want to use local HWID bundle:
ln /path/to/hwid_v3_bundle_SAMUS.sh hwid/
Add your `MANIFEST.yaml` if you don't have it in factory zip or you want to use
a new one:
cp /path/to/MANIFEST.yaml MANIFEST.yaml
Finally, run `finalize_bundle`:
/path/to/factory/bin/finalize_bundle .
After minutes, you will get a complete factory bundle. Cheers!
[CPFE]: https://www.google.com/chromeos/partner/fe/
[DLM]: https://chromeos.google.com/partner/dlm/device/list