Newbie questions about urbackup

Hi All apologies for my basic questions here. I’ve read through the manual but it does not really cover this.

I work for a non-profit and I have a network of around 10 servers, 8 windows 2 linux. We are absolutely draconian here and merciless when it comes to user files, and have repeatedly told users “if you save anything to the C drive your not guaranteed to have it - use the network server shares for your data” All users know that if anything at all goes wrong with their PC then in 30 minutes we will have swapped their PC with a replacement that is freshly imaged and anything on their old PC is in the bit bucket. And we routinely do this and some of the holdouts HAVE lost significant data and complained up their chain about it only to be told variations of “that’s what you get”

You might think users hate our guts but users are users and once they get used to doing it our way and not their way, they don’t really care that they don’t get “their drive on their PC” anymore. Many in fact come to see the light and actually like it this way since they can login to any PC in the enterprise and all their files are right there in their H drive. We like it too since we aren’t forking over a mil a year to Citrix for “virtual desktops” or other hair-brained slow and unworkable “cloud PC” schemes.

So now, thankfully, we don’t have to worry about backing up a zillion client PCs like leaves in the tree, we just have to worry about backing up the fileservers.

I have a backup server that consists of a Proliant dl20 gen 9, with 3 USB attached 8TB disks in external docks. I’ve been using a ‘different’ ™ backup software for this under Windows Server 2019 but for a variety of reasons that’s no longer usable so I decided to give UrBackup a go.

I installed Ubuntu Server 26 on the machine, formatted the 3 disks EX4 and created one big directory with this line in /etc/fstab:

/mnt/disk1:/mnt/disk2:/mnt/disk3 /mnt/urbackup fuse.mergerfs defaults,allow_other,use_ino,cache.files=off,category.create=mfs,minfreespace=20G,fsname=mergerfs 0 0

When I added the first Windows server to UrBackup it immediately triggered a file backup that ran at around 3-5Mbts/sec overnight. (it was only around 150GB) after that completed it then immediately triggered an image backup that ran at around 550Mbt/sec which took about an hour.

So my questions are the following:

  1. Normally I’ve been getting around 500Mbt/sec with the ‘other’ software doing a file backup. That software did a sort of all-in-one backup where you could either do a bare metal image restore or individual file restore. Why is the UrBackup file backup so slow compared to the image backup and what can I do to fix this? Normally with the ‘other’ software I’ve always run with compression shut off in order to get max speed is that my problem is UrBackup compression the problem? I noticed in the default settings this is turned on, as well as encryption, and I don’t need that either. Should I use a different filesystem on the target disks?

  2. For some of my servers I don’t really need a filebackup but an image backup once a week would be really helpful, while with others an image backup would be useless while a file backup would be really helpful.

  3. My largest fileserver to backup is a Windows 2019 server with 1.5 million files on it. This is the one that a file backup would be most helpful.

  4. Is there any way to stop the client from immediately triggering a backup when the urBackup client is first loaded on it?

  5. I run 3 sets of target disk drives every couple weeks I swap the set and delete the now-stale backups from the oldest physical drives and use those as the new target. With the ‘other’ backup software I never run incrementals it’s always full backups. Having air-gapped backups is important, as well as having no dependency on a NAS. And having backups atomic (not dependent on each other) is also very important as I can’t have one failed incremental trashing an entire set.

If I do a systemctl stop urbackupsrv, then unmount my target disks, swap them, reformat them, then remount everything again, and then systemctl start urbackupsrv, is UrBackup going to throw fits when it suddenly sees /mnt/urbackup blanked out? Or is there a better way to do this? Keep in mind that I routinely lose around 1 of the 8TB target drives every year or two. These are Western Digital 7200 rpm 3.5TB black drives. I don’t do long term archiving of files (we have a different cloud backup system for that) the purpose of the UrBackup system is in case of a fire or flood to be able to quickly restore servers as I can’t wait around for a month for a cloud backup solution to download a million files to a restored server over an internet connection.

Thanks in advance for any suggestions! It’s extremely rare we ever use this backup system it’s for DR use not daily “I accidentally deleted a file off the server” use, but when we do need it - we really need it.

I have another question for you all. On my server I had setup ext4 formatted partition using the mergerFS program from Releases · trapexit/mergerfs · GitHub as a backup destination which worked for the initial testing. However I then tried setting up a urbackup destination drive formatted with btrfs using mergerFS. I COULD NOT get this to work AT ALL. I was able to get urbackup to write to it when the directory was just 1 disk formatted with btrfs but NOT when I merged 3 btrfs disks together using mergerFS. Instead I just kept getting Inappropriate IOCTL call on device errors when trying to write images. However, at the command line, I had zero problems writing to the merged filesystem. Does anyone have any suggestions? I’m not interested in merging disks together any other way because if a single disk in the pool of merged disk has a physical failure then the rest of the backed up files are still OK otherwise the whole set is bad if you merge them together differently.

A few answers:

Speed: compression and encryption only apply to internet clients, so they aren’t slowing down a LAN backup. The first file backup is slow per file, not per byte: every file is hashed, created and entered in the database, so many small files give a low MBit/s. Image backups stream blocks, which is why they are fast. I’d suspect mergerfs most. UrBackup uses hard links heavily for unchanged files, and with files spread over three disks hard links can’t cross from one disk to another, on top of the FUSE overhead. A single filesystem over the disks (or one disk per set) should behave much better.

File or image only: this is per client or per group in the settings. Turn off image backups for the file servers, and for the others leave the file backup without paths or disable it.

Immediate start: a new client is due for its first backup straight away. Set the server defaults before adding clients, and use the backup window so backups only start in the hours you want.

Fulls only: you can disable incrementals and only set a full interval. Each file backup is a complete folder tree either way. Unchanged files are hard-linked to the previous backup, but deleting an older backup doesn’t break the newer ones.

Swapping disks: the database is in /var/urbackup, not on the backup disks, so after a swap it still lists backups that are gone. Stop the server, swap, run “urbackupsrv remove-unknown”, then start it. The next backups will be complete ones.

btrfs under mergerfs: on btrfs UrBackup works with subvolumes, snapshots and reflinks, and those are btrfs-specific calls. mergerfs is a FUSE layer and doesn’t pass them to the disks underneath, which is where “Inappropriate ioctl for device” comes from. Normal writes from the command line don’t need them, so they work. So btrfs only helps as a single filesystem; under mergerfs stay with ext4.

Thanks! I ended up asking OpenAI and got the same answer (I was unaware that urbackup was heavily dependent on hardlinks) Here’s it’s answer:

VERIFY HARDLINK CAPABILITY:

test commands:

touch /mnt/merged/testfile
ln /mnt/merged/testfile /mnt/merged/testlink
ls -li /mnt/merged/testfile /mnt/merged/testlink

(If this fails you can’t use it. ed.)

UrBackup doesn’t care how the mount point is presented — it just needs:

A filesystem it understands (ext4, btrfs, zfs, etc.).
Correct free space reporting.
Working hardlink support for deduplication.
The reason you hit trouble with MergerFS + Btrfs is that MergerFS is a FUSE layer, and UrBackup’s space/hardlink checks sometimes misbehave with FUSE mounts — even if the underlying FS is fine.

( OpenAI then proceeded to recommend instead of merging the disks I setup a mirrored RAID. Of course, doing this means halving the storage capability plus the fact that the redundancy is supplied by the fact the disks are -physically_removed_ periodically, that’s why they are in docks! Sigh. AI’s - highly useful with zero common sense - can’t live with 'em and you can’t live without 'em. ed.)

With RAID, there’s no FUSE layer — the kernel presents it as a “real” block device — so UrBackup sees it as a normal disk.

( Yah, I knew that already. Of course, I could also -stripe- the disks together but then if one disk in the backup pool dies - everything on all disks is trash. With FUSE, you still can get some data out of working disks. ed.)

Keep MergerFS → You get flexibility, but UrBackup may only reliably work with ext4 pools.
Go RAID → You lose flexibility, but UrBackup will treat it like a single native disk and Btrfs will work fine.
Go single large disk → Simplest, but single point of failure unless you manually duplicate.

