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 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.

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 it1.

  1. Connect the disk to a Windows box.
  2. 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.

  1. 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
  1. Once the above command runs without error, open a WSL2 window and type this:
lsblk
  1. 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).

  1. 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…

😳

[web] · [in] · [fb] · [ig] · [x] · [tt] · [yt]

  1. WSL version: Linux 6.6.87.2-microsoft-standard-WSL2; PowerShell: 7.4.2; FreeBSD: 15.0-RELEASE-P1; LAN is gigabit ethernet. ↩︎


Previous Post