Client broken under macOS 27

Hi,

For a couple of months, I have been running the 2.5.30 client on macOS 26 backing up to a 2.5.37 server on a Synology NAS on the same network. Since last week I get errors, probably related to the update to macOS 27.

Here is the relevant part from the client log:

2026-09-21 14:07:18: Snapshot mounted at /Volumes/urbackup_snaps/8c231c5e04081a60d2d485c6365c58cf238f74a0cd37268e
2026-09-21 14:07:18: Shadowcopy path: /Volumes/urbackup_snaps/8c231c5e04081a60d2d485c6365c58cf238f74a0cd37268e
2026-09-21 14:07:18: done.
2026-09-21 14:07:18: Removing deleted directories from index for "/"...
2026-09-21 14:07:18: Scanning for changed hard links on volume of "/"...
2026-09-21 14:07:18: Disabling CBT on volume ""
2026-09-21 14:07:18: Indexing "rootfs"...
2026-09-21 14:07:18: [macOS] Skipping "/home" due to macOS exclusion "/home*"
2026-09-21 14:07:18: [macOS] Skipping "/.fseventsd" due to macOS exclusion "/.fseventsd*"
2026-09-21 14:07:18: [macOS] Skipping "/.TemporaryItems" due to macOS exclusion "/.TemporaryItems*"
2026-09-21 14:07:18: [macOS] Skipping "/.Spotlight-V100" due to macOS exclusion "/.Spotlight-V100*"
2026-09-21 14:07:18: [macOS] Skipping "/.DocumentRevisions-V100" due to macOS exclusion "/.DocumentRevisions-V100*"
2026-09-21 14:07:26: ClientService cmd: #ICAz5w0TDgKbMXfYThv2l#2PING RUNNING pc_done=&eta_ms=1525172&status_id=166&speed_bpms=0&total_bytes=-1&done_bytes=0&paused_fb=1#token=2NFgdVAnAX5JQ7WUdDO3
2026-09-21 14:07:28: [macOS] Skipping "/Library/Updates" due to macOS exclusion "/Library/Updates*"
2026-09-21 14:07:28: [macOS] Skipping "/Library/Trial" due to macOS extended attribute exclusion
2026-09-21 14:07:28: [macOS] Skipping "/Library/Application Support/Apple/AssetCache/Data" due to macOS extended attribute exclusion
2026-09-21 14:07:29: ERROR: Cannot stat "/Volumes/urbackup_snaps/8c231c5e04081a60d2d485c6365c58cf238f74a0cd37268e/Library/Caches/com.apple.amsengagementd.classicdatavault": Operation not permitted (1)
2026-09-21 14:07:29: ERROR: Cannot stat "/Volumes/urbackup_snaps/8c231c5e04081a60d2d485c6365c58cf238f74a0cd37268e/Library/Caches/com.apple.aneuserd": Operation not permitted (1)
2026-09-21 14:07:29: ERROR: Cannot stat "/Volumes/urbackup_snaps/8c231c5e04081a60d2d485c6365c58cf238f74a0cd37268e/Library/Caches/com.apple.aned": Operation not permitted (1)
2026-09-21 14:07:29: ERROR: Error while listing files in folder "/Volumes/urbackup_snaps/8c231c5e04081a60d2d485c6365c58cf238f74a0cd37268e/Library/Caches". User may not have permissions to access this folder. Errno is 0
2026-09-21 14:07:29: Deleting shadowcopy for path "/Volumes/urbackup_snaps/8c231c5e04081a60d2d485c6365c58cf238f74a0cd37268e" -2
2026-09-21 14:07:29: Deleted local snapshot '2026-09-21-140716'
2026-09-21 14:07:29: Deleting Shadowcopy for dir "/"

Permissions on the snapshot look like this:

bodo@Macncheese ~ % ls -al /Volumes/urbackup_snaps
total 8
drwxr-xr-x   4 root  wheel  128 21 Sep. 14:07 .
drwxr-xr-x   8 root  wheel  256 21 Sep. 12:48 ..
drwxr-xr-x@ 22 root  wheel  704 19 Sep. 01:26 8c231c5e04081a60d2d485c6365c58cf238f74a0cd37268e
-rw-r--r--   1 root  wheel   18 21 Sep. 14:07 8c231c5e04081a60d2d485c6365c58cf238f74a0cd37268e-snap-date

FWIW, urbackupclientbackend runs with UID 0, urbackupclientgui UID 501.

