cros deploy
is a script to deploy (install) a package to your Chromium OS device. It copies the binary packages built in your chroot to the target device and installs (emerges) on the device.
Note: cros deploy
does not build packages for you. Please make sure you have built all the requested packages using emerge
before invoking cros deploy
.
Note: To be able to write to your rootfs partition, cros deploy
may remount your rootfs partition as read-write or disable the rootfs verification on your device.
Note: cros deploy
does not currently support deploying kernel packages. See the Kernel Development guide for supported methods.
cros deploy
needs to run in chroot.If your device is currently running a non-test image, you may want to use a USB stick to image the device.
$ cros deploy <device> <package>...
<device>
: The IP or hostname of the device, in the form ssh://hostname[:port]
or hostname[:port]
, where port
is the port number used for SSH. (It can be omitted and defaults to 22.)<package>
: One or more packages to install.For example, to install the cherrypy
package to your device (with IP address ${DUT_IP}
):
$ cros deploy ${DUT_IP} cherrypy
cros deploy
does its best to figure out what packages you want to install, even when you do not enter a complete or unique package name. When there is ambiguity, it may prompt you to choose.
A unique package name should include three parts: ${category}/${package}-${version}
. For example, dev-python/cherrypy-3.1.2
.
cros deploy
accepts any of the following formats:
${category}/${package}-${version} ${category}/${package} ${package}-${version} ${package}
When the given input such as ${package}
(e.g. cherrypy
) is unique, which is the common case, cros deploy
automatically selects the right package for you. If, however, ${package}
exists in multiple categories, cros deploy
prompts you to choose. For example,
Multiple matches found for cherrypy: [0]: dev-python/cherrypy [1]: foo/cherrypy Enter your choice to continue [0-1]: 1
When there are multiple versions available, cros deploy
chooses the best visible one. For example, if you cros workon
a package, cros deploy
will try to use the 9999 version instead.
By default, cros deploy
installs all packages at root (“/”). The user can override this with --root
. This is necessary for many development packages, which are installed in /usr/local
. (A bug is open to auto-detect the correct location to install to.)
Errors like the one below are likely caused by emerge
missing on the target system. (This can happen if the stateful partition is wiped after the OS image has been deployed. Also remember that the target needs to run a test image.)
13:14:55: ERROR: Failed to emerge package chromeos-chrome-46.0.2472.0_rc-r1.tbz2 13:14:56: ERROR: Oops. Something went wrong. 13:14:56: ERROR: cros deploy failed before completing. 13:14:56: ERROR: <class 'chromite.lib.cros_build_lib.RunCommandError'>: return code: 127 Failed command "ssh -p 22 '-oConnectionAttempts=4' '-oUserKnownHostsFile=/dev/null' '-oProtocol=2' '-oConnectTimeout=30' '-oServerAliveCountMax=3' '-oStrictHostKeyChecking=no' '-oServerAliveInterval=10' '-oNumberOfPasswordPrompts=0' -i /tmp/ssh-tmpb5S6kc/testing_rsa root@172.26.58.201 -- 'FEATURES=-sandbox' 'PORTAGE_CONFIGROOT=/usr/local' "CONFIG_PROTECT='-*'" 'PKGDIR=/usr/local/tmp/cros-deploy/tmp.6xIVEajmyJ/packages' 'PORTDIR=/usr/local/tmp/cros-deploy/tmp.6xIVEajmyJ' 'PORTAGE_TMPDIR=/usr/local/tmp/cros-deploy/tmp.6xIVEajmyJ/portage-tmp' emerge --usepkg /usr/local/tmp/cros-deploy/tmp.6xIVEajmyJ/packages/chromeos-base/chromeos-chrome-46.0.2472.0_rc-r1.tbz2 '--root=/'", cwd=None, extra env={'LC_MESSAGES': 'C'}
The following mostly occurs when deploying large packages such as Chrome:
rsync: write failed on "/usr/local/tmp/cros-deploy/tmp.Ts2Ayh1nKT/packages/chromeos-base/chromeos-chrome-46.0.2472.0_rc-r1.tbz2": No space left on device (28) rsync error: error in file IO (code 11) at receiver.c(393) [receiver=3.1.1] rsync: [sender] write error: Broken pipe (32) 13:21:46: ERROR: Oops. Something went wrong. 13:21:46: ERROR: cros deploy failed before completing. 13:21:46: ERROR: <class 'chromite.lib.cros_build_lib.RunCommandError'>: return code: 11
This happens because the target's /usr/local/tmp
has insufficient space to download the package. A workaround is pointing /usr/local/tmp
to /tmp
:
$ rm -r /usr/local/tmp $ ln -s /tmp /usr/local/tmp