An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (2023)

Published: Nov. 2, 2021, 6 p.m.

Updated: April 9, 2023, 6 p.m.

The Arch wiki suggests a subvolume layout for an Arch system installed on a Btrfs subvolume for use with Snapper that sacrifices the ease of Snapper rollbacks and its full functionality for a simpler subvolume layout and a perceived streamlining of system restoration to a snapshot, but requires manually manipulating the snapshots from an external system via chroot or a live ISO.

This article presents a process for installing Arch Linux from an existing Linux installation using the Arch bootstrap environment, including a subvolume layout that is compatible with Snapper's required configuration for using the snapper rollback. A demonstration of the ease of a rollback which only requires the issuing of the command and a reboot is also presented.

Introduction

Numerous guides exist for setting up a Btrfs filesystem installation of Arch Linux to work in conjunction with Snapper for managing system snapshots and rollbacks. However, these guides suggest a Btrfs subvolume layout that does not allow a rollback that is initiated by booting into a read-only snapshot and issuing a single command snapper rollback to perform the rollback in the same manner as openSUSE. Instead these guides require a layout that requires manually manipulating subvolumes and snapshots from a chroot environment to replace a subvolume at / with a snapshot. By nature of the Btrfs filesystem and Snapper, the openSUSE layout also allows this type of manual manipulation, but it is not necessary.

An option to these guides is Garuda Linux -- reviewed in Garuda Linux Review [KDE Dragonized (D460nized),210621] -- an Arch system with a Btrfs filesystem in which rollbacks are initiated from a bootable snapshot configured out-of-the-box. Garuda, however, uses Timeshift to manage snapshots instead of Snapper -- which has more advanced features than Timeshift -- as in openSUSE.

This article provides a process for installing Arch on a Btrfs filesystem with a subvolume layout similar to openSUSE that is compatible with Snapper rollbacks from bootable snapshots. The subvolume layout and the mount points are illustrated in the following image.

An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (1)

The Snapper Compatible Btrfs Subvolume Layout

The process described in this article takes as a starting point the subvolume layout of openSUSE as described in Creating openSUSE-style btrfs root partition & subvolumes, modifying it as appropriate for an Arch system. There are two difficulties with the openSUSE subvolume layout, however. The first, with respect to installation, is due to a limitation in the way Snapper is initialized, and the second is due GRUB expecting a more typical subvolume layout when searching for the kernel in order to load it. Both of these problems are addressed in Arch-Setup-Script by GitHub user tommytran732, and the solutions incorporated into this guide.

Some items to note about the installation process described in this guide:

  • The installation is on two existing partitions, one partition for the filesystem hierarchy under /home, and the other for the filesystem hierarchy under / excluding /home. Both partitions will be reformatted by the process.
  • The installation is for UEFI systems in which an ESP partition is required. This partition is used in the installation to install a GRUB firmware bootloader.
  • Commands shown in this guide also display the prompt of the terminal in which I entered the commands. This helps to distinguish the environment in which the command is entered as the prompt sometimes changes with the environment and the PWD (Present Working DIrectory) displayed as part of the prompt also changes. For example, on the host system, the existing Linux installation, from which the installation is performed has the prompt:
    17:30:58 [brook@G5-openSUSE:~] $
    or
    [root:/home/brook/DataEXT4/SoftwareDownloads/arch] #
    when operating as the root user. The prompt changes to
    [root@G5-openSUSE /]# 
    when changing root to the Arch bootstrap environment. Be sure to omit the prompt if copying the commands.

Preliminary Tasks

Download archlinux-bootstrap Tarball

The mirror for downloading the image can be selected from the list on the Arch downloads page which lists mirrors by country under the section HTTP Direct Downloads. If you are on an Arch system choose the fastest mirror as determined by mirrorsort orreflector.

Clicking a link for a mirror will open a page similar to the second image, below, where either the archlinux live ISO or the archlinux-bootstrap tarball can be downloaded, as well as the GPG signatures for each. The second type of file is used for installations from an existing Linux installation. Note that the date in the name of the image file will change to whatever is current at the time you visit the mirror.

  • An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (2)
  • An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (3)

Downloading the Arch Linux Bootstrap Image

I use the Aria 2 command line download manager, a very good alternative to more common CLI download managers.

  1. Change directory to wherever you want to save the download.
    17:30:58 [brook@G5-openSUSE:~] $ cd DataEXT4/SoftwareDownloads/arch
    In my case this is ~/DataEXT4/SoftwareDownloads/arch
  2. Download the tarball of the ISO image.
    17:31:40 [brook@G5-openSUSE:~/DataEXT4/SoftwareDownloads/arch] $ aria2c -x 4 -s 4 https://mirrors.rit.edu/archlinux/iso/2021.09.01/archlinux-bootstrap-2021.09.01-x86_64.tar.gz
    The command with the output of aria2c:
    17:31:40 [brook@G5-openSUSE:~/DataEXT4/SoftwareDownloads/arch] $ aria2c -x 4 -s 4 https://mirrors.rit.edu/archlinux/iso/2021.09.01/archlinux-bootstrap-2021.09.01-x86_64.tar.gz09/24 17:41:55 [NOTICE] Downloading 1 item(s)[#abeda5 159MiB/163MiB(97%) CN:1 DL:5.2MiB] 09/24 17:42:20 [NOTICE] Download complete: /home/brook/DataEXT4/SoftwareDownloads/arch/archlinux-bootstrap-2021.09.01-x86_64.tar.gzDownload Results:gid |stat|avg speed |path/URI======+====+===========+=======================================================abeda5|OK | 6.5MiB/s|/home/brook/DataEXT4/SoftwareDownloads/arch/archlinux-bootstrap-2021.09.01-x86_64.tar.gzStatus Legend:(OK):download completed.
  3. Download the GPG signature of the tarball.
    17:42:20 [brook@G5-openSUSE:~/DataEXT4/SoftwareDownloads/arch] 25s $ aria2c -x 4 -s 4 https://mirrors.rit.edu/archlinux/iso/2021.09.01/archlinux-bootstrap-2021.09.01-x86_64.tar.gz.sig
    The output of the command will be similar to the above use of aria2c. There should now be two files in the current directory:
    17:44:49 [brook@G5-openSUSE:~/DataEXT4/SoftwareDownloads/arch] $ ls -ltotal 167076-rw-r--r-- 1 brook users 171078626 Sep 24 17:42 archlinux-bootstrap-2021.09.01-x86_64.tar.gz-rw-r--r-- 1 brook users 331 Sep 24 17:44 archlinux-bootstrap-2021.09.01-x86_64.tar.gz.sig
  4. Verify the authenticity of the image. The following command retrieves the necessary public key and verifies the file.
    17:46:37 [brook@G5-openSUSE:~/DataEXT4/SoftwareDownloads/arch] $ gpg --keyserver-options auto-key-retrieve --verify archlinux-bootstrap-2021.09.01-x86_64.tar.gz.sig
    The output is shown below. All that is necessary is the "Good signature from ..." The warning can be ignored.
    17:46:37 [brook@G5-openSUSE:~/DataEXT4/SoftwareDownloads/arch] $ gpg --keyserver-options auto-key-retrieve --verify archlinux-bootstrap-2021.09.01-x86_64.tar.gz.siggpg: assuming signed data in 'archlinux-bootstrap-2021.09.01-x86_64.tar.gz'gpg: Signature made Wed 01 Sep 2021 07:28:32 AM EDTgpg: using RSA key 4AA4767BBC9C4B1D18AE28B77F2D434B9741E8ACgpg: issuer "pierre@archlinux.de"gpg: key 7F2D434B9741E8AC: public key "Pierre Schmitz " importedgpg: Total number processed: 1gpg: imported: 1gpg: marginals needed: 3 completes needed: 1 trust model: pgpgpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2ugpg: next trustdb check due at 2022-08-09gpg: Good signature from "Pierre Schmitz " [unknown]gpg: WARNING: This key is not certified with a trusted signature!gpg: There is no indication that the signature belongs to the owner.Primary key fingerprint: 4AA4 767B BC9C 4B1D 18AE 28B7 7F2D 434B 9741 E8AC

Extract the Arch Bootstrap Image

Now, we extract the Arch bootstrap environment from the from the .tar.gz compressed tar file.

  1. Extract the tarball.
    17:53:07 [brook@G5-openSUSE:~/DataEXT4/SoftwareDownloads/arch] $ sudo tar xzf archlinux-bootstrap-2021.09.01-x86_64.tar.gz
    The command with the output:
    17:53:07 [brook@G5-openSUSE:~/DataEXT4/SoftwareDownloads/arch] $ sudo tar xzf archlinux-bootstrap-2021.09.01-x86_64.tar.gz[sudo] password for root: tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.security.capability'tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.security.capability'samp>
    Inside the current directory, there will now be a directory root.x86_64, which contains a filesystem hierarchy -- the Arch bootstrap image -- that we will change root into into and will essentially serve the same function as the Arch live ISO.

Other Preliminary Steps

At this point switch to the root user on the host system, if available, otherwise keep using sudo while still entering commands on the host system.

17:54:59 [brook@G5-openSUSE:~/DataEXT4/SoftwareDownloads/arch] $ suPassword:[root:/home/brook/DataEXT4/SoftwareDownloads/arch] #
  1. Edit the mirrorlist contained in the Arch bootstrap image, removing the leading "#" from lines that contain the desired mirror URL. I use the nano text editor for this.
    θ60° [root:/home/brook/DataEXT4/SoftwareDownloads/arch] # nano ./root.x86_64/etc/pacman.d/mirrorlist
  2. Deactivate swap on the host system so that it can be used when we mount the Arch bootstrap image, making it available for use in the installed system.
    [root:/home/brook/DataEXT4/SoftwareDownloads/arch] # swapoff --all
  3. Unmount the ESP.
    [root:/home/brook/DataEXT4/SoftwareDownloads/arch] # umount /boot/efi
  4. Mount the directory of the image to itself:
    [root:/home/brook/DataEXT4/SoftwareDownloads/arch] 32 # mount --bind /home/brook/DataEXT4/SoftwareDownloads/arch/root.x86_64/ /home/brook/DataEXT4/SoftwareDownloads/arch/root.x86_64/
    otherwise there may be errors such as
    ==> WARNING: /home/brook/DataEXT4/SoftwareDownloads/arch/root.x86_64/ is not a mountpoint. This may have undesirable side effects.
    when attempting to change root.

Installation Part I: Filesystem Setup and pacstrap Installation

On host system

Activate the Arch Bootstrap Environment

  1. Determine the appropriate method of changing root into bootstrap image -- as there are two possible depending on the capabilities of the unshare program available on the host system -- by using the unshare command, as in:
    unshare --help
    The command with the output:
    [root:/home/brook/DataEXT4/SoftwareDownloads/arch] # unshare --helpUsage: unshare [options] [&ltprogram&gt [&ltargument&gt...]]Run a program with some namespaces unshared from the parent.Options: -m, --mount[=&ltfile&gt] unshare mounts namespace -u, --uts[=&ltfile&gt] unshare UTS namespace (hostname etc) -i, --ipc[=&ltfile&gt] unshare System V IPC namespace -n, --net[=&ltfile&gt] unshare network namespace -p, --pid[=&ltfile&gt] unshare pid namespace -U, --user[=&ltfile&gt] unshare user namespace -C, --cgroup[=&ltfile&gt] unshare cgroup namespace -T, --time[=&ltfile&gt] unshare time namespace -f, --fork fork before launching &ltprogram&gt --map-user=&ltuid&gt|&ltname&gt map current user to uid (implies --user) --map-group=&ltgid&gt|&ltname&gt map current group to gid (implies --user) -r, --map-root-user map current user to root (implies --user) -c, --map-current-user map current user to itself (implies --user) --kill-child[=&ltsigname&gt] when dying, kill the forked child (implies --fork) defaults to SIGKILL --mount-proc[=<dir>] mount proc filesystem first (implies --mount) --propagation slave|shared|private|unchanged modify mount propagation in mount namespace --setgroups allow|deny control the setgroups syscall in user namespaces --keep-caps retain capabilities granted in user namespaces -R, --root=<dir> run the command with root directory set to <dir> -w, --wd=<dir> change working directory to <dir> -S, --setuid &ltuid&gt set uid in entered namespace -G, --setgid &ltgid&gt set gid in entered namespace --monotonic &ltoffset&gt set clock monotonic offset (seconds) in time namespaces --boottime &ltoffset&gt set clock boottime offset (seconds) in time namespaces -h, --help display this help -V, --version display versionFor more details see unshare(1).
    Verify that the command options
    --fork
    and
    --pid
    are available.If these options are available on the host system's unshare, program as indicated by the above output, the arch-chroot command included in the bootstrap image can be used, as below. Otherwise the traditional method of changing root is used with the following series of commands:
    mount --bind ./root.x86_64 /tmp/root.x86_64cd /tmp/root.x86_64cp /etc/resolv.conf etcmount -t proc /proc procmount --make-rslave --rbind /sys sysmount --make-rslave --rbind /dev devmount --make-rslave --rbind /run runchroot /tmp/root.x86_64
  2. Change root to the Arch bootstrap environment using arch-chroot command included in the bootstrap image.
    [root:/home/brook/DataEXT4/SoftwareDownloads/arch] # ./root.x86_64/bin/arch-chroot /home/brook/DataEXT4/SoftwareDownloads/arch/root.x86_64/
    The command with the output:
    [root:/home/brook/DataEXT4/SoftwareDownloads/arch] # ./root.x86_64/bin/arch-chroot /home/brook/DataEXT4/SoftwareDownloads/arch/root.x86_64/[root@G5-openSUSE /]#
    Note the change in the prompt.

In the Arch Bootstrap Environment

After the last command executed on the host system, we are now in the Arch bootstrap image activated through the changing root command above, arch-chroot, or if this method was determined to not be appropriate for the system, through the traditional method of changing root.

Initialize pacman and Install Needed Programs in the Bootstrap Environment

  1. Initialize pacman keys.
    [root@G5-openSUSE /]# pacman-key --init
    The command with the output:
    [root@G5-openSUSE /]# pacman-key --initgpg: /etc/pacman.d/gnupg/trustdb.gpg: trustdb createdgpg: no ultimately trusted keys foundgpg: starting migration from earlier GnuPG versionsgpg: porting secret keys from '/etc/pacman.d/gnupg/secring.gpg' to gpg-agentgpg: migration succeeded==> Generating pacman master key. This may take some time.gpg: Generating pacman keyring master key...gpg: key 99ADF834B8D42BD9 marked as ultimately trustedgpg: directory '/etc/pacman.d/gnupg/openpgp-revocs.d' createdgpg: revocation certificate stored as '/etc/pacman.d/gnupg/openpgp-revocs.d/4150675F845EAD056DDD09DB99ADF834B8D42BD9.rev'gpg: Done==> Updating trust database...gpg: marginals needed: 3 completes needed: 1 trust model: pgpgpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
  2. Populate the pacman keyring.
    [root@G5-openSUSE /]# pacman-key --populate archlinux
    The command with the output:
    [root@G5-openSUSE /]# pacman-key --populate archlinux==> Appending keys from archlinux.gpg...==> Locally signing trusted keys in keyring...gpg: checking the trustdbgpg: key 786C63F330D7CB92: no user ID for key signature packet of class 10gpg: key 786C63F330D7CB92: no user ID for key signature packet of class 10gpg: key 786C63F330D7CB92: no user ID for key signature packet of class 10... truncated ...gpg: key 1EB2638FF56C0C53: no user ID for key signature packet of class 10gpg: marginals needed: 3 completes needed: 1 trust model: pgpgpg: depth: 0 valid: 1 signed: 1 trust: 0-, 0q, 0n, 0m, 0f, 1ugpg: depth: 1 valid: 1 signed: 77 trust: 1-, 0q, 0n, 0m, 0f, 0ugpg: next trustdb check due at 2021-12-01gpg: checking the trustdbgpg: key 786C63F330D7CB92: no user ID for key signature packet of class 10... truncated ...gpg: key 1EB2638FF56C0C53: no user ID for key signature packet of class 10gpg: key 1EB2638FF56C0C53: no user ID for key signature packet of class 10gpg: marginals needed: 3 completes needed: 1 trust model: pgpgpg: depth: 0 valid: 1 signed: 5 trust: 0-, 0q, 0n, 0m, 0f, 1ugpg: depth: 1 valid: 5 signed: 83 trust: 5-, 0q, 0n, 0m, 0f, 0ugpg: next trustdb check due at 2021-12-01-> Locally signed 6 keys.==> Importing owner trust values...gpg: setting ownertrust to 4gpg: setting ownertrust to 4gpg: setting ownertrust to 4gpg: setting ownertrust to 4gpg: inserting ownertrust of 4gpg: setting ownertrust to 4==> Disabling revoked keys in keyring...gpg: checking the trustdbgpg: key 786C63F330D7CB92: no user ID for key signature packet of class 10gpg: key 786C63F330D7CB92: no user ID for key signature packet of class 10... truncated ...gpg: key 1EB2638FF56C0C53: no user ID for key signature packet of class 10gpg: marginals needed: 3 completes needed: 1 trust model: pgpgpg: depth: 0 valid: 1 signed: 6 trust: 0-, 0q, 0n, 0m, 0f, 1ugpg: depth: 1 valid: 6 signed: 83 trust: 0-, 0q, 0n, 6m, 0f, 0ugpg: depth: 2 valid: 78 signed: 25 trust: 78-, 0q, 0n, 0m, 0f, 0ugpg: next trustdb check due at 2021-12-01
  3. Refresh the package database.
    [root@G5-openSUSE /]# pacman -Syy
    The command with the output:
    [root@G5-openSUSE /]# pacman -Syy:: Synchronizing package databases... core 137.2 KiB 252 KiB/s 00:01 [##############################################] 100% extra 1572.0 KiB 2015 KiB/s 00:01 [##############################################] 100% community 5.8 MiB 2.06 MiB/s 00:03 [##############################################] 100%
  4. Install needed programs into the bootstrap image.
    [root@G5-openSUSE /]# pacman -S btrfs-progs nano which tree
    (Also install tree, not shown in the command.) The command with the output:
    [root@G5-openSUSE /]# pacman -S btrfs-progs nano which treeresolving dependencies...looking for conflicting packages...Packages (5) lzo-2.10-3 btrfs-progs-5.14.1-1 nano-5.8-1 tree-1.8.0-2 which-2.21-5Total Download Size: 1.55 MiBTotal Installed Size: 7.96 MiB:: Proceed with installation? [Y/n] :: Retrieving packages...... truncated ...:: Processing package changes...(1/5) installing lzo [##############################################] 100%(2/5) installing btrfs-progs [##############################################] 100%Optional dependencies for btrfs-progs python: libbtrfsutil python bindings e2fsprogs: btrfs-convert [installed] reiserfsprogs: btrfs-convert(3/5) installing nano [##############################################] 100%(4/5) installing which [##############################################] 100%(5/5) installing tree [##############################################] 100%:: Running post-transaction hooks...(1/3) Reloading system manager configuration... Skipped: Running in chroot.(2/3) Reloading device manager configuration... Skipped: Running in chroot.(3/3) Arming ConditionNeedsUpdate...

Make Filesystems

We now reformat two existing partitions (all data will be lost on these partitions) for use as our installation targets. As mentioned before, one will be used for the filesystem hierarchy at /home and the other for the filesystem hierarchy at / excluding /home.

  1. Make the Btrfs filesystem for /, noting the UUID in the output.
    [root@G5-openSUSE /]# mkfs.btrfs -L ARCH-B-ROOT -f -n 32k /dev/nvme0n1p7
    The -f option is necessary to force the creation of a new filesystem if there is an existing filesystem on the partition. The option -n 32k specifies the node size for metadata, with possible values ranging from 16k to 64k. This value represents a tradeoff compromise between the benefits and detriments of the minimum and maximum possible values. The Arch wiki page on Btrfs:
    According to man mkfs.btrfs(8) § OPTIONS, "[a] smaller node size increases fragmentation but leads to taller b-trees which in turn leads to lower locking contention. Higher node sizes give better packing and less fragmentation at the cost of more expensive memory operations while updating the metadata blocks".
    The command with the output:
    [root@G5-openSUSE /]# mkfs.btrfs -L ARCH-B-ROOT -f -n 32k /dev/nvme0n1p7btrfs-progs v5.14.1 See http://btrfs.wiki.kernel.org for more information.Detected a SSD, turning off metadata duplication. Mkfs with -m dup if you want to force metadata duplication.Label: ARCH-B-ROOTUUID: eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224bNode size: 32768Sector size: 4096Filesystem size: 68.36GiBBlock group profiles: Data: single 8.00MiB Metadata: single 8.00MiB System: single 4.00MiBSSD detected: yesZoned device: noIncompat features: extref, skinny-metadataRuntime features: Checksum: crc32cNumber of devices: 1Devices: ID SIZE PATH 1 68.36GiB /dev/nvme0n1p7
  2. Make an ext4 filesystem for /home, noting the UUID.
    [root@G5-openSUSE /]# mkfs.ext4 -L ARCH-B-HOME /dev/sda5
    The command with the output:
    [root@G5-openSUSE /]# mkfs.ext4 -L ARCH-B-HOME /dev/sda5mke2fs 1.46.4 (18-Aug-2021)/dev/sda5 contains a ext4 file system labelled 'ARCH-B-HOME' last mounted on /home on Sat Oct 2 23:26:04 2021Proceed anyway? (y,N) yDiscarding device blocks: done Creating filesystem with 5505024 4k blocks and 1376256 inodesFilesystem UUID: 7d4a342f-fe14-47f4-89db-53cb7e700272Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): doneWriting superblocks and filesystem accounting information: done 
  3. Get the UUID of the ESP of the computer.
    [root@G5-openSUSE /]# lsblk -o UUID /dev/nvme0n1p1 | grep -v UUID
    The command with the output:
    [root@G5-openSUSE /]# lsblk -o UUID /dev/nvme0n1p1 | grep -v UUID3E5E-D18F
  4. Get the UUID of swap partition.
    [root@G5-openSUSE /]# lsblk -o UUID /dev/sda8 | grep -v UUID
    The command with the output:
    [root@G5-openSUSE /]# lsblk -o UUID /dev/sda8 | grep -v UUIDdb67ee67-01d7-494e-bc12-e5c122ffe6de

Create Subvolumes

  1. Verify that nothing is mounted at /mnt in the bootstrap environment.
    [root@G5-openSUSE /]# mount | grep mnt
    The output should be empty.
  2. Mount the newly created Btrfs filesystem.
    [root@G5-openSUSE /]# mount UUID=eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b /mnt
    There will be no output if there are no errors. Since this is a newly created Btrfs filesystem, when mounted without options the main subvolume (subvolid=5, synonymous with subvolid=0 in older versions of Btrfs) is the one that is attached to the mount point /mnt. When we create other subvolumes after mounting it, it will be the parent of those subvolumes.
  3. Verify that the mount was successful and view the result of the mount operation.
    [root@G5-openSUSE /]# mount | grep mnt
    The command with the output:
    [root@G5-openSUSE /]# mount | grep mnt/dev/nvme0n1p7 on /mnt type btrfs (rw,relatime,ssd,space_cache,subvolid=5,subvol=/)
    We see that the mounted subvolume is the main subvolume created by the mkfs.btrfs command as part of the filesystem creation. This main subvolume always has subvolid of 5 and has the subvolume name /. These properties are mount options as are the other values in the parentheses. Had there been other subvolumes besides the default and we wanted to mount them, we would have had to specify these subvolume identifiers in the mount.
  4. Make the @ subvolume.
    [root@G5-openSUSE /]# btrfs subvolume create /mnt/@
    The command with the output:
    [root@G5-openSUSE /]# btrfs subvolume create /mnt/@Create subvolume '/mnt/@'
    This subvolume will be a child of of the main subvolume (subvolid=5). When we create other subvolumes in it, as indicated by the path in the btrfs subvolume create command, it will be the parent of those subvolumes. The first subvolume created inside the main subvolume will always be given the subvolid of 256 (subvolid=256) and subsequently created subvolumes will increment by 1. We can verify the created subvolume with the btrfs subvolume list command, as in:
    [root@G5-openSUSE /]# btrfs subvolume list /mnt
    The command with the output:
    [root@G5-openSUSE /]# btrfs subvolume list /mntID 256 gen 8 top level 5 path @
    The output shows the subvolumes extant in the filesystem. It gives the subvolume id of the subvolumes, the subvolume id of a subvolume's parent, and the path relative to the main subvolume. The output lists only one item -- the subvolume we just created -- since there is only one subvolume at this time.(besides the main subvolume (subvolid=5) that is created at filesystem creation).
  5. Create a subvolume for snapshots named /.snapshots with the path /@/.snapshots. Since the filesystem is mounted at /mnt and the subvolume attached to /mnt is the main subvolume, the subvolume path /@/.snapshots is equivalent to /mnt/@/.snapshots
    [root@G5-openSUSE /]# btrfs subvolume create /mnt/@/.snapshots
    Note that at this point we have made a subvolume .snapshots with the path /@/.snapshotsbut we have not made a directory named .snapshots. However if we execute
    ls -la /mnt/@
    one of the listed directories is .snapshots This is an important detail that illustrates that subvolumes behave like directories to a certain extent. Another related detail will be apparent after we make our next subvolume.
  6. Create a subvolume for the initial snapshot which will be the target of the installation. First a directory inside the /@/.snapshots subvolume (accessed as /mnt/@/.snapshots inside our chroot environment) needs to be created that conforms to Snapper's expectations, which is that there exists a directory with the same name as the snapshot number within the /@/.snapshots subvolume for each snapshot. Create the directory with:
    [root@G5-openSUSE /]# mkdir /mnt/@/.snapshots/1
    Then create the subvolume:
    [root@G5-openSUSE /]# btrfs subvolume create /mnt/@/.snapshots/1/snapshot
  7. Create a subvolume for the filesystem hierarchy in and under /boot/grub/. This will first require a directory/boot/ to be created. Make the directory with:
    [root@G5-openSUSE /]# mkdir /mnt/@/boot
    Then create the subvolume:
    [root@G5-openSUSE /]# btrfs subvolume create /mnt/@/boot/grub
  8. Create the /@/opt subvolume for the filesystem hierarchy under /opt. This will exclude /opt and the filesystem hierarchy beneath it to be excluded from snapshots.
    [root@G5-openSUSE /]# btrfs subvolume create /mnt/@/opt
  9. Create the /@/root subvolume for the filesystem hierarchy under /root. This will exclude /root and the filesystem hierarchy beneath it to be excluded from snapshots.
    [root@G5-openSUSE /]# btrfs subvolume create /mnt/@/root
  10. Create the /@/srv subvolume for the filesystem hierarchy under /srv. This will exclude /srv and the filesystem hierarchy beneath it to be excluded from snapshots.
    [root@G5-openSUSE /]# btrfs subvolume create /mnt/@/srv
  11. Create the /@/tmp subvolume for the filesystem hierarchy under /tmp. This will exclude /tmp and the filesystem hierarchy beneath it to be excluded from snapshots.
    [root@G5-openSUSE /]# btrfs subvolume create /mnt/@/tmp
  12. Create a subvolume for filesystem hierarchy in and under /usr/local. This will first require a directory to be created at /@/usr. First create the directory:
    [root@G5-openSUSE /]# mkdir /mnt/@/usr
    Then create the subvolume:
    [root@G5-openSUSE /]# btrfs subvolume create /mnt/@/usr/local
  13. Create the /@/var/cache subvolume for filesystem hierarchy in and under /var/cache. This will first require a directory to be created at /@/var. where the subvolume will be created. The other subvolumes under /@/var will also be created at this location.
    [root@G5-openSUSE /]# mkdir /mnt/@/var
    Then create the subvolume
    [root@G5-openSUSE /]# btrfs subvolume create /mnt/@/var/cache
  14. Create the /@/var/log subvolume for filesystem hierarchy in and under /var/log.
    [root@G5-openSUSE /]# btrfs subvolume create /mnt/@/var/log
  15. Create the /@/var/spool subvolume for filesystem hierarchy in and under /var/spool
    [root@G5-openSUSE /]# btrfs subvolume create /mnt/@/var/spool
  16. Create the /@/var/tmp subvolume for filesystem hierarchy in and under /var/tmp.
    [root@G5-openSUSE /]# btrfs subvolume create /mnt/@/var/tmp
  17. Snapper stores metadata for each snapshot in the snapshot's directory /@/.snapshots/# where "#" represents the snapshot number in an .xml file. For our initial snapshot this will be /@/.snapshots/1 One of the metadata items is the snapshot creation time, in the format YYYY-MM-DD HH:MM:SS. The current date and time string in the appropriate format can be obtained with the command:
    [root@G5-openSUSE /]# date +"%Y-%m-%d %H:%M:%S"
    Create the metadata required by Snapperfor the initial installation snapshot.
    [root@G5-openSUSE /]# nano /mnt/@/.snapshots/1/info.xml
    Add the following, replacing 2021-09-23 21:56:17 with your current time and date string.
    <?xml version="1.0"?><snapshot><type>single</type><num>1</num><date>2021-09-23 21:56:17</date><description>First Root Filesystem Created at Installation</description></snapshot>
  18. Next, we set the default subvolume to the initial installation snapshot. Remember that a snapshot is just a subvolume. The terms "snapshot" just makes it clear that it is a subvolume that is a copy of another subvolume made at a certain point in time that reflects its state at that time. Before we set new default subvolume, it is informative to get the current default subvolume before we make changes and compare it with that after we make changes. This can be done with the command btrfs subvolume get-default
    [root@G5-openSUSE /]# btrfs subvolume get-default /mnt
    The command with the output:
    [root@G5-openSUSE /]# btrfs subvolume get-default /mntID 5 (FS_TREE)
    The output indicates that the default subvolume is the one with ID 5 (subvolid=5). As mentioned previously, the subvolume ID of 5 is always reserved for the subvolume created at the same time as the Btrfs filesystem when the filesystem is created with the mkfs.btrfs command. Make the initial snapshot subvolume, /@/mnt/.snapshots/1/snapshot, the default subvolume.
    [root@G5-openSUSE /]# btrfs subvolume set-default $(btrfs subvolume list /mnt | grep "@/.snapshots/1/snapshot" | grep -oP '(?<=ID )[0-9]+') /mnt
    After setting the subvolume that will be the target of the initial installation's filesystem hierarchy root, running the command to get the default subvolume yields:
    [root@G5-openSUSE /]# btrfs subvolume get-default /mntID 258 gen 12 top level 257 path @/.snapshots/1/snapshot
    Now the default subvolume is the one with an ID of 258 and the subvolume path /@/.snapshots/1/snapshot. Now if we were to mount the Btrfs partition as we did above, without any mount options to identify the subvolume, this subvolume would be attached to /mnt instead of the main subvolume (subvolid=5).
  19. Optionally, enable quotas in the Btrfs filesystem.
    [root@G5-openSUSE /]# btrfs quota enable /mnt
    Quota's are required for the Snapper's snapshot cleanup algorithms that are based on an awareness of space on thefilesystem. The Btrfs wiki does list some known issues to be aware of before enabling qgroups. man btrfs-qgroup also has a warning regarding btrfs qgroup.
  20. Disable copy-on-write for the /@/var subvolumes this will require the nodatacow mount option, which will disable compression for these subvolumes.
    [root@G5-openSUSE /]# chattr +C /mnt/@/var/cache
    [root@G5-openSUSE /]# chattr +C /mnt/@/var/log
    [root@G5-openSUSE /]# chattr +C /mnt/@/var/spool
    [root@G5-openSUSE /]# chattr +C /mnt/@/var/tmp
  21. Verify the created subvolumes with the btrfs subvolume list command.
    [root@G5-openSUSE /]# btrfs subvolume list /mnt
    The command with the output:
    [root@G5-openSUSE /]# btrfs subvolume list /mntID 256 gen 22 top level 5 path @ID 257 gen 23 top level 256 path @/.snapshotsID 258 gen 10 top level 257 path @/.snapshots/1/snapshotID 259 gen 12 top level 256 path @/boot/grubID 260 gen 13 top level 256 path @/optID 261 gen 14 top level 256 path @/rootID 262 gen 15 top level 256 path @/srvID 263 gen 16 top level 256 path @/tmpID 264 gen 17 top level 256 path @/usr/localID 265 gen 26 top level 256 path @/var/cacheID 266 gen 26 top level 256 path @/var/logID 267 gen 27 top level 256 path @/var/spoolID 268 gen 27 top level 256 path @/var/tmp
    Note that the main subvolume is mounted at /mnt and it is not shown in the list. The first subvolume created (ID 256) is a child of the main subvolume (ID 5) as indicated by the "top level 5" The top level ... in the remaining output lines similarly show that each subvolume is a child of the /@ subvolume (ID 256), except the /@/.snapshots/1/snapshot (ID 258) which is a child of the /@/.snapshots subvolume (ID 257). Compare the subvolume list to the output of the directory listings at /mnt, where the main subvolume is attached and at /mnt/@ whcih is the first subvolume created under the main subvolume, as shown in the following listing.
    [root@G5-openSUSE /]# ls -la /mnttotal 36drwxr-xr-x 1 root root 2 Oct 3 08:12 .drwxr-xr-x 17 root root 4096 Oct 3 08:21 ..drwxr-xr-x 1 root root 66 Oct 3 08:33 @[root@G5-openSUSE /]# ls -la /mnt/@total 32drwxr-xr-x 1 root root 66 Oct 3 08:33 .drwxr-xr-x 1 root root 2 Oct 3 08:12 ..drwxr-xr-x 1 root root 2 Oct 3 08:22 .snapshotsdrwxr-xr-x 1 root root 8 Oct 3 08:29 bootdrwxr-xr-x 1 root root 0 Oct 3 08:31 optdrwxr-xr-x 1 root root 0 Oct 3 08:31 rootdrwxr-xr-x 1 root root 0 Oct 3 08:31 srvdrwxr-xr-x 1 root root 0 Oct 3 08:32 tmpdrwxr-xr-x 1 root root 10 Oct 3 08:32 usrdrwxr-xr-x 1 root root 32 Oct 3 08:33 var
  22. Unmount the Btrfs filesystem.
    [root@G5-openSUSE /]# umount /mnt
  23. Verify that the Btrfs filesystem is unmounted.
    [root@G5-openSUSE /]# mount | grep mnt
    The output should be empty.

