Migration guide from Arch or Manjaro to Artix

All commands below must be run as root.

Prepare the repositories

Put these repos in /etc/pacman.conf before the official Arch/Manjaro ones and disable [core] of the latter:

 # The gremlins repositories are disabled by default. To enable, uncomment the
 # repo name header and Include lines. You can add preferred servers immediately
 # after the header, and they will be used before the default mirrors.

 #[gremlins]
 #Include = /etc/pacman.d/mirrorlist

 [system]
 Include = /etc/pacman.d/mirrorlist

 [world]
 Include = /etc/pacman.d/mirrorlist

 #[galaxy-gremlins]
 #Include = /etc/pacman.d/mirrorlist

 [galaxy]
 Include = /etc/pacman.d/mirrorlist

 # If you want to run 32 bit applications on your x86_64 system,
 # enable the lib32 repositories as required here.

 #[lib32-gremlins]
 #Include = /etc/pacman.d/mirrorlist

 #[lib32]
 #Include = /etc/pacman.d/mirrorlist

 # An example of a custom package repository.  See the pacman manpage for
 # tips on creating your own repositories.
 #[custom]
 #SigLevel = Optional TrustAll
 #Server = file:///home/custompkgs

 #[testing]
 #Include = /etc/pacman.d/mirrorlist-arch

 [extra]
 Include = /etc/pacman.d/mirrorlist-arch

 [community]
 Include = /etc/pacman.d/mirrorlist-arch

 #[multilib-testing]
 #Include = /etc/pacman.d/mirrorlist-arch

 #[multilib]
 #Include = /etc/pacman.d/mirrorlist-arch

