How to Access Linux Ext4 partitions in Windows using WSL (great for reading Raspberry Pi microSD cards)

I have a dual boot system with both Windows 11 and Ubuntu 24.04 installed, WSL2 also with Ubuntu 24.04 and a Virtual Box installation of Ubuntu 24.04 installed on the Windows system. It would be convenient to mount/access the two NVMe drives on the Linux OS side within Windows. Is there a similar kernel build process that would expose the Linux NVMe drives to Windows or do I need something like the Paragon Software Group product?
 
I have a dual boot system with both Windows 11 and Ubuntu 24.04 installed, WSL2 also with Ubuntu 24.04 and a Virtual Box installation of Ubuntu 24.04 installed on the Windows system. It would be convenient to mount/access the two NVMe drives on the Linux OS side within Windows. Is there a similar kernel build process that would expose the Linux NVMe drives to Windows or do I need something like the Paragon Software Group product?
This tutorial should work with accessing Linux partitions on internal drives, but you won't need to use the usbipd steps.
 
Ran into a problem, not sure how to proceed

sudo make modules_install -j$(nproc)
arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support
sed: can't read modules.order: No such file or directory
make: *** [Makefile:1544: __modinst_pre] Error 2

modules.order is an empty file

More info

sudo make -j$(nproc)

arch/x86/kernel/smp.o: warning: objtool: sysvec_reboot()+0x4d: unreachable instruction