Mount the Btrfs Filesystem

Mount the Btrfs filesystem again. Unlike the previous time, when we mount it this time, since we have set the default subvolume, the subvolumeattached to /mnt will be the subvolume @/.snapshots/1/snapshot with a subvolume ID of 258 and not the main subvolume with a subvolume ID of 5.

[root@G5-openSUSE /]# mount UUID=eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b -o compress=zstd /mnt

We can verify the mounted subvolume with:

[root@G5-openSUSE /]# mount | grep /mnt

The command with the output:

[root@G5-openSUSE /]# mount | grep mnt/dev/nvme0n1p7 on /mnt type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=258,subvol=/@/.snapshots/1/snapshot)

As expected the mounted subvolume is the subvolume set as default previously, the subvolume that will act as an initial snapshot which will be the target of our installation's root filesystem hierarchy. Note that when we mounted the filesystem the option compress=zstd is used, causing files written to the partition to be compressed in the zstd compression format. Also note that, as indicated in the output to mount | grep mnt, the default zstd compression level was automatically set by mount to the default level of 3 from a possible range of 1 to 15, where a level of 1 compresses files the least, but has the lowest overhead for the compression operations in terms of memory and CPU resources, and a compression level of 15 compresses files the most but has the highest overhead costs in terms of memory and CPU resource use. Also as indicated in the output other options were automatically set by mount including the option ssd which tailors operation of the filesystem to the automatically detected SSD.

Make Mountpoints for Subvolumes

The previously created directories @/.snapshots/1, @/usr, @/boot/grub when the main subvolume (subvolid=5) was mounted at /mnt only exist within that subvolume and were only created to make subvolumes within it. They do not exist in the subvolume currently mounted at /mnt (subvolid=258, @/.snapshots/1/snapshot). We can verify that this is true with:

[root@G5-openSUSE /]# ls -la /mnt

The output is empty:

[root@G5-openSUSE /]# ls -la /mnttotal 4drwxr-xr-x 1 root root 0 Oct 3 08:23 .drwxr-xr-x 17 root root 4096 Oct 3 08:21 ..

So we need to make mountpoints for the subvolumes to be mounted at hierarchy locations under / for our installation process and for when this subvolume (subvolid=258) is mounted at / in our installed system.

We will also make mountpoints for the partition for home and the ESP partition.

  1. Make a mount point for the @/.snapshots subvolume.
    [root@G5-openSUSE /]# mkdir /mnt/.snapshots
  2. Make a mount point for the @/boot/grub subvolume. Since /boot does not exist in the current mounted subvolume, the -p option is used to make it while making /boot/grub.
    [root@G5-openSUSE /]# mkdir -p /mnt/boot/grub
  3. Make a mount point for the @/opt subvolume.
    [root@G5-openSUSE /]# mkdir /mnt/opt
  4. Make a mount point for the @/root subvolume.
    [root@G5-openSUSE /]# mkdir /mnt/root
  5. Make a mount point for the @/srv subvolume.
    [root@G5-openSUSE /]# mkdir /mnt/srv
  6. Make a mount point for the @/tmp subvolume.
    [root@G5-openSUSE /]# mkdir /mnt/tmp
  7. Make a mount point for the @/usr/local subvolume.
    [root@G5-openSUSE /]# mkdir -p /mnt/usr/local
  8. Make a mount point for the @/var/cache subvolume.
    [root@G5-openSUSE /]# mkdir -p /mnt/var/cache
  9. Make a mount point for the @/var/log subvolume.
    [root@G5-openSUSE /]# mkdir /mnt/var/log
  10. Make a mount point for the @/var/spool subvolume.
    [root@G5-openSUSE /]# mkdir /mnt/var/spool
  11. Make a mount point for the @/var/tmp subvolume.
    [root@G5-openSUSE /]# mkdir /mnt/var/tmp
  12. Make a mountpoint for the ESP (EFI System Partition).
    [root@G5-openSUSE /]# mkdir /mnt/efi
  13. Make a mount point for the /home partition.
    [root@G5-openSUSE /]# mkdir /mnt/home
  14. Verify that all of the mountpoints were created successfully by using the tree command. The command with the output:
    [root@G5-openSUSE /]# tree -L 3 /mnt/mnt|-- boot| `-- grub|-- efi|-- home|-- opt|-- root|-- srv|-- tmp|-- usr| `-- local`-- var |-- cache |-- log |-- spool `-- tmp15 directories, 0 files

Mount the Subvolumes and Partitions

We now mount the subvolumes to the mount points. When we mount the subvolumes now we are using the subvolume names as subvolume identifiers in the mount options (e.g. subvol=@/var/cache). The subvolume ID could have been used instead of, or in addition to the subvolume name (e.g. subvolid=265,subvol=@/var/cache). We also specify the compress=zstd option for all subvolumes and the nodatacow for the @/var/XXX subvolumes.

  1. Mount the @/.snapshots subvolume.
    [root@G5-openSUSE /]# mount UUID=eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b -o subvol=@/.snapshots,compress=zstd /mnt/.snapshots 
  2. Mount the @/boot/grub subvolume.
    [root@G5-openSUSE /]# mount UUID=eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b -o subvol=@/boot/grub,compress=zstd /mnt/boot/grub
  3. Mount the @/opt subvolume
    [root@G5-openSUSE /]# mount UUID=eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b -o subvol=@/opt,compress=zstd /mnt/opt
  4. Mount the @/root subvolume
    [root@G5-openSUSE /]# mount UUID=eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b -o subvol=@/root,compress=zstd /mnt/root
  5. Mount the @/srv subvolume
    [root@G5-openSUSE /]# mount UUID=eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b -o subvol=@/srv,compress=zstd /mnt/srv
  6. Mount the @/tmp subvolume
    [root@G5-openSUSE /]# mount UUID=eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b -o subvol=@/tmp,compress=zstd /mnt/tmp
  7. Mount the @/usr/local subvolume
    [root@G5-openSUSE /]# mount UUID=eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b -o subvol=@/usr/local,compress=zstd /mnt/usr/local
  8. Mount the @/var/cache subvolume
    [root@G5-openSUSE /]# mount UUID=eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b -o subvol=@/var/cache,nodatacow /mnt/var/cache
  9. Mount the @/var/log subvolume
    [root@G5-openSUSE /]# mount UUID=eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b -o subvol=@/var/log,nodatacow /mnt/var/log
  10. Mount the @/var/spool subvolume
    [root@G5-openSUSE /]# mount UUID=eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b -o subvol=@/var/spool,nodatacow /mnt/var/spool
  11. Mount the @/var/tmp subvolume
    [root@G5-openSUSE /]# mount UUID=eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b -o subvol=@/var/tmp,nodatacow /mnt/var/tmp
  12. Mount the ESP partition.
    [root@G5-openSUSE /]# mount UUID=3E5E-D18F /mnt/efi
  13. Mount the partition for /home.
    [root@G5-openSUSE /]# mount UUID=7d4a342f-fe14-47f4-89db-53cb7e700272 /mnt/home
  14. Activate the swap partition.
    [root@G5-openSUSE /]# swapon UUID=db67ee67-01d7-494e-bc12-e5c122ffe6de

pacstrap Installation

