[Docs Draft] znas filesystem -- pending review (20260715-212517-docs-znas-681a) #16

Open
opened 2026-07-15 16:26:33 -05:00 by traveler · 0 comments
Owner

AUTO-GENERATED DRAFT -- NOT YET PUBLISHED. This page was written automatically by the @document pilot (chat -> n8n -> Mistral via gremlin-proxy) from a mix of prior memory notes and one live SSH inspection pass. Read it carefully before manually committing it to the wiki -- do not trust it blindly, especially anything under "Discrepancies noted".

# ZNAS Filesystem Topology

## 1. ZFS Pools and Dataset Layout

### Pools

#### `vault` (Primary Pool)
- **State**: ONLINE
- **Capacity** (from `zpool list`):

NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
vault 129T 91.5T 37.7T - - 4% 70% 1.00x ONLINE -

- **Configuration**: Two RAIDZ1 VDEVs
- VDEV 0: 3 × 24 TB drives
- VDEV 1: 5 × 16 TB drives
- **Scrub**: Last scrub repaired 0B in 2 days 15:21:30 with 0 errors on Tue Jun 16 15:45:32 2026

#### `pocket-media` (Pocket Media Pool)
- **State**: ONLINE
- **Capacity** (from `zpool list`):

NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
pocket-media 4.55T 0 4.55T - - 0% 0% 1.00x ONLINE /mnt/pm

- **Configuration**: Single 5 TB drive (`ata-WDC_WD50NMZW-59BCBS0_WD-WX72DC35J839`)

#### `pocket-green` (Pocket Sync Destination Pool)
- **State**: Not currently imported (imported on-demand during sync workflow)
- **Note**: This is a **separate pool** from `pocket-media`. The Pocket sync mechanism targets `pocket-green`, not `pocket-media`.

---

### Datasets

#### `vault` Pool Datasets
All datasets mount directly to `/export/*` for NFS sharing, except where noted for local service consumption.

| Dataset                          | Mountpoint                     | Compression | Notes                                  |
|----------------------------------|--------------------------------|-------------|----------------------------------------|
| `vault`                          | `/export`                      | zstd        | Root dataset                           |
| `vault/Common`                   | `/export/Common`               | zstd        |                                        |
| `vault/Data`                     | `/export/Data`                 | lz4         |                                        |
| `vault/Data/media_books`         | `/export/Data/media/books`     | zstd        |                                        |
| `vault/Data/media_comics`        | `/export/Data/media/comics`    | zstd        |                                        |
| `vault/Docker`                   | `/export/Docker`               | zstd        |                                        |
| `vault/Green`                    | `/export/Green`                | off         |                                        |
| `vault/Green/Pocket`             | `/export/Green/Pocket`         | off         |                                        |
| `vault/Photos`                   | `/export/Photos`               | zstd        |                                        |
| `vault/Kopia`                    | `/srv/vault/kopia_repository`  | zstd        | Local service consumption              |
| `vault/NextCloud-AIO`            | `/srv/NextCloud-AIO`           | lz4         | Local service consumption              |
| `vault/backup`                   | `/srv/vault/backup`            | zstd        | Local service consumption              |
| `vault/docker`                   | `/export/Docker`               | zstd        |                                        |
| `vault/immich`                   | `/srv/immich`                  | lz4         | Local service consumption              |
| `vault/pocket`                   | `none`                         | zstd        | Parent dataset for Pocket sync         |
| `vault/pocket/green`             | `/pocket/green`                | zstd        |                                        |
| `vault/pocket/green/media`       | `/pocket/green/media`          | zstd        |                                        |
| `vault/pocket/green/media/clips` | `/pocket/green/media/clips`    | zstd        |                                        |
| `vault/pocket/green/media/stash` | `/pocket/green/media/stash`    | zstd        |                                        |
| `vault/pocket/media`             | `/pocket/media`                | zstd        |                                        |
| `vault/pocket/media/green-movies`| `legacy`                       | zstd        |                                        |
| `vault/pocket/media/movies`      | `/pocket/media/movies`         | zstd        |                                        |
| `vault/pocket/media/reference`   | `/pocket/media/reference`      | zstd        |                                        |
| `vault/pocket/media/tv`          | `/pocket/media/tv`             | zstd        |                                        |
| `vault/pocket/media/vault`       | `/pocket/media/vault`          | zstd        |                                        |
| `vault/pocket/services`          | `/pocket/services`             | zstd        |                                        |
| `vault/pocket/services/DockerVol`| `/pocket/services/DockerVol`   | zstd        | **Pocket sync source**                 |
| `vault/pocket/services/stacks`   | `/pocket/services/stacks`      | zstd        |                                        |
| `vault/pocket/vault`             | `/pocket/vault`                | zstd        |                                        |

#### `pocket-media` Pool Datasets
All datasets mount under `/mnt/pm/mnt/pocket-media`.

| Dataset                              | Mountpoint                                      | Compression |
|--------------------------------------|-------------------------------------------------|-------------|
| `pocket-media`                       | `/mnt/pm/mnt/pocket-media`                      | lz4         |
| `pocket-media/backups`               | `/mnt/pm/mnt/pocket-media/backups`              | lz4         |
| `pocket-media/backups/documents`     | `/mnt/pm/mnt/pocket-media/backups/documents`    | lz4         |
| `pocket-media/backups/photos`        | `/mnt/pm/mnt/pocket-media/backups/photos`       | lz4         |
| `pocket-media/backups/wiki`          | `/mnt/pm/mnt/pocket-media/backups/wiki`         | lz4         |
| `pocket-media/media`                 | `/mnt/pm/mnt/pocket-media/media`                | lz4         |
| `pocket-media/media/green`           | `/mnt/pm/mnt/pocket-media/media/green`          | lz4         |
| `pocket-media/media/movies`          | `/mnt/pm/mnt/pocket-media/media/movies`         | lz4         |
| `pocket-media/media/tv`              | `/mnt/pm/mnt/pocket-media/media/tv`             | lz4         |
| `pocket-media/wiki-pg`               | `/mnt/pm/mnt/pocket-media/wiki-pg`              | lz4         |

---

## 2. NFS Exports

### Server Configuration
- **NFSv4** with a pseudo-filesystem root at `/export`.
- All exports are ZFS datasets mounted directly to `/export/*` (no bind mounts).
- NFS is configured to wait for ZFS at boot via a systemd override.

