Chromebook R11 (CYAN / CB5-132T) - Arch Linux Installation Guide

In this article I explain the steps I took to install Arch Linux on my Chromebook R11 (CYAN / CB5-132T) (I will refer to it as "CB" in rest of the article). I write this article while I go through each step IRL on a CB with factory default settings, therefor anyone should be able to follow this as a guide to get Arch Linux on similar CB of their own.

As a summary, in this guide I will:

Hardware / Firmware changes

  1. Remove hardware screw inside the CB.
  2. Put CB into Developer Mode.
  3. Flash UEFI Full ROM firmware using MrChromebox Firmware Utility Script.

Operating System

  1. Install Arch Linux (w/o provided installation scripts)
  2. Configure base system & connect to WIFI on boot.

GUI

  1. Install & configure i3 window manager. (note: I don't use a display manager)
Installation Mediaarchlinux-2019.12.01-x86_64.iso
Bootloadersystemd-boot
KernelArch Linux default kernel
Initsystemd
Shellbash
Display/Login Manager-- none --
Window Manageri3-wm on Xorg
Application Launcherrofi
Terminaltilda

For a generic installations instructions see the official Arch Linux Installation Guide.

CB Hardware Configuration

# lspci
00:00.0 Host bridge: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series SoC Transaction Register (rev 35)
00:02.0 VGA compatible controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller (rev 35)
00:0b.0 Signal processing controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series Power Management Controller (rev 35)
00:10.0 SD Host controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series MMC Controller (rev 35)
00:12.0 SD Host controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series SD Controller (rev 35)
00:14.0 USB controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series USB xHCI Controller (rev 35)
00:1b.0 Audio device: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series High Definition Audio Controller (rev 35)
00:1c.0 PCI bridge: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series PCI Express Port #1 (rev 35)
00:1c.2 PCI bridge: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series PCI Express Port #3 (rev 35)
00:1f.0 ISA bridge: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series PCU (rev 35)
02:00.0 Network controller: Intel Corporation Wireless 7265 (rev 59)
# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 8087:0a2a Intel Corp.
Bus 001 Device 003: ID 0bda:57cf Realtek Semiconductor Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

A simple hardware modification

CB R11 comes with a hardware write protection on the firmware ROM. And, in order to install UEFI Full ROM that enables us installing regular Linux distribution on the CB; we have to remove this write protection.

In CB R11 this is simple a matter of removing a small screw on the main board. This can easily done using a regular Phillips head screwdriver of matching size.

  1. Remove 11 screws on bottom panel.

  2. Carefully lift the bottom panel cover. You won't be able to set it aside far because of a glued cable. Just move it as far as possible so there is no tension on the cable.

  3. Finally, unscrew & remove the screw indicated in the image below. And, you have a CB with hardware write protection disabled.

bottom panel Bottom Panel

write protection screw Write Protection Screw

write protection screw removed Write Protection Removed

And, now we are ready to flash UEFI firmware using MrChromebox Firmware Utility Script.

Put CB into Developer Mode

Note: it's best to keep your CB connected to power during the following process to make sure it doesn't run out of battery while making modification to the firmware.

To put your CB into developer mode;

  1. Make sure it is powered off.

  2. Then while holding down the Esc + Refresh ⟳ (NOTE: Refresh key is synonymous to the F3 key on a regular keyboard) on the keyboard, press & release the Power button on the right hand side edge. (You can let go of the keyboard once the white (recovery) screen with red/orange exclamation mark shows up.)

  3. Now, press Ctrl + D to turn on the developer mode, and Enter to confirm.

After the 3rd step above, the device will power down and start the device reset process which wipe out user data. This will take few minutes (remaining time will show up on top left hand corner of the screen).

Once the device reset process is complete, CB will reboot and you will be shown a white screen with the message "OS verification is OFF". This screen will remain visible for about 30s (You can skip it by pressing Ctrl + D), and after couple of beeps, ChromeOS will start as usual. Your CB is now in the Developer Mode.

To find out more details about CB developer mode, read the Developer Mode Basics on MrChromebox.tech

Virtual Terminal & Root Shell

With developer mode enabled, and you are passed the 30s warning screen, You can switch to a Linux VT (Virtual Terminal) using Ctrl + Alt + Forward → (F2) key combination.

CB R11 seems to have 4 virtual terminals, on VT1 you will have the ChromeOS booted, and your can use either of VT2..VT4 for the next step.

Each non-GUI VT shows the instruction to login as the default user chronos with no password.

After you login as chronos user, you can gain root access by running another shell with sudo command; sudo $SHELL, sudo bash or sudo sh.

Install UEFI Full ROM

In order to boot a regular Linux distribution on the CB, we have to replace the stock firmware that boots ChromeOS with UEFI firmware. MrChromebox.tech provides a script that we can use to get over this step very easily.

Before you can download the script from MrChromebox.tech, you need to connect your CB to the internet via WIFI. It is easier to use the GUI Network tool on ChromeOS (on VT1) to connect to WIFI, and then switch back to terminal VT.

  1. Make sure you are logged in as chronos.

  2. Make sure you are in a directory that is writable. /home/chronos/user is a pretty good place, and you can go there by typing cd.

  3. Download the Firmware Utility Script https://mrchromebox.tech/firmware-util.sh.

  4. Run firmware-util.sh as root.

chronos@localhost ~ $ cd
chronos@localhost ~ $ curl -LO https://mrchromebox.tech/firmware-util.sh
chronos@localhost ~ $ sudo $SHELL firmware-util.sh

On the firmware utility menu screen make sure it says "Fw WP: Disabled" or something along that line, and also each menu option you want to use is highlighted with a green [WP] marker.

  1. Select the option 3) Install/Update Full ROM Firmware by typing "3" (or the number shown on that line on your menu screen), and press Enter.

  2. It will warn you about the consiquences of your action, and ask you to confirm twice by typing Y and pressing the Enter key.

    Then on the 3rd time it will ask you if you want to backup the existing stock ROM. It's a good idea to do that, so insert a USB drive or a memory card with enough space and type Y key followed by Enter. Then select the storage device from the list it gives you.

    Stock ROM backup will be fairly quick. When it finishes, remove the storage device with the stock ROM backup, and press Enter to flash the new ROM.

  3. Once the flashing process is done, press Enter once to go back to the main menu, type R and press Enter to reboot. (This reboot could take few extra seconds)

