Install on Samsung Series 3 Chromebook

## Get an SD card

As a bare minimum a 2GB card is needed, but at least 4GB is recommended. If performance is a concern, choose the model of SD card carefully. The only ones found in testing to have reasonable performance (i.e. at least comparable to mechanical disks under a random-write workload) are "SanDisk Extreme Pro SDHC UHS-1 95MB/s" models. See here for more details (link at the end of the article, then scroll down to the second table):

Flash Module Benchmark Collection

Strictly speaking, you don't have to use an SD card for this - a USB flash module will work just as well, and you may find a small USB stick more convenient, both because the SD card sticks out of the side, and because there are two USB ports on the back of the machine (i.e. there is still a spare USB port for another device after the USB flash module for the rootfs). Same caveat about the performance applies - most USB flash media has appalling performance. I am using a 64GB Kingston Data Traveler Mini module, and that only manages around 40-50 IOPS on random writes; better than most, but less than half of what the above mentioned SD card can manage.

## Download RSEL6 rootfs Tarball

Get it from here:
http://ftp.mirrorservice.org/sites/ftp.redsleeve.org/pub/yum/os/rsel6-rootfs-gui-20130927-1.tar.xz

This is a large RSEL6 GUI image with KDE GUI, the required Xorg drivers, and NetworkManager components to allow you to easilly connect to WiFi and yum install any additional packages you may require.

## Prepare the SD Card

I used my Toshiba AC100 to prepare the SD card. The external SD card appears as /dev/mmcblk1 on those, to the instructions here reflect that. Adjust the device node name accordingly for your system.

Edit partitions using gdisk. Since SD cards typically have large erase block sizes and poor flash management, it is recommended to set sector alignment to 4MB. Use GPT partitions.

```
# gdisk /dev/mmcblk1
 GPT fdisk (gdisk) version 0.8.4

 Partition table scan:
   MBR: protective
   BSD: not present
   APM: not present
   GPT: present

 Creating new GPT entries.

 Command (? for help): o
 This option deletes all partitions and creates a new protective MBR.
 Proceed? (Y/N): y

 Command (? for help): x

 Expert command (? for help): l
 Enter the sector alignment value (1-65536, default = 2048): 8192

 Expert command (? for help): m

 Command (? for help): n
 Partition number (1-128, default 1): 1
 First sector (34-62333918, default = 8192) or {+-}size{KMGTP}:
 Last sector (8192-62333918, default = 62333918) or {+-}size{KMGTP}: +16M
 Current type is 'Linux filesystem'
 Hex code or GUID (L to show codes, Enter = 8300): 7f00
 Changed type of partition to 'ChromeOS kernel'

 Command (? for help): n
 Partition number (2-128, default 2): 2
 First sector (34-62333918, default = 40960) or {+-}size{KMGTP}:
 Last sector (40960-62333918, default = 62333918) or {+-}size{KMGTP}:
 Current type is 'Linux filesystem'
 Hex code or GUID (L to show codes, Enter = 8300):
 Changed type of partition to 'Linux filesystem'

 Command (? for help): w

 Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
 PARTITIONS!!

 Do you want to proceed? (Y/N): y
 OK; writing new GUID partition table (GPT) to /dev/mmcblk1.
 The operation has completed successfully.

```

This creates two partitions: a kernel one and one for the root filesystem.

Create a filesystem on the root partition:

```
# mkfs.ext4 -b 4096 -E stripe-width=1024,discard /dev/mmcblk1p2

```

Mount the file system and extract the RSEL6 rootfs to it:

```
# mount /dev/mmcblk1p2 /mnt
 # pv rsel6-rootfs-gui-20130927-1.tar.xz | pxz -cd | tar -C /mnt -xf -

```

Edit etc/fstab on the new rootfs accordingly to the media you are using (e.g. set root to /dev/sda2 if you are using a USB stick). Then unmount the rootfs you created.

