# 1.4 Storage

<span>This Book will discuss the different types of storage you can attach to your virtual machines inside of Proxmox. Note, that this book will also discuss the restoration of storage that is broken for whatever reason. </span>

# 1. ZFS Pools

# 1. Creation of ZFS Pools in Proxmox



# 2. Deleting a ZFS Pool in Proxmox

Sometimes you want to delete a zfs pool because you have new drives or decided that you want to make an LVM or directory pool instead. For instance if you choose to host Truenas VM or PBS VM with virtual drives it is better to let PVE be an LVM pool and let the VM's handle the ZFS portion. This is because ZFS on top of ZFS is not recommended since it creates unnecessary overhead.

So to delete a zfs pool in proxmox you need to execute the following commands in the PVE shell

```bash
zfspool destroy POOLNAME
```

Then once it is destroyed you should also remove the zfspool entry located in **/etc/pve/storage.cfg**

```bash
nano /etc/pve/storage.cfg
```

Then remove the zfspool lines that include the pool you want to destroy. However, to create a new pool or lvm/directory you still need to wipe the disk clean for proxmox to recognize it as a drive that has not been assigned yet.

<p class="callout info">For this go to pve &gt; Disks &gt; and then select the disks that were part of the zfspool that you just destoryed.</p>

Then hit **Wipe Disk** and you are all set.

After that you can refresh the page and if all went well your zfspool should be gone by now.

# 2. NFS Shares (File Storage)

# 2. NFS Share

Now NFS Share can both be run in a virtual machine with TrueNas or you can run an NFS share also directly on the Proxmox machine itself.

You're absolutely right. \*\*Running NFS directly on Proxmox allows you to leverage Proxmox Backup Server (PBS) for native, integrated backups\*\* of your storage, which is a significant advantage over virtualizing it in a TrueNAS VM.

When NFS runs directly on the Proxmox host, you can:

\- \*\*Use PBS's native backup capabilities\*\* to back up your NFS storage without the overhead of managing backups through a virtualized appliance  
\- \*\*Streamline your backup infrastructure\*\* by keeping everything within the Proxmox ecosystem  
\- \*\*Reduce complexity\*\* — you don't need to manage backup scheduling and retention policies across separate systems  
\- \*\*Maintain better performance\*\* during backups since PBS can access the storage directly without VM virtualization overhead

In comparison, if NFS runs inside a TrueNAS VM, you'd need to either:  
\- Treat the entire VM as a backup target (less granular)  
\- Set up separate backup mechanisms within TrueNAS itself  
\- Back up the VM separately from any NFS data it serves

So from a backup and integration perspective, \*\*native NFS on Proxmox + PBS is cleaner and more efficient\*\* than the virtualized approach. This is especially true if you're already invested in the Proxmox ecosystem and want a unified storage and backup solution.

# 2. NFS Share on Proxmox with Cockpit + 45 drives plugin