net/ipv4/netfilter/ipt_ECN.c:26:46: warning: ‘struct ipt_ECN_info’ declared inside parameter list will not be visible outside of this definition or declaration
26 | set_ect_ip(struct sk_buff *skb, const struct ipt_ECN_info *einfo)
| ^~~~~~~~~~~~
net/ipv4/netfilter/ipt_ECN.c: In function ‘set_ect_ip’:
net/ipv4/netfilter/ipt_ECN.c:30:51: error: invalid use of undefined type ‘const struct ipt_ECN_info’
30 | if ((iph->tos & IPT_ECN_IP_MASK) != (einfo->ip_ect & IPT_ECN_IP_MASK)) {
| ^~
net/ipv4/netfilter/ipt_ECN.c:37:35: error: invalid use of undefined type ‘const struct ipt_ECN_info’
37 | iph->tos |= (einfo->ip_ect & IPT_ECN_IP_MASK);
| ^~
net/ipv4/netfilter/ipt_ECN.c: At top level:
net/ipv4/netfilter/ipt_ECN.c:45:47: warning: ‘struct ipt_ECN_info’ declared inside parameter list will not be visible outside of this definition or declaration
45 | set_ect_tcp(struct sk_buff *skb, const struct ipt_ECN_info *einfo)
| ^~~~~~~~~~~~
net/ipv4/netfilter/ipt_ECN.c: In function ‘set_ect_tcp’:
net/ipv4/netfilter/ipt_ECN.c:55:21: error: invalid use of undefined type ‘const struct ipt_ECN_info’
55 | if ((!(einfo->operation & IPT_ECN_OP_SET_ECE) ||
| ^~
net/ipv4/netfilter/ipt_ECN.c:55:35: error: ‘IPT_ECN_OP_SET_ECE’ undeclared (first use in this function); did you mean ‘IPT_ECN_OP_MATCH_ECE’?
55 | if ((!(einfo->operation & IPT_ECN_OP_SET_ECE) ||
| ^~~~~~~~~~~~~~~~~~
| IPT_ECN_OP_MATCH_ECE
net/ipv4/netfilter/ipt_ECN.c:55:35: note: each undeclared identifier is reported only once for each function it appears in
net/ipv4/netfilter/ipt_ECN.c:56:32: error: invalid use of undefined type ‘const struct ipt_ECN_info’
56 | tcph->ece == einfo->proto.tcp.ece) &&
| ^~
net/ipv4/netfilter/ipt_ECN.c:57:21: error: invalid use of undefined type ‘const struct ipt_ECN_info’
57 | (!(einfo->operation & IPT_ECN_OP_SET_CWR) ||
| ^~
net/ipv4/netfilter/ipt_ECN.c:57:35: error: ‘IPT_ECN_OP_SET_CWR’ undeclared (first use in this function); did you mean ‘IPT_ECN_OP_MATCH_CWR’?
57 | (!(einfo->operation & IPT_ECN_OP_SET_CWR) ||
| ^~~~~~~~~~~~~~~~~~
| IPT_ECN_OP_MATCH_CWR
net/ipv4/netfilter/ipt_ECN.c:58:32: error: invalid use of undefined type ‘const struct ipt_ECN_info’
58 | tcph->cwr == einfo->proto.tcp.cwr))
| ^~
net/ipv4/netfilter/ipt_ECN.c:66:18: error: invalid use of undefined type ‘const struct ipt_ECN_info’
66 | if (einfo->operation & IPT_ECN_OP_SET_ECE)
| ^~
net/ipv4/netfilter/ipt_ECN.c:67:34: error: invalid use of undefined type ‘const struct ipt_ECN_info’
67 | tcph->ece = einfo->proto.tcp.ece;
| ^~
net/ipv4/netfilter/ipt_ECN.c:68:18: error: invalid use of undefined type ‘const struct ipt_ECN_info’
68 | if (einfo->operation & IPT_ECN_OP_SET_CWR)
| ^~
net/ipv4/netfilter/ipt_ECN.c:69:34: error: invalid use of undefined type ‘const struct ipt_ECN_info’
69 | tcph->cwr = einfo->proto.tcp.cwr;
| ^~
net/ipv4/netfilter/ipt_ECN.c: In function ‘ecn_tg’:
net/ipv4/netfilter/ipt_ECN.c:81:18: error: invalid use of undefined type ‘const struct ipt_ECN_info’
81 | if (einfo->operation & IPT_ECN_OP_SET_IP)
| ^~
net/ipv4/netfilter/ipt_ECN.c:81:32: error: ‘IPT_ECN_OP_SET_IP’ undeclared (first use in this function); did you mean ‘IPT_ECN_OP_MATCH_IP’?
81 | if (einfo->operation & IPT_ECN_OP_SET_IP)
| ^~~~~~~~~~~~~~~~~
| IPT_ECN_OP_MATCH_IP
net/ipv4/netfilter/ipt_ECN.c:82:38: error: passing argument 2 of ‘set_ect_ip’ from incompatible pointer type [-Werror=incompatible-pointer-types]
82 | if (!set_ect_ip(skb, einfo))
| ^~~~~
| |
| const struct ipt_ECN_info *
net/ipv4/netfilter/ipt_ECN.c:26:60: note: expected ‘const struct ipt_ECN_info *’ but argument is of type ‘const struct ipt_ECN_info *’
26 | set_ect_ip(struct sk_buff *skb, const struct ipt_ECN_info *einfo)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
net/ipv4/netfilter/ipt_ECN.c:85:18: error: invalid use of undefined type ‘const struct ipt_ECN_info’
85 | if (einfo->operation & (IPT_ECN_OP_SET_ECE | IPT_ECN_OP_SET_CWR) &&
| ^~
net/ipv4/netfilter/ipt_ECN.c:85:33: error: ‘IPT_ECN_OP_SET_ECE’ undeclared (first use in this function); did you mean ‘IPT_ECN_OP_MATCH_ECE’?
85 | if (einfo->operation & (IPT_ECN_OP_SET_ECE | IPT_ECN_OP_SET_CWR) &&
| ^~~~~~~~~~~~~~~~~~
| IPT_ECN_OP_MATCH_ECE
net/ipv4/netfilter/ipt_ECN.c:85:54: error: ‘IPT_ECN_OP_SET_CWR’ undeclared (first use in this function); did you mean ‘IPT_ECN_OP_MATCH_CWR’?
85 | if (einfo->operation & (IPT_ECN_OP_SET_ECE | IPT_ECN_OP_SET_CWR) &&
| ^~~~~~~~~~~~~~~~~~
| IPT_ECN_OP_MATCH_CWR
net/ipv4/netfilter/ipt_ECN.c:87:39: error: passing argument 2 of ‘set_ect_tcp’ from incompatible pointer type [-Werror=incompatible-pointer-types]
87 | if (!set_ect_tcp(skb, einfo))
| ^~~~~
| |
| const struct ipt_ECN_info *
net/ipv4/netfilter/ipt_ECN.c:45:61: note: expected ‘const struct ipt_ECN_info *’ but argument is of type ‘const struct ipt_ECN_info *’
45 | set_ect_tcp(struct sk_buff *skb, const struct ipt_ECN_info *einfo)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
net/ipv4/netfilter/ipt_ECN.c: In function ‘ecn_tg_check’:
net/ipv4/netfilter/ipt_ECN.c:98:18: error: invalid use of undefined type ‘const struct ipt_ECN_info’
98 | if (einfo->operation & IPT_ECN_OP_MASK)
| ^~
net/ipv4/netfilter/ipt_ECN.c:98:32: error: ‘IPT_ECN_OP_MASK’ undeclared (first use in this function); did you mean ‘IPT_ECN_IP_MASK’?
98 | if (einfo->operation & IPT_ECN_OP_MASK)
| ^~~~~~~~~~~~~~~
| IPT_ECN_IP_MASK
net/ipv4/netfilter/ipt_ECN.c:101:18: error: invalid use of undefined type ‘const struct ipt_ECN_info’
101 | if (einfo->ip_ect & ~IPT_ECN_IP_MASK)
| ^~
net/ipv4/netfilter/ipt_ECN.c:104:19: error: invalid use of undefined type ‘const struct ipt_ECN_info’
104 | if ((einfo->operation & (IPT_ECN_OP_SET_ECE|IPT_ECN_OP_SET_CWR)) &&
| ^~
net/ipv4/netfilter/ipt_ECN.c:104:34: error: ‘IPT_ECN_OP_SET_ECE’ undeclared (first use in this function); did you mean ‘IPT_ECN_OP_MATCH_ECE’?
104 | if ((einfo->operation & (IPT_ECN_OP_SET_ECE|IPT_ECN_OP_SET_CWR)) &&
| ^~~~~~~~~~~~~~~~~~
| IPT_ECN_OP_MATCH_ECE
net/ipv4/netfilter/ipt_ECN.c:104:53: error: ‘IPT_ECN_OP_SET_CWR’ undeclared (first use in this function); did you mean ‘IPT_ECN_OP_MATCH_CWR’?
104 | if ((einfo->operation & (IPT_ECN_OP_SET_ECE|IPT_ECN_OP_SET_CWR)) &&
| ^~~~~~~~~~~~~~~~~~
| IPT_ECN_OP_MATCH_CWR
net/ipv4/netfilter/ipt_ECN.c: At top level:
net/ipv4/netfilter/ipt_ECN.c:116:34: error: invalid application of ‘sizeof’ to incomplete type ‘struct ipt_ECN_info’
116 | .targetsize = sizeof(struct ipt_ECN_info),
| ^~~~~~
CC lib/kasprintf.o
cc1: some warnings being treated as errors
make[3]: *** [scripts/Makefile.build:289: net/ipv4/netfilter/ipt_ECN.o] Error 1
make[2]: *** [scripts/Makefile.build:552: net/ipv4/netfilter] Error 2
make[1]: *** [scripts/Makefile.build:552: net/ipv4] Error 2
make[1]: *** Waiting for unfinished jobs....


and

make[2]: *** No rule to make target 'net/netfilter/xt_HL.o', needed by 'net/netfilter/built-in.a'. Stop.
make[2]: *** Waiting for unfinished jobs....


and

make[1]: *** [scripts/Makefile.build:552: net/netfilter] Error 2
make: *** [Makefile:1907: net] Error 2
make: *** Waiting for unfinished jobs....
CC drivers/input/serio/serport.o
CC drivers/usb/core/usb.o
CC drivers/input/serio/serio_raw.o
CC fs/xfs/scrub/health.o
AR drivers/usb/phy/built-in.a
CC fs/xfs/scrub/ialloc.o
CC drivers/input/serio/hyperv-keyboard.o
AR drivers/scsi/built-in.a
CC fs/xfs/scrub/inode.o
CC fs/xfs/scrub/parent.o
CC fs/xfs/scrub/refcount.o
CC drivers/usb/core/hub.o
CC drivers/usb/core/hcd.o
drivers/net/wireguard/allowedips.c: In function ‘root_free_rcu’:
drivers/net/wireguard/allowedips.c:67:1: warning: the frame size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-than=]
67 | }
| ^
drivers/net/wireguard/allowedips.c: In function ‘root_remove_peer_lists’:
drivers/net/wireguard/allowedips.c:80:1: warning: the frame size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-than=]
80 | }
| ^
 
Last edited: