Running ChromeOS UI on Linux

Note that this instructions may not work for you. They have been verified to work as of 2018/06/06 on standard Google engineering workstations as issued to engineerings on the Chrome team. Please submit patches describing the steps needed for other machines or distributions.


If you have an NVidia card, you probably have the binary drivers installed. These install a blacklist for the nouveau kernel modules. Best is to remove the nvidia driver and switch to nouveau completely:

$ sudo apt-get remove --purge "nvidia*"
$ sudo apt-get install xserver-xorg-input-evdev xserver-xorg-input-mouse xserver-xorg-input-kbd xserver-xorg-input-libinput xserver-xorg-video-nouveau
$ sudo dpkg-reconfigure xserver-xorg
$ # If you are using a Google development machine:
$ sudo goobuntu-config set custom_video_driver custom

Default version of nouveau xorg driver is too old for the NV117 chipset in Z840 machines. Install a newer version:

$ cd /tmp
$ wget
$ sudo apt-get install ./xserver-xorg-video-nouveau_1.0.15-2_amd64.deb

At this point you must reboot. If you run into issues to load video at boot then disable load_video and gfx_mode in /boot/grub/grub.cfg.

Building Chrome

Checkout chromium as per your usual workflow. See Get the Code: Checkout, Build, & Run Chromium. Googlers should checkout chromium source code as described here: Building Chromium on a corporate Linux workstation

We want to build on linux on top of Ozone with gbm platform. The following instructions builds chromium targets along with minigbm that lives in the chromium tree src/third_party/minigbm. Currently, there is no builder for this configuration so while this worked (mostly) when this document was written, some experimentation may be necessary.

Set the gn args for your output dir target out/Nouveau with:

$ gn args out/Nouveau
Add the following arguments:
dcheck_always_on = true
use_ozone = true
target_os = "chromeos"
ozone_platform_gbm = true
ozone_platform = "gbm"
use_system_minigbm = false
target_sysroot = "//build/linux/debian_jessie_amd64-sysroot"
is_debug = false
use_goma = true
use_xkbcommon = true
#use_evdev_gestures = true
#use_system_libevdev = false
#use_system_gestures = false

# Non-Googlers should set the next two flags to false
is_chrome_branded = true
is_official_build = true
use_pulseaudio = false

Build official release build of chrome:

$ ninja -j768 -l24 -C out/Nouveau chrome chrome_sandbox nacl_helper
$ # Give user access to dri, input and audio device nodes:
$ sudo sh -c "echo 'KERNEL==\"event*\", NAME=\"input/%k\", MODE=\"660\", GROUP=\"plugdev\"' > /etc/udev/rules.d/90-input.rules"
$ sudo sh -c "echo 'KERNEL==\"card[0-9]*\", NAME=\"dri/%k\", GROUP=\"video\"' > /etc/udev/rules.d/90-dri.rules"
$ sudo udevadm control --reload
$ sudo udevadm trigger --action=add
$ sudo usermod -a -G plugdev $USER
$ sudo usermod -a -G video $USER
$ sudo usermod -a -G audio $USER
$ newgrp video
$ negrrp plugdev
$ newgrp audio
$ # Stop pulseaudio if running:
$ pactl exit

Run chrome: (Set CHROMIUM_SRC to the directory containing your Chrome checkout.)

$ sudo chvt 8; EGL_PLATFORM=surfaceless $CHROMIUM_SRC/out/Nouveau/chrome --ozone-platform=gbm --force-system-compositor-mode --login-profile=user --user-data-dir=$HOME/.config/google-chrome-gbm --ui-prioritize-in-gpu-process --use-gl=egl  --enable-wayland-server --login-manager --ash-constrain-pointer-to-root --default-tile-width=512 --default-tile-height=512 --system-developer-mode --crosh-command=/bin/bash

Login to Chrome settings should synchronize.

Install Secure Shell if not already installed from the web store