Now that our Btrfs filesystem has been configured and mounted, as well as our other partitions for /home, the ESP, and the swap partition has been activated, we our ready to install using the pacstrap command included in the bootstrap environment. Below, we install various sets of packages with separate invocations of pacstrap, but all desired packages can be installed in one pacstrap invocation. Also, if using separate pacstrap invocations all of the desired optional dependencies from those indicated in the output could be installed at the same time with one last pacstrap invocation instead of a series of two pacstrap commands, where the first installs the desired packages and the second installs the desired optional dependencies of packages installed in the first command.

  1. Install the base system, the kernel, the processor microcode, firmware, filesystem utilities, including those necessary for Btrfs, sudo, and a text editor.
    [root@G5-openSUSE /]# pacstrap /mnt base linux linux-firmware intel-ucode btrfs-progs ntfs-3g sudo nano
    Note the warnings, notifications of optional dependencies, so we can address them later. The command with the output
    [root@G5-openSUSE /]# pacstrap /mnt base linux linux-lts linux-firmware intel-ucode btrfs-progs ntfs-3g sudo nano==> Creating install root at /mnt==> Installing packages to /mnt:: Synchronizing package databases... core 137.3 KiB 140 KiB/s 00:01 [##############################################] 100% extra 1572.2 KiB 2.02 MiB/s 00:01 [##############################################] 100% community 5.8 MiB 9.61 MiB/s 00:01 [##############################################] 100%resolving dependencies...:: There are 3 providers available for initramfs::: Repository core 1) mkinitcpio:: Repository extra 2) booster 3) dracutEnter a number (default=1): looking for conflicting packages...Packages (123) acl-2.3.1-1 archlinux-keyring-20210902-1 argon2-20190702-3 attr-2.5.1-1 audit-3.0.5-1 bash-5.1.008-1 brotli-1.0.9-4 bzip2-1.0.8-4 ca-certificates-20210603-1 ca-certificates-mozilla-3.70-1 ca-certificates-utils-20210603-1 coreutils-9.0-2 cryptsetup-2.4.1-1 curl-7.79.1-1 dbus-1.12.20-1 device-mapper-2.03.13-1 diffutils-3.8-1 e2fsprogs-1.46.4-1 expat-2.4.1-1 file-5.40-6 filesystem-2021.05.31-1 findutils-4.8.0-1 fuse-common-3.10.5-1 fuse2-2.9.9-4 gawk-5.1.0-1 gcc-libs-11.1.0-1 gettext-0.21-1 glib2-2.70.0-1 glibc-2.33-5 gmp-6.2.1-1 gnupg-2.2.29-1 gnutls-3.7.2-2 gpgme-1.16.0-1 grep-3.7-1 gzip-1.11-1 hwids-20210613-1 iana-etc-20210903-1 icu-69.1-1 iproute2-5.14.0-1 iptables-1:1.8.7-1 iputils-20210722-1 json-c-0.15-1 kbd-2.4.0-2 keyutils-1.6.3-1 kmod-29-1 krb5-1.19.2-1 less-1:590-1 libarchive-3.5.2-1 libassuan-2.5.5-1 libcap-2.58-1 libcap-ng-0.8.2-3 libcroco-0.6.13-2 libelf-0.185-1 libffi-3.3-4 libgcrypt-1.9.4-1 libgpg-error-1.42-1 libidn2-2.3.2-1 libksba-1.6.0-1 libldap-2.4.59-2 libmnl-1.0.4-3 libnetfilter_conntrack-1.0.8-1 libnfnetlink-1.0.1-4 libnftnl-1.2.0-1 libnghttp2-1.45.0-1 libnl-3.5.0-3 libp11-kit-0.24.0-1 libpcap-1.10.1-1 libpsl-0.21.1-1 libsasl-2.1.27-3 libseccomp-2.5.2-1 libsecret-0.20.4-1 libssh2-1.10.0-1 libtasn1-4.17.0-1 libtirpc-1.3.2-1 libunistring-0.9.10-3 libxcrypt-4.4.26-1 libxml2-2.9.12-2 licenses-20200427-1 linux-api-headers-5.12.3-1 lz4-1:1.9.3-2 lzo-2.10-3 mkinitcpio-30-2 mkinitcpio-busybox-1.33.1-1 mpfr-4.1.0.p13-1 ncurses-6.2-2 nettle-3.7.3-1 npth-1.6-3 openssl-1.1.1.l-1 p11-kit-0.24.0-1 pacman-6.0.1-2 pacman-mirrorlist-20210822-1 pam-1.5.2-1 pambase-20210605-2 pciutils-3.7.0-1 pcre-8.45-1 pcre2-10.37-1 pinentry-1.1.1-1 popt-1.18-1 procps-ng-3.3.17-1 psmisc-23.4-1 readline-8.1.001-1 sed-4.8-1 shadow-4.8.1-4 sqlite-3.36.0-1 systemd-249.4-1 systemd-libs-249.4-1 systemd-sysvcompat-249.4-1 tar-1.34-1 tzdata-2021b-1 util-linux-2.37.2-1 util-linux-libs-2.37.2-1 xz-5.2.5-2 zlib-1:1.2.11-4 zstd-1.5.0-1 base-2-2 btrfs-progs-5.14.1-1 intel-ucode-20210608-1 linux-5.14.8.arch1-1 linux-firmware-20210919.d526e04-1 linux-lts-5.10.70-1 nano-5.8-1 ntfs-3g-2021.8.22-1 sudo-1.9.8.p2-1Total Download Size: 501.63 MiBTotal Installed Size: 1408.95 MiB:: Proceed with installation? [Y/n] :: Retrieving packages...... truncated ...:: Processing package changes...( 1/123) installing iana-etc [##############################################] 100%( 2/123) installing filesystem [##############################################] 100%warning: directory permissions differ on /mnt/root/filesystem: 755 package: 750warning: directory permissions differ on /mnt/var/tmp/filesystem: 755 package: 1777( 3/123) installing linux-api-headers [##############################################] 100%( 4/123) installing tzdata [##############################################] 100%( 5/123) installing glibc [##############################################] 100%Optional dependencies for glibc gd: for memusagestat( 6/123) installing gcc-libs [##############################################] 100%( 7/123) installing ncurses [##############################################] 100%Optional dependencies for ncurses bash: for ncursesw6-config [pending]( 8/123) installing readline [##############################################] 100%( 9/123) installing bash [##############################################] 100%Optional dependencies for bash bash-completion: for tab completion( 10/123) installing attr [##############################################] 100%( 11/123) installing acl [##############################################] 100%( 12/123) installing gmp [##############################################] 100%( 13/123) installing util-linux-libs [##############################################] 100%( 14/123) installing e2fsprogs [##############################################] 100%( 15/123) installing openssl [##############################################] 100%Optional dependencies for openssl ca-certificates [pending] perl( 16/123) installing libsasl [##############################################] 100%( 17/123) installing libldap [##############################################] 100%( 18/123) installing keyutils [##############################################] 100%( 19/123) installing krb5 [##############################################] 100%( 20/123) installing libtirpc [##############################################] 100%( 21/123) installing pambase [##############################################] 100%( 22/123) installing libcap-ng [##############################################] 100%( 23/123) installing audit [##############################################] 100%( 24/123) installing libxcrypt [##############################################] 100%( 25/123) installing pam [##############################################] 100%( 26/123) installing libcap [##############################################] 100%( 27/123) installing coreutils [##############################################] 100%( 28/123) installing zlib [##############################################] 100%( 29/123) installing xz [##############################################] 100%( 30/123) installing bzip2 [##############################################] 100%( 31/123) installing libseccomp [##############################################] 100%( 32/123) installing file [##############################################] 100%( 33/123) installing findutils [##############################################] 100%( 34/123) installing mpfr [##############################################] 100%( 35/123) installing gawk [##############################################] 100%( 36/123) installing pcre [##############################################] 100%( 37/123) installing grep [##############################################] 100%( 38/123) installing libgpg-error [##############################################] 100%( 39/123) installing libgcrypt [##############################################] 100%( 40/123) installing libtasn1 [##############################################] 100%( 41/123) installing libffi [##############################################] 100%( 42/123) installing libp11-kit [##############################################] 100%( 43/123) installing lz4 [##############################################] 100%( 44/123) installing zstd [##############################################] 100%( 45/123) installing systemd-libs [##############################################] 100%( 46/123) installing procps-ng [##############################################] 100%( 47/123) installing sed [##############################################] 100%( 48/123) installing tar [##############################################] 100%( 49/123) installing glib2 [##############################################] 100%Optional dependencies for glib2 python: gdbus-codegen, glib-genmarshal, glib-mkenums, gtester-report libelf: gresource inspection tool [pending]( 50/123) installing libunistring [##############################################] 100%( 51/123) installing icu [##############################################] 100%( 52/123) installing libxml2 [##############################################] 100%( 53/123) installing libcroco [##############################################] 100%( 54/123) installing gettext [##############################################] 100%Optional dependencies for gettext git: for autopoint infrastructure updates( 55/123) installing hwids [##############################################] 100%( 56/123) installing kmod [##############################################] 100%( 57/123) installing pciutils [##############################################] 100%( 58/123) installing psmisc [##############################################] 100%( 59/123) installing shadow [##############################################] 100%( 60/123) installing util-linux [##############################################] 100%Optional dependencies for util-linux python: python bindings to libmount words: default dictionary for look( 61/123) installing pcre2 [##############################################] 100%( 62/123) installing less [##############################################] 100%( 63/123) installing gzip [##############################################] 100%( 64/123) installing licenses [##############################################] 100%( 65/123) installing expat [##############################################] 100%( 66/123) installing libarchive [##############################################] 100%( 67/123) installing p11-kit [##############################################] 100%( 68/123) installing ca-certificates-utils [##############################################] 100%( 69/123) installing ca-certificates-mozilla [##############################################] 100%( 70/123) installing ca-certificates [##############################################] 100%( 71/123) installing brotli [##############################################] 100%( 72/123) installing libidn2 [##############################################] 100%( 73/123) installing libnghttp2 [##############################################] 100%( 74/123) installing libpsl [##############################################] 100%( 75/123) installing libssh2 [##############################################] 100%( 76/123) installing curl [##############################################] 100%( 77/123) installing npth [##############################################] 100%( 78/123) installing libksba [##############################################] 100%( 79/123) installing libassuan [##############################################] 100%( 80/123) installing libsecret [##############################################] 100%Optional dependencies for libsecret org.freedesktop.secrets: secret storage backend( 81/123) installing pinentry [##############################################] 100%Optional dependencies for pinentry gtk2: gtk2 backend qt5-base: qt backend gcr: gnome3 backend( 82/123) installing nettle [##############################################] 100%( 83/123) installing gnutls [##############################################] 100%Optional dependencies for gnutls guile: for use with Guile bindings( 84/123) installing sqlite [##############################################] 100%( 85/123) installing gnupg [##############################################] 100%Optional dependencies for gnupg libldap: gpg2keys_ldap [installed] libusb-compat: scdaemon pcsclite: scdaemon( 86/123) installing gpgme [##############################################] 100%( 87/123) installing pacman-mirrorlist [##############################################] 100%( 88/123) installing archlinux-keyring [##############################################] 100%( 89/123) installing pacman [##############################################] 100%Optional dependencies for pacman perl-locale-gettext: translation support in makepkg-template( 90/123) installing device-mapper [##############################################] 100%( 91/123) installing popt [##############################################] 100%( 92/123) installing json-c [##############################################] 100%( 93/123) installing argon2 [##############################################] 100%( 94/123) installing cryptsetup [##############################################] 100%( 95/123) installing dbus [##############################################] 100%( 96/123) installing libmnl [##############################################] 100%( 97/123) installing libnftnl [##############################################] 100%( 98/123) installing libnl [##############################################] 100%( 99/123) installing libpcap [##############################################] 100%(100/123) installing libnfnetlink [##############################################] 100%(101/123) installing libnetfilter_conntrack [##############################################] 100%(102/123) installing iptables [##############################################] 100%(103/123) installing kbd [##############################################] 100%(104/123) installing libelf [##############################################] 100%(105/123) installing systemd [##############################################] 100%Initializing machine ID from random generator.Creating group sys with gid 3.Creating group mem with gid 8.Creating group ftp with gid 11.Creating group log with gid 19.Creating group smmsp with gid 999.Creating group proc with gid 26.Creating group games with gid 50.Creating group network with gid 90.Creating group floppy with gid 94.Creating group scanner with gid 96.Creating group power with gid 98.Creating group adm with gid 998.Creating group optical with gid 997.Creating group storage with gid 996.Creating group uucp with gid 995.Creating group rfkill with gid 994.Creating user ftp (n/a) with uid 14 and gid 11.Creating group http with gid 33.Creating user http (n/a) with uid 33 and gid 33.Creating group dbus with gid 81.Creating user dbus (System Message Bus) with uid 81 and gid 81.Creating group systemd-journal-remote with gid 993.Creating user systemd-journal-remote (systemd Journal Remote) with uid 993 and gid 993.Creating group systemd-oom with gid 992.Creating user systemd-oom (systemd Userspace OOM Killer) with uid 992 and gid 992.Creating group uuidd with gid 68.Creating user uuidd (n/a) with uid 68 and gid 68.Created symlink /etc/systemd/system/getty.target.wants/getty@tty1.service → /usr/lib/systemd/system/getty@.service.Created symlink /etc/systemd/system/multi-user.target.wants/remote-fs.target → /usr/lib/systemd/system/remote-fs.target.:: Append 'init=/usr/lib/systemd/systemd' to your kernel command line in your bootloader to replace sysvinit with systemd, or install systemd-sysvcompatchgrp: invalid group: 'systemd-journal-remote'error: command failed to execute correctlyOptional dependencies for systemd libmicrohttpd: remote journald capabilities quota-tools: kernel-level quota management systemd-sysvcompat: symlink package to provide sysvinit binaries [pending] polkit: allow administration as unprivileged user curl: machinectl pull-tar and pull-raw [installed] libfido2: unlocking LUKS2 volumes with FIDO2 token tpm2-tss: unlocking LUKS2 volumes with TPM2(106/123) installing systemd-sysvcompat [##############################################] 100%(107/123) installing iputils [##############################################] 100%(108/123) installing iproute2 [##############################################] 100%Optional dependencies for iproute2 db: userspace arp daemon libcap: tipc [installed] linux-atm: ATM support(109/123) installing base [##############################################] 100%Optional dependencies for base linux: bare metal support [pending](110/123) installing mkinitcpio-busybox [##############################################] 100%(111/123) installing diffutils [##############################################] 100%(112/123) installing mkinitcpio [##############################################] 100%Optional dependencies for mkinitcpio gzip: Use gzip compression for the initramfs image [installed] xz: Use lzma or xz compression for the initramfs image [installed] bzip2: Use bzip2 compression for the initramfs image [installed] lzop: Use lzo compression for the initramfs image lz4: Use lz4 compression for the initramfs image [installed] mkinitcpio-nfs-utils: Support for root filesystem on NFS(113/123) installing linux [##############################################] 100%Optional dependencies for linux crda: to set the correct wireless channels of your country linux-firmware: firmware images needed for some devices [pending](114/123) installing linux-lts [##############################################] 100%Optional dependencies for linux-lts crda: to set the correct wireless channels of your country linux-firmware: firmware images needed for some devices [pending](115/123) installing linux-firmware [##############################################] 100%(116/123) installing intel-ucode [##############################################] 100%(117/123) installing lzo [##############################################] 100%(118/123) installing btrfs-progs [##############################################] 100%Optional dependencies for btrfs-progs python: libbtrfsutil python bindings e2fsprogs: btrfs-convert [installed] reiserfsprogs: btrfs-convert(119/123) installing fuse-common [##############################################] 100%(120/123) installing fuse2 [##############################################] 100%(121/123) installing ntfs-3g [##############################################] 100%(122/123) installing sudo [##############################################] 100%(123/123) installing nano [##############################################] 100%:: Running post-transaction hooks...( 1/12) Creating system user accounts...( 2/12) Updating journal message catalog...( 3/12) Reloading system manager configuration... Skipped: Running in chroot.( 4/12) Updating udev hardware database...( 5/12) Applying kernel sysctl settings... Skipped: Running in chroot.( 6/12) Creating temporary files...Failed to parse ACL "d:group::r-x,d:group:adm:r-x,d:group:wheel:r-x,group::r-x,group:adm:r-x,group:wheel:r-x": Invalid argument. IgnoringFailed to parse ACL "d:group:adm:r-x,d:group:wheel:r-x,group:adm:r-x,group:wheel:r-x": Invalid argument. IgnoringFailed to parse ACL "group:adm:r--,group:wheel:r--": Invalid argument. IgnoringFailed to parse ACL "d:group::r-x,d:group:adm:r-x,d:group:wheel:r-x,group::r-x,group:adm:r-x,group:wheel:r-x": Invalid argument. IgnoringFailed to parse ACL "d:group:adm:r-x,d:group:wheel:r-x,group:adm:r-x,group:wheel:r-x": Invalid argument. IgnoringFailed to parse ACL "group:adm:r--,group:wheel:r--": Invalid argument. IgnoringFailed to open file "/sys/devices/system/cpu/microcode/reload": Read-only file systemerror: command failed to execute correctly( 7/12) Reloading device manager configuration... Skipped: Running in chroot.( 8/12) Arming ConditionNeedsUpdate...( 9/12) Rebuilding certificate stores...(10/12) Updating module dependencies...(11/12) Updating linux initcpios...==> Building image from preset: /etc/mkinitcpio.d/linux-lts.preset: 'default' -> -k /boot/vmlinuz-linux-lts -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-lts.img==> Starting build: 5.10.70-1-lts -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [autodetect] -> Running build hook: [modconf] -> Running build hook: [block]==> WARNING: Possibly missing firmware for module: xhci_pci -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck]==> Generating module dependencies==> Creating zstd-compressed initcpio image: /boot/initramfs-linux-lts.img==> Image generation successful==> Building image from preset: /etc/mkinitcpio.d/linux-lts.preset: 'fallback' -> -k /boot/vmlinuz-linux-lts -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-lts-fallback.img -S autodetect==> Starting build: 5.10.70-1-lts -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [modconf] -> Running build hook: [block]==> WARNING: Possibly missing firmware for module: aic94xx==> WARNING: Possibly missing firmware for module: wd719x==> WARNING: Possibly missing firmware for module: xhci_pci -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck]==> Generating module dependencies==> Creating zstd-compressed initcpio image: /boot/initramfs-linux-lts-fallback.img==> Image generation successful==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default' -> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux.img==> Starting build: 5.14.8-arch1-1 -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [autodetect] -> Running build hook: [modconf] -> Running build hook: [block]==> WARNING: Possibly missing firmware for module: xhci_pci -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck]==> Generating module dependencies==> Creating zstd-compressed initcpio image: /boot/initramfs-linux.img==> Image generation successful==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback' -> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-fallback.img -S autodetect==> Starting build: 5.14.8-arch1-1 -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [modconf] -> Running build hook: [block]==> WARNING: Possibly missing firmware for module: aic94xx==> WARNING: Possibly missing firmware for module: wd719x==> WARNING: Possibly missing firmware for module: xhci_pci -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck]==> Generating module dependencies==> Creating zstd-compressed initcpio image: /boot/initramfs-linux-fallback.img==> Image generation successful(12/12) Reloading system bus configuration... Skipped: Running in chroot.
  2. Install booting related packages.
    [root@G5-openSUSE /]# pacstrap /mnt grub grub-btrfs os-prober efibootmgr
    The command with the output:
    [root@G5-openSUSE /]# pacstrap /mnt grub grub-btrfs os-prober efibootmgr ==> Creating install root at /mnt==> Installing packages to /mnt:: Synchronizing package databases... core is up to date extra is up to date community is up to dateresolving dependencies...looking for conflicting packages...Packages (5) efivar-37-4 efibootmgr-17-2 grub-2:2.06-2 grub-btrfs-4.10.1-1 os-prober-1.79-1Total Download Size: 6.93 MiBTotal Installed Size: 34.57 MiB:: Proceed with installation? [Y/n] :: Retrieving packages... grub-2:2.06-2-x86_64 6.8 MiB 886 KiB/s 00:08 [##############################################] 100% grub-btrfs-4.10.1-1-any 24.3 KiB 108 KiB/s 00:00 [##############################################] 100% os-prober-1.79-1-x86_64 17.4 KiB 125 KiB/s 00:00 [##############################################] 100% efivar-37-4-x86_64 110.5 KiB 453 KiB/s 00:00 [##############################################] 100% efibootmgr-17-2-x86_64 27.4 KiB 180 KiB/s 00:00 [##############################################] 100% Total (5/5) 6.9 MiB 754 KiB/s 00:09 [##############################################] 100%(5/5) checking keys in keyring [##############################################] 100%(5/5) checking package integrity [##############################################] 100%(5/5) loading package files [##############################################] 100%(5/5) checking for file conflicts [##############################################] 100%(5/5) checking available disk space [##############################################] 100%:: Processing package changes...(1/5) installing grub [##############################################] 100%:: Generate your bootloader configuration with: grub-mkconfig -o /boot/grub/grub.cfgOptional dependencies for grub freetype2: For grub-mkfont usage fuse2: For grub-mount usage [installed] dosfstools: For grub-mkrescue FAT FS and EFI support efibootmgr: For grub-install EFI support [pending] libisoburn: Provides xorriso for generating grub rescue iso using grub-mkrescue os-prober: To detect other OSes when generating grub.cfg in BIOS systems [pending] mtools: For grub-mkrescue FAT FS support(2/5) installing grub-btrfs [##############################################] 100%Optional dependencies for grub-btrfs snapper: Snapper support(3/5) installing os-prober [##############################################] 100%(4/5) installing efivar [##############################################] 100%(5/5) installing efibootmgr [##############################################] 100%:: Running post-transaction hooks...(1/3) Reloading system manager configuration... Skipped: Running in chroot.(2/3) Arming ConditionNeedsUpdate...(3/3) Updating linux initcpios...==> Building image from preset: /etc/mkinitcpio.d/linux-lts.preset: 'default' -> -k /boot/vmlinuz-linux-lts -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-lts.img==> Starting build: 5.10.70-1-lts -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [autodetect] -> Running build hook: [modconf] -> Running build hook: [block]==> WARNING: Possibly missing firmware for module: xhci_pci -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck]==> Generating module dependencies==> Creating zstd-compressed initcpio image: /boot/initramfs-linux-lts.img==> Image generation successful==> Building image from preset: /etc/mkinitcpio.d/linux-lts.preset: 'fallback' -> -k /boot/vmlinuz-linux-lts -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-lts-fallback.img -S autodetect==> Starting build: 5.10.70-1-lts -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [modconf] -> Running build hook: [block]==> WARNING: Possibly missing firmware for module: aic94xx==> WARNING: Possibly missing firmware for module: wd719x==> WARNING: Possibly missing firmware for module: xhci_pci -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck]==> Generating module dependencies==> Creating zstd-compressed initcpio image: /boot/initramfs-linux-lts-fallback.img==> Image generation successful==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default' -> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux.img==> Starting build: 5.14.8-arch1-1 -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [autodetect] -> Running build hook: [modconf] -> Running build hook: [block]==> WARNING: Possibly missing firmware for module: xhci_pci -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck]==> Generating module dependencies==> Creating zstd-compressed initcpio image: /boot/initramfs-linux.img==> Image generation successful==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback' -> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-fallback.img -S autodetect==> Starting build: 5.14.8-arch1-1 -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [modconf] -> Running build hook: [block]==> WARNING: Possibly missing firmware for module: aic94xx==> WARNING: Possibly missing firmware for module: wd719x==> WARNING: Possibly missing firmware for module: xhci_pci -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck]==> Generating module dependencies==> Creating zstd-compressed initcpio image: /boot/initramfs-linux-fallback.img==> Image generation successful
  3. Install snapper and snap-pac, which automatically makes Snapper snapshots after package manager transactions. There will also be another package to install from the AUR, snap-pac-btrfs the second time we reboot into our installed system. Another snapper related program, snap-sync, for making backups to an external drive from a snapshot is also available from the regular Arch repositories for users who need its functionality.
    [root@G5-openSUSE /]# pacstrap /mnt snapper snap-pac
    The command with its output:
    [root@G5-openSUSE /]# pacstrap /mnt snapper snap-pac==> Creating install root at /mnt==> Installing packages to /mnt:: Synchronizing package databases... core is up to date extra is up to date community is up to dateresolving dependencies...looking for conflicting packages...Packages (6) boost-libs-1.76.0-1 gdbm-1.21-1 libnsl-2.0.0-1 python-3.9.7-1 snap-pac-3.0.1-1 snapper-0.9.1-1Total Download Size: 14.32 MiBTotal Installed Size: 65.74 MiB:: Proceed with installation? [Y/n] :: Retrieving packages... boost-libs-1.76.0-1-x86_64 2.3 MiB 2.53 MiB/s 00:01 [##############################################] 100% snapper-0.9.1-1-x86_64 760.3 KiB 2.61 MiB/s 00:00 [##############################################] 100% gdbm-1.21-1-x86_64 227.6 KiB 849 KiB/s 00:00 [##############################################] 100% libnsl-2.0.0-1-x86_64 21.8 KiB 99.0 KiB/s 00:00 [##############################################] 100% python-3.9.7-1-x86_64 11.0 MiB 10.6 MiB/s 00:01 [##############################################] 100% snap-pac-3.0.1-1-any 18.6 KiB 133 KiB/s 00:00 [##############################################] 100% Total (6/6) 14.3 MiB 4.00 MiB/s 00:04 [##############################################] 100%(6/6) checking keys in keyring [##############################################] 100%(6/6) checking package integrity [##############################################] 100%(6/6) loading package files [##############################################] 100%(6/6) checking for file conflicts [##############################################] 100%(6/6) checking available disk space [##############################################] 100%:: Processing package changes...(1/6) installing boost-libs [##############################################] 100%Optional dependencies for boost-libs openmpi: for mpi support(2/6) installing snapper [##############################################] 100%Optional dependencies for snapper pam: pam_snapper [installed](3/6) installing gdbm [##############################################] 100%(4/6) installing libnsl [##############################################] 100%(5/6) installing python [##############################################] 100%Optional dependencies for python python-setuptools python-pip sqlite [installed] mpdecimal: for decimal xz: for lzma [installed] tk: for tkinter(6/6) installing snap-pac [##############################################] 100%:: Running post-transaction hooks...(1/4) Reloading system manager configuration... Skipped: Running in chroot.(2/4) Arming ConditionNeedsUpdate...(3/4) Reloading system bus configuration... Skipped: Running in chroot.(4/4) Performing snapper post snapshots for the following configurations...
  4. Install the X Window System and X Window System applications.
    [root@G5-openSUSE /]# pacstrap /mnt xorg-server xorg-apps
    [root@G5-openSUSE /]# pacstrap /mnt xorg-server xorg-apps==> Creating install root at /mnt==> Installing packages to /mnt:: Synchronizing package databases... core is up to date extra is up to date community is up to date:: There are 35 members in group xorg-apps::: Repository extra 1) xorg-bdftopcf 2) xorg-iceauth 3) xorg-mkfontscale 4) xorg-sessreg 5) xorg-setxkbmap 6) xorg-smproxy 7) xorg-x11perf 8) xorg-xauth 9) xorg-xbacklight 10) xorg-xcmsdb 11) xorg-xcursorgen 12) xorg-xdpyinfo 13) xorg-xdriinfo 14) xorg-xev 15) xorg-xgamma 16) xorg-xhost 17) xorg-xinput 18) xorg-xkbcomp 19) xorg-xkbevd 20) xorg-xkbutils 21) xorg-xkill 22) xorg-xlsatoms 23) xorg-xlsclients 24) xorg-xmodmap 25) xorg-xpr 26) xorg-xprop 27) xorg-xrandr 28) xorg-xrdb 29) xorg-xrefresh 30) xorg-xset 31) xorg-xsetroot 32) xorg-xvinfo 33) xorg-xwd 34) xorg-xwininfo 35) xorg-xwudEnter a selection (default=all): resolving dependencies...looking for conflicting packages...warning: dependency cycle detected:warning: harfbuzz will be installed before its freetype2 dependencywarning: dependency cycle detected:warning: mesa will be installed before its libglvnd dependencyPackages (93) fontconfig-2:2.13.94-1 freetype2-2.11.0-4 graphite-1:1.3.14-1 harfbuzz-3.0.0-1 libdrm-2.4.107-1 libedit-20210910_3.1-1 libepoxy-1.5.9-1 libevdev-1.11.0-1 libfontenc-1.1.4-3 libglvnd-1.3.4-1 libgudev-237-1 libice-1.0.10-3 libinput-1.19.1-1 libomxil-bellagio-0.9.3-3 libpciaccess-0.16-2 libpng-1.6.37-3 libsm-1.2.3-2 libunwind-1.5.0-1 libwacom-1.12-1 libx11-1.7.2-1 libxau-1.0.9-3 libxaw-1.0.14-1 libxcb-1.14-1 libxcomposite-0.4.5-3 libxcursor-1.2.0-2 libxdamage-1.1.5-3 libxdmcp-1.1.3-3 libxext-1.3.4-3 libxfixes-6.0.0-1 libxfont2-2.0.5-1 libxft-2.3.4-1 libxi-1.8-1 libxinerama-1.1.4-3 libxkbfile-1.1.0-2 libxmu-1.1.3-2 libxpm-3.5.13-2 libxrandr-1.5.2-3 libxrender-0.9.10-4 libxshmfence-1.3-2 libxt-1.2.1-1 libxtst-1.2.3-4 libxv-1.0.11-4 libxxf86vm-1.1.4-4 llvm-libs-12.0.1-4 lm_sensors-1:3.6.0.r41.g31d1f125-1 mesa-21.2.3-1 mtdev-1.1.6-1 pixman-0.40.0-1 vulkan-icd-loader-1.2.194-1 wayland-1.19.0-1 xcb-proto-1.14.1-3 xcb-util-0.4.0-3 xf86-input-libinput-1.2.0-1 xkeyboard-config-2.33-2 xorg-fonts-encodings-1.0.5-2 xorg-server-common-1.20.13-2 xorgproto-2021.5-1 xorg-bdftopcf-1.1-2 xorg-iceauth-1.0.8-2 xorg-mkfontscale-1.2.1-2 xorg-server-1.20.13-2 xorg-sessreg-1.1.2-2 xorg-setxkbmap-1.3.2-2 xorg-smproxy-1.0.6-3 xorg-x11perf-1.6.1-2 xorg-xauth-1.1-2 xorg-xbacklight-1.2.3-2 xorg-xcmsdb-1.0.5-3 xorg-xcursorgen-1.0.7-2 xorg-xdpyinfo-1.3.2-4 xorg-xdriinfo-1.0.6-2 xorg-xev-1.2.4-1 xorg-xgamma-1.0.6-3 xorg-xhost-1.0.8-2 xorg-xinput-1.6.3-2 xorg-xkbcomp-1.4.5-1 xorg-xkbevd-1.1.4-3 xorg-xkbutils-1.0.4-4 xorg-xkill-1.0.5-2 xorg-xlsatoms-1.1.3-2 xorg-xlsclients-1.1.4-2 xorg-xmodmap-1.0.10-2 xorg-xpr-1.0.5-2 xorg-xprop-1.2.5-1 xorg-xrandr-1.5.1-2 xorg-xrdb-1.2.1-1 xorg-xrefresh-1.0.6-2 xorg-xset-1.2.4-2 xorg-xsetroot-1.1.2-2 xorg-xvinfo-1.1.4-2 xorg-xwd-1.0.8-1 xorg-xwininfo-1.1.5-2 xorg-xwud-1.0.5-2Total Download Size: 54.65 MiBTotal Installed Size: 256.41 MiB:: Proceed with installation? [Y/n] :: Retrieving packages... libepoxy-1.5.9-1-x86_64 436.1 KiB 886 KiB/s 00:00 [##############################################] 100% libpng-1.6.37-3-x86_64 245.9 KiB 1118 KiB/s 00:00 [##############################################] 100% graphite-1:1.3.14-1-x86_64 224.5 KiB 936 KiB/s 00:00 [##############################################] 100% harfbuzz-3.0.0-1-x86_64 895.8 KiB 2.80 MiB/s 00:00 [##############################################] 100% freetype2-2.11.0-4-x86_64 487.1 KiB 1903 KiB/s 00:00 [##############################################] 100% xorg-fonts-encodings-1.0.5-2-any 567.0 KiB 2.10 MiB/s 00:00 [##############################################] 100% libfontenc-1.1.4-3-x86_64 15.4 KiB 72.7 KiB/s 00:00 [##############################################] 100% libxfont2-2.0.5-1-x86_64 116.1 KiB 528 KiB/s 00:00 [##############################################] 100% pixman-0.40.0-1-x86_64 261.8 KiB 1235 KiB/s 00:00 [##############################################] 100% xkeyboard-config-2.33-2-any 737.7 KiB 2.43 MiB/s 00:00 [##############################################] 100% xcb-proto-1.14.1-3-any 108.0 KiB 500 KiB/s 00:00 [##############################################] 100% libxdmcp-1.1.3-3-x86_64 27.4 KiB 114 KiB/s 00:00 [##############################################] 100% libxau-1.0.9-3-x86_64 10.9 KiB 52.3 KiB/s 00:00 [##############################################] 100% libxcb-1.14-1-x86_64 999.8 KiB 3.34 MiB/s 00:00 [##############################################] 100% xorgproto-2021.5-1-any 240.3 KiB 985 KiB/s 00:00 [##############################################] 100% libx11-1.7.2-1-x86_64 2.1 MiB 5.40 MiB/s 00:00 [##############################################] 100% libxkbfile-1.1.0-2-x86_64 75.3 KiB 448 KiB/s 00:00 [##############################################] 100% xorg-xkbcomp-1.4.5-1-x86_64 91.5 KiB 572 KiB/s 00:00 [##############################################] 100% xorg-setxkbmap-1.3.2-2-x86_64 13.9 KiB 96.3 KiB/s 00:00 [##############################################] 100% xorg-server-common-1.20.13-2-x86_64 27.7 KiB 193 KiB/s 00:00 [##############################################] 100% libunwind-1.5.0-1-x86_64 111.1 KiB 534 KiB/s 00:00 [##############################################] 100% libxext-1.3.4-3-x86_64 107.3 KiB 639 KiB/s 00:00 [##############################################] 100% libpciaccess-0.16-2-x86_64 21.6 KiB 150 KiB/s 00:00 [##############################################] 100% libdrm-2.4.107-1-x86_64 270.0 KiB 1324 KiB/s 00:00 [##############################################] 100% wayland-1.19.0-1-x86_64 131.8 KiB 716 KiB/s 00:00 [##############################################] 100% libxxf86vm-1.1.4-4-x86_64 15.7 KiB 106 KiB/s 00:00 [##############################################] 100% libxfixes-6.0.0-1-x86_64 13.7 KiB 90.1 KiB/s 00:00 [##############################################] 100% libxdamage-1.1.5-3-x86_64 7.1 KiB 37.8 KiB/s 00:00 [##############################################] 100% libxshmfence-1.3-2-x86_64 5.7 KiB 39.9 KiB/s 00:00 [##############################################] 100% libomxil-bellagio-0.9.3-3-x86_64 123.0 KiB 683 KiB/s 00:00 [##############################################] 100% libedit-20210910_3.1-1-x86_64 110.0 KiB 550 KiB/s 00:00 [##############################################] 100% llvm-libs-12.0.1-4-x86_64 24.4 MiB 12.6 MiB/s 00:02 [##############################################] 100% lm_sensors-1:3.6.0.r41.g31d1f125-1-x86_64 134.4 KiB 686 KiB/s 00:00 [##############################################] 100% vulkan-icd-loader-1.2.194-1-x86_64 108.7 KiB 618 KiB/s 00:00 [##############################################] 100% mesa-21.2.3-1-x86_64 16.9 MiB 10.7 MiB/s 00:02 [##############################################] 100% libglvnd-1.3.4-1-x86_64 353.2 KiB 1299 KiB/s 00:00 [##############################################] 100% mtdev-1.1.6-1-x86_64 17.1 KiB 129 KiB/s 00:00 [##############################################] 100% libevdev-1.11.0-1-x86_64 63.8 KiB 326 KiB/s 00:00 [##############################################] 100% libgudev-237-1-x86_64 44.0 KiB 262 KiB/s 00:00 [##############################################] 100% libwacom-1.12-1-x86_64 102.8 KiB 547 KiB/s 00:00 [##############################################] 100% libinput-1.19.1-1-x86_64 292.3 KiB 1491 KiB/s 00:00 [##############################################] 100% xf86-input-libinput-1.2.0-1-x86_64 37.3 KiB 245 KiB/s 00:00 [##############################################] 100% xorg-server-1.20.13-2-x86_64 1425.3 KiB 4.40 MiB/s 00:00 [##############################################] 100% xorg-bdftopcf-1.1-2-x86_64 24.9 KiB 173 KiB/s 00:00 [##############################################] 100% libice-1.0.10-3-x86_64 78.3 KiB 515 KiB/s 00:00 [##############################################] 100% xorg-iceauth-1.0.8-2-x86_64 17.6 KiB 122 KiB/s 00:00 [##############################################] 100% xorg-mkfontscale-1.2.1-2-x86_64 24.3 KiB 127 KiB/s 00:00 [##############################################] 100% xorg-sessreg-1.1.2-2-x86_64 8.9 KiB 63.7 KiB/s 00:00 [##############################################] 100% libsm-1.2.3-2-x86_64 45.5 KiB 247 KiB/s 00:00 [##############################################] 100% libxt-1.2.1-1-x86_64 535.5 KiB 2.14 MiB/s 00:00 [##############################################] 100% libxmu-1.1.3-2-x86_64 77.0 KiB 310 KiB/s 00:00 [##############################################] 100% xorg-smproxy-1.0.6-3-x86_64 12.8 KiB 86.6 KiB/s 00:00 [##############################################] 100% libxrender-0.9.10-4-x86_64 26.0 KiB 180 KiB/s 00:00 [##############################################] 100% fontconfig-2:2.13.94-1-x86_64 319.4 KiB 1426 KiB/s 00:00 [##############################################] 100% libxft-2.3.4-1-x86_64 48.4 KiB 327 KiB/s 00:00 [##############################################] 100% xorg-x11perf-1.6.1-2-x86_64 68.6 KiB 429 KiB/s 00:00 [##############################################] 100% xorg-xauth-1.1-2-x86_64 25.5 KiB 188 KiB/s 00:00 [##############################################] 100% xcb-util-0.4.0-3-x86_64 12.5 KiB 89.3 KiB/s 00:00 [##############################################] 100% xorg-xbacklight-1.2.3-2-x86_64 8.9 KiB 61.9 KiB/s 00:00 [##############################################] 100% xorg-xcmsdb-1.0.5-3-x86_64 17.3 KiB 124 KiB/s 00:00 [##############################################] 100% libxcursor-1.2.0-2-x86_64 28.5 KiB 165 KiB/s 00:00 [##############################################] 100% xorg-xcursorgen-1.0.7-2-x86_64 9.5 KiB 60.7 KiB/s 00:00 [##############################################] 100% libxi-1.8-1-x86_64 150.9 KiB 726 KiB/s 00:00 [##############################################] 100% libxtst-1.2.3-4-x86_64 29.5 KiB 180 KiB/s 00:00 [##############################################] 100% libxcomposite-0.4.5-3-x86_64 11.4 KiB 81.6 KiB/s 00:00 [##############################################] 100% libxinerama-1.1.4-3-x86_64 10.1 KiB 72.5 KiB/s 00:00 [##############################################] 100% xorg-xdpyinfo-1.3.2-4-x86_64 16.0 KiB 70.4 KiB/s 00:00 [##############################################] 100% xorg-xdriinfo-1.0.6-2-x86_64 7.0 KiB 47.1 KiB/s 00:00 [##############################################] 100% libxrandr-1.5.2-3-x86_64 27.2 KiB 154 KiB/s 00:00 [##############################################] 100% xorg-xev-1.2.4-1-x86_64 15.4 KiB 81.8 KiB/s 00:00 [##############################################] 100% xorg-xgamma-1.0.6-3-x86_64 8.8 KiB 59.3 KiB/s 00:00 [##############################################] 100% xorg-xhost-1.0.8-2-x86_64 11.7 KiB 73.1 KiB/s 00:00 [##############################################] 100% xorg-xrandr-1.5.1-2-x86_64 36.8 KiB 214 KiB/s 00:00 [##############################################] 100% xorg-xinput-1.6.3-2-x86_64 28.1 KiB 176 KiB/s 00:00 [##############################################] 100% xorg-xkbevd-1.1.4-3-x86_64 18.6 KiB 126 KiB/s 00:00 [##############################################] 100% libxpm-3.5.13-2-x86_64 54.2 KiB 331 KiB/s 00:00 [##############################################] 100% libxaw-1.0.14-1-x86_64 361.0 KiB 1612 KiB/s 00:00 [##############################################] 100% xorg-xkbutils-1.0.4-4-x86_64 19.2 KiB 133 KiB/s 00:00 [##############################################] 100% xorg-xkill-1.0.5-2-x86_64 9.5 KiB 69.6 KiB/s 00:00 [##############################################] 100% xorg-xlsatoms-1.1.3-2-x86_64 8.3 KiB 54.5 KiB/s 00:00 [##############################################] 100% xorg-xlsclients-1.1.4-2-x86_64 10.3 KiB 73.8 KiB/s 00:00 [##############################################] 100% xorg-xmodmap-1.0.10-2-x86_64 22.5 KiB 110 KiB/s 00:00 [##############################################] 100% xorg-xpr-1.0.5-2-x86_64 33.2 KiB 189 KiB/s 00:00 [##############################################] 100% xorg-xprop-1.2.5-1-x86_64 26.3 KiB 156 KiB/s 00:00 [##############################################] 100% xorg-xrdb-1.2.1-1-x86_64 20.0 KiB 98.2 KiB/s 00:00 [##############################################] 100% xorg-xrefresh-1.0.6-2-x86_64 8.9 KiB 63.8 KiB/s 00:00 [##############################################] 100% xorg-xset-1.2.4-2-x86_64 19.4 KiB 69.4 KiB/s 00:00 [##############################################] 100% xorg-xsetroot-1.1.2-2-x86_64 11.7 KiB 75.1 KiB/s 00:00 [##############################################] 100% libxv-1.0.11-4-x86_64 35.4 KiB 181 KiB/s 00:00 [##############################################] 100% xorg-xvinfo-1.1.4-2-x86_64 8.8 KiB 59.7 KiB/s 00:00 [##############################################] 100% xorg-xwd-1.0.8-1-x86_64 18.5 KiB 118 KiB/s 00:00 [##############################################] 100% xorg-xwininfo-1.1.5-2-x86_64 23.8 KiB 157 KiB/s 00:00 [##############################################] 100% xorg-xwud-1.0.5-2-x86_64 16.2 KiB 109 KiB/s 00:00 [##############################################] 100% Total (93/93) 54.7 MiB 1833 KiB/s 00:31 [##############################################] 100%(93/93) checking keys in keyring [##############################################] 100%(93/93) checking package integrity [##############################################] 100%(93/93) loading package files [##############################################] 100%(93/93) checking for file conflicts [##############################################] 100%(93/93) checking available disk space [##############################################] 100%:: Running pre-transaction hooks...(1/1) Performing snapper pre snapshots for the following configurations...:: Processing package changes...( 1/93) installing libepoxy [##############################################] 100%( 2/93) installing libpng [##############################################] 100%( 3/93) installing graphite [##############################################] 100%( 4/93) installing harfbuzz [##############################################] 100%Optional dependencies for harfbuzz cairo: hb-view program chafa: hb-view program( 5/93) installing freetype2 [##############################################] 100%( 6/93) installing xorg-fonts-encodings [##############################################] 100%( 7/93) installing libfontenc [##############################################] 100%( 8/93) installing libxfont2 [##############################################] 100%( 9/93) installing pixman [##############################################] 100%(10/93) installing xkeyboard-config [##############################################] 100%(11/93) installing xcb-proto [##############################################] 100%(12/93) installing libxdmcp [##############################################] 100%(13/93) installing libxau [##############################################] 100%(14/93) installing libxcb [##############################################] 100%(15/93) installing xorgproto [##############################################] 100%(16/93) installing libx11 [##############################################] 100%(17/93) installing libxkbfile [##############################################] 100%(18/93) installing xorg-xkbcomp [##############################################] 100%(19/93) installing xorg-setxkbmap [##############################################] 100%(20/93) installing xorg-server-common [##############################################] 100%(21/93) installing libunwind [##############################################] 100%(22/93) installing libxext [##############################################] 100%(23/93) installing libpciaccess [##############################################] 100%(24/93) installing libdrm [##############################################] 100%(25/93) installing wayland [##############################################] 100%(26/93) installing libxxf86vm [##############################################] 100%(27/93) installing libxfixes [##############################################] 100%(28/93) installing libxdamage [##############################################] 100%(29/93) installing libxshmfence [##############################################] 100%(30/93) installing libomxil-bellagio [##############################################] 100%(31/93) installing libedit [##############################################] 100%(32/93) installing llvm-libs [##############################################] 100%(33/93) installing lm_sensors [##############################################] 100%Optional dependencies for lm_sensors rrdtool: for logging with sensord perl: for sensor detection and configuration convert(34/93) installing vulkan-icd-loader [##############################################] 100%Optional dependencies for vulkan-icd-loader vulkan-driver: packaged vulkan driver(35/93) installing mesa [##############################################] 100%Optional dependencies for mesa opengl-man-pages: for the OpenGL API man pages mesa-vdpau: for accelerated video playback libva-mesa-driver: for accelerated video playback(36/93) installing libglvnd [##############################################] 100%(37/93) installing mtdev [##############################################] 100%(38/93) installing libevdev [##############################################] 100%(39/93) installing libgudev [##############################################] 100%(40/93) installing libwacom [##############################################] 100%(41/93) installing libinput [##############################################] 100%Optional dependencies for libinput gtk3: libinput debug-gui python-pyudev: libinput measure python-libevdev: libinput measure(42/93) installing xf86-input-libinput [##############################################] 100%(43/93) installing xorg-server [##############################################] 100%>>> xorg-server has now the ability to run without root rights with the help of systemd-logind. xserver will fail to run if not launched from the same virtual terminal as was used to log in. Without root rights, log files will be in ~/.local/share/xorg/ directory. Old behavior can be restored through Xorg.wrap config file. See Xorg.wrap man page (man xorg.wrap).(44/93) installing xorg-bdftopcf [##############################################] 100%(45/93) installing libice [##############################################] 100%(46/93) installing xorg-iceauth [##############################################] 100%(47/93) installing xorg-mkfontscale [##############################################] 100%Creating X fontdir indices... done.(48/93) installing xorg-sessreg [##############################################] 100%(49/93) installing libsm [##############################################] 100%(50/93) installing libxt [##############################################] 100%(51/93) installing libxmu [##############################################] 100%(52/93) installing xorg-smproxy [##############################################] 100%(53/93) installing libxrender [##############################################] 100%(54/93) installing fontconfig [##############################################] 100%Creating fontconfig configuration...Rebuilding fontconfig cache...(55/93) installing libxft [##############################################] 100%(56/93) installing xorg-x11perf [##############################################] 100%(57/93) installing xorg-xauth [##############################################] 100%(58/93) installing xcb-util [##############################################] 100%(59/93) installing xorg-xbacklight [##############################################] 100%(60/93) installing xorg-xcmsdb [##############################################] 100%(61/93) installing libxcursor [##############################################] 100%Optional dependencies for libxcursor gnome-themes-standard: fallback icon theme(62/93) installing xorg-xcursorgen [##############################################] 100%(63/93) installing libxi [##############################################] 100%(64/93) installing libxtst [##############################################] 100%(65/93) installing libxcomposite [##############################################] 100%(66/93) installing libxinerama [##############################################] 100%(67/93) installing xorg-xdpyinfo [##############################################] 100%(68/93) installing xorg-xdriinfo [##############################################] 100%(69/93) installing libxrandr [##############################################] 100%(70/93) installing xorg-xev [##############################################] 100%(71/93) installing xorg-xgamma [##############################################] 100%(72/93) installing xorg-xhost [##############################################] 100%(73/93) installing xorg-xrandr [##############################################] 100%(74/93) installing xorg-xinput [##############################################] 100%(75/93) installing xorg-xkbevd [##############################################] 100%(76/93) installing libxpm [##############################################] 100%(77/93) installing libxaw [##############################################] 100%(78/93) installing xorg-xkbutils [##############################################] 100%(79/93) installing xorg-xkill [##############################################] 100%(80/93) installing xorg-xlsatoms [##############################################] 100%(81/93) installing xorg-xlsclients [##############################################] 100%(82/93) installing xorg-xmodmap [##############################################] 100%(83/93) installing xorg-xpr [##############################################] 100%(84/93) installing xorg-xprop [##############################################] 100%(85/93) installing xorg-xrdb [##############################################] 100%Optional dependencies for xorg-xrdb gcc: for preprocessing mcpp: a lightweight alternative for preprocessing(86/93) installing xorg-xrefresh [##############################################] 100%(87/93) installing xorg-xset [##############################################] 100%(88/93) installing xorg-xsetroot [##############################################] 100%(89/93) installing libxv [##############################################] 100%(90/93) installing xorg-xvinfo [##############################################] 100%(91/93) installing xorg-xwd [##############################################] 100%(92/93) installing xorg-xwininfo [##############################################] 100%(93/93) installing xorg-xwud [##############################################] 100%:: Running post-transaction hooks...(1/7) Reloading system manager configuration... Skipped: Running in chroot.(2/7) Updating udev hardware database...(3/7) Reloading device manager configuration... Skipped: Running in chroot.(4/7) Arming ConditionNeedsUpdate...(5/7) Updating fontconfig configuration...(6/7) Updating fontconfig cache...(7/7) Performing snapper post snapshots for the following configurations...
  5. Install Plasma and some KDE applications
    [root@G5-openSUSE /]# pacstrap /mnt plasma-meta kde-utilities kde-system dolphin-plugins kde-graphics
    The command with the output:
    [root@G5-openSUSE /]# pacstrap /mnt plasma-meta kde-utilities kde-system dolphin-plugins kde-graphics==> Creating install root at /mnt==> Installing packages to /mnt:: Synchronizing package databases... core is up to date extra is up to date community 5.8 MiB 972 KiB/s 00:06 [##############################################] 100%:: There are 22 members in group kde-utilities::: Repository extra 1) ark 2) filelight 3) kate 4) kbackup 5) kcalc 6) kcharselect 7) kdebugsettings 8) kdf 9) kdialog 10) keditbookmarks 11) kfind 12) kfloppy 13) kgpg 14) konsole 15) kteatime 16) ktimer 17) kwalletmanager 18) kwrite 19) markdownpart 20) print-manager 21) sweeper 22) yakuakeEnter a selection (default=all): :: There are 5 members in group kde-system::: Repository extra 1) dolphin 2) kcron 3) khelpcenter 4) ksystemlog 5) partitionmanagerEnter a selection (default=all): :: There are 13 members in group kde-graphics::: Repository extra 1) gwenview 2) kamera 3) kcolorchooser 4) kdegraphics-mobipocket 5) kdegraphics-thumbnailers 6) kimagemapeditor 7) kipi-plugins 8) kolourpaint 9) kruler 10) okular 11) skanlite 12) spectacle 13) svgpartEnter a selection (default=all): resolving dependencies...:: There are 8 providers available for ttf-font::: Repository extra 1) gnu-free-fonts 2) noto-fonts 3) ttf-bitstream-vera 4) ttf-croscore 5) ttf-dejavu:: Repository community 6) ttf-droid 7) ttf-ibm-plex 8) ttf-liberationEnter a number (default=1): :: There are 2 providers available for phonon-qt5-backend::: Repository extra 1) phonon-qt5-gstreamer 2) phonon-qt5-vlcEnter a number (default=1): :: There are 2 providers available for cron::: Repository core 1) cronie:: Repository community 2) fcronEnter a number (default=1): looking for conflicting packages...warning: dependency cycle detected:warning: usbmuxd will be installed before its libimobiledevice dependencywarning: dependency cycle detected:warning: cifs-utils will be installed before its smbclient dependencywarning: dependency cycle detected:warning: phonon-qt5-gstreamer will be installed before its phonon-qt5 dependencyPackages (454) accounts-qml-module-0.7-4 accountsservice-0.6.55-3 adobe-source-code-pro-fonts-2.038ro+1.058it+1.018var-1 akonadi-contacts-21.08.1-1 alsa-card-profiles-1:0.3.38-1 alsa-lib-1.2.5.1-3 alsa-topology-conf-1.2.5.1-1 alsa-ucm-conf-1.2.5.1-1 aom-3.1.2-2 appstream-0.14.5-2 appstream-qt-0.14.5-2 archlinux-appstream-data-20210929-1 attica-5.86.0-2 avahi-0.8+22+gfd482a7-1 baloo-5.86.0-1 baloo-widgets-21.08.1-1 bluedevil-1:5.22.5-1 bluez-5.61-1 bluez-libs-5.61-1 bluez-qt-5.86.0-1 bolt-0.9.1-1 breeze-5.22.5-1 breeze-gtk-5.22.5-1 breeze-icons-5.86.0-1 cairo-1.17.4-5 cantarell-fonts-1:0.303-1 cdparanoia-10.2-8 celt-0.11.3-4 cfitsio-1:4.0.0-1 cifs-utils-6.14-1 convertlit-1.8-10 cronie-1.5.7-2 dav1d-0.9.2-1 db-5.3.28-5 dbus-glib-0.112-2 dconf-0.40.0-1 discount-2.2.7-1 discover-5.22.5-2 djvulibre-3.5.28-3 dmraid-1.0.0.rc16.3-13 docbook-xml-4.5-9 docbook-xsl-1.79.2-7 dosfstools-4.2-1 double-conversion-3.1.5-2 drkonqi-5.22.5-1 ebook-tools-0.2.2-7 editorconfig-core-c-0.12.5-1 exiv2-0.27.4-2 ffmpeg-2:4.4-4 flac-1.3.3-3 frameworkintegration-5.86.0-1 fribidi-1.0.10-1 fuse3-3.10.5-1 gc-8.0.4-4 gd-2.3.3-2 gdb-11.1-1 gdb-common-11.1-1 gdk-pixbuf2-2.42.6-2 ghostscript-9.55.0-2 giflib-5.2.1-2 glib-networking-1:2.70.0-1 glu-9.0.2-1 gnu-free-fonts-20120503-8 gpm-1.20.7.r38.ge82d1a6-4 gptfdisk-1.0.8-1 grantlee-5.2.0-3 grantleetheme-21.08.1-1 graphene-1.10.6-1 gsettings-desktop-schemas-41.0-1 gsm-1.0.19-1 gst-plugins-base-1.18.5-1 gst-plugins-base-libs-1.18.5-1 gstreamer-1.18.5-1 guile-2.2.7-1 hicolor-icon-theme-0.17-2 hidapi-0.11.0-1 http-parser-2.9.4-1 ijs-0.35-3 iso-codes-4.7.0-1 jack2-1.9.19-2 jansson-2.14-1 jasper-2.0.33-1 jbig2dec-0.19-1 js78-78.14.0-1 kaccounts-integration-21.08.1-1 kactivities-5.86.0-1 kactivities-stats-5.86.0-1 kactivitymanagerd-5.22.5-1 karchive-5.86.0-1 kauth-5.86.0-1 kbookmarks-5.86.0-1 kcmutils-5.86.0-1 kcodecs-5.86.0-1 kcolorpicker-0.1.6-1 kcompletion-5.86.0-1 kconfig-5.86.0-1 kconfigwidgets-5.86.0-1 kcontacts-1:5.86.0-1 kcoreaddons-5.86.0-1 kcrash-5.86.0-1 kdbusaddons-5.86.0-1 kde-cli-tools-5.22.5-1 kde-gtk-config-5.22.5-1 kdeclarative-5.86.0-1 kdecoration-5.22.5-1 kded-5.86.0-1 kdelibs4support-5.86.0-1 kdeplasma-addons-5.22.5-1 kdesu-5.86.0-1 kdnssd-5.86.0-1 kdoctools-5.86.0-1 kdsoap-2.0.0-1 kdsoap-ws-discovery-client-git20200927-2 kemoticons-5.86.0-1 kfilemetadata-5.86.0-1 kgamma5-5.22.5-1 kglobalaccel-5.86.0-1 kguiaddons-5.86.0-1 kholidays-1:5.86.0-1 khotkeys-5.22.5-1 khtml-5.86.0-1 ki18n-5.86.0-1 kiconthemes-5.86.0-1 kidletime-5.86.0-1 kimageannotator-0.5.2-1 kinfocenter-5.22.5-1 kio-5.86.0-1 kio-extras-21.08.1-2 kio-fuse-5.0.1-1 kirigami2-5.86.0-1 kitemmodels-5.86.0-1 kitemviews-5.86.0-1 kjobwidgets-5.86.0-1 kjs-5.86.0-1 kmenuedit-5.22.5-1 kmime-21.08.1-1 knewstuff-5.86.0-2 knotifications-5.86.0-1 knotifyconfig-5.86.0-1 kpackage-5.86.0-1 kparts-5.86.0-1 kpeople-5.86.0-1 kpimtextedit-21.08.1-1 kpmcore-21.08.1-1 kpty-5.86.0-1 kquickcharts-5.86.0-1 krunner-5.86.0-1 kscreen-5.22.5-1 kscreenlocker-5.22.5-1 kservice-5.86.0-1 ksshaskpass-5.22.5-1 ksystemstats-5.22.5-1 ktexteditor-5.86.0-2 ktextwidgets-5.86.0-1 kunitconversion-5.86.0-1 kuserfeedback-1.0.0-1 kwallet-5.86.0-1 kwallet-pam-5.22.5-1 kwayland-5.86.0-1 kwayland-integration-5.22.5-1 kwayland-server-5.22.5-1 kwidgetsaddons-5.86.0-1 kwin-5.22.5-1 kwindowsystem-5.86.0-1 kwrited-5.22.5-1 kxmlgui-5.86.0-1 l-smash-2.14.5-2 lame-3.100-3 layer-shell-qt-5.22.5-1 lcms2-2.12-1 ldb-2:2.4.0-1 libaccounts-glib-1.25-4 libaccounts-qt-1.16-3 libaio-0.3.112-2 libakonadi-21.08.1-1 libass-0.15.2-1 libasyncns-0.8+3+g68cd5af-3 libatasmart-0.19-5 libavc1394-0.5.4-4 libavif-0.9.2-1 libblockdev-2.26-1 libbluray-1.3.0-1 libbsd-0.11.3-1 libbytesize-2.6-1 libcanberra-0.30+2+gc0620e4-5 libcups-1:2.3.3op2-3 libdaemon-0.14-5 libdatrie-0.2.13-1 libdbusmenu-qt5-0.9.3+16.04.20160218-5 libde265-1.0.8-1 libdmtx-0.7.5-2 libevent-2.1.12-1 libexif-0.6.23-1 libfdk-aac-2.0.2-1 libfreeaptx-0.1.1-1 libgit2-1:1.2.0-1 libgphoto2-2.5.27-1 libheif-1.12.0-1 libibus-1.5.25-3 libical-3.0.10-1 libidn-1.38-1 libiec61883-1.2.0-6 libieee1284-0.2.11-11 libimobiledevice-1.3.0-3 libinih-53-1 libjpeg-turbo-2.1.1-1 libkdcraw-21.08.1-1 libkexiv2-21.08.1-1 libkipi-21.08.1-1 libkleo-21.08.1-1 libksane-21.08.1-1 libkscreen-5.22.5-1 libksysguard-5.22.5-1 libldac-2.0.2.3-1 libmbim-1.26.0-2 libmd-1.0.3-1 libmfx-21.3.2-1 libmm-glib-1.18.2-1 libmodplug-0.8.9.0-3 libmtp-1.1.19-1 libndp-1.8-1 libnewt-0.52.21-5 libnm-1.32.12-1 libnotify-0.7.9-2 libogg-1.3.5-1 libpaper-1.1.28-1 libpgm-5.3.128-1 libplist-2.2.0-3 libproxy-0.4.17-2 libpulse-15.0-1 libqaccessibilityclient-0.4.1-2 libqalculate-3.20.1-1 libqmi-1.30.2-1 libqrtr-glib-1.0.0-1 libraw-0.20.2-1 libraw1394-2.1.2-3 librsvg-2:2.52.0-1 libsamplerate-0.2.2-1 libsndfile-1.0.31-1 libsodium-1.0.18-2 libsoup-2.74.0-3 libsoxr-0.1.3-2 libspectre-0.2.9-2 libssh-0.9.6-1 libstemmer-2.1.0-1 libteam-1.31-3 libthai-0.1.28-2 libtheora-1.1.1-5 libtiff-4.3.0-1 libtommath-1.2.0-3 libtool-2.4.6+42+gb88cebd5-16 libusb-1.0.24-2 libusbmuxd-2.0.2-1 libutempter-1.2.1-1 libva-2.13.0-1 libvdpau-1.4-1 libvisual-0.4.0-8 libvorbis-1.3.7-2 libvpx-1.10.0-1 libwebp-1.2.1-2 libxkbcommon-1.3.1-1 libxkbcommon-x11-1.3.1-1 libxres-1.2.1-1 libxslt-1.1.34-6 libxss-1.2.3-3 libyaml-0.2.5-1 libyuv-r2212+dfaf7534-2 libzip-1.8.0-1 lmdb-0.9.29-1 lvm2-2.03.13-1 md4c-0.4.8-1 mdadm-4.1-2 media-player-info-24-2 milou-5.22.5-1 minizip-1:1.2.11-4 mobile-broadband-provider-info-20210805-1 modemmanager-1.18.2-1 modemmanager-qt-5.86.0-1 ndctl-71.1-1 net-snmp-5.9.1-1 networkmanager-1.32.12-1 networkmanager-qt-5.86.0-1 noto-fonts-20201226-2 nspr-4.32-1 nss-3.70-1 openal-1.21.1-1 opencore-amr-0.1.5-5 openjpeg2-2.4.0-1 opus-1.3.1-2 orc-0.4.32-1 oxygen-5.22.5-1 pango-1:1.48.10-1 parted-3.4-2 perl-5.34.0-2 phonon-qt5-4.11.1-2 phonon-qt5-gstreamer-4.10.0-2 pipewire-1:0.3.38-1 pipewire-media-session-1:0.3.38-1 plasma-browser-integration-5.22.5-1 plasma-desktop-5.22.5-1 plasma-disks-5.22.5-1 plasma-firewall-5.22.5-1 plasma-framework-5.86.0-1 plasma-integration-5.22.5-1 plasma-nm-5.22.5-1 plasma-pa-5.22.5-1 plasma-sdk-5.22.5-1 plasma-systemmonitor-5.22.5-1 plasma-thunderbolt-5.22.5-1 plasma-vault-5.22.5-1 plasma-workspace-5.22.5-2 plasma-workspace-wallpapers-5.22.5-1 polkit-0.119-1 polkit-kde-agent-5.22.5-1 polkit-qt5-0.114.0-1 poppler-21.09.0-1 poppler-glib-21.09.0-1 poppler-qt5-21.09.0-1 powerdevil-5.22.5-1 ppp-2.4.9-1 prison-5.86.0-1 pulseaudio-15.0-1 purpose-5.86.0-1 python-dnspython-1:2.1.0-1 python-markdown-3.3.4-1 qca-qt5-2.3.4-1 qgpgme-1.16.0-1 qqc2-desktop-style-5.86.0-1 qrencode-4.1.1-1 qt5-base-5.15.2+kde+r228-1 qt5-declarative-5.15.2+kde+r31-1 qt5-graphicaleffects-5.15.2-1 qt5-location-5.15.2-3 qt5-multimedia-5.15.2-1 qt5-quickcontrols-5.15.2-1 qt5-quickcontrols2-5.15.2+kde+r8-1 qt5-sensors-5.15.2-1 qt5-speech-5.15.2-1 qt5-svg-5.15.2+kde+r7-1 qt5-tools-5.15.2+kde+r17-3 qt5-wayland-5.15.2+kde+r33-1 qt5-webchannel-5.15.2-1 qt5-webengine-5.15.6-2 qt5-x11extras-5.15.2-1 rav1e-0.4.1-1 re2-1:20210901-1 rtkit-0.13-1 run-parts-5.5-1 sane-1.0.32-3 sbc-1.5-2 sddm-0.19.0-7 sddm-kcm-5.22.5-1 sdl2-2.0.16-3 shared-mime-info-2.0+57+gc1d1c70-1 signon-kwallet-extension-21.08.1-1 signon-plugin-oauth2-0.25-1 signon-ui-0.17+20171022-2 signond-8.60-3 slang-2.3.2-2 smartmontools-7.2-1 smbclient-4.15.0-1 snappy-1.1.9-2 socat-1.7.4.1-1 solid-5.86.0-1 sonnet-5.86.0-1 sound-theme-freedesktop-0.8-4 source-highlight-3.1.9-6 speex-1.2.0-3 speexdsp-1.2.0-2 srt-1.4.3-1 svt-av1-0.8.7-1 syndication-5.86.0-1 syntax-highlighting-5.86.0-1 sysfsutils-2.1.1-1 systemsettings-5.22.5-1 taglib-1.12-1 talloc-2.3.3-1 tdb-1.4.5-1 tevent-1:0.11.0-1 texinfo-6.8-2 thin-provisioning-tools-0.9.0-1 threadweaver-5.86.0-1 tslib-1.22-1 ttf-hack-3.003-3 udisks2-2.9.4-1 upower-0.99.13-1 usbmuxd-1.1.1-1 v4l-utils-1.20.0-1 vid.stab-1.1-3 vmaf-1.5.3-1 volume_key-0.3.12-5 webrtc-audio-processing-0.3.1-3 which-2.21-5 wpa_supplicant-2:2.9-8 x264-3:0.161.r3039.544c61f-1 x265-3.5-1 xapian-core-1:1.4.18-1 xcb-util-cursor-0.1.3-3 xcb-util-image-0.4.0-3 xcb-util-keysyms-0.4.0-3 xcb-util-renderutil-0.3.9-3 xcb-util-wm-0.4.1-3 xdg-desktop-portal-kde-5.22.5-1 xdg-user-dirs-0.17-3 xdg-utils-1.1.3+19+g9816ebb-1 xfsprogs-5.13.0-1 xorg-xmessage-1.0.5-2 xvidcore-1.3.7-2 zeromq-4.3.4-2 zimg-3.0.3-1 zita-alsa-pcmi-0.3.2-3 zita-resampler-1.8.0-1 ark-21.08.1-1 dolphin-21.08.1-1 dolphin-plugins-21.08.1-1 filelight-21.08.1-1 gwenview-21.08.1-1 kamera-21.08.1-1 kate-21.08.1-1 kbackup-21.08.1-1 kcalc-21.08.1-1 kcharselect-21.08.1-1 kcolorchooser-21.08.1-1 kcron-21.08.1-1 kdebugsettings-21.08.1-1 kdegraphics-mobipocket-21.08.1-1 kdegraphics-thumbnailers-21.08.1-1 kdf-21.08.1-1 kdialog-21.08.1-1 keditbookmarks-21.08.1-1 kfind-21.08.1-1 kfloppy-21.08.1-1 kgpg-21.08.1-1 khelpcenter-21.08.1-1 kimagemapeditor-21.08.1-1 kipi-plugins-21.08.1-1 kolourpaint-21.08.1-1 konsole-21.08.1-1 kruler-21.08.1-1 ksystemlog-21.08.1-1 kteatime-21.08.1-1 ktimer-21.08.1-1 kwalletmanager-21.08.1-1 kwrite-21.08.1-1 markdownpart-21.08.1-1 okular-21.08.1-1 partitionmanager-21.08.1-1 plasma-meta-5.22-1 print-manager-21.08.1-1 skanlite-21.08.1-1 spectacle-21.08.1-1 svgpart-21.08.1-1 sweeper-21.08.1-1 yakuake-21.08.1-1Total Download Size: 450.58 MiBTotal Installed Size: 2157.68 MiB:: Proceed with installation? [Y/n] :: Retrieving packages...... truncated ...Total (277/277) 450.6 MiB 2001 KiB/s 03:51 [##############################################] 100%(454/454) checking keys in keyring [##############################################] 100%(454/454) checking package integrity [##############################################] 100%(454/454) loading package files [##############################################] 100%(454/454) checking for file conflicts [##############################################] 100%(454/454) checking available disk space [##############################################] 100%:: Running pre-transaction hooks...(1/1) Performing snapper pre snapshots for the following configurations...:: Processing package changes...( 1/454) installing libjpeg-turbo [##############################################] 100%Optional dependencies for libjpeg-turbo java-runtime>11: for TurboJPEG Java wrapper( 2/454) installing xcb-util-keysyms [##############################################] 100%( 3/454) installing xcb-util-renderutil [##############################################] 100%( 4/454) installing which [##############################################] 100%( 5/454) installing xdg-utils [##############################################] 100%Optional dependencies for xdg-utils kde-cli-tools: for KDE Plasma5 support in xdg-open [pending] exo: for Xfce support in xdg-open pcmanfm: for LXDE support in xdg-open perl-file-mimeinfo: for generic support in xdg-open perl-net-dbus: Perl extension to dbus used in xdg-screensaver perl-x11-protocol: Perl X11 protocol used in xdg-screensaver( 6/454) installing shared-mime-info [##############################################] 100%( 7/454) installing xcb-util-wm [##############################################] 100%( 8/454) installing xcb-util-image [##############################################] 100%( 9/454) installing tslib [##############################################] 100%( 10/454) installing libxkbcommon [##############################################] 100%Optional dependencies for libxkbcommon libxkbcommon-x11: xkbcli interactive-x11 [pending] wayland: xkbcli interactive-wayland [installed]( 11/454) installing libxkbcommon-x11 [##############################################] 100%( 12/454) installing libproxy [##############################################] 100%Optional dependencies for libproxy networkmanager: NetworkManager configuration module [pending] perl: Perl bindings [pending] python2: Python 2.x bindings python: Python 3.x bindings [installed] libproxy-webkit: PAC proxy support (via WebKit)( 13/454) installing libtiff [##############################################] 100%Optional dependencies for libtiff freeglut: for using tiffgt( 14/454) installing libdaemon [##############################################] 100%( 15/454) installing avahi [##############################################] 100%Optional dependencies for avahi gtk3: avahi-discover, avahi-discover-standalone, bshell, bssh, bvnc qt5-base: qt5 bindings [pending] libevent: libevent bindings [pending] nss-mdns: NSS support for mDNS python-twisted: avahi-bookmarks python-gobject: avahi-bookmarks, avahi-discover python-dbus: avahi-bookmarks, avahi-discover( 16/454) installing libusb [##############################################] 100%( 17/454) installing libcups [##############################################] 100%( 18/454) installing double-conversion [##############################################] 100%( 19/454) installing md4c [##############################################] 100%( 20/454) installing qt5-base [##############################################] 100%Optional dependencies for qt5-base qt5-svg: to use SVG icon themes [pending] qt5-wayland: to run Qt applications in a Wayland session [pending] qt5-translations: for some native UI translations postgresql-libs: PostgreSQL driver mariadb-libs: MariaDB driver unixodbc: ODBC driver libfbclient: Firebird/iBase driver freetds: MS SQL driver gtk3: GTK platform plugin perl: for fixqt4headers and syncqt [pending]( 21/454) installing db [##############################################] 100%( 22/454) installing libical [##############################################] 100%( 23/454) installing alsa-topology-conf [##############################################] 100%( 24/454) installing alsa-ucm-conf [##############################################] 100%( 25/454) installing alsa-lib [##############################################] 100%( 26/454) installing bluez [##############################################] 100%( 27/454) installing bluez-qt [##############################################] 100%Optional dependencies for bluez-qt qt5-declarative: QML bindings [pending]( 28/454) installing media-player-info [##############################################] 100%( 29/454) installing libplist [##############################################] 100%( 30/454) installing libusbmuxd [##############################################] 100%( 31/454) installing usbmuxd [##############################################] 100%( 32/454) installing libimobiledevice [##############################################] 100%( 33/454) installing upower [##############################################] 100%( 34/454) installing js78 [##############################################] 100%( 35/454) installing polkit [##############################################] 100%( 36/454) installing libatasmart [##############################################] 100%( 37/454) installing dosfstools [##############################################] 100%( 38/454) installing dmraid [##############################################] 100%( 39/454) installing gptfdisk [##############################################] 100%( 40/454) installing libbytesize [##############################################] 100%Optional dependencies for libbytesize python: for bscalc command [installed]( 41/454) installing libaio [##############################################] 100%( 42/454) installing thin-provisioning-tools [##############################################] 100%( 43/454) installing lvm2 [##############################################] 100%( 44/454) installing mdadm [##############################################] 100%( 45/454) installing ndctl [##############################################] 100%( 46/454) installing parted [##############################################] 100%( 47/454) installing nspr [##############################################] 100%( 48/454) installing nss [##############################################] 100%( 49/454) installing volume_key [##############################################] 100%Optional dependencies for volume_key python: for python bindings [installed]( 50/454) installing libinih [##############################################] 100%( 51/454) installing xfsprogs [##############################################] 100%Optional dependencies for xfsprogs python: for xfs_scrub_all script [installed] smtp-forwarder: for xfs_scrub_fail script( 52/454) installing libyaml [##############################################] 100%( 53/454) installing libblockdev [##############################################] 100%( 54/454) installing udisks2 [##############################################] 100%Optional dependencies for udisks2 gptfdisk: GUID partition table support [installed] ntfs-3g: NTFS filesystem management support [installed] dosfstools: VFAT filesystem management support [installed]( 55/454) installing solid [##############################################] 100%Optional dependencies for solid qt5-declarative: QML bindings [pending]( 56/454) installing kcoreaddons [##############################################] 100%Optional dependencies for kcoreaddons python-pyqt5: for the Python bindings( 57/454) installing kwidgetsaddons [##############################################] 100%Optional dependencies for kwidgetsaddons python-pyqt5: for the Python bindings( 58/454) installing qt5-x11extras [##############################################] 100%( 59/454) installing kjobwidgets [##############################################] 100%Optional dependencies for kjobwidgets python-pyqt5: for the Python bindings( 60/454) installing kdbusaddons [##############################################] 100%Optional dependencies for kdbusaddons python-pyqt5: for the Python bindings( 61/454) installing kconfig [##############################################] 100%Optional dependencies for kconfig python-pyqt5: for the Python bindings( 62/454) installing kwindowsystem [##############################################] 100%( 63/454) installing kcrash [##############################################] 100%Optional dependencies for kcrash drkonqi: KDE crash handler application [pending]( 64/454) installing kglobalaccel [##############################################] 100%( 65/454) installing qt5-svg [##############################################] 100%( 66/454) installing polkit-qt5 [##############################################] 100%( 67/454) installing kauth [##############################################] 100%Optional dependencies for kauth python-pyqt5: for the Python bindings( 68/454) installing kcodecs [##############################################] 100%Optional dependencies for kcodecs python-pyqt5: for the Python bindings( 69/454) installing qt5-declarative [##############################################] 100%( 70/454) installing qt5-wayland [##############################################] 100%( 71/454) installing kguiaddons [##############################################] 100%Optional dependencies for kguiaddons python-pyqt5: for the Python bindings( 72/454) installing ki18n [##############################################] 100%Optional dependencies for ki18n python-pyqt5: for the Python bindings python: to compile .ts files [installed]( 73/454) installing kconfigwidgets [##############################################] 100%Optional dependencies for kconfigwidgets python-pyqt5: for the Python bindings perl: for preparetips5 [pending]( 74/454) installing kitemviews [##############################################] 100%Optional dependencies for kitemviews python-pyqt5: for the Python bindings( 75/454) installing karchive [##############################################] 100%( 76/454) installing kiconthemes [##############################################] 100%Optional dependencies for kiconthemes breeze-icons: fallback icon theme [pending]( 77/454) installing kxmlgui [##############################################] 100%( 78/454) installing kbookmarks [##############################################] 100%( 79/454) installing libxslt [##############################################] 100%( 80/454) installing libogg [##############################################] 100%( 81/454) installing libvorbis [##############################################] 100%( 82/454) installing libtool [##############################################] 100%( 83/454) installing libasyncns [##############################################] 100%( 84/454) installing opus [##############################################] 100%( 85/454) installing speexdsp [##############################################] 100%( 86/454) installing speex [##############################################] 100%( 87/454) installing flac [##############################################] 100%( 88/454) installing libsndfile [##############################################] 100%Optional dependencies for libsndfile alsa-lib: for sndfile-play [installed]( 89/454) installing libpulse [##############################################] 100%Optional dependencies for libpulse glib2: mainloop integration [installed]( 90/454) installing tdb [##############################################] 100%Optional dependencies for tdb python: for python bindings [installed]( 91/454) installing sound-theme-freedesktop [##############################################] 100%( 92/454) installing libcanberra [##############################################] 100%( 93/454) installing libdbusmenu-qt5 [##############################################] 100%( 94/454) installing gstreamer [##############################################] 100%( 95/454) installing orc [##############################################] 100%( 96/454) installing iso-codes [##############################################] 100%( 97/454) installing gst-plugins-base-libs [##############################################] 100%( 98/454) installing cdparanoia [##############################################] 100%( 99/454) installing libvisual [##############################################] 100%(100/454) installing libtheora [##############################################] 100%(101/454) installing libdatrie [##############################################] 100%(102/454) installing libthai [##############################################] 100%(103/454) installing cairo [##############################################] 100%(104/454) installing fribidi [##############################################] 100%(105/454) installing pango [##############################################] 100%(106/454) installing graphene [##############################################] 100%(107/454) installing gst-plugins-base [##############################################] 100%(108/454) installing openal [##############################################] 100%Optional dependencies for openal qt5-base: alsoft-config GUI Configurator [installed] fluidsynth: MIDI rendering libmysofa: makemhr tool(109/454) installing qt5-multimedia [##############################################] 100%Optional dependencies for qt5-multimedia qt5-declarative: QML bindings [installed] gst-plugins-good: camera support, additional plugins gst-plugins-bad: camera support, additional plugins gst-plugins-ugly: additional plugins gst-libav: ffmpeg plugin(110/454) installing qt5-speech [##############################################] 100%Optional dependencies for qt5-speech flite: flite TTS backend speech-dispatcher: speech-dispatcher TTS backend(111/454) installing knotifications [##############################################] 100%(112/454) installing kservice [##############################################] 100%(113/454) installing kwallet [##############################################] 100%Optional dependencies for kwallet kwalletmanager: Configuration GUI [pending](114/454) installing kcompletion [##############################################] 100%Optional dependencies for kcompletion python-pyqt5: for the Python bindings(115/454) installing sonnet [##############################################] 100%Optional dependencies for sonnet hunspell: spell checking via hunspell aspell: spell checking via aspell hspell: spell checking for Hebrew libvoikko: Finnish support via Voikko(116/454) installing ktextwidgets [##############################################] 100%(117/454) installing kded [##############################################] 100%(118/454) installing kio [##############################################] 100%Optional dependencies for kio kio-extras: extra protocols support (sftp, fish and more) [pending] kdoctools: for the help kioslave [pending] kio-fuse: to mount remote filesystems via FUSE [pending](119/454) installing kpackage [##############################################] 100%(120/454) installing kdeclarative [##############################################] 100%(121/454) installing bluedevil [##############################################] 100%Optional dependencies for bluedevil pulseaudio-bluetooth: to connect to A2DP profile(122/454) installing libxss [##############################################] 100%(123/454) installing kidletime [##############################################] 100%(124/454) installing syntax-highlighting [##############################################] 100%(125/454) installing source-highlight [##############################################] 100%Optional dependencies for source-highlight lesspipe: src-hilite-lesspipe.sh(126/454) installing perl [##############################################] 100%(127/454) installing texinfo [##############################################] 100%(128/454) installing gc [##############################################] 100%(129/454) installing guile [##############################################] 100%(130/454) installing gdb-common [##############################################] 100%(131/454) installing gdb [##############################################] 100%(132/454) installing drkonqi [##############################################] 100%(133/454) installing kdecoration [##############################################] 100%(134/454) installing kde-gtk-config [##############################################] 100%Optional dependencies for kde-gtk-config gtk2: GTK2 apps support gtk3: GTK3 apps support xsettingsd: apply settings to GTK applications on the fly(135/454) installing knotifyconfig [##############################################] 100%(136/454) installing libxres [##############################################] 100%(137/454) installing qt5-webchannel [##############################################] 100%(138/454) installing qt5-location [##############################################] 100%(139/454) installing libevent [##############################################] 100%Optional dependencies for libevent python: to use event_rpcgen.py [installed](140/454) installing snappy [##############################################] 100%(141/454) installing minizip [##############################################] 100%(142/454) installing aom [##############################################] 100%(143/454) installing gsm [##############################################] 100%(144/454) installing celt [##############################################] 100%(145/454) installing libsamplerate [##############################################] 100%(146/454) installing zita-alsa-pcmi [##############################################] 100%(147/454) installing zita-resampler [##############################################] 100%Optional dependencies for zita-resampler libsndfile: for zresample and zretune [installed](148/454) installing jack2 [##############################################] 100%Optional dependencies for jack2 a2jmidid: for ALSA MIDI to JACK MIDI bridging libffado: for firewire support using FFADO jack2-dbus: for dbus integration realtime-privileges: for realtime privileges zita-ajbridge: for using multiple ALSA devices(149/454) installing lame [##############################################] 100%(150/454) installing libass [##############################################] 100%(151/454) installing libraw1394 [##############################################] 100%(152/454) installing libavc1394 [##############################################] 100%(153/454) installing libbluray [##############################################] 100%Optional dependencies for libbluray java-runtime: BD-J library(154/454) installing dav1d [##############################################] 100%Optional dependencies for dav1d dav1d-doc: HTML documentation(155/454) installing libiec61883 [##############################################] 100%(156/454) installing libmfx [##############################################] 100%(157/454) installing libmodplug [##############################################] 100%(158/454) installing rav1e [##############################################] 100%(159/454) installing gdk-pixbuf2 [##############################################] 100%Optional dependencies for gdk-pixbuf2 libwmf: Load .wmf and .apm libopenraw: Load .dng, .cr2, .crw, .nef, .orf, .pef, .arw, .erf, .mrw, and .raf libavif: Load .avif [pending] libheif: Load .heif, .heic, and .avif [pending] librsvg: Load .svg, .svgz, and .svg.gz [pending] webp-pixbuf-loader: Load .webp(160/454) installing librsvg [##############################################] 100%(161/454) installing libsoxr [##############################################] 100%(162/454) installing libssh [##############################################] 100%(163/454) installing libva [##############################################] 100%Optional dependencies for libva intel-media-driver: backend for Intel GPUs (>= Broadwell) libva-vdpau-driver: backend for Nvidia and AMD GPUs libva-intel-driver: backend for Intel GPUs (<= Haswell)(164/454) installing libvdpau [##############################################] 100%(165/454) installing vid.stab [##############################################] 100%(166/454) installing libvpx [##############################################] 100%(167/454) installing giflib [##############################################] 100%(168/454) installing libwebp [##############################################] 100%Optional dependencies for libwebp freeglut: vwebp viewer(169/454) installing l-smash [##############################################] 100%(170/454) installing x264 [##############################################] 100%(171/454) installing x265 [##############################################] 100%(172/454) installing xvidcore [##############################################] 100%(173/454) installing zimg [##############################################] 100%(174/454) installing opencore-amr [##############################################] 100%(175/454) installing lcms2 [##############################################] 100%(176/454) installing openjpeg2 [##############################################] 100%(177/454) installing libibus [##############################################] 100%(178/454) installing hidapi [##############################################] 100%Optional dependencies for hidapi libusb: for the libusb backend -- hidapi-libusb.so [installed] libudev.so: for the hidraw backend -- hidapi-hidraw.so [installed](179/454) installing sdl2 [##############################################] 100%Optional dependencies for sdl2 alsa-lib: ALSA audio driver [installed] libpulse: PulseAudio audio driver [installed] jack: JACK audio driver [installed] pipewire: PipeWire audio driver [pending] libdecor: Wayland client decorations(180/454) installing srt [##############################################] 100%(181/454) installing svt-av1 [##############################################] 100%(182/454) installing hicolor-icon-theme [##############################################] 100%(183/454) installing sysfsutils [##############################################] 100%(184/454) installing v4l-utils [##############################################] 100%Optional dependencies for v4l-utils qt5-base: for qv4l2 [installed] alsa-lib: for qv4l2 [installed](185/454) installing vmaf [##############################################] 100%(186/454) installing ffmpeg [##############################################] 100%Optional dependencies for ffmpeg avisynthplus: AviSynthPlus support intel-media-sdk: Intel QuickSync support ladspa: LADSPA filters nvidia-utils: Nvidia NVDEC/NVENC support(187/454) installing re2 [##############################################] 100%(188/454) installing gnu-free-fonts [##############################################] 100%(189/454) installing noto-fonts [##############################################] 100%Optional dependencies for noto-fonts noto-fonts-cjk: CJK characters noto-fonts-emoji: Emoji characters noto-fonts-extra: additional variants (condensed, semi-bold, extra-light)(190/454) installing qt5-webengine [##############################################] 100%Optional dependencies for qt5-webengine libpipewire02: WebRTC desktop sharing under Wayland(191/454) installing attica [##############################################] 100%(192/454) installing syndication [##############################################] 100%(193/454) installing knewstuff [##############################################] 100%Optional dependencies for knewstuff kirigami2: QML components [pending](194/454) installing libksysguard [##############################################] 100%(195/454) installing ksystemstats [##############################################] 100%Optional dependencies for ksystemstats networkmanager-qt: network usage monitor [pending](196/454) installing kparts [##############################################] 100%(197/454) installing http-parser [##############################################] 100%(198/454) installing libgit2 [##############################################] 100%(199/454) installing editorconfig-core-c [##############################################] 100%(200/454) installing ktexteditor [##############################################] 100%(201/454) installing libqalculate [##############################################] 100%Optional dependencies for libqalculate gnuplot: for plotting support(202/454) installing libutempter [##############################################] 100%(203/454) installing kpty [##############################################] 100%(204/454) installing kdesu [##############################################] 100%(205/454) installing kcmutils [##############################################] 100%(206/454) installing kactivities [##############################################] 100%Optional dependencies for kactivities qt5-declarative: QML bindings [installed](207/454) installing kde-cli-tools [##############################################] 100%Optional dependencies for kde-cli-tools plasma-workspace: for kcmshell5 [pending](208/454) installing libstemmer [##############################################] 100%(209/454) installing lmdb [##############################################] 100%(210/454) installing dconf [##############################################] 100%(211/454) installing cantarell-fonts [##############################################] 100%(212/454) installing adobe-source-code-pro-fonts [##############################################] 100%(213/454) installing gsettings-desktop-schemas [##############################################] 100%(214/454) installing glib-networking [##############################################] 100%(215/454) installing libsoup [##############################################] 100%Optional dependencies for libsoup samba: Windows Domain SSO(216/454) installing appstream [##############################################] 100%(217/454) installing appstream-qt [##############################################] 100%(218/454) installing kactivitymanagerd [##############################################] 100%(219/454) installing kholidays [##############################################] 100%Optional dependencies for kholidays qt5-declarative: QML bindings [installed](220/454) installing xorg-xmessage [##############################################] 100%(221/454) installing kwayland [##############################################] 100%(222/454) installing qt5-quickcontrols [##############################################] 100%(223/454) installing qt5-quickcontrols2 [##############################################] 100%Optional dependencies for qt5-quickcontrols2 qt5-graphicaleffects: for the Material style [pending](224/454) installing qt5-graphicaleffects [##############################################] 100%(225/454) installing kirigami2 [##############################################] 100%(226/454) installing plasma-framework [##############################################] 100%(227/454) installing threadweaver [##############################################] 100%(228/454) installing krunner [##############################################] 100%(229/454) installing kitemmodels [##############################################] 100%Optional dependencies for kitemmodels python-pyqt5: for the Python bindings qt5-declarative: QML bindings [installed](230/454) installing milou [##############################################] 100%(231/454) installing libdmtx [##############################################] 100%(232/454) installing qrencode [##############################################] 100%(233/454) installing prison [##############################################] 100%Optional dependencies for prison qt5-declarative: QML bindings [installed](234/454) installing layer-shell-qt [##############################################] 100%(235/454) installing kscreenlocker [##############################################] 100%Optional dependencies for kscreenlocker kcmutils: configuration module [installed](236/454) installing xcb-util-cursor [##############################################] 100%(237/454) installing kwayland-server [##############################################] 100%(238/454) installing frameworkintegration [##############################################] 100%Optional dependencies for frameworkintegration appstream-qt: dependency resolving via AppStream [installed] packagekit-qt5: dependency resolving via AppStream(239/454) installing breeze-icons [##############################################] 100%(240/454) installing breeze [##############################################] 100%Optional dependencies for breeze breeze-gtk: Breeze widget style for GTK applications [pending] kcmutils: for breeze-settings [installed](241/454) installing rtkit [##############################################] 100%(242/454) installing alsa-card-profiles [##############################################] 100%(243/454) installing bluez-libs [##############################################] 100%(244/454) installing sbc [##############################################] 100%(245/454) installing libldac [##############################################] 100%(246/454) installing libfreeaptx [##############################################] 100%(247/454) installing libfdk-aac [##############################################] 100%(248/454) installing webrtc-audio-processing [##############################################] 100%(249/454) installing pipewire [##############################################] 100%Created symlink /etc/systemd/user/sockets.target.wants/pipewire.socket → /usr/lib/systemd/user/pipewire.socket.Optional dependencies for pipewire pipewire-docs: Documentation pipewire-media-session: Default session manager [pending] pipewire-alsa: ALSA configuration pipewire-jack: JACK support pipewire-pulse: PulseAudio replacement gst-plugin-pipewire: GStreamer support pipewire-zeroconf: Zeroconf support(250/454) installing pipewire-media-session [##############################################] 100%Created symlink /etc/systemd/user/pipewire-session-manager.service → /usr/lib/systemd/user/pipewire-media-session.service.Created symlink /etc/systemd/user/pipewire.service.wants/pipewire-media-session.service → /usr/lib/systemd/user/pipewire-media-session.service.(251/454) installing libqaccessibilityclient [##############################################] 100%(252/454) installing kwin [##############################################] 100%Optional dependencies for kwin maliit-keyboard: virtual keyboard for kwin-wayland(253/454) installing ttf-hack [##############################################] 100%(254/454) installing qqc2-desktop-style [##############################################] 100%(255/454) installing plasma-integration [##############################################] 100%(256/454) installing kpeople [##############################################] 100%Optional dependencies for kpeople qt5-declarative: QML bindings [installed](257/454) installing kactivities-stats [##############################################] 100%(258/454) installing libkscreen [##############################################] 100%(259/454) installing kquickcharts [##############################################] 100%(260/454) installing kuserfeedback [##############################################] 100%Optional dependencies for kuserfeedback qt5-declarative: QML bindings [installed] qt5-charts: User Feedback console qt5-svg: User Feedback console [installed](261/454) installing kdnssd [##############################################] 100%(262/454) installing talloc [##############################################] 100%Optional dependencies for talloc python: for python bindings [installed](263/454) installing cifs-utils [##############################################] 100%(264/454) installing tevent [##############################################] 100%Optional dependencies for tevent python: for python bindings [installed](265/454) installing ldb [##############################################] 100%Optional dependencies for ldb python: for python bindings [installed](266/454) installing python-markdown [##############################################] 100%(267/454) installing python-dnspython [##############################################] 100%Optional dependencies for python-dnspython python-cryptography: DNSSEC support python-requests-toolbelt: DoH support python-idna: support for updated IDNA 2008 python-curio: async support python-trio: async support python-sniffio: async support(268/454) installing libmd [##############################################] 100%(269/454) installing libbsd [##############################################] 100%(270/454) installing jansson [##############################################] 100%(271/454) installing smbclient [##############################################] 100%Optional dependencies for smbclient python-dnspython: samba_dnsupdate and samba_upgradedns in AD setup [installed](272/454) installing libmtp [##############################################] 100%(273/454) installing phonon-qt5-gstreamer [##############################################] 100%Optional dependencies for phonon-qt5-gstreamer pulseaudio: PulseAudio support [pending] gst-plugins-good: PulseAudio support and good codecs gst-plugins-bad: additional codecs gst-plugins-ugly: additional codecs gst-libav: libav codec(274/454) installing phonon-qt5 [##############################################] 100%Optional dependencies for phonon-qt5 pulseaudio: PulseAudio support [pending] qt5-tools: Designer plugin [pending](275/454) installing kdsoap [##############################################] 100%(276/454) installing kdsoap-ws-discovery-client [##############################################] 100%(277/454) installing kio-extras [##############################################] 100%Optional dependencies for kio-extras qt5-imageformats: thumbnails for additional image formats perl: info kioslave [installed] kimageformats: thumbnails for additional image formats taglib: audio file thumbnails [pending] libappimage: AppImage thumbnails icoutils: Windows executable thumbnails openexr: EXR format thumbnails kactivities-stats: recently used kioslave [installed](278/454) installing fuse3 [##############################################] 100%(279/454) installing kio-fuse [##############################################] 100%(280/454) installing plasma-workspace [##############################################] 100%Optional dependencies for plasma-workspace plasma-workspace-wallpapers: additional wallpapers [pending] gpsd: GPS based geolocation networkmanager-qt: IP based geolocation [pending] kdepim-addons: displaying PIM events in the calendar appmenu-gtk-module: global menu support for GTK2 and some GTK3 applications baloo: Baloo search runner [pending] discover: manage applications installation from the launcher [pending](281/454) installing kunitconversion [##############################################] 100%(282/454) installing kdeplasma-addons [##############################################] 100%Optional dependencies for kdeplasma-addons kross: comic applet purpose: Quickshare applet [pending] quota-tools: disk quota applet qt5-webengine: dictionary and webbrowser applets [installed](283/454) installing kemoticons [##############################################] 100%(284/454) installing kdelibs4support [##############################################] 100%(285/454) installing khotkeys [##############################################] 100%(286/454) installing systemsettings [##############################################] 100%(287/454) installing glu [##############################################] 100%(288/454) installing kinfocenter [##############################################] 100%(289/454) installing qt5-sensors [##############################################] 100%Optional dependencies for qt5-sensors qt5-declarative: QML bindings [installed](290/454) installing kscreen [##############################################] 100%(291/454) installing ksshaskpass [##############################################] 100%(292/454) installing kwrited [##############################################] 100%(293/454) installing oxygen [##############################################] 100%Optional dependencies for oxygen kcmutils: for oxygen-settings5 [installed](294/454) installing signond [##############################################] 100%(295/454) installing signon-kwallet-extension [##############################################] 100%(296/454) installing signon-plugin-oauth2 [##############################################] 100%(297/454) installing dbus-glib [##############################################] 100%(298/454) installing libaccounts-glib [##############################################] 100%(299/454) installing libaccounts-qt [##############################################] 100%(300/454) installing libnotify [##############################################] 100%(301/454) installing signon-ui [##############################################] 100%(302/454) installing kaccounts-integration [##############################################] 100%(303/454) installing accounts-qml-module [##############################################] 100%(304/454) installing purpose [##############################################] 100%Optional dependencies for purpose kdeconnect: sharing to smartphone via KDE Connect telegram-desktop: sharing via Telegram bluedevil: sharing via Bluetooth [installed](305/454) installing exiv2 [##############################################] 100%(306/454) installing poppler [##############################################] 100%Optional dependencies for poppler poppler-data: highly recommended encoding data to display PDF documents with certain encodings and characters(307/454) installing poppler-qt5 [##############################################] 100%(308/454) installing taglib [##############################################] 100%(309/454) installing libzip [##############################################] 100%(310/454) installing libtommath [##############################################] 100%(311/454) installing convertlit [##############################################] 100%(312/454) installing ebook-tools [##############################################] 100%(313/454) installing kfilemetadata [##############################################] 100%Optional dependencies for kfilemetadata libappimage: AppImage extractor(314/454) installing plasma-browser-integration [##############################################] 100%(315/454) installing polkit-kde-agent [##############################################] 100%(316/454) installing kmenuedit [##############################################] 100%(317/454) installing baloo [##############################################] 100%Optional dependencies for baloo qt5-declarative: QML bindings [installed](318/454) installing accountsservice [##############################################] 100%(319/454) installing xdg-user-dirs [##############################################] 100%Created symlink /etc/systemd/user/default.target.wants/xdg-user-dirs-update.service → /usr/lib/systemd/user/xdg-user-dirs-update.service.(320/454) installing plasma-desktop [##############################################] 100%Optional dependencies for plasma-desktop plasma-nm: Network manager applet [pending] powerdevil: power management, suspend and hibernate support [pending] kscreen: screen management [installed] ibus: kimpanel IBUS support scim: kimpanel SCIM support kaccounts-integration: OpenDesktop integration plugin [installed] packagekit-qt5: to install new krunner plugins(321/454) installing smartmontools [##############################################] 100%Optional dependencies for smartmontools s-nail: to get mail alerts to work(322/454) installing plasma-disks [##############################################] 100%(323/454) installing plasma-firewall [##############################################] 100%Optional dependencies for plasma-firewall iproute2: netstat backend [installed] firewalld: firewalld backend ufw: ufw backend(324/454) installing ppp [##############################################] 100%(325/454) installing libmbim [##############################################] 100%(326/454) installing libqrtr-glib [##############################################] 100%(327/454) installing libqmi [##############################################] 100%(328/454) installing mobile-broadband-provider-info [##############################################] 100%(329/454) installing libmm-glib [##############################################] 100%(330/454) installing modemmanager [##############################################] 100%Optional dependencies for modemmanager usb_modeswitch: install if your modem shows up as a storage drive(331/454) installing modemmanager-qt [##############################################] 100%(332/454) installing libnm [##############################################] 100%(333/454) installing wpa_supplicant [##############################################] 100%(334/454) installing gpm [##############################################] 100%(335/454) installing slang [##############################################] 100%(336/454) installing libnewt [##############################################] 100%Optional dependencies for libnewt tcl: whiptcl support python: libnewt support with the _snack module [installed] python2: libnewt support with the _snack module(337/454) installing libndp [##############################################] 100%(338/454) installing libsodium [##############################################] 100%(339/454) installing libpgm [##############################################] 100%(340/454) installing zeromq [##############################################] 100%(341/454) installing libteam [##############################################] 100%(342/454) installing networkmanager [##############################################] 100%Optional dependencies for networkmanager dnsmasq: connection sharing nftables: connection sharing iptables: connection sharing [installed] bluez: Bluetooth support [installed] ppp: dialup connection support [installed] modemmanager: cellular network support [installed] iwd: wpa_supplicant alternative dhclient: alternative DHCP client dhcpcd: alternative DHCP client openresolv: alternative resolv.conf manager firewalld: firewall support(343/454) installing networkmanager-qt [##############################################] 100%(344/454) installing qca-qt5 [##############################################] 100%Optional dependencies for qca-qt5 pkcs11-helper: PKCS-11 plugin botan: botan plugin(345/454) installing plasma-nm [##############################################] 100%Optional dependencies for plasma-nm openconnect: Cisco AnyConnect VPN plugin(346/454) installing plasma-workspace-wallpapers [##############################################] 100%(347/454) installing pulseaudio [##############################################] 100%Created symlink /etc/systemd/user/sockets.target.wants/pulseaudio.socket → /usr/lib/systemd/user/pulseaudio.socket.Optional dependencies for pulseaudio pulseaudio-alsa: ALSA configuration (recommended) pulseaudio-zeroconf: Zeroconf support pulseaudio-lirc: IR (lirc) support pulseaudio-jack: Jack support pulseaudio-bluetooth: Bluetooth support pulseaudio-equalizer: Graphical equalizer pulseaudio-rtp: RTP and RAOP support(348/454) installing plasma-pa [##############################################] 100%(349/454) installing plasma-sdk [##############################################] 100%(350/454) installing plasma-systemmonitor [##############################################] 100%(351/454) installing bolt [##############################################] 100%(352/454) installing plasma-thunderbolt [##############################################] 100%(353/454) installing plasma-vault [##############################################] 100%Optional dependencies for plasma-vault encfs: to use encFS for encryption cryfs: to use cryFS for encryption gocryptfs: to use gocryptfs for encryption(354/454) installing kwayland-integration [##############################################] 100%(355/454) installing socat [##############################################] 100%(356/454) installing kwallet-pam [##############################################] 100%(357/454) installing kgamma5 [##############################################] 100%(358/454) installing sddm [##############################################] 100%(359/454) installing sddm-kcm [##############################################] 100%(360/454) installing breeze-gtk [##############################################] 100%(361/454) installing powerdevil [##############################################] 100%Optional dependencies for powerdevil kinfocenter: for the Energy Information KCM [installed](362/454) installing archlinux-appstream-data [##############################################] 100%(363/454) installing discount [##############################################] 100%(364/454) installing discover [##############################################] 100%Optional dependencies for discover packagekit-qt5: to manage packages from Arch Linux repositories flatpak: Flatpak packages support fwupd: firmware update support(365/454) installing xdg-desktop-portal-kde [##############################################] 100%(366/454) installing plasma-meta [##############################################] 100%Optional dependencies for plasma-meta breeze-grub: Breeze theme for GRUB(367/454) installing ark [##############################################] 100%Optional dependencies for ark p7zip: 7Z format support unrar: RAR decompression support unarchiver: RAR format support lzop: LZO format support lrzip: LRZ format support(368/454) installing filelight [##############################################] 100%(369/454) installing kate [##############################################] 100%Optional dependencies for kate konsole: open a terminal in Kate [pending] clang: C and C++ LSP support python-language-server: Python LSP support texlab: LaTeX LSP support rust: Rust LSP support git: git-blame plugin(370/454) installing kbackup [##############################################] 100%(371/454) installing kcalc [##############################################] 100%(372/454) installing kcharselect [##############################################] 100%(373/454) installing kdebugsettings [##############################################] 100%(374/454) installing kdf [##############################################] 100%(375/454) installing kdialog [##############################################] 100%(376/454) installing keditbookmarks [##############################################] 100%(377/454) installing kfind [##############################################] 100%Optional dependencies for kfind mlocate: search using mlocate index(378/454) installing kfloppy [##############################################] 100%(379/454) installing libakonadi [##############################################] 100%(380/454) installing kcontacts [##############################################] 100%(381/454) installing kmime [##############################################] 100%(382/454) installing grantlee [##############################################] 100%(383/454) installing grantleetheme [##############################################] 100%(384/454) installing qgpgme [##############################################] 100%(385/454) installing kpimtextedit [##############################################] 100%(386/454) installing libkleo [##############################################] 100%(387/454) installing akonadi-contacts [##############################################] 100%(388/454) installing kgpg [##############################################] 100%(389/454) installing konsole [##############################################] 100%Optional dependencies for konsole keditbookmarks: to manage bookmarks [installed](390/454) installing kteatime [##############################################] 100%(391/454) installing ktimer [##############################################] 100%(392/454) installing kwalletmanager [##############################################] 100%(393/454) installing kwrite [##############################################] 100%(394/454) installing markdownpart [##############################################] 100%(395/454) installing print-manager [##############################################] 100%Optional dependencies for print-manager system-config-printer: auto-detect the printer driver(396/454) installing sweeper [##############################################] 100%(397/454) installing yakuake [##############################################] 100%(398/454) installing baloo-widgets [##############################################] 100%(399/454) installing dolphin [##############################################] 100%Optional dependencies for dolphin kde-cli-tools: for editing file type options [installed] ffmpegthumbs: video thumbnails kdegraphics-thumbnailers: PDF and PS thumbnails [pending] konsole: terminal panel [installed] purpose: share context menu [installed](400/454) installing run-parts [##############################################] 100%(401/454) installing cronie [##############################################] 100%Optional dependencies for cronie smtp-server: send job output via email smtp-forwarder: forward job output to email server(402/454) installing kcron [##############################################] 100%(403/454) installing kjs [##############################################] 100%(404/454) installing khtml [##############################################] 100%(405/454) installing docbook-xml [##############################################] 100%(406/454) installing docbook-xsl [##############################################] 100%(407/454) installing kdoctools [##############################################] 100%(408/454) installing xapian-core [##############################################] 100%(409/454) installing khelpcenter [##############################################] 100%(410/454) installing ksystemlog [##############################################] 100%(411/454) installing kpmcore [##############################################] 100%Optional dependencies for kpmcore e2fsprogs: ext2/3/4 support [installed] xfsprogs: XFS support [installed] jfsutils: JFS support reiserfsprogs: Reiser support ntfs-3g: NTFS support [installed] dosfstools: FAT32 support [installed] fatresize: FAT resize support f2fs-tools: F2FS support exfat-utils: exFAT support exfatprogs: exFAT support (alternative to exfat-utils) nilfs-utils: nilfs support udftools: UDF support(412/454) installing partitionmanager [##############################################] 100%(413/454) installing dolphin-plugins [##############################################] 100%Optional dependencies for dolphin-plugins ktexteditor: Mercurial plugin [installed](414/454) installing libkipi [##############################################] 100%(415/454) installing jasper [##############################################] 100%Optional dependencies for jasper jasper-doc: documentation freeglut: jiv support glu: jiv support [installed](416/454) installing libraw [##############################################] 100%(417/454) installing libkdcraw [##############################################] 100%(418/454) installing cfitsio [##############################################] 100%(419/454) installing gwenview [##############################################] 100%Optional dependencies for gwenview qt5-imageformats: support for tiff, webp, and more image formats kimageformats: support for dds, xcf, exr, psd, and more image formats kipi-plugins: export to various online services [pending] kamera: import pictures from gphoto2 cameras [pending](420/454) installing libexif [##############################################] 100%(421/454) installing libyuv [##############################################] 100%(422/454) installing libavif [##############################################] 100%(423/454) installing libde265 [##############################################] 100%Optional dependencies for libde265 ffmpeg: for sherlock265 [installed] qt5-base: for sherlock265 [installed] sdl: dec265 YUV overlay output(424/454) installing libheif [##############################################] 100%Optional dependencies for libheif libjpeg: for heif-convert and heif-enc [installed] libpng: for heif-convert and heif-enc [installed](425/454) installing gd [##############################################] 100%Optional dependencies for gd perl: bdftogd script [installed](426/454) installing libgphoto2 [##############################################] 100%(427/454) installing kamera [##############################################] 100%(428/454) installing kcolorchooser [##############################################] 100%(429/454) installing kdegraphics-mobipocket [##############################################] 100%(430/454) installing libkexiv2 [##############################################] 100%(431/454) installing jbig2dec [##############################################] 100%(432/454) installing libpaper [##############################################] 100%(433/454) installing ijs [##############################################] 100%(434/454) installing libidn [##############################################] 100%(435/454) installing ghostscript [##############################################] 100%Optional dependencies for ghostscript texlive-core: needed for dvipdf gtk3: needed for gsx(436/454) installing kdegraphics-thumbnailers [##############################################] 100%(437/454) installing kimagemapeditor [##############################################] 100%(438/454) installing kipi-plugins [##############################################] 100%Optional dependencies for kipi-plugins libmediawiki: MediaWiki Export plugin libkvkontakte: VKontakte.ru Exporter plugin qt5-xmlpatterns: rajce.net plugin(439/454) installing libieee1284 [##############################################] 100%Optional dependencies for libieee1284 python: for python module [installed](440/454) installing net-snmp [##############################################] 100%Optional dependencies for net-snmp perl-term-readkey: for snmpcheck application perl-tk: for snmpcheck and tkmib applications python: for the python modules [installed](441/454) installing poppler-glib [##############################################] 100%(442/454) installing sane [##############################################] 100%(443/454) installing libksane [##############################################] 100%(444/454) installing kolourpaint [##############################################] 100%(445/454) installing kruler [##############################################] 100%(446/454) installing djvulibre [##############################################] 100%(447/454) installing libspectre [##############################################] 100%(448/454) installing okular [##############################################] 100%Optional dependencies for okular ebook-tools: mobi and epub support [installed] kdegraphics-mobipocket: mobi support [installed] libzip: CHM support [installed] khtml: CHM support [installed] chmlib: CHM support calligra: ODT and ODP support unrar: Comic Book Archive support unarchiver: Comic Book Archive support (alternative)(449/454) installing skanlite [##############################################] 100%(450/454) installing qt5-tools [##############################################] 100%Optional dependencies for qt5-tools clang: for qdoc qt5-webkit: for Qt Assistant(451/454) installing kcolorpicker [##############################################] 100%(452/454) installing kimageannotator [##############################################] 100%(453/454) installing spectacle [##############################################] 100%Optional dependencies for spectacle kipi-plugins: export to various online services [installed](454/454) installing svgpart [##############################################] 100%:: Running post-transaction hooks...( 1/19) Creating system user accounts...Creating group saned with gid 991.Creating user saned (SANE daemon user) with uid 991 and gid 991.Creating group usbmux with gid 140.( 2/19) Reloading system manager configuration... Skipped: Running in chroot.( 3/19) Updating udev hardware database...( 4/19) Creating temporary files...Failed to parse ACL "d:group::r-x,d:group:adm:r-x,d:group:wheel:r-x,group::r-x,group:adm:r-x,group:wheel:r-x": Invalid argument. IgnoringFailed to parse ACL "d:group:adm:r-x,d:group:wheel:r-x,group:adm:r-x,group:wheel:r-x": Invalid argument. IgnoringFailed to parse ACL "group:adm:r--,group:wheel:r--": Invalid argument. IgnoringFailed to parse ACL "d:group::r-x,d:group:adm:r-x,d:group:wheel:r-x,group::r-x,group:adm:r-x,group:wheel:r-x": Invalid argument. IgnoringFailed to parse ACL "d:group:adm:r-x,d:group:wheel:r-x,group:adm:r-x,group:wheel:r-x": Invalid argument. IgnoringFailed to parse ACL "group:adm:r--,group:wheel:r--": Invalid argument. IgnoringFailed to open file "/sys/devices/system/cpu/microcode/reload": Read-only file systemerror: command failed to execute correctly( 5/19) Reloading device manager configuration... Skipped: Running in chroot.( 6/19) Arming ConditionNeedsUpdate...( 7/19) Updating fontconfig configuration...( 8/19) Updating linux initcpios...==> Building image from preset: /etc/mkinitcpio.d/linux-lts.preset: 'default' -> -k /boot/vmlinuz-linux-lts -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-lts.img==> Starting build: 5.10.70-1-lts -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [autodetect] -> Running build hook: [modconf] -> Running build hook: [block]==> WARNING: Possibly missing firmware for module: xhci_pci -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck]==> Generating module dependencies==> Creating zstd-compressed initcpio image: /boot/initramfs-linux-lts.img==> Image generation successful==> Building image from preset: /etc/mkinitcpio.d/linux-lts.preset: 'fallback' -> -k /boot/vmlinuz-linux-lts -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-lts-fallback.img -S autodetect==> Starting build: 5.10.70-1-lts -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [modconf] -> Running build hook: [block]==> WARNING: Possibly missing firmware for module: aic94xx==> WARNING: Possibly missing firmware for module: wd719x==> WARNING: Possibly missing firmware for module: xhci_pci -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck]==> Generating module dependencies==> Creating zstd-compressed initcpio image: /boot/initramfs-linux-lts-fallback.img==> Image generation successful==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default' -> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux.img==> Starting build: 5.14.8-arch1-1 -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [autodetect] -> Running build hook: [modconf] -> Running build hook: [block]==> WARNING: Possibly missing firmware for module: xhci_pci -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck]==> Generating module dependencies==> Creating zstd-compressed initcpio image: /boot/initramfs-linux.img==> Image generation successful==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback' -> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-fallback.img -S autodetect==> Starting build: 5.14.8-arch1-1 -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [modconf] -> Running build hook: [block]==> WARNING: Possibly missing firmware for module: aic94xx==> WARNING: Possibly missing firmware for module: wd719x==> WARNING: Possibly missing firmware for module: xhci_pci -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck]==> Generating module dependencies==> Creating zstd-compressed initcpio image: /boot/initramfs-linux-fallback.img==> Image generation successful( 9/19) Reloading system bus configuration... Skipped: Running in chroot.(10/19) Warn about old perl modulesperl: warning: Setting locale failed.perl: warning: Please check that your locale settings: LANGUAGE = "", LC_ALL = (unset), LANG = "en_US.UTF-8" are supported and installed on your system.perl: warning: Falling back to the standard locale ("C").(11/19) Updating fontconfig cache...(12/19) Probing GDK-Pixbuf loader modules...(13/19) Updating GIO module cache...(14/19) Compiling GSettings XML schema files...(15/19) Updating the info directory file...(16/19) Updating the appstream cache...AppStream system cache refresh failed. Turn on verbose mode to get detailed issue information.error: command failed to execute correctly(17/19) Updating the MIME type database...(18/19) Updating X fontdir indices...(19/19) Performing snapper post snapshots for the following configurations...
    Again note the optional dependencies and install those desired later to realize the functionality they. For example the packges indicated as sonnet dependencies are necessary for spell checking functionality.
  6. Install other desired programs.
    [root@G5-openSUSE /]# pacstrap /mnt fish starship neofetch reflector git
    Two of the packages I install at this point are reflector, useful for easily sorting package repository mirrors, and git, needed for installing packages manually from the AUR. I installed the base-devel group -- required by pacman wrappers for AUR support -- later after booting into the installed system with a working desktop environment, but now would be a good time to intall it. The command with the output:
    [root@G5-openSUSE /]# pacstrap /mnt fish starship neofetch reflector git==> Creating install root at /mnt==> Installing packages to /mnt:: Synchronizing package databases... core is up to date extra is up to date community is up to dateresolving dependencies...looking for conflicting packages...Packages (9) perl-error-0.17029-3 perl-mailtools-2.21-5 perl-timedate-2.33-3 ttf-iosevka-nerd-2.1.0-1 fish-3.3.1-1 git-2.33.0-1 neofetch-7.1.0-2 reflector-2021.7.8-1 starship-0.58.0-2Total Download Size: 14.64 MiBTotal Installed Size: 158.62 MiB:: Proceed with installation? [Y/n] :: Retrieving packages... fish-3.3.1-1-x86_64 2.8 MiB 2.11 MiB/s 00:01 [##############################################] 100% ttf-iosevka-nerd-2.1.0-1-any 4.2 MiB 3.50 MiB/s 00:01 [##############################################] 100% starship-0.58.0-2-x86_64 1619.7 KiB 5.49 MiB/s 00:00 [##############################################] 100% neofetch-7.1.0-2-any 83.1 KiB 561 KiB/s 00:00 [##############################################] 100% reflector-2021.7.8-1-any 26.7 KiB 163 KiB/s 00:00 [##############################################] 100% perl-error-0.17029-3-any 21.8 KiB 127 KiB/s 00:00 [##############################################] 100% perl-timedate-2.33-3-any 35.8 KiB 229 KiB/s 00:00 [##############################################] 100% perl-mailtools-2.21-5-any 62.2 KiB 379 KiB/s 00:00 [##############################################] 100% git-2.33.0-1-x86_64 5.9 MiB 3.75 MiB/s 00:02 [##############################################] 100% Total (9/9) 14.6 MiB 2.29 MiB/s 00:06 [##############################################] 100%(9/9) checking keys in keyring [##############################################] 100%(9/9) checking package integrity [##############################################] 100%(9/9) loading package files [##############################################] 100%(9/9) checking for file conflicts [##############################################] 100%(9/9) checking available disk space [##############################################] 100%:: Running pre-transaction hooks...(1/1) Performing snapper pre snapshots for the following configurations...:: Processing package changes...(1/9) installing fish [##############################################] 100%Optional dependencies for fish python: man page completion parser / web config tool [installed] pkgfile: command-not-found hook(2/9) installing ttf-iosevka-nerd [##############################################] 100%(3/9) installing starship [##############################################] 100%(4/9) installing neofetch [##############################################] 100%Optional dependencies for neofetch catimg: Display Images chafa: Image to text support feh: Wallpaper Display imagemagick: Image cropping / Thumbnail creation / Take a screenshot jp2a: Display Images libcaca: Display Images nitrogen: Wallpaper Display w3m: Display Images xdotool: See https://github.com/dylanaraps/neofetch/wiki/Images-in-the-terminal xorg-xdpyinfo: Resolution detection (Single Monitor) [installed] xorg-xprop: Desktop Environment and Window Manager [installed] xorg-xrandr: Resolution detection (Multi Monitor + Refresh rates) [installed] xorg-xwininfo: See https://github.com/dylanaraps/neofetch/wiki/Images-in-the-terminal [installed](5/9) installing reflector [##############################################] 100%Optional dependencies for reflector rsync: rate rsync mirrors(6/9) installing perl-error [##############################################] 100%(7/9) installing perl-timedate [##############################################] 100%(8/9) installing perl-mailtools [##############################################] 100%(9/9) installing git [##############################################] 100%Optional dependencies for git tk: gitk and git gui perl-libwww: git svn perl-term-readkey: git svn and interactive.singlekey setting perl-io-socket-ssl: git send-email TLS support perl-authen-sasl: git send-email TLS support perl-mediawiki-api: git mediawiki support perl-datetime-format-iso8601: git mediawiki support perl-lwp-protocol-https: git mediawiki https support perl-cgi: gitweb (web interface) support python: git svn & git p4 [installed] subversion: git svn org.freedesktop.secrets: keyring credential helper libsecret: libsecret credential helper [installed]:: Running post-transaction hooks...(1/7) Creating system user accounts...Creating group git with gid 990.Creating user git (git daemon user) with uid 990 and gid 990.(2/7) Reloading system manager configuration... Skipped: Running in chroot.(3/7) Arming ConditionNeedsUpdate...(4/7) Warn about old perl modulesperl: warning: Setting locale failed.perl: warning: Please check that your locale settings: LANGUAGE = "", LC_ALL = (unset), LANG = "en_US.UTF-8" are supported and installed on your system.perl: warning: Falling back to the standard locale ("C").(5/7) Updating fontconfig cache...(6/7) Updating X fontdir indices...(7/7) Performing snapper post snapshots for the following configurations...
  7. Install packages for accessing man and texinfo pages.
    [root@G5-openSUSE /]# pacstrap /mnt man-db man-pages texinfo
    The command with the output:
    [root@G5-openSUSE /]# pacstrap /mnt man-db man-pages texinfo==> Creating install root at /mnt==> Installing packages to /mnt:: Synchronizing package databases... core is up to date extra is up to date community is up to datewarning: texinfo-6.8-2 is up to date -- reinstallingresolving dependencies...looking for conflicting packages...Packages (5) groff-1.22.4-6 libpipeline-1.5.3-1 man-db-2.9.4-2 man-pages-5.13-1 texinfo-6.8-2Total Download Size: 9.08 MiBTotal Installed Size: 26.53 MiBNet Upgrade Size: 17.79 MiB:: Proceed with installation? [Y/n] :: Retrieving packages... groff-1.22.4-6-x86_64 2.1 MiB 2.59 MiB/s 00:01 [##############################################] 100% libpipeline-1.5.3-1-x86_64 39.8 KiB 184 KiB/s 00:00 [##############################################] 100% man-db-2.9.4-2-x86_64 1059.0 KiB 3.92 MiB/s 00:00 [##############################################] 100% man-pages-5.13-1-any 5.9 MiB 2.48 MiB/s 00:02 [##############################################] 100% Total (4/4) 9.1 MiB 2.09 MiB/s 00:04 [##############################################] 100%(5/5) checking keys in keyring [##############################################] 100%(5/5) checking package integrity [##############################################] 100%(5/5) loading package files [##############################################] 100%(5/5) checking for file conflicts [##############################################] 100%(5/5) checking available disk space [##############################################] 100%:: Running pre-transaction hooks...(1/1) Performing snapper pre snapshots for the following configurations...:: Processing package changes...(1/5) installing groff [##############################################] 100%Optional dependencies for groff netpbm: for use together with man -H command interaction in browsers psutils: for use together with man -H command interaction in browsers libxaw: for gxditview [installed] perl-file-homedir: for use with glilypond(2/5) installing libpipeline [##############################################] 100%(3/5) installing man-db [##############################################] 100%Optional dependencies for man-db gzip [installed](4/5) installing man-pages [##############################################] 100%(5/5) reinstalling texinfo [##############################################] 100%:: Running post-transaction hooks...(1/5) Reloading system manager configuration... Skipped: Running in chroot.(2/5) Creating temporary files...Failed to parse ACL "d:group::r-x,d:group:adm:r-x,d:group:wheel:r-x,group::r-x,group:adm:r-x,group:wheel:r-x": Invalid argument. IgnoringFailed to parse ACL "d:group:adm:r-x,d:group:wheel:r-x,group:adm:r-x,group:wheel:r-x": Invalid argument. IgnoringFailed to parse ACL "group:adm:r--,group:wheel:r--": Invalid argument. IgnoringFailed to parse ACL "d:group::r-x,d:group:adm:r-x,d:group:wheel:r-x,group::r-x,group:adm:r-x,group:wheel:r-x": Invalid argument. IgnoringFailed to parse ACL "d:group:adm:r-x,d:group:wheel:r-x,group:adm:r-x,group:wheel:r-x": Invalid argument. IgnoringFailed to parse ACL "group:adm:r--,group:wheel:r--": Invalid argument. IgnoringFailed to open file "/sys/devices/system/cpu/microcode/reload": Read-only file systemerror: command failed to execute correctly(3/5) Arming ConditionNeedsUpdate...(4/5) Updating the info directory file...(5/5) Performing snapper post snapshots for the following configurations...
  8. Generate fstab. The -U option ensures that partitions are identified by UUIDs instead of kernel assigned block names (e.g. /dev/sda5/dev/nvme0n1p7).
    [root@G5-openSUSE /]# genfstab -U /mnt >> /mnt/etc/fstab
  9. Edit the generated fstab. Remove the subvolume identification from the subvolume mounted to /, specifically, remove "subvolid=258,subvol=/@/.snapshots/1/snapshot". Otherwise, the booted system will use this subvolume target as the filesystem root even if we want to boot into a snapshot to initiate a rollback or to a new default subvolume if it is changed by Snapper or by some other means.
    nano /mnt/etc/fstab
    The following images show /etc/fstab before and after the necessary changes.
    • An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (4)
    • An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (5)

    Edit /etc/fstab

    Edit /etc/fstab ,accessed as /mnt/etc/fstab from the chroot environment, to remove the subvolume identifier mount options (subvolid=258,subvol=/@/.snapshots/1/snapshot) on the line where / is the target.

  10. Edit the files /etc/grub.d/10_linux and /etc/grub.d/20_linux_xen, accessed from within our chroot environment as /mnt/etc/grub.d/10_linux and /mnt/etc/grub.d/20_linux_xen. In both files remove
    rootflags=subvol=${rootsubvol}
    with our editor
    [root@G5-openSUSE /]# nano /mnt/etc/grub.d/10_linux
    and
    [root@G5-openSUSE /]# nano /mnt/etc/grub.d/20_linux_xen
    The following images show these files before and after making the necessary changes.
    • An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (6)
    • An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (7)
    • An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (8)
    • An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (9)
    • An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (10)
    • An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (11)
    • An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (12)
    • An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (13)

    Modifying /etc/grub.d/10_linux and /etc/grub.d/20_linux_xen

    Image 1: Text to replace in /etc/grub.d/10_linux shown in nanoImage 2: Replacing with "" (no characters in field) in nanoImage 3: The text to replace highlighted.Image 4: The file with the text removed.Image 5: Text to replace in /etc/grub.d/20_linux_xen shown in nanoImage 6: Replacing with "" (no characters in field) in nanoImage 7: Text to be removed highlighted.Image 8: The file with the text removed.