```

## Enable Developer Mode on the Chromebook

Booting into recovery mode by holding both the escape and refresh keys on the keyboard and then pressing the power key. While in recovery mode, you can safely ignore any messages indicating the installation is broken. Press Ctrl+D while in recovery mode to enable developer mode. The prompt will ask for permission to clear all local data from the system before removing OS verification. This process takes about ten minutes. Once it is finished there will be a message indicating that OS verification is disabled. This message will now appear at every boot time to indicate your system is in developer mode. Press Ctrl+D to continue booting ChromeOS.

## Put the ChromeOS kernel on the kernel partitions of the SD card

Once logged in and you have the SD card inserted, press Ctrl+Alt+T to open a crosh prompt.

Run "shell" to get a bash shell.

Run "sudo -s".

Be careful here, mmcblk1 and mmcblk0 are very easy to mistype, and doing so can be embarrasing. :)

# cd /tmp
 # echo "console=tty1 root=/dev/mmcblk1p3 rootwait ro elevator=deadline lsm.module_locking=0 quiet" > /tmp/config
 # vbutil_kernel --repack /tmp/newkernel --keyblock /usr/share/vboot/devkeys/kernel.keyblock --version 1 --signprivate /usr/share/vboot/devkeys/kernel_data_key.vbprivk --config=/tmp/config --oldblob /dev/mmcblk0p2 --arch arm
 # dd if=/tmp/newkern of=/dev/mmcblk1p1
 # crossystem dev_boot_usb=1
 # cgpt add -i 1 -S 1 -T 5 -P 10 /dev/mmcblk1

```

## Copy Kernel, Modules, Firmware Blobs and Keys to rootfs

The filesystem on the SD card used in this procedure automatically mounted as /media/removable/External\ Drive\ 2/. It might be different. Check with the 'mount' command if unsure.

```
# cp -af /lib/modules/*          /media/removable/External\ Drive\ 2/lib/modules/
 # cp -af /lib/firmware/*         /media/removable/External\ Drive\ 2/lib/firmware/
 # cp -af /usr/share/vboot        /media/removable/External\ Drive\ 2/usr/share/
 # cp -af /boot/*-3*              /media/removable/External\ Drive\ 2/boot/
 # umount                         /media/removable/External\ Drive\ 2/

```

Note that on newer ChromeOS installations the SD card is accessible via the "/media/removable/SD Card/" path rather than "/media/removable/External Drive 2/", so you may need to adjust the cp commands accordingly.

## Run RSEL6

Reboot the Chromebook. Instead of pressing Ctrl+D, press Ctrl+U to boot from the SD card (or a USB stick). If all went well, RSEL6 boot process should stream down the screen.

## Specific Configuration

### Accelerated MALI Driver

The RSEL6 rootfs contains all the required Xorg drivers to get things up and running. No xorg.conf is necessary - everything gets autodetected and works with the standard frame buffer driver. The touchpad works with the Synaptics driver. The accelerated open-surce MALI driver is available from here:

http://ftp.redsleeve.org/pub/yum/soc/

Look for the xorg-x11-drv-armsoc packages (src.rpm and armv6l.rpm are available). Unfortunately, I have not managed to get them working (the machine locks up when starting X if you create a xorg.conf file to use the armsoc driver). So treat the packages as highly experimental. If you manage to get them working, please update the information here.

### ChromeOS CMT Driver

The Xorg driver for CMT (enhanced touchpad support) is available from here:
https://chromium.googlesource.com/chromiumos/platform/xf86-input-cmt/

Unfortunately, it requires kernel-headers from a more recent kernel than the currently available RSEL6 2.6.32 series to build (and the most recent version requires a newer Xorg, too). Source and binary rpms of this will be provided once source and binary kernel rpms for a suitable 3.4.0 kernel become available.

In the meantime, the synaptics driver (xorg-x11-drv-synaptics) works quite well, and is included in the rootfs tarball.

### Real Time Clock

There is a known issue with the system clock on the Chromebook. For some reason, even though the hardware clock keeps correct time across reboots, the system clock forgets the time. This leads to the boot failing during fsck as it finds that the last mount time is in the future.

I have found a workaround for this problem. Create the following executable script (755 permissions):

```
# cat /etc/sysconfig/modules/hwclock.modules
 #!/bin/bash

 /sbin/hwclock --utc --hctosys

```

The executable scripts /etc/sysconfig/modules/\*.modules execute very early in rc.sysinit, before fsck runs. The above script will set system time from hardware clock, which means that the time will be correct by the time fsck inspects the file systems, and everything will work smoothly.