Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| user:rion [2026/10/05 00:47] – rion | user:rion [2026/10/05 12:04] (current) – rion | ||
|---|---|---|---|
| Line 12: | Line 12: | ||
| The Storage Manager introduced in Batocera v43 allows multiple locally attached drives to be combined into a single ROM library without requiring symbolic links, manual mounts, or custom scripts. | The Storage Manager introduced in Batocera v43 allows multiple locally attached drives to be combined into a single ROM library without requiring symbolic links, manual mounts, or custom scripts. | ||
| - | Advanced | + | Advanced network/NAS and manual MergerFS setups are documented later on this page, after the Storage Manager |
| </ | </ | ||
| Line 55: | Line 55: | ||
| / | / | ||
| </ | </ | ||
| - | |||
| - | ==== Which storage method should I use? ==== | ||
| - | |||
| - | Batocera has several storage mechanisms that solve different problems. They should not be treated as interchangeable. | ||
| - | |||
| - | ^ Method ^ Best used for ^ What it does ^ | ||
| - | | **Storage Manager** | Multiple locally attached ROM drives | Builds a MergerFS union at ''/ | ||
| - | | **sharedevice=DEV / ANYEXTERNAL** | Moving all userdata to one selected device, or to the first suitable external device | Mounts another device as the active userdata storage | | ||
| - | | **sharedevice=DEVICES** | Mounting selected local partitions or subdirectories over specific userdata folders | Bind-mounts selected local storage over individual targets such as ROMS, SAVES or BIOS | | ||
| - | | **sharedevice=NETWORK** | Replacing all or selected userdata folders with SMB/NFS shares | Mounts network storage directly on the requested userdata paths | | ||
| - | | **Manual S12mergerfs pool** | Combining local folders and network/NAS folders in one union | Builds an advanced MergerFS pool from explicitly configured branches | | ||
| - | |||
| - | <WRAP tip> | ||
| - | If the goal is simply to add a second, third or fourth locally attached ROM drive, use the graphical Storage Manager. If the goal is to combine a NAS with local ROM storage in the same ''/ | ||
| - | </ | ||
| ===== Requirements ===== | ===== Requirements ===== | ||
| Line 207: | Line 192: | ||
| Games can be distributed across multiple drives while still appearing as one collection inside EmulationStation. | Games can be distributed across multiple drives while still appearing as one collection inside EmulationStation. | ||
| + | |||
| + | ===== Internal Drives ===== | ||
| + | |||
| + | The Storage Manager is not limited to removable USB devices. | ||
| + | |||
| + | Additional internal drives can also be used. | ||
| + | |||
| + | For example: | ||
| + | |||
| + | < | ||
| + | / | ||
| + | / | ||
| + | </ | ||
| + | |||
| + | As long as the drive is mounted by Batocera and contains a root-level '' | ||
| + | |||
| + | This includes: | ||
| + | |||
| + | * SATA hard drives | ||
| + | * SATA SSDs | ||
| + | * NVMe SSDs | ||
| + | * USB storage devices | ||
| + | * SD cards | ||
| + | |||
| + | <WRAP info> | ||
| + | The drive name does not matter. What matters is that the mounted drive contains a root-level '' | ||
| + | </ | ||
| + | |||
| + | ==== Automatic detection and safety filtering ==== | ||
| + | |||
| + | The Storage Manager backend watches the common Linux block-device families used by Batocera, including '' | ||
| + | |||
| + | Among other checks, the current implementation: | ||
| + | |||
| + | * Skips the disk backing ''/ | ||
| + | * Skips EFI System, Microsoft Reserved and Windows Recovery partition GUIDs | ||
| + | * Skips partitions marked hidden or no-automount | ||
| + | * Filters many Android/ | ||
| + | * Does not offer the automatic blank-disk format prompt for disks of 4 GiB or smaller | ||
| + | * Ignores swap partitions | ||
| + | * Skips local disks already claimed by UUID-based '' | ||
| + | |||
| + | These checks are safeguards, not a substitute for verifying the disk shown by a format prompt. Always confirm the device and capacity before formatting. | ||
| + | |||
| + | <WRAP info> | ||
| + | Some of the protection checks intentionally use broad filesystem-label and partition-label matches. External media using names associated with system partitions, for example '' | ||
| + | </ | ||
| + | |||
| + | ==== Ignoring a drive ==== | ||
| + | |||
| + | The Storage Manager backend supports an '' | ||
| + | |||
| + | If an ignored drive contains a root-level '' | ||
| + | |||
| + | The ignore entry is based on a persistent **whole-disk** identifier when one is available, rather than only on a temporary ''/ | ||
| + | |||
| + | The current backend provides an '' | ||
| + | |||
| + | ==== Mount-point naming ==== | ||
| + | |||
| + | For automatically mounted partitions, Storage Manager builds a mount point under ''/ | ||
| + | |||
| + | <WRAP tip> | ||
| + | Use unique filesystem labels for ROM drives. The Storage Manager configuration stores branch paths such as ''/ | ||
| + | </ | ||
| + | |||
| + | ===== Safe Drive Removal ===== | ||
| + | |||
| + | |||
| + | |||
| + | Drives can be safely removed from: | ||
| + | |||
| + | * **Main Menu** | ||
| + | * **System Settings** | ||
| + | * **Eject an Extra Disk** | ||
| + | |||
| + | {{wiki: | ||
| + | |||
| + | After selecting the drive, Batocera asks for confirmation before removing it from the storage pool. | ||
| + | |||
| + | {{wiki: | ||
| + | |||
| + | Batocera automatically updates the storage pool and refreshes the game lists. | ||
| + | |||
| + | {{wiki: | ||
| + | |||
| + | Games stored only on the removed drive will disappear from the library until that drive is connected and merged again. | ||
| + | |||
| + | The **Eject an Extra Disk** list is generated from branches saved in '' | ||
| + | |||
| + | <WRAP important> | ||
| + | Prefer the Storage Manager eject action over physically unplugging a drive while Batocera is running. The backend has cleanup logic for an unexpected removal, but active writes cannot be made safe after the device has already disappeared. | ||
| + | </ | ||
| + | |||
| + | ==== Missing at boot, safe eject, and live unplug are different ==== | ||
| + | |||
| + | The Storage Manager keeps configured branches in '' | ||
| + | |||
| + | By contrast, using **Eject an Extra Disk** removes that branch from '' | ||
| + | |||
| + | This distinction is useful for systems where a configured drive is sometimes powered off before Batocera boots. Leaving it configured but absent at boot is different from explicitly ejecting it. | ||
| + | |||
| + | ===== What Gets Merged? ===== | ||
| + | |||
| + | The graphical Storage Manager merges only the ROM library: | ||
| + | |||
| + | < | ||
| + | / | ||
| + | </ | ||
| + | |||
| + | Folders such as: | ||
| + | |||
| + | < | ||
| + | / | ||
| + | / | ||
| + | / | ||
| + | / | ||
| + | / | ||
| + | </ | ||
| + | |||
| + | remain on internal storage. | ||
| + | |||
| + | The graphical Storage Manager does not merge BIOS files, save files, screenshots, | ||
| + | |||
| + | Advanced manual MergerFS pools are separate from the graphical Storage Manager and can technically target other directories, | ||
| + | |||
| + | ===== Internal ROM Preservation ===== | ||
| + | |||
| + | When the first additional ROM drive is merged, Batocera preserves the existing internal ROM collection. | ||
| + | |||
| + | Internally, existing ROMs stored in: | ||
| + | |||
| + | < | ||
| + | / | ||
| + | </ | ||
| + | |||
| + | are moved into: | ||
| + | |||
| + | < | ||
| + | / | ||
| + | </ | ||
| + | |||
| + | This allows internal ROMs to remain visible alongside ROMs stored on merged drives. | ||
| + | |||
| + | If all merged drives are later removed, Batocera restores the internal ROM library back to the normal ''/ | ||
| + | |||
| + | During restoration, | ||
| + | |||
| + | ===== Limitations ===== | ||
| + | |||
| + | Automatic detection by the graphical Storage Manager currently requires this layout: | ||
| + | |||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | |||
| + | Nested ROM folders are not detected automatically. | ||
| + | |||
| + | Example: | ||
| + | |||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | |||
| + | is not automatically merged. | ||
| + | |||
| + | This limitation does not apply to advanced manual MergerFS branches, where an explicit nested path can be configured. | ||
| + | |||
| + | The graphical Storage Manager merges only the ROM library. Other userdata folders remain independent unless they are configured separately using advanced manual storage methods. | ||
| + | |||
| + | <WRAP tip> | ||
| + | For most users adding locally attached USB drives, SSDs, hard drives or SD cards, the Storage Manager sections above are all that is needed. | ||
| + | |||
| + | The remaining sections are for advanced setups, manual storage configuration, | ||
| + | </ | ||
| + | |||
| + | ===== Other Storage Methods (Advanced) ===== | ||
| + | |||
| + | Batocera has several storage mechanisms that solve different problems. They should not be treated as interchangeable. | ||
| + | |||
| + | ^ Method ^ Best used for ^ What it does ^ | ||
| + | | **Storage Manager** | Multiple locally attached ROM drives | Builds a MergerFS union at ''/ | ||
| + | | **sharedevice=DEV / ANYEXTERNAL** | Moving all userdata to one selected device, or to the first suitable external device | Mounts another device as the active userdata storage | | ||
| + | | **sharedevice=DEVICES** | Mounting selected local partitions or subdirectories over specific userdata folders | Bind-mounts selected local storage over individual targets such as ROMS, SAVES or BIOS | | ||
| + | | **sharedevice=NETWORK** | Replacing all or selected userdata folders with SMB/NFS shares | Mounts network storage directly on the requested userdata paths | | ||
| + | | **Manual S12mergerfs pool** | Combining local folders and network/NAS folders in one union | Builds an advanced MergerFS pool from explicitly configured branches | | ||
| + | |||
| + | <WRAP tip> | ||
| + | If the goal is simply to add a second, third or fourth locally attached ROM drive, use the graphical Storage Manager. If the goal is to combine a NAS with local ROM storage in the same ''/ | ||
| + | </ | ||
| ===== Network/NAS Storage (Advanced) ===== | ===== Network/NAS Storage (Advanced) ===== | ||
| + | |||
| + | <WRAP important> | ||
| + | This section is **not required for normal Storage Manager use**. If all ROM drives are attached locally, use the graphical Storage Manager described above. | ||
| + | </ | ||
| The graphical Storage Manager currently focuses on locally attached storage devices. Batocera also includes a separate boot-time MergerFS service that can build manual pools from local storage, removable media and already-mounted network shares. | The graphical Storage Manager currently focuses on locally attached storage devices. Batocera also includes a separate boot-time MergerFS service that can build manual pools from local storage, removable media and already-mounted network shares. | ||
| Line 398: | Line 577: | ||
| This explains why an already-configured ROM drive detected during early boot can be queued first and only joined to the live pool after the base ''/ | This explains why an already-configured ROM drive detected during early boot can be queued first and only joined to the live pool after the base ''/ | ||
| - | |||
| - | ===== Internal Drives ===== | ||
| - | |||
| - | The Storage Manager is not limited to removable USB devices. | ||
| - | |||
| - | Additional internal drives can also be used. | ||
| - | |||
| - | For example: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | As long as the drive is mounted by Batocera and contains a root-level '' | ||
| - | |||
| - | This includes: | ||
| - | |||
| - | * SATA hard drives | ||
| - | * SATA SSDs | ||
| - | * NVMe SSDs | ||
| - | * USB storage devices | ||
| - | * SD cards | ||
| - | |||
| - | <WRAP info> | ||
| - | The drive name does not matter. What matters is that the mounted drive contains a root-level '' | ||
| - | </ | ||
| - | |||
| - | ==== Automatic detection and safety filtering ==== | ||
| - | |||
| - | The Storage Manager backend watches the common Linux block-device families used by Batocera, including '' | ||
| - | |||
| - | Among other checks, the current implementation: | ||
| - | |||
| - | * Skips the disk backing ''/ | ||
| - | * Skips EFI System, Microsoft Reserved and Windows Recovery partition GUIDs | ||
| - | * Skips partitions marked hidden or no-automount | ||
| - | * Filters many Android/ | ||
| - | * Does not offer the automatic blank-disk format prompt for disks of 4 GiB or smaller | ||
| - | * Ignores swap partitions | ||
| - | * Skips local disks already claimed by UUID-based '' | ||
| - | |||
| - | These checks are safeguards, not a substitute for verifying the disk shown by a format prompt. Always confirm the device and capacity before formatting. | ||
| - | |||
| - | <WRAP info> | ||
| - | Some of the protection checks intentionally use broad filesystem-label and partition-label matches. External media using names associated with system partitions, for example '' | ||
| - | </ | ||
| - | |||
| - | ==== Ignoring a drive ==== | ||
| - | |||
| - | The Storage Manager backend supports an '' | ||
| - | |||
| - | If an ignored drive contains a root-level '' | ||
| - | |||
| - | The ignore entry is based on a persistent **whole-disk** identifier when one is available, rather than only on a temporary ''/ | ||
| - | |||
| - | The current backend provides an '' | ||
| - | |||
| - | ==== Mount-point naming ==== | ||
| - | |||
| - | For automatically mounted partitions, Storage Manager builds a mount point under ''/ | ||
| - | |||
| - | <WRAP tip> | ||
| - | Use unique filesystem labels for ROM drives. The Storage Manager configuration stores branch paths such as ''/ | ||
| - | </ | ||
| - | |||
| - | ===== Safe Drive Removal ===== | ||
| - | |||
| - | |||
| - | |||
| - | Drives can be safely removed from: | ||
| - | |||
| - | * **Main Menu** | ||
| - | * **System Settings** | ||
| - | * **Eject an Extra Disk** | ||
| - | |||
| - | {{wiki: | ||
| - | |||
| - | After selecting the drive, Batocera asks for confirmation before removing it from the storage pool. | ||
| - | |||
| - | {{wiki: | ||
| - | |||
| - | Batocera automatically updates the storage pool and refreshes the game lists. | ||
| - | |||
| - | {{wiki: | ||
| - | |||
| - | Games stored only on the removed drive will disappear from the library until that drive is connected and merged again. | ||
| - | |||
| - | The **Eject an Extra Disk** list is generated from branches saved in '' | ||
| - | |||
| - | <WRAP important> | ||
| - | Prefer the Storage Manager eject action over physically unplugging a drive while Batocera is running. The backend has cleanup logic for an unexpected removal, but active writes cannot be made safe after the device has already disappeared. | ||
| - | </ | ||
| - | |||
| - | ==== Missing at boot, safe eject, and live unplug are different ==== | ||
| - | |||
| - | The Storage Manager keeps configured branches in '' | ||
| - | |||
| - | By contrast, using **Eject an Extra Disk** removes that branch from '' | ||
| - | |||
| - | This distinction is useful for systems where a configured drive is sometimes powered off before Batocera boots. Leaving it configured but absent at boot is different from explicitly ejecting it. | ||
| - | |||
| - | ===== What Gets Merged? ===== | ||
| - | |||
| - | The graphical Storage Manager merges only the ROM library: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | Folders such as: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | / | ||
| - | / | ||
| - | / | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | remain on internal storage. | ||
| - | |||
| - | The graphical Storage Manager does not merge BIOS files, save files, screenshots, | ||
| - | |||
| - | Advanced manual MergerFS pools are separate from the graphical Storage Manager and can technically target other directories, | ||
| - | |||
| - | ===== Internal ROM Preservation ===== | ||
| - | |||
| - | When the first additional ROM drive is merged, Batocera preserves the existing internal ROM collection. | ||
| - | |||
| - | Internally, existing ROMs stored in: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | are moved into: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | This allows internal ROMs to remain visible alongside ROMs stored on merged drives. | ||
| - | |||
| - | If all merged drives are later removed, Batocera restores the internal ROM library back to the normal ''/ | ||
| - | |||
| - | During restoration, | ||
| - | |||
| - | ===== Limitations ===== | ||
| - | |||
| - | Automatic detection by the graphical Storage Manager currently requires this layout: | ||
| - | |||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | |||
| - | Nested ROM folders are not detected automatically. | ||
| - | |||
| - | Example: | ||
| - | |||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | |||
| - | is not automatically merged. | ||
| - | |||
| - | This limitation does not apply to advanced manual MergerFS branches, where an explicit nested path can be configured. | ||
| - | |||
| - | The graphical Storage Manager merges only the ROM library. Other userdata folders remain independent unless they are configured separately using advanced manual storage methods. | ||
| ===== Advanced Technical Details ===== | ===== Advanced Technical Details ===== | ||
- user/rion.1791161236.txt.gz
- Last modified: 14 days ago
- by rion