Now when the CB boot, you will see the "coreboot" (rabit) logo on the screen. You can press the Esc button while coreboot logo is visible on screen to enter the system Configuration/Settings program & change the boot order & other settings.

To find out more details about Firmware Utility Script, read the MrChromebox.tech page.

 

Preparing Partitions

Assumption: Storage device that we install the OS is connected as mmcblk0.

When setting up a new workstation, I usually wipe out the all partitions in the storage device with the following command.

WARNING: DO NOT do this if you have any data on the storage device that you want to keep. (instead you can manually clear the space new partitions.)

# dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=1

Create the following GPT partitions using fdisk.

Device NodeMount PointTypeSize
/dev/mmcblk0p1/bootEFI100MB
/dev/mmcblk0p2/Linux8GB
/dev/mmcblk0p3/homeLinuxremainder

Note: if you get a warning as follows while creating partitions;

Partition #1 contains a vfat signature.

Do you want to reove the signature? [Y]es/[N]o:

Choose to remove the signature by pressing Y followed by the Enter key.

# fdisk /dev/mmcblk0

Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x640f873c.

Command (m for help): g
Created a new GPT disklabel (GUID: 7724150B-F303-394A-B1FA-78F31BA5169A).

Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-125045390, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-125045390, default 125045390): +100M

Created a new partition 1 of type 'Linux filesystem' and of size 100 MiB.

Command (m for help): t
Selected partition 1
Partition type (type L to list all types): 1
Changed type of partition 'Linux filesystem' to 'EFI System'.

Command (m for help): n
Partition number (2-128, default 2):
First sector (1050624-125045390, default 1050624):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1050624-125045390, default 125045390): +8G

Created a new partition 2 of type 'Linux filesystem' and of size 8 GiB.

Command (m for help): n
Partition number (3-128, default 3):
First sector (22022144-125045390, default 22022144):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (22022144-125045390, default 125045390):

Created a new partition 3 of type 'Linux filesystem' and of size 21 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

# fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 59.6 GiB, 64023257088 bytes, 125045424 sectors
Disk model: TS64GSSD320
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 7724150B-F303-394A-B1FA-78F31BA5169A

Device        Start       End   Sectors  Size Type
/dev/mmcblk0p1      2048   1050623   1048576  512M EFI System
/dev/mmcblk0p2   1050624  22022143  20971520   10G Linux filesystem
/dev/mmcblk0p3  22022144 125045390 103023247 49.1G Linux filesystem

Format each partition as follows:

# mkfs.vfat -F32 /dev/mmcblk0p1
--- output not shown here ---
# mkfs.ext4 /dev/mmcblk0p2
--- output not shown here ---
# mkfs.ext4 /dev/mmcblk0p3
--- output not shown here ---

NOTE: I'm not creating a swap partition here, because I don't use swap on my workstations. However, I will be including the instruction to create swap file in a later stage.

 

Prepare for base system installation

File System

Mount the partition which eventually be the root of the system (/dev/mmcblk0p2) to /mnt, and create sub-directories.

# mount /dev/mmcblk0p2 /mnt
# mkdir -m 0755 -pv \
> /mnt/{boot,dev,etc/systemd/network,home,run,var/{cache/pacman/pkg,lib/pacman,log}}
mkdir: created directory '/mnt/boot'
mkdir: created directory '/mnt/dev'
mkdir: created directory '/mnt/etc'
mkdir: created directory '/mnt/etc/systemd'
mkdir: created directory '/mnt/etc/systemd/network'
mkdir: created directory '/mnt/home'
mkdir: created directory '/mnt/run'
mkdir: created directory '/mnt/var'
mkdir: created directory '/mnt/var/cache'
mkdir: created directory '/mnt/var/cache/pacman'
mkdir: created directory '/mnt/var/cache/pacman/pkg'
mkdir: created directory '/mnt/var/lib'
mkdir: created directory '/mnt/var/lib/pacman'
mkdir: created directory '/mnt/var/log'
# mkdir -m 0750 -pv /mnt/var/lib/iwd
mkdir: created directory '/mnt/var/lib/iwd'
# mkdir -m 0555 -pv /mnt/{proc,sys}
mkdir: created directory '/mnt/proc'
mkdir: created directory '/mnt/sys'
# mkdir -m 1777 -pv /mnt/tmp
mkdir: created directory '/mnt/tmp'

Mount remaining partitions.

# mount /dev/mmcblk0p1 /mnt/boot
# mount /dev/mmcblk0p3 /mnt/home

Swapfile (optional)

# dd if=/dev/zero of=/mnt/swap bs=512M count=1
--- output not shown here ---
# chmod 600 /mnt/swap
# mkswap /mnt/swap
--- output not shown here ---
# swapon /mnt/swap

Connect installation environment to LAN/Internet

Assumption: Your system connects to LAN/Internet using the interface wlp1s0.

Enable WIFI connection using iwd. When using a wired connection this steps in this section may be skipped partly or completely.

Connect to WIFI (optional)

# systemctl start iwd
# iwctl device wlp1s0 set-property Powered on
# iwctl
[iwd]# station wlp1s0 connect ESSID
Type the network passphrase for ESSID psk.
Passphrase: secret
[iwd]# exit
# sed '/^Passphrase=/d' /var/lib/iwd/ESSID.psk > /mnt/var/lib/iwd/ESSID.psk
# chmod 0600 /mnt/var/lib/iwd/ESSID.psk