#### `/etc/exports`
```plaintext
# NFSv4 - pseudo filesystem root
/export *(rw,fsid=0,no_root_squash,no_subtree_check,crossmnt)

# Shares beneath the NFSv4 root
/export/Common *(fsid=4,rw,no_root_squash,no_subtree_check,insecure)
/export/Data *(fsid=5,rw,no_root_squash,no_subtree_check,insecure,crossmnt)
/export/Data/media/books *(fsid=51,rw,no_root_squash,no_subtree_check,insecure,nohide)
/export/Data/media/comics *(fsid=52,rw,no_root_squash,no_subtree_check,insecure,nohide)
/export/Docker *(fsid=29,rw,no_root_squash,sync,no_subtree_check,insecure)
/export/Green *(fsid=30,rw,no_root_squash,no_subtree_check,insecure,crossmnt)
/export/photos *(fsid=31,rw,no_root_squash,no_subtree_check,insecure)
/export/Pocket *(fsid=32,rw,no_root_squash,no_subtree_check,insecure)
/export/Grimoire *(fsid=33,rw,no_root_squash,no_subtree_check,insecure)
/export/green/media/pocket *(fsid=35,rw,no_root_squash,no_subtree_check,insecure)

Key Notes:

  • fsid=0: Mandatory for NFSv4 pseudo-root. Without it, clients cannot enumerate the export tree.
  • nohide: Required for sub-datasets (e.g., vault/Data/media_books) to ensure they are visible to clients.
  • crossmnt: Allows clients to traverse mountpoints within the export.

Loopback Mount (ZNAS)

ZNAS mounts its own NFS exports back to itself at /data/nfs/znas. This ensures Docker Swarm containers scheduled to ZNAS access storage at the same NFS-backed paths as containers on other nodes.

Mounts (Server Side):

vault/Common on /data/nfs/znas/Common type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service)
vault/Data on /data/nfs/znas/Data type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service)
vault/docker on /data/nfs/znas/Docker type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service)
vault/Green on /data/nfs/znas/Green type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service)
vault on /data/nfs/znas/Grimoire type zfs (rw,noatime,xattr,posixacl,casesensitive)
vault/Photos on /data/nfs/znas/Photos type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service)
vault on /data/nfs/znas/Pocket type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service)
vault/Data/media_books on /data/nfs/znas/Data/media/books type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service)
vault/Data/media_comics on /data/nfs/znas/Data/media/comics type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service)
vault/pocket/green/media on /data/nfs/znas/Green/Pocket type zfs (rw,noatime,xattr,posixacl,casesensitive)

3. Autofs Mounts (Swarm Nodes)

All Swarm nodes (including ZNAS) access NAS storage via /data/nfs/znas/ using autofs.

Client Configuration

/etc/auto.master

/data/nfs /etc/auto.nfs

/etc/auto.nfs

znas -fstype=nfs4 192.168.5.10:/

Mounts (Client Side):

  • docker3 (192.168.5.15):
    192.168.5.10:/ on /data/nfs/znas type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.15,local_lock=none,addr=192.168.5.10)
    
  • docker4 (192.168.5.16):
    192.168.5.10:/Docker on /data/nfs/znas/Docker type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,soft,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.16,local_lock=none,addr=192.168.5.10)
    192.168.5.10:/Grimoire on /data/nfs/znas/Grimoire type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,soft,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.16,local_lock=none,addr=192.168.5.10)
    192.168.5.10:/Data on /data/nfs/znas/Data type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,soft,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.16,local_lock=none,addr=192.168.5.10)
    
  • docker5 (192.168.5.18):
    192.168.5.10:/ on /data/nfs/znas type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,fatal_neterrors=none,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.18,local_lock=none,addr=192.168.5.10)
    192.168.5.10:/Data on /data/nfs/znas/Data type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,fatal_neterrors=none,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.18,local_lock=none,addr=192.168.5.10)
    192.168.5.10:/Data/media/books on /data/nfs/znas/Data/media/books type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,fatal_neterrors=none,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.18,local_lock=none,addr=192.168.5.10)
    

Key Notes:

  • Autofs: Must be enabled on clients and disabled on ZNAS to avoid recursive mount loops.
  • Consistency: All Swarm nodes access storage via /data/nfs/znas/, ensuring path consistency regardless of scheduling.

4. Loop-Mounted Images

No loop-mounted images are currently active on ZNAS (losetup -a and mount | grep loop return empty).


5. Pocket Sync Mechanism

Overview

The Pocket sync mechanism replicates select datasets from ZNAS to the Pocket Grimoire portable system using syncoid. The sync is unidirectional (ZNAS → Pocket) and targets the pocket-green pool on the Pocket device.

Sync Target: pocket-green

  • Pool Name: pocket-green (not pocket-media).
  • State: Imported on-demand during sync workflow; not persistently imported.
  • Sync Source: vault/pocket/services/DockerVol (mounted at /pocket/services/DockerVol on ZNAS).

Sync Command (Live)

syncoid -r vault/pocket/services/DockerVol pocket-green/services/DockerVol

Workflow

  1. Dismount: The Pocket SSD is physically dismounted from ZNAS.
  2. Import: pocket-green pool is imported on the Pocket device.
  3. Sync: syncoid replicates vault/pocket/services/DockerVol to pocket-green/services/DockerVol.
  4. Export: pocket-green pool is exported after sync completes.

Key Notes:

  • pocket-media vs. pocket-green: These are two distinct pools. pocket-media is for media content and is always imported on ZNAS. pocket-green is the sync destination for Docker volumes and is only imported during sync.
  • Compression: vault/pocket/services/DockerVol uses zstd compression.
  • Automation: The sync is triggered by the "Gremlin Pocket Dismount" n8n workflow.

Discrepancies Noted

  1. Pocket Sync Destination Pool:

    • Memory: Implied pocket-media as the sync target in some notes.
    • Live State: Sync command explicitly targets pocket-green. Live state wins — the sync destination is pocket-green.
  2. /export/Pocket Export:

    • Memory: No mention of /export/Pocket in prior notes.
    • Live State: /export/Pocket is explicitly exported in /etc/exports. This is a new export not previously documented.
  3. vault/pocket/green/media Mountpoint:

    • Memory: No prior mention of /data/nfs/znas/Green/Pocket loopback mount.
    • Live State: vault/pocket/green/media is mounted at /data/nfs/znas/Green/Pocket. This is a new mountpoint.
> **AUTO-GENERATED DRAFT -- NOT YET PUBLISHED.** This page was written automatically by the `@document` pilot (chat -> n8n -> Mistral via gremlin-proxy) from a mix of prior memory notes and one live SSH inspection pass. Read it carefully before manually committing it to the wiki -- do not trust it blindly, especially anything under "Discrepancies noted". ```markdown # ZNAS Filesystem Topology ## 1. ZFS Pools and Dataset Layout ### Pools #### `vault` (Primary Pool) - **State**: ONLINE - **Capacity** (from `zpool list`): ``` NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT vault 129T 91.5T 37.7T - - 4% 70% 1.00x ONLINE - ``` - **Configuration**: Two RAIDZ1 VDEVs - VDEV 0: 3 × 24 TB drives - VDEV 1: 5 × 16 TB drives - **Scrub**: Last scrub repaired 0B in 2 days 15:21:30 with 0 errors on Tue Jun 16 15:45:32 2026 #### `pocket-media` (Pocket Media Pool) - **State**: ONLINE - **Capacity** (from `zpool list`): ``` NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT pocket-media 4.55T 0 4.55T - - 0% 0% 1.00x ONLINE /mnt/pm ``` - **Configuration**: Single 5 TB drive (`ata-WDC_WD50NMZW-59BCBS0_WD-WX72DC35J839`) #### `pocket-green` (Pocket Sync Destination Pool) - **State**: Not currently imported (imported on-demand during sync workflow) - **Note**: This is a **separate pool** from `pocket-media`. The Pocket sync mechanism targets `pocket-green`, not `pocket-media`. --- ### Datasets #### `vault` Pool Datasets All datasets mount directly to `/export/*` for NFS sharing, except where noted for local service consumption. | Dataset | Mountpoint | Compression | Notes | |----------------------------------|--------------------------------|-------------|----------------------------------------| | `vault` | `/export` | zstd | Root dataset | | `vault/Common` | `/export/Common` | zstd | | | `vault/Data` | `/export/Data` | lz4 | | | `vault/Data/media_books` | `/export/Data/media/books` | zstd | | | `vault/Data/media_comics` | `/export/Data/media/comics` | zstd | | | `vault/Docker` | `/export/Docker` | zstd | | | `vault/Green` | `/export/Green` | off | | | `vault/Green/Pocket` | `/export/Green/Pocket` | off | | | `vault/Photos` | `/export/Photos` | zstd | | | `vault/Kopia` | `/srv/vault/kopia_repository` | zstd | Local service consumption | | `vault/NextCloud-AIO` | `/srv/NextCloud-AIO` | lz4 | Local service consumption | | `vault/backup` | `/srv/vault/backup` | zstd | Local service consumption | | `vault/docker` | `/export/Docker` | zstd | | | `vault/immich` | `/srv/immich` | lz4 | Local service consumption | | `vault/pocket` | `none` | zstd | Parent dataset for Pocket sync | | `vault/pocket/green` | `/pocket/green` | zstd | | | `vault/pocket/green/media` | `/pocket/green/media` | zstd | | | `vault/pocket/green/media/clips` | `/pocket/green/media/clips` | zstd | | | `vault/pocket/green/media/stash` | `/pocket/green/media/stash` | zstd | | | `vault/pocket/media` | `/pocket/media` | zstd | | | `vault/pocket/media/green-movies`| `legacy` | zstd | | | `vault/pocket/media/movies` | `/pocket/media/movies` | zstd | | | `vault/pocket/media/reference` | `/pocket/media/reference` | zstd | | | `vault/pocket/media/tv` | `/pocket/media/tv` | zstd | | | `vault/pocket/media/vault` | `/pocket/media/vault` | zstd | | | `vault/pocket/services` | `/pocket/services` | zstd | | | `vault/pocket/services/DockerVol`| `/pocket/services/DockerVol` | zstd | **Pocket sync source** | | `vault/pocket/services/stacks` | `/pocket/services/stacks` | zstd | | | `vault/pocket/vault` | `/pocket/vault` | zstd | | #### `pocket-media` Pool Datasets All datasets mount under `/mnt/pm/mnt/pocket-media`. | Dataset | Mountpoint | Compression | |--------------------------------------|-------------------------------------------------|-------------| | `pocket-media` | `/mnt/pm/mnt/pocket-media` | lz4 | | `pocket-media/backups` | `/mnt/pm/mnt/pocket-media/backups` | lz4 | | `pocket-media/backups/documents` | `/mnt/pm/mnt/pocket-media/backups/documents` | lz4 | | `pocket-media/backups/photos` | `/mnt/pm/mnt/pocket-media/backups/photos` | lz4 | | `pocket-media/backups/wiki` | `/mnt/pm/mnt/pocket-media/backups/wiki` | lz4 | | `pocket-media/media` | `/mnt/pm/mnt/pocket-media/media` | lz4 | | `pocket-media/media/green` | `/mnt/pm/mnt/pocket-media/media/green` | lz4 | | `pocket-media/media/movies` | `/mnt/pm/mnt/pocket-media/media/movies` | lz4 | | `pocket-media/media/tv` | `/mnt/pm/mnt/pocket-media/media/tv` | lz4 | | `pocket-media/wiki-pg` | `/mnt/pm/mnt/pocket-media/wiki-pg` | lz4 | --- ## 2. NFS Exports ### Server Configuration - **NFSv4** with a pseudo-filesystem root at `/export`. - All exports are ZFS datasets mounted directly to `/export/*` (no bind mounts). - NFS is configured to wait for ZFS at boot via a systemd override. #### `/etc/exports` ```plaintext # NFSv4 - pseudo filesystem root /export *(rw,fsid=0,no_root_squash,no_subtree_check,crossmnt) # Shares beneath the NFSv4 root /export/Common *(fsid=4,rw,no_root_squash,no_subtree_check,insecure) /export/Data *(fsid=5,rw,no_root_squash,no_subtree_check,insecure,crossmnt) /export/Data/media/books *(fsid=51,rw,no_root_squash,no_subtree_check,insecure,nohide) /export/Data/media/comics *(fsid=52,rw,no_root_squash,no_subtree_check,insecure,nohide) /export/Docker *(fsid=29,rw,no_root_squash,sync,no_subtree_check,insecure) /export/Green *(fsid=30,rw,no_root_squash,no_subtree_check,insecure,crossmnt) /export/photos *(fsid=31,rw,no_root_squash,no_subtree_check,insecure) /export/Pocket *(fsid=32,rw,no_root_squash,no_subtree_check,insecure) /export/Grimoire *(fsid=33,rw,no_root_squash,no_subtree_check,insecure) /export/green/media/pocket *(fsid=35,rw,no_root_squash,no_subtree_check,insecure) ``` #### Key Notes: - **`fsid=0`**: Mandatory for NFSv4 pseudo-root. Without it, clients cannot enumerate the export tree. - **`nohide`**: Required for sub-datasets (e.g., `vault/Data/media_books`) to ensure they are visible to clients. - **`crossmnt`**: Allows clients to traverse mountpoints within the export. --- ### Loopback Mount (ZNAS) ZNAS mounts its own NFS exports back to itself at `/data/nfs/znas`. This ensures Docker Swarm containers scheduled to ZNAS access storage at the same NFS-backed paths as containers on other nodes. #### Mounts (Server Side): ```plaintext vault/Common on /data/nfs/znas/Common type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service) vault/Data on /data/nfs/znas/Data type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service) vault/docker on /data/nfs/znas/Docker type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service) vault/Green on /data/nfs/znas/Green type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service) vault on /data/nfs/znas/Grimoire type zfs (rw,noatime,xattr,posixacl,casesensitive) vault/Photos on /data/nfs/znas/Photos type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service) vault on /data/nfs/znas/Pocket type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service) vault/Data/media_books on /data/nfs/znas/Data/media/books type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service) vault/Data/media_comics on /data/nfs/znas/Data/media/comics type zfs (rw,noatime,xattr,posixacl,casesensitive,x-systemd.requires=zfs-mount.service,x-systemd.after=zfs-mount.service) vault/pocket/green/media on /data/nfs/znas/Green/Pocket type zfs (rw,noatime,xattr,posixacl,casesensitive) ``` --- ## 3. Autofs Mounts (Swarm Nodes) All Swarm nodes (including ZNAS) access NAS storage via `/data/nfs/znas/` using autofs. ### Client Configuration #### `/etc/auto.master` ```plaintext /data/nfs /etc/auto.nfs ``` #### `/etc/auto.nfs` ```plaintext znas -fstype=nfs4 192.168.5.10:/ ``` #### Mounts (Client Side): - **docker3 (192.168.5.15)**: ```plaintext 192.168.5.10:/ on /data/nfs/znas type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.15,local_lock=none,addr=192.168.5.10) ``` - **docker4 (192.168.5.16)**: ```plaintext 192.168.5.10:/Docker on /data/nfs/znas/Docker type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,soft,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.16,local_lock=none,addr=192.168.5.10) 192.168.5.10:/Grimoire on /data/nfs/znas/Grimoire type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,soft,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.16,local_lock=none,addr=192.168.5.10) 192.168.5.10:/Data on /data/nfs/znas/Data type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,soft,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.16,local_lock=none,addr=192.168.5.10) ``` - **docker5 (192.168.5.18)**: ```plaintext 192.168.5.10:/ on /data/nfs/znas type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,fatal_neterrors=none,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.18,local_lock=none,addr=192.168.5.10) 192.168.5.10:/Data on /data/nfs/znas/Data type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,fatal_neterrors=none,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.18,local_lock=none,addr=192.168.5.10) 192.168.5.10:/Data/media/books on /data/nfs/znas/Data/media/books type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,fatal_neterrors=none,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.18,local_lock=none,addr=192.168.5.10) ``` #### Key Notes: - **Autofs**: Must be **enabled on clients** and **disabled on ZNAS** to avoid recursive mount loops. - **Consistency**: All Swarm nodes access storage via `/data/nfs/znas/`, ensuring path consistency regardless of scheduling. --- ## 4. Loop-Mounted Images No loop-mounted images are currently active on ZNAS (`losetup -a` and `mount | grep loop` return empty). --- ## 5. Pocket Sync Mechanism ### Overview The Pocket sync mechanism replicates select datasets from ZNAS to the **Pocket Grimoire** portable system using `syncoid`. The sync is **unidirectional** (ZNAS → Pocket) and targets the `pocket-green` pool on the Pocket device. ### Sync Target: `pocket-green` - **Pool Name**: `pocket-green` (not `pocket-media`). - **State**: Imported on-demand during sync workflow; not persistently imported. - **Sync Source**: `vault/pocket/services/DockerVol` (mounted at `/pocket/services/DockerVol` on ZNAS). ### Sync Command (Live) ```bash syncoid -r vault/pocket/services/DockerVol pocket-green/services/DockerVol ``` ### Workflow 1. **Dismount**: The Pocket SSD is physically dismounted from ZNAS. 2. **Import**: `pocket-green` pool is imported on the Pocket device. 3. **Sync**: `syncoid` replicates `vault/pocket/services/DockerVol` to `pocket-green/services/DockerVol`. 4. **Export**: `pocket-green` pool is exported after sync completes. ### Key Notes: - **`pocket-media` vs. `pocket-green`**: These are **two distinct pools**. `pocket-media` is for media content and is always imported on ZNAS. `pocket-green` is the sync destination for Docker volumes and is only imported during sync. - **Compression**: `vault/pocket/services/DockerVol` uses `zstd` compression. - **Automation**: The sync is triggered by the "Gremlin Pocket Dismount" n8n workflow. --- ## Discrepancies Noted 1. **Pocket Sync Destination Pool**: - **Memory**: Implied `pocket-media` as the sync target in some notes. - **Live State**: Sync command explicitly targets `pocket-green`. **Live state wins** — the sync destination is `pocket-green`. 2. **`/export/Pocket` Export**: - **Memory**: No mention of `/export/Pocket` in prior notes. - **Live State**: `/export/Pocket` is explicitly exported in `/etc/exports`. This is a new export not previously documented. 3. **`vault/pocket/green/media` Mountpoint**: - **Memory**: No prior mention of `/data/nfs/znas/Green/Pocket` loopback mount. - **Live State**: `vault/pocket/green/media` is mounted at `/data/nfs/znas/Green/Pocket`. This is a new mountpoint. ```
Sign in to join this conversation.
No labels
doc-staleness
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
traveler/Netgrimoire#16
No description provided.