A closer look at Chrome OS using LXD to run Linux GUI apps (Project Crostini)

At Google I/O 2018, one of the presentations was on What’s new in Android apps for Chrome OS (Google I/O ’18). The third and most exciting developer tool shown in the presentation, was the ability to run graphical Linux apps on Chrome OS. Here is a screenshot of a native Linux terminal application, as shown in the presentation.

They were so excited that the presenter said it would knock the socks off of the participants. And they had arranged a giveaway of socks. Actual socks swag to those attending the presentation 8-).

The way that they get the GUI apps from the LXD container to appear to the screen, is similar to

Project Crostini

Project Crostini is the Chrome OS project to add support to run Linux GUI apps on Chrome OS.

The components that facilitate Project Crostini can be found at https://github.com/lstoll/cros-crostini That page has instructions for those that wanted to enable the running of Linux GUI apps on Chrome OS, when Project Crostini was still under development. Lincoln Stoll dissected the source of Chrome OS and created a helpful list of the involved repositories.

The basic component is The Chrome OS Virtual Machine Monitor (crossvm), which runs untrusted operating systems through Linux’s KVM interface. The Linux distribution would run in a VM. The test repositories make reference to the X server, XWayland and Wayland. There is a repository called sommelier, which is a nested Wayland compositor with X11 forwarding support. It needs more searching to figure out where the source code ended into the Chrome OS repository and what is actually being used.

Update #1: Here are the vm_tools in Chrome OS. They include garcon,  a service that gets added in the container and communicates with another service outside of the container (vm_concierge).

What is important, is that LXD runs in this VM and is configured to launch a machine container with a Linux distribution. We are going in depth into this.

LXD in Project Crostini

Here is the file that does the initial configuration of the LXD service. It preseeds LXD with the following configuration.

  1. It uses a storage pool with the btrfs filesystem.
  2. It sets up a private bridge for networking.
  3. It configures the default LXD profile with relevant settings that will be applied to the container when it gets created.
    1. The container will not autostart when the Chromebook is restarted. It will get started manually.
    2. There will be private networking.
    3. The directory /opt/google/cros-containers of the host gets shared into the container as both /opt/google/cros-containers and /opt/google/garcon.
    4. The container will be able to get the IP address of the host from the file /dev/.host_ip (inside the container).
    5. The Wayland socket of the VM is shared to the container. This means that GUI applications that run in the container, can appear in the X server running in the VM of Chrome OS.
    6. The /dev/wl0 device file of the host is shared into the container as /dev/wl0. With permissions 0666. That’s the wireless interface.
# Storage pools
storage_pools:
- name: default
 driver: btrfs
 config:
   source: /mnt/stateful/lxd/storage-pools/default

# Network
# IPv4 address is configured by the host.
networks:
- name: lxdbr0
  type: bridge
  config:
    ipv4.address: none
    ipv6.address: none

# Profiles
profiles:
- name: default
  config:
    boot.autostart: false
  devices:
    root:
      path: /
      pool: default
      type: disk
    eth0:
      nictype: bridged
      parent: lxdbr0
      type: nic
    cros_containers:
      path: /opt/google/cros-containers
      source: /opt/google/cros-containers
      type: disk
    garcon:
      path: /opt/google/garcon
      source: /opt/google/cros-containers
      type: disk
    host-ip:
      path: /dev/.host_ip
      source: /run/host_ip
      type: disk
    wayland-sock:
      path: /dev/.wayland-0
      source: /run/wayland-0
      type: disk
    wl0:
      source: /dev/wl0
      type: unix-char
      mode: 0666

Here it creates the btrfs storage pool (termina-lxd-scripts/files/stateful_setup.sh),

 mkfs.btrfs /dev/vdb || true # The disk may already be formatted.
 mount -o user_subvol_rm_allowed /dev/vdb /mnt/stateful

With the completed LXD configuration, let’s see how the container gets created. It is this file, termina-lxd-scripts/files/run_container.sh Specifically,

  1. It configures an LXD remote URL, https://storage.googleapis.com/cros-containers, that has the container image. It is accessible through the simplestreams protocol.
  2. It launches the container image with
    lxc launch google:debian/stretch

How to try google:debian/stretch on our own LXD installation

Let’s delve deeper in the container image that is used in Chrome OS. For this, we are adding the LXD remote URL and then launch the container.

First, let’s add the LXD remote.

$ lxc remote add google https://storage.googleapis.com/cros-containers --protocol=simplestreams

Let’s verify that it has been added.

$ lxc remote list
+--------+------------------------------------------------+---------------+-----------+--------+--------+
| NAME   | URL                                            | PROTOCOL      | AUTH TYPE | PUBLIC | STATIC |
+---------------------------------------------------------+---------------+-----------+--------+--------+
| google | https://storage.googleapis.com/cros-containers | simplestreams |           | YES    | NO     |
+---------------------------------------------------------+---------------+-----------+--------+--------+
| images | https://images.linuxcontainers.org             | simplestreams |           | YES    | NO     |
+---------------------------------------------------------+---------------+-----------+--------+--------+
| local (default) | unix://                               | lxd           | tls       | NO     | YES    |
+---------------------------------------------------------+---------------+-----------+--------+--------+
| ubuntu | https://cloud-images.ubuntu.com/releases       | simplestreams |           | YES    | YES    |
+---------------------------------------------------------+---------------+-----------+--------+--------+
| ubuntu-daily | https://cloud-images.ubuntu.com/daily    | simplestreams |           | YES    | YES    |
+---------------------------------------------------------+---------------+-----------+--------+--------+

What’s in the google: container image repository?

$ lxc image list google:
+-------------------------+--------------+--------+-------------------------------------------------------+--------+----------+------------------------------+
| ALIAS                   | FINGERPRINT  | PUBLIC | DESCRIPTION                                           | ARCH   | SIZE     | UPLOAD DATE                  |
+-------------------------+--------------+--------+-------------------------------------------------------+--------+----------+------------------------------+
| debian/stretch (3 more) | 706f2390a7f6 | yes    | Debian for Chromium OS stretch amd64 (20180504_22:19) | x86_64 | 194.82MB | May 4, 2018 at 12:00am (UTC) |
+-------------------------+--------------+--------+-------------------------------------------------------+--------+----------+------------------------------+

It is a single image for x86_64, based on Debian Stretch (20180504_22:19).

Let’s see again those details for the specific container image from Google.

$ lxc image show google:debian/stretch
auto_update: false
properties:
 architecture: amd64
 description: Debian for Chromium OS stretch amd64 (20180504_22:19)
 os: Debian for Chromium OS
 release: stretch
 serial: "20180504_22:19"
public: true

Compare those details with the stock debian/stretch container image,

$ lxc image show images:debian/stretch
auto_update: false
properties:
 architecture: amd64
 description: Debian stretch amd64 (20180511_05:25)
 os: Debian
 release: stretch
 serial: "20180511_05:25"
public: true

Can we then get detailed info of the Google container image?

$ lxc image info google:debian/stretch
Fingerprint: 706f2390a7f67655df8d0d5d46038ed993ad28cb161648781fbd60af4b52dd76
Size: 194.82MB
Architecture: x86_64
Public: yes
Timestamps:
 Created: 2018/05/04 00:00 UTC
 Uploaded: 2018/05/04 00:00 UTC
 Expires: never
 Last used: never
Properties:
 serial: 20180504_22:19
 description: Debian for Chromium OS stretch amd64 (20180504_22:19)
 os: Debian for Chromium OS
 release: stretch
 architecture: amd64
Aliases:
 - debian/stretch/default
 - debian/stretch/default/amd64
 - debian/stretch
 - debian/stretch/amd64
Cached: no
Auto update: disabled

Compare those details with the stock debian/stretch container image.

$ lxc image info images:debian/stretch
Fingerprint: 07341ea710a44508c12e5b3b437bd13fa334e56b3c4e2808c32fd7e6b12df8d1
Size: 110.22MB
Architecture: x86_64
Public: yes
Timestamps:
 Created: 2018/05/11 00:00 UTC
 Uploaded: 2018/05/11 00:00 UTC
 Expires: never
 Last used: never
Properties:
 os: Debian
 release: stretch
 architecture: amd64
 serial: 20180511_05:25
 description: Debian stretch amd64 (20180511_05:25)
Aliases:
 - debian/stretch/default
 - debian/stretch/default/amd64
 - debian/9/default
 - debian/9/default/amd64
 - debian/stretch
 - debian/stretch/amd64
 - debian/9
 - debian/9/amd64
Cached: no
Auto update: disabled

Up to now we learned that the Google debian/stretch container image has 95MB of extra files (compressed).

It’s time to launch a container with google:debian/stretch!

$ lxc launch google:debian/stretch chrome-os-linux
Creating chrome-os-linux
Starting chrome-os-linux 
$

Now, get a shell into this container.

$ lxc exec chrome-os-linux bash
root@chrome-os-linux:~#

There is no non-root account,

root@chrome-os-linux:~# ls /home/
root@chrome-os-linux:~#

Differences with stock debian/stretch image

These are the Chrome OS-specific packages that the container image has. These are not architecture-specific files (architecture: all).

ii cros-adapta 0.1 all Chromium OS GTK Theme This package provides symlinks
ii cros-apt-config 0.12 all APT config for Chromium OS integration. This package
ii cros-garcon 0.10 all Chromium OS Garcon Bridge. This package provides the
ii cros-guest-tools 0.12 all Metapackage for Chromium OS integration. This package has
ii cros-sommelier 0.11 all sommelier base package. This package installs unitfiles
ii cros-sommelier-config 0.11 all sommelier config for Chromium OS integration. This
ii cros-sudo-config 0.10 all sudo config for Chromium OS integration. This package
ii cros-systemd-overrides 0.10 all systemd overrides for running under Chromium OS. This
ii cros-ui-config 0.11 all UI integration for Chromium OS This package installs
ii cros-unattended-upgrades 0.10 all Unattended upgrades config. This package installs an
ii cros-wayland 0.10 all Wayland extras for virtwl in Chromium OS. This package

There are 305 additional packages in total in the Chrome OS container image of Debian stretch, compared to the stock Debian Stretch image.

