Running Linux on ARM (ChromeOS)

Exploring running Debian on a locked down ARM-based Chromebook.

ARM

ARM (Advanced RISC Machine) is a family of reduced instruction set computing (RISC) architectures for computer processors, known for their power efficiency and extensive use in mobile devices. In contrast, x86 is a complex instruction set computing (CISC) architecture predominantly used in desktops and servers. Each architecture has its strengths, with ARM's low power consumption making it ideal for devices like Chromebooks.

Preparing Your Chromebook

To start the process, you'll need to reset your Chromebook and enable Developer Mode. This step unlocks the ability to modify the system. Note that these steps can vary widely for different Chromebook models. I use a Lenovo Duet 3 (ARM version) in this example.

Powerwash (Factory Reset) Your Chromebook:

  • Press Ctrl + Alt + Shift + R.
  • Follow the on-screen instructions to reset your device.

Enable Developer Mode:

  • Power off the device completely.
  • Press and hold the following buttons at the same time: Power, Volume Up, Volume Down (if this method doesn't work, you can try pressing Escape + Refresh Button + Power).
  • When the device restarts, enter Developer Mode. This involves pressing Ctrl + D at the startup screen, then Enter.
  • Wait for Developer Mode to enable, which might take a few minutes.

Booting from External Disk:
At this point developer mode is enabled, but booting from external drives is not yet enabled. To enable it:

  • After Developer Mode is enabled, select "Boot from Disk".
  • Connect to WiFi on the startup screen, then click "Get Started".
  • Click "Browse as Guest", then "Accept and Continue".
  • Press Ctrl + Alt + F2 (Refresh key) to bring up the shell.
  • Sign in as root with no password.
  • Enter the shell by typing shell.
  • Check the CCD state with sudo gsctool -a -I (it should be reported as closed).
  • Open the CCD state with sudo gsctool -a -o.
    • You will be prompted to assert physical presence by pressing the power button multiple times over a few minutes.
  • After the final prompt, the device will reboot and exit Developer Mode.
  • Follow the previous steps to re-enable Developer Mode and select "Boot from Disk".
  • Click "Get Started" and "Browse as Guest".
  • Access the shell again by pressing Ctrl + Alt + F2 and signing in as root.
  • Enable USB boot with enable_dev_usb_boot.
  • Check the CCD state again with sudo gsctool -a -I (it should now be opened with all CCD flags set to Y/Always).
  • Reboot the device.

Download and Flash the Image:

  • Download the ARM image from the GitHub repository.
  • Use Balena Etcher to flash the downloaded image to a USB drive.
  • Insert the USB drive into the Chromebook.
  • Select "Boot from External Disk" from the startup options.
  • Sign in to the Linux environment with the default password ChangeMe.

Write Protection:

The steps listed above will enable a Chromebook to run pure Linux (not containerized through ChromeOS) off a USB stick or SD card. When it comes to permanently installing the Linux system, this is much more difficult than on x86 systems as ARM does not have a bootloader, and ChromeOS' write protection must be bypassed.

There are two types of write protection in Chromebooks and Chromeboxes:

  1. Physical Screw: On older Chromebooks/Chromeboxes, there is a screw within the device that bridges two contacts and enables write protection. Removing the screw disables write protection.
  2. Chip: Some devices have a secure microcontroller in them which runs an embedded firware called Cr50. Among other capabilities, this chip allows developers to securely debug the device without physically opening it. Using a SuzyQable, you can disable that and remove the write protection from the internal eMMC.

If you are interested in this and want to replace ChromeOS with a Linux distro that is permanently installed on the eMMC, I recommend reading through this detailed write-up.