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:28] – [Storage Manager] 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 ===== | ||
| Line 846: | Line 856: | ||
| * Batocera changelog: | * Batocera changelog: | ||
| * https:// | * https:// | ||
| - | |||
| - | ===== Overview ===== | ||
| - | |||
| - | | ||
| - | |||
| - | The Storage Manager can: | ||
| - | |||
| - | * Detect compatible storage devices automatically | ||
| - | * Merge existing ROM drives | ||
| - | * Format and prepare new drives | ||
| - | * Use multiple drives simultaneously | ||
| - | * Present all ROMs as a single library under ''/ | ||
| - | * Safely eject drives | ||
| - | * Automatically refresh game lists | ||
| - | |||
| - | From the user's point of view, there is still only one ROM folder: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | Batocera handles the storage pool in the background. | ||
| - | |||
| - | {{wiki: | ||
| - | |||
| - | A simplified overview: | ||
| - | |||
| - | < | ||
| - | Internal ROMs | ||
| - | │ | ||
| - | Drive 1 /roms | ||
| - | │ | ||
| - | Drive 2 /roms | ||
| - | │ | ||
| - | MergerFS | ||
| - | │ | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | ===== Requirements ===== | ||
| - | |||
| - | A drive must contain a root-level folder named: | ||
| - | |||
| - | < | ||
| - | roms | ||
| - | </ | ||
| - | |||
| - | Supported: | ||
| - | |||
| - | < | ||
| - | Drive | ||
| - | └── roms | ||
| - | ├── nes | ||
| - | ├── snes | ||
| - | └── psx | ||
| - | </ | ||
| - | |||
| - | Not supported: | ||
| - | |||
| - | < | ||
| - | Drive | ||
| - | └── Batocera | ||
| - | └── roms | ||
| - | </ | ||
| - | |||
| - | Not supported: | ||
| - | |||
| - | < | ||
| - | Drive | ||
| - | ├── nes | ||
| - | ├── snes | ||
| - | └── psx | ||
| - | </ | ||
| - | |||
| - | The Storage Manager currently expects the '' | ||
| - | |||
| - | ===== Using Existing Drives ===== | ||
| - | |||
| - | |||
| - | |||
| - | When Batocera detects a mounted drive containing a compatible root-level '' | ||
| - | |||
| - | {{wiki: | ||
| - | |||
| - | After accepting the prompt, Batocera adds the drive to the storage pool. | ||
| - | |||
| - | {{wiki: | ||
| - | |||
| - | After the merge completes, the ROMs stored on the drive become available alongside your existing collection. | ||
| - | |||
| - | ===== Formatting a New Drive ===== | ||
| - | |||
| - | |||
| - | |||
| - | If a blank drive is detected, Batocera can automatically prepare it for game storage. | ||
| - | |||
| - | {{wiki: | ||
| - | |||
| - | <WRAP important> | ||
| - | Formatting a drive will permanently erase all existing data stored on that drive. Make sure any important files have been backed up before proceeding. | ||
| - | </ | ||
| - | |||
| - | |||
| - | |||
| - | Selecting **Format & Merge** will format the drive and add it to the Storage Manager. | ||
| - | |||
| - | {{wiki: | ||
| - | |||
| - | Batocera will: | ||
| - | |||
| - | * Format the drive | ||
| - | * Create a root-level '' | ||
| - | * Generate the standard ROM directory structure | ||
| - | * Merge the drive into the Storage Manager | ||
| - | * Refresh the game lists | ||
| - | |||
| - | {{wiki: | ||
| - | |||
| - | ===== Using Multiple Drives ===== | ||
| - | |||
| - | Multiple drives can be used simultaneously. | ||
| - | |||
| - | Example: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | Batocera combines them into a single virtual library: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | 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 '' | ||
| - | </ | ||
| - | |||
| - | ===== 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. | ||
| - | |||
| - | ===== What Gets Merged? ===== | ||
| - | |||
| - | Only the ROM library is merged: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | Folders such as: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | / | ||
| - | / | ||
| - | / | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | remain on internal storage. | ||
| - | |||
| - | The Storage Manager does not merge BIOS files, save files, screenshots, | ||
| - | |||
| - | ===== 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 ''/ | ||
| - | |||
| - | ===== Limitations ===== | ||
| - | |||
| - | The Storage Manager currently requires this layout: | ||
| - | |||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | |||
| - | Nested ROM folders are not detected automatically. | ||
| - | |||
| - | Example: | ||
| - | |||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | |||
| - | is not automatically merged. | ||
| - | |||
| - | Only the ROM library is merged. Other userdata folders remain independent. | ||
| - | |||
| - | ===== Advanced Technical Details ===== | ||
| - | |||
| - | Batocera uses **MergerFS** to combine ROM folders from multiple drives into a single virtual directory. | ||
| - | |||
| - | The merged library is presented at: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | Internally, Batocera maintains a storage pool containing: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | plus any merged ROM folders. | ||
| - | |||
| - | Example: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | / | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | These locations are combined into: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | ==== MergerFS File Placement Policy ==== | ||
| - | |||
| - | Batocera currently uses the following MergerFS create policy: | ||
| - | |||
| - | < | ||
| - | category.create=eplfs | ||
| - | moveonenospc=true | ||
| - | minfreespace=4G | ||
| - | </ | ||
| - | |||
| - | **eplfs** means: | ||
| - | |||
| - | < | ||
| - | Existing Path, Least Free Space | ||
| - | </ | ||
| - | |||
| - | When writing a new file: | ||
| - | |||
| - | * MergerFS looks for branches where the target folder already exists | ||
| - | * Among those branches, the branch with the least free space is preferred | ||
| - | * Branches with less than 4 GB free are ignored | ||
| - | * If a drive becomes full during a write operation, the file can automatically move to another branch | ||
| - | |||
| - | Example: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | A new ROM copied into: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | would be stored on: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | because it has the least free space while still meeting the minimum free space requirement. | ||
| - | |||
| - | <WRAP important> | ||
| - | The MergerFS implementation and file placement policy may change between Batocera releases. This section reflects the behavior introduced with Batocera v43. | ||
| - | </ | ||
| - | |||
| - | ===== Frequently Asked Questions ===== | ||
| - | |||
| - | ==== Can I use internal drives? ==== | ||
| - | |||
| - | Yes. Any drive mounted by Batocera containing a root-level '' | ||
| - | |||
| - | Example: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | ==== What happens if I unplug a merged drive? ==== | ||
| - | |||
| - | Batocera updates the storage pool and refreshes the game lists. | ||
| - | |||
| - | Games stored only on the disconnected drive will temporarily disappear until the drive is connected again. | ||
| - | |||
| - | ==== Are BIOS files merged? ==== | ||
| - | |||
| - | No. | ||
| - | |||
| - | Only: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | is merged. | ||
| - | |||
| - | BIOS files remain stored in: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | ==== Are saves merged? ==== | ||
| - | |||
| - | No. | ||
| - | |||
| - | Save files remain stored in the normal userdata location, for example: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | ==== Can I store ROMs in a different folder? ==== | ||
| - | |||
| - | No. | ||
| - | |||
| - | The Storage Manager currently expects a root-level folder named: | ||
| - | |||
| - | < | ||
| - | roms | ||
| - | </ | ||
| - | |||
| - | ==== Does the drive name matter? ==== | ||
| - | |||
| - | No. | ||
| - | |||
| - | For example, both of these are valid if they contain a root-level '' | ||
| - | |||
| - | < | ||
| - | / | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | ===== References ===== | ||
| - | |||
| - | * Batocera TV — '' | ||
| - | * Storage Manager demonstration: | ||
| - | * https:// | ||
| - | |||
| - | * Batocera Storage Manager source code: | ||
| - | * https:// | ||
- user/rion.1791160097.txt.gz
- Last modified: 14 days ago
- by rion