Arch Linux on ASUS X205T/X205TA

I recently found an old ASUS X205T laptop squirreled away in my closet. When I tried to boot it, it constantly rebooted back to the BIOS. Since it was 100% unsalvagable, I decided to try putting Linux on it.

To save others my pain, I have decided to chronical my steps from nothing to boot. There are several other tutorials out there, including the wiki. The difference with this tutorial is I will try to show the easiest way, not the most "noble" way.

Booting

The majority of the issue comes from the fact that the laptop uses a 64-bit processor with a 32-bit uefi bootloader. This means you need to have a weird hack to even boot.

First, boot into the BIOS (press F2 or F8 during boot), and disable UEFI under the Security tab.

Next, go to savagezen's github page and download the customized Arch ISO he prepared. Follow his instructions to flash it onto a USB drive and insert it into the laptop. Boot into the BIOS again and go to the last tab and select the USB drive you inserted under boot override.

If all went well, you should boot into the live Arch environment.

Verify UEFI mode

To make sure you booted correctly into UEFI mode, run the following command:

# ls /sys/firmware/efi/efivars

If you get a list of files, you have booted correctly.

Networking

The X205T has no ethernet jack, so we will need to connect to a wireless network.

# wifi-menu

Connect to your home network and verify with:

# ping google.com

This will only work for the live boot.

Partitioning

The partitioning guide is taken from the Arch Linux For Dummies guide.

To see your current paritioning set up run:

# lsblk

On my laptop, the actual hard-drive was under the label mmcblk1 with the USB under sda. When following partitioning guides, make sure to keep this in mind.

The easiest way I found to partition is the drive is as follows. First, run

# parted /dev/mmcblk1

Once you ensure there is nothing on the hard-drive you want to save, run:

(parted) mklabel gpt

This sets the partition label.

To set up the partitions, run:

(parted) mkpart ESP fat32 1MiB 513MiB
(parted) set 1 boot on
(parted) mkpart primary linux-swap 513M 3G
(parted) mkpart primary ext4 3G 100%

This will create the boot, swap, and primary partitions. Run quit to exit out of the parted:

(parted) quit

To check that everything was created correctly, run:

# lsblk /dev/mmcblk1

You should have mmcblk1p1 (boot), mmcblk1p2 (swap), mmcblk1p3 (data).

Formatting

Next, we need to format each of the partitions.

The boot partition:

# mkfs.fat -F32 /dev/mmcblk1p1

The swap space:

# mkswap /dev/mmcblk1p2
# swapon /dev/mmcblk1p2

The data partition:

# mkfs.ext4 /dev/mmcblk1p3

Mounting

Now we will mount the data and boot partitions so we can work on them in our live environment.

The data partition:

# mount /dev/mmcblk1p3 /mnt

The boot partition:

# mkdir /mnt/boot
# mount /dev/mmcblk1p1 /mnt/boot

Installing Arch

To install Arch, we will use pacstrap:

# pacstrap /mnt base base-devel

You will probably get PGP key errors. To fix these:

# pacman-key --refresh-keys

With those packages installed, generate an fstab file to define disk partitions:

# genfstab -U /mnt >> /mnt/etc/fstab

With the base system set up, we can use arch-chroot to enter inside it and run commands.

# arch-chroot /mnt /bin/bash

You will notice the hostname will change. To denote commands run inside this command, I will preface commands with >.

To set our locale, you need to run:

># nano /etc/locale.gen

Scroll down in the file and uncomment en_US.UTF-8 UTF-8. Save, quit, and then run:

># locale-gen
># echo LANG=en_US.UTF-8 > /etc/locale.conf

To set our timezone, use:

># tzselect

And note the output. Then use the information to populate the following command:

># ln -s /usr/share/zoneinfo/MY_ZONE/MY_SUBZONE /etc/localtime
># hwclock --systohc --utc

Finally, use passwd to change the root password.

Bootloader

To be able to boot, we will follow Ifran's tutorial.