If you want maximum reliability with UrBackup → RAID1 with Btrfs is the safest bet.
If you want maximum flexibility → stick with MergerFS but use ext4 for now until UrBackup’s FUSE handling improves.
If you want maximum simplicity → single large disk, but keep an offline copy.

So that was OpenAIs response. It was a very good, very useful, response. NONE of which was in the manual, the forums, or anywhere on the website. I guess I have to ask - is there an attempt to make the docs hard for a newbie? My guess is the OpenAI response was gathered from dozens of reddit posts scattered over the last decade.

The single large disk is another solution - I could buy a new USB 3.2 dock that supports a monster $900 20TB disk and bypass FUSE - of course then when the disk crashes I lose 20TB of data not just 8TB. Maybe some day in the future when hard drive prices drop for large disks.

I was sort of surprised the OpenAI answers were as generally sane as they were. The OpenAI Foundation must have scraped out a lot of good material when training the current LLM.

I do think the manual needs some reworking. A lot has changed since 2022 when it was written. The one thing that really needs to be emphasized I think in the manual is putting some thought into preparation of the target media. urbackup has zero knowledge of things like disk pools and such whereas commercial backup software often has extensive knowledge of such things. So switching from a commercial package (Backup Exec in this case) is a shock. But so far - it’s working well even with EXT4. In fact, our largest fileserver has around 3TB of data and about a million and a half files on it - and I imaged that to a vhdx file in about 5 hours. It was - and I kid you not - taking ALMOST TWO DAYS for B.E. to do the same backup - going to the same USB disk pool - on the same server

And the other super scary frightening thing about BE is for fun I stuck one of the BE written 8TB disks in a dock in a brand new Win 2022 server - and it couldn’t even see it as a disk. At all. Event Log showed a disk had been inserted but nada, nothing, in disk manager.

As it turned out what I THINK was going on is BE was addressing every large disk above 2TB in our pool as some crazy 512e LBA assist or some baloney, because the GPT partition table that BE was writing to these disks was misaligned. So Windows server was taking one look at this 8TB disk with native 4k blocks and a GPT table in some crazy-ass spot on the disk and going “that ain’t no disk” Which means every single large BE disk we have is garbage - it’s unreadable if I try taking it to any other server. So if my backup server hardware were to die - which is kind of the point of disaster recovery - I’d have been completely hosed if I bought a new one.

I have to say - learning about THAT little trap door is worth all of the time I’ve spent messing with urbackup and learning about it this weekend.

Anyway, what I have found through all of this is the following:

  1. The filesystem backups in urbackup are probably useful for some people but for me they are pointless for windows servers. I just disabled them and am doing image backups only. If I need a file I can mount the vhd or vhdx file on some convenient server and get it.

  2. On the other hand - image backups for Linux filesystems are nonexistent - so - it’s excellent that UrBackup supports filesystem backups. Yes - if I rebuilt all my Linux bare metal servers as Btrfs servers - I could do Copy on Write snapshotting. But - everything I’ve run across says the urbackup Linux client cannot deal with COW much less the UrBackup server.

What I have been doing for my critical Linux servers is crude but effective - virtualize them. if they are on HyperV then I can snapshot them if they are on KVM then the -cleanest- way to do it is shut them down late at night during a maintenance cycle and make a copy of the VM file.

  1. the urbackup Windows client uses vss like it’s supposed to and that there is the most valuable bit of all of this. Half of my servers are hyperv VMs and the rule I instituted in the department is if it can be put into a VM then put it into a VM. Because the UrBackup client is properly written, I can do an image backup of my hyperv hypervisor servers and get a nice 2-3TB vhdx file and be done with it. And that vhdx file contains all the other smaller VMs of the other servers. All I really need to do is script a weekly snapshot of those which is trivial and a UrBackup of them will contain consistent VM files inside of it. Absolutely sweet.

  2. Speed is critical (which is another reason I’m not bothering with file backups) and I’m getting around 550 Mb/sec on image backups but about 10% of that speed on file backups. The OpenAI seems to think this is normal due to the overhead of all the filesystem calls. I’m not complaining!

  3. Attempting to mount an image from the web GUI just causes UrBackup to hang to the point I have to reboot the backup server. But mounting it from the command line using urbackup - zero problems. Not sure what’s going on with that one.

