Home Homebrew Rilasciato MkPFS v0.0.8: tool per compressione PFS PFSC, gestione dump, homebrew,...

[Scena PS5] Rilasciato MkPFS v0.0.8: tool per compressione PFS PFSC, gestione dump, homebrew, FPKG e riduzione spazio SSD fino al 60%

316
0

Pubblicato un rapido aggiornamento di MkPFS, il tool scritto in Python permette di creare, comprimere, verificare ed estrarre immagini del filesystem PFS, utilizzato sia dalla PlayStation 4 che dalla PlayStation 5.

In questa nuova versione sono stati introdotti diversi miglioramenti e correzioni che riguardano soprattutto le fasi di packing, unpacking e verifica delle immagini, rendendo l’intero processo più stabile e affidabile rispetto alle build precedenti.

Aggiunto inoltre un sistema di avvisi che informa l’utente quando vengono utilizzate combinazioni di flag considerate sperimentali, così da evitare comportamenti inattesi o risultati non previsti durante l’elaborazione.

Un’altra miglioria importante riguarda la gestione automatica dei nomi delle immagini interne: ora il tool rinomina automaticamente i file quando vengono rilevati caratteri speciali potenzialmente problematici inseriti dall’utente, prevenendo errori e incompatibilità nella fase di generazione o estrazione.

Caratteristiche

  • Crea e gestisci immagini disco PFS per flussi di lavoro orientati PlayStation.
  • Verifica la struttura, gli hash dei payload, la coerenza del layout e la corrispondenza con l’albero dei file sorgente.
  • Ispeziona rapidamente il contenuto delle immagini tramite una vista ad albero, invece di dover esplorare strutture raw complesse.
  • Lavora con estensioni di immagini comuni come .ffpfs e .ffpfsc.
  • Utilizza le immagini generate con strumenti come MicroMount e ShadowMountPlus.
  • Costruisci il filesystem PFS interno utilizzato nei workflow PKG o FPKG.
  • Utilizza lo stesso flusso di lavoro principale sia dalla CLI che dalla libreria Python.
  • Esplora una knowledge base integrata e basata su sorgenti per attività di ricerca su PFS e PKG.

Avvio rapido

bash

# Installazione/Aggiornamento tramite pip
python -m pip install -U "mkpfs"

# Creazione immagini - Opzione 1: .exfat → .ffpfsc (Compatibilità massima, funziona con ShadowMountPlus)
python -m mkpfs pack file --verify './BREW1234.exfat' './BREW1234.ffpfsc'

# Creazione immagini - Opzione 2: .ffpkg → .ffpfsc (Funziona con ShadowMountPlus)
python -m mkpfs pack file --verify './BREW1234.ffpkg' './BREW1234.ffpfsc'

# Creazione immagini - Opzione 3: cartella di gioco racchiusa due volte in .ffpfsc (procedura a due passaggi) (Funziona con ShadowMountPlus)
python -m mkpfs pack folder --verify --no-compress --no-adjust-output-file-extension './BREW1234-app' './pfs_image.dat'
python -m mkpfs pack file --verify './pfs_image.dat' './BREW1234.ffpfsc'
rm './pfs_image.dat'

# Creazione immagini - Opzione 4: cartella di gioco senza contenitore intermedio (procedura a passaggio singolo) (--no-compress) (Sconsigliata; vedere le note)
python -m mkpfs pack folder --no-compress --verify './BREW1234-app/' './BREW1234.ffpfs'

# Estrazione di immagini esistenti (operazione inversa alla creazione/compressione).
python -m mkpfs unpack './BREW1234.ffpfs' './BREW1234-extracted/'