Then, create a network configuration file (in the target FS), and sym-link it to the installation system.

# cat > /mnt/etc/systemd/network/any-network-name.network << EOF
[Match]
Name=wlp1s0

[Network]
DHCP=yes
EOF
# ln -sv /mnt/etc/systemd/network/any-network-name.network /etc/systemd/network
'/etc/systemd/network/any-network-name.network' -> '/mnt/etc/systemd/network/any-network-name.network'

Start systemd-networkd and systemd-resolved services.

# systemctl start systemd-networkd
# systemctl start systemd-resolved

Note: You might have to symlink /run/systemd/resolve/stub-resolv.conf to /etc/resolv.conf

 

Install base system

[NOTE TO SELF] Use local pacman cache

Mount cache server into /var/cache/pacman/pkg of the installation environment.

# mkdir -pv /var/lib/pacman/sync
mkdir: created directory '/var/lib/pacman/sync'
# mount -o nolock SERVER_IP:/path/to/sync /var/lib/pacman/sync
# mount -o nolock SERVER_IP:/path/to/cache /var/cache/pacman/pkg

[/NOTE TO SELF]

Mount pseudo file systems to the target

# mount -t devtmpfs udev /mnt/dev
# mount -t proc proc /mnt/proc
# mount -t sysfs sys /mnt/sys
# mount -t tmpfs tmp /mnt/tmp

For the installation you can use mirror closest to you and later do a full system upgrade using an up-to-date repository. Select the closest mirror and move it to the top of /etc/pacman.d/mirrorlist.

Note: install all the packages from base-devel group.

# pacman -Sy -r /mnt linux linux-firmware intel-ucode iwd dhcpcd nfs-utils base-devel
--- output not shown here ---

 

Make the new installation bootable

Bootloader configuration

Make UEFI boot directories for systemd-boot (without using bootctl), copy boot loader firmware and create loader configuration files manually.

# mkdir -pv /mnt/boot/{EFI/systemd,loader/entries}
mkdir: created directory '/mnt/boot/EFI'
mkdir: created directory '/mnt/boot/EFI/systemd'
mkdir: created directory '/mnt/boot/loader'
mkdir: created directory '/mnt/boot/loader/entries'
# cp /mnt/lib/systemd/boot/efi/systemd-bootx64.efi /mnt/boot/EFI/systemd
# cat > /mnt/boot/loader/loader.conf << EOF
> default loader-name
> timeout 0
> EOF
# cat > /mnt/boot/loader/entries/loader-name.conf << EOF
> title Arch Linux
> linux /vmlinuz-linux
> initrd /intel-ucode.img
> initrd /initramfs-linux.img
> options root=/dev/mmcblk0p2 init=/usr/lib/systemd/systemd rw quiet
> EOF

If there are any dump-* files in the /sys/firmware/efi/efivars directory, delete them all, and then run;

# efibootmgr --create --disk /dev/mmcblk0 --part 1 --loader /EFI/systemd/systemd-bootx64.efi --label "Arch Linux"

 

Setup system via chroot

# chroot /mnt /bin/bash

Connect the system to network on boot

# systemctl enable iwd systemd-networkd systemd-resolved
--- output not shown here ---
# ln -sfv /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
'/etc/resolv.conf' -> '/run/systemd/resolve/stub-resolv.conf'

Initialize pacman keys

# pacman-key --init
--- output not shown here ---
# pacman-key --populate archlinux
--- output not shown here ---
# sed -i 's/^#\(Server =.\+\)$/\1/' /etc/pacman.d/mirrorlist

Although it might not be necessary for a new installation, do a system update.

# pacman -Syu
--- output not shown here ---

Create /etc/fstab

# cat >> /etc/fstab << EOF
> 
> /dev/mmcblk0p2 / ext4 rw,relatime,noatime,nodiratime,discard,errors=remount-ro 0 1
> /dev/mmcblk0p1 /boot vfat rw,relatime,fmask=0022,dmask=0022,shortname=mixed,errors=remount-ro 0 2
> /dev/mmcblk0p3 /home ext4 rw,relatime,noatime,nodiratime,discard,errors=remount-ro 0 2
> EOF

[NOTE TO SELF] Mount local pacman cache when required

# cat >> /etc/fstab << EOF
> 
> SERVER_IP:/path/to/sync /var/lib/pacman/sync nfs noauto,x-systemd.automount,noexec,nolock,noatime,nodiratime,rsize=32768,wsize=32768,timeo=14,nfsvers=3 0 0
> SERVER_IP:/path/to/cache /var/cache/pacman/pkg nfs noauto,x-systemd.automount,noexec,nolock,noatime,nodiratime,rsize=32768,wsize=32768,timeo=14,nfsvers=3 0 0
> EOF

[/NOTE TO SELF]

Set /etc/hostname

# echo 'machine-name' > /etc/hostname

Time zone and clock settings

Setting time zone to Asia/Colombo. Make sure you change the Asia/Colombo text & the zoneinfo directory to match your time zone.

# echo 'Asia/Colombo' > /etc/timezone
# rm /etc/localtime
# ln -sv /usr/share/zoneinfo/Asia/Colombo /etc/localtime
'/etc/localtime' -> '/usr/share/zoneinfo/Asia/Colombo'
# hwclock --hctosys --utc
# date
Sun Mar  3 01:59:02 +0530 2019

[NOTE TO SELF] Enable synchronization with local NTP server

Set systemd-timesyncd to synchronize system time via NTP.

# sed -i 's/^#\(NTP=\)/\1NTP_SERTVER_IP/; s/^#\(FallbackNTP=.\+\)/\1/' /etc/systemd/timesyncd.conf
# systemctl enable systemd-timesyncd

[/NOTE TO SELF]

Optionally, if the system time need to be changed:

# date MMDDhhmmYYYY
# hwclock --systohc --utc
# date
DDD MMM DD hh:mm:?? +0530 YYYY

Generate locale

# cat >> /etc/locale.gen << EOF
> en_US.UTF-8 UTF-8
> si_LK.UTF-8 UTF-8
> EOF
# locale-gen
Generating locales...
  en_US.UTF-8 UTF-8... done
  si_LK.UTF-8 UTF-8... done
Generation complete.

Note: at this point systemd will not allow us to set locale using localectl. We will do that after booting into the new system.

systemd adjustments

Stop console clearing at login prompt

# mkdir -pv /etc/systemd/system/getty@tty1.service.d
mkdir: created directory '/etc/systemd/system/getty@tty1.service.d'
# cat > /etc/systemd/system/getty@tty1.service.d/noclear.conf << EOF
> [Service]
> TTYVTDisallocate=no
> EOF

Limit number of TTYs

# sed -i 's/#\(NAutoVTs=\).*/\12/' /etc/systemd/logind.conf

Limit journal disk usage

# sed -i 's/#\(SystemMaxUse=\).*/\116M/' /etc/systemd/journald.conf

Mask unnecessary systemd units that cause delay in system startup

# systemctl mask lvm2-monitor systemd-backlight@

pacman configurations

[NOTE TO SELF] Block pacman from installing mono and/or java runtime.

# sed -i 's/#\(IgnorePkg\s*=.*\)/\1 mono mono-* *-openjdk-headless/' /etc/pacman.conf

[/NOTE TO SELF]

Enable color in pacman output

# sed -i 's/#\(Color\|VerbosePkgLists\)/\1/' /etc/pacman.conf

Disable webcam

# cat >> /etc/modprobe.d/modprobe.conf << EOF
> blacklist uvcvideo
> EOF

Create user(s)

# useradd -m -s /bin/bash -G systemd-journal,wheel -U new_username
# passwd new_username
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

sudo capability

Add this user to /etc/sudoers as we will be blocking root from login in the system.

# cat >> /etc/sudoers << EOF
> new_username machine_name=(root) /usr/bin/pacman
> EOF

You may allow regular user to gain access to a root shell via sudo during the setup in order to prevent any lock-up situation;

# cat >> /etc/sudoers << EOF
> new_username machine_name=(root) /usr/bin/su -ls /usr/bin/bash
> EOF

WARNING: however above may leave your system insecure in some situations and you may remove this capability once it is no longer needed.

Lockout root from login into console or from SSH in. Optionally remove the password hash for root from /etc/shadow.

# rm /etc/securetty
# sed -i 's#\(root:x:0:0::/root:/bin/\).\+#\1false#' /etc/passwd
# sed -i 's/\(root:\)[^:]*\(:.\+\)/\1!!\2/' /etc/shadow

Disable shell history at system level

Note: users may enable/override this from their shell configuration.

# cat >> /etc/profile << EOF
> 
> # Disable shell history recording for all users
> unset HISTFILE
> export HISTFILESIZE=0
> EOF

At this point you should reboot into newly installed system, and login as a regular user.

Exit chroot, unmount and reboot

# exit
exit
# umount -Rv /mnt
unmount: /mnt/boot unmounted
unmount: /mnt/home unmounted
unmount: /mnt/dev unmounted
unmount: /mnt/proc unmounted
unmount: /mnt/sys unmounted
unmount: /mnt/tmp unmounted
unmount: /mnt unmounted
# systemctl reboot

First-boot configuration

Set locale

# localectl set-locale LANG=en_US.UTF-8

pacman mirror list

Setup reflector to update pacman mirror list every time system boots.

# pacman -S reflector
--- output not shown here ---
# cat > /etc/systemd/system/reflector.service << EOF
> [Unit]
> Description=Pacman mirrorlist update
> Wants=network-online.target
> After=network-online.target
> 
> [Service]
> Type=oneshot
> ExecStart=/usr/bin/reflector --protocol https --latest 30 --number 20 --fastest 10 --sort rate --save /etc/pacman.d/mirrorlist
> EOF
# cat > /etc/systemd/system/reflector.timer << EOF
> [Unit]
> Description=Pacman mirrorlist update runner
> 
> [Timer]
> OnCalendar=daily
> RandomizedDelaySec=1day
> Persistent=true
> 
> [Install]
> RequiredBy=timers.target
> EOF
# systemctl enable reflector.timer

Install yay AUR helper

$ sudo pacman -S git
--- output not shown here ---
$ git clone https://aur.archlinux.org/yay /tmp/yay
--- output not shown here ---
$ cd /tmp/yay
$ makepkg -si
--- output not shown here ---
$ sudo pacman -Rcnsu go
--- output not shown here ---

Use yay to reinstall yay, so that all AUR packages in out system is properly installed using yay.

$ yay --removemake -S yay
--- output not shown here ---

Optionally, do a full system update using yay.

$ yay --removemake --combinedupgrade -Syu
--- output not shown here ---

 

GUI

Xorg

Install appropriate video driver.

$ sudo pacman -S xf86-video-vendor
--- output not shown here ---
$ sudo pacman -S xorg-{server,xinit}
--- output not shown here ---

Configure Xorg to start on user login.

$ cat >> ~/.bash_profile << EOF
> 
> if [[ ! $DISPLAY && $XDG_VTNR -eq 1 ]]; then
>   exec startx
> fi
> EOF

Fonts

$ sudo pacman -S ttf-{dejavu,droid}
--- output not shown here ---

i3 Window Manager

Install i3 window manager, and set Alt key as $mod.

$ sudo pacman -S i3-wm
--- output not shown here ---
$ cat > ~/.xinitrc << EOF
> exec i3 > /dev/null 2>&1
> EOF
$ mkdir -pv ~/.config/i3
mkdir: created directory '/home/suda/.config/i3'
$ cat > ~/.config/i3/config << EOF
> set $mod Mod1
> EOF

