PNG chomeos logo


JPG Google Chrome Logo

TABLE OF CONTENTS


The original version of this document can be found here.  The one below reflects the new/changed/easier steps learned from experience and by the improved compatibility of the newer Linux kernels and distro versions (i.e. LMDE3 vs LMDE2).  The older instructions include information on using the 'crouton' method of running Linux within ChromeOS itself, as well as information on the method of providing Linux installation space by re-partitioning the internal SSD of the ChromeOS device -- both of which are no longer recommended.

CHROMEOS/CHROMEBOOKS INTRO

Here are some excellent resources regarding ChromeOS devices and the use of ChromeOS:

LINUX ON A CHROME DEVICE

JPG chrome logoJPG linux logo

There are three ways that Linux can be run on a Chromebook/Chromebox (all of which depend on the ability to enter 'Developer Mode'):
  • In parallel with a running ChromeOS session using crouton.  All (?) Chrome devices should be able to use this method.
  • In a dual-boot configuration with ChromeOS, where either ChromeOS is booted or the installed Linux distro is booted according to one's choice.  The Linux install can either live inside the hard-drive/SSD containing ChromeOS, or on a separate USB storage device.  This method requires legacy SeaBIOS functionality, which some Chrome devices either naturally provide, or can be added with 3rd-party firmware, or not at all.
  • In a solo stand-alone OS replacement of the entire ChromeOS device, where the ChromeOS has been completely removed.  SeaBIOS is required for this as well, and is very similar to the 2nd option.  This will not be discussed on this page.

ENABLING DEVELOPER MODE ON ACER C720 CHROMEBOOK

PNG chromeos boot process
[Chromebox Boot Process by Matt Devo]

By design, all ChromeOS devices are secured and locked to only run verified ChromeOS -- with no choice to run a regular Linux distro at all.

In order to enable a Chromebook/Chromebox to ultimately dual-boot Linux in a separate partition, or run it in parallel with ChromeOS via 'crouton', it is necessary to enable 'Developer Mode' -- which enables the 'superuser' shell inside ChromeOS.  Note that by doing so the device will be completely reset -- erasing the hard drive and all user settings/customization/files completely. To enable 'Developer Mode', enter the following key sequence while powered off:
Escape-Refresh-PowerOn (while powered off)
Ctrl-d (after the recovery message comes up)

This will initiate the process of placing the Chromebook into Developer Mode, which will take about 20 minutes to complete.  From that point on, the device will always be vulnerable to reset back to a normal state (and erasing all  if the space bar is pressed while booting -- so beware!  More information on changing to 'developer mode':

More information on 'Developer Mode' can be found here:MrChromebox Developer Mode Basics.

After activating 'Developer Mode' on a Chromebook, you now have the ability to enter the 'superuser' shell in order to make even further changes to the way it operates (including installing/running Linux).  There are two ways to do this:
  • At the ChromeOS welcome screen, before configuration or logging into your account, press the following key sequences:

Ctrl-Alt-ForwardArrow     [sign on as 'chronos' (no password required)]

or

  • After the ChromeOS welcome screen, after configuration or logging into your account:

Ctrl-Alt-t     [type 'shell' to automatically sign on as 'chronos']

One way to reduce or eliminate the risk of leaving 'developer mode' unintentionally is to make some firmware setting changes.  These need to be made while the C720 'write protect screw' (#7) is removed.  Refer to this photo for the location of this special screw:
JPG acer c720p inside
While in the process of tweaking/testing the Chromebook, as a minimum the 'battery lock screw' (#6) needs to be used to attach the bottom cover.  More diagrams/instructions can be found here:
While the 'write-protect' screw is removed, you are the opportunity to make some other useful changes if you so desire:
  • Reducing the 'boot delay' from 30s to 1s
  • Change the default 'boot target' from 'ChromeOS' to 'Legacy Boot Mode'
  • Replace the (obnoxious) 'Developer Mode' warning screen with a (calmer) white-text-on-black message

The easiest way to accomplish these changes is to download and run the MrChromebox ChromeOS Firmware Utility Script by MrChromebox -- in particular, steps #4 and/or #6.

When the adjustments to the firmware are completed and tested successfully, the 'write protect screw' should be replaced, and all the original screws used to attach the bottom cover can again be used to close the Chromebook.  Removal of the 'write protect screw' should never be required again -- unless further similar firmware changes are required. 

ENABLING USB & LEGACY BOOT MODE ON ACER C720 CHROMEBOOK

In preparation for setting up an Acer C720 for dual-booting a Linux distro of your choice (in my own, Linux Mint Debian Edition), 'SeaBIOS' needs to be activated within the 'superuser' shell.  This ability is not present on all Chromebooks/Chromeboxes -- fortunately, the Acer C720 firmware includes this.  Other Chrome devices can be modified to do so, while yet others cannot (or not yet) do so.  See the list MrChromebox Firmware Supported Devices for more information on models that do have/can have/do not have 'SeaBIOS' capability.

To actually install a functional SeaBIOS to enable 'RW_Legacy' dual-boot capability, download and run the useful MrChromebox firmware installation script while in the 'superuser' shell: MrChromebox ChromeOS Firmware Utility Script.

For more information on the various ChromeOS device firmware options, see MrChromebox Firmware Update Types.

For more information on the differences between 'Legacy Boot' and 'UEFI Boot', see MrChromebox Legacy Boot and UEFI.

LINUX MINT DEBIAN EDITION ON ACER C720 CHROMEBOOK VIA DUAL-BOOT

Once legacy-supporting SeaBIOS mode is enabled, the option of running Linux -- in this case, the desired Linux distro is 'Linux Mint Debian Edition' (LMDE, specifically 'lmde-3-2018083') -- as a dual-boot option on the Chromebook is now possible. However, disk space needs to be made available on the ChromeOS device for Linux to run. The recommended/easiest/safest method is to install the desired Linux distro to a USB stick/dongle.  An excellent choice for this is a SanDisk Ultra Fit 128GB USB 3.0 flash drive, due to its small size and good speed.  I currently consider this to be the optimum solution, since it allows the same portable drive to be shared among multiple Chromebooks (or other computers), and avoids the risk of accidental erasure if 'Developer Mode' is inadvertently turned off.  Another advantage to this method is that the Linux install is not jeopardized if/when ChromeOS needs to be re-installed for unforeseen reasons.

Then proceed to boot (with Ctrl-l) your desired distro, and install it onto the newly-created Linux partition i.e. probably '/dev/sda7' (previously labelled 'ROOT-C'), which should have been made larger by the scripts above.  NOTE: It is out of the scope of this document to explain what Linux distro to pick, how to put the distro installer onto a bootable USB stick/drive, and how to boot/install it onto a storage partition!).

After installation, there are some good tweaks to do to make everything run smoothly (note that newer versions of Linux Mint Debian Edition might make some/all of these tweaks unnecessary, so verify whether you require them before applying):

Edit the file '/usr/share/X11/xorg.conf.d/20-intel.conf' with the following contents:

Section "Device"
        Identifier  "card0"
        Driver      "intel"       
Option      "Backlight"  "intel_backlight"       
BusID       "PCI:0:2:0"
EndSection

Then re-login for to take effect.

  • KEYBOARD: To re-map some Chromebook keys to more intuitive values, first install some required utilities if they are absent:
apt install xbacklight xvkbd xbindkeys
Next, update the file '$HOME/.xbindkeysrc':
"xbacklight -dec 10"
    m:0x0 + c:72
    F6
"xbacklight -inc 10"
    m:0x0 + c:73
    F7
"amixer set Master toggle"
    m:0x0 + c:74
    F8
"amixer sset Master 10%- unmute"
    m:0x0 + c:75
    F9
"amixer sset Master 10%+ unmute"
    m:0x0 + c:76
    F10

"xvkbd -xsendevent -text '\[Delete]'"
Alt + BackSpace

"xvkbd -xsendevent -text '\[End]'"
Alt + Right

"xvkbd -xsendevent -text '\[Home]'"
Alt + Left

"xvkbd -xsendevent -text '\[Page_Down]'"
Alt + Down

"xvkbd -xsendevent -text '\[Page_Up]'"
Alt + Up

"xvkbd -xsendevent -text "\A\[Left]""
m:0x0 + c:67
F1

#Forward
"xvkbd -xsendevent -text "\A\[Right]""
m:0x0 + c:68
F2

#Refresh
"xvkbd -xsendevent -text "\Cr""
m:0x0 + c:69
F3

Then run in a terminal:
xbindkeys
An alternative method for setting some of these keys would be to use the technique described below in the 'Preferences/Keyboard/Keyboard shortcuts' instructions.
deb http://repo.linrunner.de/debian jessie main

Install the required repo keys for security:

sudo apt-key adv --keyserver pool.sks-keyservers.net --recv-keys CD4E8809

Refresh the apt repositories with:

apt update
Install the TLP apps:
apt install tlp tlp-rdw  
Configure and start:
sudo tlp start
Interrogate as you wish e.g.
sudo tlp-stat
Other good/useful tweaks that I have done:

  • KERNEL: Newer kernels are available in the Debian Stretch 'backport' repository. 

Add the following entries to '/etc/apt/sources.list.d/backports.list':

deb http://ftp.debian.org/debian stretch-backports main
Refresh the apt repositories with:
apt update
Get a list of the available kernels and pick the one you want:
apt search linux-image
The newest kernel should now be available:
apt install -t stretch-backports newer-kernel-that-you-want
As of this writing, the newest version available was linux-image-4.17.0-0.bpo.3-amd64'.
  • ROOT PASSWORD: Change root password, so that the 'root' account in un-locked and accessible when needed:
sudo passwd root
  • SSH: Install the SSH utilities so that you can log in remotely to the Chromebook for fixing when the display and/or keyboard doesn't work locally:
apt install ssh
  • /ETC/FSTAB: Adjust '/etc/fstab' entries to minimize 'writes' on the USB stick (to increase its lifespan):
- Add 'noatime' to parms if flash drive/SSD
- Use 'tmpfs' for stuff, but adjust if too small:
# move stuff to tmpfs
tmpfs /tmp tmpfs defaults,noatime,nosuid,size=100m 0 0
tmpfs /var/tmp tmpfs defaults,noatime,nosuid 0 0
tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=200m 0 0
Force to take effect with:
sudo mount -a
Alternatively, just reboot.
  • FIREFOX BROWSER: Adjust Firefox temp space to minimize logging:
Type 'about:config' in the url bar and press Enter. Click the button to accept the risk.

In the search bar, type: sessionstore

Double-click on the item called 'browser.sessionstore.interval'. The default interval is '15000', which means 15 seconds. Add three zeros to the existing value, so that it becomes: '15000000' and click the OK button.

Now disable the following three other sessionstore items, by simply double-clicking them (so that "true" becomes "false"):
browser.sessionstore.restore_on_demand
and:
browser.sessionstore.resume_from_crash
and:
services.sync.prefs.sync.browser.sessionstore.restore_on_demand
Fix default page and search engine in Firefox:
default: google.ca
search: google
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
echo "deb http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
apt update
apt install google-chrome-stable
  • WIFI DEVICE NAME: Adjust wifi device name so that it is consistently shown as 'wlan0':
sudo vi /etc/systemd/network/10_wlan0.link
Contents:
[Match]
Type=wlan
[Link]
Name=wlan0
Run:
sudo update-initramfs -u
  • CONKY: Install 'conky' and other useful utilities for use in its display:
apt install conky facter jq html2text python-pip python-setuptools python-dev
sudo pip install pyephem
sudo dpkg-reconfigure hddtemp
ssh-keygen -t dsa
  • OTHER UTILITIES: Other useful stuff to install:
apt install gparted
apt install geeqie
apt install smplayer
apt install pavucontrol
apt install mc
source /usr/share/mc/bin/mc.sh
  • ALIASES: Add some custom aliases to '$HOME/.bashrc':
# dare stuff
alias notes='cd ~/Documents/darenotes'
alias vtail='tail -f /var/log/messages'
alias g=geeqie

ACER C740 CHROMEBOOK: EXTRA NOTES

Given a chance to try out Linux on the faster Acer C740 Chromebook, I had my share of setbacks and successes that I want to preserve here for others to learn from.  In addition to the steps provided above for the Acer C720, LMDE3 on the Acer C740 seems to require these additional fixes:
  • GRUB MENU: Adjust the grub boot settings so that the boot menu is fully visible by un-commenting the following lines in '/etc/default/grub':
GRUB_TERMINAL=console
GRUB_GFXMODE=640x480
Then put these grub changes into effect by running:
sudo update-grub
You will need to reboot to make all these changes effective.  Other changes mentioned above for the C720 are also optionally suggested.  What you should end up with is a working Linux Mint LMDE bootable device that works just as well as on the older Acer C720 Chromebook.


ACER R11 CHROMEBOOK: EXTRA NOTES

Extra steps required for full functionality of the Acer R11 Chromebook are similar to that of the Acer C740 Chromebook, and so the advise is to follow those instructions above.

  • TOUCHSCREEN A newer kernel than is provided by LMDE3 is required for the touchscreen to be properly recognized. Unfortunately, for whatever reason, the Debian Stretch 'backport' kernels don't appear to support the Acer R11 Chromebook touchscreen, so another source of working kernels is required:
The source for those newer kernel options is here [taken from https://www.tecmint.com/upgrade-kernel-in-ubuntu/]:
http://kernel.ubuntu.com/~kernel-ppa/mainline/
Specially, you can find the latest non-RC kernel directory in this listing (as of this writing, it was v4.15/).  Inside, you would download and then 'dpkg -i' the following pieces:
linux-headers-4.xx.x-xxxxxx_4.xx.x-xxxxxx.yyyymmddhhmm_all.deb
linux-headers-4.xx.x-xxxxxx-generic_4.xx.x-xxxxxx.yyyymmddhhmm_amd64.deb
linux-image-4.xx.x-xxxxxx-generic_4.xx.x-xxxxxx.yyyymmddhhmm_amd64.deb
e.g.

sudo dpkg -i linux-headers-4.15.0-041500_4.15.0-041500.201802011154_all.deb
sudo dpkg -i linux-headers-4.15.0-041500-generic_4.15.0-041500.201802011154_amd64.deb
sudo dpkg -i linux-image-4.15.0-041500-generic_4.15.0-041500.201802011154_amd64.deb
  • SCREEN ROTATION: As well, since it is possible to flip the display panel of the R11 into a 'tablet' mode, there are benefits to being able to rotate both the screen and touch panel at will.  A great script to do this is located here:
https://gist.github.com/mildmojo/48e9025070a2ba40795c
In order to use this Cinnamon's keyboard shortcuts, a variation of that script is as follows (for placement into '/usr/local/bin/rotate.sh'):
#!/bin/bash
#
# rotate_desktop.sh
# https://gist.github.com/mildmojo/48e9025070a2ba40795c
#
# (modified into 'rotate.sh' by Darren Enns 2018/03/19)
#
# Rotates modern Linux desktop screen and input devices to match. Handy for
# convertible notebooks. Call this script from panel launchers, keyboard
# shortcuts, or touch gesture bindings (xSwipe, touchegg, etc.).
#
# Using transformation matrix bits taken from:
#   https://wiki.ubuntu.com/X/InputCoordinateTransformation
#
# Configure these to match your hardware (names taken from `xinput` output).

TOUCHPAD='Elan Touchpad'
TOUCHSCREEN='Elan Touchscreen'

function do_rotate
{
  TRANSFORM='Coordinate Transformation Matrix'

  if [ ! -z "$2" ]; then
    orient=$2  
  else
    orient=$(xrandr -q --verbose | grep 'connected primary' | awk '{print $6}')
  
    case "$orient" in
      right)
        orient="normal"
        ;;
      normal)
        orient="left"
        ;;
      left)
        orient="inverted"
        ;;
      inverted)
        orient="right"
        ;;
    esac
  fi

  case "$orient" in
    normal)
      xrandr --output $1 --rotate "normal"
      [ ! -z "$TOUCHPAD" ]    && xinput set-prop "$TOUCHPAD"    "$TRANSFORM" 1 0 0 0 1 0 0 0 1
      [ ! -z "$TOUCHSCREEN" ] && xinput set-prop "$TOUCHSCREEN" "$TRANSFORM" 1 0 0 0 1 0 0 0 1
      ;;
    inverted)
      xrandr --output $1 --rotate "inverted"
      [ ! -z "$TOUCHPAD" ]    && xinput set-prop "$TOUCHPAD"    "$TRANSFORM" -1 0 1 0 -1 1 0 0 1
      [ ! -z "$TOUCHSCREEN" ] && xinput set-prop "$TOUCHSCREEN" "$TRANSFORM" -1 0 1 0 -1 1 0 0 1
      ;;
    left)
      xrandr --output $1 --rotate "left"
      [ ! -z "$TOUCHPAD" ]    && xinput set-prop "$TOUCHPAD"    "$TRANSFORM" 0 -1 1 1 0 0 0 0 1
      [ ! -z "$TOUCHSCREEN" ] && xinput set-prop "$TOUCHSCREEN" "$TRANSFORM" 0 -1 1 1 0 0 0 0 1
      ;;
    right)
      xrandr --output $1 --rotate "right"
      [ ! -z "$TOUCHPAD" ]    && xinput set-prop "$TOUCHPAD"    "$TRANSFORM" 0 1 0 -1 0 1 0 0 1
      [ ! -z "$TOUCHSCREEN" ] && xinput set-prop "$TOUCHSCREEN" "$TRANSFORM" 0 1 0 -1 0 1 0 0 1
      ;;
  esac
}

XDISPLAY=`xrandr --current | grep primary | sed -e 's/ .*//g'`
XROT=`xrandr --current --verbose | grep primary | egrep -o ' (normal|left|inverted|right) '`

do_rotate $XDISPLAY $1
Set the 'execute bit' on this script by doing the following:
sudo chmod 775 /usr/local/bin/rotate.sh
For the actual Cinnamon keyboard shortcut, if you decide to use it: Do this by navigating to the Cinnamon 'Preferences/Keyboard/Keyboard shortcuts' menu and assigning 'Custom Shortcuts' via the following keyboard bindings:
  Shift+Ctrl+F3= command "/usr/local/bin/rotate.sh"
This shortcut matches the same key sequence as ChromeOS uses for the 'rotate screen' function (i.e. Shift+Ctrl+Refresh)

NOTE: You can also add this shell script as an icon on the desktop by right-clicking on the desktop and selecting "Create a new launcher here", and referencing '/usr/local/bin/rotate.sh'.
  • SOUND: NEW 2018/03/29: Success with getting speaker sound to work under Linux LMDE! 

This topic is not yet 100% completed, but it was sufficient to get basic sound working.  Be careful!  Apparently it is possible to burn out the speakers if mistreated at high volume levels.

More details of the dangers involved are described here

More information about this fix is here.  Not easy or intuitive, but mostly working by doing the following:

- Install a new kernel (see above -- in my case 4.15 worked, and not sure what lower version would also work)

- Download the missing (!?) firmware drivers for Intel Sound 'firmware-intel-sound' from an appropriate location -- I got it from here, and installed it this way (for some reason, this DEB package was not available using normal 'apt install' commands):

sudo dpkg -i firmware-intel-sound_20161130-3~bpo8+1_all.deb

- Create a new directory (as root) named '/usr/share/alsa/ucm/chtmax98090/' and populate it with two files:
Edit '/usr/share/alsa/ucm/chtmax98090/chtmax98090.conf':
Comment "Cyan internal card"

SectionUseCase."HiFi" {
    File "HiFi.conf"
    Comment "Default"
}
Edit '/usr/share/alsa/ucm/chtmax98090/HiFi.conf':
SectionVerb {
    Value {
        OutputDspName "speaker_eq"
    }

    EnableSequence [
        cdev "hw:chtmax98090"

        cset "name='codec_out0 mix 0 pcm0_in Switch' on"
        cset "name='media0_out mix 0 media1_in Switch' on"
        cset "name='media1_in Gain 0 Ramp Delay' 50"
        cset "name='media1_in Gain 0 Switch' on"
        cset "name='media1_in Gain 0 Volume' 80% 80%"
        cset "name='pcm0_in Gain 0 Ramp Delay' 50"
        cset "name='pcm0_in Gain 0 Switch' on"
        cset "name='pcm0_in Gain 0 Volume' 80% 80%"
        cset "name='codec_out0 Gain 0 Ramp Delay' 50"
        cset "name='codec_out0 Gain 0 Switch' on"
        cset "name='codec_out0 Gain 0 Volume' 80% 80%"
        cset "name='pcm1_out mix 0 media_loop2_in Switch' 1"
        cset "name='media_loop2_out mix 0 codec_in0 Switch' 1"
        cset "name='codec_in0 Gain 0 Ramp Delay' 50"
        cset "name='codec_in0 Gain 0 Switch' on"
        cset "name='codec_in0 Gain 0 Volume' 80% 80%"
        cset "name='media_loop2_out Gain 0 Ramp Delay' 50"
        cset "name='media_loop2_out Gain 0 Switch' off"
        cset "name='media_loop2_out Gain 0 Volume' 80% 80%"
        cset "name='pcm1_out Gain 0 Ramp Delay' 50"
        cset "name='pcm1_out Gain 0 Switch' on"
        cset "name='pcm1_out Gain 0 Volume' 80% 80%"
        cset "name='Digital EQ 3 Band Switch' off"
        cset "name='Digital EQ 5 Band Switch' off"
        cset "name='Digital EQ 7 Band Switch' off"
        cset "name='Biquad Switch' off"
        cset "name='Filter Mode' Music"
        cset "name='ADC Oversampling Rate' 0"

        cset "name='DMIC Mux' DMIC"
        cset "name='MIC2 Mux' IN34"
        cset "name='Right ADC Mixer MIC2 Switch' on"
        cset "name='Left ADC Mixer MIC2 Switch' on"
        cset "name='MIC2 Volume' 20"
        cset "name='Int Mic Switch' on"

        cset "name='ADCR Boost Volume' 4"
        cset "name='ADCL Boost Volume' 4"
        cset "name='ADCR Volume' 11"
        cset "name='ADCL Volume' 11"

        cset "name='Left Speaker Mixer Left DAC Switch' on"
        cset "name='Right Speaker Mixer Right DAC Switch' on"
        cset "name='Speaker Left Mixer Volume' 2"
        cset "name='Speaker Right Mixer Volume' 2"
        cset "name='Record Path DC Blocking' on"
        cset "name='Playback Path DC Blocking' on"

        cset "name='Headphone Left Switch' on"
        cset "name='Headphone Right Switch' on"
        cset "name='Ext HP Switch' off"

        cset "name='Speaker Left Switch' on"
        cset "name='Speaker Right Switch' on"
        cset "name='Ext Spk Switch' on"

    ]

    DisableSequence [
    ]
}

