Fastest Way to Copy Ext4 Formatted Data to FreeBSD Using WSL2 as an Intermediary
Published: Jan 25, 2026
I run immich on a very old dell laptop with 100mbps ethernet with USB connected disks for data. The disks are formatted ext4 and the dell runs fedora. (Immich doesn’t run on FreeBSD yet. :( ). When the disk was full, I wanted to use my FreeBSD server as the data drive over NFS. And retire the USB disks. This required copying about 500GB of data from the USB disk to my FreeBSD server before I could switch over.
The first natural idea was to use use rsync. I quickly figured though that the max speed of copy was 5MB/s probably because of 100Mbps ethernet port.
The second idea then was to bring the USB disk to the FreeBSD server and mount it there. Because FreeBSD doesn’t directly have NTFS drivers in the kernel for ext4, I used I seem to have used fusefs-ext4fuse. That bumped the speed to 13MB/s over USB 3.0. That was still too slow. I also learnt the FreeBSD has fusefs-ext2 but it only works for ext2, even though ext2fs has a native kernel module.fuse-ext2 -o async,noatime /dev/da0s1 /mnt/usb which again gave me 12MB/s, too slow a speed.1
While researching, I figured there was another way that was very strange. It suggested using WSL2. Very curious, I decided to give it a shot. This is how I did it.2
- Connect the disk to a Windows box.
- Because Windows doesn’t understand ext4 natively, run this in PowerShell (Admin mode) to see if it’s connected:
get-ciminstance -query "select * from Win32_DiskDrive"
The output will be something like:
DeviceID Caption Partitions Size Model
---
\\.\PHYSICALDRIVE0 Samsung SSD 840 EVO 250GB 3 250056737280 Samsung SSD 840 EVO 250GB
\\.\PHYSICALDRIVE1 KINGSTON SNV3S1000G 5 1000202273280 KINGSTON SNV3S1000G
\\.\PHYSICALDRIVE2 TOSHIBA External USB 3.0 USB Device 1 1000202273280 TOSHIBA External USB 3.0 USB Dev…
Note the DeviceID. In my case, it was connected as PHYSICALDRIVE2.
- So to mount it in WSL2, you’d run, in the same Admin PowerShell Console:
WSL2 --mount \\.\PHYSICALDRIVE2 --PARTITION 1
If you get an error like this, its just that you’re not running the command in PowerShell Admin mode:
Failed to attach disk '\\.\PHYSICALDRIVE2' to WSL22: Error: 0x80040315
Error code: WSL2/Service/AttachDisk/MountDisk/WSL2_E_ELEVATION_NEEDED_TO_MOUNT_DISK
- Once the above command runs without error, open a WSL2 window and type this:
lsblk
- Based on the output of lsblk, you could then mount the disk in WSL2 like this:
sudo mount /dev/sd1 /mnt/usb_disk
assuming /sd1 is your partition and the mount point is /mnt/usb_disk (you need to create the mountpoint before running the command).
- Once I did that, I ran an rsync from within WSL2 to my NAS. I couldn’t believe my eyes, when the speed of copy went to 50-70 MB/s!
Apparently this is because WSL2 runs a proper/genuine Linux kernel so there’s no other layer to disrupt the flow.
Pleasantly surprised that Windows and WSL2 helped me today with my Linux to FreeBSD data transfer! Wonder what this says about WSL2’s development and progress so far…
😳
-
After this post went out, vermaden found me on the intertubes and showed that there was no problem coping from ext4 to freebsd (kudos to him!). Then I figured I’d used,
fuse-ext2 -o async,noatime /dev/da0s1 /mnt/usbwhich is slow at 12MB/s instead ofmount -t ext2fs /dev/da0s1 /mnt/usbwhich is fast at 60MB/s. For reading purposes, you could use ext2 drivers to correctly read ext4 formatted data. vermaden suggests to uselklfuse -o type=ext4from thefusefs-lklpackage where you get optimal results. ↩︎ -
WSL version: Linux 6.6.87.2-microsoft-standard-WSL2; PowerShell: 7.4.2; FreeBSD: 15.0-RELEASE-P1; LAN is gigabit ethernet. ↩︎