rofi launcher

$ sudo pacman -S rofi
--- output not shown here ---
$ cat >> ~/.config/i3/config << EOF
> 
> bindsym $mod+d exec --no-startup-id rofi -show run
> EOF

Terminal

Install tilda terminal emulator & launch it when i3 starts.

$ sudo pacman -S tilda
--- output not shown here ---
$ cat >> ~/.config/i3/config << EOF
> 
> exec --no-startup-id tilda
> EOF

 


Following instructions are for my personal setup choices.

Bash completion

$ sudo pacman -S bash-completion
--- output not shown here ---

Man pages & viewer

$ sudo pacman -S man-db
--- output not shown here ---

playerctl

Install playerctl to control volume via keyboard.

$ sudo pacman -S playerctl
--- output not shown here ---

iBus

$ sudo pacman -S ibus
--- output not shown here ---
$ cat >> ~/.bashrc << EOF
> 
> export GTK_IM_MODULE=ibus
> export XMODIFIERS=@im=ibus
> export QT_IM_MODULE=ibus
> export XIM_PROGRAM=/usr/bin/ibus-daemon
> EOF

Xorg extra

$ sudo pacman -S xorg-{xbacklight,xrandr,xset}
--- output not shown here ---

Extra Fonts

$ yay -S ttf-lklug otf-fira-{code,mono,sans} otf-font-awesome noto-fonts{,-emoji}
--- output not shown here ---

Programming languages and Development Tools

Node.js & pnpm

First install pnpm into temporary directory, and then use that installation as a bootstrap to install pnpm under $HOME. See pnpm documentation for details.

$ sudo pacman -S nodejs
--- output not shown here ---
$ curl -L https://raw.githubusercontent.com/pnpm/self-installer/master/install.js | \
> PNPM_DEST=/tmp PNPM_BIN_DEST=/tmp/bin node
--- output not shown here ---
$ /tmp/bin/pnpm -g install pnpm
Rust

Install rust via rustup.

$ sudo pacman -S rustup
--- output not shown here ---
$ rustup default stable
--- output not shown here ---
$ rustup update
--- output not shown here ---
PHP & Composer
$ sudo pacman -S composer
--- output not shown here ---

GUI Applications & Tools

$ sudo pacman -S evince filezilla gnome-calculator keepassxc meld thunar file-roller \
> dunst
--- output not shown here ---

Firefox nightly

$ mkdir -pv $HOME/opt
mkdir: created directory '/home/username/opt'
$ curl -sL "https://download.mozilla.org/?product=firefox-nightly-latest-ssl&os=linux64&lang=en-US" | \
> tar xj -C $HOME/opt
$ sudo pacman -S dbus-glib
--- output not shown here ---

Syncthing

$ sudo pacman -S syncthing
--- output not shown here ---
$ mkdir -pv $HOME/Sync
mkdir: created directory '/home/username/Sync'

GTK & Icon themes

$ sudo pacman -S arc-gtk-theme papirus-icon-theme
--- output not shown here ---

Vim

$ sudo pacman -S gvim
--- output not shown here ---

And, also install spell checking tools.

$ sudo pacman -S aspell-en hunspell-en_US ispell
--- output not shown here ---
$ mkdir -pv $HOME/.vim/spell
mkdir: created directory '/home/username/.vim'
mkdir: created directory '/home/username/.vim/spell'
$ ln -sv $HOME/.aspell.en.pws $HOME/.vim/spell/en.utf-8.add
'/home/username/.vim/spell/en.utf-8.add' -> '/home/username/.aspell.en.pws'

conky

$ sudo pacman -S conky

Other Tools

$ sudo pacman -S iproute2 iputils openssh tree veracrypt

Telegram

$ curl -sL https://telegram.org/dl/desktop/linux | tar xJ -C $HOME/opt Telegram/Telegram