My network is quite a mix - I have Windows Server hypervisor servers running a mix of Linux and Windows Server VMs, and I have Linux KVM+QEMU hypervisors running a mix of Linux and Windows Server VMs. I think one of my people even has a Docker image somewhere. So having a solid Linux backup server is really important - and we haven’t had one. The commercial backup people all seem to have drunk the kool aid that the Linux world is Red Hat only. NONE of our Linux stuff is Red Hat, it’s all Debian based, either Debian server or Canonical’s hacked up version of Debian.

So I was looking forward to setting up the Linux client. But I’m not that thrilled, honestly.

The first impression on the Linux client is probably a couple hundred warnings about auto_prt being deprecated. Really? Are we serious? That’s like a 10 year old error. They were arguing about this SIXTEEN years ago:

c++ - Is auto_ptr deprecated? - Stack Overflow

For the record the current advice is:

  • Use std::unique_ptr for single ownership (most cases).

  • Use std::shared_ptr if multiple owners share the same resource.

// Old (deprecated)
auto_ptr p(new MyClass());

// New (recommended)
unique_ptr p = std::make_unique();

cpp:

auto_ptr p1 = p2;

replace with

unique_ptr p1 = std::move(p2);

Am I going to do it? No, it’s not my code, I don’t understand it. But with Ubuntu as a recommended target in the manual and on the website for the client - I’d be very worried.

Canonical is known for being pricks and removing stuff “just because” in new Ubuntu versions. People are screaming bloody murder for them pulling support of Vnc client in the latest Ubuntu 26 Desktop. They are blaming it on Wayland but I don’t buy that since they have a building full of developers and one of them could have taken an afternoon and written a bridge layer to keep the anti-Microsoft religious types happy who are now hating they have to use RDP Client. I can EASILY see them mucking about with the compiler.

Next, the build instructions on

UrBackup - Install client on Debian or Ubuntu from sources are antiques and very broken. O-M-G. That was at least 8 hours of time sorting this out. Here’s what I had to do to build it on Jammy:

apt install -y libssl-dev libsqlite3-dev
apt install --no-install-recommends build-essential
apt install zliblg-dev
apt install libz-dev
apt install libcrypto+±dev (this is unnecessary unless you want to experiment)
apt install libdevmapper-dev
apt install libzstd-dev

wget https://hndl.urbackup.org/Client/2.5.31/urbackup-client-2.5.31.tar.gz

tar xzf urbackup-client-2.5.31.tar.gz
cd urbackup-client-2.5.31.0

./configure --enable-headless --enable-embedded-cryptopp
make
make install

Note the configure option to force use of the internal crypto code. The crypto library under Ubuntu Jammy - and probably later Ubuntu versions - is NOT compatible. It has many more types of encryption in it - and UrBackup server is compiled with it’s own crypto library. I first attempted to build the client with the external library per directions - this FAILED. What I discovered is you MUST use the internal library or the client WILL NOT connect to the server.

Note the headless option there. Nobody builds Ubuntu servers with a CPU-sucking GUI on them at least nobody who should be given responsibility for doing this. And who puts files on a desktop anymore? Networks & NASes, people. You can literally build a NAS out of that 10 year old PC you are e-wasting so DO IT and then you can trash your desktop and you won’t lose your files.

I get that URBackup originated “back in the day” when networks were Thinnet and people actually did store actual data locally on their MFM and RLL drives with “stiction” issues that you had to bounce the PC on the desk to fire up - but honestly WHO DOES THIS anymore? Why do you think every corporate PC out there has a weenie little 256GB SSD in it? It’s because the days of 200 desktop PC’s streaming backup files to a UrBackup server have been slid into the history books. Now we have desktops saving to servers and servers streaming GIANT volumes to UrBackup and the documentation needs to reflect this.

