How to Migrate In-Place From Manjaro to Arch Linux

How to Migrate In-Place From Manjaro to Arch Linux

Table of Contents

Manjaro is a fantastic way to get a fully-featured Linux desktop up and running in minutes. Its graphical installer, sensible defaults, and curated package selection making it a great choice for both newcomers and power users. However, over time, I found that Manjaro’s repositories lagged behind Arch, and—at least for the XFCE flavor—stability was not what I expected. I wanted to keep my working setup, but move to a system that is easier and more stable to maintain: pure Arch Linux.

This guide details how I migrated my Manjaro system to Arch in place, without a full reinstall, while keeping systemd-boot and Secure Boot. It’s based on Reddit post Guide for Manjaro to Arch migration (the dirty way) by Berlioz-Ubiquitus but updated for 2025 and based on my own experience.

Info

This guide assumes that you use systemd-boot as your bootloader and that you have Secure Boot enabled. If you use GRUB or another bootloader, the bootloader-related steps will be different, it’s up to you to adapt the instructions accordingly.

Warning

This process is advanced and potentially risky. Make a full backup before you start. You are responsible for your own system!

Step 0: Preparation

Backup everything

If anything goes wrong, you’ll want a way to restore your system.

Have an AUR Helper Installed

If you already have yay, skip this step. Otherwise just type yay yay in your terminal… Okay, not really, I’m kidding. You can install yay using either of the following methods:

# If pamac is available:
pamac install yay

# Or install manually:
curl https://aur.archlinux.org/cgit/aur.git/snapshot/yay.tar.gz | tar -xzf - -C /tmp
cd /tmp/yay
makepkg -si --noconfirm

Any other AUR helper should work too, just use the one you prefer but you will need to translate the commands below to your AUR helper of choice.

Step 1: Switch to Arch Mirrors

Migrate Mirrorlist

Edit your mirrorlist to use official Arch mirrors:

EDITOR=mousepad sudo -e /etc/pacman.d/mirrorlist

Paste in mirrors from https://archlinux.org/mirrorlist/.

Arch Linux Mirrorlist

Clean Up pacman.conf

Remove any Manjaro-specific settings:

sudo -e /etc/pacman.conf
  • Remove manjaro-system from HoldPkg.
  • I did not have any SyncFirst= line, but if you do, remove it.

Update Package Database

sudo pacman -Scc  # Entirely clear the package cache
sudo pacman -Syy  # Force refresh the package database

Update Pacman

sudo pacman -S pacman
sudo vimdiff /etc/pacman.conf{,.pacnew}

You may use meld or any other diff tool instead of vimdiff if you prefer. Make sure to merge any new configuration options from .pacnew into your existing pacman.conf. I chose to keep Manjaro’s default of SigLevel = PackageRequired for all repos.

sudo pacman -Syy  # Force refresh the package database again

Step 2: Reinstall All Native Packages

Resolve file conflicts for key system files

These files are inherently different between Manjaro and Arch, so we let Arch’s version overwrite our older version.

sudo pacman -Sc --overwrite /etc/lsb-release --overwrite /etc/bash.bashrc --overwrite /etc/skel/.bashrc bash lsb-release

Reinstall All Native Packages from Arch

This ensures all packages that are in the official repositories are from Arch, not Manjaro:

pacman -Qqn | sudo pacman -S -

Tip

If during this step you get some errors about conflicting files, use the --overwrite option together with the problematic package, like done above for the key system files. Take note of the conflicting package for step 4.

Step 3: Identify and Remove Manjaro-Specific Packages

List All Manjaro Packages

List all packages installed from Manjaro. (Actually, lists all packages that are not from AUR or official Arch repositories.)

pamac list -m | grep -v AUR | grep -ve "linux|pamac|pacman" | awk '{print $1}' | sed -z 's/\n/ /g' > /tmp/manjaro-special-packets.lst

Review and edit this list as needed.

  • I strongly suggests you remove the linux??? packages (kernel, headers and additional modules) so you can deal with them separately later.
  • Remove pacman-mirrors if you have it in the list, as we will replace it manually.
  • Also, in my case, I had some custom packages showing in this list (because they are neither from AUR nor official repositories), so I removed them from the list as well.