adwaita-icon-theme
apt-transport-https
apt-utils
at-spi2-core
bash-completion
ca-certificates
cpp
cpp-6
cros-adapta
cros-apt-config
cros-garcon
cros-guest-tools
cros-sommelier
cros-sommelier-config
cros-sudo-config
cros-systemd-overrides
cros-ui-config
cros-unattended-upgrades
cros-wayland
curl
dbus-x11
dconf-cli
dconf-gsettings-backend:amd64
dconf-service
desktop-file-utils
dh-python
distro-info-data
fontconfig
fontconfig-config
fonts-croscore
fonts-dejavu-core
fonts-roboto
fonts-roboto-hinted
glib-networking:amd64
glib-networking-common
glib-networking-services
gnome-icon-theme
gsettings-desktop-schemas
gtk-update-icon-cache
hicolor-icon-theme
i965-va-driver:amd64
less
libapt-inst2.0:amd64
libasound2:amd64
libasound2-data
libasound2-plugins:amd64
libasyncns0:amd64
libatk-bridge2.0-0:amd64
libatk1.0-0:amd64
libatk1.0-data
libatspi2.0-0:amd64
libauthen-sasl-perl
libavahi-client3:amd64
libavahi-common-data:amd64
libavahi-common3:amd64
libavcodec57:amd64
libavresample3:amd64
libavutil55:amd64
libcairo-gobject2:amd64
libcairo2:amd64
libcolord2:amd64
libcroco3:amd64
libcrystalhd3:amd64
libcups2:amd64
libcurl3:amd64
libcurl3-gnutls:amd64
libdatrie1:amd64
libdconf1:amd64
libdrm-amdgpu1:amd64
libdrm-intel1:amd64
libdrm-nouveau2:amd64
libdrm-radeon1:amd64
libdrm2:amd64
libegl1-mesa:amd64
libencode-locale-perl
libepoxy0:amd64
libffi6:amd64
libfile-basedir-perl
libfile-desktopentry-perl
libfile-listing-perl
libfile-mimeinfo-perl
libflac8:amd64
libfont-afm-perl
libfontconfig1:amd64
libfontenc1:amd64
libfreetype6:amd64
libgail-common:amd64
libgail18:amd64
libgbm1:amd64
libgdbm3:amd64
libgdk-pixbuf2.0-0:amd64
libgdk-pixbuf2.0-common
libgl1-mesa-dri:amd64
libgl1-mesa-glx:amd64
libglapi-mesa:amd64
libglib2.0-0:amd64
libglib2.0-data
libgmp10:amd64
libgnutls30:amd64
libgomp1:amd64
libgraphite2-3:amd64
libgsm1:amd64
libgtk-3-0:amd64
libgtk-3-bin
libgtk-3-common
libgtk2.0-0:amd64
libgtk2.0-bin
libgtk2.0-common
libharfbuzz0b:amd64
libhogweed4:amd64
libhtml-form-perl
libhtml-format-perl
libhtml-parser-perl
libhtml-tagset-perl
libhtml-tree-perl
libhttp-cookies-perl
libhttp-daemon-perl
libhttp-date-perl
libhttp-message-perl
libhttp-negotiate-perl
libice6:amd64
libicu57:amd64
libidn2-0:amd64
libio-html-perl
libio-socket-ssl-perl
libipc-system-simple-perl
libisl15:amd64
libjack-jackd2-0:amd64
libjbig0:amd64
libjpeg62-turbo:amd64
libjson-glib-1.0-0:amd64
libjson-glib-1.0-common
liblcms2-2:amd64
libldap-2.4-2:amd64
libldap-common
libllvm3.9:amd64
libltdl7:amd64
liblwp-mediatypes-perl
liblwp-protocol-https-perl
libmailtools-perl
libmp3lame0:amd64
libmpc3:amd64
libmpdec2:amd64
libmpfr4:amd64
libnet-dbus-perl
libnet-http-perl
libnet-smtp-ssl-perl
libnet-ssleay-perl
libnettle6:amd64
libnghttp2-14:amd64
libnuma1:amd64
libogg0:amd64
libopenjp2-7:amd64
libopus0:amd64
liborc-0.4-0:amd64
libp11-kit0:amd64
libpango-1.0-0:amd64
libpangocairo-1.0-0:amd64
libpangoft2-1.0-0:amd64
libpciaccess0:amd64
libperl5.24:amd64
libpixman-1-0:amd64
libpng16-16:amd64
libpolkit-agent-1-0:amd64
libpolkit-backend-1-0:amd64
libpolkit-gobject-1-0:amd64
libproxy1v5:amd64
libpsl5:amd64
libpulse0:amd64
libpulsedsp:amd64
libpython3-stdlib:amd64
libpython3.5-minimal:amd64
libpython3.5-stdlib:amd64
libreadline7:amd64
librest-0.7-0:amd64
librsvg2-2:amd64
librsvg2-common:amd64
librtmp1:amd64
libsamplerate0:amd64
libsasl2-2:amd64
libsasl2-modules:amd64
libsasl2-modules-db:amd64
libsensors4:amd64
libshine3:amd64
libsm6:amd64
libsnappy1v5:amd64
libsndfile1:amd64
libsoup-gnome2.4-1:amd64
libsoup2.4-1:amd64
libsoxr0:amd64
libspeex1:amd64
libspeexdsp1:amd64
libsqlite3-0:amd64
libssh2-1:amd64
libssl1.1:amd64
libswresample2:amd64
libtasn1-6:amd64
libtdb1:amd64
libtext-iconv-perl
libthai-data
libthai0:amd64
libtheora0:amd64
libtie-ixhash-perl
libtiff5:amd64
libtimedate-perl
libtwolame0:amd64
libtxc-dxtn-s2tc:amd64
libunistring0:amd64
liburi-perl
libva-drm1:amd64
libva-x11-1:amd64
libva1:amd64
libvdpau-va-gl1:amd64
libvdpau1:amd64
libvorbis0a:amd64
libvorbisenc2:amd64
libvpx4:amd64
libwavpack1:amd64
libwayland-client0:amd64
libwayland-cursor0:amd64
libwayland-egl1-mesa:amd64
libwayland-server0:amd64
libwebp6:amd64
libwebpmux2:amd64
libwebrtc-audio-processing1:amd64
libwrap0:amd64
libwww-perl
libwww-robotrules-perl
libx11-protocol-perl
libx11-xcb1:amd64
libx264-148:amd64
libx265-95:amd64
libxaw7:amd64
libxcb-dri2-0:amd64
libxcb-dri3-0:amd64
libxcb-glx0:amd64
libxcb-present0:amd64
libxcb-render0:amd64
libxcb-shape0:amd64
libxcb-shm0:amd64
libxcb-sync1:amd64
libxcb-xfixes0:amd64
libxcomposite1:amd64
libxcursor1:amd64
libxdamage1:amd64
libxfixes3:amd64
libxft2:amd64
libxi6:amd64
libxinerama1:amd64
libxkbcommon0:amd64
libxml-parser-perl
libxml-twig-perl
libxml-xpathengine-perl
libxml2:amd64
libxmu6:amd64
libxpm4:amd64
libxrandr2:amd64
libxrender1:amd64
libxshmfence1:amd64
libxt6:amd64
libxtst6:amd64
libxv1:amd64
libxvidcore4:amd64
libxxf86dga1:amd64
libxxf86vm1:amd64
libzvbi-common
libzvbi0:amd64
lsb-release
mesa-va-drivers:amd64
mesa-vdpau-drivers:amd64
mime-support
openssl
perl
perl-modules-5.24
perl-openssl-defaults:amd64
policykit-1
publicsuffix
pulseaudio
pulseaudio-utils
python-apt-common
python3
python3-apt
python3-minimal
python3.5
python3.5-minimal
readline-common
rename
rtkit
sgml-base
shared-mime-info
sudo
tcpd
ucf
unattended-upgrades
unzip
va-driver-all:amd64
vdpau-driver-all:amd64
x11-common
x11-utils
x11-xserver-utils
xdg-user-dirs
xdg-utils
xkb-data
xml-core
xz-utils