Anyway, getting back to the Linux client.

Now, the #1 first basic test on this blew up with a core dump:

urbackupclientbackend
terminate called after throwing an instance of ‘std::logic_error’
what(): basic_string::_M_construct null not valid
Aborted (core dumped)

You never do this in code. If options are required then test for a null passed on the command line and gracefully exit with an error message that tells the user what to do.

moving on:

urbackupclientbackend -v info
2026-10-11 21:48:28: SQLite: recovered 24 frames from WAL file /usr/local/var/urbackup/backup_client.db-wal code: 283
2026-10-11 21:48:28: FileSrv: Servername: -redcap-
2026-10-11 21:48:28: urbackupserver: Server started up successfully!
2026-10-11 21:48:28: sambaredir: Server started up successfully!
2026-10-11 21:48:28: Started UrBackupClient Backend…

so far so good.

Now the next problem is, /etc/rc.local disappeared after Ubuntu 15 when they switched to systemd So please stop talking about it on the website.

Here, ripped off from Start client backend through systemd · Issue #7 · funilrys/aur-urbackup2-client

and modified is:

cat /etc/systemd/system/urbackupclientbackend.service
[Unit]
Description=UrBackup Client Backend
After=syslog.target network.target

[Service]
ExecStart=/usr/local/sbin/urbackupclientbackend --no-consoletime
User=root
#Optional: set working directory if needed
#WorkingDirectory=/usr/local/var/urbackup

[Install]
WantedBy=multi-user.target

Note that the config line used in the other example is removed - because the most current Linux UrBackup client ignores everything in the traditional default file. Instead it’s new config file is /usr/local/var/urbackup/data/settings.cfg and there is no use putting anything in here since this file is completely blown away and overwritten by configs pulled from the server.

The manual needs to mention this. The manual needs to say “once upon a time the Linux client used /etc/default/urbackupclient as a default config file and actually paid attention to stuff in it but that ship has sailed” This is because there’s dozens of antique website posts out there that talk about urbackup but the posters haven’t picked up the clue phone.

Now, with the correct file,

systemctl daemon-reload (run once)

systemctl enable urbackupclientbackend (run once)

then the commands:

systemctl start urbackupclientbackend

systemctl stop urbackupclientbackend

work normally as God - or Canonical in this case - intended. LOL

start the server

systemctl start urbackupclientbackend

wait a while and do a

urbackupclientctl status

Then load in the directories to backup - either from the client or the server

urbackupclientctl add-backupdir -d /home -n home

etc

etc.

and it’s off to the races.

That install web page REALLY needs to be updated.

Glad it’s working. A few things that may save you time on the Linux side:

You don’t need to build the client from source. The binary installer (the “Linux, binary” download on the website, or the one the server offers under Add new client) installs static binaries, sets up the systemd unit and asks which snapshot method to use. That is also where Linux image backups and COW come in: it offers dattobd (image backups and changed block tracking), LVM snapshots and btrfs snapshots.

/etc/default/urbackupclient is still used, but only if the backend is started with “–config /etc/default/urbackupclient”. The unit the installer ships has that; the one you adapted dropped it. It covers log file, log level, restore mode and internet-only. Backup paths and the rest come from the server, as you found.

The crash when running urbackupclientbackend without arguments is a real bug, a missing argument count check. I’ll send a fix.

The auto_ptr warnings are gone in the development branch; 2.5.x and 2.6.x still have them.

For the web interface mount hang: which server version is it, and is there anything in /var/log/urbackup.log when it happens?

