Proxmox Backup Server on TrueNAS

TrueNAS Proxmox Backup Server

Create the Generic Dataset

We use a Generic dataset to avoid the complex locking mechanisms of SMB or NFS presets, which can interfere with how containers handle file ownership.

  1. Log in to your TrueNAS Web UI.
  2. Navigate to Datasets on the left sidebar.
  3. Select the parent dataset or pool where you want the backups to live.
  4. Click Add Dataset (top right).
  5. Name: pbs-storage (or your preferred name).
  6. Dataset Preset: Select Generic.
  7. Click Save.

In TrueNAS Create the Subdirectory and Set ACLs

Working in a subdirectory prevents PBS from conflicting with any special folders and let’s set and limit user permission. We will perform this in the TrueNAS Shell.

  1. Go to System Settings → Shell or use SSH
  2. If using the web shell use sudo of if you are not root user
  3. Go into the new dataset cd /mnt/tank/pbs-storage/
  4. Create the directory:mkdir datastore1
  5. Set Backup Owner For Container chown -R 2147000035:2147000035 datastore1
  6. Apply the Access ACL & Default ACL (Inheritance): setfacl -m u:2147000035:rwx,d:u:2147000035:rwx datastore1
For Those Curious About Container User Mapping

In TrueNAS 25, the default mapping for unprivileged containers starts at 2147000001.

  • Base ID: 2147000001 (This is the “Start” of the container’s world).
  • Root (0) inside the container: 2147000001 + 0 = 2147000001 on the Host.
  • Backup (34) inside the container: 2147000001 + 34 = 2147000035 on the Host.
  • Standard User (1000) inside the container: 2147000001 + 1000 = 2147010001 on the Host.
If you are… ID in the Container ID on the TrueNAS Host
Root User 0 2147000001
PBS Backup User 34 2147000035
Standard User 1000 2147010001

Create Debian 13 Container and Run this in the Container Shell

Optional: install bash completion

apt update && apt install -y bash-completion

cat << 'EOF' >> ~/.bashrc

# Enable bash completion
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi
EOF

For the changes to take effect in your current session without logging out, run:

source .bashrc

Step 1: Set root password

passwd root

Step 2: Prepare the Debian Environment

Open the container shell:

apt update && apt upgrade -y
apt install -y wget curl gnupg2 ca-certificates

Step 3: Download Proxmox Key

wget https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-trixie.gpg

Step 4: Create the Repository File.

cat <<EOF > /etc/apt/sources.list.d/pbs-no-subscription.sources
Types: deb
URIs: http://download.proxmox.com/debian/pbs
Suites: trixie
Components: pbs-no-subscription
Signed-By: /etc/apt/trusted.gpg.d/proxmox-release-trixie.gpg
EOF

Step 5: Install Proxmox Backup Server

Trixie’s library versions are newer, so apt will handle the dependency resolution for the updated PBS packages.

apt update && apt upgrade
apt install -y proxmox-backup-server

Step 7: Web GUI Access

  1. Get the container IP ip -4 -brief address show
  2. Navigate to https://<YOUR_CONTAINER_IP>:8007.
  3. Ignore the SSL certificate warning (it’s self-signed for now).
  4. Login: root / your_password / Realm: Linux PAM.

If Needed Testing Permissions in Container

sudo -u backup touch /mnt/pbs/datastore1/testfile 

If it works then remove the /mnt/pbs/datastore1/testfile

rm /mnt/pbs/datastore1/testfile
3 Likes

Building along with the video…

  • My Minisforum N5 Pro running Goldeye 25.10.1 does not show a bridge networking option. Need to figure out if this is important or if I need to debug it.

  • I didn’t set any acl options when I created the data store which might have impacts on the next steps

    x@truenas-n5pro[/mnt/x/Apps/pbs-backups]$ sudo mkdir datastore1
    x@truenas-n5pro[/mnt/x/Apps/pbs-backups]$ sudo chown -R 2147000035:2147000035 datastore1
    x@truenas-n5pro[/mnt/x/Apps/pbs-backups]$ sudo setfacl -m u:2147000035:rwx,d:u:2147000035:rwx datastore1
    setfacl: datastore1: Operation not supported 
    
  • After the error above, here is a check on the facl

    x@truenas-n5pro[/mnt/x/Apps/pbs-backups]$ getfacl datastore1
    
    file: datastore1
    
    owner: 2147000035
    
    group: 2147000035
    
    user::rwx
    group::r-x
    other::r-x
    

