Mount a disk image split over files (chunks) in multiple directories (parts).
- Unnecessary chunks become empty (0 bytes) after TRIM.
- Unused files are closed to save system resources and update timestamps when the virtual disk is idle or under low load.
- Supports differential disks.
-
Install WinSpd.
-
Copy chunkdisk-x64.exe and winspd-x64.dll (See issues) to C:\Program Files (x86)\WinSpd\bin.
-
Merge install.reg.
-
Create a
.chunkdisk
file. For example:107374182400 104857600 512 C:\part1 512 C:\part2
-
Create directories specified in the file, for example: C:\part1, C:\part2.
-
Right-click the file in File Explorer and choose "Mount".
-
Run
diskmgmt.msc
to open Disk Management, initialize the disk and create a partition. -
To dismount, right-click the drive in File Explorer and choose "Eject".
- The
.chunkdisk
file is read once. It can be modified and even deleted by other applications. - Don't modify, add, remove and move around chunk files. They are not write-protected even when being used by chunkdisk. Changes outside chunkdisk may not be visible to the virtual disk, cause I/O errors or even corrupt the file system.
chunkdisk places a .lock
file to every part directory to prevent mounting the same disk twice, which will be removed upon exit. If -W 0
option (mount as read-only) is given you have to remove it on your own to mount the disk again with -W 1
option.
{disk size in bytes}
{chunk file size in bytes}
{max. number of chunks} {absolute path to a directory}
...
- UTF-8 encoding
- Disk size and chunk size must be a multiple of 4096. NOTE: for performance choose cluster size not less than 4096 bytes.
- The sum of max. number of chunks must be at least (Disk size) / (Chunk size) + surplus (0 ~ 1).
- winspd-x64.dll is not compatible with the original to workaround an issue. Specifically, invoking
SpdStorageUnitSendResponse()
orSpdIoctlTransact()
leads to an undefined behavior. It's fine with the current WinSpd binaries though. The source code is available here. - Random I/O performance is not great with NVMe SSDs.
-
A chunk file is created in directories from top to bottom in
.chunkdisk
file when it is written by the virtual disk. It is zero-initialized so it may take time if the chunk size is large. You may specify different drives for different parts. Make sure disk spaces are sufficient for new chunks. -
If you want to place specific chunk to specific part, you may create an empty chunk file in that part in prior while the disk is not mounted. A chunk (a region of the virtual disk) has three states. The corresponding file (
chunk###
) may not exist, be empty (zero bytes) and be of full size. Data of a region is zero if its backing chunk file does not exist or is empty. -
You may move chunk files to different parts to redistribute the space usage while the disk is not mounted.
-
When a file in the virtual disk gets deleted the corresponding chunk file may become empty if it is larger than the chunk size. This is done via SCSI UNMAP command (a.k.a. TRIM) requested by Windows.
-
You can identify the file in disk for specific chunk or identify the chunk used by specific file. Use
fsutil volume querycluster
for the former,fsutil file queryextents
for the latter. Usediskpart
to know the partition offset. For NTFS volumes the cluster size is typically 4096 and LCN 0 corresponds to offset from 0 (inclusive) to 4096 (exclusive) of the partition.
.chunkdisk
file specs for differential disks:
{absolute path to the parent disk}
{disk size in bytes}
{chunk file size in bytes}
{max. number of chunks} {absolute path to a directory}
...
The parent disk can be either non-differential or differential. The disk size and chunk file size should be equal for all involving .chunkdisk
. Every part directory should be unique. Parent disks are mounted as read-only (as if -W 0
option is given). Disks mounted as read-only can be shared over multiple running instances.
You may discard or merge the differential disk. To merge, first make sure the differential disk and its parent are not mounted. Then remove .lock
files in all parts of the parent disk (to mount it later with -W 1
option); move and overwite all chunk files to the parent disk. The other differential disks based on it should be discarded.