It’s the latest Ubuntu Server 26 and the urbackup server is the binary from the PPA not compiled from source. Is there any place in the server to specify a mount point? That might be the problem - at the command line I can do that - I have seen nothing in the GUI webinterface config where you can specify a mount point for the mount button so when clicking the button maybe it’s hanging because the back end command is incomplete or specifying a mount directory that does not exist? I compiled the Linux client binary both because this was an older Ubuntu client and because unless you can build a F.O.S.S. package from it’s source, and the toolchain instructions work, then it’s not really FOSS. IMHO. I’m used to Broadcom and Netgear and all of those companies publishing “GPL compliant” source for their modded OpenWRT versions then “forgetting” to publish the toolchain used so it’s unbuildable - let’s not encourage that behavior. The problem with not supporting --config in the source I used is if the client is on a different subnet - in my enterprise we have 14 subnets - while most of the servers are on the same subnet one is not. I would suggest adding a ./configure flag to enable --config I get the KISS of removing support for --config but anyone building it from source likely doesn’t need KISS. The .cfg file is overwritten by the client so no use putting a server IP in it and without a server IP the client does not know how to reach the server and it’s magic packets won’t help. Perhaps a --server option instead of a --config option for those cases? The .cfg file syntax is confusing anyway since even on a local net the client fills out “internet server” with the IP of the local server. Incidentally, Cisco Catalyst IOS allows for UDP broadcast forwarding so ip forward-protocol udp 35622 might work, I’ll have to try it out and report back. If it does not then I’ll file a feature request PR for it. Thanks for submitting the bugfix.

I set up your configuration in a VM to check this: Ubuntu Server 26.04, urbackup-server 2.5.38 from the PPA, three ext4 disks under mergerfs with your fstab options.

Mount point: there is no setting. The web interface always mounts inside the image backup folder, at ///contents0, using guestmount from libguestfs-tools. mergerfs is not the problem, mounting worked there for me.

What I do see is the server crashing. In 2 of 4 tries, once on mergerfs and once on plain ext4, the urbackupsrv process died about a minute after clicking mount. The web interface stops answering and the mount processes (urbackupsrv mount-vhd, guestmount, qemu) stay behind. /var/log/urbackup.log ends with “Thread exit with unhandled std::exception std::bad_alloc” or “basic_string::_M_create”. This is a bug in 2.5.38 that can hit when the mount takes longer than 10 seconds. It is fixed in the 2.5.x branch but not in a release yet. “systemctl restart urbackupsrv” was enough to recover here, without a reboot. Can you check if your log shows one of those lines? If your images are .vhdx, 2.5.38 can’t mount those from the web interface at all (log says “Footer checksum wrong”), which is fixed in the same branch. Until the next release the command line mount is the safe way, it worked for both formats in my test.

--config: it is in the 2.5.31 source too, nothing was removed. “make install” just doesn’t install a config file or a systemd unit. Copy defaults_client from the source directory to /etc/default/urbackupclient and add “–config /etc/default/urbackupclient” to ExecStart. It only holds log file, log level, restore mode and internet-only though, no server address.

Other subnet: nothing is needed on the client. On the server, use Add new client, choose “Discover new local/passive client accross networks” and enter the client’s IP or hostname. The server then sends its discovery packet straight to that address instead of relying on the broadcast. Discovery goes from server to client (UDP port 35622), so the Cisco forwarding would have to carry the server’s broadcast into the client’s subnet.

I don’t see those lines, unfortunately. But the need to mount anything on a backup server SHOULD be rare, lol. In looking more closely into the forwarding command in Cisco IOS it isn’t usable since it’s intended for client UDP broadcasts to be forwarded to servers, not the other way around. Since urbackup does it from server to clients it won’t help. Also, it merely extends the dhcp helper command and on a large windows network the dhcp helper is always going to be pointing to the dhcp server anyway not the backup server. Add New Client from the server works fine, though.

My last question is why does every server I backup via image show a C volume and a SYSVOL volume. SYSVOL is Microsoft’s term for a thing on a Domain Controller but these are not domain controllers so UrBackup must be using that name differently…

Still can’t get over how flipping fast this thing is - I should have ditched BE years ago…

SYSVOL here has nothing to do with the domain controller share. It is UrBackup’s name for the small “System Reserved” partition that Windows setup creates in front of C: and that holds the boot loader. The client looks for it on the same disk as C: (no drive letter, small, marked bootable) and backs it up together with C:, so that a restored machine can boot. On UEFI systems you will see “ESP” for the EFI system partition for the same reason.

They are tiny, so they cost next to nothing. I’d leave them in.

Good to hear that Add new client works for the other subnet.