The binary files are meant to be found at /opt/google/cros-containers/. For example,

root@chrome-os-linux:~# cat /usr/bin/gnome-www-browser 
#!/bin/bash
/opt/google/cros-containers/bin/garcon --client --url "$@"
root@chrome-os-linux:~#

Obviously, these files are not found in the container that I just launched. These files are provided by Chrome OS of a the Chromebook.

I did not find binaries in the container to launch a Linux terminal application. I assume would be found at /opt/google/cros-containers/bin/ as well.

The Chrome OS deb package repository

Here is the repository,

root@chrome-os-linux:~# cat /etc/apt/sources.list.d/cros.list 
deb https://storage.googleapis.com/cros-packages stretch main
root@chrome-os-linux:~#

And here are the details of the packages,

$ curl https://storage.googleapis.com/cros-packages/dists/stretch/main/binary-amd64/Packages 
Package: cros-adapta
Version: 0.1
Architecture: all
Recommends: libgtk2.0-0, libgtk-3-0
Maintainer: The Chromium OS Authors <chromium-os-dev@chromium.org>
Priority: optional
Section: misc
Filename: pool/main/c/cros-adapta/cros-adapta_0.1_all.deb
Size: 792
SHA256: 885783a862f75fb95e0d389c400b9463c9580a84e9ec54c1ed2c8dbafa1ccbc5
SHA1: 23cbf5f11724d971592da9db9a17b2ae1c28dfad
MD5sum: 27fdba7a27c84caa4014a69546a83a6b
Description: Chromium OS GTK Theme This package provides symlinks
 which link the bind-mounted theme into the correct location in the
 container.
Homepage: https://chromium.googlesource.com/chromiumos/third_party/cros-adapta/
Built-Using: Bazel

Package: cros-apt-config
Version: 0.12
Architecture: all
Depends: apt-transport-https
Maintainer: The Chromium OS Authors <chromium-os-dev@chromium.org>
Priority: optional
Section: misc
Filename: pool/main/c/cros-apt-config/cros-apt-config_0.12_all.deb
Size: 7358
SHA256: d6d21bdf348e6510a9c933f8aacde7ac4054b6e2f56d5e13e9772800fab13e9e
SHA1: 51b23541fc8029725966bf45f0a98075cbb01dfa
MD5sum: b3de74124b2947e0ad819416ce7eed78
Description: APT config for Chromium OS integration. This package
 installs the keyring for the Chromium OS integration apt repo, the
 source list, and APT preferences.
Homepage: https://chromium.org
Built-Using: Bazel

Package: cros-garcon
Version: 0.10
Architecture: all
Depends: desktop-file-utils, xdg-utils
Maintainer: The Chromium OS Authors <chromium-os-dev@chromium.org>
Priority: optional
Section: misc
Filename: pool/main/c/cros-garcon/cros-garcon_0.10_all.deb
Size: 1330
SHA256: 32430b920770a8f6d5e0f271de340e87afb32bd9c2a4ecc4e470318e37033672
SHA1: 46f24826d9a0eaab8ec1617d173c48f15fedd937
MD5sum: 4ab2fa3b50ec42bddf6aeeb93c1ef202
Description: Chromium OS Garcon Bridge. This package provides the
 systemd unit files for Garcon, the bridge to Chromium OS.
