- Python 93.3%
- Shell 6.6%
- Dockerfile 0.1%
| docs | ||
| ps5_mountaneer | ||
| tests | ||
| tools | ||
| vendor | ||
| .gitignore | ||
| AGENTS.md | ||
| mkexfat_linux.sh | ||
| mkufs2_freebsd_docker.sh | ||
| ps5-mountaneer | ||
| ps5-mountaneer.cmd | ||
| pyproject.toml | ||
| README.md | ||
| THIRD_PARTY_NOTICES.md | ||
ps5-mountaneer
Cross-platform image builders for ShadowMountPlus-targeted PS5 game dumps.
ShadowMountPlus accepts four image families, and this tool exposes all of them:
.ffpkg/ UFS2: recommended ShadowMountPlus default. Built with UFS2Tool, native FreeBSD tools, host QEMU/FreeBSD, or Docker/Podman fallback..exfat: compatibility format for titles that behave better as external-drive-style content. Built with Linux, macOS, or Windows host tools..ffpfs: direct PFS image built with MkPFS. This is first-class here, but still experimental in ShadowMountPlus runtime compatibility..ffpfsc: MkPFS/PFSC container wrapping an existing.ffpkgor.exfatimage. This is the recommended compression path; generated names include the nested base format, such as.ffpkg.ffpfscor.exfat.ffpfsc.
The source folder must be the game root and contain:
eboot.bin
sce_sys/param.json
The generated .ffpkg, .exfat, and .ffpfs images place those files directly
at image root, not under an extra top-level folder. .ffpkg.ffpfsc and
.exfat.ffpfsc containers hold a nested .ffpkg or .exfat image instead.
See docs/format-contracts.md for the compatibility contract agents and
contributors should preserve when changing format policy or backend behavior.
Requirements
Python 3.10+ is required for the CLI launcher.
Docker-free UFS2 path:
(cd ../UFS2Tool && dotnet build UFS2Tool.csproj)
./ps5-mountaneer --config ./mountaneer.ini config init
./ps5-mountaneer --config ./mountaneer.ini doctor
UFS2Tool creates/checks UFS2 image files on Linux, macOS, and Windows without root, Docker, or a FreeBSD VM. The auto policy now prefers UFS2Tool when it is available, then falls back to native FreeBSD, host QEMU/FreeBSD, and Docker/Podman FreeBSD paths.
Linux exFAT requirements:
sudo dnf install exfatprogs rsync
Optional Fedora fallback requirements for host QEMU or container UFS2:
sudo dnf install qemu-system-x86 qemu-img xorriso openssh-clients xz
sudo dnf install pv # optional progress meter
sudo dnf install moby-engine
sudo systemctl enable --now docker
macOS exFAT uses built-in hdiutil, newfs_exfat, mount, and rsync.
Windows exFAT uses OSFMount, format.com, and robocopy.exe; run the command
from an Administrator shell.
MkPFS can also be used from a local checkout:
(cd ../MkPFS && uv sync --group dev)
MKPFS_BIN="../MkPFS/.venv/bin/mkpfs" ./ps5-mountaneer info ./PPSA12345.ffpkg.ffpfsc
Usage
Estimate local allocation-based formats:
./ps5-mountaneer estimate /path/to/APPXXXX
./ps5-mountaneer estimate --format ufs2 /path/to/APPXXXX ./PPSA12345.ffpkg
./ps5-mountaneer estimate --format pfs /path/to/APPXXXX ./PPSA12345.ffpfs
Recommend the balanced format:
./ps5-mountaneer recommend /path/to/APPXXXX
./ps5-mountaneer recommend --probe-pfsc /path/to/APPXXXX
./ps5-mountaneer recommend --base-format exfat --probe-pfsc /path/to/APPXXXX
Create by output suffix. --format is optional when the destination has a
known ShadowMountPlus image suffix:
./ps5-mountaneer create /path/to/APPXXXX ./PPSA12345.ffpkg
./ps5-mountaneer create /path/to/APPXXXX ./PPSA12345.exfat
./ps5-mountaneer create /path/to/APPXXXX ./PPSA12345.ffpfs
./ps5-mountaneer create /path/to/APPXXXX ./PPSA12345.ffpkg.ffpfsc
./ps5-mountaneer create /path/to/APPXXXX ./PPSA12345.exfat.ffpfsc
Generate an AMPR resolver index while creating an image:
./ps5-mountaneer create --ampr-index /path/to/APPXXXX ./PPSA12345.ffpkg
./ps5-mountaneer create --ampr-index --base-format exfat /path/to/APPXXXX ./PPSA12345.exfat.ffpfsc
Generate or check an AMPR index directly:
./ps5-mountaneer ampr-index /path/to/APPXXXX
./ps5-mountaneer ampr-index --check --json /path/to/APPXXXX
Inject AMPR/PlayGo/DLC fakelib helpers while creating an image. This uses a temporary hardlink staging tree and leaves the source dump unchanged:
./ps5-mountaneer create --fakelib-preset ampr /path/to/APPXXXX ./PPSA12345.ffpkg
./ps5-mountaneer create --fakelib-preset all --fakelib-variant release /path/to/APPXXXX ./PPSA12345.ffpkg.ffpfsc
./ps5-mountaneer create --fakelib-preset all --dlc-config ./dlc_emu.ini --playgo-dat ./playgo_stub.dat /path/to/APPXXXX ./PPSA12345.ffpkg
./ps5-mountaneer prepare-fakelib --fakelib-preset ampr --ampr-index /path/to/APPXXXX
Inspect existing emulator files in a raw dump:
./ps5-mountaneer emulation-info /path/to/APPXXXX
./ps5-mountaneer emulation-info --json /path/to/APPXXXX
Create UFS2 / .ffpkg explicitly:
./ps5-mountaneer create --format ufs2 /path/to/APPXXXX ./PPSA12345.ffpkg
Create exFAT / .exfat explicitly:
./ps5-mountaneer create --format exfat /path/to/APPXXXX ./PPSA12345.exfat
Create direct PFS / .ffpfs explicitly:
./ps5-mountaneer create --format pfs /path/to/APPXXXX ./PPSA12345.ffpfs
Create PFSC / .ffpfsc from a game root explicitly. This creates an
intermediate UFS2 .ffpkg by default, wraps it with MkPFS, and removes the
intermediate file:
./ps5-mountaneer create --format pfsc /path/to/APPXXXX ./PPSA12345.ffpkg.ffpfsc
./ps5-mountaneer create --format pfsc --base-format exfat /path/to/APPXXXX ./PPSA12345.exfat.ffpfsc
Create the balanced auto format. With an extensionless stem, the tool writes
.ffpkg, .exfat, .ffpkg.ffpfsc, or .exfat.ffpfsc after applying the
selected policy. With --format auto and a final image suffix, the suffix
constrains the output family:
./ps5-mountaneer create /path/to/APPXXXX ./PPSA12345
./ps5-mountaneer create --format auto /path/to/APPXXXX ./PPSA12345
./ps5-mountaneer create --format auto /path/to/APPXXXX ./PPSA12345.ffpkg
./ps5-mountaneer create --format auto --base-format exfat /path/to/APPXXXX ./PPSA12345
./ps5-mountaneer --progress never create --format auto /path/to/APPXXXX ./PPSA12345
Wrap an existing .ffpkg or .exfat as PFSC:
./ps5-mountaneer wrap --format pfsc ./PPSA12345.ffpkg ./PPSA12345.ffpfsc
./ps5-mountaneer wrap --format pfsc ./PPSA12345.ffpkg ./PPSA12345.ffpkg.ffpfsc
./ps5-mountaneer wrap --format pfsc ./PPSA12345.exfat ./PPSA12345.exfat.ffpfsc
Verify or inspect:
./ps5-mountaneer verify ./PPSA12345.ffpkg
./ps5-mountaneer verify ./PPSA12345.exfat
./ps5-mountaneer verify ./PPSA12345.ffpfs
./ps5-mountaneer verify ./PPSA12345.ffpkg.ffpfsc
./ps5-mountaneer info ./PPSA12345.ffpkg.ffpfsc
Inspect backend availability:
./ps5-mountaneer setup
./ps5-mountaneer setup --install-bundled --write-config
./ps5-mountaneer plan --json /path/to/APPXXXX ./PPSA12345
./ps5-mountaneer plan --json --jobs 2 --temp-dir /fast/tmp --verify full /path/to/APPXXXX ./PPSA12345.ffpkg.ffpfsc
./ps5-mountaneer doctor
./ps5-mountaneer doctor --format ufs2
./ps5-mountaneer doctor --format fakelib
./ps5-mountaneer doctor --json
Stage helper payloads from sibling checkouts into vendor/:
python3 tools/vendor_helpers.py
./ps5-mountaneer setup --install-bundled --write-config
The vendor layout is vendor/<platform>/bin for launchers/binaries,
vendor/src for bundled source, and vendor/licenses for notices. Explicit
config/env paths still override everything. Otherwise, system tools found on
PATH are preferred, and bundled/cache helpers are used only as fallbacks.
Create and inspect a persistent config:
./ps5-mountaneer config path
./ps5-mountaneer config init
./ps5-mountaneer config show
./ps5-mountaneer --config ./mountaneer.ini config show --json
Behavior
UFS2:
- Uses FreeBSD
newfs -O 2 -b 65536 -f 65536 -m 0 -S 4096. - Auto-tunes
-ifrom source file/directory count. - Adds
SM_UFS2_EXTRA_PERCENT=2headroom by default. - Preflights output free space and optional FreeBSD cache free space.
- Auto backend order is: UFS2Tool, native FreeBSD, host QEMU/FreeBSD, then
Docker/Podman FreeBSD. Set
SM_UFS2_BACKEND=ufs2tool|freebsd-native|qemu|container, use--ufs-backend, or configure[ufs2] backend=.... - UFS2Tool verification runs
fsck_ufs -nplus root-filestatchecks. - FreeBSD-backed verification runs
fsck_ffs -n, mounts read-only, and checkseboot.binplussce_sys/param.jsonat image root.
exFAT:
- Uses 64 KiB clusters.
- Auto-sizes the image using 64 KiB allocation, metadata estimates, and safety margin.
- Linux uses
mkfs.exfat -F -c 64K, copies withrsync --info=progress2, and verifies withfsck.exfat -n. - Linux exFAT create/verify should be run as the normal user. The tool prompts
with
sudo -vonly for mount/umount operations, so MkPFS and Python dependencies still resolve from the user's environment. - macOS uses
hdiutilplusnewfs_exfat -b 65536. - Windows uses OSFMount plus
format.com /FS:exFAT /A:64K. - Set
SM_EXFAT_BACKEND=linux-kernel|linux-fuse|macos-hdiutil|windows-osfmountor use--exfat-backend.
PFS/PFSC:
- Delegates to MkPFS.
- Requires a current MkPFS whose
pack file -handpack folder -hexpose--skip-executable-compression,--max-compressed-ratio,--min-compress-size, and--temp-folder. - Detects newer MkPFS
--no-spooland--no-adjust-output-file-extensionsupport. Single-file PFSC wrapping uses no-spool mode when available to reduce peak temporary disk usage for very large.ffpkgor.exfatinputs. - Uses
--compress --skip-executable-compressionby default. - Uses
SM_PFS_COMPRESSION_LEVEL=9,SM_PFS_MAX_COMPRESSED_RATIO=95,SM_PFS_MIN_COMPRESS_SIZE=65536,SM_PFS_BLOCK_SIZE=auto,SM_PFS_VERSION=PS5, andSM_PFS_INODE_BITS=32by default. - Single-file PFSC wraps over 8 GiB default to MkPFS
--cpu-count 6unless--jobs/SM_PFS_CPU_COUNTis set. This avoids the current MkPFS block-parallel path being killed by memory pressure on huge.ffpkgor.exfatinputs. Tune withSM_PFS_SINGLE_FILE_SAFE_CPU_COUNTandSM_PFS_SINGLE_FILE_SAFE_CPU_THRESHOLD_GIBif you want a different default. - When
SM_MKPFS_TEMP_DIR/--temp-diris not set, each output gets its own.ps5-mountaneer-mkpfs-tmp.<output-name>temp directory and ps5-mountaneer removes it after the MkPFS child exits. Explicit temp directories are left alone unless you delete them yourself. plan --jsonapplies the same--jobs,--temp-dir, and--verifyoverrides ascreate, so the reported MkPFS profile and temp directory match the eventual packaging run.- Generated PFSC outputs use
.ffpkg.ffpfscor.exfat.ffpfscto make the nested base format visible. Plain.ffpfscoutput paths remain accepted for manual create/wrap commands. createinfers.ffpkg,.exfat,.ffpfs,.ffpkg.ffpfsc,.exfat.ffpfsc, and plain.ffpfscoutput paths when--formatis omitted. Explicit--formatvalues are still accepted, but contradictory suffixes are rejected before any image work starts.- MkPFS post-pack verification is disabled by default because the current MkPFS
verifier can materialize each decoded payload in memory. Large PFSC wrappers
around
.ffpkgfiles can therefore be killed after the image has already been written. SetSM_MKPFS_VERIFY=1to opt into that upstream verifier.
AMPR index:
--ampr-index,SM_AMPR_INDEX=1, or[ampr] index=1generatesampr_emu.indexfrom the game root before packaging. The source file is restored afterward, so a previously absent index is removed and an existing one is put back.SM_AMPR_INDEX=autois the default. Auto mode enables the index only when the source already contains a strong AMPR signal such asfakelib/libSceAmpr.sprx, or when packaging-time injection uses--fakelib-preset ampr|all. PlayGo and DLC helpers alone do not trigger AMPR index generation.--no-ampr-index,SM_AMPR_INDEX=0, or[ampr] index=0disables index generation even if AMPR helpers are detected.- The generated index is included at image root, which AMPR treats as
/app0/ampr_emu.index. Use it when creating AMPR-targeted.ffpkg,.exfat, or.ffpfscimages from a game root.wrapcannot add an index to an already-built base image. ampr-index ftp://host/path/to/app0 --output ./ampr_emu.index --uploadcan build the same index from a console FTP view and upload it back to the FTP root. Omit--uploadto generate a local file only.- Paths are matched case-insensitively. By default, files that differ only by
case fail index generation; use
--ampr-allow-case-collisionsorSM_AMPR_ALLOW_CASE_COLLISIONS=1to keep the first sorted entry.
Fakelib helpers:
--fakelib-preset none|ampr|playgo|dlc|allinjects vendored helper SPRX files intofakelib/while packaging. The default isnone.--fakelib-variant release|debugselects no-log/release payloads by default, or debug/log payloads when requested.- Packaging-time injection builds a temporary hardlink staging tree. The raw
game folder is not modified. If hardlinks are not possible, use
--allow-copy-stagingorSM_FAKELIB_ALLOW_COPY_STAGING=1. --playgo-dat PATHandSM_FAKELIB_PLAYGO_DATstage a root-level/app0/playgo_stub.dat. If absent, the current PlayGo stub uses its default 1000 chunks and zero scenarios.--dlc-config PATHandSM_FAKELIB_DLC_CONFIGstage a root-level/app0/dlc_emu.ini. Existingdlc_emu.inifiles are preserved unless--force-fakelibis used for packaging-time staging.emulation-inforeports detected fakelib roles, hashes matched againstvendor/ampr-lib/MANIFEST.json, AMPR index headers, PlayGo support-file status, and DLC mount-point warnings.prepare-fakelibintentionally copies helpers into the raw dump for users who want to managefakelib/manually before packaging.fakelib import --role ampr|playgo|dlc-entitlement|dlc-appcontent FILEreplaces a vendored helper payload and updatesvendor/ampr-lib/MANIFEST.jsonwith the new SHA-256. The manifest keeps the redistribution warning unless you manually verify provenance and rights.fakelib export --fakelib-preset all /path/to/global-fakelibwrites helper SPRX files directly into a ShadowMountPlus global fakelib folder. This is the quickest way to test updated helpers without rebuilding existing images.make-playgo-dat <game_root> ./playgo_stub.datwrites a PlayGo stub config.--chunks autousesstreaminginstall.iniwhen available and falls back to 1000 chunks.dlc-config validate ./dlc_emu.ini --root <game_root>validates DLC emulator sections, content IDs, duplicate labels, and PSAC mount-point folders.- The current
vendor/ampr-lib/MANIFEST.jsonrecords hashes and marks redistribution as unverified. Do not ship those helper blobs in public release bundles until provenance and redistribution rights are confirmed.
Patching existing images:
patch-image <image.ffpkg> --output <updated.ffpkg> --fakelib-preset allupdates helper files by writing a patched copy. Use--in-placeonly when you intentionally want the original path atomically replaced after a successful patch.- Add
--source-root <game_root> --ampr-indexwhen the patch must refresh/app0/ampr_emu.index. The source root is required because the AMPR index must represent the whole final/app0tree, not just the helper SPRX files. .ffpkgpatching uses UFS2Toolstat/add/replacewithfsck_ufs -nbefore and after..exfatpatching mounts a copy read-write, writes only the payload files, unmounts, and runsfsck.exfat -n..ffpfscpatching is a rewrap workflow: ps5-mountaneer uses--base-imagewhen provided, otherwise unpacks the PFSC, finds exactly one nested.ffpkgor.exfat, patches it, then wraps a new PFSC. Direct nested.ffpfsorpfs_image.datpayloads are rejected for patching; rebuild those from source.
Auto recommendation:
- Uses UFS2 /
.ffpkgas the default compatibility base because it is the ShadowMountPlus recommended default. --profile balanced|compat|smallest|fastcontrols the auto tradeoff.balancedis the default,compatandfastkeep the plain base image unless compression is forced, andsmallestaccepts any positive PFSC gain.--compression auto|on|offcontrols PFSC wrapping.autoapplies the selected profile,onwraps the base unconditionally, andoffkeeps the base format.SM_AUTO_BASE_FORMAT=exfator[auto] base_format=exfatcan change the auto/recommendation base when you already know a title needs external-drive style behavior.recommendis a fast estimate and policy report. It does not select PFSC unless--probe-pfscis provided.recommend --probe-pfscandcreate --format autobuild a temporary base image, run a MkPFS PFSC dry-run, then choose.ffpkg.ffpfscor.exfat.ffpfsconly when MkPFS reports at leastSM_AUTO_PFSC_MIN_SAVINGS_PERCENT=5actual gain and at least one compressed file.create <game_root> <extensionless_stem>is equivalent tocreate --format auto <game_root> <extensionless_stem>.create --format auto <game_root> <final_image_path>treats the final suffix as a constraint:.ffpkgand.exfatproduce plain base images, while.ffpkg.ffpfsc,.exfat.ffpfsc, and plain.ffpfscforce PFSC wrapping.- If PFSC does not meet the threshold, auto keeps the base as
.ffpkgor.exfat. - Direct
.ffpfsremains explicit/report-only because ShadowMountPlus runtime compatibility is still more experimental than.ffpkg,.exfat, or PFSC wrapping. - Set
SM_PFSC_KEEP_BASE=1or[auto] keep_base=1with auto to keep the base image alongside a selected.ffpkg.ffpfscor.exfat.ffpfsc.
Progress:
--progress auto|always|nevercontrols ps5-mountaneer-managed progress output.autoenables progress when stderr is a terminal.- Source scans report file, directory, and byte totals when progress is enabled.
- The long-running packaging steps render a live bar: UFS2Tool population, exFAT rsync copy, and MkPFS pack/wrap show a percentage/bytes/ETA bar when the tool reports progress, and fall back to a spinner with elapsed time and a final throughput summary when it does not.
- The setting propagates to the FreeBSD helper, so
--progress neverdisables thepvmeter in QEMU/container UFS2 builds.
Logging:
- Every
createandwraprun writes a timestamped.log(mirroring console and sub-tool output) plus a machine-readable.jsonmetrics summary capturing input/output sizes, compression savings, per-step timings, the chosen format/backend, and whether system or vendored helpers were used. - Logs default to the platform state directory:
${XDG_STATE_HOME:-~/.local/state}/ps5-mountaneer/logson Linux,~/Library/Logs/ps5-mountaneeron macOS, and%LOCALAPPDATA%\ps5-mountaneer\logson Windows. Override with--log-file <path>,SM_LOG_DIR, or[logging] dir; disable with--no-log,SM_LOG_ENABLE=0, or[logging] enable=0. - Manage logs with
./ps5-mountaneer logs path,logs show(add--jsonfor the metrics array), andlogs clear --keep N(keep the N newest runs). - When invoked through
sudo, log files are chowned back to the original user.
Sample integration tests:
samples/is gitignored and must be supplied locally. The current real-sample test expectssamples/PPSA17221-appwitheboot.binandsce_sys/param.json.- Run the default unit suite with
python3 -m unittest discover -s tests; the real-sample tests are skipped unless explicitly enabled. - Run the Minecraft packaging matrix with:
sudo -v
SM_SAMPLE_INTEGRATION=1 python3 -m unittest tests.test_sample_packaging
- The opt-in suite creates
.ffpkg,.exfat,.ffpfs,.ffpkg.ffpfsc, and.exfat.ffpfscoutputs under/tmp/ps5-mountaneer-sample-*, verifies each output, and removes them on success. It also creates and patches--fakelib-preset allvariants for.ffpkg,.exfat,.ffpkg.ffpfsc, and.exfat.ffpfsc, then checks that the AMPR, PlayGo, and DLC emulator SPRX files exist underfakelib/inside the generated image. SetSM_SAMPLE_KEEP_OUTPUT=1to keep the generated images for inspection. - exFAT coverage is mandatory when
SM_SAMPLE_INTEGRATION=1; on Linux the test requires exFAT tooling plus root or cached sudo credentials.
Compatibility Wrappers
Old command style still works:
./mkufs2_freebsd_docker.sh /path/to/APPXXXX ./PPSA12345.ffpkg
./mkufs2_freebsd_docker.sh --estimate /path/to/APPXXXX ./PPSA12345.ffpkg
./mkufs2_freebsd_docker.sh --verify ./PPSA12345.ffpkg
sudo ./mkexfat_linux.sh /path/to/APPXXXX ./PPSA12345.exfat
./mkexfat_linux.sh --estimate /path/to/APPXXXX ./PPSA12345.exfat
sudo ./mkexfat_linux.sh --verify ./PPSA12345.exfat
Environment
CLI flags override environment variables; environment variables override
config.ini; config values override built-in defaults. The default config path
is ${XDG_CONFIG_HOME:-~/.config}/ps5-mountaneer/config.ini on Linux and other
POSIX hosts, ~/Library/Application Support/ps5-mountaneer/config.ini on
macOS, and %APPDATA%\ps5-mountaneer\config.ini on Windows. Set SM_CONFIG or
pass --config <path> to use another file.
SM_PROGRESS=never ./ps5-mountaneer create --format ufs2 /path/to/APPXXXX ./PPSA12345.ffpkg
SM_LOG_DIR=/var/log/ps5-mountaneer ./ps5-mountaneer create --format auto /path/to/APPXXXX ./PPSA12345
SM_LOG_ENABLE=0 ./ps5-mountaneer create --format ufs2 /path/to/APPXXXX ./PPSA12345.ffpkg
SM_AUTO_BASE_FORMAT=exfat ./ps5-mountaneer recommend /path/to/APPXXXX
SM_AUTO_PFSC_MIN_SAVINGS_PERCENT=10 ./ps5-mountaneer create --format auto /path/to/APPXXXX ./PPSA12345
FORCE=1 ./ps5-mountaneer create --format ufs2 /path/to/APPXXXX ./PPSA12345.ffpkg
KEEP_PARTIAL_OUTPUT=1 ./ps5-mountaneer create --format ufs2 /path/to/APPXXXX ./PPSA12345.ffpkg
UFS2TOOL_BIN="../UFS2Tool/bin/Debug/net8.0/UFS2Tool" ./ps5-mountaneer create --format ufs2 /path/to/APPXXXX ./PPSA12345.ffpkg
SM_UFS2_BACKEND=qemu ./ps5-mountaneer create --format ufs2 /path/to/APPXXXX ./PPSA12345.ffpkg
FREEBSD_CACHE_DIR_HOST="$PWD/.ufs2-cache/freebsd-mkufs2" ./ps5-mountaneer create --format ufs2 /path/to/APPXXXX ./PPSA12345.ffpkg
SM_UFS2_EXTRA_MB=4096 ./ps5-mountaneer create --format ufs2 /path/to/APPXXXX ./PPSA12345.ffpkg
FREEBSD_MEMORY=8192 FREEBSD_CPUS=4 ./ps5-mountaneer create --format ufs2 /path/to/APPXXXX ./PPSA12345.ffpkg
SM_DOCKER_SELINUX_LABEL=0 ./ps5-mountaneer create --format ufs2 /path/to/APPXXXX ./PPSA12345.ffpkg
SM_EXFAT_BACKEND=linux-fuse ./ps5-mountaneer create --format exfat /path/to/APPXXXX ./PPSA12345.exfat
MKPFS_BIN="../MkPFS/.venv/bin/mkpfs" ./ps5-mountaneer create --format pfs /path/to/APPXXXX ./PPSA12345.ffpfs
SM_MKPFS_VERIFY=1 ./ps5-mountaneer wrap --format pfsc ./PPSA12345.ffpkg ./PPSA12345.ffpkg.ffpfsc
SM_PFS_CPU_COUNT=4 ./ps5-mountaneer wrap --format pfsc ./PPSA12345.exfat ./PPSA12345.exfat.ffpfsc
SM_PFSC_KEEP_BASE=1 ./ps5-mountaneer create --format pfsc /path/to/APPXXXX ./PPSA12345.ffpkg.ffpfsc
SM_AUTO_PFSC_MIN_SAVINGS_PERCENT=1 ./ps5-mountaneer create --format auto /path/to/APPXXXX ./PPSA12345
SM_AMPR_INDEX=auto ./ps5-mountaneer create /path/to/APPXXXX ./PPSA12345.ffpkg
SM_FAKELIB_PRESET=ampr ./ps5-mountaneer create /path/to/APPXXXX ./PPSA12345.ffpkg
Set FORCE=1 to overwrite an existing output file. Set
SM_PFSC_KEEP_BASE=1 to keep the intermediate .ffpkg or .exfat file used
by create --format pfsc. For very large single-file PFSC wraps, leave the
safe default in place for reliability or set --jobs N or
SM_PFS_CPU_COUNT=N after confirming your system has enough RAM. Set
SM_MKPFS_VERIFY=1 only when you want MkPFS to run its full post-pack verifier;
you can also run ./ps5-mountaneer verify later against the completed .ffpfs
or .ffpfsc.