Note: Migration is for advanced users that know what they are doing. In general, doing a fresh installation is the preferred way to get started on Artix.
All commands below must be run as root.
To begin, replace pacman.conf
and the mirrorlist with Artix's:
mv -vf /etc/pacman.conf /etc/pacman.conf.arch curl https://gitea.artixlinux.org/packages/pacman/raw/branch/master/pacman.conf -o /etc/pacman.conf mv -vf /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist-arch curl https://gitea.artixlinux.org/packages/artix-mirrorlist/raw/branch/master/mirrorlist -o /etc/pacman.d/mirrorlist cp -vf /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.artix
If you had multilib
enabled, don't forget to uncomment the following sets of lines in /etc/pacman.conf
:
[lib32] Include = /etc/pacman.d/mirrorlist [multilib] Include = /etc/pacman.d/mirrorlist-arch
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
To install the artix-keyring
package, you need to temporarily lower pacman's security levels for the installation in your /etc/pacman.conf
.
#SigLevel = Required DatabaseOptional SigLevel = Never
With Required DatabaseOptional
being the original options.
To install artix-keyring, you must sign a master key manually:
pacman -S artix-keyring pacman-key --populate artix pacman-key --lsign-key 95AEC5D0C1E294FC9F82B253573A673A53C01BC2
Do it now, or you may very well forget it:
SigLevel = Required DatabaseOptional #SigLevel = Never
Save a list of your running systemd services, you'll need to install the respective init 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.
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 an init). Base and base-devel groups must also be reinstalled in order to be replaced by the ones in the [system] repo. Finally, choose one of Artix's inits (openrc
, runit
, s6
, or dinit
), and its init scripts.
pacman -Sw base base-devel grub linux linux-headers mkinitcpio \ rsync lsb-release esysusers etmpfiles artix-branding-base
And run one of the following, depending on your init:
pacman -Sw openrc elogind-openrc openrc-system
or
pacman -Sw runit elogind-runit runit-system
or
pacman -Sw s6-base elogind-s6 s6-system
or
pacman -Sw dinit elogind-dinit dinit-system
Now that the packages are cached, you can send systemd and its family to oblivion (answer 'yes' to all pacman questions below).
pacman -Rdd --noconfirm systemd systemd-libs systemd-sysvcompat pacman-mirrorlist dbus rm -fv /etc/resolv.conf
Restore the Artix mirrorlist, deleted by the previous operation:
cp -vf /etc/pacman.d/mirrorlist.artix /etc/pacman.d/mirrorlist
After you've done this you MUST also complete the next step, otherwise you're left without an 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, thank you systemd).
Finally, you can install the packages previously downloaded with pacman -Sw
. Simple enough:
pacman -S base base-devel grub linux linux-headers mkinitcpio \ rsync lsb-release esysusers etmpfiles artix-branding-base
And:
pacman -S openrc elogind-openrc openrc-system
or
pacman -S runit elogind-runit runit-system
or
pacman -S s6-base elogind-s6 s6-system
or
pacman -S dinit elogind-dinit dinit-system
Note: don't forget to install a network manager (e.g. connman or netifrc), a text editor and any other software that you consider vital.
First, make sure your locale is C for grep(1)
:
export LC_ALL=C
Replace all Arch packages with Artix ones:
pacman -Sl system | grep installed | cut -d" " -f2 | pacman -S - pacman -Sl world | grep installed | cut -d" " -f2 | pacman -S - pacman -Sl galaxy | grep installed | cut -d" " -f2 | pacman -S -
And in case you had 32-bit support enabled:
pacman -Sl lib32 | grep installed | cut -d" " -f2 | pacman -S -
Also, install and enable the initscripts for your running services, an example follows (replace init
with either openrc
, runit
, s6
, or dinit
):
pacman -S --needed acpid-init alsa-utils-init cronie-init cups-init fuse-init haveged-init hdparm-init openssh-init samba-init syslog-ng-init
for daemon in acpid alsasound cronie cupsd xdm fuse haveged hdparm smb sshd syslog-ng; do rc-update add $daemon default; done
You almost certainly need to enable udev unless you know what you're doing; dbus and elogind are no longer required to be explicitly enabled, as they are started on demand (OpenRC only).
rc-update add udev sysinit
for daemon in acpid alsasound cronie cupsd dbus elogind xdm fuse haveged hdparm smb sshd syslog-ng; do ln -s /etc/runit/sv/$daemon /etc/runit/runsvdir/default; done
touch /etc/s6/adminsv/default/contents.d/{acpid,cronie,cupsd,elogind,xdm,fuse,haveged,hdparm,smbd,sshd,syslog-ng} s6-db-reload
for daemon in acpid alsasound cronie cupsd xdm fuse haveged hdparm smb sshd syslog-ng; do dinitctl enable $daemon; done
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
respectively. 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. OpenRC has its own network manager, netifrc which by default uses DHCP for the wired interface.
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
Create a basic /etc/resolv.conf
, in the example we use Cloudflare's DNS:
nano /etc/resolv.conf
nameserver 1.1.1.1
If you have an LVM setup, you must install the lvm2-init and device-mapper-init packages, otherwise the logical volumes will be inactive after reboot. Both of these packages are part of the init-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
ln -s /etc/runit/sv/lvm2 /etc/runit/runsvdir/default ln -s /etc/runit/sv/device-mapper /etc/runit/runsvdir/default
touch /etc/s6/adminsv/default/contents.d/device-mapper s6-db-reload
(lvm2-s6 is already enabled on boot during install)
dinitctl enable lvm2 dinitctl enable dmeventd
You can optionally remove some systemd junk accounts too:
for user in journal journal-gateway timesync network bus-proxy journal-remote journal-upload resolve coredump; do userdel systemd-$user done rm -vfr /{etc,var/lib}/systemd
Make sure you remove any 'init=/usr/lib/systemd/systemd' or similar directives from your bootloader config, as the linux kernel by default launches /sbin/init
. Also, remove any 'x-systemd' directives from /etc/fstab
.
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.
mkinitcpio -p linux (the default Artix kernel) or mkinitcpio -P (all installed kernels) update-grub
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub (default for most setups) grub-install --target=x86_64-efi --efi-directory=esp_mount --bootloader-id=grub (some users reported success with this one)
grub-install /dev/sdX (replace sdX with sda, sdb, or whatever your disk is)
You won't be able to reboot normally, as the bloated PID1 binary is missing now. Do it with the kernel SysRq trigger.
sync 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.