Homepage: https://chromium.org
Built-Using: Bazel

Package: cros-guest-tools
Version: 0.12
Architecture: all
Depends: cros-garcon, cros-sommelier
Recommends: bash-completion, cros-apt-config, cros-sommelier-config,
 cros-sudo-config, cros-systemd-overrides, cros-ui-config,
 cros-unattended-upgrades, cros-wayland, curl, dbus-x11, pulseaudio,
 unzip, vim
Maintainer: The Chromium OS Authors <chromium-os-dev@chromium.org>
Priority: optional
Section: misc
Filename: pool/main/c/cros-guest-tools/cros-guest-tools_0.12_all.deb
Size: 10882
SHA256: 5f0a2521351b22fe3b537431dec59740c6cc96771372432fe3c7a88a5939884d
SHA1: d37aab929c0c7011dd6b730bdc2052d7e232d577
MD5sum: 5d9fafa14a4f88108f716438c45cf390
Description: Metapackage for Chromium OS integration. This package has
 dependencies on all other packages necessary for Chromium OS
 integration.
Homepage: https://chromium.org
Built-Using: Bazel

Package: cros-sommelier
Version: 0.11
Architecture: all
Depends: libpam-systemd
Recommends: x11-utils, x11-xserver-utils, xkb-data
Maintainer: The Chromium OS Authors <chromium-os-dev@chromium.org>
Priority: optional
Section: misc
Filename: pool/main/c/cros-sommelier/cros-sommelier_0.11_all.deb
Size: 1552
SHA256: 522fe94157708d1a62c42a404bcffe537205fd7ea7b0d4a1ed98de562916c146
SHA1: ec51d2d8641d9234ccffc0d61a03f8f467205c73
MD5sum: 8ed001a623ae74302d7046e4187a71c7
Description: sommelier base package. This package installs unitfiles
 and support scripts for sommelier.
Homepage: https://chromium.org
Built-Using: Bazel

Package: cros-sommelier-config
Version: 0.11
Architecture: all
Depends: libpam-systemd, cros-sommelier
Maintainer: The Chromium OS Authors <chromium-os-dev@chromium.org>
Priority: optional
Section: misc
Filename: pool/main/c/cros-sommelier-config/cros-sommelier-config_0.11_all.deb
Size: 1246
SHA256: edbba3817fd3cdb41ea2f008ea4279f2e276580d5b1498c942965c3b00b4bff1
SHA1: 762ca85f3f9cea87566f42912fd6077c0071e740
MD5sum: 767a8a8c9b336ed682b95d9dd49fbde5
Description: sommelier config for Chromium OS integration. This
 package installs default configuration for sommelier. that is ideal
 for integration with Chromium OS.
Homepage: https://chromium.org
Built-Using: Bazel

Package: cros-sudo-config
Version: 0.10
Architecture: all
Depends: sudo
Maintainer: The Chromium OS Authors <chromium-os-dev@chromium.org>
Priority: optional
Section: misc
Filename: pool/main/c/cros-sudo-config/cros-sudo-config_0.10_all.deb
Size: 810
SHA256: d9c1e2b677dadd1dd20da8499538d9ee2e4c2bc44b16de8aaed0f1e747f371a3
SHA1: 07b961e847112da07c6a24b9f154be6fed13cca1
MD5sum: 37f54f1e727330ab092532a5fc5300fe
Description: sudo config for Chromium OS integration. This package
 installs default configuration for sudo to allow passwordless sudo
 access for the sudo group.
Homepage: https://chromium.org
Built-Using: Bazel

Package: cros-systemd-overrides
Version: 0.10
Architecture: all
Depends: systemd
Maintainer: The Chromium OS Authors <chromium-os-dev@chromium.org>
Priority: optional
Section: misc
Filename: pool/main/c/cros-systemd-overrides/cros-systemd-overrides_0.10_all.deb
Size: 10776
SHA256: 7b960a84d94be0fbe5b4969c7f8e887ccf3c2adf2b2dc10b5cb4856d30eeaab5
SHA1: 06dc91e9739fd3d70fa54051a1166c2dfcc591e2
MD5sum: 16033ff279b2f282c265d5acea3baac6
Description: systemd overrides for running under Chromium OS. This
 package overrides the default behavior of some core systemd units.