SectionDevice."Headphone".0 {
    Value {
        JackName "chtmax98090 Headset Jack"
        OutputDspName ""
    }

    EnableSequence [
        cdev "hw:chtmax98090"
        cset "name='Ext Spk Switch' off"
        cset "name='Speaker Left Switch' off"
        cset "name='Speaker Right Switch' off"
        cset "name='Ext HP Switch' on"
    ]
    DisableSequence [
        cdev "hw:chtmax98090"
        cset "name='Ext HP Switch' off"
        cset "name='Ext Spk Switch' on"
        cset "name='Speaker Left Switch' on"
        cset "name='Speaker Right Switch' on"
    ]
}

SectionDevice."Mic".0 {
    Value {
        JackName "chtmax98090 Headset Jack"
    }

    EnableSequence [
        cdev "hw:chtmax98090"
        cset "name='Int Mic Switch' off"
        cset "name='Headset Mic Switch' on"
        cset "name='DMIC Mux' ADC"
        cset "name='Record Path DC Blocking' on"
    ]

    DisableSequence [
        cdev "hw:chtmax98090"
        cset "name='Headset Mic Switch' off"
        cset "name='Int Mic Switch' on"
        cset "name='DMIC Mux' DMIC"
        cset "name='Record Path DC Blocking' off"
    ]
}