Source: [https://www.youtube.com/watch?v=Hu3t8pcq8O0](https://www.youtube.com/watch?v=Hu3t8pcq8O0)

# 3. Object Storage

# 1. What is object storage ?

### Benefits of Object Storage

- <span class="font-semibold">Scalability</span>: Object storage solutions can handle large amounts of data, making them ideal for growing storage needs.
- <span class="font-semibold">Global Accessibility</span>: Data stored in object storage can be accessed from any location, facilitating collaboration among distributed teams.
- <span class="font-semibold">Cost-Effectiveness</span>: Many object storage services offer a pay-as-you-go model, which can be economical for varying storage requirements.

### <span>S3</span> <span>Horizontal</span> <span>Scaling</span>

<span class="font-semibold"><span>S3</span> <span>is</span> <span>truly</span> <span>horizontally</span> <span>scalable</span></span> <span>—</span> <span>you</span> <span>can</span> <span>store</span> <span>unlimited</span> <span>objects</span> <span>across</span> <span>multiple</span> <span>regions</span> <span>and</span> <span>availability</span> <span>zones</span> <span>without</span> <span>architectural</span> <span>changes.</span> <span>There's</span> <span>no</span> <span>practical</span> <span>upper</span> <span>limit</span> <span>on</span> <span>capacity</span> <span>or</span> <span>concurrent</span> <span>connections.</span>

### <span>NFS/iSCSI</span> <span>Limitations</span>

<span class="font-semibold"><span>NFS</span> <span>and</span> <span>iSCSI</span> <span>don't</span> <span>scale</span> <span>horizontally</span> <span>in</span> <span>the</span> <span>same</span> <span>way</span></span><span>,</span> <span>but</span> <span>the</span> <span>constraint</span> <span>differs:</span>

- <span class="font-semibold"><span>NFS</span></span><span>:</span> <span>A</span> <span>single</span> <span>NFS</span> <span>share</span> <span>(export)</span> <span>is</span> <span>limited</span> <span>by</span> <span>the</span> <span>backend</span> <span>storage</span> <span>system</span> <span>it's</span> <span>mounted</span> <span>from.</span> <span>You</span> <span>can</span> <span>add</span> <span>more</span> <span>NFS</span> <span>shares/exports,</span> <span>but</span> <span>you're</span> <span>adding</span> <span class="font-semibold"><span>discrete</span> <span>storage</span> <span>pools</span></span><span>,</span> <span>not</span> <span>transparently</span> <span>scaling</span> <span>a</span> <span>single</span> <span>namespace.</span> <span>Multiple</span> <span>NFS</span> <span>shares</span> <span>require</span> <span>application-level</span> <span>awareness</span> <span>of</span> <span>where</span> <span>data</span> <span>lives.</span>
- <span class="font-semibold"><span>iSCSI</span></span><span>:</span> <span>Similar</span> <span>constraint</span> <span>—</span> <span>a</span> <span>single</span> <span>LUN</span> <span>is</span> <span>bounded</span> <span>by</span> <span>its</span> <span>underlying</span> <span>storage.</span> <span>You</span> <span>can</span> <span>add</span> <span>multiple</span> <span>LUNs,</span> <span>but</span> <span>again,</span> <span>you're</span> <span>managing</span> <span>separate</span> <span>storage</span> <span>targets,</span> <span>not</span> <span>seamless</span> <span>horizontal</span> <span>scaling.</span>

### <span>For</span> <span>PBS</span> <span>Remote</span> <span>Backup</span> <span>Context</span>

<span class="font-semibold"><span>This</span> <span>is</span> <span>relevant</span></span><span>:</span> <span>A</span> <span>PBS</span> <span>system</span> <span>backing</span> <span>up</span> <span>to</span> <span>NFS</span> <span>or</span> <span>iSCSI</span> <span>on</span> <span>a</span> <span>traditional</span> <span>SAN</span> <span>can</span> <span>hit</span> <span>capacity</span> <span>limits</span> <span>and</span> <span>requires</span> <span>manual</span> <span>expansion</span> <span>(adding</span> <span>new</span> <span>shares/LUNs).</span> <span>S3</span> <span>removes</span> <span>this</span> <span>constraint</span> <span>entirely</span> <span>—</span> <span>capacity</span> <span>expands</span> <span>transparently.</span>

<span>However,</span> <span class="font-semibold"><span>PBS-to-PBS</span> <span>replication</span></span> <span>over</span> <span>a</span> <span>network</span> <span>still</span> <span>provides</span> <span>better</span> <span>deduplication</span> <span>than</span> <span>S3,</span> <span>even</span> <span>if</span> <span>S3</span> <span>scales</span> <span>more</span> <span>elegantly.</span> <span>The</span> <span>trade-off</span> <span>is</span> <span>between</span> <span class="font-semibold"><span>efficiency</span></span> <span>(PBS-to-PBS)</span> <span>and</span> <span class="font-semibold"><span>unlimited</span> <span>scalability</span></span> <span>(S3).</span>

<span>So</span> <span>you're</span> <span>identifying</span> <span>a</span> <span>real</span> <span>architectural</span> <span>advantage</span> <span>of</span> <span>S3</span> <span>that</span> <span>shouldn't</span> <span>be</span> <span>overlooked</span> <span>when</span> <span>designing</span> <span>remote</span> <span>backup</span> <span>infrastructure.</span>

# 1. Garage S3



# 2. RustFS S3



# 3. SeaweedFS S3



# 4. Projects That use Object Storage

YouTube uses object storage to store and manage its vast library of videos efficiently. Object storage assigns each video a unique identifier and metadata, enabling fast retrieval and scalability across global storage pools.

# 4. Restore ZFS Pools

<span>In this chapter we will explain how you can restore your ZFS pool if they are degraded. It is expected that you have setup Email or NTFY notificatons on your phone such that you always know when this happens and you can take action. </span>

# 1. Restore a Proxmox ZFS pool

Source: [Oneuptime](https://oneuptime.com/blog/post/2026-03-02-how-to-replace-a-failed-disk-in-a-zfs-pool-on-ubuntu/view)

In the occasion that one of your Proxmox ZFS pools becomes degraded then this is one of the ways to restore your pool. Such a pool could be an OS, VM or a storage pool. Now, once you receive a [proxmox notification](https://docs.rfeyn.org/books/23-maintenance/chapter/2-proxmox-notifications) (Don't forget to setup Proxmox notifications via Email or NTFY) that your pool is degraded you will see in the Proxmox GUI the following:

[![Screenshot From 2026-06-30 02-25-01.png](https://docs.rfeyn.org/uploads/images/gallery/2026-07/scaled-1680-/gHbPQlrpeMeZzMoi-screenshot-from-2026-06-30-02-25-01-png.png)](https://docs.rfeyn.org/uploads/images/gallery/2026-07/scaled-1680-/gHbPQlrpeMeZzMoi-screenshot-from-2026-06-30-02-25-01-png.png)

1\. If you then double click on the Degraded pool you will see which drive is actually degraded and needs to be replaced.

[![Screenshot From 2026-06-30 02-29-50.png](https://docs.rfeyn.org/uploads/images/gallery/2026-07/scaled-1680-/x6R8k4C3A1nW2qZ9-screenshot-from-2026-06-30-02-29-50-png.png)](https://docs.rfeyn.org/uploads/images/gallery/2026-07/scaled-1680-/x6R8k4C3A1nW2qZ9-screenshot-from-2026-06-30-02-29-50-png.png)

2\. The note down the Serial Number of your degraded or failed drive s.t you can go into your machine and take out the failed drive.

3\. Then take your new drive and insert it in the failed drive location.

4\. Now, what is important is that you need to note down the serial number of the new drive that you have added. Luckily we can just go into Proxmox &gt; Disks and we see an overview of all the disks that are connected to the Proxmox system

5\. Then look for your drive in my case that is **ata-Samsung\_SSD\_870\_EVO\_1TB\_S75CNX0WC58810Y** which is mount to /dev/sda and the degraded drive is **ata-KINGSTON\_SA400S37480G\_50026B7785A335B4** mounted to /dev/sdc

[![Screenshot From 2026-07-03 23-05-05.png](https://docs.rfeyn.org/uploads/images/gallery/2026-07/scaled-1680-/DuCjC2XiBLjOrzt5-screenshot-from-2026-07-03-23-05-05-png.png)](https://docs.rfeyn.org/uploads/images/gallery/2026-07/scaled-1680-/DuCjC2XiBLjOrzt5-screenshot-from-2026-07-03-23-05-05-png.png)

6\. Then to make sure everything is removed from the **new fresh disk** and it is clean you will wipe the disk with the button Wipe Disk.

7\. Then we will go into our Shell and use the command **sudo zpool status &lt;YOUR POOL NAME&gt;**

```bash
root@pve1:~# sudo zpool status VMPool
  pool: VMPool
 state: DEGRADED
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
   see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-9P
  scan: resilvered 104M in 00:00:01 with 0 errors on Fri Jul  3 22:47:08 2026
config:

        NAME                                            STATE     READ WRITE CKSUM
        VMPool                                          DEGRADED     0     0     0
          mirror-0                                      DEGRADED     0     0     0
            ata-KINGSTON_SA400S37480G_50026B72832059D9  ONLINE       0     0     2
            ata-KINGSTON_SA400S37480G_50026B7785A335B4  DEGRADED     0     0     0  too many errors

errors: No known data errors
```

8\. Note down the disk that has failed or is degraded (ata-KINGSTON\_SA400S37480G\_50026B7785A335B4 in this case). Then as suggested in the actions we will use the command **zpool replace** to replace the failed drive.

```bash
sudo zpool replace POOLNAME /dev/disk/by-id/old-disk /dev/disk/by-id/new-disk
```

This will then result in this ;)

```bash
root@pve1:~# sudo zpool replace VMPool /dev/disk/by-id/ata-KINGSTON_SA400S37480G_50026B7785A335B4 /dev/disk/by-id/ata-Samsung_SSD_870_EVO_1TB_S75CNX0WC58810Y
root@pve1:~# zpool status VMPool
  pool: VMPool
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Fri Jul  3 23:29:16 2026
        69.8G / 69.8G scanned, 513M / 69.8G issued at 257M/s
        501M resilvered, 0.72% done, 00:04:36 to go
config:

        NAME                                               STATE     READ WRITE CKSUM
        VMPool                                             DEGRADED     0     0     0
          mirror-0                                         DEGRADED     0     0     0
            ata-KINGSTON_SA400S37480G_50026B72832059D9     ONLINE       0     0     2
            replacing-1                                    DEGRADED     0     0     0
              ata-KINGSTON_SA400S37480G_50026B7785A335B4   OFFLINE      0     0     0
              ata-Samsung_SSD_870_EVO_1TB_S75CNX0WC58810Y  ONLINE       0     0     0  (resilvering)

errors: No known data errors
root@pve1:~# 
```

9\. We can now see that after the replace command that the VMPool is resilvering straight away. Since, it is a mirror zfspool the resilvering process can go really quick.

10\. Then you will get a notification via NTFY or Email once the resilvering process is done. If it is a long resilvering process you can check the progress of the resilvering progress by using the **zpool status POOLNAME** command.

Awesome! You replaced your old drive with a new one ! basically in 15 minutes!! That was not that hard was it ;)

# 2.  Restore a TrueNas ZFS pool

# 5. Expanding ZFS Pools

Not for everyone but there might come a day that you want to expand your ZFS pools because well, you simply have to much data yourself or you added to many users to it. Then in this section we will show how you could expand your ZFS pool without loosing any of your data. We will do this both for Proxmox and TrueNas ZFS pools.

# 1. Expanding Proxmox ZFS Pool

<span>The</span> <span>consensus</span> <span>among</span> <span>ZFS</span> <span>experts</span> <span>depends</span> <span>on</span> <span>your</span> <span>constraints:</span>

- <span class="font-semibold"><span>If</span> <span>you</span> <span>have</span> <span>spare</span> <span>bays</span> <span>and</span> <span>older</span> <span>drives</span></span><span>:</span> <span>Many</span> <span>recommend</span> <span class="font-semibold"><span>starting</span> <span>replacement</span> <span>earlier</span></span> <span>(around</span> <span>65%</span> <span>full)</span> <span>with</span> <span>one</span> <span>drive</span> <span>at</span> <span>a</span> <span>time,</span> <span>turning</span> <span>the</span> <span>old</span> <span>drive</span> <span>into</span> <span>a</span> <span>spare.</span> [<span class="YviGxtd7YaCspnvhcQVX uHPaz1NVFLwooyN_82Xl ZBCD6edNlK6lCexfhgoI CacXtJfGtE47SYE_l9Hn">practicalzfs.com</span>](https://discourse.practicalzfs.com/t/mirror-pool-expansion-opinions-sought/1822) <span>This</span> <span>keeps</span> <span>your</span> <span>drives</span> <span>fresher</span> <span>and</span> <span>spreads</span> <span>the</span> <span>replacement</span> <span>timeline.</span>
- <span class="font-semibold"><span>If</span> <span>you're</span> <span>space-constrained</span> <span>or</span> <span>prefer</span> <span>simplicity</span></span><span>:</span> <span>The</span> <span>double-resilver</span> <span>approach</span> <span>you</span> <span>mentioned</span> <span>works</span> <span>fine,</span> <span class="font-semibold"><span>especially</span> <span>if</span> <span>you</span> <span>have</span> <span>solid</span> <span>backups</span></span><span>.</span> [<span class="YviGxtd7YaCspnvhcQVX uHPaz1NVFLwooyN_82Xl ZBCD6edNlK6lCexfhgoI CacXtJfGtE47SYE_l9Hn">practicalzfs.com</span>](https://discourse.practicalzfs.com/t/mirror-pool-expansion-opinions-sought/1822)
- <span class="font-semibold"><span>If</span> <span>you're</span> <span>concerned</span> <span>about</span> <span>failure</span> <span>risk</span> <span>during</span> <span>resilvering</span></span><span>:</span> <span>Adding</span> <span>a</span> <span>new</span> <span>vdev</span> <span>is</span> <span>safer</span> <span>since</span> <span>your</span> <span>existing</span> <span>mirror</span> <span>remains</span> <span>intact</span> <span>during</span> <span>the</span> <span>expansion. Then instead of resilvering you could just reconstruct your VM's on your new expanded ZFS pool from a backup. Then once they are running you can turn off your existing VM's on the old storage and eventually delete them. </span>

<span>The</span> <span>key</span> <span>consideration</span> <span>ZFS</span> <span>experts</span> <span>emphasize</span> <span>is</span> <span class="font-semibold"><span>drive</span> <span>age</span></span><span>—mechanical</span> <span>drives</span> <span>typically</span> <span>shouldn't</span> <span>run</span> <span>much</span> <span>longer</span> <span>than</span> <span>a</span> **<span>decade</span>** <span>regardless</span> <span>of</span> <span>health</span> <span>appearance,</span> <span>and</span> <span>running</span> <span>multiple</span> <span>drives</span> <span>while</span> <span>resilvering</span> <span>increases</span> <span>failure</span> <span>risk.</span>

# 2. Expanding TrueNas ZFS Pool

# 6. ButterFS

# 7. MergeFS

# 8. Ceph