Homepage: https://chromium.org
Built-Using: Bazel

Package: cros-ui-config
Version: 0.11
Architecture: all
Depends: cros-adapta, dconf-cli, fonts-croscore, fonts-roboto
Maintainer: The Chromium OS Authors <chromium-os-dev@chromium.org>
Priority: optional
Section: misc
Filename: pool/main/c/cros-ui-config/cros-ui-config_0.11_all.deb
Size: 1280
SHA256: bc1c5513ab67c003a6c069d386a629935cd345b464d13b1dd7847822f98825f3
SHA1: 4193bd92f9f05085d480de09f2c15fe93542f272
MD5sum: 7e95b56058030484b6393d05767dea04
Description: UI integration for Chromium OS This package installs
 default configuration for GTK+ that is ideal for integration with
 Chromium OS.
Homepage: https://chromium.org
Built-Using: Bazel

Package: cros-unattended-upgrades
Version: 0.10
Architecture: all
Depends: unattended-upgrades
Maintainer: The Chromium OS Authors <chromium-os-dev@chromium.org>
Priority: optional
Section: misc
Filename: pool/main/c/cros-unattended-upgrades/cros-unattended-upgrades_0.10_all.deb
Size: 1008
SHA256: 33057294098edb169e03099b415726a99fb1ffbdf04915a3acd69f72cf4c84e8
SHA1: ec575f7222c5008487c76e95d073cc81107cad0b
MD5sum: ae30c3a11da61346a710e4432383bbe0
Description: Unattended upgrades config. This package installs an
 unattended upgrades config for Chromium OS guest containers.
Homepage: https://chromium.org
Built-Using: Bazel

Package: cros-wayland
Version: 0.10
Architecture: all
Maintainer: The Chromium OS Authors <chromium-os-dev@chromium.org>
Priority: optional
Section: x11
Filename: pool/main/c/cros-wayland/cros-wayland_0.10_all.deb
Size: 886
SHA256: 06d26a150e69bda950b0df166328a2dae60ac0a0840f432b26dc127b842dd1ef
SHA1: 48bd118c497b0a4090b126d7c3d8ec3aacced504
MD5sum: a495d16e5212535571adfd7820b733c2
Description: Wayland extras for virtwl in Chromium OS. This package
 provides config files and udev rules to improve the Wayland experience
 under CrOS.
Homepage: https://chromium.org
Built-Using: Bazel

Conclusion

It is quite neat that Chrome OS uses machine containers with LXD to maintain a Linux installation.

Apart from the apparent benefits of the Chromebook users, it makes sense to have a look at the implementation in order to figure out how to create a sort of lightweight Virtualbox clone (ability to run a desktop environment of any Linux distribution) that uses containers and LXD.

Permanent link to this article: https://blog.simos.info/a-closer-look-at-chrome-os-using-lxd-to-run-linux-gui-apps-project-crostini/

7 pings

Skip to comment form

  1. […] Αν θέλετε να μάθετε τα ενδότερα του θέματος, σας συστήνω να διαβάσετε την ανάλυση που έκανε ο Σίμος Ξενιτέλλης στο άρθρο «A closer look at Chrome OS using LXD to run Linux GUI apps (Project Crostini)«. […]

  2. […] Canonical, Graber described how to use LXD on ChromeOS, and others have gone into considerably more detail about how it works, as well as how to run other distros than the default […]

  3. […] Canonical, Graber described how to use LXD on ChromeOS, and others have gone into considerably more detail about how it works, as well as how to run other distros than the default […]

  4. […] Canonical, Graber described how to use LXD on ChromeOS, and others have gone into considerably more detail about how it works, as well as how to run other distros than the default […]

  5. […] Canonical, Graber described how to use LXD on ChromeOS, and others have gone into considerably more detail about how it works, as well as how to run other distros than the default […]

  6. […] Graber described methods to use LXD on ChromeOS, and others have gone into significantly extra detail about the way it works, in addition to methods to run other distros than the default […]

  7. […] Canonical, Graber described how to use LXD on ChromeOS, and others have gone into considerably more detail about how it works, as well as how to run other distros than the default […]

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.