SectionModifier."Speaker Swap Mode".0 {
    Comment "Swap the left and right channels of speaker."

    EnableSequence [
        cdev "hw:chtmax98090"

        cset "name='Left Speaker Mixer Left DAC Switch' off"
        cset "name='Right Speaker Mixer Right DAC Switch' off"
        cset "name='Left Speaker Mixer Right DAC Switch' on"
        cset "name='Right Speaker Mixer Left DAC Switch' on"
    ]

    DisableSequence [
        cdev "hw:chtmax98090"

        cset "name='Left Speaker Mixer Right DAC Switch' off"
        cset "name='Right Speaker Mixer Left DAC Switch' off"
        cset "name='Left Speaker Mixer Left DAC Switch' on"
        cset "name='Right Speaker Mixer Right DAC Switch' on"
    ]
}

The instructions to do this came from this bugzilla kernel thread.  I wasn't able to 'patch' the 2nd file, so I simply made the simple editing changes manually.

  • KEYBOARD: After making the 'sound' changes upgrades/installs/changes, I was able to get the familiar 'welcome' chime when starting the Cinnamon desktop in LMDE, but the 'xbindkeys' that I had programmed to change the sound volume levels did not work.  I am still not sure why they do not, but I have supplemented them by some others that do in the '$HOME/.xbindkeysrc' file:
"xbacklight -dec 10"
   m:0x0 + c:72
   F6
"xbacklight -inc 10"
   m:0x0 + c:73
   F7
"pactl set-sink-mute 1 toggle; amixer set Master toggle"
   m:0x0 + c:74
   F8
"pactl -- set-sink-volume 1 -10%; amixer sset Master 10%- unmute"
   m:0x0 + c:75
   F9
"pactl set-sink-volume 1 +10%; amixer sset Master 10%+ unmute"
   m:0x0 + c:76
   F10

"xvkbd -xsendevent -text '\[Delete]'"
Alt + BackSpace

"xvkbd -xsendevent -text '\[End]'"
Alt + Right

"xvkbd -xsendevent -text '\[Home]'"
Alt + Left

"xvkbd -xsendevent -text '\[Page_Down]'"
Alt + Down

"xvkbd -xsendevent -text '\[Page_Up]'"
Alt + Up

"xvkbd -xsendevent -text "\A\[Left]""
m:0x0 + c:67
F1

#Forward
"xvkbd -xsendevent -text "\A\[Right]""
m:0x0 + c:68
F2

#Refresh
"xvkbd -xsendevent -text "\Cr""
m:0x0 + c:69
F3

Then run in a terminal:

xbindkeys

The changes from my other '.xbindkeysrc' files on this page are the addition of 'pactl' commands to modify the sound volume levels.

 

CHROMEBOOK DISK MAP

JPG
                    kingston 16gb ssd
[Kingston 16gb SATA M.2 2242 SSD found in many Acer Chromebooks]

