Installing Fedora 20 on Asus Chromebox-M004U

A couple weeks ago, I received my new Asus Chromebox from Amazon. If you haven’t heard of the Chromebox, it’s basically a tiny x86_64 desktop machine with a Celeron processor (well, this model is, anyway. There are others).

Its specs are pretty modest, but that’s really the point. It’s designed to be a lightweight system, primarily for use with a web browser, which also makes it a good thin client for streaming media to your TV. And the cheap, low-power hardware is very economical, at just $159.

So it’s a desktop system, that I can install Linux on, for under $200? I had to give it a try. I had been wanting a cheap, hackable, open-source HTPC. And I thought this would be just the thing.

My use case is a fairly common one: I want to watch any streaming media out there, so it would have to be a regular desktop system and not a mobile OS (sorry, Android. I still like you). In addition to that, I needed a system that could also stream videos from my local fileserver via NFS, SMB, or even UPnP.

I was disappointed to find that ChromeOS, the OS that ships with the Chromebox, does not support any of those. In fact, there is no way to natively mount or otherwise use my fileserver, as far as I know. Maybe using SSHFS from the developer tools… I didn’t try that. But it still relies on having a decent video player for the ChromeOS, which I was unable to find. “Chrome-casting” is kind of an option too, but a poor substitute for mounting a network fileshare/NAS. So that meant the Chromebox needed some Linux love in order to unlock its full potential.

There are guides out there that say you can “dual-boot” Linux and the pre-installed ChromeOS, but take a look and interpret those guides for yourself… In all cases that I’ve seen, they’re simply running another OS within a chroot environment. So it’s closer to a virtual machine running on your ChromeOS than true dual-booting. (True dual-booting allows you to choose which OS to start when booting up the computer, and runs the OS directly on the hardware).

So that’s one option for extending the capabilities of your Chromebox. If you want a really easy install, using a chroot environment on top of the default ChromeOS, stop reading now and head over to Crouton. It’s a newbie-friendly tool that runs little or no risk of breaking anything.

But if you want the real deal, a true Linux install on the Chromebox, potentially actually dual-bootable (using GRUB, not chroot), then the steps below might be of some help. It’s not for the faint of heart, since you will be wiping out the default ChromeOS and replacing it with one or more Linux installs. But that’s what we’re here for, right? To get a truly open-source OS onto our Chromebox! 🙂

1. Disable OS verification

This is the first step to enabling dev mode on your Chromebox. It will allow us to run non-ChromeOS operating systems.

Push the reset switch with paperclip, while holding power switch to boot into recovery mode.

(Note that this will perform a factory reset, wiping any data you may have placed on the ChromeOS). The reset switch is the round hole in the case, pictured below.

chromebox reset switch

Once the reset switch is pressed, and you’re at a white screen, press CTRL+D to turn off OS verification.

chromebox OS verification is off

2. Enable developer mode

While you’re still on the white screen, push the reset switch with a paperclip again to enable dev mode. It will start preparing the dev environment and display a tiny bar at the top of the screen to indicate loading.

After a few minutes, the dev desktop will appear. It will ask you to set up your google account, since all data has been wiped at this point. You can fill that out, or skip right over to the second TTY to begin configuring.

Press CTRL+ALT+F2 to get to the second TTY. This will drop you at a login prompt.

At the prompt, log in as chronos. Hit enter when asked for the password, because there is none. (Dev mode is inherently insecure, even if you set a password). This is another reason why you might want to wipe the default ChromeOS rather than chrooting on top of it.

If you want, at this point, you can follow the on-screen directions to get the developer tools installed. It will install some useful tools into the native ChromeOS, like SSHFS. But our goal is to install an entire operating system, so let’s proceed to unlock that instead.

Enable booting into the legacy open-source SeaBIOS.

sudo su - chromeos-firmwareupdate --mode=todev crossystem dev_boot_usb=1 crossystem dev_boot_legacy=1

At this point, you will be able to boot into the legacy SeaBIOS. Which would allow you to install another OS and boot off of USB disks… At least, that would be the case if this version of SeaBIOS wasn’t afflicted by a lack of USB 3.0 support. That means you can boot into the BIOS, but once inside, you will be unable to use any onboard USB ports. That means no keyboard, no selecting of boot devices, no ability to install another OS. So let’s fix that.

We’re going to install a patched version of the BIOS, written by John Lewis. Many thanks to him for making this possible!

wget md5sum asus-chromebox-SeaBIOS-new.bin # Make sure the md5sum returns dc200444a02eafcce0486fedf86bf4f1 # Then flash the new BIOS flashrom -w -i RW_LEGACY:asus-chromebox-SeaBIOS-new.bin

Now you can boot off any USB install media! So potentially you could install any operating system at this point. I say ‘potentially’ because it doesn’t always work so well. As you’ll see below, we’ll need to pass a special boot option to the Fedora installer to let it know how much memory it has to work with, since the SeaBIOS is unable to determine that.

Update: a reader has commented that you can run this additional command to skip having to press CTRL + L every time you reboot. So optionally, you can give this a try. I haven’t run this one myself, but it looks useful if you don’t want to see the BIOS boot menu every time you reboot Linux. Note that this will make “legacy boot” the default boot option, so proceed with caution, since I don’t think you’ll be able to get back to ChromeOS after this. 0×489

Reboot or shutdown the Chromebox. When it powers back on, you’ll be at the white screen again, that says “OS verification is OFF”.

Hit CTRL + L to enter SeaBIOS. Hit ESC as soon as the screen turns black, over even before. Only hit it once. You might have to be quick with this one, or it’ll try to boot from disk.

Hitting ESC has brought up the boot menu, as you can see below:

chromebox SeaBIOS boot menu

Press 2 to use your USB disk to boot. You can use either a USB CDROM, USB harddrive, or thumbdrive containing your favorite OS installer.

If you don’t have Linux on your USB media yet, it’s as simple as dd’ing an ISO image onto the USB disk. I recommend grabbing the full Gnome 3 version of Fedora 20 for this install. Gnome 3 works perfectly on the Chromebox, and conveniently detected all the media keys on my keyboard (unlike LXDE). It’s personal preference though, so whichever version you prefer.

So you have your USB media, you’ve selected ‘2’ to boot it. Now you’re at the installer.

chromebox Fedora installer, press Tab

Press Tab to change the boot options. Otherwise, the installer will fail to detect any memory on your Chromebox, and boot will fail.

chromebox booting Fedora on my TV

Pressing Tab brings up all kinds of default boot parameters. We’ll be appending our to the end of that list. Append the following:


chromebox booting Fedora on my TV

And press enter to proceed with the install. (Note: the reason I’m using ‘1024’ here and not ‘2048’ is because that was the only way I could get it to install. I have 2GB of RAM, but for some reason it only wants to know about one of them…)

Just to demonstrate that the 2GB of RAM are still available after the install, here is the output of ‘free -m’ on my chromebox:

[[email protected] ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1876        855       1020        151         52        293
-/+ buffers/cache:        508       1367
Swap:         1527         94       1433

I imagine if you’re following a guide like this one, you already know how to install Linux, so we’ll skip all that. But basically, you can just proceed as if this were any other desktop install now. I recommend wiping out the ChromeOS partitions, because, even if you choose to save them, you still won’t be able to boot the ChromeOS after this. (Not without restoring the entire system to its original state). So you may as well reclaim all the space used by it, or sit it aside for another Linux install. I’m regretting leaving mine intact, since I have so little disk space left. Still plenty of room for a Linux install though.

To boot into your new Fedora install, you’ll still have to hit CTRL+L at the white screen every time you boot up. But it’s a small price to pay for the hackability and extensive features you’ve unlocked.

Once you’ve booted into your new OS, you can install any kind of HTPC media-player type software, like XBMC, to create a more media-centric experience. The possibilities are endless, now that you have an entire open-source OS in your control.

Comments ( 3 )

  1. / ReplyBooody
    While type the first line . sudo su - chromeos-firmwareupdate --mode=todev crossystem dev_boot_usb=1 crossystem dev_boot_legacy=1 I got su: unrecognized option mode=todev I want to install Android X8 Any help please
  2. / ReplyAlexis
    I'm having trouble installing John Lewis' patch. Every time I try wget, I get a response saying: Unable to establish SSL connection. Resolving md5sum... failed: Unknown host. Resolving asus-chromebox-seabios-new.bin... failed: Unknown host. wget: unable to resolve host address 'asus-chromebox-seabios-new.bin' I'm not sure what the issue is. Thanks, Alexis
  3. / Replytec602
    @boody.... see the commands over here for more clear entry format: @ alexis... i had the same problem with the ssl error in shell, i ended up just downloding the bios from web browser and going back into shell and flashing from: /home/chronos/user/Downloads/

Leave a reply

Your email address will not be published.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>