This modification is necessary because otherwise GRUB will always look for the kernel in /@/boot instead of /@/.snapshots/1/snapshot/boot, or the appropriate location if another future snapshot becomes the default subvolume after a rollback, e.g., /@/.snapshots/34/snapshot/boot if the 34th snapshot becomes the default.

Installation Part II: Basic System Configuration

Chroot into newly Installed Arch

Basic System Configuration

Our last chroot was from our host computer to the Arch bootstrap environment. We now chroot from the Arch bootstrap environment to the new system.

[root@G5-openSUSE /]# arch-chroot /mnt

The prompt does not change. The command with the output:

[root@G5-openSUSE /]# arch-chroot /mnt[root@G5-openSUSE /]# 
  1. Set the timezone by making a symbolic link to a file in /usr/share/zoneinfo/Region/City to /etc/localtime. In my case Region is America and City is New_York. Other available time zones can be determined by browsing the subdirectories of /usr/share/zoneinfo, e.g.
    [root@G5-openSUSE /]# ls -l /usr/share/zoneinfo/Europe/
    Make the symbolic link to the appropriate zone file:
    [root@G5-openSUSE /]# ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime
  2. Generate /etc/adjtime to synchronize the system time to the hardware clock with the hwclock command.
    [root@G5-openSUSE /]# hwclock --systohc
    The option used is different depending on whether the hardware clock is set to UTC or local time. The option used here --systohc is used if the hardware clock is set to UTC as is recommended when multiple OSes are installed on the computer and all are aware of this.
  3. Set the locale. First edit /etc/locale.gen to uncomment needed locales.
    [root@G5-openSUSE /]# nano /etc/locale.gen
    . In my case I uncommented en_US.UTF-8 UTF-8.Then run the locale-gen
    [root@G5-openSUSE /]# locale-gen
    The command with the output:
    [root@G5-openSUSE /]# locale-genGenerating locales... en_US.UTF-8... doneGeneration complete.
  4. Create the /etc/locale.conf file.
    [root@G5-openSUSE /]# touch /etc/locale.conf
  5. Set the LANG environment variable in /etc/locale.conf.
    [root@G5-openSUSE /]# nano /etc/locale.conf
    I need the en_US.UTF-8 locale so I entered the following in /etc/locale.conf. The entered string must be in the first column of the file.
    LANG=en_US.UTF-8
    Other environment variables are also available to refine the locale, but if they are not set the value set for LANG is used for the behavior they would define. (see man locale.7)
  6. Configure the virtual console -- the terminal available before the graphical environment starts and those available by pressing the Ctrl + Alt + Fn keys. Some of the options available are the keyboard layout and the font. The defaults are appropriate for me, so I didn't need to do anything. Users who want a different or optional keymap will need to add appropriate entries to the /etc/vconsole.conf file. (See man vconsole.conf.)
    nano /etc/vconsole.conf
  7. Set the hostname by editing the file /etc/hostname.
    [root@G5-openSUSE /]# nano /etc/hostname
    and entering the desired hostname. I chose G5-ARCH-B.
  8. Configure hosts by editing /etc/hosts
    [root@G5-openSUSE /]# nano /etc/hosts
    I entered
    127.0.0.1localhost::1localhost127.0.1.1G5-ARCH-B.localdomainG5-ARCH-B
    Note that the hostname entered in the previous step is also entered here as the first part of a fully qualified domain name and as the hostname in the second and third elements, respectively, of the third line. This configuration is appropriate for a host with a dynamic IP address assigned by DHCP and not for a host with a fixed IP address, in which case 127.0.1.1 is replaced with the fixed IP address and if an actual domain is configured for the host, localdomain would be replaced with the domain.
  9. Optionally create a new initramfs with
    mkinitcpio -p linux
    after editing /etc/mkinitcpio.conf. I opted not to do this during installation, but instead to optimize the initramfs configuration at /etc/mkinitcpio.conf later after installation and then generate the initramfs image.