Using the following command:
sudo cgpt show /dev/sda
...here is a map of the ChromeOS SSD on an Acer C720 (16gb SSD):
       start        size    part  contents
           0           1          PMBR (Boot GUID: 205DDDF5-1DEF-E049-AC7B-6FE0FB105C6D)
           1           1          Pri GPT header
           2          32          Pri GPT table
     8671232    22573056       1  Label: "STATE"
                                  Type: Linux data
                                  UUID: 36F7A5F6-9960-1743-ACDA-CA73E7A5F26C

       20480       32768       2  Label: "KERN-A"
                                  Type: ChromeOS kernel
                                  UUID: EC355231-0531-8E43-B41D-3D2EAFFC0B94
                                  Attr: priority=1 tries=0 successful=1
     4476928     4194304       3  Label: "ROOT-A"
                                  Type: ChromeOS rootfs
                                  UUID: 5393825B-2588-7B48-A393-A03A09598D76
       53248       32768       4  Label: "KERN-B"
                                  Type: ChromeOS kernel
                                  UUID: 72B6BF28-2F5E-1D4E-9D6F-DDBAB411BF71
                                  Attr: priority=2 tries=0 successful=1
      282624     4194304       5  Label: "ROOT-B"
                                  Type: ChromeOS rootfs
                                  UUID: 1283AFCA-3146-A842-A77F-0F590A5E58B8
       16448           1       6  Label: "KERN-C"
                                  Type: ChromeOS kernel
                                  UUID: 66496701-36D1-0C4F-8162-36FE991257CB
                                  Attr: priority=0 tries=15 successful=0
       16449           1       7  Label: "ROOT-C"
                                  Type: ChromeOS rootfs
                                  UUID: 03BC7D11-2FD3-ED46-94AF-C7FC8BC9E87C

       86016       32768       8  Label: "OEM"
                                  Type: Linux data
                                  UUID: F9B23F78-3333-AD4E-B933-2CE904B4BC2F
       16450           1       9  Label: "reserved"
                                  Type: ChromeOS reserved
                                  UUID: 40706723-65A5-334D-A4E9-92D703AC9006
       16451           1      10  Label: "reserved"
                                  Type: ChromeOS reserved
                                  UUID: C6EC9077-8BE5-AA48-BC22-BF45A3A86C5F
          64       16384      11  Label: "RWFW"
                                  Type: ChromeOS firmware
                                  UUID: 0C8A7EC5-7407-1846-849F-F5BBCED92450
      249856       32768      12  Label: "EFI-SYSTEM"
                                  Type: EFI System Partition
                                  UUID: 205DDDF5-1DEF-E049-AC7B-6FE0FB105C6D
    31277199          32          Sec GPT table
    31277231           1          Sec GPT header
Here is a simple map showing how 'cgpt' partition names equate to familiar Linux device names:

cgpt
label
name

cgpt partition number
linux
device
name

partition
size

STATE
1
/dev/sda1
+11gb
KERN-A
2
/dev/sda2
16mb
ROOT-A
3
/dev/sda3
2gb
KERN-B
4
/dev/sda4
16mb
ROOT-B
5
/dev/sda5
2gb
KERN-C
6
/dev/sda6
512b
ROOT-C
7
/dev/sda7
512b
OEM
8
/dev/sda8
16mb
RESERVED
9
/dev/sda9
512b
RESERVED 10
/dev/sda10
512b
RESERVED 11
/dev/sda12
8mb
EFI-SYSTEM
12
/dev/sda13
16mb

Here is more explanation of what those partitions are used for.

Roughly, ChromeOS takes up 7gb.  Most of it is stored in the 'KERN-A' (/dev/sda2) and 'ROOT-A' (/dev/sda3) partitions, and in the 'KERN-B' (/dev/sda4) and 'ROOT-B' (/dev/sda5) partitions.  The 'active' version of ChromeOS (either the 'A' or 'B' pair of partitions) is read-only, allowing updates to be made to the 'inactive' version before the next reboot occurs.  Each copy of ChromeOS exists in a 2GB 'ROOT-x' partition.  A good chunk of space is also consumed in the 'STATE' partition, which varies in size depending on the SSD drive capacity (approximately 6GB less than this).

Typically, space to install Linux for dual-boot is taken from the 'STATE' partition (in RED above), and re-assigned to the 'ROOT-C' partition (in GREEN above).  In this example, with a 16gb SSD, the 'STATE' partition is 22573056 sectors @ 512 bytes = 11gb.  All of this space can be devoted to a Linux install, but this would leave no storage space for ChromeOS at all -- so in this case the recommended maximum size for Linux on a 16gb SSD would be around 7gb or 8gb.  Note that the locations of 'KERN-C' and 'ROOT-C' are moved from their original offsets to a location within the original 'STATE' partition.