Remove pamac

If you used pamac-gtk, remove it:

sudo pacman -Rs pamac-gtk

If you’ve already switched to pamac-aur, you can skip this.

Replace pacman-mirrors with pacman-mirrorlist

sudo pacman -S pacman-mirrorlist
rm /etc/pacman.d/mirrorlist.pacnew  # We already have a mirrorlist properly configured

Remove Manjaro-Specific Packages

sudo pacman -Rs $(cat manjaro-special-packets.lst)

Step 4: Reinstall Overwritten System Files

sudo pacman -S bash lsb-release

Add to the above command any other package that caused file conflicts during the previous steps.

Step 5: Install Arch Kernel

Install Arch Kernel and Headers

sudo pacman -S linux linux-headers

Update Initramfs

Edit /etc/mkinitcpio.conf to ensure it uses the correct hooks and modules. If present in MODULES, remove crc32c_intel as it is obsolete (and absent) in the latest Arch kernels.

sudo -e /etc/mkinitcpio.conf

Edit /etc/mkinitcpio.d/linux.preset to enable Unified Kernel Images. (Because, as said earlier, I assume you are using systemd-boot and Secure Boot. If not, modify this file only according to your own setup.):

#default_config="/etc/mkinitcpio.conf"
#default_image="/boot/initramfs-linux.img"
default_uki="/efi/EFI/Linux/arch-linux.efi"
#default_options="--splash /usr/share/systemd/bootctl/splash-arch.bmp"

#fallback_config="/etc/mkinitcpio.conf"
#fallback_image="/boot/initramfs-linux-fallback.img"
fallback_uki="/efi/EFI/Linux/arch-linux-fallback.efi"
fallback_options="-S autodetect"

Reinstall Plymouth

Ensure Plymouth is installed from the Arch repository. Setting the theme is important because Manjaro’s Plymouth theme has been now removed. You may of course choose a different theme than bgrt, see ArchWiki Plymouth: Changing the theme.

sudo pacman -S plymouth
sudo plymouth-set-default-theme bgrt

Regenerate Initramfs

Warning

This step is kind of a dry run, in order to ensure that the new kernel and initramfs are properly configured. Be sure not to skip the later step where we generate the final initramfs.

sudo mkinitcpio -p linux

Remove Old Manjaro Kernel and Modules

Only if the previous step was successful, you should now remove the old Manjaro kernel and modules. I do not recommend keeping these, even as fallbacks, as they may cause conflicts later on.

# Unregister the old Manjaro kernel files from Secure Boot
sudo sbctl remove-file /efi/EFI/Linux/manjaro-6.12-x86_64-fallback.efi
sudo sbctl remove-file /efi/EFI/Linux/manjaro-6.12-x86_64.efi
# If you have VirtualBox installed (or possibly other additional modules), temporarily allow to break the dependencies
sudo pacman -Rsdd linux612-virtualbox-host-modules
# Remove the old Manjaro kernel and modules
sudo pacman -Rs linux612
# Install the Arch's version of VirtualBox (or possibly other additional modules) to restore the dependencies
sudo pacman -S virtualbox-host-modules-arch

Step 6: Reinstall Bootloader

Reinstall systemd-boot and Regenerate UKI

I prefer starting fresh with the bootloader, so I remove everything that is currently installed. (I could even remove the entire /efi/ directory, but if you have other bootloaders installed like Windows or other Linux distributions, you may want to keep them.)

# Mr. Proper
sudo rm -r /efi/loader /efi/EFI/{Linux,systemd}
# Re-install systemd-boot
sudo bootctl install
# Recreate the Linux directory so mkinitcpio is happy
sudo mkdir -p /efi/EFI/Linux
# Regenerate the Unified Kernel Images
sudo mkinitcpio -p linux

Sign Boot Files for Secure Boot

Start with a little check.

sudo sbctl verify

If some files are not signed, sign them.

sudo sbctl sign-all
sudo sbctl verify

If some files are still not signed, force-sign them and add them to the database so sbctl will re-sign them automatically in the future.