hi Tom (:

thank you for you great video.
its perfect timing since i am currently in the process of finding a PBS solution for a home setup.

I was wondering what your reason was to host the PBS LXC on Truenas vs PVE?

My first thought before seeing your video was installing the PBS LXC on PVE and mount the SMB to the PBS LXC (on PVE). (Tutorial: https://forum.proxmox.com/threads/tutorial-unprivileged-lxcs-mount-cifs-shares.101795 )

with kind regards

Here is how to set up the bridge

That is odd, I am not able to reproduce that error. When you made the dataset did you choose generic?

As I said in the video, running your backups on PVE itself means more setup work to recover and more overhead if you connect to a TrueNAS versus less better storage performance on TrueNAS when run in a TrueNAS container.

2 Likes

First time post :slight_smile: and first off I really like this this setup

But I had to do some troubleshooting in order to feel comfortable.

I wanted to test how easy it was to re-use a datastore on a other instance of the container or PBS install… as without this ability setup would be moot.

After a few unsuccessful tries adding the datastore via gui (always fails with permission issues, even if they are correct) no matter what you do.

I was able to add datastore from another instance, by manually creating a datastore.cfg entry, that seems to work without issues.

@LTS_Tom Reuseablity would have been a nice mention in your guide, imo

1 Like

Yeah, I probably could have covered that, it’s always a balance of how much goes into each tutorial.

1 Like

Hi,
I had the same issue with the setfacl command.
This is because my dataset was not POSIX but NFSv4 ACL Type.

But I also had issues with setting permissions for the “backup” user with ID 34.
You can use the “Map User/group ID” in the Containers configurations settings but it won’t let you map built-in users like the “backup” user.
So I had to create a new user in TrueNAS and set the permissions on that user.
Need to do more testing if everything is working but no time at this moment.

Hi Tom,
I decided to try to see if I could re-attach to an existing datastore if I had to recreate the container.

The GUI implies you should be able to add a data store using existing data.
I deleting the datastore and then tried recreating it using ‘add datastore’ with advanced ‘reuse existing datastore’ checked. No good, getting error:
Unable to open existing chunk store path "/mnt/pbs-storage/datastore1" - permissions or owner not correct
Tried modifying permission without any luck.

A bit of googling gave the solution:

  1. Manually edit “/etc/proxmox-backup/datastore.cfg” and add:
    datastore: truenas-pbs
    path /mnt/pbs-storage/datastore1

So not a permission issue. Whats going on with the GUI method?
I looked at the docs, but not obvious what is the purpose of the ‘reuse existing datastore’.
Mentions something about removable storage and multiple PBS instances.
Any idea if this can be done from GUI or if manual file edit is the only options?

The only place I see anything remotely like posix or nfs teminology is if I look into the presets for the acl. I think there used to be posix options in there but now they are only NFS options.

I was thinking it is a permission issue, just not with the datastore1 but the parent directory. I was assuming that PBS validates differently when reconnecting vs setting up.

namei -l /mnt/pbs-storage/datastore1/.chunks/
f: /mnt/pbs-storage/datastore1/.chunks/
drwxr-xr-x root   root    /
drwxr-xr-x root   root    mnt
drwxr-xr-x nobody nogroup pbs-storage
drwxrwxr-x backup backup  datastore1
drwxr-x--- backup backup  .chunks

So on the TrueNAS system I ran chown -R 2147000035:2147000035 /mnt/TempBackup/pbs-storage and it’s showing all permissions are set to the backup user:

namei -l /mnt/pbs-storage/datastore1/.chunks/
f: /mnt/pbs-storage/datastore1/.chunks/
drwxr-xr-x root   root   /
drwxr-xr-x root   root   mnt
drwxr-xr-x backup backup pbs-storage
drwxrwxr-x backup backup datastore1
drwxr-x--- backup backup .chunks

But I am getting the same error. I have checked the PBS logs in the container and they don’t offer any real insight either

root@youtube-pbs:/var/log/proxmox-backup/tasks/F5# cat UPID\:youtube-pbs\:00000516\:04B4E3F5\:00000002\:69909EF2\:create-datastore\:123ab\:root@pam\: 
2026-02-14T16:12:34+00:00: TASK ERROR: unable to open existing chunk store path "/mnt/pbs-storage/datastore1/" - permissions or owner not correct

I might post later in the Proxmox forums to see if someone there has a solution. Manually adding the config does work fine which is a work around until a proper fix can be determined.

From the TrueNAS UI, go to the dataset then click on the dataset you want to change then click the “Edit” button next to details, hit “Advanced Options” scroll down and look for “ACL Type”

That worked. Thank you.

Like Tom said:

Thanks for the video/writeup Tom, after some server switching its now my turn to say “this is exactly what I needed right when I needed it” :slight_smile:

I also got the “setfacl: datastore1: Operation not supported” error but it doesn’t seem to make a difference, backups still work.

I was wondering though, are there any specific dataset properties that should be changed to best ‘optimize’ for proxmox backups? Or, any specific settings elsewhere that might prove useful in this type of setup?

I’ve only very recently learned about the tmpdir change in /etc/vzdump.conf on the proxmox host that I think I want to use. In addition I didn’t realize the behaviors were so different with VMs and CTs with the same named options of “suspend” and “Snapshot”. Even after reading the documentation I’m not 100% sure what to use when, like for VM or CT hosts that have docker containers with/or databases, for example. I’m sure lots of is ‘depends’ but some general starting points would be appreciated.

Hey Tom and everyone,

First off, thanks Tom for another great video on PBS in TrueNAS! I was running PBS in TrueNAS VM for few months now, before was using it as VM in Proxmox with NFS shared storage, but for me it makes more sense to run in TrueNAS as all the drives are here. After watching your video, I decided to switch from VM to container.

Migration Experience

I had ~1.2TB of existing backup data, so I set up a remote sync job and pulled everything to the new PBS instance. This served as a good real-world test of the setup, and it worked flawlessly.

About performance:

Proxmox Node (pve3):

  • CPU: Intel i7-9700 @ 3.00GHz

  • Network: 10GbE to PBS storage network (dedicated VLAN)

PBS Benchmark:

proxmox-backup-client benchmark --repository backup@pbs@10.74.11.8:main

TLS (maximal backup upload speed) | 503.28 MB/s
SHA256 checksum computation speed | 563.39 MB/s
ZStd level 1 compression speed    | 604.30 MB/s
Chunk verification speed          | 367.10 MB/s

TrueNAS (PBS Host):

  • PBS running in Debian 13 container

  • Storage pool: 3× RAIDZ1 vdevs (9× 8TB HDDs total)

  • Metadata: 3-wide SAS SSD special vdev

  • SLOG: SAS SSD

  • Raw write speed to datastore: ~276 MB/s (dd test with oflag=direct)

Actual Backup Performance

Currently seeing consistent ~233 MB/s during backups:

104: 2026-02-15 10:00:33 INFO: transferred 6.37 GiB in 28 seconds (233.0 MiB/s)

I think the bottleneck is clearly the HDD pool’s sequential write speed.

Question for Tom and the Community

What route would you recommend to increase backup speeds? Would adding 4th VDEV help?

I’m curious what performance others are seeing with similar PBS-on-TrueNAS setups?

Thanks!

Great video, I immediately set this up in TrueNAS 25.10.

I ran into the same issue with setfacl, but changing the dataset ACL (via advanced) to POSIX solved that.

I guess Tom works with pools created in TrueNAS Scale as they are mostly demos? And thus the dataset might have a different inheritance on ACL?

I have a pool originally created in Core so I guess my inherit can be different than when you create a pool from scratch in Scale.