This guide will show step-by-step how to Install Arch Linux on UEFI mode.
- Bootable Flash Drive
- BIOS
- Pre installation
- Set Keyboard Layout
- Check boot mode
- Update System Clock
- Internet Connection
- DHCP
- Wi-Fi
- Wired Connection
- Partitioning
- Create Partitions
- Format Partitions
- Mount the file system
- Installation
- Select Mirror
- Install Base Packages
- Generate fstab
- Chroot
- Check pacman keys
- Configure System
- Locale and Language
- Keymap
- Timezone
- Hardware Clock
- Network
- Hostname
- Nameservers
- Firewall
- Blacklists
- No Beep
- No Watchdog
- Initramfs
- Set-up Wi-Fi
- Bootloader
- Root password
- Xorg
- Video
- Audio
- Users
- Reboot
- Locale and Language
- Post installation
- Window Manager
- Network Manager and services
- Extras
- Set-up TTF Fonts
- Bluetooth Headphone
First of all, you need the Arch Linux image, that can be downloaded from the Official Website. After that, you should create the bootable flash drive with the Arch Linux image.
If you're on a GNU/linux distribution, you can use the dd command for it. Like:
$ dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress oflag=sync && syncNote that you need to update the
of=/dev/sdxwith your USB device location (it can be discovered with thelsblkcommand).
Otherwise, if you're on Windows, you can follow this tutorial.
We'll install Arch on UEFI mode, so you should enable the UEFI mode and disable the secure boot option on your BIOS system. (Also remember to change the boot order to boot through your USB device).
I'm presuming that you're already in the Arch Linux zsh shell prompt.
For brazilian users:
# loadkeys br-abnt2You can see the list of available layouts by running
ls /usr/share/kbd/keymaps/**/*.map.gz
To check if the UEFI mode is enabled, run:
# ls /sys/firmware/efi/efivarsIf the directory does not exists, the system may be booted in BIOS.
Ensures that the system clock is accurate.
# timedatectl set-ntp trueFirst, test if you alredy have internet connection, so run:
# ping -c 2 google.comIf you're not connected, follow one of these steps:
This option is automatically started. Run:
# dhcpcdRun the following command and connect to your wi-fi network.
# wifi-menu -o
The
-ooption is to hide your password by using the "obscure" method
Warning: Make sure the DHCP is deactivated by running systemctl stop dhcpcd.service
-
Find the network interface name
# ip linkThe response will be something like:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp2s0f0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether 00:11:25:31:69:20 brd ff:ff:ff:ff:ff:ff 3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT qlen 1000 link/ether 01:02:03:04:05:06 brd ff:ff:ff:ff:ff:ff -
Activate Network interface
Using the
enp2s0f0for example:# ip link set enp2s0f0 up -
Add IP addresses
The command to do that is
ip addr add [ip_address]/[mask] dev [interface]applying to our example:# ip addr add 192.168.1.2/24 dev enp2s0f0 -
Add the Gateway
The command is
ip route add default via [gateway]then:# ip route add default via 192.168.1.1 -
Change DNS
Using the Google DNS, open the file
/etc/resolv.conf(you can usenanoorvito do that) and write down these lines:nameserver 8.8.8.8 nameserver 8.8.4.4 search example.com
After that, test your internet connection again with the ping command.
First, define your partitions size. There's no rules about this process.
Tip: If you use a SSD drive, leave 25% of his storage free. More info here.
My HDD has 1Tb of storage. For that example, I'll create 4 partitions, described on the following table:
(in my case, I'll install arch on /dev/sda disk)
| Name | Partition | Size | Type |
|---|---|---|---|
| sda1 | /boot |
512M | EFI |
| sda2 | / |
64G | ext4 |
| sda3 | swap |
16G | swap |
| sda4 | /home |
Remaining space | ext4 |
These values are very related for my PC needs.
To create partitions, I'll use gdisk since to work on UEFI mode we need GPT partitions.
First, list partitions (Informational only) with the following command
# gdisk -l /dev/sdxHere's a table with some handy gdisk commands
| Command | Description |
|---|---|
| p | Print partitions table |
| d | Delete partition |
| w | Write partition |
| q | Quit |
| ? | Help |
-
Enter in the interactive menu
# gdisk /dev/sdx -
Create boot partition
- Type
nto create a new partition - Partition Number: default (return)
- First Sector: default
- Last Sector:
+512M - GUID:
EF00
- Type
-
Create root partition
- Type
nto create a new partition - Partition Number: default
- First Sector: default
- Last Sector:
+64G - GUID: default
- Type
-
Create swap partition
- Type
nto create a new partition - Partition Number: default
- First Sector: default
- Last Sector:
+16G - GUID:
8200
- Type
-
Create home partition
- Type
nto create a new partition - Partition Number: default
- First Sector: default
- Last Sector: default
- GUID: default
- Type
-
Save changes with
w -
Quit gdisk with
q
Once the partitions have been created, each (except swap) should be formatted with an appropriated file system. So run:
# mkfs.fat -F32 -n BOOT /dev/sda1 #-- boot partition
# mkfs.ext4 /dev/sda2 #-- root partition
# mkfs.ext4 /dev/sda4 #-- home partitionThe process for swap partition is slight different:
# mkswap -L swap /dev/sda3
# swapon /dev/sda3To check if the swap partition is working, run
swapon -sorfree -h.
-
Mount root partition:
# mount /dev/sda2 /mnt -
Mount home partition:
# mkdir -p /mnt/home # mount /dev/sda4 /mnt/home
-
Mount boot partition: (to use
grub-installlater)# mkdir -p /mnt/boot/efi # mount /dev/sda1 /mnt/boot/efi
Now we'll install arch on disk
Before installation, is recommended to select the best mirror servers.
So open the file /etc/pacman.d/mirrorlist (again, you can use nano or vi to do that) and move the best mirror to the top of the file.
Tip: That link generates a mirror list based on your location, you can use them as reference.
Now that the mirrors are already set, use pacstrap to install the base package group:
# pacstrap /mnt base base-develNow you should generate the fstab with the genfstab script:
# genfstab -p /mnt >> /mnt/etc/fstabOptional: you can add
noatimeto the generatedfstabfile (on root and home partitions) to increase IO performance.
Now, we'll change root into the new system
# arch-chroot /mntNow, if you want to install some package, do it with
pacman -S <package_name>
# pacman-key --init
# pacman-key --populate archlinuxOpen the file /etc/locale.gen and uncomment your locale settings
After that, write your locale string to file /etc/locale.conf.
For example, if you've uncomment the line en_GK.UTF-8 UTF-8, now you will write en_GK.UTF-8
echo en_GK.UTF-8 > /etc/locale.confThen, generate locale settings by running:
# locale-genAnd export your locale string with:
# export LANG=en_GK.UTF-8 #-- as exampleCreate the file /etc/vconsole.conf and write your console settings. For example:
KEYMAP=br-abnt2
FONT=lat0-16
FONT_MAP=
Create a symbolic link with your timezone (to check available timezones, see the files/folders in /usr/share/zoneinfo/)
# ln -sf /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime# hwclock --systohc --utc# echo myhostname > /etc/hostnameChange
myhostnameto your hostname (Computer Name)
After that, open the file /etc/hosts and write (remember to change the myhostname to your own)
# IPv4 Hosts
127.0.0.1 localhost myhostname
# Machine FQDN
127.0.1.1 myhostname.localdomain myhostname
# IPv6 Hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Check the DNS again (using Google DNS). Open /etc/resolv.conf and write:
nameserver 8.8.8.8
nameserver 8.8.4.4
search example.com
Write to file /etc/modules-load.d/firewall.conf:
# iptables modules to run on boot
ip_tables
nf_conntrack_netbios_ns
nf_conntrack
Warning: this part is optional.
To avoid the beep on boot, Write to file /etc/modprobe.d/nobeep.conf:
# Dont run pcpkr module on boot
blacklist pcspkr
If you don't want a watchdog service running, write to file /etc/modprobe.d/nowatchdog.conf
blacklist iTCO_wdt
# mkinitcpio -p linuxInstall required packages with pacman
# pacman -S wireless_tools wpa_supplicant dialogNow enable wireless connection automatically on system boot (it will be disabled later)
- Go to
/etc/netctl(withcdcommand) - List profiles with
netctl list - Enable wifi-menu to automatically connect on boot:
# netctl enable wlp1s0-MyWiFi
Install Grub and efibootmgr:
# pacman -S grub efibootmgrRun grub automatic installation on disk:
# grub-install /dev/sdaCreate grub.cfg file:
# grub-mkconfig -o /boot/grub/grub.cfg# passwdInstall Xorg Server: (use default options)
# pacman -S xorg-serverDefine your keyboard layout on /etc/X11/xorg.conf.d/10-keyboard.conf file:
Section "InputClass"
Identifier "keyboard default"
MatchIsKeyboard "yes"
Option "XkbLayout" "br"
Option "XkbVariant" "abnt2"
EndSection
Install your GPU driver
# pacman -S xf86-video-vesaInstall audio driver
# pacman -S alsa-utilsConfigure and save:
# alsamixer
# alsactl storeInstall sudo package
# pacman -S sudoConfigure sudo (uses vim as default editor) by running visudo and uncommenting the line:
## Uncomment to allow members of group wheel to execute any command
%wheel ALL=(ALL) ALL
Now we're going to add a new user by running: (change myuser to your username)
# useradd -m -g users -G wheel myuserChange the new user passord:
# passwd myuserExit chroot environment by pressing Ctrl + D or typing exit
Unmount system mount points:
# umount -R /mntReboot system:
# rebootRemember to remove USB stick on reboot
Now you're on your successfull Arch Linux installation.
Login with your user and follow the next steps.
Now We're gonna install the Window Manager.
I'll show the steps to install Gnome.
First of all, run the installation command with pacman:
$ sudo pacman -S gnome gnome-extraWhen the installation finishes, enable gdm to be started with system on boot:
$ sudo systemctl enable gdm.serviceNow we'll remove the previously enabled service from netctl and the wifi-menu settings.
First ensures that the NetworkManager package is installed:
$ sudo pacman -S networkmanagerEnable and start NetworkManager service:
$ sudo systemctl enable NetworkManager.service
$ sudo systemctl start NetworkManager.serviceGo to /etc/netctl folder and see the connection files (the ones that starts with something like wlp1s0...)
Disable the netctl service that you've been enable previously:
$ sudo netctl diable wlp1s0-MyWiFiThen, remove all /etc/netctl folder and remove your connection file (the one that starts with something like wlp1s0...)
$ sudo rm wlp1s0... #-- replace with you wifi connection fileNow you can reboot the system (by running reboot) and everyting should be working fine.
Follow this tutorial
To connect the headphone:
- Install required packages:
$ sudo pacman -S pulseaudio pulseaudio-bluetooth pavucontrol bluez-utils
- Edit
/etc/pulse/system.paand add:load-module module-bluez5-device load-module module-bluez5-discover
- For GNOME users:
$ sudo mkdir -p ~gdm/.config/systemd/user $ ln -s /dev/null ~gdm/.config/systemd/user/pulseaudio.socket
- Connect to bluetooth device
$ bluetoothctl # power on # agent on # default-agent # scan on # pair HEADPHONE_MAC # trust HEADPHONE_MAC # connect HEADPHONE_MAC # quit
To auto switch to A2DP mode:
- Edit
/etc/pulse/default.paand add:.ifexists module-bluetooth-discover.so load-module module-bluetooth-discover load-module module-switch-on-connect # Add this line .endif - Modify (or create)
/etc/bluetooth/audio.confto auto select AD2P profile:[General] Disable=Headset - Reboot PC to apply changes
Hi, there are a few issues with your "guide"
I recommend sticking to our official installation guide instead of trying to build a custom guide out of that.
Either way, some of the issues are:
This is terribly misguided, as your guide does not actually mention what noatime does. If you want similar IO performance increases, without the drawbacks of noatime, consider using
relatimeinstead.Recommendation: Don't use
noatimeunless you know what you're doing. Userelatimemost of the time instead, and also read about the differences before using them.You definitely do not want
search example.com, as this delegates all non-FQDN DNS lookups to the zone for.example.com, potentially leaking your hostname lookup in the process - to both the DNS, and to the owner of example.com if the DNS replies with anything that isn'tNXDOMAIN.Recommendation: Omit the parameter entirely unless you know what you're doing (and if you do, example.com should definitely not be the argument to
search, unless you're running example.com or part of an organization that runs example.com)This is wrong. The primary source for this is referring to drive sectors, not virtually partitioned area.
An SSD that has the entire space partitioned will exhibit the same behavior as one that has 25% unpartitioned, except for - well - your partition being larger.
The detrimental effects of filling solid state storage beyond 75% that the primary sources for this are referencing may come into effect when your amount allocated sectors reach >75%, not the amount of logically partitioned sectors - i.e. when you fill your partition up.
Recommendation: Do not do anything special, but make sure your filesystem is properly TRIMming (i.e. via the
discardmount option, or a systemd timer). Detrimental effects of using TRIM or continuous discard have long since been fixed in storage controller firmware, and require no special handling by the user.Using 127.0.1.1 provides no real benefit as opposed to mapping all hostnames to 127.0.0.1 directly.
Recommendation: This can be consolidated into a single line.
127.0.0.1 localhost localhost.localdomain myhostname.localdomain myhostnameif you want to be explicit. Alternatively, /etc/hosts can be left empty entirely nowadays.This is unnecessary and error-prone.
Recommendation: Use
localectlinstead of manually writing these config files as follows:localectl set-locale locale, replacinglocalewith your target locale respectivelyThis is unnecessary and error-prone
Recommendation: Use
localectlinstead of manually writing these config files as follows:localectl set-keymap keymap, replacingkeymapwith your target keymap.This is unnecessary, error-prone, and creates maintenance burden in the future.
Recommendation: Use
localectlto set your keyboard layout(s) as follows:localectl set-x11-keymap layout, replacinglayoutwith your target layout respectively.Notice how I condensed the last 3 mentioned sections into 3 short (repeatable) commands instead of writing 3 different config files with different syntax.
This does not do anything useful but load the kernel modules unless you also configure the firewall backend.
Recommendation: Disregard this section entirely unless you know what you're doing. If you want a stupid firewall but don't know how to configure one, look into
ufwinstead.Vesa is most definitely the wrong driver for your target system.
Recommendation: Install the drivers for your actual hardware or do not install them at all (modesetting drivers are available by default)
Why bother with alsa, when the gnome configuration utilities that you are installing, and your 'Extras' section are exclusive to
pulseaudioRecommendation: Just install
pulseaudio, that's it...sudois part of base-devel and, if users are following your guide, will already be present on the system (seepacstrapand the arguments you pass)Recommendation: Remove this section
Why bother setting up one network management tool just to immediately replace it with another?
Recommendation: Install and enable NetworkManager (or your tool of choice) directly from the installation environment instead of reconfiguring everything twice...
no comment
-R