Build Yourself Arch Linux, Part 3
Part 3: Let’s Get a GUI
This is the third and the final part of my Build Yourself Arch Linux series (part 1, part 2). In this part I’ll finally get to a graphical environment setup.
GNOME
Before settling down on GNOME I’ve tried (well installed and played around for 10 minutes) most of the desktop environments supported by Arch. I’ve been using GNOME 3 in the past but decided to look what else is out there. The reason I’ve settled on GNOME now is HiDPI support. While there’re other desktop environments that support HiDPI GNOME gave me the best result with pretty much no configuration. I was really tempted by KDE Plasma which looks gorgeous and does support HiDPI. Still on MacBook’s screen GNOME was a bit more consistent: I’ve got too small icons here and there in Plasma. LXQT is another DE I’m interested in. Given the progress towards HiDPI support or possibility of getting an external monitor with ordinary resolution I’ll probably be able to reevaluate my choice of desktop environment soon enough.
Installation
Installation of GNOME was quite an easy task: I went for “minimal” gnome-shell
package which is around 750 MB of dependencies in total (instead of around 1500 MB for gnome
and 2030 MB for gnome-extra
). As I was going to use Wayland, I had to get XWayland separately: xorg-server-xwayland
package wasn’t pulled in as a dependency that led to gnome-shell[600]: Failed to spawn Xwayland: Failed to execute child process "/usr/bin/Xwayland" (No such file or directory)
when starting GNOME.
Startup
Because I still do some stuff in the text console, I have created a tiny script to easily start GNOME under Wayland manually as described on ArchWiki. I’ve tried to use GDM first but it’s not really needed in my setup. E.g. it doesn’t make sense to type both disk encryption password and user’s password to boot and if I’m not going to select different users/sessions why have a display manager in the first place? When starting GNOME I see couple of error messages Activated service 'org.freedesktop.systemd1' failed: Process org.freedesktop.systemd1 exited with status 1
that doesn’t seem to be critical, you can find a related discussion on GitHub.
Workman layout
I can’t do much on a computer without a Workman keyboard layout. Fortunately it was installed already as part of xkeyboard-config
, pulled in by GNOME. The only thing I had to do it to remap Caps Lock to Control which means editing workman
section in /usr/share/X11/xkb/symbols/us
and replacing key <CAPS>
mapping with { [ Control_L ] };
(there’s probably a better way to override the keymap configuration instead to prevent the modification from being erased by an upgrade of the package).
Disable cursor blinking
As you might already know from the previous part of the guide I don’t particularly enjoy cursor flickering. Fortunately it is possible to disable it system-wide for GUI applications in GNOME: gsettings set org.gnome.desktop.interface cursor-blink true
.
More GNOME apps
After getting GNOME working I’ve installed gnome-controll-center
which gives access to graphical preferences. The package asks you to select on of libx264
and libx264-10bit
dependencies, see the Reddit post why you probably want non 10bit version. To be able to change desktop backgrounds I’ve also grabbed gnome-backgrounds
package.
For a graphical file manager I’ve installed nautilus
- the default one in GNOME, plus sushi
which gives a preview of a selected file when hitting space, a shortcut I used to have from macOS. Some other GNOME packages I have installed: gnome-documents
- to read books (e.g. EPUB); gnome-calculator
- gives ability to use GNOME Overview search as calculator as well; gnome-dictionary
- to look up definitions, analogue of macOS built-in dictionary; gnome-keyring
- system-wide secret storage; gnome-screenshot
- a really great tool for taking screenshots; tracker
- to search for files from the Overview; gnome-clocks
and gnome-weather
- to get multiple clocks and a forecast in the calendar drop-down respectively; gnome-maps
- a pretty good OpenStreetMap based application; gnome-tweak-tool
- to have access to more detailed graphical configuration.
Extensions
gnome-shell-extensions
is a bundle of default GNOME extensions from which I use WindowsNavigator to switch between windows in Overview using a keyboard. See the ArchWiki on details how to enable extension management using https://extensions.gnome.org/.
Hide unwanted desktop icons
To get rid of icons of applications installed as dependencies that you don’t use add NoDisplay=True
in .desktop file. Copy the desktop file to ~/.local/share/applications
to not have it overwritten by every application update.
Not a perfect story
One thing I don’t like about GNOME so much is that it’s very monolithic (I’m not sure if described below are the problems of GNOME itself or the Arch packages specifically though). It expects you to install full suite of applications along with Gnome Shell itself (given number of error messages in logs related to not found D-Bus services for GNOME applications I’ve opted to not install. On one hand if you install only the shell you’ll end up with non functional GUI elements (desktop background selection, settings button), on the other hand if you install gnome-controll-center
Cheese webcam application gets pulled in (which is fine as I use it to test my webcam before calls but annoying nevertheless).
Terminal emulator
Tilix is a more future reach alternative to GNOME Terminal and a quite close rival to macOS’ iTerm. It’s quite young project, there’s no Tilix package in the official repositories yet. The AUR package works well, except you’ll have to recompile Tilix when its dependency gtkd
is updated otherwise it will fail to launch. I’ve enabled “Run command as a login shell” in Tilix profile configuration configuration (section Command) to enable shell integration (like opening new tabs in the same working directory).
Not tied to specific terminal emulator, but to make shell more pleasant to use I’ve installed bash-completion
.
Building packages
When you install AUR packages or rebuild official packages from source xz
utility is used to get smaller package size at expense of build time. Compression step takes a significant portion of build time and by using multiple threads as described here you can reduce that time significantly. The same way you can speed up compilation of packages by using multiple threads.
You can also build (slightly) faster binaries when compiling from source by sacrificing portability which doesn’t matter if you run built packages only on your own machine. To use the instruction set of your specific CPU by add -mnative
to the compiler flags (CFLAGS
and CXXFLAGS
in /etc/makepkg.conf
). See ArchWiki for more information about package optimization.
Browser
Not much to say here really. Firefox works great on Linux and with the recent improvements to speed and stability in versions 55-57 I’ve got no reasons to look elsewhere.
Webcam
There’s an ongoing effort to provide a Linux driver for the FaceTime camera. To get it working just get bcwc-pcie-git
from AUR. To test the lighting before video calls cheese
program from GNOME works well.
Graphics drivers
Fortunately I have only an integrated Intel GPU which has very good Linux support. Following the ArchWiki article I’ve installed xf86-video-intel
to get 2D hardware acceleration and vulkan-intel
to have Vulkan API support; mesa for 3D acceleration was pulled in by GNOME already. There’re two APIs for video hardware acceleration on Linux: VA-API and VDPAU developed by Intel and Nvidia respectively. To enable VA-API I’ve installed libva-intel-driver
and to verify that it’s indeed available vainfo
from libva-utils
(from AUR). I didn’t get VDPAU to work under Wayland (even though it worked out of the box under Xorg). This is not critical in my case since my video player of choice mpv supports VA-API. To avoid screen flickering multiple times during the boot I’ve enabled early loading of i915 kernel module (Intel graphics) as described here. The downside is the high brightness during early boot until disk password is entered.
Touchpad
At first I’ve tried xf86-input-mtrack
touchpad driver to get the beloved 3 finger drag gesture that I used to on macOS so much. But the driver is Xorg only meaning I won’t be able to keep it moving to Wayland. I’ve did some research and basically the gesture is not coming to Wayland anytime soon (see my Reddit post). After some frustration I’ve gave up on the idea, decided to unlearn the gesture and stuck with Wayland.
The only tweaking I did in the result was to enable tap to click, increase touchpad speed and enable natural scrolling via GNOME Settings.
Text editor
I’ve replaced vim with gVim (one of the reasons being vim is compiled without +clipboard, meaning no clipboard access). Of course command line vim binary is included in the package as well. Because gVim’s icon looks ugly on high resolution displays I’ve replaced it with the one from VimR project. To do it change Icon
value in gVim’s .desktop file to the path to the new image (copy desktop file first to prevent overwrites as mentioned above).
Video player
I’ve settled on using mpv which is very simple and powerful at the same time and has a nice command line interface. To enable hardware acceleration (which reduces CPU use significantly) two lines with hwdec=vaapi
(use VA-API supported by my Intel GPU) and opengl-backend=wayland
(make driver detection work properly under Wayland) in ~/.config/mpv/mpv.conf
is all I needed to do.
Power saving
Even though I probably didn’t get to 100% of the battery life I had with macOS I’ve came pretty close without spending too much time on it. First I’ve installed powertop
which gives an interactive overview of power usage on a system and also allows to apply predefined set of rules to save energy. As described by the wiki I’ve created a systemd service to automatically apply powertop’s suggestions on system startup. TLP is another tool to save some battery life, see the installation section of the page on what systemd services it needs to have enabled/disabled. During experiments with power saving my Wi-Fi card got hardware blocked once which wasn’t easy to troubleshoot as the MacBook have no indicator for the switch but was simple to fix with rfkill
utility. Following the ArchWiki power saving recommendations for my MacBook I’ve disabled card reader as it was showing up in powertop and I don’t use the device.
Conclusions
It’s been a long time (almost a year since the first post!) and an exciting journey, I have learned a lot. I’m not looking back at all really. While in the beginning it was overwhelming to learn so much stuff at once now I feel as much productive as on macOS (if not more). Not having to deal with App Store, iTunes, million ways to update installed programs and slow macOS updates is great.
Hope the series were useful to you. If you have any feedback, please send it to me.