For now, the [multilib] repo is only available from Arch or Manjaro, but will eventually be available from Artix too. The [arch-openrc] and [arch-nosystemd] repos (or [openrc-eudev] if you're still on it) must be disabled.

Update the mirrorlists

Rename /etc/pacman.d/mirrorlist to /etc/pacman.d/mirrorlist-arch

 mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist-arch

Create a new /etc/pacman.d/mirrorlist, refresh the database and install the new keyring. The new keyring can be installed either by lowering the security levels in /etc/pacman.conf or by circumventing pacman, see below.

 cat > /etc/pacman.d/mirrorlist <<EOF
 # Worldwide mirrors
 Server = https://mirror.clarkson.edu/artix-linux/repos/$repo/os/$arch
 Server = https://ftp.sh.cvut.cz/artix-linux/$repo/os/$arch
 Server = http://artix.wheaton.edu/repos/$repo/os/$arch
 Server = http://mirror.strits.dk/artix-linux/repos/$repo/os/$arch
 Server = https://mirrors.dotsrc.org/artix-linux/repos/$repo/os/$arch
 Server = https://www.uex.dk/public/artix/$repo/os/$arch
 Server = http://mirror1.artixlinux.org/repos/$repo/os/$arch
 EOF

Clean up the packages cache

Clean all cache, because some of our own packages will have a different signature and pacman will complain. If you have a large cache and want to keep it, don't -Scc but you'll be asked to remove some corrupted packages and re-download. Then, force sync:

 pacman -Scc && pacman -Syy

Lower Pacman security levels

To install the artix-keyring package (below), you need to low Pacman's security levels for the installation in your /etc/pacman.conf. You can change them back later.

 SigLevel = Never #Required DatabaseOptional 

With Required DatabaseOptional being the original options.

Install the Artix PGP keyring

To install artix-keyring, you must sign a master key manually:

 pacman -S artix-keyring
 pacman-key --populate artix
 pacman-key --lsign-key 78C9C713EAD7BEC69087447332E21894258C6105

Backup a list of your active daemons

Save a list of your running systemd services, you'll need to install the respective openrc scripts afterwards.

 systemctl list-units --state=running | grep -v systemd | awk '{print $1}' | grep service > daemon.list

You are now ready for the installation of the Artix components, as well as the replacement init scripts for your systemd services.

Download the Artix packages

You should fetch the basic packages in the pacman cache (not really mandatory, but if you lose your internet connection in the middle of the update, you might be left without init). You must also fetch the linux-lts and linux-lts-headers packages, as Artix uses the latest LTS (long term support) kernel. Base and base-devel groups must also be reinstalled in order to be replaced by the ones in the [system] repo. Finally, the openrc-world group provides init scripts for services such as NetworkManager, bluez (for bluetooth) or cups (for printing):

 pacman -Sw base base-devel openrc-system grub linux-lts linux-lts-headers systemd-dummy libsystemd-dummy openrc-world

Remove systemd

Now that the packages are cached, you can send systemd and its family to oblivion (answer 'yes' to all pacman questions below).

 pacman -Rdd systemd libsystemd

After you've done this you MUST also complete the next step, otherwise you're left without init system. If you're doing this remotely (e.g. through ssh), please keep another ssh session open, just in case the first one freezes (it has happened, good dog systemd).

Install OpenRC

Finally, you can install the packages previously downloaded with pacman -Sw. Simple enough:

 pacman -S base base-devel openrc-system grub linux-lts linux-lts-headers systemd-dummy libsystemd-dummy openrc-world openrc netifrc grub mkinitcpio

Install init scripts

Also, install and enable the initscripts for your running services, an example follows:

 pacman -S --needed acpid-openrc alsa-utils-openrc autofs-openrc cronie-openrc cups-openrc displaymanager-openrc fuse-openrc haveged-openrc hdparm-openrc openssh-openrc samba-openrc syslog-ng-openrc

Enable services

 for daemon in acpid alsasound autofs cronie cupsd xdm fuse haveged hdparm smb sshd syslog-ng; do rc-update add $daemon default; done

You most certainly need to enable udev, dbus and elogind, unless you know what you're doing:

 rc-update add udev sysinit
 rc-update add elogind boot
 rc-update add dbus default

Configure networking

Edit your network configuration file, it's /etc/conf.d/net. This is especially important if you're converting a remote box, or you may very well be locked out of it. Depending on whether you use persistent device naming or not, you must symlink /etc/init.d/net.lo to net.enp0s3 or net.eth0. The interface names are used only as examples, make sure you find out what applies to you system. If in doubt (and have only got one ethernet interface), you can disable persistent device naming with a kernel command line (GRUB_CMDLINE_LINUX below) and go with net.eth0, otherwise omit it. You must install netifrc if you want to setup static networking.

 vi /etc/conf.d/net
 echo 'GRUB_CMDLINE_LINUX="net.ifnames=0"' >>/etc/default/grub		# disable persistent device naming
 ln -s /etc/init.d/net.lo /etc/init.d/net.eth0
 rc-update add net.eth0 boot
 pacman -S --needed netifrc

LVM setups

If you have a LVM setup, you must install the lvm2-openrc and device-mapper-openrc packages, otherwise the logical volumes will be inactive after reboot. Both of these packages are part of the openrc-system group, so you probably have it installed already. Enable the services at boot:

 rc-update add lvm boot
 rc-update add device-mapper boot

Remove more systemd cruft

You can optionally remove some systemd junk accounts too:

 for user in systemd-journal systemd-journal-gateway systemd-timesync systemd-network systemd-bus-proxy systemd-journal-remote systemd-journal-upload; do userdel $user; done

Make sure you remove any 'init=/usr/lib/systemd/systemd' or similar directives from your bootloader config, the linux kernel by default launches /sbin/init. Also, remove any 'x-systemd' directives from /etc/fstab.

Update the bootloader and the kernel initramfs

New mkinitcpio and grub were installed, so you better reconfigure them. Copy the new /etc/mkinitcpio.pacnew over to /etc/mkinitcpio, /etc/default/grub.pacnew to /etc/default/grub, recreate the kernel's initramfs with mkinitcpio and reinstall grub. If you had committed any changes to the original files (i.e. resume hook in /etc/mkinitcpio.conf or a custom kernel cmdline parameter in grub), you should merge them now.

Recreate your initramfs and grub configuration file
 mkinitcpio -p linux-lts (the default Artix kernel) or mkinitcpio -P (all installed kernels)
 update-grub
Reinstall GRUB
  • For UEFI:
 grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub 
 grub-install --target=x86_64-efi --efi-directory=esp_mount --bootloader-id=grub (ditto, a user reported success with this one)
  • For BIOS:
 grub-install /dev/sdX (replace sdX with sda, sdb, or whatever your disk is)

Tweak /etc/rc.conf

Edit /etc/rc.conf to your liking. A common tweak is to set rc_parallel="YES", but do this only after you've booted your system at least once. You also need to edit the config files for your hostname, keyboard, keymap and locale.

 echo `hostname` >| /etc/hostname
 vi /etc/conf.d/keymaps
 vi /etc/conf.d/consolefont
 vi /etc/locale.conf

Prepare a desktop environment

Install a display manager. You can use either lightdm or sddm which is used by Artix in its installable ISOs and edit DISPLAYMANAGER in /etc/conf.d/xdm to "sddm".

 pacman -S sddm artix-sddm-theme
 sed -i 's/DISPLAYMANAGER="xdm"/DISPLAYMANAGER="sddm"/' /etc/conf.d/xdm

You need group membership to the components your users need access.

 usermod -a -G video,audio,input,power,storage,optical,lp,scanner $USER

Reboot

You won't be able to reboot normally, as the bloated PID1 binary is missing now. Do it with the kernel SysRq trigger.

 umount -a
 mount -f / -o remount,ro
 echo s >| /proc/sysrq-trigger
 echo u >| /proc/sysrq-trigger
 echo b >| /proc/sysrq-trigger

Some additional configuration may still be needed, especially with regards to desktop functionality. The configuration section at systemd-free.org will give you some ideas although elogind is used instead of consolekit now.