Initialize Snapper

Next we make some adjustments so that Snapper will work in its default manner with our Arch system. Before we do that, it is beneficial to view the subvolume layout and how the subvolumes are mounted. We can view the mounted subvolumes with the mount command.

[root@G5-openSUSE /]# mount/dev/nvme0n1p7 on / type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=258,subvol=/@/.snapshots/1/snapshot)/dev/nvme0n1p7 on /.snapshots type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=257,subvol=/@/.snapshots)/dev/nvme0n1p7 on /boot/grub type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=259,subvol=/@/boot/grub)/dev/nvme0n1p7 on /opt type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=260,subvol=/@/opt)/dev/nvme0n1p7 on /root type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=261,subvol=/@/root)/dev/nvme0n1p7 on /tmp type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=263,subvol=/@/tmp)/dev/nvme0n1p7 on /srv type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=262,subvol=/@/srv)/dev/nvme0n1p7 on /usr/local type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=264,subvol=/@/usr/local)/dev/nvme0n1p7 on /var/cache type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=265,subvol=/@/var/cache)/dev/nvme0n1p7 on /var/log type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=266,subvol=/@/var/log)/dev/nvme0n1p7 on /var/spool type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=267,subvol=/@/var/spool)/dev/nvme0n1p7 on /var/tmp type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=268,subvol=/@/var/tmp)/dev/nvme0n1p1 on /efi type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)/dev/sda5 on /home type ext4 (rw,relatime)proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)sys on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)efivarfs on /sys/firmware/efi/efivars type efivarfs (rw,nosuid,nodev,noexec,relatime)udev on /dev type devtmpfs (rw,nosuid,relatime,size=12134028k,nr_inodes=3033507,mode=755,inode64)devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)shm on /dev/shm type tmpfs (rw,nosuid,nodev,relatime,inode64)tmpfs on /run type tmpfs (rw,nosuid,nodev,size=4859024k,nr_inodes=819200,mode=755,inode64)tmp on /tmp type tmpfs (rw,nosuid,nodev,inode64)tmpfs on /etc/resolv.conf type tmpfs (rw,nosuid,nodev,size=4859024k,nr_inodes=819200,mode=755,inode64)

