Author: Gustavo Leite
<contact[at]gustavoleite.me>
| Created: November 2019
This is the script I follow for installing Arch Linux on my own machines. For that matter, it is heavily skewed towards my needs. I do not claim that this script is the most appropriate for every scenario nor do I hold responsibility for any mistakes contained here. Use with caution!
A fuller and more in-depth tutorial can be found in the Arch Linux Wiki. If you would like to suggest improvements or report any errors, I'll be glad to hear from you! Reach out to me via email or open an issue on Github.
This guide is distributed under the MIT License. Enjoy! đź¤
Some preparation is needed before effectively installing the operating system, namely:
- Set the keyboard layout
- Connect to the internet
- Update system clock
- Partition the disk
- Format the partitions
- Mount the partitions
After booting into the Live USB and being prompted by the command line, load the correct keyboard layout, for example:
# List all layouts
ls /usr/share/kbd/keymaps/**/*.map.gz
# Load a specific layout
loadkeys br-abnt2
Now, certify that you are connected to the internet. If you are using a cabled
connection you should be good to go, whereas if you use WiFi, you can connect
using wifi-menu
:
wifi-menu # Select the network and login
It is possible to test the connection by pinging https://archlinux.org.
ping archlinux.org # You should see the packets arriving
Enable the Network Time Protocol (NTP) so that the time is updated automatically:
timedatectl set-ntp true
# You can check the status to see if it is actually active
timedatectl status
Next, it is necessary to partition the disk. There are many programs to do this
(fdisk
, gdisk
, cfdisk
, etc) in both command line and text user interfaces
flavors.
You will need at least two partitions: one for the operating system; and
anoother for the boot record. I will assume that your are installing the system
on drive /dev/sda
, the OS will reside on partition /dev/sda2
and the EFI
boot partition on /dev/sda1
. These can vary on your system.
Note: Just to be clear: by deleting an existing partition you will essentially loose all their contents. Do no delete partitions that already have data.
Tip: If you are starting from a brand new disk, I suggest you put the boot partition first. If you eventually decide to resize the primary partition, your disk will be less fragmented.
# If you never done this before, I recommend `cfdisk`
cfdisk /dev/sda
Below is a table describing how the partitioning should be made:
Partition | Size | Type |
---|---|---|
Boot | 500 MiB | EFI System |
Primary | Any | Linux Filesystem |
After partitioning the disk, you should format the partitions with mkfs
. The
boot partition should be formatted as vfat
. The primary partition, however,
can be formatted as: ext3
, ext4
, xfs
, jfs
, btrfs
, and others. If you
are unsure, go with ext4
.
Note: Just to be clear: formatting a partition will delete everything on it.
# Format the boot partition as `vfat`
mkfs.vfat /dev/sda1
# Format the primary partition as `ext4`
mkfs.ext4 /dev/sda2
After partitioning, mount the disks. If you have any other partitions that you would like to use with this system, mount them accordingly.
mount /dev/sda2 /mnt # The primary partition
mount /dev/sda1 /mnt/boot/efi # The boot partition
Before installing the operating system, it is advised to edit the file
/etc/pacman.d/mirrorlist
and put geographically close mirrors on the top of
the list so they have higher priority.
# Place mirrors from your country on top
vim /etc/pacman.d/mirrorlist
Now we install the operating system. This will download and install the
essential packages. In place of vim
you could download an editor of your
preference (pico
, nano
, emacs
, etc).
pacstrap /mnt base linux linux-firmware vim sudo
# | |<---------- packages ---------->|
# |
# `--> Where to install (Your primary partition is mounted here)
Some things have to be configured before we boot into the new system. They are:
- Generate
/etc/fstab
- Change Root
- Timezone
- Localization
- Network
- Bootloader
Generate the filesystem tab:
Note: It is advised to use the append operator
>>
here to avoid overriding any contents/etc/fstab
already had.
genfstab -U -p /mnt >> /mnt/etc/fstab
# | |
# | `--> Avoid printing pseudofs mounts (default)
# `--> Use UUID labels for source identifiers
And finally, chroot
into the new system. This will change the filesystem root
so that any changes you make (i.e. install packages) are being applied to the
system you just installed and not to the the Live USB.
arch-chroot /mnt bash
# | |
# | `--> Which shell to use (`sh` is default)
# `--> New root
Adjust your timezone and system clock.
# Symlink the desired region
ln -sf /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime
# | |
# | `--> Substitute for your city
# `--> Substitute for your region
# Set the hardware clock (see note below)
hwclock --systohc
# |
# `--> Set the hardware clock from the system clock and update
# the timestamps in /etc/adjtime.
Note: If you use Windows, this will probably cause the clock to be wrong when you log into it. This happens because Linux interprets the hardware clock as UTC, while Windows use local time. To fix that, it is suggested to edit Windows registry to make it use UTC as well (See How). Or, you can configure Linux to use local time, although ill advised.
Edit the file /etc/locale.gen
and uncomment the locales you will need.
# Select locales
vim /etc/locale.gen
# In my case, I will be using English (US) and Portuguese (BR)
# Uncomment the following lines:
# en_US.UTF-8 UTF-8
# pt_BR.UTF-8 UTF-8
# Generate locales
locale-gen
# Set default locale
echo LANG=en_US.UTF-8 > /etc/locale.conf
export LANG=en_US.UTF-8
# |
# `--> The locale you set in the above two commands will be the
# language of your operating system.
Assign your machine a host name:
echo "YOUR_HOSTNAME" > hostname
Then add the following entries at the end of the /etc/hosts
file:
# /etc/hosts
127.0.0.1 localhost
::1 localhost
127.0.1.1 YOUR_HOSTNAME.localdomain YOUR_HOSTNAME
Now we need to install the bootloader. This piece of software will run after the BIOS and will allow you to select which operating system you want to boot.
The packages needed here are:
grub-efi-x86_64
: GRUB bootloaderos-prober
: Tool to detect other OSesefibootmgr
: Tool to modify UEFI firmware boot manager variables
# Install the packages
pacman -S grub-efi-x86_64 os-prober efibootmgr
# | |
# | `--> Install packages
# `--> This is the Arch Linux package manager`
# Install GRUB on the EFI partition
grub-install --recheck /dev/sda1 --efi-directory=/boot/EFI
# | |
# | `--> Your boot partition
# `--> Check for new drives
# Create a config file for GRUB
grub-mkconfig -o /boot/grub/grub.cfg
Note: There is an alternative to GRUB called rEFInd (
refind-efi
). Beware that rEFInd is not compatible with some filesystems, read the manual before installing it.
Now your system is ready to roll! But we still need to make it suitable to working and development. These are the steps I usually go through.
Although you can create your user after booting into the system, I prefer to do it here. Do not forget to setup passwords for both root and your user.
useradd -m -G users YOUR_USERNAME
# | | |
# | | |
# | | `--> Group name
# | `--> Which group the user belongs
# `--> Create a /home folder for this user
passwd # Create root password
passwd YOUR_USERNAME # Create user password
Also, enable your user to use sudo
. Edit the file /etc/sudoers
.
# Enable your user by inserting a line like this:
# YOUR_USERNAME ALL=(ALL) ALL
visudo /etc/sudoers
Uncomment the block [multilib]
in /etc/pacman.conf
to enable the
installation of 32-bit packages in 64-bit systems.
# Enable multilib
vim /etc/pacman.conf
# Uncomment the following lines:
# [multilib]
# Include = /etc/pacman.d/mirrorlist
We still need to install a desktop environment. In this case, I'll be using GNOME although there are alternatives. A complete list of desktop environments is available here.
We will need three packages:
wayland
: Display server (alternative:xorg
)gnome
: Desktop environment and window manager (alternatives:i3-wm
,xfce4
,kde
, etc)gdm
: Gnome Display Manager (alternatives:lightdm
)
# Install GUI
pacman -S wayland gnome gdm
# Enable desktop manager to start with the system
systemctl enable gdm
Note: You can actually install multiple desktop environments and choose which one to use in the display manager before logging-in.
Enable time synchronization daemon. This will keep your system clock always updated.
systemctl enable --now systemd-timesyncd.service
# |
# `--> Enable and start the service in one command
Following is a list of essential packages for my development environment, this may vary from your needs.
openssh
: Secure Shell (SSH)git
: Control version systembase-devel
: GNU development toolsllvm
,clang
: C/C++ compiler and librariesintel-ucode
: Microcode update for Intel CPUs (For AMD:amd-ucode
)coreutils
: GNU file, shell and text utilitiesstrace
: Track system callsltrace
: Tracks runtime library callsgdb
: GNU Debuggertmux
: Terminal multiplexerpython-pip
: Python package managergvim
: Graphical vim (with clipboard support)zsh
: Z-Shellhtop
: Interactive process viewercmake
: build system
These are also other programs that I always install:
firefox
: Web browsernetworkmanager
,network-manager-applet
: Network configuration and managementtexlive-most
: LaTeX binaries and packagesneofetch
: Tool to display system information
# Development and administration
pacman -S openssh git base-devel llvm clang intel-ucode coreutils \
strace ltrace gdb tmux zsh python-pip gvim zsh htop \
cmake
# User programs
pacman -S firefox networkmanager network-manager-applet \
texlive-most neofetch
# Drivers for NVIDIA
pacman -S nvidia nvidia-libgl
# Fonts
pacman -S ttf-dejavu ttf-fira-code ttf-fira-sans ttf-hack \
ttf-liberation ttf-roboto noto-fonts noto-fonts-extra \
noto-fonts-emoji noto-fonts-cjk
# Enable services
systemctl enable --now NetworkManager.service
systemctl enable --now sshd.service
# Change my user's default shell to zsh
chsh -s $(which zsh) YOUR_USERNAME
Note: Font rendering in Linux is below average, to say the least. Here are some tips to improve it.
This section shows some other things I find useful to do. However, I usually run them after booting natively into the new system (and not from a chroot'ed system).
# Generate a pair of SSH keys for this machine
ssh-keygen
# Clone dotfiles
git clone https://github.com/leiteg/dotfiles ~/dotfiles
# Install Python packages
pip install yapf jupyter
Besides the official Arch Linux repositories, there is the Arch User
Repository (AUR) which is maintained by users and provides even more
packages. However, to download packages from AUR, you need to install a
wrapper for pacman
. There are several in the market, but I would recommend
yay.
Now your OS is installed and ready! Run exit
to quit the arch-root
and then
reboot
. You should be greeted with the GRUB screen. You can look for further
resources in the general recommendations page in the Arch Wiki.