I’m stymied. Any ideas where to look?

Bodo

Does it work if you exclude /Library/Caches from backups or does that just make it run into the next problem?

I tried to exclude the directory

but it still complains about the same files in that directory.

The thing is: root can’t stat the files either:

Macncheese:~ root# whoami
root
Macncheese ~ root# ls -al /Volumes/urbackup_snaps/5a8d981cb18d3e193a4c4f55b739477fba3c41993925498d/Library/Caches
ls: com.apple.amsengagementd.classicdatavault: Operation not permitted
ls: com.apple.aned: Operation not permitted
ls: com.apple.aneuserd: Operation not permitted
total 0
drwxrwxrwt    9 root            admin    288 18 Sep. 15:49 .
drwxr-xr-x   66 root            wheel   2112 18 Sep. 14:58 ..
drwxr-xr-x@   3 root            admin     96 18 Sep. 14:58 ColorSync
drwx--x--x  591 _iconservices   admin  18912 23 Sep. 10:51 com.apple.iconservices.store
drwxr-xr-x    3 _modelmanagerd  admin     96 18 Sep. 15:49 com.apple.InferenceProviderService
drwxr-xr-x    3 root            admin     96 18 Sep. 14:58 Desktop Pictures
ls: fts_read: Operation not permitted

And yes, Full Disk Access is turned on for UrBackup Client and iTerm/Terminal.

I searched for other files that run into Operation not permitted when ls’ed by root (sudo ls -alR / 2>&1 | grep permitted). There are more residing in these directories or subdirectories thereof:

/private/var/containers/Data/ProtectedSystem
/private/var/db
/private/var/folders
/private/var/networkd/db
/private/var/OOPJit
/private/var/protected/trustd/private
/System/Library/AssetsV2
/System/Volumes/Data/private/var/containers/Data/ProtectedSystem

I don’t have access to a machine with macOS 26, so I don’t know whether that behavior has changed with Golden Gate.

Perhaps try the exclude without the wildcard additions

Makes no difference.