And the subvolumes are:

[root@G5-openSUSE /]# btrfs subvolume list /ID 256 gen 30 top level 5 path @ID 257 gen 45 top level 256 path @/.snapshotsID 258 gen 104 top level 257 path @/.snapshots/1/snapshotID 259 gen 45 top level 256 path @/boot/grubID 260 gen 45 top level 256 path @/optID 261 gen 84 top level 256 path @/rootID 262 gen 54 top level 256 path @/srvID 263 gen 45 top level 256 path @/tmpID 264 gen 54 top level 256 path @/usr/localID 265 gen 85 top level 256 path @/var/cacheID 266 gen 85 top level 256 path @/var/logID 267 gen 54 top level 256 path @/var/spoolID 268 gen 58 top level 256 path @/var/tmpID 271 gen 56 top level 258 path var/lib/portablesID 273 gen 57 top level 258 path var/lib/machines

Note that the installation target, the initial snapshot subvolid=258,subvol=/@/.snapshots/1/snapshot is mounted at /. (This same subvolume will be mounted at / in the final installed system but without the subvolume identifier for reasons discussed previously.) And the subvolid=257,subvol=/@/.snapshots subvolume is mounted at /.snapshots. Because the initial snapshot subvolid=258 is mounted at / and the snapshots subvolume (subvolid=257) is mounted at /.snapshots, this means the snapshots subvolume is under the subvolume mounted at /. This is a requirement of Snapper for its upstream default normal operation.

Snapper requires an initialization command to begin creating snapshots of a subvolume. To initialize the creation of snapshots of the subvolume mounted at / the command

snapper -c root create-config /

is executed. This creates a configuration file named /etc/snapper/configs/root for snapshotting the subvolume mounted at / by copying /etc/snapper/config-templates/default. It also creates a subvolume named .snapshots in the subvolume mounted at / and makes the directory /.snapshots to which to mount it. For the command to complete successfully, thus enabling snapshotting of the subvolume mounted at /,

  1. there must not be a subvolume with the same name as the subvolume Snapper wants to create inside the subvolume mounted at root.
  2. the directory /.snapshots must not exist
  3. the configuration file has to be created at the approproate location, which requires conditoins #1 and #2 to be satisfied

So we must perform the actions below to "trick" Snapper into making the configuration file, by first unmounting the /@/.snapshots subvolume, deleting its mountpoint (/.snapshots), running the Snapper configuraiton command, deleting the subvolume created by Snapper, remaking the mountpoint, and finally remounting our original /@/snapshots subvolume. For those wondering why the configuration file can't be copied manually, and the name of the configuration added to /etc/conf.d/snapper, it is possible, but Snapper commands result in errors.

  1. Unount the @/.snapshots subvolume from /.snapshots.
    [root@G5-openSUSE /]# umount /.snapshots
  2. Remove the directory that was the mountpoint of the @/.snapshots subvolume. Removing the directory does not delete the subvolume since it was unmounted in the last command.
    [root@G5-openSUSE /]# rm -r /.snapshots
    The subvolume @/.snapshots/1/snapshot is also unaffected since its ancestor snapshot was unmounted above. The btrfs subvolume list command shows that they are still there:
    [root@G5-openSUSE /]# btrfs subvolume list /ID 256 gen 28 top level 5 path @ID 257 gen 23 top level 256 path @/.snapshotsID 258 gen 100 top level 257 path @/.snapshots/1/snapshotID 259 gen 12 top level 256 path @/boot/grubID 260 gen 13 top level 256 path @/optID 261 gen 73 top level 256 path @/rootID 262 gen 40 top level 256 path @/srvID 263 gen 16 top level 256 path @/tmpID 264 gen 40 top level 256 path @/usr/localID 265 gen 75 top level 256 path @/var/cacheID 266 gen 76 top level 256 path @/var/logID 267 gen 71 top level 256 path @/var/spoolID 268 gen 44 top level 256 path @/var/tmpID 272 gen 42 top level 258 path var/lib/portablesID 273 gen 43 top level 258 path var/lib/machines
    But using the mount command again, we see that the subvolume /@/.snapshots is not mounted anymore:
    [root@G5-openSUSE /]# mount/dev/nvme0n1p7 on / type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=258,subvol=/@/.snapshots/1/snapshot)/dev/nvme0n1p7 on /boot/grub type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=259,subvol=/@/boot/grub)/dev/nvme0n1p7 on /opt type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=260,subvol=/@/opt)/dev/nvme0n1p7 on /root type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=261,subvol=/@/root)/dev/nvme0n1p7 on /srv type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=262,subvol=/@/srv)/dev/nvme0n1p7 on /tmp type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=263,subvol=/@/tmp)/dev/nvme0n1p7 on /usr/local type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=264,subvol=/@/usr/local)/dev/nvme0n1p7 on /var/cache type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=265,subvol=/@/var/cache)/dev/nvme0n1p7 on /var/log type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=266,subvol=/@/var/log)/dev/nvme0n1p7 on /var/spool type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=267,subvol=/@/var/spool)/dev/nvme0n1p7 on /var/tmp type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=268,subvol=/@/var/tmp)/dev/nvme0n1p1 on /efi type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)/dev/sda5 on /home type ext4 (rw,relatime)proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)sys on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)efivarfs on /sys/firmware/efi/efivars type efivarfs (rw,nosuid,nodev,noexec,relatime)udev on /dev type devtmpfs (rw,nosuid,relatime,size=12134028k,nr_inodes=3033507,mode=755,inode64)devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)shm on /dev/shm type tmpfs (rw,nosuid,nodev,relatime,inode64)tmpfs on /run type tmpfs (rw,nosuid,nodev,size=4859024k,nr_inodes=819200,mode=755,inode64)tmp on /tmp type tmpfs (rw,nosuid,nodev,inode64)tmpfs on /etc/resolv.conf type tmpfs (rw,nosuid,nodev,size=4859024k,nr_inodes=819200,mode=755,inode64)
  3. Issue the Snapper command to initialize a configuration named root for a subvolume mounted at /.
    [root@G5-openSUSE /]# snapper --no-dbus -c root create-config /
    The --no-dbus option is required because we are running in a chroot environemnt to the system and not the actual system. This command, as previously mentioned, necessary for Snapper's operation, creates a default configuration named root in /etc/snapper/configs for the subvolume mounted at /. It also creates a subvolume named .snapshots in whatever subvolume is currently mounted at /. The command would not complete successfully without our previous actions of unmounting the existing @/.snapshots subvolume which had been mounted at /.snapshots and removing the .snapshots directory. The new subvolume created by Snapper (subvolid=276) is shown in the following listing.
    [root@G5-openSUSE /]# btrfs subvolume list /ID 256 gen 28 top level 5 path @ID 257 gen 23 top level 256 path @/.snapshotsID 258 gen 102 top level 257 path @/.snapshots/1/snapshotID 259 gen 12 top level 256 path @/boot/grubID 260 gen 13 top level 256 path @/optID 261 gen 73 top level 256 path @/rootID 262 gen 40 top level 256 path @/srvID 263 gen 16 top level 256 path @/tmpID 264 gen 40 top level 256 path @/usr/localID 265 gen 75 top level 256 path @/var/cacheID 266 gen 76 top level 256 path @/var/logID 267 gen 71 top level 256 path @/var/spoolID 268 gen 44 top level 256 path @/var/tmpID 272 gen 42 top level 258 path var/lib/portablesID 273 gen 43 top level 258 path var/lib/machinesID 276 gen 102 top level 258 path .snapshots
  4. Delete the subvolume automatically created by snapper.
    [root@G5-openSUSE /]# btrfs subvolume delete /.snapshots
    The command with its output:
    [root@G5-openSUSE /]# btrfs subvolume delete /.snapshotsDelete subvolume (no-commit): '//.snapshots'
    After this command the subvolume created by Snapper is gone. The subvolumes are now:
    [root@G5-openSUSE /]# btrfs subvolume list /ID 256 gen 28 top level 5 path @ID 257 gen 23 top level 256 path @/.snapshotsID 258 gen 104 top level 257 path @/.snapshots/1/snapshotID 259 gen 12 top level 256 path @/boot/grubID 260 gen 13 top level 256 path @/optID 261 gen 73 top level 256 path @/rootID 262 gen 40 top level 256 path @/srvID 263 gen 16 top level 256 path @/tmpID 264 gen 40 top level 256 path @/usr/localID 265 gen 75 top level 256 path @/var/cacheID 266 gen 76 top level 256 path @/var/logID 267 gen 71 top level 256 path @/var/spoolID 268 gen 44 top level 256 path @/var/tmpID 272 gen 42 top level 258 path var/lib/portablesID 273 gen 43 top level 258 path var/lib/machines
  5. Remake the directory for mounting our snapshots subvolume.
    [root@G5-openSUSE /]# mkdir /.snapshots
  6. Remount our snapshots subvolume with mount -a which remounts all filesystems specified in /etc/fstab
    [root@G5-openSUSE /]# mount -a
    After this command, our original @/.snapshots subvolume is back (last item in list):
    [root@G5-openSUSE /]# mount/dev/nvme0n1p7 on / type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=258,subvol=/@/.snapshots/1/snapshot)/dev/nvme0n1p7 on /boot/grub type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=259,subvol=/@/boot/grub)/dev/nvme0n1p7 on /opt type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=260,subvol=/@/opt)/dev/nvme0n1p7 on /root type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=261,subvol=/@/root)/dev/nvme0n1p7 on /srv type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=262,subvol=/@/srv)/dev/nvme0n1p7 on /tmp type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=263,subvol=/@/tmp)/dev/nvme0n1p7 on /usr/local type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=264,subvol=/@/usr/local)/dev/nvme0n1p7 on /var/cache type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=265,subvol=/@/var/cache)/dev/nvme0n1p7 on /var/log type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=266,subvol=/@/var/log)/dev/nvme0n1p7 on /var/spool type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=267,subvol=/@/var/spool)/dev/nvme0n1p7 on /var/tmp type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=268,subvol=/@/var/tmp)/dev/nvme0n1p1 on /efi type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)/dev/sda5 on /home type ext4 (rw,relatime)proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)sys on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)efivarfs on /sys/firmware/efi/efivars type efivarfs (rw,nosuid,nodev,noexec,relatime)udev on /dev type devtmpfs (rw,nosuid,relatime,size=12134028k,nr_inodes=3033507,mode=755,inode64)devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)shm on /dev/shm type tmpfs (rw,nosuid,nodev,relatime,inode64)tmpfs on /run type tmpfs (rw,nosuid,nodev,size=4859024k,nr_inodes=819200,mode=755,inode64)tmp on /tmp type tmpfs (rw,nosuid,nodev,inode64)tmpfs on /etc/resolv.conf type tmpfs (rw,nosuid,nodev,size=4859024k,nr_inodes=819200,mode=755,inode64)/dev/nvme0n1p7 on /.snapshots type btrfs (rw,relatime,compress=zstd:3,ssd,space_cache,subvolid=257,subvol=/@/.snapshots)
  7. Adjust permissions of /.snapshots
    [root@G5-openSUSE /]# chmod 750 /.snapshots

Install Bootloader

Next we install the firmware part of GRUB.

  1. Install the GRUB firmware bootloader on the ESP.
    [root@G5-openSUSE /]# grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=ARCH-B --modules="normal test efi_gop efi_uga search echo linux all_video gfxmenu gfxterm_background gfxterm_menu gfxterm loadenv configfile gzio part_gpt btrfs"
    The option --bootloader-id specifies what will be displayed in the UEFI interface when choosing the bootloader to start. The command with the output:
    [root@G5-openSUSE /]# grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=ARCH-B --modules="normal test efi_gop efi_uga search echo linux all_video gfxmenu gfxterm_background gfxterm_menu gfxterm loadenv configfile gzio part_gpt btrfs"Installing for x86_64-efi platform.Installation finished. No error reported.
  2. Update the GRUB configuration.
    [root@G5-openSUSE /]# grub-mkconfig -o /boot/grub/grub.cfg
    The command with the output:
    [root@G5-openSUSE /]# grub-mkconfig -o /boot/grub/grub.cfgGenerating grub configuration file ...Found linux image: /boot/vmlinuz-linux-ltsFound initrd image: /boot/intel-ucode.img /boot/initramfs-linux-lts.imgFound fallback initrd image(s) in /boot: intel-ucode.img initramfs-linux-lts-fallback.imgFound linux image: /boot/vmlinuz-linuxFound initrd image: /boot/intel-ucode.img /boot/initramfs-linux.imgFound fallback initrd image(s) in /boot: intel-ucode.img initramfs-linux-fallback.imgWarning: os-prober will not be executed to detect other bootable partitions.Systems on them will not be added to the GRUB boot configuration.Check GRUB_DISABLE_OS_PROBER documentation entry.Adding boot menu entry for UEFI Firmware Settings ...Detecting snapshots ...Info: Separate boot partition not detected Info: snapper detected, using config: rootNo snapshots found.If you think an error has occurred , please file a bug report at " https://github.com/Antynea/grub-btrfs "Unmount /tmp/grub-btrfs.UaWtzHmGoX .. Successdone
  3. Create the root user's password.
    [root@G5-openSUSE /]# passwd
    The command with the output.
    [root@G5-openSUSE /]# passwdNew password: Retype new password: passwd: password updated successfully
  4. Allow newly created users that are added to the wheel user group as a supplementary user group during creation to use sudo to execute commands with elevated privileges. We will do this by editing /etc/sudoers file with visudo to enable sudo for all members of the wheel group.
    [root@G5-openSUSE /]# EDITOR=nano visudo
    Edit the file to remove the "#" in the line
    # %wheel ALL=(ALL) ALL
    so it becomes
    %wheel ALL=(ALL) ALL
  5. Exit out of the chroot into installed system back to the Arch bootstrap environment.
    [root@G5-openSUSE /]# exit
    [root@G5-openSUSE /]# exitexit
  6. Exit out of the bootstrap environment back to the host system.
    [root@G5-openSUSE /]# exit
    The command with the output:
    [root@G5-openSUSE /]# exitexit

Installation Part III: Create Users and Enable systemd Services

Reboot the host, the Arch installed GRUB firmware bootloader should take control on next boot. Since the Plasma's display manager, SDDM, has not been enabled, the graphical environment will not be activated and we will be presented with a login prompt in a virtual console. After logging in as root we will perform final installation steps.

  1. Login at the prompt as root, at the password prompt supplying the root password created during the last phase of the installationat.
  2. Create a regular user.
    [root@G5-ARCH-B ~]# useradd -m -G wheel -s /bin/bash username
    This will create a user named username that is a member of the wheel supplementary user group. Optionally include -c "FUll Name" in the above command.
    [root@G5-ARCH-B ~]# useradd -m -G wheel -c "FUll Name" -s /bin/bash username
  3. Assign a passwd to the newly created user.
    [root@G5-ARCH-B ~]# password username
    Enter the desired password for the user each time it is prompted.
  4. Enable NetworkManager.
    [root@G5-ARCH-B ~]# systemctl enable NetworkManager.service
  5. Enable bluetooth.
    [root@G5-ARCH-B ~]# systemctl enable bluetooth.service
  6. Enable SDDM, the Plasma desktop environments display manager.
    [root@G5-ARCH-B ~]# systemctl enable sddm

At this point we have a fully operational Arch system installed on a Btrfs filesystem with a configured non-root user and a full desktop environment. Snapper has been initialized and snapshots are automatically created before and after package manager transactions. The only remaining tasks are

  1. to enable the creation of GRUB menu items for each snapshot
  2. to enable systemd units to optimize SSD use
  3. to enable systemd services for maintaining the Btrfs filesystem
  4. to enable the timeline type of automatic Snapper snapshots and to optimize Snapper's cleanup of snapshots by editing its configuration file
  5. enabling the necessary systemd unit files for the timeline Snapper snapshots and the cleanup algorithms

We will perform these tasks in the installed system after rebooting into it.

Installation Part IV: Configuring Snapper

Now that we are in the graphical Arch system, we will perform the remaining tasks listed above. But first, lets see what our Btrfs system looks like at this stage. The image below shows a Konsole window with the outputs of the commands

btrfs subvolume list /
snapper list

and

snapper list-configs

These show, respectively, the subvolumes that exist on the system, the snapshots that exist on the system, and the Snapper configurations that exist on the system.

An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (14)

The Initial State of the System

Image 1 and Image 2 show a Konsole window with the outputs of commands that show thesubvolumes on the system, the snapshots thatinitially exist, and the Snapper configuration we created during the installation. Image 3shows /etc/fstab and how the subvolumes are mounted to the filesystemhierarchy.
Click on any of the thumbnails to view a slideshow of the images.

Enable AUR Helper

Since we will need AUR helpers eventually to install other AUR packages, including snap-pac-grub, which provides pacman hooks to include snapshots in the GRUB menu, we will enable a pacman wrapper that supports the AUR -- paru.

  1. Search for the package on the AUR home page, and openthe page for paru or paru-bin. Open the resultingpage and copy the Git CLone URL.
  2. Create a directory for AUR packages.
    [brook@G5-ARCH-B ~]$ mkdir AUR
  3. Change to the new directory.
    [brook@G5-ARCH-B ~]$ cd AUR
  4. Clone the repository.
    [brook@G5-ARCH-B AUR]$ git clone https://aur.archlinux.org/paru.git
  5. Change to the created directory.
    [brook@G5-ARCH-B AUR]$ cd paru
  6. Use makepkg to build the package and install it.
    [brook@G5-ARCH-B paru]$ makepkg -sic

Enable Snapshots in GRUB Menu

At this point the Btrfs system and Snapper are fully operational. We can make snapshots manually, and thanks to the installation of snap-pac in the previous phases of the installation process, any pacman operations will cause snapshots to be created before and after the transactions, Snapper's pre and post snapshot types as in openSUSE. We can also manually create these types of snapshots as well as the single snapshot type, but none of these snapshots will be added to the GRUB menu allowing us to easily boot into a snapshot, to execute the snapper rollback command. But to have these snapshots automatically added to the GRUB menu as in openSUSE, we need to install snap-pac-grub from the AUR using paru.

The AUR package snap-pac-grub provides pacman hooks that will add snapshots as sub-menu items under a new GRUB menu item,Arch Linux Snapshots. Since this is an AUR package, and Arch does not include AUR helpers in its repositories, we need to install it manually using Arch supported methods.

Install snap-pac-grub with

paru -Sa snap-pac-grub
  • An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (23)
  • An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (24)

Installing snap-pac-grub

The second image in the above set shows the pacman transaction that installs snap-pac-grub. At this point only snap-pac is active and its effect on pacman transactions is visible. In the pre-transaction hooks phase the pre transaction Snapper snapshot (numbered "2") is created. Later, in the post-transaction hooks phase, another snapshot (numbered "3") is created.

:: Proceed with installation? [Y/n](1/1) checking keys in keyring [####################################################################] 100%(1/1) checking package integrity [####################################################################] 100%(1/1) loading package files [####################################################################] 100%(1/1) checking for file conflicts [####################################################################] 100%(1/1) checking available disk space [####################################################################] 100%:: Running pre-transaction hooks...(1/1) Performing snapper pre snapshots for the following configurations...==> root: 22:: Processing package changes...(1/1) installing snap-pac-grub [####################################################################] 100%:: Running post-transaction hooks...(1/3) Arming ConditionNeedsUpdate...(2/3) Performing snapper post snapshots for the following configurations...==> root: 23(3/3) Generate GRUB config to let grub-btrfs detect new snapshotsGenerating grub configuration file ...Found linux image: /boot/vmlinuz-linux-ltsFound initrd image: /boot/intel-ucode.img /boot/initramfs-linux-lts.imgFound fallback initrd image(s) in /boot: intel-ucode.img initramfs-linux-lts-fallback.imgFound linux image: /boot/vmlinuz-linuxFound initrd image: /boot/intel-ucode.img /boot/initramfs-linux.imgFound fallback initrd image(s) in /boot: intel-ucode.img initramfs-linux-fallback.imgWarning: os-prober will not be executed to detect other bootable partitions.Systems on them will not be added to the GRUB boot configuration.Check GRUB_DISABLE_OS_PROBER documentation entry.Adding boot menu entry for UEFI Firmware Settings ...Detecting snapshots ...Info: Separate boot partition not detectedInfo: snapper detected, using config: rootFound snapshot: 2021-10-03 18:11:31 | @/.snapshots/23/snapshot | post | snap-pac-grubFound snapshot: 2021-10-03 18:11:31 | @/.snapshots/22/snapshot | pre | pacman --upgrade --noconfirm -- /home/brook/.cache/paru/clone/snap-pac-gFound snapshot: 2021-10-03 17:31:06 | @/.snapshots/21/snapshot | post | qogir-icon-theme-gitFound snapshot: 2021-10-03 17:30:59 | @/.snapshots/20/snapshot | pre | pacman --upgrade --noconfirm -- /home/brook/.cache/paru/clone/qogir-iconFound snapshot: 2021-10-03 16:49:33 | @/.snapshots/19/snapshot | post | qogir-gtk-theme-gitFound snapshot: 2021-10-03 16:49:33 | @/.snapshots/18/snapshot | pre | pacman --upgrade --noconfirm -- /home/brook/.cache/paru/clone/qogir-gtk-Found snapshot: 2021-10-03 16:48:49 | @/.snapshots/17/snapshot | post | gtk-engine-murrine gtk-engines gtk2Found snapshot: 2021-10-03 16:48:49 | @/.snapshots/16/snapshot | pre | pacman --sync -- extra/gtk2 community/gtk-engine-murrine extra/gtk-enginFound snapshot: 2021-10-03 16:48:00 | @/.snapshots/15/snapshot | post | kvantum-qt5Found snapshot: 2021-10-03 16:48:00 | @/.snapshots/14/snapshot | pre | pacman --sync -- kvantum-qt5Found snapshot: 2021-10-03 16:47:12 | @/.snapshots/13/snapshot | post | qogir-kde-theme-gitFound snapshot: 2021-10-03 16:47:12 | @/.snapshots/12/snapshot | pre | pacman --upgrade --noconfirm -- /home/brook/.cache/paru/clone/qogir-kde-Found snapshot: 2021-10-03 16:00:00 | @/.snapshots/11/snapshot | post | adwaita-icon-theme at-spi2-atk at-spi2-core atk desktop-file-utils firefFound snapshot: 2021-10-03 15:59:58 | @/.snapshots/10/snapshot | pre | pacman -S firefox firefox-developer-editionFound snapshot: 2021-10-03 15:55:59 | @/.snapshots/9/snapshot | post | paruFound snapshot: 2021-10-03 15:55:59 | @/.snapshots/8/snapshot | pre | /usr/bin/pacman -U /home/brook/AUR/paru/paru-1.8.2-1-x86_64.pkg.tar.zstFound snapshot: 2021-10-03 15:35:56 | @/.snapshots/7/snapshot | post | rustFound snapshot: 2021-10-03 15:35:55 | @/.snapshots/6/snapshot | pre | /usr/bin/pacman -S --asdeps cargoFound snapshot: 2021-10-03 15:31:27 | @/.snapshots/5/snapshot | post | edFound snapshot: 2021-10-03 15:31:27 | @/.snapshots/4/snapshot | pre | pacman -S edFound snapshot: 2021-10-03 15:30:52 | @/.snapshots/3/snapshot | post | autoconf automake binutils bison elfutils fakeroot file findutils flex gFound snapshot: 2021-10-03 15:30:50 | @/.snapshots/2/snapshot | pre | pacman -S base-develFound 22 snapshot(s)Unmount /tmp/grub-btrfs.CgH1nVo4U7 .. Successdone

Now that snap-pac-grub has been installed, all future transactions will have an additional hook provided by the package that will generate additional GRUB menu items for each item. This is shown in the next listing

:: Running pre-transaction hooks...(1/1) Performing snapper pre snapshots for the following configurations...==> root: 32:: Processing package changes...... truncated ...:: Running post-transaction hooks...( 1/10) Creating system user accounts...Creating group mpd with gid 45.Creating user mpd (n/a) with uid 45 and gid 45.( 2/10) Reloading system manager configuration...( 3/10) Creating temporary files...( 4/10) Arming ConditionNeedsUpdate...( 5/10) Refreshing PackageKit...( 6/10) Updating icon theme caches...( 7/10) Updating the info directory file...( 8/10) Updating the desktop file MIME type cache...( 9/10) Performing snapper post snapshots for the following configurations...==> root: 33(10/10) Generate GRUB config to let grub-btrfs detect new snapshotsGenerating grub configuration file ...Found linux image: /boot/vmlinuz-linuxFound initrd image: /boot/intel-ucode.img /boot/initramfs-linux.imgFound fallback initrd image(s) in /boot: intel-ucode.img initramfs-linux-fallback.imgWarning: os-prober will not be executed to detect other bootable partitions.Systems on them will not be added to the GRUB boot configuration.Check GRUB_DISABLE_OS_PROBER documentation entry.Adding boot menu entry for UEFI Firmware Settings ...Detecting snapshots ...Info: Separate boot partition not detectedInfo: snapper detected, using config: rootFound snapshot: 2021-09-29 15:20:22 | @/.snapshots/33/snapshot | post | audiofile cantata chromaprint faad2 fluidsynthlibao libcddb libcdio libFound snapshot: 2021-09-29 15:20:21 | @/.snapshots/32/snapshot | pre | pacman -S mpd cantataFound snapshot: 2021-09-28 19:31:02 | @/.snapshots/31/snapshot | post | vim vim-runtimeFound snapshot: 2021-09-28 19:31:01 | @/.snapshots/30/snapshot | pre | pacman -S vimFound snapshot: 2021-09-28 19:14:24 | @/.snapshots/29/snapshot | post | firefoxFound snapshot: 2021-09-28 19:14:23 | @/.snapshots/28/snapshot | pre | pacman -S firefoxFound snapshot: 2021-09-28 18:48:55 | @/.snapshots/27/snapshot | post | imagemagick liblqr libraqmFound snapshot: 2021-09-28 18:48:53 | @/.snapshots/26/snapshot | pre | pacman -S imagemagickFound snapshot: 2021-09-27 20:41:54 | @/.snapshots/25/snapshot | post | appmenu-gtk-module libdbusmenu-glibFound snapshot: 2021-09-27 20:41:53 | @/.snapshots/24/snapshot | pre | pacman -S appmenu-gtk-module libdbusmenu-glibFound snapshot: 2021-09-27 20:30:26 | @/.snapshots/23/snapshot | post | sdl virtualbox virtualbox-host-modules-archFound snapshot: 2021-09-27 20:30:17 | @/.snapshots/22/snapshot | pre | pacman -S virtualboxFound snapshot: 2021-09-27 15:43:05 | @/.snapshots/21/snapshot | post | coreutils discover grub-btrfs iana-etcktexteditor libass libgit2 libmtpFound snapshot: 2021-09-27 15:42:54 | @/.snapshots/20/snapshot | pre | pacman -SyuFound snapshot: 2021-09-27 15:40:11 | @/.snapshots/19/snapshot | post | reflectorFound snapshot: 2021-09-27 15:40:11 | @/.snapshots/18/snapshot | pre | pacman -S reflectorFound snapshot: 2021-09-27 15:34:48 | @/.snapshots/17/snapshot | post | tlpFound snapshot: 2021-09-27 15:34:47 | @/.snapshots/16/snapshot | pre | pacman -S tlpFound snapshot: 2021-09-27 15:22:05 | @/.snapshots/15/snapshot | post | hdparm tlp usbutilsFound snapshot: 2021-09-27 15:22:04 | @/.snapshots/14/snapshot | pre | pacman -S tlpFound snapshot: 2021-09-27 15:00:26 | @/.snapshots/13/snapshot | post | kvantum-qt5Found snapshot: 2021-09-27 15:00:26 | @/.snapshots/12/snapshot | pre | pacman -S kvantum-qt5Found snapshot: 2021-09-27 14:50:09 | @/.snapshots/11/snapshot | post | confuse flashrom fwupd fwupd-efi gcabgobject-introspection-runtime libfFound snapshot: 2021-09-27 14:50:08 | @/.snapshots/10/snapshot | pre | pacman -S packagekit-qt5 fwupdFound snapshot: 2021-09-27 14:27:49 | @/.snapshots/9/snapshot | post | plasma5-applets-active-window-controlplasma5-applets-thermal-monitor plFound snapshot: 2021-09-27 14:27:49 | @/.snapshots/8/snapshot | pre | pacman -S plasma5-applets-active-window-controlplasma5-applets-thermal-Found snapshot: 2021-09-27 14:07:32 | @/.snapshots/7/snapshot | post | kleopatra kmime kpimtextedit kwalletmanagerlibkleo qgpgmeFound snapshot: 2021-09-27 14:07:31 | @/.snapshots/6/snapshot | pre | pacman -S kwalletmanager kleopatraFound snapshot: 2021-09-27 13:44:10 | @/.snapshots/5/snapshot | post | visual-studio-code-binFound snapshot: 2021-09-27 13:44:09 | @/.snapshots/4/snapshot | pre | pacman --upgrade --noconfirm --/home/brook/.cache/paru/clone/visual-stuFound snapshot: 2021-09-27 13:32:59 | @/.snapshots/3/snapshot | post | snap-pac-grubFound snapshot: 2021-09-27 13:32:59 | @/.snapshots/2/snapshot | pre | pacman --upgrade --noconfirm --/home/brook/.cache/paru/clone/snap-pac-gFound 32 snapshot(s)Unmount /tmp/grub-btrfs.ikBeKYXZ5j .. Successdone

Testing Snapper Rollbacks: Part I

We now thest the configuration to make sure it works as expected. The following set of images illustrate thesteps taken, also discribed below.

An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (25)

Testing Snapper Rollback

The snapper rollback command is issued after booting into the snapshot to which to rollback.
Click on any of the thumbnails to view a slideshow of the images.

  1. Create a new manual snapshot of the system at a state before making changes for the test. This is shown inImage 1. The snapshot is created with the command:
    sudo snapper -v -c root create -t single -d "Test snapper rollback, snaphot before installing kolf"
  2. Verify the snapshot was created. Image 2 shows the output of
    sudo snapper list
    The output lists all of the snapshots that exist. The newly created snapshot is number 30 in the list. Theoutput also indicates that snapshot number 1 is the currently mounted snapshot and that it is thedefault subvolume, indicated by the * next to the snapshot number.
  3. We now make the changes to the system that we will rollback later. The changes are the installation of thepackage kolf. Image 3 shows the output of
    sudo snapper list
    after installing the package. There are now twonew snapshots automatically created by the pacman hooks provided by snap-pac, snapshot number 31 and snapshot number 32, the pre and posttransaction snapshots.
  4. Image 4 displays the output of
    ls -l /usr/share/kolf/*/ /usr/share/doc/HTML/en/kolf
    which listssome of the files placed on the system as a result of the installation of kolf.
  5. Next we reboot into the snapshot created manually previously, snapshot number 30 -- the one to whichwe want to rollback. Image 5 shows the GRUB boot menu that now includes Arch Linux Snapshots as aresult of the installation of snap-pac-grub. Image 6 shows the availablesnapshots into which the system can be booted. snapshot number 30 is highlighted. Image 7 shows theGRUB configuration associated with that menu item for snapshot number 30. Note the path of the kernelimage is in the subvolume that is snapshot 30, i.e. /@/.snapshots/30/snapshot/boot/vmlinuz-linux. Selecting the snapshot forbooting, leads to another menu if more than one kernel is installed, where the kernel to use is selected(Image 8).
  6. Once booted into the selected snapshot, we see that the system changes made after the snapshot was createdare not present. Image 9 confirms this with
    ls -l /usr/share/kolf/*/ /usr/share/doc/HTML/en/kolf
    and
    ls -l /usr/share/kolf
    .The files previously returned by these commands when executed immediately after installing kolf do not exist on the currently booted system.
  7. In Image 10, in the top pane of Konsole, we see that snapshot number 1 is the current defaultsubvolume and the one that will be mounted to the filesystem hierarchy root (if there are no subvolumeidentifiers in the line that mounts a device to /) in the output of
    sudo snapper list | grep "+"
    -- indicated by the + next to snapshot number 1We also see a confirmation that the snapshot (or subvolume) that is currently used as the root of thefilesystem hierarchy is snapshot number 30 -- indicated by the - nextto the snapshot number -- in the output of
    sudo snapper list | grep 30-
    . The terminal in the bottom pane showsthe meaning of the characters -, +, and * when appearing next to the snapshot number in the output of snapper list. In this case snapshot number 30 has the - next to it, meaning it is the snapshot currently mounted at the filesystemhierarchy root (/).
  8. The output of the command
    sudo btrfs subvolume get-default /
    as displayed in the terminal of the top pane of Konsole shown in Image 11 also confirms that, at thispoint, before issuing the rollback command, the default subvolume has not been changed yet. The snapperrollback command is issued as the second command in the same pane. The command used is
    sudo snapper -c root -v rollback -d "Test snapper rollback, rolling back to before installing kolf"
    . The syntax of a snapper command is
    snapper [--global-opts] command [--command-opts] [command-arguments]
    In this case the elements are as follows:
    • -c is a global option whose value specifies the configuration touse for performing the rollback, here the root configuration isspecified, which refers to the created during initialization of snapper, /etc/snapper/configs/root.
    • -v is a global option that specifies versbose output.
    • rollback is the snapper command.
    • The option -d is a command option whose value will be used as adescription of the snapshot.
    • The 30 is the command argument, which in this case, specifies thesnapshot number to which to rollback.
    The output of the command informs us that two snapshots have been created, numnbers 33 and 34, the first ofwhich is a read-only and the second is a read-write. Both of these new snapshots are duplicates ofsnapshot number 30. A snapper rollback command always creates aread-only snapshot of the current booted system, in this case snapshot number 30, and if a number isgiven as an argument to the command, a read-write snapshot of the snapshot indicated by the argument, inthis case, also snapshot number 30. The output also indicates that snapper has changed the defaultsubvolume to the newly created read-write snapshot, number 34.
  9. Image 12 shows the current GRUB configuration at /boot/grub/grub.cfg which isactually on the subvolume at the subvolume path /@/boot/grub, different fromthe subvolume mounted at the root of the filesystem hierarchy. The configuration still refers to the kernelpath /@/.snapshots/1/snapshot.
  10. At this point in the testing I updated the GRUB configuration with:
    grub-mkconfig -o /boot/grub/grub.cfg
    Upon reboot, the effect of the update is evident in the settings of the default GRUB menu item ArchLinux, shown in Image 13. The default menu item will load the kernel at /@/.snapshots/1/snapshot/boot/vmlinux-linux-lts
  11. Image 14 shows the GRUB menu list of snapshots accessed from the menu item ArchLinux Snapshots.
  12. After viewing the GRUB menu items shown in the previous two images, booting into the default GRUB menu itemresults in a system that is booted into a system that mounts the new read-write subvolume created by theSnapper rollback command. Image 15 illustrates that this is the case by showing a Konsolewindow with two panes in which the first shows that the output of
    sudo btrfs subvolume get-default /
    which indicates that the new read-write snapshot is the default snapshot and that the output of
    sudo findmount /
    indicates that the new read-write subvolume ismounted at the filesystem hierarchy root, /. This is despite the GRUB defaultitem pointing to a kernel in snapshot number 30 because when the filesystem is finally mounted /etc/fstab does not specify subvolume identifiers for the filesystem mounted at/ thus mounting the default subvolume set by Snapper.
  13. The bottom pane of the Konsole window of Image 15 shows the current GRUB configuration file /boot/grub/grub.cfg in which the default GRUB menu item is set to look for thekernel to load at /@/.snapshots/30/snapshot/vmlinux-linux-lts. Remember thatbecause the filesystem hierarchy path /boot is on a separate subvolume fromthat which is mounted at the filesystem hoerarchy root.
  14. Image 16 shows the same search for the files created by the installation of kolf as before with the same ls commandarguments. The files are not present, confirming that the rollback was successful.
  15. Image 17 shows the current subvolumes on the system.
  16. Now we update GRUB again so that the configuration file /etc/boot/grub/grub.cfg matches the subvolume we want to mount at thefilesystem hierarchy root. Image 18 shows this file after the update.
  17. Image 19 shows the output of
    sudo snapper list
    . It shows that snapshot number 34 is thecurrently mounted subvolume and the default subvolume indicated by the * nextto the snapshot number.
  18. Rebooting again we see, in Image 20, that the GRUB menu default menu item looks for the kernel in filesystemhierarchy path within the desired snapshot (snapshot number 34), the subvolume we want to be ourdefault system until the next time we rollback.
  19. In Image 21, we see the output of the Snapper command
    sudo snapper diff 30..34
    which shows the difference between snapshot number 30 and snaphsot number 34, which is aduplicate of snapshot number 30 as the rollback of the previous system to that snapshot. Thedifferences are limited to various timestamps created by various system components sucg as those thatmonitor battery level, that were updated when booting to the new default snapshot, snapshot number30, so in effect they are identical.

Testing snapper rollbacks, using the procedure described above, confirms that the Btrfs and Snapper configuration works to rollback a system to a previously created snapshot. In the process, a manual snapshot was created manually (snapshot number 30) to act as the snapshot to which to rollback. In practice, if a rollback is desired to reverse the effect of a package installation or an update, this would not be necessary. The pre snapshot of the pre/post pair of snapshots that wrap the package transaction could be used as the snapshot to which to rollback. In the test, the pre snapshot (snapshot number 31) could have been used as the snapshot to which to rollback.

An interesting characteristic of the configuration that is revealed by the test is that when booting the system from the default GRUB menu item after issuing the rollback command and updating the GRUB configuration from within the snapshot to which to rollback, the kernel is loaded from the snapshot to which the rollback was performed (i.e., snapshot number 30), but the subvolume that is mounted to the filesystem hierarchy root is the new read-write subvolume (i.e., snapshot number 34). This mismatch does not matter in practice because snapshot number 34 is a duplicate of snapshot number 30. We saw that once GRUB was updated again, this mismatch was eliminated.

Testing Snapper Rollbacks: Part II

The rollback process used in the previous testing could be simplified and made more convenient by issuing the Snapper rollback command from the current system -- the system which is to be rolled back -- instead of rebooting into the snapshot to which the system is to be rolled back and then issuing the rollback command. The test illustrated in the following set of images and described below confirms that this is the case.

An Arch Linux Installation on a Btrfs Filesystem with Snapper for System Snapshots and Rollbacks (47)

Testing Snapper Rollback

The snapper rollback command is issued from the system which is to be rolled back.
Click on any of the thumbnails to view a slideshow of the images.

  1. Image 1 shows the initial state of the system before any changes are made. The default subvolume and the snapshot (subvolume) that is currently mounted to the filesystem hierarchy root is snapshot number 66 as indicated by the * next to the snapshot number in the outout of snapper list at the top of the terminal window of the image. The output of findmnt / confirms that snaphsot number 66 is mounted at the filesystem hierarchy root. And the output of
    btrfs subvolume get-default /
    confirms that @/.snapshots/66/snapshot is the default subvolume.
  2. The GRUB configuration, /boot/grub/grub.cfg, is shown in Image 2. The default GRUB menu item looks for the kernel at /@/.snapshots/66/snapshot/boot/vmlinuz-linux-lts.
  3. Image 3 shows the pre and post snapshots, snapshot number 67 and snapshot number 68, respectively, created by the snap-pac pacman hooks when performing the installation of kapman -- the change to be rolled back. It also shows that snapshot number 66 is the current Btrfs default subvolume and the currently mounted subvolume at /.
  4. The output of the commands
    ls -l /usr/share/kapman/*/
    and
    ls -l /usr/share/doc/HTML/en/kapman/
    as illustrated in Image 4, show some of the files added to the system by the installation.
  5. In the terminal window of Image 5, the Snapper rollback command is issued:
    sudo snapper -c root -v rollback -d "Test snapper rollback, rolling back to before installing kapman"
    Unlike in the previous test, we are issuing the command directly from the current system -- the system to be rolled back, instead of first rebooting into the snapshot to which the system is to be rolled back. The output indicates that the new read-write snapshot is snapshot number 70 or in terms of the subvolume path @/.snapshots/70/snapshot.
  6. After the rollback command is issued the default subvolume is set by Snapper to the newly created read-write snapshot of the pair of snapshots created by the rollback command, snapshot number 70. The output of the first command of the terminal window shown in Image 6,
    sudo btrfs subvolume get-default /
    indicates this. The second command of the window, sudo snapper list piped to a grep command that searches for any snapshot number in the list that is qualified by any of the characters -, +, or *, also indicates that snapshot number 70 is the new default subvolume.
  7. After rebooting, the default GRUB menu item (Image 7) is configured to look for the kernel in a path that is in the previous system (the subvolume previously mounted at the filesystem hierarchy root /@/.snapshots/66/snapshot), the snapshot that was rolled back, instead of the one currently set as the new default subvolume by snapper (/@/.snapshots/70/snapshot). As mentioned when discussing the previous test, the new read-write subvolume created by snapper to be our new default system is a duplicate of the snapshot to which the system is rolled back; this includes the kernel image. Also, as we see in the next image, the GRUB configuration does not cause the old subvolume to be mounted to the root of the filesystem hierarchy root; the new read-write snapshot is mounted to /.
  8. Image 8 shows a terminal window with four commands. The output of the commands, taken together shows why the mismatch between the default subvolume set by Btrfs and the path used by GRUB to look for the kernel does not matter as far as what is actuall mounted to the filesystem hierarchy root; (we will however fix this later). The output of the first command,
    cat /proc/cmdline
    confirms that the GRUB default does indeed look for the kernel in the previous default subvolume because the kernel image path indicated is /@/.snapshots/66/snapshot/boot/vmlinz-linux. However, as the output of the second command confirms that the subvolume mounted at the filesystem hierarchy root is indeed the new read-write snapshot, /@/.snapshots/70/snapshot. The correct filesystem is mounted because the /etc/fstab entry for the / target does not identify the subvolume by subvolume path or subvolume ID, so that the default Btrfs subvolume is alwayst mounted. The Snapper rollback command changes the Btrfs default subvolume to the newly created read-write snapshot. The output of the third command in the image shows that this is the case, i.e, /@/.snaphots/70/snapshot is the default Btrfs subvolume. The output of the last command, the list of snapashots produced by snapper list filtered with grep to only display any of the snapshots that are currently mounted to /, the snapshot that is to be mounted to / on the next boot (as the current Btrfs default subvolume), or the snapshot that is both. In the output the * next to snapshot number 70 indicates that this snapshot is both the currently mounted subvolume at / and that it is the default subvolume.
  9. Image 9 displays the GRUB configuration, /boot/grub/grub.cfg, with the kernel image path still in the snapshot which was rolled back, not the new read-write snapshot. At this point we update the GRUB configuration with
    grub-mkconfig -o /boot/grub/grub.cfg
    .The update process will use the subvolume mounted at the filesystem hierarchy root as the path to the kernel image, and because we are mounted in the current system, the resulting configuration reflects the new read-write snapshot.
  10. The effect of updating the GRUB configuration is evident in Image 10, in which the configuration of the default GRUB menu item is shown after rebooting again. The kerenl image now correctly uses the new read-write snapshot in the path of the kernel image to load.
  11. Incidentally, at this point, as shown in Image 11, the Arch Linux Snapshots GRUB menu item does not yey include the snapshots created as part of the rollback. The next time a package management transaction is performed, the snap-pac-grub pacman hook will be activated, creating the entries.
  12. Image 12 displays the GRUB configuration /boot/grub/grub.cfg which now, as is expected from what we saw in the GRUB menu of Image 10, also reflects the correct subvolume in the kernel image path.

The process described in this second test represents the optimum use of the Btrfs/Snapper configuration presented in this article.

  1. From within the system which is to be rolled back, determine the snapshot to which to rollback.
  2. Issue to snapper rollback command, specifying the snapshot to which to rollback.
  3. Reboot into the default GRUB menu item (or if multiple kernels are installed, to the desired kernel from the Advanced Options for Arch Linux).
  4. Update the GRUB configuration.

Installation Part V: Final Configuration

Now that we know our Btrfs/Snapper configuration works as intended, we will perform the remaining post installation tasks.

Enable Periodic Execution of TRIM

We will enable periodic TRIM commands using the systemd service and timer unit files fstrim.service and fstrim.timer. Enabling the timer will activate the service once a week, which in turn executes the fstrim command.

 100% 16:47:48 USER: brook HOST: G5-ARCH-B ~ ❯$ sudo systemctl enable fstrim.timer

The command with the output:

 100% 16:47:48 USER: brook HOST: G5-ARCH-B ~ ❯$ sudo systemctl enable fstrim.timerCreated symlink /etc/systemd/system/timers.target.wants/fstrim.timer → /usr/lib/systemd/system/fstrim.timer.

Enable Periodic Execution of btrfs scrub

According to man btrfs-scrub, the btrfs scrub command, included with btrfs-progs

is used to scrub a mounted btrfs filesystem, which will read all data and metadata blocks from all devices and verify checksums. Automatically repair corrupted blocks if there's a correct copy available.

As indicated in the man page, this command is not as capable as, and is not a replacement for btrfs-check, which will actually check for and repair structural errors on a -- preferrably -- unmounted Btrfs filesystem.

We will enable periodic execution of the command using the systemd unit file btrfs-scrub@.timer which starts btrfs-scrub@.service. Because these units are templates we need to enable the actual unit files by first using systemd-escape to determine the actual names of the unit files, and then enable them.

  1.  100% 16:51:01 USER: brook HOST: G5-ARCH-B ~ ❯$ sudo systemd-escape --template btrfs-scrub@.timer --path /dev/disk/by-uuid/eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b
    The command with the output:
     100% 16:51:01 USER: brook HOST: G5-ARCH-B ~ ❯$ systemd-escape --template btrfs-scrub@.timer --path /dev/disk/by-uuid/eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224bbtrfs-scrub@dev-disk-by\x2duuid-eb5f654e\x2dbfaf\x2d4d89\x2db3e4\x2d3d6dc3bd224b.timer
  2. Enable the timer using the unit file name as determined above:
     100% 16:52:05 USER: brook HOST: G5-ARCH-B ~ ❯$ sudo systemctl enable btrfs-scrub@dev-disk-by\x2duuid-eb5f654e\x2dbfaf\x2d4d89\x2db3e4\x2d3d6dc3bd224b.timer
    This also creates the actual .service unit file. The command with the output:
     100% 16:52:05 USER: brook HOST: G5-ARCH-B ~ ❯$ sudo systemctl enable btrfs-scrub@dev-disk-by\x2duuid-eb5f654e\x2dbfaf\x2d4d89\x2db3e4\x2d3d6dc3bd224b.timerCreated symlink /etc/systemd/system/timers.target.wants/btrfs-scrub@dev-disk-by-uuid-eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b.timer → /usr/lib/systemd/system/btrfs-scrub@.timer.
  3. Start the timer.
     100% 17:15:50 USER: brook HOST: G5-ARCH-B PCD: 3s ~ ❯$ sudo systemctl start btrfs-scrub@dev-disk-by\x2duuid-eb5f654e\x2dbfaf\x2d4d89\x2db3e4\x2d3d6dc3bd224b.timer

Checking the status of the timer, as shown below, the timer will activate the service in 1 month and 4 days, in turn activating the command

btrfs scrub start

on the Btrfs filesystem on the specified device.

 100% 17:18:38 USER: brook HOST: G5-ARCH-B PCD: 1m5s ~ ❯$ sudo systemctl status btrfs-scrub@dev-disk-by\x2duuid-eb5f654e\x2dbfaf\x2d4d89\x2db3e4\x2d3d6dc3bd224b.timer● btrfs-scrub@dev-disk-by-uuid-eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b.timer - Monthly Btrfs scrub on /dev/disk/by/uuid/eb5f654e/bfaf/4d89/b3e4/3d6dc3bd224b Loaded: loaded (/usr/lib/systemd/system/btrfs-scrub@.timer; enabled; vendor preset: disabled) Active: active (waiting) since Sun 2021-10-10 17:16:03 EDT; 2min 37s ago Trigger: Thu 2021-11-04 04:38:00 EDT; 3 weeks 3 days left Triggers: ● btrfs-scrub@dev-disk-by-uuid-eb5f654e-bfaf-4d89-b3e4-3d6dc3bd224b.serviceOct 10 17:16:03 G5-ARCH-B systemd[1]: Started Monthly Btrfs scrub on /dev/disk/by/uuid/eb5f654e/bfaf/4d89/b3e4/3d6dc3bd224b.

The device paths specified when using systemd-escape were by UUID. Alternatively, the kernel device names could have been used to create the unit file names, as in

 100% 17:16:03 USER: brook HOST: G5-ARCH-B ~ ❯$ systemd-escape --template btrfs-scrub@.timer --path /dev/nvme0n1p7 btrfs-scrub@dev-nvme0n1p7.timer

Edit Snapper Configuration

The Snapper configuration file that was created during the installation phase after changing root from the Arch bootstrap environment to the installed system -- /etc/snapper/configs/root -- allows modification of the number of automatic snapshots of a certain type that are created by Snapper, as well as modification of the number of snapshots that are kept by the various snapshot cleanup algorithms. The variables and values that can be specified in this file are documented in man snapper-configs.

  1. Under "# btrfs qgroup for space aware cleanup algorithms", change
    QGROUP=""
    to
    QGROUP="1/0"
    if Btrfs quota groups were enabled early in the installation process.
  2. Under "# limit for number cleanup", change
    NUMBER_LIMIT="50"
    to
    NUMBER_LIMIT="10-35"
    A range value is required for this variable if the SPACE_LIMIT and FREE_LIMIT variables are set in the file -- as they are by default, enabling cleanup based on the amount of storage space used by snapshots and the amount of free space specified as required.
  3. Under "# limit for number cleanup", change
    NUMBER_LIMIT_IMPORTANT="50"
    to
    NUMBER_LIMIT_IMPORTANT="15-25"
  4. Under "# limits for timeline cleanup"change
    TIMELINE_LIMIT_HOURLY="10"
    to
    TIMELINE_LIMIT_HOURLY="5"
    Change
    TIMELINE_LIMIT_DAILY="10"
    to
    TIMELINE_LIMIT_DAILY="5"
    Change
    TIMELINE_LIMIT_WEEKLY="0"
    to
    TIMELINE_LIMIT_WEEKLY="2"
    Change
    TIMELINE_LIMIT_MONTHLY="10"
    to
    TIMELINE_LIMIT_MONTHLY="3"
    Change
    TIMELINE_LIMIT_YEARLY="10"
    to
    TIMELINE_LIMIT_YEARLY="0"

The snapshot creation and cleanup algorithims and their parameters depend on a cron daemon or a systemd timer to periodically activate the cleanup. The cron daemon is not enabled by default in Arch, and we will not enable it, instead using the systemd services and timers provided by the snapper package that activate them. If you want to use the cron daemon for some other function, the systemd timers need not be activated (duplicate actions will be taken by the timers), the algorithims will work automatically with cron.

  1. Enable timeline snapshots timer.
     100% 17:40:01 USER: brook HOST: G5-ARCH-B ~ ❯$ sudo systemctl enable snapper-timeline.timer
    The command with the output.
     100% 17:40:01 USER: brook HOST: G5-ARCH-B ~ ❯$ sudo systemctl enable snapper-timeline.timerCreated symlink /etc/systemd/system/timers.target.wants/snapper-timeline.timer → /usr/lib/systemd/system/snapper-timeline.timer.
  2. Start the timeline snapshots timer.
     100% 17:40:12 USER: brook HOST: G5-ARCH-B ~ ❯$ sudo systemctl start snapper-timeline.timer
  3. Enable the timeline cleanup algorithm based on the "TIMELINE_LIMIT_XXXX" settings in the configuration.
     100% 17:41:01 USER: brook HOST: G5-ARCH-B ~ ❯$ sudo systemctl enable snapper-cleanup.timer
    The command with the output:
     100% 17:41:01 USER: brook HOST: G5-ARCH-B ~ ❯$ sudo systemctl enable snapper-cleanup.timerCreated symlink /etc/systemd/system/timers.target.wants/snapper-cleanup.timer → /usr/lib/systemd/system/snapper-cleanup.timer.
  4. Start the timeline cleanup timer.
     100% 17:46:53 USER: brook HOST: G5-ARCH-B PCD: 5s ~ ❯$ sudo systemctl start snapper-cleanup.timer

Whenever a pacman transaction occurs, the snapshots created by the timer, that have not been cleaned up, will be found by the pacman hooks provided by grub-btrfs and added to the GRUB menu by the hooks provided by snap-pac-btrfs.

Conclusion

TBA

References

TBA

FAQs

How to install ArchLinux with btrfs? ›

  1. Mount the file systems.
  2. We need to mount our created partitions into our linux hierarchy. ...
  3. mount /dev/sda3 /mnt btrfs su cr /mnt/@ btrfs su cr /mnt/@home btrfs su cr /mnt/@root btrfs su cr /mnt/@srv btrfs su cr /mnt/@log btrfs su cr /mnt/@cache btrfs su cr /mnt/@tmp btrfs su li /mnt.

How to setup Snapper Arch Linux? ›

Setting up snapper on Arch
  1. snapper snap-pac grub-btrfs.
  2. Creating config failed (creating btrfs subvolume . ...
  3. sudo umount /.snapshots sudo rm -r /.snapshots.
  4. sudo snapper -c root create-config / sudo snapper -c home create-config /home.
  5. sudo btrfs subvolume list /
  6. sudo btrfs subvolume delete /.snapshots sudo mkdir /.snapshots.
Sep 5, 2022

Does Btrfs support snapshots? ›

Btrfs snapshots work different than file copies: They keep references to current and past inodes instead. When you appended the change to the file, under the hood Btrfs allocated some more space to store the changes in and added a reference to this new data to the original inode. The previous contents remain untouched.

How do I manage Btrfs snapshots? ›

Snapshots Subvolume
  1. Mount the volume containing the root subvolume to /mnt . sudo mount (df --output=source / | tail -n 1) /mnt.
  2. Create a btrfs subvolume where the snapshots will be stored. ...
  3. Add an entry in fstab to mount the snapshots subvolume. ...
  4. Mount the snapshots subvolume. ...
  5. Unmount /mnt.

Is btrfs better than Ext4? ›

Advantages of Btrfs over Ext4:

Btrfs removes duplicate data from disk directly while Ext4 cannot do that, Btrfs support CoW so users can create writable and read-only snapshots of files. Ext4 lacks this feature. Btrfs Can handle more data than Ext4.

What is the purpose of btrfs? ›

Btrfs is intended to address the lack of pooling, snapshots, checksums, and integral multi-device spanning in Linux file systems. Chris Mason, the principal Btrfs author, stated that its goal was "to let [Linux] scale for the storage that will be available.

Top Articles
Latest Posts
Article information

Author: Kelle Weber

Last Updated: 10/08/2023

Views: 5531

Rating: 4.2 / 5 (73 voted)

Reviews: 88% of readers found this page helpful

Author information

Name: Kelle Weber

Birthday: 2000-08-05

Address: 6796 Juan Square, Markfort, MN 58988

Phone: +8215934114615

Job: Hospitality Director

Hobby: tabletop games, Foreign language learning, Leather crafting, Horseback riding, Swimming, Knapping, Handball

Introduction: My name is Kelle Weber, I am a magnificent, enchanting, fair, joyous, light, determined, joyous person who loves writing and wants to share my knowledge and understanding with you.