FUSE filesystem Python scripts for Nintendo console files
MIT License
ninfs (formerly fuse-3ds) is a FUSE program to extract data from Nintendo game consoles. It works by presenting a virtual filesystem with the contents of your games, NAND, or SD card contents, and you can browse and copy out just the files that you need.
Windows, macOS, and Linux are supported.
For 3DS types, The ARM9 BootROM is required. You can dump it using boot9strap, which can be set up by 3DS Hacks Guide. To dump Boot9, follow the steps on wiki.hacks.guide.
Boot9 is checked in order of:
--boot9
argument (if set)BOOT9_PATH
environment variable (if set)%APPDATA%\3ds\boot9.bin
(Windows-specific)~/Library/Application Support/3ds/boot9.bin
(macOS-specific)~/.3ds/boot9.bin
~/3ds/boot9.bin
For historical reasons, boot9_prot.bin
can also be used in all of these locations.
"~
" means the user's home directory. "~/3ds
" would mean /Users/username/3ds
on macOS and C:\Users\username\3ds
on Windows.
CDN, CIA, and NCCH mounting may need SeedDB for mounting NCCH containers of newer games (2015+) that use seeds. SeedDB is checked in order of:
--seeddb
argument (if set)SEEDDB_PATH
environment variable (if set)%APPDATA%\3ds\seeddb.bin
(Windows-specific)~/Library/Application Support/3ds/seeddb.bin
(macOS-specific)~/.3ds/seeddb.bin
~/3ds/seeddb.bin
Python 3.8.0 or later is required.
Windows 10 or later is recommended. Windows 7 and 8.1 may continue to work until ninfs's dependencies stop working on it.
An installer is provided in releases. It includes both ninfs and WinFsp, which is installed if required.
A standalone zip is also provided in releases. WinFsp must be installed separately.
py -3 -m pip install --upgrade https://github.com/ihaveamac/ninfs/archive/2.0.zip
Official support for Windows on ARM will come eventually. In the meantime, running the x86 version has been tested and seems to work properly. Make sure to install the latest WinFSP version with ARM64 support.
Versions of macOS supported by Apple are highly recommended. macOS Sierra is the oldest version that should work. macFUSE or fuse-t is required.
A standalone build is provided in releases. macFUSE or fuse-t must still be installed separately. Releases are built for Intel and Apple Silicon, signed and notarized by Apple.
python3 -m pip install --upgrade https://github.com/ihaveamac/ninfs/archive/2.0.zip
ninfs is available in the AUR: normal, with gui, git, git with gui
python3 -m pip install --upgrade --user https://github.com/ihaveamac/ninfs/archive/2.0.zip
--user
is not needed if you are using a virtual environment.python3 -m ninfs --install-desktop-entry
. If you want to install to a location other than the default ($XDG_DATA_HOME
), you can add another argument with a path like /usr/local/share
.python3-tk
. On Fedora this is python3-tkinter
.A GUI can be used by specifying the type to be gui
(e.g. Windows: py -3 -mninfs gui
, Linux/macOS: python3 -mninfs gui
). The GUI controls mounting and unmounting.
Run a mount script by using "mount_<type>
" (e.g. mount_cci game.3ds mountpoint
). Use -h
to view arguments for a script.
If it doesn't work, the other way is to use <python-cmd> -mninfs <type>
(e.g. Windows: py -3 -mninfs cci game.3ds mountpoint
, Linux/macOS: python3 -mninfs cci game.3ds mountpoint
).
Windows users can use a drive letter like F:
as a mountpoint, or use *
and a drive letter will be automatically chosen.
Developer-unit contents are encrypted with different keys, which can be used with --dev
with CCI, CDN, CIA, NANDCTR, NCCH, and SD. These are less tested and may have bugs due to unknown differences between retail and dev files.
diskutil unmount /path/to/mount
fusermount -u /path/to/mount
mount_cci game.3ds mountpoint
mount_cdn cdn_directory mountpoint
mount_cdn --dec-key 3E3E6769742E696F2F76416A65423C3C cdn_directory mountpoint
mount_cia game.cia mountpoint
mount_exefs exefs.bin mountpoint
essential.exefs
embedded:mount_nandctr nand.bin mountpoint
mount_nandctr --otp otp.bin nand.bin mountpoint
mount_nandctr --otp otp.bin --cid nand_cid.bin nand.bin mountpoint
mount_nandctr --otp otp.bin --cid 7468616E6B7334636865636B696E6721 nand.bin mountpoint
mount_nandtwl --console-id 5345445543454D45 nand_dsi.bin mountpoint
mount_nandtwl --console-id 5345445543454D45 --cid 576879446F657344536945786973743F nand_dsi.bin mountpoint
mount_nandtwl --console-id ConsoleID.bin --cid CID.bin nand_dsi.bin mountpoint
mount_nandbb nand.bin mountpoint
mount_nandhac --keys prod.keys rawnand.bin mountpoint
mount_nandhac --keys prod.keys -S rawnand.bin.00 mountpoint
mount_nandhac --keys prod.keys --partition SYSTEM SYSTEM.bin mountpoint
mount_ncch content.cxi mountpoint
mount_romfs romfs.bin mountpoint
Nintendo 3DS
directory from an SD card:mount_sd --movable movable.sed "/path/to/Nintendo 3DS" mountpoint
Nintendo 3DS
directory from an SD card with an SD key hexstring:mount_sd --sd-key 504C415900000000504F4B454D4F4E21 "/path/to/Nintendo 3DS" mountpoint
mount_nds
also works):mount_srl game.nds mountpoint
mount_threedsx boot.3dsx mountpoint
ninfs
is under the MIT license.
fuse.py
is under the ISC license (taken from setup.py
).Special thanks to @Jhynjhiruu for adding support for iQue Player NAND backups.
Special thanks to @Stary2001 for help with NAND crypto (especially TWL), and @d0k3 for SD crypto.
OTP code is from Stary2001/3ds_tools, and is under the MIT license.