Home News Rilasciato libusbhsfs v0.1.0 ora con supporto per il file system NTFS

[Scena Switch] Rilasciato libusbhsfs v0.1.0 ora con supporto per il file system NTFS

320
0

Nuovo aggiornamento disponibile per la libreria libusbhsfs che introduce il tanto desiderato supporto per file system NTFS, le app che faranno uso di questa nuova libreria potranno utilizzare dischi rigidi esterni, proprio come avviene in SX OS.

La classe di dispositivi di archiviazione di massa USB (nota anche come USB MSC o UMS ) è un insieme di protocolli di comunicazione, definita dalla USB Implementers Forum che rende un dispositivo USB accessibile a un dispositivo di elaborazione host e consente il trasferimento di file tra l’host e il dispositivo USB.

Per un host, il dispositivo USB funge da disco rigido esterno, il set di protocolli si interfaccia con una serie di dispositivi di archiviazione.

Caratteristiche principali

  • Supporta dispositivi di archiviazione di massa USB che implementano almeno un descrittore di interfaccia USB con le seguenti proprietà:
    • bInterfaceClass: 0x08 (USB Mass Storage Class).
    • bInterfaceSubClass: 0x06 (SCSI Transparent Command Set SubClass).
    • bInterfaceProtocol: 0x50 (Bulk-Only Transport [BOT] Protocol).
  • Driver BOT (Bulk-Only Transport) scritto da zero, che implementa i più comuni comandi SPC (Primary Command Set) SCSI nonché richieste specifiche della classe BOT.
    • Comandi SPC supportati:
      • TEST UNIT READY (0x00).
      • REQUEST SENSE (0x03).
      • INQUIRY (0x12).
      • MODE SENSE (6) (0x1A).
      • START STOP UNIT (0x1B).
      • PREVENT ALLOW MEDIUM REMOVAL (0x1E).
      • READ CAPACITY (10) (0x25).
      • READ (10) (0x28).
      • WRITE (10) (0x2A).
      • MODE SENSE (10) (0x5A).
      • READ (16) (0x88).
      • WRITE (16) (0x8A).
      • SERVICE ACTION IN (0x9E).
    • Azioni supportate SERVICE ACTION IN:
      • READ CAPACITY (16) (0x10).
    • Richieste specifiche della classe BOT supportate:
      • Get Max LUN (0xFE).
      • Bulk-Only Mass Storage Reset (0xFF).
  • Supporta dispositivi UMS con indirizzi di blocchi logici lunghi (LBA a 64 bit) e dimensioni di blocchi logici variabili (512 – 4096 byte).
  • Thread in background che si occupa di avviare tutte le unità logiche disponibili da ogni dispositivo UMS appena connesso, oltre a montare i filesystem disponibili da ciascuno quando possibile.
    • Schemi di partizionamento supportati:
      • Super Floppy Drive (SFD) (Volume Boot Record @ LBA 0).
      • Master Boot Record (MBR).
      • Extended Boot Record (EBR).
      • GUID Partition Table (GPT) + protective MBR.
    • File system supportati:
      • FAT12 (via FatFs).
      • FAT16 (via FatFs).
      • FAT32 (via FatFs).
      • exFAT (via FatFs).
      • NTFS (via NTFS-3G).
      • È completamente possibile aggiungere il supporto per file system aggiuntivi, a condizione che le loro librerie siano trasferite su Switch.
    • Utilizza l’interfaccia del dispositivo virtuale devoptab per fornire un modo per utilizzare le chiamate I/O standard da libc (ad esempio fopen(), opendir(), ecc..) sui filesystem montati dalle unità logiche disponibili.
  • Interfaccia della libreria facile da usare:
    • Fornisce un evento utente di cancellazione automatica che viene segnalato ogni volta che viene rilevata una modifica di stato dal thread in background (nuovo dispositivo montato, dispositivo rimosso).
    • Elenco indolore delle partizioni montate utilizzando una semplice struttura che fornisce il nome del dispositivo devoptab, così come altre informazioni interessanti (indice del file system, tipo di file system, protezione da scrittura, capacità dell’unità logica grezza, ecc..).
    • Fornisce un modo per smontare in sicurezza i dispositivi UMS in fase di esecuzione.
  • Supporta il servizio usbfs da SX OS.

Limitazioni

  • Driver Bulk-Only Transport (BOT):
    • È possibile utilizzare contemporaneamente fino a 32 interfacce di archiviazione di massa USB diverse. L’aumento di questo limite non è dannoso, ma fa sì che la libreria occupi ulteriore memoria heap.
    • È possibile eseguire una sola operazione SCSI alla volta per dispositivo UMS, indipendentemente dal numero di unità logiche. Questa è una limitazione ufficiale del protocollo BOT. I mutex vengono utilizzati per evitare che più operazioni SCSI vengano eseguite contemporaneamente sullo stesso dispositivo UMS.
  • Librerie del file system:
    • FatFs:
      • È possibile montare fino a 64 volumi FAT contemporaneamente su tutti i dispositivi UMS disponibili. Il limite originale era 10, ma FatFs è stato leggermente modificato per consentire il montaggio simultaneo di più volumi.
    • NTFS-3G:
      • Le operazioni di crittografia non sono supportate.
      • I contesti di sicurezza vengono sempre ignorati.
      • Supporta solo il journaling parziale, quindi arresti anomali imprevisti o interruzioni di corrente possono lasciare il volume NTFS montato in uno stato incoerente. Nei casi in cui si è verificata un’attività pesante prima del crash o della perdita di alimentazione, si consiglia di collegare il dispositivo UMS a un PC Windows e lasciarlo riprodurre correttamente il journal prima di rimontarlo con NTFS-3G, al fine di prevenire la possibile perdita di dati e/o corruzione.
      • I collegamenti simbolici sono trasparenti. Ciò significa che quando si incontra un collegamento simbolico, verrà utilizzato il suo collegamento fisico.
  • Consumo di memoria dello stack e/o dell’heap:
    • Questa libreria non è adatta per i sysmodule personalizzati e/o progetti MITM di servizio. Assegna un buffer di 8 MiB per ogni dispositivo UMS, che viene utilizzato per i trasferimenti di comandi e dati. Inoltre si basa molto sulle funzionalità di libnx, che non sono sempre compatibili con i contesti del programma sysmodule/MITM.
  • Funzionalità FS specifiche per switch:
    • I file di concatenazione non sono supportati.
  • Servizio usbfs da SX OS:
    • È possibile montare un solo volume FAT da una singola unità.
    • I percorsi relativi non sono supportati.
    • chdir()rename()dirreset()utimes() non sono supportati.
    • Probabilmente ci sono altre limitazioni di cui non siamo nemmeno a conoscenza, a causa della natura closed-source di questo CFW.

Licenze

Per questo progetto è prevista una doppia licenza a seconda del modo in cui viene costruito:

  • Se la libreria viene creata utilizzando il parametro BUILD_TYPE=ISC con make, viene distribuita secondo i termini della licenza ISC. È possibile trovare una copia di questa licenza nel file LICENSE_ISC.md.
    • Le build con licenza ISC forniscono supporto per i filesystem FAT solo tramite FatFs, che è concesso in licenza con FatFs license.
  • Se la libreria viene costruita utilizzando il parametro BUILD_TYPE=GPL con make, e distribuita secondo i termini della GNU General Public License come pubblicata dalla Free Software Foundation; o la versione 2 della licenza o (a tua scelta) qualsiasi versione successiva. È possibile trovare una copia di questa licenza nel file LICENSE_GPLv2.md. Le build con licenza GPLv2+ forniscono supporto per:

Come costruire

Questa sezione presume che tu abbia già installato devkitA64 e libnx. In caso contrario, seguire i passaggi su devkitPro wiki.

  • Build con licenza ISC:
    1. Eseguire make BUILD_TYPE=ISC [all/release/debug] nella directory principale del progetto.
  • Build con licenza GPLv2+:
    1. Immettere la directory libntfs-3g da questo progetto ed eseguire makepkg -i --noconfirm. Questo creerà NTFS-3G per AArch64 e lo installerà nella directory portlibs da devkitPro.
      • Se stai usando Windows, devi utilizzare msys2 per questo passaggio. Puoi usare quello fornito da devkitPro (consigliato) o installarlo da solo.
    2. Torna alla directory principale del progetto ed esegui make BUILD_TYPE=GPL [all/release/debug].

Verrà generata una directory lib, contenente la libreria statica costruita.

Come usare

Questa sezione presuppone che tu abbia già creato la libreria seguendo i passaggi della sezione precedente.

  • Aggiornare il Makefile dalla tua applicazione homebrew per fare riferimento alla libreria.
    • Vengono generate due build differenti: una build di rilascio (-lusbhsfs) e una build di debug con registrazione abilitata (-lusbhsfsd).
    • Se stai utilizzando una build con licenza GPLv2+, dovrai anche collegare la tua applicazione a NTFS-3G: -lusbhsfs -lntfs-3g.
    • Nel caso in cui sia necessario segnalare eventuali bug, assicurarsi di utilizzare la build di debug e fornire il relativo file di registro.
  • Includere il file di intestazione usbhsfs.h da qualche parte nel codice.
  • Inizializza l’interfaccia host della classe di archiviazione di massa USB con usbHsFsInitialize().
  • Recuperare un puntatore all’evento di modifica dello stato UMS in modalità utente con usbHsFsGetStatusChangeUserEvent() e attendere che l’evento venga segnalato (ad esempio sotto un thread diverso).
  • Ottieni il conteggio dei dispositivi montati con usbHsFsGetMountedDeviceCount().
  • Elenca i dispositivi montati con usbHsFsListMountedDevices().
  • Eseguire operazioni di I/O utilizzando i nomi di montaggio restituiti dai dispositivi elencati.
  • Se, per qualche motivo, è necessario smontare in sicurezza un dispositivo UMS in fase di esecuzione prima di scollegarlo, utilizzare usbHsFsUnmountDevice().
  • Al termine, chiudere l’interfaccia host della classe di archiviazione di massa USB con usbHsFsExit().

Si prega di controllare sia il file di intestazione che si trova in /include/usbhsfs.h e l’applicazione di prova fornita in /example per ulteriori informazioni.

Supporto relativo al percorso

[stextbox id=’info’]Nota¹: Tutte le chiamate fsdevMount*() da libnx (e qualsiasi wrapper attorno ad esse) possono e sovrascriveranno il dispositivo devoptab predefinito se utilizzato dopo una chiamata chdir() riuscita utilizzando un percorso assoluto da un volume montato in un dispositivo UMS. Se si verifica una cosa del genere, e hai ancora bisogno di eseguire operazioni aggiuntive con percorsi relativi, chiama di nuovo chdir().[/stextbox]

[stextbox id=’info’]Nota²: Il supporto del percorso relativo non è disponibile sotto SX OS![/stextbox]

Una chiamata chdir() che utilizza un percorso assoluto a una directory da un volume montato (ad esempio "ums0:/") deve essere eseguita per cambiare sia il dispositivo devoptab predefinito che la directory di lavoro corrente. Questo ti posizionerà effettivamente nella directory fornita e tutte le operazioni di I/O eseguite con i percorsi relativi funzioneranno su di essa.

La scheda SD verrà impostata come nuovo dispositivo devoptab predefinito in due diverse condizioni:

  • Se il dispositivo UMS che contiene il volume impostato come dispositivo devoptab predefinito viene rimosso dalla console.
  • Se l’interfaccia USB Mass Storage Class Host viene chiusa tramite usbHsFsExit() e un volume da un dispositivo UMS disponibile è stato impostato come dispositivo devoptab predefinito.

Per un esempio, controllare l’applicazione di prova fornita in /example.

Changelog

  • Costruito utilizzando libnx commit c51918a.
  • Implementata l’analisi della tabella delle partizioni (MBR/GPT/VBR). La libreria ora si occupa di cercare i settori di avvio e/o le tabelle delle partizioni da sola e passa semplicemente gli LBA del volume alle librerie del file system. Ciò rende possibile montare più partizioni dalla stessa unità logica dei singoli dispositivi devoptab.
  • Implementato il supporto NTFS. Grazie mille a Rhys Koedijk!
    • Devi collegare la tua applicazione sia a libusbhsfs che a NTFS-3G se desideri utilizzare il supporto NTFS. Si prega di leggere la sezione How to build dal README per sapere come creare NTFS-3G e installarlo nella directory portlibs da devkitPro.
    • Si applicano alcune limitazioni. Si prega di leggere la sezione Limitations del README per ulteriori informazioni.
    • La doppia licenza (ISC/GPLv2 +) ora viene fornita come un modo per consentire ai progetti che non sono conformi alla licenza GPLv2+ di NTFS-3G di continuare a utilizzare libusbhsfs, anche se solo con supporto FAT. Per ulteriori informazioni, leggere la sezione Licensing nel file readme.
  • Migliorati i controlli di sicurezza in tutte le funzioni interne di devoptab.
  • Libreria API:
    • usbHsFsUnmountDevice() ora viene fornito come un modo per smontare manualmente/in sicurezza i dispositivi UMS in fase di esecuzione prima di scollegarli.
      • Questo è sempre stato gestito automaticamente da usbHsFsExit() se ci sono dispositivi UMS montati quando l’interfaccia della libreria è chiusa. Quindi, a seconda di ciò di cui hai bisogno, dovresti chiamare usbHsFsUnmountDevice() solo quando assolutamente necessario.
    • usbHsFsGetFileSystemMountFlags()usbHsFsSetFileSystemMountFlags() ora vengono forniti come un modo per ottenere/impostare i flag di montaggio del filesystem.
      • Si prega di leggere include/usbhsfs.h per ulteriori informazioni su questi flag e su cosa fanno.
      • Questi flag influenzano solo il montaggio del volume NTFS in questo momento, quindi non hanno alcun effetto nelle build della libreria con licenza ISC.
      • Inoltre, queste funzioni non hanno alcun effetto sotto SX OS.
  • Driver BOT:
    • Il comando SCSI di richiesta ora viene ritentato se viene ricevuto un CSW imprevisto senza dati di rilevamento.
    • Ora vengono filtrati sia i valori del qualificatore periferico che del tipo di dispositivo periferico dai dati di ricerca. Grazie a ginkuji per aver segnalato questo problema.
    • L’avvio dell’unità logica ora ritorna immediatamente se un comando SCSI opzionale non riesce e un codice di rilevamento aggiuntivo Medium Not Present viene segnalato dal dispositivo UMS.
    • Un ripristino del bus ora viene eseguito su tutti i dispositivi UMS che sono già disponibili quando viene chiamato usbHsFsInitialize(). Corregge l’avvio dell’unità logica per le unità che sono state arrestate durante una sessione precedente, ma non rimosse dalla console. Grazie a FlyingBananaTree per aver segnalato questo problema.
    • Corretti i potenziali problemi di danneggiamento della memoria che potevano verificarsi a causa del mancato aggiornamento dei riferimenti di contesto LUN/FS dopo la riallocazione dei buffer.
  • Build Debug:
    • Implementata una corretta memorizzazione nella cache nel codice di registrazione del debug, rendendo le build di debug molto più veloci ora.
    • Il file di registro ora viene scaricato ogni volta che viene chiamata una funzione API pubblica che genera messaggi di registro.
  • SX OS:
    • L’evento di modalità utente di cambio di stato ora viene segnalato ad ogni cambio di stato usbfs.
  • Esempi di applicazione di prova:
    • Aggiornato per riflettere tutti questi cambiamenti.
    • Aggiunti altri test sul filesystem.
    • Riscritto la gestione dell’input per abbinare la nuova API pad da libnx.
    • Ora usando usbHsFsUnmountDevice() per smontare in sicurezza tutti i dispositivi UMS che sono già stati testati.

Crediti

  • DarkMatterCore: Gestione LUN/FS del dispositivo UMS, driver BOT (Bulk-Only Transport), interfaccia libreria.
  • XorTroll: Sistema di montaggio FS, (un)registered del dispositivo devoptab, esempio di applicazione di prova.
  • Molti documenti SPC/BOT su Internet – questi sono stati referenziati in più file dalla base di codice.

Download: libusbhsfs_0.1.0-main-5015215-src.tar.bz2

Download: libusbhsfs_0.1.0-main-5015215_GPLv2.tar.bz2

Download: libusbhsfs_0.1.0-main-5015215_ISC.tar.bz2

Download: Source code libusbhsfs v0.1.0

Fonte: github.com

LASCIA UN COMMENTO

Per favore inserisci il tuo commento!
Per favore inserisci il tuo nome qui

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.