First, install grub:

># pacman -S grub efibootmgr

Next, install grub with the 32-bit mode:

># grub-install –target=i386-efi –efi-directory=/boot --bootloader-id=grub_uefi –recheck

And finally, generate the config file:

># grub-mkconfig -o /boot/grub/grub.cfg

Now run exit to exit the installed system, and reboot to reboot the live iso. On the reboot, go into the BIOS and choose to boot from the hard-drive (the label will most likely be grub-uefi). If everything was successful, a GRUB screen will pop up and you will be able to boot into Arch and log into your root account. If you boot into emergency mode, you probably messed up the partitioning scheme.

Don't worry, we still have plenty of work left.

Getting WIFI Working

Like before, lines prefixed with > are inside your install, with # being reserved for the live usb.

If you boot into your install and try ># ping google.com you'll notice it fails. What gives? Running the command ># ip link shows that the wireless card isn't being recognized (it will show up as wlan0 if it is). Looks like we need to get some drivers.

Boot back into the live environment, since you can get a connection there. Run wifi-menu and reconnect to your network. Next, mount your data partition and root into it:

# mount /dev/mmcblk1p3 /mnt
# arch-chroot /mnt /bin/bash

Verify you have a connection with ping and we can now download the drivers we need. First, we need to get wget:

># pacman -S wget

Next, we can download the drivers:

># cd ~
># wget https://android.googlesource.com/platform/hardware/broadcom/wlan/+archive/master/bcmdhd/firmware/bcm43341.tar.gz
># tar xf bcm43341.tar.gz

This will download the drivers and extract them in your home directory. Next, we will copy the files over:

># cp fw_bcm43341.bin /lib/firmware/brcm/brcmfmac43340-sdio.bin
># cp /sys/firmware/efi/efivars/nvram-74b00bd9-805a-4d61-b51f-43268123d113 /lib/firmware/brcm/brcmfmac43340-sdio.txt

We need to also disable SDHCI-ACPI, but luckily Ifran's blog also has a solution for that:

># nano ~/.startup.sh

Inside .startup.sh:

#!/bin/sh
echo on > /sys/bus/platform/drivers/sdhci-acpi/INT33BB\:00/power/control

Next, to create a service for this:

># nano /etc/systemd/system/startup.service

Inside startup.service:

[Unit]
Description=startup

[Service]
ExecStart=/root/.startup.sh

[Install]
WantedBy=multi-user.target

Finally, enable that service:

># systemctl enable startup.service

This will allow your install to recognize the wireless card. Since we are here, we will finish setting up the networking piece too. Only a couple pieces left.

First, set your hostname:

># echo MY_HOSTNAME > /etc/hostname

Next, install the packages necessary for wifi-menu to work on your install:

># pacman -S iw wpa_supplicant dialog

Exit out and reboot:

># exit
# reboot

From your install you should be able to see wlan0 in ip link and use wifi-menu to connect. Running ping google.com should give you a result. With WIFI set up, we no longer need our live stick.

Users

Since we no longer have a live environment, I will be dropping the >.

# useradd -m -G wheel MY_USERNAME
# passwd MY_USERNAME

Next run visedo and uncomment this line:

# export EDITOR=nano && visudo

Log out of root and into your user with logout. From now on you should stay out of your root environment.

Window Manager

There are many choices, but to keep with the low-resource environment, we are going to install XFCE.

First, install the X-server:

$ sudo pacman -S xorg-server

Next, install XFCE itself:

$ sudo pacman -Sy xfce4 xfce4-goodies lxdm

Once that all installs, enable the lxdm service:

$ sudo systemctl enable lxdm

Next, we need to modify the lxdm configuration file to boot into our system our start:

$ sudo nano /etc/lxdm/lxdm.conf

In this file, change:

# session=/usr/bin/startlxde

to

session=/usr/bin/startxfce4

Save and reboot and you should see xfce appear.

Done

It just works. Minus sound and battery reporting.