These instructions will create a bootable environment on sdcard or USB stick where you can switch between booting Linux and the stock ChromeOS. No changes are made to the internal eMMC drive, and your new Linux install will run completely from external storage. This is the recommended setup for those that just want to take a test drive, or don't want to give up ChromeOS.
By default this version will install either the upstream Debian sid
or Gentoo rootfs tarballs on all supported architectures, with the
additional option of minimal Debian stretch/buster or Ubuntu bionic
console installs on arm only (from which you can easily install your
favorite desktop, eg, lubuntu-desktop
).
You must be running the latest ChromeOS prior to installation.
The following Chromebooks have been tested with this tool.
- Samsung Chromebook XE303C12 (snow - arm/lpae)
- ASUS Chromebook Flip C100PA (veyron-minnie - arm/lpae)
- CTL J2 Chromebook for Education (veyron-jerry - arm/lpae)
- Acer CB5-311 Chromebook 13, 2GB (nyan-big - arm/lpae)
- Acer C810-T78Y Chromebook 13, 4GB (nyan-big - arm/lpae)
- Samsung Chromebook Plus (kevin - arm64)
- Turn off the laptop.
- To invoke Recovery mode, you hold down the ESC and Refresh keys and poke the Power button.
- At the Recovery screen press Ctrl-D (there's no prompt - you have to know to do it).
- Confirm switching to developer mode by pressing enter, and the laptop will reboot and reset the system. This takes about 10-15 minutes.
Note: After enabling developer mode, you will need to press Ctrl-U to boot from external USB/SDcard --or-- Ctrl-D to boot the normal ChromeOS each time you boot, or wait 30 seconds to continue booting ChromeOS.
- After booting into developer mode, at the login screen hold Ctrl and Alt and poke the F2 (right arrow) key. This will open up the developer console.
- Type
chronos
at the login screen and sudo to root (hint: read the prompt and set a user password after sudo-ing). - Then type this to enable USB booting:
# enable_dev_usb_boot
- Reboot the system to allow the change to take effect. Now you can use Ctrl-U to boot from external media, or Ctrl-D to boot from emmc.
$ ./chromebook-setup.sh help
For example, to create a bootable SD card for the Samsung Chromebook Plus (arm64) with Debian sid:
$ ./chromebook-setup.sh do_everything --architecture=arm64 --storage=/dev/sdX
allowed by the firmware:
$ ENABLE_HYP=1 ./chromebook-setup.sh do_everything --architecture=arm --storage=/dev/sdX
$ DO_BIONIC=1 ./chromebook-setup.sh do_everything --architecture=arm --storage=/dev/mmcblkX
Note: The above minimal debian/ubuntu roots are console only, but you are
free to install the desktop of your choice (see the comments in the
two main script files for more info). You may select from stretch,
buster, or bionic. After connecting, do sudo apt-get update/upgrade
and then try sudo apt-get install xubuntu-desktop
on bionic.
$ DO_GENTOO=1 USE_LIBC=musl ./chromebook-setup.sh do_everything --architecture=arm --storage=/dev/sdX
If your device has wired ethernet (including USB) and you're using one
of the cloud image variants then you can enable the alternate cloud image
config with HAVE_ETHERNET=1
on the cmdline:
$ DO_BIONIC=1 HAVE_ETHERNET=1 ./chromebook-setup.sh do_everything --architecture=arm64 --storage=/dev/sdX
The minimal Debian/Ubuntu rootfs user logins are displayed on the console
prompt: [debian|ubuntu]:temppwd
. The Gentoo stage3/4 tarballs have no
user yet, so the root passwd has been blanked. The Ubuntu Cloud images
(currently arm64 only) also use the above `[ubuntu]:temppwd`` login.
The default Debian rootfs never booted properly for me, so I don't know
what the login details are (you'll need to mount your boot device and
inspect/edit the shadow file yourself).
Both armv7 and arm64 devices require the proper device tree blobs in the
signed kernel.fit image that goes into the chromeos kernel partition. This
is normally the .dtb file for the target device, however the default arm
kernel image contains the .dtb blobs for all supported chromebook devices.
This works fine on everything except the original samsung chromebook (snow)
so we also build a separate signed kernel image for the snow chromebook
with only the single blob. If you have a snow chromebook you'll need to
manually dd
the image to the first partition on the sdcard or usb
stick (see below).
The kernel image artifacts are in the top level of the kernel source tree:
- kernel.vboot - default (signed) kernel image
- vmlinux.kpart - signed kernel image for snow
For chromebook snow, wait for the script to complete and then manually
re-insert the boot device and verify the device name again (eg, /dev/sdb
),
then run the following command:
$ sudo dd if=linux-stable/vmlinux.kpart of=/dev/sdX1 bs=4M
Replace sdX
with your device and adjust the directory name as needed.
If you choose a Gentoo stage, it will pull the latest (as of this writing)
hardened glibc or musl stage3/4 (depending on what is available). The
stage3 tarballs do have rfkill
but do not have any firmware or
wpa_supplicant. The quick-and-dirty firmware answer is just copy /lib/firmware
from your host to the target rootfs (the second partition). This will make
USB devices work on tegra, however, you will need to build wpa_supplicant
by hand if you need wifi to continue with the install (which is a total PITA).
Much easier to spend a few bucks on a USB ethernet adapter...
See the default stage settings in the chromebook-config.sh
script.
You may need to pre-build firmware/wifi support in a chroot first and
create your own stage4 tarball; just update the config script with the
name of your stage4 file and drop it in this directory before running
the setup script.
Build your chromebook boot device with DO_TOUCH=1 then re-insert and mount your boot media; this may or may not boot correctly, so the "safe" approach is to make two boot devices (one sdcard and one USB stick) using the Touch tarball for one, and one of the other targets (Ubuntu or Debian) for the second device. Use the second device to boot your chromebook and then chroot into your Ubuntu Touch rootfs.
Since the Touch rootfs is not quite ready to boot fully, follow the post-install steps to complete the config in your chroot; note you may need to copy /etc/resolv.conf to your chroot first. You will also need to clone the ubports rootfs-builder repo from gitlab and move the repo to root's $HOME dir on the Touch rootfs:
$ git clone https://gitlab.com/ubports/core/rootfs-builder-debos.git
Enter the chroot, then:
- Fix the TERM environment var:
# export TERM=xterm-256color
- Restore the
_apt
user:
# adduser _apt --force-badname --system --no-create-home --disabled-password --disabled-login
- Set default user password:
# echo phablet:phablet | chpasswd
- Change to the rootfs-builder source tree:
# cd ~/rootfs-builder-debos
Copy the contents under mods-overlay/ to the right places in the rootfs:
$ tree -A rootfs-builder-debos/mods-overlay/
rootfs-builder-debos/mods-overlay/
├── etc
│ └── init
│ ├── repowerd.override
│ ├── ssh-keygen.conf
│ └── ttyS0.conf
└── usr
└── bin
└── ssh-keygen.sh
- Run the (generic armhf) setup scripts from the rootfs-builder tree:
# scripts/add-mainline-repos.sh
# scripts/enable-mesa.sh
- Refresh the kernel module dependencies; use the directory name from
your install under
/lib/modules
:
# depmod -a 5.3.0-00001-gc094c373f029
- Install the linux-firmware package:
# dpkg -i files/linux-firmware_1.182_all.deb
- Exit the chroot, power off and remove your (chroot) boot device, then power it back up and wait for the Ubuntu Touch setup wizard. Enjoy!
If you choose one of the minimal rootfs options, the default state of both
wifi and bluetooth is "soft blocked". The default networking tool is also
connman (as opposed to NetworkManager or the basic net scripts) so setting
a manual static config in /etc/network/interfaces
will not work. The
default connman settings are in /var/lib/connman/settings
but only
wired ethernet is enabled out of the box.
If you have a USB ethernet adapter, try it and use it to update the packages
and install rfkill
. If you don't have a USB ethernet adapter, then you
will need to manually enable wifi as shown below.
Steps:
- download the rfkill deb pkg for your architecture and release
- copy the deb pkg to your sdcard or USB stick
- boot the chromebook and install the rfkill deb pkg
- manually run rfkill and then connmanctl to configure wifi
If your chromebook is veyron-minnie/jerry then you will also need to download some new firmware files before configuring wifi (otherwise skip this part). The Arch Linux packaging host has the files available for their veyron-firmware package:
https://archlinuxarm.org/builder/src/veyron/
Download the two files for 4354-sdio:
../
99-veyron-brcm.rules 01-Jul-2015 04:31 330
BCM4354_003.001.012.0306.0659.hcd 01-Jul-2015 04:31 72132
brcmfmac4354-sdio.bin 30-Oct-2016 23:15 507752
brcmfmac4354-sdio.txt 30-Oct-2016 23:15 2722
sd8787_uapsta_cros.bin 26-Jun-2015 02:37 411888
sd8797_uapsta_cros.bin 26-Jun-2015 02:37 460440
sd8897_uapsta_cros.bin 26-Jun-2015 02:37 741240
and copy brcmfmac4354-sdio.*
to /lib/firmware/brcm/
:
$ wget https://archlinuxarm.org/builder/src/veyron/brcmfmac4354-sdio.bin
$ wget https://archlinuxarm.org/builder/src/veyron/brcmfmac4354-sdio.txt
$ sudo cp -v brcmfmac4354-sdio.* /media/rootfs/lib/firmware/brcm/
(assuming you have mounted your stick/card to /media/rootfs
)
If not veyron, start here.
First:
Go to the debian/ubuntu package page for rfkill; in this example we use debian buster: https://packages.debian.org/buster/rfkill
For ubuntu, start here ubuntu bionic: https://launchpad.net/ubuntu/bionic/armhf/rfkill/2.31.1-0.4ubuntu3
Click on the architecture you installed, ie, either armhf, arm64, or x86_64.
Browse the debian mirrors and pick one (eg, http.us.debian.org) and download the rfkill deb package:
$ wget http://http.us.debian.org/debian/pool/main/u/util-linux/rfkill_2.33.1-0.1_armhf.deb
Copy it to your sdcard/stick, boot up your chromebook, and install it:
$ sudo dpkg -i rfkill_2.33.1-0.1_armhf.deb
To see the state, run:
$ sudo rfkill list
If you see Soft blocked: yes
for the Wireless LAN device, then run:
$ sudo rfkill unblock wifi
$ sudo rfkill unblock all
Then reboot and run sudo rfkill list
again to make sure the soft block
was removed. NOW you can configure the access point and psk.
Second:
To connect to an open AP, see the Arch wiki section, otherwise run the interactive connmanctl shell to configure access. See the Arch Linux wiki for more details.
To setup WPA/PSK we need to run some commands in the actual connmanctl shell; depending on the distro, it may or may not require sudo to run connmanctl (feel free to try it first without sudo). Now run the command with no arguments:
$ connmanctl
First verify tethering status. Tethering must be disabled to be associated with an access point:
connmanctl> tether wifi off
Disabled tethering for wifi
Now scan for access points and display services found:
connmanctl> scan wifi
Scan completed for wifi
connmanctl> services
MyAccessPoint wifi_abc_managed_psk
Now connect to the access point, then quit:
connmanctl> agent on
Agent registered
connmanctl> connect wifi_abc_managed_psk
Agent RequestInput wifi_abc_managed_psk
Passphrase = [ Type=psk, Requirement=mandatory, Alternates=[ WPS ] ]
WPS = [ Type=wpspin, Requirement=alternate ]
Passphrase? passphrase
Connected wifi_abc_managed_psk
connmanctl> quit
(note you can use tab-complete on the long service name)
If the connection fails, try rebooting and/or moving closer to the AP. Once
you have a connection, use the iwconfig
command to check signal level and
link quality.
This is necessary on recent Ubuntu rootfs from debootstrap, mainly Focal
(and possibly others) with an empty /etc/netplan
directory. See the
reference link below for more examples.
Dynamic IP address assignment (DHCP client)
To configure your server to use DHCP for dynamic address assignment,
create a Netplan configuration in the file /etc/netplan/99_config.yaml
.
The following example assumes you are configuring your first Ethernet
interface identified as enp3s0
.
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
dhcp4: true
The configuration can then be applied using the netplan command:
sudo netplan apply
Static IP address assignment
To configure your system to use static address assignment, create a
netplan configuration in the file /etc/netplan/99_config.yaml
. The
example below assumes you are configuring your first Ethernet interface
identified as eth0. Change the addresses, routes, and nameservers values
to meet the requirements of your network.
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 10.10.10.2/24
routes:
- to: default
via: 10.10.10.1
nameservers:
search: [mydomain, otherdomain]
addresses: [10.10.10.1, 1.1.1.1]
The configuration can then be applied using the netplan command.
sudo netplan apply
Note: netplan in Ubuntu Bionic 18.04 LTS doesn’t understand the to: default
syntax to specify a default route, and should use the older gateway4: 10.10.10.1
key instead of the whole routes:
block.
For a bootstrap install of Ubuntu Touch on veyron-minnie, the process to
enable wifi is slightly different than shown above. After the rfkill
step to release the wifi soft block, use the nmcli
tool instead of
connmanctl
. Open a terminal and do:
$ sudo nmcli radio wifi on
Check the new state with:
$ sudo nmcli radio
Then open the Settings app and look for your local wifi AP.
You can build the Chromebook image for a specific suite and architecture like this:
$ debos -t arch:"arm64" debos/images/lxde-desktop/debimage.yaml
The images can be built for different architectures (supported architectures are armhf, arm64 and amd64).
Gentoo Embedded:
https://wiki.gentoo.org/wiki/Embedded_Handbook https://wiki.gentoo.org/wiki/Embedded_systems
Ubuntu Touch:
https://github.com/ubports/unity8 https://gitlab.com/ubports/core/rootfs-builder-debos/tree/master
Wifi Setup:
https://wiki.archlinux.org/index.php/ConnMan https://www.erdahl.io/2016/04/configuring-wifi-on-beagleboardorg.html
Ubuntu Network Configuration: