OpenSUSE LEAP 16 finally works inside of Parallels on a Mac
For many, many years now, OpenSUSE would not install Parallels Tools in LEAP virtual machines.
I have been trying LEAP 16 beta in Parallels on my Mac Studio, and after Parallels' update to version Version 20.3.1 (55959), I was suddenly surprised to see a black triangle asking me to update Parallel's tools, and to my surprise, it worked! There are some things to know about the process that I will explain here.
You can download LEAP 16 Beta here: https://get.opensuse.org/leap/16.0/. Be sure to select the ARM version. LEAP 16 has changed the installer, so be sure to get the current version.
In Parallels when you create the VM, select the ISO manually, and be sure to check the configure before installing box. The 64 GB default disk size is too small; I increased it to 2TB.
This is part way through the installation process. Note the black triangle on the top bar. I do not know why, but I had to restart the process several times to get the triangle to appear in the installer. In the installer you should manually go though each selection in the left-hand menu, in particular the network, locale, and authentication settings. My net is on 10.0.0.1, and for some reason the default chooses 10.something.... which results in no network connection, and things will fail. I had to create a MAC address and also put it into my Orbi router to get a fixed ip address.
Once the system reboots and you log in, you can install Parallels Tools. But LEAP 16 does not ask for the root passwords, so in the SUSE menu, pin the File Manager-Super User Mode to the desktop and open it.
Then you can open Parallels Tools and click install-gui and Parallels Tools will be installed after a reboot.
Here is the output from ./install. Note that not everything gets built, but it works. It is a real pain to have to escape "Parallels Tools" every time.
leap16beta:~ # cd /run/media/jar/"Parallels Tools"
leap16beta:/run/media/jar/Parallels Tools # ls
install install-gui installer kmods tools version
leap16beta:/run/media/jar/Parallels Tools # ./install
Started installation of Parallels Guest Tools version '20.4.0.55980'
installer:%0.000000
modprobe: FATAL: Module prl_tg not found in directory /usr/lib/modules/6.12.0-160000.20-default
Thu Aug 7 11:05:07 EDT 2025
Start installation or upgrade of Guest Tools
installer:%10.000000
installer:%20.000000
Failed to stop prltools_updater.service: Unit prltools_updater.service not loaded.
Failed to stop prl-x11.service: Unit prl-x11.service not loaded.
Removing files according to '/var/lib/parallels-tools/.backup/.tools.list'
rmdir: failed to remove '/etc/prltools': No such file or directory
rmdir: failed to remove '/etc/init.d': No such file or directory
DKMS modules were removed successfully
Start removal of prl_tg kernel module
Start removal of prl_fs_freeze kernel module
Start removal of prl_notifier kernel module
Start removal of prl_fs kernel module
Remove kernel modules according to /var/lib/parallels-tools/.backup/.kmods.list file
installer:%30.000000
installer:%40.000000
In file included from /usr/src/linux-6.12.0-160000.20/include/linux/mm_types.h:19,
from /usr/src/linux-6.12.0-160000.20/include/linux/mmzone.h:22,
from /usr/src/linux-6.12.0-160000.20/include/linux/gfp.h:7,
from /usr/src/linux-6.12.0-160000.20/include/linux/umh.h:4,
from /usr/src/linux-6.12.0-160000.20/include/linux/kmod.h:9,
from /usr/src/linux-6.12.0-160000.20/include/linux/module.h:17,
from /usr/lib/parallels-tools/kmods/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg.c:6:
/usr/lib/parallels-tools/kmods/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg.c: In function ‘prl_tg_deinitialize’:
/usr/src/linux-6.12.0-160000.20/include/linux/workqueue.h:765:9: warning: call to ‘__warn_flushing_systemwide_wq’ declared with attribute warning: Please avoid flushing system-wide workqueues. [-Wattribute-warning]
765 | __warn_flushing_systemwide_wq(); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib/parallels-tools/kmods/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg.c:573:9: note: in expansion of macro ‘flush_scheduled_work’
573 | flush_scheduled_work();
| ^~~~~~~~~~~~~~~~~~~~
Skipping BTF generation for /usr/lib/parallels-tools/kmods/prl_tg/Toolgate/Guest/Linux/prl_tg/prl_tg.ko due to unavailability of vmlinux
Skipping BTF generation for /usr/lib/parallels-tools/kmods/prl_notifier/Installation/lnx/prl_notifier/prl_notifier.ko due to unavailability of vmlinux
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:52:15: warning: no previous prototype for ‘lookup_target’ [-Wmissing-prototypes]
52 | struct inode *lookup_target(char *pathname)
| ^~~~~~~~~~~~~
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:78:5: warning: no previous prototype for ‘freeze_sb’ [-Wmissing-prototypes]
78 | int freeze_sb(struct super_block *sb)
| ^~~~~~~~~
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:105:5: warning: no previous prototype for ‘thaw_sb’ [-Wmissing-prototypes]
105 | int thaw_sb(struct super_block *sb)
| ^~~~~~~
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:120:5: warning: no previous prototype for ‘process_path’ [-Wmissing-prototypes]
120 | int process_path(char *path, int freeze)
| ^~~~~~~~~~~~
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:141:5: warning: no previous prototype for ‘thaw_all’ [-Wmissing-prototypes]
141 | int thaw_all(void)
| ^~~~~~~~
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:156:6: warning: no previous prototype for ‘thaw_timeout’ [-Wmissing-prototypes]
156 | void thaw_timeout(struct work_struct *work)
| ^~~~~~~~~~~~
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:164:6: warning: no previous prototype for ‘thaw_timer_fn’ [-Wmissing-prototypes]
164 | void thaw_timer_fn(struct timer_list *unused)
| ^~~~~~~~~~~~~
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:180:6: warning: no previous prototype for ‘schedule_thaw_work’ [-Wmissing-prototypes]
180 | bool schedule_thaw_work(struct work_struct *work, unsigned long timeout)
| ^~~~~~~~~~~~~~~~~~
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:189:6: warning: no previous prototype for ‘cancel_timeout’ [-Wmissing-prototypes]
189 | void cancel_timeout(void)
| ^~~~~~~~~~~~~~
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:195:5: warning: no previous prototype for ‘arm_timeout’ [-Wmissing-prototypes]
195 | int arm_timeout(char *arg)
| ^~~~~~~~~~~
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:212:9: warning: no previous prototype for ‘freeze_write’ [-Wmissing-prototypes]
212 | ssize_t freeze_write(struct file *file, const char __user *userbuf,
| ^~~~~~~~~~~~
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:303:5: warning: no previous prototype for ‘seq_show’ [-Wmissing-prototypes]
303 | int seq_show(struct seq_file *file, void *data)
| ^~~~~~~~
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:321:5: warning: no previous prototype for ‘freeze_open’ [-Wmissing-prototypes]
321 | int freeze_open(struct inode *inode, struct file *file)
| ^~~~~~~~~~~
In file included from /usr/src/linux-6.12.0-160000.20/include/linux/mm_types.h:19,
from /usr/src/linux-6.12.0-160000.20/include/linux/mmzone.h:22,
from /usr/src/linux-6.12.0-160000.20/include/linux/gfp.h:7,
from /usr/src/linux-6.12.0-160000.20/include/linux/umh.h:4,
from /usr/src/linux-6.12.0-160000.20/include/linux/kmod.h:9,
from /usr/src/linux-6.12.0-160000.20/include/linux/module.h:17,
from /usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:15:
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c: In function ‘cancel_timeout’:
/usr/src/linux-6.12.0-160000.20/include/linux/workqueue.h:765:9: warning: call to ‘__warn_flushing_systemwide_wq’ declared with attribute warning: Please avoid flushing system-wide workqueues. [-Wattribute-warning]
765 | __warn_flushing_systemwide_wq(); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:192:9: note: in expansion of macro ‘flush_scheduled_work’
192 | flush_scheduled_work();
| ^~~~~~~~~~~~~~~~~~~~
In function ‘cancel_timeout’,
inlined from ‘freeze_write’ at /usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:253:5:
/usr/src/linux-6.12.0-160000.20/include/linux/workqueue.h:765:9: warning: call to ‘__warn_flushing_systemwide_wq’ declared with attribute warning: Please avoid flushing system-wide workqueues. [-Wattribute-warning]
765 | __warn_flushing_systemwide_wq(); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.c:192:9: note: in expansion of macro ‘flush_scheduled_work’
192 | flush_scheduled_work();
| ^~~~~~~~~~~~~~~~~~~~
Skipping BTF generation for /usr/lib/parallels-tools/kmods/prl_fs_freeze/Snapshot/Guest/Linux/prl_freeze/prl_fs_freeze.ko due to unavailability of vmlinux
Start installation of prl_tg kernel module
Start installation of prl_fs_freeze kernel module
Start installation of prl_notifier kernel module
DKMS modules were added successfully
DKMS modules for kernel 6.12.0-160000.16-64kb building failed
DKMS modules for kernel 6.12.0-160000.16-64kb installation failed
DKMS modules for kernel 6.12.0-160000.16-default building failed
DKMS modules for kernel 6.12.0-160000.16-default installation failed
DKMS modules for kernel 6.12.0-160000.16-rt building failed
DKMS modules for kernel 6.12.0-160000.16-rt installation failed
DKMS modules for kernel 6.12.0-160000.18-default building failed
DKMS modules for kernel 6.12.0-160000.18-default installation failed
DKMS modules for kernel 6.12.0-160000.19-64kb were built successfully
DKMS modules for kernel 6.12.0-160000.19-64kb were installed successfully
DKMS modules for kernel 6.12.0-160000.19-default were built successfully
DKMS modules for kernel 6.12.0-160000.19-default were installed successfully
DKMS modules for kernel 6.12.0-160000.19-rt were built successfully
DKMS modules for kernel 6.12.0-160000.19-rt were installed successfully
DKMS modules for kernel 6.12.0-160000.20-64kb were built successfully
DKMS modules for kernel 6.12.0-160000.20-64kb were installed successfully
DKMS modules for kernel 6.12.0-160000.20-default were built successfully
DKMS modules for kernel 6.12.0-160000.20-default were installed successfully
DKMS modules for kernel 6.12.0-160000.20-rt were built successfully
DKMS modules for kernel 6.12.0-160000.20-rt were installed successfully
installer:%50.000000
installer:%60.000000
installer:%70.000000
installer:%80.000000
installer:%90.000000
installer:%100.000000
Parallels Guest Tools were upgraded successfully!
Please, reboot your OS to finish upgrade of Parallels Guest Tools.
What is different in LEAP 16
Although zypper was installed by default, It has now been replaced by Myrlyn, which you should also pin to your desktop.
Yast2 has been replaced with a Web-based management tool called Cockpit (https://cockpit-project.org/running#tumbleweed). The instructions for installing this worked perfectly (using zyppper). I had to enable root login because otherwise it assumed my normal user account and did not have needed permissions.