---
title: Storage and Volumes
sidebar_label: Storage
---
import { HardDrive, Database, Layers, Plus, AlertTriangle, Box } from 'react-feather';
# Storage and Volumes
The **Volumes** tab manages the filesystems attached to your cluster. Every volume you mount appears
at the same path on the login node **and every worker node**, which is what makes distributed
training possible.
},
{ href: '#mount-a-volume', label: 'Mount a volume', icon: },
{ href: '#unmount-a-volume', label: 'Unmount a volume', icon: },
{ href: '#storage-inside-a-container', label: 'Inside a container', icon: },
{ href: '#what-goes-where', label: 'What goes where', icon: },
]} />
---
## The Storage Types
The tab has a sub-navigation on the left: **Datasets**, **Shared File System**, and
**Parallel File System** — plus **Weka** in regions where it is offered.
| Type | Read/write | Required at create | Use it for |
|------|------------|--------------------|------------|
| **Parallel File System (PFS)** | Read-write | **Yes** in most regions | High-throughput training data, checkpoints, container squash files |
| **Shared File System (SFS)** | Read-write | Optional | General shared storage: scripts, logs, home directories |
| **Datasets** | **Read-only** | Optional | Curated input data you never write to |
| **Weka** | Read-write | **Yes** where offered, in place of PFS | High-performance shared storage |
The console describes them as:
> **Datasets** — Manage datasets attached to this training cluster. Datasets provide persistent
> storage for your training data.
>
> **Shared File System (SFS)** — provides simple, scalable, and highly available file storage for
> cloud-based applications. It allows multiple nodes to access the same file system concurrently.
>
> **Parallel File System (PFS)** — is optimized for high-performance computing environments, enabling
> simultaneous access to files by multiple processes across distributed nodes. It delivers rapid data
> throughput by distributing file data across multiple storage devices.
:::danger Datasets cannot be written to
A dataset mount is read-only. A job that tries to write a checkpoint or a log there fails with a
permission error. Checkpoints and logs need PFS, SFS or Weka.
:::
### The tables
Each sub-tab has **Mounted** and **Unmounted** views.
| Column | Shows |
|--------|-------|
| **Name** | The volume |
| **Size** | Its capacity |
| **Storage Status** | Whether the volume itself is ready (PFS and Weka) |
| **Encryption** / **Encryption Type** | Encryption state (Datasets) |
| **Mount Status** | **Mounted** or **Unmounted** on this cluster |
| **Mount Path** | The path when mounted; an input when not |
| **Actions** | **Mount** or **Unmount** |
---
## Mount a Volume
1. Open the cluster → **Volumes** → the sub-tab for the type.
2. Switch to the **Unmounted** view.
3. Type a **Mount Path** in the row, e.g. `/pfs` or `/shared`.
4. Click **Mount**.
5. The dialog — e.g. **Mounting SFS** — warns:
> Mounting SFS will require **restarting** the cluster nodes.
>
> Do you wish to continue?
6. Click **Continue**.
:::danger Mounting or unmounting restarts the cluster nodes, ending running jobs
This is the part people miss. The dialog says "restarting the cluster nodes" and it means every
worker. **All running jobs are lost.**
Check the [Jobs tab](/docs/tir/SlurmCluster/manage/jobs) first and let jobs finish, or plan the
mount for a quiet window. Better still, mount everything you expect to need
[at create time](/docs/tir/SlurmCluster/getting-started/create-cluster), when it costs nothing.
:::
### Mount path rules
| Rule | Detail |
|------|--------|
| Must start with `/` | `pfs` is invalid; `/pfs` is valid |
| Cannot be `/` | The root itself is not allowed |
| No `//` and no trailing `/` | `/a//b` and `/pfs/` are invalid |
| No spaces | The space key is blocked in the field |
| Must be unique | Two volumes cannot share a path |
| Errors | *Mount path is required* · *Invalid path format* |
:::tip Pick paths you will still understand in six months
`/pfs`, `/shared`, `/data` beat `/mnt/volume1`. Keep them consistent across clusters so job scripts
port unchanged — and remember the path is baked into every script, `#SBATCH --output` line and
`--container-mounts` flag your team writes.
:::
---
## Unmount a Volume
1. **Volumes** → the sub-tab → **Mounted** view.
2. Click **Unmount** on the row.
3. Confirm the dialog — e.g. **Unmounting PFS** — which carries the same restart warning.
The data is **not deleted**. Unmounting detaches the volume from this cluster; the volume and its
contents remain and can be mounted elsewhere.
### When unmount is blocked
| Situation | What you see |
|-----------|--------------|
| It is the last mounted volume | *Cannot remove storage. At least one storage volume must remain mounted on the cluster.* Mount a replacement first |
| It holds the persistent-login home directories | The dialog reads *"This volume is in use by Persistent Login User Management. **Disable** it first."* and offers only **Cancel** |
For the second case, disable
[Login User Management](/docs/tir/SlurmCluster/connect/login-user-management#disable-it) first — which
preserves the home directories.
---
## Storage Inside a Container
A [container job](/docs/tir/SlurmCluster/containers/) starts from the image's own filesystem. Your
mounts exist on the node, but you have to pass in what the job needs:
```bash
srun --container-image=/pfs/images/pytorch.sqsh \
--container-mounts=/pfs:/pfs,/shared:/shared \
--container-workdir=/pfs/project \
python train.py
```
You can remap paths — `--container-mounts=/pfs/datasets/imagenet:/data` makes the dataset appear at
`/data`, which is convenient when your code expects a fixed location.
:::tip Forgetting `--container-mounts` is the most common container-job mistake
The job starts, runs, and reports that your dataset does not exist. Nothing is wrong with the mount —
it was simply never passed into the container.
:::
---
## What Goes Where
| Data | Put it on | Why |
|------|-----------|-----|
| Training datasets | PFS or Weka | Throughput matters most here |
| Checkpoints | PFS or SFS | Must survive node restarts and be readable by every rank |
| Job scripts | SFS or PFS | So they survive a login-node restart |
| Job logs (`--output`) | PFS or SFS | Otherwise lost with the pod |
| Container squash files | PFS or SFS | Every node reads the same file — see [Cache images](/docs/tir/SlurmCluster/containers/image-cache) |
| Python environments | PFS or SFS, or a container image | Reinstalling after every restart is a waste of time |
| Per-job scratch | `/tmp` on the node | Fast, node-local, and cleaned up by a [Worker Epilog](/docs/tir/SlurmCluster/slurm-configuration/prolog-epilog) |
| Very fast shared memory | `/dev/shm` | RAM-backed, per node, wiped with the pod |
:::danger Node-local paths are not shared and do not survive
`/tmp`, `/dev/shm` and anything in `/root` are private to one pod and erased when it is recreated —
which happens on every restart, scale, image update and node reboot. In a multi-node job, a
checkpoint written to `/tmp` on rank 0 is invisible to every other rank.
**If it matters, it goes on PFS, SFS or Weka.**
:::
### A layout that works
```
/pfs/
├── datasets/ # input data
├── images/ # container squash files
├── project/ # code, job scripts
├── checkpoints/ # per-run subdirectories
├── logs/ # sbatch --output / --error
└── envs/ # virtualenvs, if you are not using containers
```
Then `#SBATCH --output=/pfs/logs/%x-%j.out` and
`--container-image=/pfs/images/pytorch-25.09.sqsh` are the same in every script your team writes.
---
## Capacity and Billing
:::warning Storage is billed separately, and keeps billing after the cluster is gone
Volumes are billed independently of the cluster. **Terminating a cluster unmounts your volumes but
does not delete them** — the charges continue. Review PFS, SFS and datasets under **Storage** in the
sidebar when you clean up. See [Billing](/docs/tir/SlurmCluster/billing#storage-is-billed-separately).
:::
Keep an eye on usage from the login node:
```bash
df -h /pfs /shared
du -sh /pfs/*
du -sh /pfs/checkpoints/*
```
:::tip A full filesystem fails in confusing ways
When PFS fills up, checkpoint writes fail mid-run, container imports fail, and job output truncates —
often with errors that look nothing like "disk full". Checkpoints and squash files are the usual
culprits. Prune old runs on a schedule, or with a
[Controller Epilog](/docs/tir/SlurmCluster/slurm-configuration/prolog-epilog#worked-examples).
:::
---
## Related Resources
- [Parallel File System](/docs/tir/pfs/) · [Shared File System](/docs/tir/sfs/) · [Datasets](/docs/tir/Datasets/)
- [Cache and manage container images](/docs/tir/SlurmCluster/containers/image-cache)
- [Login User Management](/docs/tir/SlurmCluster/connect/login-user-management)
- [Create a Slurm Cluster](/docs/tir/SlurmCluster/getting-started/create-cluster)
- [Billing](/docs/tir/SlurmCluster/billing)