On a Chromebook with a 32gb drive, the 'STATE' partition is 53825536 sectors @512 bytes = 26gb, so there is potentially a lot more room for installing Linux i.e. up to 23gb or 24gb.

On my C720P with the 32gb SSD replaced by a 128gb one, the 'STATE' partition is currently 73560064 sectors @512 bytes = 35gb, while the 'ROOT-C' partition is 167772160 sectors @512 bytes = 80gb.

Examine the re-partitioning scripts mentioned above to see how the relevant partitions are modified, but the basic algorithm is as follows (NOTE: do NOT run these directly unless you know what you are doing!):
# the original partition is changed to be smaller
cgpt add -i 1 -b $stateful_start -s $stateful_size -l STATE ${target_disk}
# this creates a new partition called "kernc"
cgpt add -i 6 -b $kernc_start -s $kernc_size -l KERN-C ${target_disk}
# this creates a new partition called "rootc"
cgpt add -i 7 -b $rootc_start -s $rootc_size -l ROOT-C ${target_disk}
For curiosity's sake, here is what the 'STATE' partition looks like when examined with the Linux 'tree' command:
/dev/sda1
├── dev_image
├── encrypted
├── encrypted.block
├── encrypted.key
├── home
│   ├── chronos
│   ├── root
│   │   └── 7b84d0951c0eeeeba2e89c3adf51736c2cf6495f
│   └── user
│       └── 7b84d0951c0eeeeba2e89c3adf51736c2cf6495f
├── lost+found
├── shutdown_stateful_umount_failure
└── unencrypted
    ├── cache
    │   └── vpd
    │       ├── echo
    │       │   └── vpd_echo.txt
    │       ├── filtered.txt
    │       └── full-v2.txt
    ├── clobber.log
    ├── clobber-state.log
    └── preserve
        ├── attestation.epb
        └── attestation.epb.sum

14 directories, 10 files

SSH SERVER IN CHROMEOS

There may be situations where it is desirable to connect to your ChromeOS device via SSH, so here are slightly-modified instructions from DcK Area on set up an SSH server. NOTE: The actual server comes pre-installed, but is not configured for normal operation.

Enter a superuser shell (i.e. Ctrl-Alt-t and typing 'shell') and enter the following to setup the server:

sudo su
mkdir -p -m 0711 /mnt/stateful_partition/etc/ssh cd /mnt/stateful_partition/etc/ssh ssh-keygen -t rsa -f ssh_host_rsa_key ssh-keygen -t dsa -f ssh_host_dsa_key # not needed anymore?
exit
To then start the SSH server:
sudo /usr/sbin/sshd
sudo iptables -I INPUT -p tcp --dport 22 -j ACCEPT
NOTE: You may get a warning message "Could not load host key" when you start the SSH server -- but if you created the key files properly ahead of this, then the reference is to a strangely-named key that could not be found -- and does not matter.  The reference to this other key is in '/etc/ssh/sshd_config', but this file cannot be edited to remove this reference since it is read-only -- and even though it is possible to make the root filesystem writable, the downsides to doing so are not worth it.

NOTE: You will need to repeat these last two commands each time you wish to start the SSH server, since there is no (easy? safe?) way to auto-start custom commands while in ChromeOS like this.  One way to make this a bit easier is to define some easier alias commands -- put something like this into '~/.bashrc':
alias sshsrv='sudo /usr/sbin/sshd; sudo iptables -I INPUT -p tcp --dport 22 -j ACCEPT'
NOTE: For me, I was not able to get this to work until I configured SSH to use 'Public Key Authentication' instead of 'Password Authentication'.  My understanding is that this is due to the SSH server configuration setting for ChromeOS has password authentication deactivated i.e. in the root '/etc/ssh/sshd_config' file is the following line:
PasswordAuthentication no
So, in order to use public key authentication instead, while signed into the Crosh secure shell as 'chronos', enter:
ssh-keygen -t rsa
Answer the prompts, and this will populate a directory '/home/chronos/user/.ssh' with some SSH files.  Into the 'authorized_keys' file insert an entry that corresponds to the 'id_rsa.pub' file from the machine you intend to use to connect to ChromeOS with (assuming that SSH is already set up there!).  One way to do this with a single shell command is something like the following:
ssh user@remoteipaddress 'cat .ssh/id_rsa.pub' >> ~/.ssh/authorized_keys
You should now be able to SSH connect to the 'chronos' session on the Chromebook from a remote PC without using a password, and doing so securely, using default port 22:
ssh chronos@chromebookipaddr 
If you do not know the IP address of your Chromebook:
ifconfig