sudo sbctl sign --save /efi/EFI/Linux/arch-linux.efi
sudo sbctl sign --save /efi/EFI/Linux/arch-linux-fallback.efi

Final check

sudo sbctl verify

Step 7: Merge Configuration Files

Merge .pacnew Files

Tip

You can replace vimdiff with meld or another diff tool if you’re more comfortable with it (meld is graphical).

If for some reason you’re stuck in the console and you can’t use meld, here is a very quick cheatsheet for vimdiff:

  • Ctrl+w w: Yes, “w” twice: Switch between windows (left and right)
  • do : Diff obtain: Import changes from the other window to the current one (only the current chunk your cursor is on)
  • dp : Diff put: Export changes from the current window to the other one (in our case, it’s useful if you switched to the .pacnew file window)
  • :w : Save the current window
  • :qa : Quit all windows
  • V : Visual mode: Select the current line, useful for selecting multiple lines to copy/paste
  • v : Visual mode: Select text character by character
  • y : Yank (copy) the selection (or yy to copy the current line if not in visual mode)
  • p : Paste the yanked selection
  • i : Insert mode: Switch to insert mode to edit the text, Esc to exit insert mode

So in general, scroll through the file, use do to import changes from the .pacnew file and :w then :qa to save and quit.

If you need finer control, use Ctrl+w w to switch between the two windows and use V or v to select text, then y to yank it, Ctrl+w w to switch back to the other window and p to paste it there.

Use i to make manual edits in the current window, then Esc to exit insert mode.

sudo -i  # Start a root shell

passwd file is very specific to what you installed, so you may not want to merge it

rm /etc/passwd.pacnew

Manually review and merge as needed (here are some common files that may have .pacnew versions, you may have more)

find /etc -name "*.pacnew"
  • /etc/systemd/logind.conf: Unless you have custom settings, you can just use the .pacnew version.

    mv /etc/systemd/logind.conf{.pacnew,}
    
  • /etc/systemd/sleep.conf: Unless you have custom settings, you can just use the .pacnew version.

    mv /etc/systemd/sleep.conf{.pacnew,}
    
  • /etc/plymouth/plymouthd.conf: Probably nothing fancy apart from the theme.

  • /etc/hosts: I chose to keep the additional Manjaro entries for ipv6 nodes and routers.

  • /etc/nsswitch.conf: I chose to keep Manjaro’s setup for mdns4.

  • /etc/shells: I removed the additional shells Manjaro added out of (light) safety concerns, but it’s probably safe to keep them.

  • /etc/pacman.conf: I chose to keep Manjaro’s default of SigLevel = PackageRequired fro all repos.

Once you have merged all the necessary .pacnew files, you can remove them:

rm $(find /etc -name "*.pacnew")

Clean Up .pacsave and .pacorig Files

.pacsave: These files are created when a configuration file is no longer needed. This may indicate that an important packet has been removed. You must check if this is normal (superseded by a new package) or if you need to restore the packet.

find /etc -name "*.pacsave"        # List all .pacsave files
rm $(find /etc -name "*.pacsave")  # Remove them once you have checked them

.pacorig: These files should no longer be created by pacman, but given the special context of our migration, you may find some. They are to be treated like .pacnew files, but reversed (e.g. the .pacorig was there before the migration and the file without the .pacorig is the new version).

find /etc -name "*.pacorig"        # List all .pacorig files
rm $(find /etc -name "*.pacorig")  # Remove them once you have checked them

Step 8: Preparing for the Big Jump

(Optional) Install reflector for Better Mirrors

sudo pacman -S reflector
# Edit reflector config to your liking, e.g. sort by speed, country, etc.
sudo -e /etc/xdg/reflector/reflector.conf
# Enable the reflector timer to update mirrors periodically
sudo systemctl enable reflector.timer
# Manually run reflector to update the mirrorlist immediately
sudo systemctl start reflector
# Force refresh the package database after updating mirrors
sudo pacman -Syyu

Reinstall Essential Packages

Some packages may have been removed or replaced. Reinstall as needed:

sudo pacman -S networkmanager pipewire pipewire-audio pipewire-pulse pipewire-alsa

Notably, networkmanager should be re-installed because Manjaro has a Pacman hook that automatically changes the server for pings. It’s not a big deal, but since we’re switching to Arch, we want to keep the default behavior.

pipewire and its related packages were probably removed because they were marked as dependencies of a Manjaro-specific package that was removed.

A Note about xf86-video-intel

If you are using Intel graphics, make sure you don’t have the xf86-video-intel package installed, because it takes precedence over the modesetting driver and doesn’t work. I’m not sure if Manjaro installs it by default or if I installed it myself by mistake during the migration, but it broke my display after the migration. If you have it installed, remove it:

sudo pacman -Rs xf86-video-intel

Step 9: Verify and Reboot

Okay, you’re going to say that I have OCD, but I really hate to have to return to BIOS, disable Secure Boot, reboot, re-enable Secure Boot, and then boot again. So I prefer to verify everything is fine before rebooting.

sudo sbctl verify

Now my OCD is satisfied, so let’s reboot!

sudo reboot

Step 10: Are You Still Alive?

You did make it? Wow, congratulations! You’ve passed the hardest part of the migration.

Restore System Settings

For some reason, my system lost some vital settings during the migration. Namely, the locale and hostname. Just in case, I set the keymaps again as well, so that systemd aligns all the configuration files, should some new ones be necessary on the new system (for Wayland, maybe?). Of course, if you’re not French (nobody’s perfect), change the locale and keymap to your own.

sudo localectl set-locale fr_FR.UTF-8
sudo localectl set-keymap fr
sudo localectl set-x11-keymap fr pc105 oss terminate:ctrl_alt_bksp,compose:rctrl
sudo hostnamectl set-hostname lucidmechanisms

Note: If your hostname is now lucidmechanisms, it’s because you forgot to tweak the above line to your own hostname, silly you!

Step 11: Reinstall AUR Packages

Reinstall All AUR Packages

If you had AUR packages installed, it’s a good idea to reinstall them now that you are on Arch. This ensures they are built against the new Arch libraries and dependencies. I know, I know, this is a pain, this is long and tedious, but it’s worth it. Think about all the troubles you will not have in the future because you did this now.

pacman -Qqm | yay -S -

(Optional) Install pamac-aur

If you liked the convenience of pamac on Manjaro, you can install the AUR version of pamac for Arch. This will give you a GUI package manager similar to what you had on Manjaro.

yay -S pamac-aur archlinux-appstream-data-pamac

Step 12: Final Reboot

A final reboot is probably a good idea given all the changes we made. Don’t worry, it’s the last one (I know, if you’re like me, you reboot maybe once a month, so twice a day is a lot. You can compensate by not rebooting for the next two months).

sudo reboot

Non-Disclosure Agreement

A very important final note: by following this guide, you agree to never tell anyone that you migrated from Manjaro to Arch Linux. This is a secret between you and me, okay? If you go to the Arch forums or Reddit and say “I migrated from Manjaro to Arch”, they will hate you forever. You must say “I have always been on Arch for decades, and out of nowhere there is this problem showing up, I did nothing and I don’t know what you’re talking about”!

Enjoy your new system—and welcome to the Arch side!

Related Posts

SWIG is a wrapper generator that is able to connect compiled libraries to a bunch of scripting languages. The process is mostly automatic, but to tackle some corner cases, you have to help the generator do the right thing. In my library, all functions would return an integer, which is an error code. A special function, following the same behavior as strerror_r, can be used to retrieve the meaning of a special error code. This is a pretty usual mechanism for C code. But that’s not the way scripting languages work. In their world, functions are rather supposed to raise exceptions.

Read More

“Hey, Pal! How are you? Remember that little project I had on the CubieTruck? I resumed hacking on it. But it’s a pity, I lost my root password… I have to start all over again. Any chance you remember what silly password we choose together?”

Read More

Using GNOME Keyring on XFCE on Manjaro is not complicated, but the documentation of ArchLinux doesn’t apply and you can scratch your head for a few hours before getting what you want. Well, loose no more hair, here are the simple steps.

Read More