Limitazioni e problemi noti

  • La conversione .exfat → .ffpfsc rappresenta attualmente il formato più stabile per i backup di giochi compressi.
  • La creazione diretta di un’immagine a partire da una cartella dell’applicazione senza un contenitore intermedio (procedura a passaggio singolo) non funziona correttamente quando è attivata la compressione dei file. Sebbene l’immagine venga generata e la verifica venga superata con successo, la console legge i file in modo errato a causa di limitazioni tecniche. Di conseguenza, questa modalità non offre alcun vantaggio pratico.
  • Con il valore predefinito --block-size 65536, i file di dimensioni molto ridotte possono causare un notevole spreco dovuto all’allineamento dei blocchi. In alcuni casi particolari, questo può persino portare alla creazione di un’immagine finale più grande rispetto ai dati originali.
    • Per cartelle contenenti un elevato numero di file piccoli, è consigliato utilizzare la strategia a due passaggi (cartella grezza → .dat → .ffpfsc) oppure provare dimensioni dei blocchi inferiori, come --block-size 16384 o --block-size 32768.
  • La scansione antivirus può ridurre sensibilmente la velocità di conversione, soprattutto durante la fase di scrittura o quando vengono elaborati molti file separati. Se si considera il software affidabile nel proprio ambiente e si desiderano prestazioni migliori, può essere utile disattivare temporaneamente la protezione in tempo reale. In caso di dubbi, è preferibile lasciare l’antivirus attivo e accettare tempi di conversione più lunghi.

Statistiche di compressione

Utilizzando la compressione di MkPFS, è possibile ridurre i file di gioco del 40–60%, diminuendo in modo significativo le dimensioni delle immagini. Il kernel PlayStation è già in grado di leggere nativamente i file nel formato PFSC con un impatto minimo sulle prestazioni.

I valori riportati di seguito sono stati misurati su un titolo homebrew reale che in origine occupava 6.5 GB di file di gioco:

FormatoDescrizioneDimensioneSpazio risparmiato
.exfatImmagine di gioco non compressa (exFAT).~6.5 GBRiferimento
.ffpkgImmagine di gioco non compressa (UFS).~6.5 GBRiferimento
.exfat.ffpfscWrapper compresso PFSC sopra immagine exFAT.~3.4 GB-47%
.ffpkg.ffpfscWrapper compresso PFSC sopra immagine UFS.~3.4 GB-47%
.ffpfsCartella sorgente convertita direttamente in immagine PFSC.~3.5 GB-46%

Sia il wrapping del singolo file (pack file) sia il packing basato su cartelle (pack folder) producono immagini compresse di dimensioni equivalenti, offrendo così la massima flessibilità senza compromettere l’efficienza.

Installazione

Esecuzione da una copia locale del repository

Installazione da PyPI

bash

pip install mkpfs
mkpfs -h
bash

uv sync --group dev
uv run mkpfs -h

Installazione come strumento locale

bash

uv tool install .
mkpfs -h

Creazione dei pacchetti distributivi

bash

uv build
uv run --frozen twine check dist/*

Riferimento comandi

MkPFS mantiene un’interfaccia dei comandi focalizzata sul ciclo di vita delle immagini. La CLI supporta attualmente i comandi pack, verify, inspect, tree e unpack.

CLI principale

mkpfs [-h] {pack,verify,inspect,tree,unpack} ...

ParametroDescrizione
-h, --helpMostra la guida principale e termina l’esecuzione.
packCrea un’immagine PFS partendo da una cartella o da un singolo file.
verifyVerifica la struttura dell’immagine e i checksum dei contenuti.
inspectAnalizza i metadati dell’immagine e ne mostra un riepilogo di integrità.
treeVisualizza la struttura ad albero dell’immagine.
unpackEstrae i file da un’immagine in una directory di destinazione.

pack

mkpfs pack [-h] {folder,file} ...

Utilizzare pack folder per creare un’immagine partendo da una struttura di directory, oppure pack file per trattare un singolo file come un albero virtuale composto da un solo elemento.

pack folder

bash

mkpfs pack folder [-h] [--adjust-output-file-extension | --no-adjust-output-file-extension]
                  [--compress | --no-compress] [--threshold-gain SOGLIA_GUADAGNO]
                  [--block-size DIMENSIONE_BLOCCO] [--version {PS4,PS5}] [--inode-bits {32,64}]
                  [--case-sensitive | --case-insensitive] [--cpu-count NUMERO_CPU]
                  [--compression-level LIVELLO_COMPRESSIONE]
                  [--max-compressed-ratio RAPPORTO_MASSIMO_COMPRESSIONE]
                  [--min-compress-size DIMENSIONE_MINIMA_COMPRESSIONE]
                  [--no-spool]
                  [--skip-executable-compression] [--signed] [--encrypted]
                  [--ekpfs-key CHIAVE_EKPFS] [--require-game-files]
                  [--temp-folder CARTELLA_TEMPORANEA]
                  [--verbose] [--dry-run] [--verify]
                  cartella_sorgente file_immagine

Esempi:

bash

mkpfs pack folder ./input ./game.ffpfs
mkpfs pack folder ./input ./game.ffpfs --encrypted
mkpfs pack folder ./input ./game.ffpfs --require-game-files --verify
mkpfs pack folder ./input ./game.ffpfs --temp-folder ./tmp/mkpfs
Parametro Descrizione
source_dir Cartella sorgente dell’app o dell’homebrew da impacchettare.
image_file Percorso del file immagine di output.
-h, --help Mostra la guida ed esce.
--adjust-output-file-extension Adatta automaticamente l’estensione del file di output in base alla modalità di packaging rilevata. È il comportamento predefinito.
--no-adjust-output-file-extension Mantiene invariato il nome del file di output richiesto.
--compress Abilita la compressione dei blocchi PFSC. È il comportamento predefinito.
--no-compress Disabilita la compressione dei blocchi PFSC.
--threshold-gain THRESHOLD_GAIN Guadagno minimo percentuale per blocco richiesto per mantenere i blocchi compressi PFSC. Valore predefinito: 5.
--block-size BLOCK_SIZE Dimensione dei blocchi PFS in byte, oppure valori auto o auto-fit. Predefinito: auto, che corrisponde a 65536; auto-fit sceglie tra 4096 e 65536 in base alla stima del padding dei dati.
--version {PS4,PS5} Versione del profilo PFS. Predefinito: PS4.
--inode-bits {32,64} Modalità bit degli inode. Predefinito: 32. (Nota: la modalità a 64 bit potrebbe essere instabile)
--case-sensitive Crea un’immagine case-sensitive (sensibile a maiuscole/minuscole).
--case-insensitive Imposta la modalità case-insensitive. È il comportamento predefinito.
--cpu-count CPU_COUNT Numero di core CPU da utilizzare per la compressione PFSC. 0 = automatico (max(1, cpu_count()-1)), valori diversi da zero usano max(1, valore impostato).
--compression-level COMPRESSION_LEVEL Livello di compressione Zlib da 0 a 9. Valore predefinito: 7.
--max-compressed-ratio MAX_COMPRESSED_RATIO Rapporto massimo di dimensione PFSC rispetto al file originale (in percentuale). Con 95, i file vengono salvati non compressi se la compressione non riduce abbastanza. Default: 95.
--min-compress-size MIN_COMPRESS_SIZE I file più piccoli di questa soglia vengono salvati non compressi senza tentare PFSC. Se omesso (o 0), MkPFS usa il valore derivato da –block-size (65536 per auto o il valore selezionato in auto-fit).
--no-spool Mantiene la scrittura diretta nell’immagine per il packaging a singolo file. È già il comportamento predefinito quando supportato; in caso contrario si passa automaticamente al metodo legacy con spool temporaneo.
--skip-executable-compression Salta la compressione dei file eseguibili importanti. Predefinito: abilitato.
--signed Crea un’immagine PFS firmata usando una chiave EKPFS e seed a zero.
--encrypted Cifra i blocchi del filesystem usando AES-XTS.
--ekpfs-key EKPFS_KEY Chiave EKPFS opzionale a 64 caratteri esadecimali. Se omessa con –encrypted, viene usata una chiave tutta a zero.
--require-game-files Richiede la presenza di sce_sys/param.json ed eboot.bin prima del packing.
--temp-folder TEMP_FOLDER Cartella temporanea usata per gli artefatti di packaging (tree temporaneo e spool PFSC). Default: cartella temporanea di sistema.
--verbose Mostra dettagli per-file durante il processo di packaging.
--dry-run Simula il processo (scan e layout) senza creare alcun file.
--verify Esegue automaticamente mkpfs verify dopo un packaging riuscito.

Note

  • I nomi dei file di output delle cartelle vengono adattati automaticamente per impostazione predefinita.
  • MkPFS usa .ffpfs quando sce_sys/param.json contiene un Title ID; altrimenti usa .ffpfsc.
  • L’opzione --ekpfs-key ha effetto solo insieme a --encrypted.

pack file

bash

mkpfs pack file [-h] [--adjust-output-file-extension | --no-adjust-output-file-extension]
                [--compress | --no-compress] [--threshold-gain SOGLIA_GUADAGNO]
                [--block-size DIMENSIONE_BLOCCO] [--version {PS4,PS5}] [--inode-bits {32,64}]
                [--case-sensitive | --case-insensitive] [--cpu-count NUMERO_CPU]
                [--compression-level LIVELLO_COMPRESSIONE]
                [--max-compressed-ratio RAPPORTO_MASSIMO_COMPRESSIONE]
                [--min-compress-size DIMENSIONE_MINIMA_COMPRESSIONE]
                [--no-spool]
                [--skip-executable-compression] [--signed] [--encrypted]
                [--ekpfs-key CHIAVE_EKPFS] [--temp-folder CARTELLA_TEMPORANEA]
                [--verbose] [--dry-run] [--verify]
                file_sorgente file_immagine

Esempi:

ini

mkpfs pack file ./payload.exfat ./payload.ffpfsc
mkpfs pack file ./payload.exfat ./payload.ffpfsc --verify
mkpfs pack file ./payload.exfat ./payload.ffpfsc --temp-folder ./tmp/mkpfs
Parametro Descrizione
source_file Singolo file sorgente da impacchettare.
image_file Percorso del file immagine di output.
-h, --help Mostra la guida ed esce.
--adjust-output-file-extension Adatta automaticamente l’estensione del file di output in base alla modalità rilevata. È il comportamento predefinito.
--no-adjust-output-file-extension Mantiene invariato il nome del file di output richiesto.
--compress Abilita la compressione dei blocchi PFSC. È il comportamento predefinito.
--no-compress Disabilita la compressione PFSC.
--threshold-gain THRESHOLD_GAIN Percentuale minima di guadagno per blocco necessaria per mantenere i blocchi compressi PFSC. Valore predefinito: 5.
--block-size BLOCK_SIZE Dimensione dei blocchi PFS in byte, oppure valori auto o auto-fit. Predefinito: auto (65536), mentre auto-fit sceglie tra 4096 e 65536 in base al padding stimato dei dati.
--version {PS4,PS5} Versione del profilo PFS. Predefinito: PS4.
--inode-bits {32,64} Modalità inode a 32 o 64 bit. Predefinito: 32.
--case-sensitive Crea un’immagine con distinzione tra maiuscole e minuscole nei nomi file.
--case-insensitive Imposta la modalità non case-sensitive. È il comportamento predefinito.
--cpu-count CPU_COUNT Numero di core CPU utilizzati per la compressione PFSC. 0 = automatico (max(1, cpu_count()-1)).
--compression-level COMPRESSION_LEVEL Livello di compressione Zlib da 0 a 9. Default: 7.
--max-compressed-ratio MAX_COMPRESSED_RATIO Percentuale massima rispetto alla dimensione originale per mantenere la compressione PFSC. Default: 95.
--min-compress-size MIN_COMPRESS_SIZE File più piccoli di questa soglia vengono salvati non compressi senza tentare PFSC.
--no-spool Mantiene la scrittura diretta nell’immagine quando possibile; in caso contrario usa il metodo legacy con staging/spool.
--skip-executable-compression Salta la compressione dei file eseguibili importanti. Predefinito: abilitato.
--signed Crea un’immagine PFS firmata con EKPFS a zero.
--encrypted Cifra i blocchi del filesystem con AES-XTS.
--ekpfs-key EKPFS_KEY Chiave EKPFS opzionale a 64 caratteri esadecimali. Se omessa con –encrypted, viene usata una chiave a zero.
--temp-folder TEMP_FOLDER Cartella per i file temporanei (staging e spool PFSC). Default: cartella temporanea di sistema.
--verbose Mostra decisioni dettagliate per ogni file durante il packing.
--dry-run Analizza e mostra il layout senza creare alcun file.
--verify Esegue automaticamente la verifica dopo il packaging riuscito.

Note

  • pack file ora utilizza di default il sistema di streaming diretto verso l’immagine per le combinazioni di opzioni supportate. In modo automatico, torna al metodo legacy basato su staging/spool per le opzioni --signed, --inode-bits 64 e --block-size auto-fit.
  • La modalità di fallback per singolo file crea una struttura temporanea a file singolo utilizzando link simbolici, così il contenuto sorgente non viene duplicato su disco.
  • È possibile usare --temp-folder quando si vuole che i file temporanei del fallback e gli eventuali file spool PFSC legacy vengano salvati in una posizione diversa dalla cartella temporanea di sistema.
  • L’estensione predefinita per l’output dei singoli file è .ffpfsc.
  • Se pack file fallisce su macOS con errore OSError: [Errno 22] Invalid argument durante la compressione PFSC, è consigliato rieseguire il comando con --cpu-count 1 per mantenere la compressione dei blocchi in-process.
  • Se il file sorgente si trova su un’unità rimovibile o di rete, può essere utile impostare un --temp-folder locale su un volume APFS scrivibile.

verify

bash

mkpfs verify [-h] [--source-dir CARTELLA_SORGENTE | --source-file FILE_SORGENTE]
             [--expect-crc32 CRC32_ATTESO]
             [--expect-manifest-sha256 SHA256_MANIFEST_ATTESO]
             [--ekpfs-key CHIAVE_EKPFS] [--new-crypt] file_immagine

Esempi:

bash

mkpfs verify ./game.ffpfs
mkpfs verify ./single.ffpfsc --source-file ./payload.exfat
mkpfs verify ./game.ffpfs --source-dir ./input --expect-crc32 0x7F528D1F
Parametro Descrizione
image_file Percorso del file immagine .ffpfs in input.
-h, --help Mostra la guida ed esce.
--source-dir SOURCE_DIR Cartella sorgente opzionale per il confronto della struttura e del contenuto.
--source-file SOURCE_FILE File sorgente opzionale per il confronto di immagini a singolo file. Mutuamente esclusivo con --source-dir.
--expect-crc32 EXPECT_CRC32 CRC32 cumulativo atteso dei dati in formato esadecimale. La verifica fallisce se il valore calcolato non corrisponde.
--expect-manifest-sha256 EXPECT_MANIFEST_SHA256 SHA256 atteso del manifest (64 caratteri esadecimali). La verifica fallisce se non corrisponde.
--ekpfs-key EKPFS_KEY Chiave EKPFS opzionale a 64 caratteri esadecimali per immagini cifrate.
--new-crypt Utilizza la derivazione EKPFS alternativa (newCrypt).

inspect

mkpfs inspect [-h] [--format {text,json}] [--ekpfs-key CHIAVE_EKPFS] [--new-crypt] file_immagine

Esempi:

bash

mkpfs inspect ./game.ffpfs
mkpfs inspect ./game.ffpfs --format json
Parametro Descrizione
image_file Percorso del file immagine .ffpfs in input.
-h, --help Mostra la guida ed esce.
--format {text,json} Formato del report di ispezione. Valori possibili: testo o JSON. Predefinito: text.
--ekpfs-key EKPFS_KEY Chiave EKPFS opzionale a 64 caratteri esadecimali per immagini cifrate.
--new-crypt Utilizza la derivazione alternativa EKPFS (newCrypt).

tree

mkpfs tree [-h] [--ekpfs-key CHIAVE_EKPFS] [--new-crypt] file_immagine

Esempi:

mkpfs tree ./game.ffpfs

Parametro Descrizione
image_file Percorso del file immagine .ffpfs in input.
-h, --help Mostra la guida ed esce.
--ekpfs-key EKPFS_KEY Chiave EKPFS opzionale a 64 caratteri esadecimali per immagini cifrate.
--new-crypt Utilizza la derivazione alternativa EKPFS (newCrypt).

unpack

mkpfs unpack [-h] [--overwrite] [--ekpfs-key CHIAVE_EKPFS] [--new-crypt] file_immagine cartella_output

Esempi:

bash

mkpfs unpack ./game.ffpfs ./extracted/
mkpfs unpack ./game.ffpfs ./extracted/ --overwrite
Parametro Descrizione
image_file Percorso del file immagine .ffpfs in input.
output_dir Cartella di destinazione per l’estrazione.
-h, --help Mostra la guida ed esce.
--overwrite Sovrascrive un percorso di output esistente.
--ekpfs-key EKPFS_KEY Chiave EKPFS opzionale a 64 caratteri esadecimali per immagini cifrate.
--new-crypt Utilizza la derivazione alternativa EKPFS (newCrypt).

Esempio di output

bash

$ mkpfs pack folder --verify --compress "./BREW00000-app" "./BREW00000.ffpfs"
======================================================================
PFS Image Builder - Parameters
======================================================================
  Source path:       ./BREW00000-app
  Output path:       ./BREW00000.ffpfs
  Version:           1 (PS4)
  Header magic:      PFS (20130315)
  Compression Setup: PFSC (0x43534650)
  Block size:        65,536 bytes (64 KiB)
  Inode width:       32-bit
  PFS mode:          0x0008  (Bit 0=signed, Bit 1=64-bit inodes, Bit 2=encrypted, Bit 3=case insensitive)
    Signed:          no
    64-bit inodes:   no
    Encrypted:       no
    New crypt:       no
    Case insensitive: yes
  Compression:       enabled
  Game-file checks:   disabled
  Threshold gain:    20%
  CPU cores:         7 (auto)
  Zlib level:        7
  Dry run:           no
======================================================================

Discovering files...
[################################] 100% scan

Compressing 180 files (5.87 GB) using 10 CPU cores...
[################################] 100% compress @ 68.75 MB/s            

Writing PFS image to ./BREW00000.ffpfs...
[################################] 100% write @ 728.27 MB/s

Successfully wrote 3.21 GB image
======================================================================
Build Summary
======================================================================
  Input path:              ./BREW00000-app
  Output path:             ./BREW00000.ffpfs
  Total files:             180
  Total uncompressed size: 5.87 GB
  Total stored size:       3.21 GB

  Compression Statistics:
    Compressed files:       53
    Uncompressed files:     127
    Actual gain achieved:   45.40%
    All-PFSC gain:          46.51%  (3.14 GB if every file used PFSC)

  Block Alignment Waste:
    Block size:             64 KiB (65,536 bytes)
    Wasted space:           6.75 MB (0.21% of file data blocks)

  Elapsed time:            92.46s
  Throughput:              65.05 MB/s


Running post-create check...
======================================================================
PFS Check Report
======================================================================
Image:                 ./BREW00000.ffpfs
Version:               1 (PS4)
Header magic:          PFS (20130315)
Compression Setup:     PFSC (0x43534650)
Read-only:             yes
Mode:                  0x0008  (Bit 0=signed, Bit 1=64-bit inodes, Bit 2=encrypted, Bit 3=case insensitive)
  Signed:              no
  64-bit inodes:       no
  Encrypted:           no
  Case insensitive:    yes
Block size:            65,536 bytes
Inodes:                196
Directories:           14
Files:                 180
Compressed files:      53
Files hash-checked:    180
Data CRC32:            0x7A6E1B38
Manifest SHA256:       5eee3aed04394d0abf978037ccfc6ddcf9c3945fa11816fe14f11d5853e5553e
Logical file bytes:    3,443,395,982
Stored file bytes:     6,306,784,749
flat_path_table keys:  193
Warnings:              0
Errors:                0
======================================================================

Sviluppo

Configurare l’ambiente locale:

ini

uv sync --group dev
uv run pre-commit install

Eseguire i comandi di validazione:

ini

./run-tests.sh
uv run --frozen ruff format .
uv run --frozen ruff check .

Changelog

  • Vari miglioramenti e correzioni relativi al packing, unpacking e alla verifica delle immagini.
  • Aggiunti avvisi per informare l’utente quando vengono utilizzate combinazioni di flag sperimentali.
  • Rinominazione automatica dell’immagine interna per evitare caratteri speciali non validi introdotti dall’utente.

Download: Source code MkPFS v0.0.8

Alcune parti di questo articolo sono state generate con l’aiuto dell’intelligenza artificiale.

🔥 Prodotti in promozione e articoli più venduti: PS5

Vedi altri prodotti PS5

Questo articolo contiene link affiliati a Amazon. Se acquisti tramite questi link, potrei guadagnare una commissione senza costi aggiuntivi per te.

Ultimo aggiornamento 2026-07-15 / Link di affiliazione / Immagini da Amazon Product Advertising API

LASCIA UN COMMENTO

Per favore inserisci il tuo commento!
Per favore inserisci il tuo nome qui
Captcha verification failed!
Punteggio utente captcha non riuscito. Ci contatti per favore!

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.