In fact, should it even be necessary to exclude this as “/Library/Caches/*” is by default excluded in line 5167 of urbackupclient/client.cpp?

And shouldn’t line 133 of urbackupcommon/os_functions_lin.cpp produce a “Skipping due to macOS SIP restriction” log entry for “/Library/Caches/com.apple.aned”?

In addition to the files listed in these two places I see a couple of other files or directories on my system that I cannot stat:

/Library/Caches/com.apple.amsengagementd.classicdatavault
/Library/Caches/com.apple.aneuserd
/private/var/containers/Data/ProtectedSystem/
/private/var/db/AppleIntelligencePlatform/
/private/var/db/ExtensibleSSO/Configuration
/private/var/db/installcoordinationd/
/private/var/db/rmd/
/private/var/db/SoC/
/private/var/db/SystemKeys/
/private/var/OOPJit/
/System/Library/AssetsV2/com_apple_MobileAsset_UAF_FM_GenerativeModels/
/System/Library/AssetsV2/com_apple_MobileAsset_UAF_FM_Overrides/
/System/Library/AssetsV2/com_apple_MobileAsset_UAF_FM_Visual/
/System/Library/AssetsV2/com_apple_MobileAsset_UAF_IF_Planner/
/System/Library/AssetsV2/com_apple_MobileAsset_UAF_IF_PlannerOverrides/ 

So I finally found some time to look into this some more.

I downloaded https://hndl.urbackup.org/Client/2.5.31/urbackup-client-2.5.31.tar.gz and compiled it. That produced the same Cannot stat errors. Adding

			upath+dirp->d_name=="/Library/Caches/com.apple.amsengagementd.classicdatavault" ||
			upath+dirp->d_name=="/Library/Caches/com.apple.aneuserd" ||
			upath+dirp->d_name=="/System/Library/AssetsV2/com_apple_MobileAsset_UAF_FM_GenerativeModels" ||
			upath+dirp->d_name=="/System/Library/AssetsV2/com_apple_MobileAsset_UAF_FM_Overrides" ||
			upath+dirp->d_name=="/System/Library/AssetsV2/com_apple_MobileAsset_UAF_FM_Visual" ||
			upath+dirp->d_name=="/System/Library/AssetsV2/com_apple_MobileAsset_UAF_IF_Planner" ||
			upath+dirp->d_name=="/System/Library/AssetsV2/com_apple_MobileAsset_UAF_IF_PlannerOverrides" ||
			upath+dirp->d_name=="/private/var/OOPJit" ||
			upath+dirp->d_name=="/private/var/containers/Data/ProtectedSystem" ||
			upath+dirp->d_name=="/private/var/db/AppleIntelligencePlatform" ||
			upath+dirp->d_name=="/private/var/db/ExtensibleSSO/Configuration" ||
			upath+dirp->d_name=="/private/var/db/installcoordinationd" ||

at line 134 of urbackupcommon/os_functions_lin.cpp finally got rid of the errors and allowed the backup to finish.

Three more things:

I got the error

ERROR: Creating shadowcopy of "rootfs" failed.

and don’t know why this happened.

The server lists the backup under computer name “Macncheese-R419…”. How do I get rid of the “-R419…”?

Make failed because it was looking for some .ico files. I had to uncomment the corresponding lines with the .xpm files in the Makefile.

OK, I figured this one out. I copied the apfs_snapshot scripts from the macOS pkg and now it creates a shadow copy. But now I’m back at the /Volumes/urbackup_snaps/… errors. Apparently, because the newly added exceptions only apply to / and not to the snapshot. How can I fix this?

The list stops working on the snapshot because it compares the full path. In the snapshot every path starts with /Volumes/urbackup_snaps//, so /Library/Caches/… never matches. Excluding the folders doesn’t help either, because the lstat that fails runs before excludes are applied.

Instead of extending the list, you could skip anything lstat refuses with “Operation not permitted” (EPERM, the “(1)” in your log lines). In urbackupcommon/os_functions_lin.cpp, in getFiles(), at the start of the else branch after lstat64 fails, right after int err = os_last_error(errmsg);:

#ifdef APPLE
if(err==EPERM)
{
Log(“[macOS] Skipping “”+upath+dirp->d_name+”“: “+errmsg+” (probably SIP)”, LL_INFO);
errno=0;
continue;
}
#endif

This works for / and for the snapshot, and it also covers whatever the next macOS update locks down. One downside: if Full Disk Access ever gets lost, files would be skipped with an info line instead of an error, so check the log for those lines now and then.

On your other points:

  • The “-R419…” suffix is your Mac’s serial number. Without an explicit computer name, the macOS client names itself “Computer Name-Serial” (it has done that since 2017) and caches the suffix in var/urbackup/mac_computername_add.txt. To get rid of it, set the computer name in the tray menu under Settings → Client, or with urbackupclientctl set-settings -k computername -v Macncheese. If the client keeps the same identity, the server should rename the existing entry and keep its backups.
  • Missing .ico files: the source tarball only ships the .xpm icons, but the macOS branch of the Makefile installs .ico files, which only exist in the urbackup_frontend_wx git repo. So your workaround is fine; it’s a packaging gap in the tarball.
  • Shadow copy: right, the APFS snapshot scripts aren’t in the public source. They only come with the pkg, so copying them over is the way to go.

I don’t have a Mac to test this on. Could you post whether the backup then finishes without errors?

Thanks for helping me along!

Yes, the backup now finishes without errors.

So the question is to me: what is the “correct” way to solve this?

I see three possibilities:

  1. Use the current solution.
    • Pro: Doesn’t break when Apple SIPs some more files.
    • Con: Might miss a lot of errors if something else goes wrong.
  2. Extend the list to include snapshots.
    • Pro: Still catches other errors.
    • Con: A lot of checking and string manipulation needs to be done for every file, though most of them don’t have SIP issues. Breaks on changes by Apple.
  3. lstat everything and if “Operation not permitted” then check against exclusion list.
    • Pro: Still catches other errors. Might be faster than 2.
    • Con: Still breaks on changes by Apple.

I would favor the last, but this is not my call to make.

And one more thing I don’t understand: without the snapshot I had to add all the entries above to the exclusion list, with the snapshot the EPERM error only pops up for the following

2026-10-16 10:13:55: [macOS] Skipping "/Volumes/urbackup_snaps/xxx/Library/Caches/com.apple.amsengagementd.classicdatavault": Operation not permitted (probably SIP)
2026-10-16 10:13:55: [macOS] Skipping "/Volumes/urbackup_snaps/xxx/Library/Caches/com.apple.aneuserd": Operation not permitted (probably SIP)
2026-10-16 10:13:55: [macOS] Skipping "/Volumes/urbackup_snaps/xxx/Library/Caches/com.apple.aned": Operation not permitted (probably SIP)
2026-10-16 10:14:15: [macOS] Skipping "/Volumes/urbackup_snaps/xxx/private/var/db/ConfigurationProfiles/Store": Operation not permitted (probably SIP)
2026-10-16 10:14:15: [macOS] Skipping "/Volumes/urbackup_snaps/xxx/private/var/db/CoreDuet/Knowledge": Operation not permitted (probably SIP)
2026-10-16 10:14:15: [macOS] Skipping "/Volumes/urbackup_snaps/xxx/private/var/db/ExtensibleSSO/Configuration": Operation not permitted (probably SIP)
2026-10-16 10:14:16: [macOS] Skipping "/Volumes/urbackup_snaps/xxx/private/var/db/rmd/secure": Operation not permitted (probably SIP)

Good to hear it finishes now.

Options 2 and 3 can be combined, and that also fixes the speed concern: the list is only checked after lstat fails with EPERM, so normal files cost nothing extra. On a failure, cut the snapshot mount prefix off the path and compare the rest with the existing SIP list. Real errors still show up, and it works for both / and the snapshot. It still needs updating when Apple locks down more paths, but you’d notice that right away as an error.

On the shorter list with the snapshot: my guess is that macOS enforces part of the protection by path on the live system, and those rules don’t match under /Volumes/urbackup_snaps/. Other entries carry a “restricted” flag in the file system, which is copied into the snapshot. ls -lO on one of the 7 paths and on one of the paths that only fails on / should show the difference.

Which fix goes upstream is uroni’s decision. If you’d like to make it a PR against 2.6.x, that would be the easiest way to get it decided.

Exactly, that’s what I had in mind with option 3. I will implement it, test it and then maybe make a PR (excitement, would be my first).

You say “against 2.6.x”. Where would I find that? I only know of 2.5.38 under GitHub - uroni/urbackup_backend: UrBackup - Client/Server Open Source Network Backup for Windows, MacOS and Linux · GitHub. Incidentally, that version doesn’t compile for me under macOS 27.

2.6.x is a branch in the same repository, not a release. On the GitHub page, switch the branch from “dev” to “2.6.x”, or clone it with: git clone -b 2.6.x GitHub - uroni/urbackup_backend: UrBackup - Client/Server Open Source Network Backup for Windows, MacOS and Linux · GitHub

It builds with CMake and vcpkg instead of autotools. The CI builds the macOS client on macOS 14 (arm64), roughly like this:

brew install ninja pkg-config autoconf autoconf-archive automake libtool

(clone vcpkg, run its bootstrap-vcpkg.sh, set VCPKG_ROOT)

cmake -S . -B out/osx -G Ninja -DCMAKE_BUILD_TYPE=Release -DURBACKUP_BUILD_SERVER=OFF -DURBACKUP_BUILD_CLIENT=ON -DURBACKUP_CLIENT_HEADLESS=ON -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=arm64-osx-urbackup -DCMAKE_OSX_ARCHITECTURES=arm64

cmake --build out/osx

I haven’t tried it on macOS 27. If it fails, post the first error. The SIP list is in urbackupcommon/os_functions_lin.cpp on that branch too. For the PR: fork the repository, make a branch from 2.6.x, and choose 2.6.x as the base when you open the pull request.

Thanks for the pointers!

I filed a PR against 2.6.x. I built a 2.5.30 pkg with the fix that is working fine with snapshots.

I will try to build 2.6.x on macOS 27 and report.

That was faster than expected. ./create_osx_installer.sh -d works under macOS 27. Produced a bunch of warnings but no errors. I haven’t tried the pkg yet as I have a full backup running and will wait for that to finish.

pkgbuild has some issues:

pkgbuild: Inferring bundle components from contents of osx-pkg
write: Permission denied
write: Permission denied
write: Permission denied
write: Permission denied
pkgbuild: Wrote package to pkg1/output.pkg
pkgbuild: Inferring bundle components from contents of osx-pkg2/Applications/UrBackup Client.app
pkgbuild: Adding top-level preinstall script
pkgbuild: Adding top-level postinstall script
write: Permission denied
write: Permission denied
write: Permission denied
write: Permission denied
pkgbuild: Wrote package to pkg1/output2.pkg

Obviously, the same happens on 2.5.30. I haven’t figured out how to tell pkgutil to be more specific. But so far I see no ill effects from the Permission denied.