Skip to main content

A wrapper of DwarFS command line utility

Project description

PyDwarfs

A wrapper of DwarFS command line utilities.

DwarFS is stands for Deduplicating Warp-speed Advanced Read-only File System, it is a fast high compression read-only file system for Linux and Windows. See this project's homepage.

Note: This project currently does not provide support for Windows version of DwarFS command line utility.

Features / TODO

  • Mount/unmount a DwarFS image file to specified mountpoint (dwarfs/mount.dwarfs)
  • Extract a DwarFS image file (dwarfsextract, initially implemented)
  • Create a DwarFS image file (mkdwarfs)
  • Check a DwarFS image file (dwarfsck)
  • Performance test (dwarfsbench)

Install

Just run the command: pip install pydwarfs.

Or you can download and install the wheel file from release page manually.

Examples

The following examples are for the more common uses of command line utilities.

Mount/unmount a DwarFS image file to specified mountpoint

Check if a path is a DwarFS mountpoint

>>> from pydwarfs.dwarfs import DwarFS
>>> DwarFS.isDwarFSMountPoint(this_is_dwarfs_mnt)
True
>>> DwarFS.isDwarFSMountPoint('/path/to/non-mnt')
False
>>> DwarFS.isDwarFSMountPoint('/proc')  # Obviously not a DwarFS mountpoint
False
>>>

List all of DwarFS mountpoint

>>> DwarFS.listAllDwarFSMountPoints()
[MountPoint(source='dwarfs', target=PosixPath('/path/to/dwarfs/image/mountpoint'), fstype='fuse.dwarfs', options=('rw', 'nosuid', 'nodev', 'relatime', 'user_id=1000', 'group_id=1000'), freq=0, passno=0), ...]
>>>

Create a DwarFS instance

In the default case, Dwarfs.init() will find the location of dwarfs command via shutil.which().

>>> from pydwarfs.dwarfs import DwarFS
>>> dwarfs = Dwarfs.init()
>>> dwarfs.executable
'/usr/bin/dwarfs'
>>>

If the DwarFS command line utilities are not installed, you can specify a location of dwarfs command instead.

>>> from pydwarfs.dwarfs import DwarFS
>>> dwarfs = Dwarfs.init('/path/to/valid/dwarfs')
>>> dwarfs.executable
'/path/to/valid/dwarfs'
>>>

A simple mount

>>> dwarfs.mount('/path/to/source.dwarfs', '/path/to/destination/directory')
>>>

To check if the mount was actually successful, exit the Python REPL and run the following command:

$ > findmnt /path/to/destination/directory
TARGET                         SOURCE FSTYPE      OPTIONS
/path/to/destination/directory dwarfs fuse.dwarfs rw,nosuid,nodev,relatime,user_id=1000,group_id=1000
$ >

Mount with some specified options

Use the dedicated attribute class DwarFSMountOptions:

>>> from pydwarfs.dwarfs import DwarFS, DwarFSMountOptions
>>> dwarfs = Dwarfs.init()
>>> options1 = DwarFSMountOptions(cachefile='32M', readonly=True, debuglevel='debug')
>>> dwarfs.mount('/path/to/source.1.dwarfs', '/path/to/destination/directory.1', options)
I 04:06:32.182380 [dwarfs_main.cpp:1328] dwarfs (v0.7.4, fuse version 35)
D 04:06:32.182909 [filesystem_v2.cpp:482] found valid section index
D 04:06:32.182927 [filesystem_v2.cpp:493] section BLOCK @ 64 [16,669,939 bytes]
...
D 04:06:32.191025 [filesystem_v2.cpp:515] read 734 blocks and 175,158 bytes of metadata
I 04:06:32.191041 [dwarfs_main.cpp:1144] file system initialized [8.624ms]
>>>

Or simply specify options by dict and **kwargs:

>>> from pydwarfs.dwarfs import DwarFS, DwarFSMountOptions
>>> dwarfs = Dwarfs.init()
>>> options2 = {'cachefile': '16M', 'readonly': True}
>>> dwarfs.mount('/path/to/source.2.dwarfs', '/path/to/destination/directory.2', options, debuglevel='debug')
I 04:14:01.981335 [dwarfs_main.cpp:1328] dwarfs (v0.7.4, fuse version 35)
D 04:14:01.983736 [filesystem_v2.cpp:482] found valid section index
D 04:14:01.983753 [filesystem_v2.cpp:493] section BLOCK @ 64 [67,097,028 bytes]
...
D 04:14:01.984644 [filesystem_v2.cpp:515] read 7 blocks and 2,755 bytes of metadata
I 04:14:01.984656 [dwarfs_main.cpp:1144] file system initialized [3.27ms]
>>>

Unmount

>>> dwarfs.unmount('/path/to/destination/directory')
>>>

Unmount by the method umount instead of the default fusermount:

>>> dwarfs.unmount('/path/to/destination/directory.1', method='umount')
>>>

You can forcely unmount by add the argument lazy_unmount=True:

>>> dwarfs.unmount('/path/to/destination/directory.2', lazy_unmount=True)
>>>

Extract a DwarFS image file

A simple extraction

>>> import os
>>> from pydwarfs.dwarfsextract import DwarFSExtract
>>> dwarfsextract = DwarFSExtract.init()
>>> output_dir = '/path/to/dest/directory'
>>> dwarfsextract.extract('/path/to/image.dwarfs', output_dir)
>>>
>>> os.listdir(output_dir)
['dataWin', 'Sakuna.exe', 'steam_appid.txt', 'xaudio2_9redist.dll', ...]
>>>

Note: The path pointed to by output_dir must be an existing directory.

Extract image file with progress

>>> another_output_dir = '/path/to/another/output/directory'
>>> for progress in dwarfsextract.extract('/path/to/image.dwarfs', another_output_dir, yield_progress=True):
...     print(progress)
...
100
99
98
...
2
1
0
>>> os.listdir(another_output_dir)
['dataWin', 'Sakuna.exe', 'steam_appid.txt', 'xaudio2_9redist.dll', ...]
>>>

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pydwarfs-0.3.1.tar.gz (10.7 kB view details)

Uploaded Source

Built Distribution

pydwarfs-0.3.1-py3-none-any.whl (10.4 kB view details)

Uploaded Python 3

File details

Details for the file pydwarfs-0.3.1.tar.gz.

File metadata

  • Download URL: pydwarfs-0.3.1.tar.gz
  • Upload date:
  • Size: 10.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for pydwarfs-0.3.1.tar.gz
Algorithm Hash digest
SHA256 7131c4e22a2ef775c7ac6d17863a0552680d2b2d0bf294f2805d5b2812e2561a
MD5 022e5155b6a9404116ebbc86537320a6
BLAKE2b-256 0476cec7c56f567be2cd4341e1f8a131c5421e66e1b31683844da4944bac0664

See more details on using hashes here.

File details

Details for the file pydwarfs-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: pydwarfs-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 10.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for pydwarfs-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 2df6b0da7b9103cf3a895b85dbe4429c177b1ec38609ca062e7f1b6ad081c0fb
MD5 764f739b571c1e31bccec4f0d0f04b1e
BLAKE2b-256 af93152c0001c8033fb8a0469b4de0fec358f2a8f022b2d23599f1c1927710c8

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page