我在 Windows 10 系统上使用 Windows Subsystem for Linux (WSL1),并尝试删除全部数据从 USB 设备,并覆盖与伪随机数以下本教程(只发现德文版,但对于这个问题来说并不重要),但无法加载所需的内核模块。
当我尝试加载 dm-crypt 时,我得到了
$ sudo modprobe dm-crypt
modprobe: ERROR: ../libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file '/lib/modules/4.4.0-18362-Microsoft/modules.dep.bin'
modprobe: FATAL: Module dm-crypt not found in directory /lib/modules/4.4.0-18362-Microsoft
我认为我的 Ubuntu 版本只是缺少模块 dm-crypt。
现在我的问题是:WSL 是否通常支持内核子系统 dm-crypt?
我正在使用带有 64 位 Ubuntu 18.04 LTS 的 WSL1。
更新:
我再次尝试使用 WSL2 和 Ubuntu 18.04 LTS,但收到相同的错误消息:
$ sudo modprobe dm-crypt
modprobe: ERROR: ../libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file '/lib/modules/4.4.0-19013-Microsoft/modules.dep.bin'
modprobe: FATAL: Module dm-crypt not found in directory /lib/modules/4.4.0-19013-Microsoft
答案1
我无法保证 WSL1 的安全性,但看起来 WSL2 支持它,因为它运行的是完整的 Linux 内核。事实上,我刚刚尝试加载 dm-crypt 模块并成功了。
您必须先启用 WSL2。截至撰写本文时,它仅对 Windows Insiders 可用:https://docs.microsoft.com/en-us/windows/wsl/wsl2-install
然后您必须编译自己的自定义内核才能获得 dm-crypt 支持:https://github.com/microsoft/WSL2-Linux-Kernel/blob/master/README-Microsoft.WSL2
安装 git 和一些编译器:
$ sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses5-dev git
克隆 Microsoft WSL2 内核:
$ git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
$ cd WSL2-Linux-Kernel
您必须选择加密功能。我使用了菜单:
$ export KCONFIG_CONFIG=Microsoft/config-wsl
$ make menuconfig
[*] Enable loadable module support
Device Drivers --->
[*] Multiple devices driver support (RAID and LVM) --->
<*> Device mapper support
<M> Crypt target support
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
Device Drivers --->
[*] Block Devices --->
<*> Loopback device support
File systems --->
<*> FUSE (Filesystem in Userspace) support
以及您想要的任何算法......
[*] Cryptographic API --->
<*> XTS support
<*> SHA224 and SHA256 digest algorithm
<*> AES cipher algorithms
<*> AES cipher algorithms (x86_64)
<*> User-space interface for hash algorithms
<*> User-space interface for symmetric key cipher algorithms
<*> RIPEMD-160 digest algorithm
<*> SHA384 and SHA512 digest algorithms
<*> Whirlpool digest algorithms
<*> LRW support
<*> Serpent cipher algorithm
<*> Twofish cipher algorithm
对于您想做的事情,您必须选择“XTS 支持“ 在下面 ”加密 API“。
保存您的配置然后编译内核:
$ sudo make && make modules_install
然后将新映像复制到 Windows 主机。我的映像文件名为 bzImage:
$ cp arch/x86_64/boot/bzImage /mnt/c/Users/your-user-name/
在 Windows 主机的“Users\your-user-name”文件夹中创建一个名为“.wslconfig”的文件(请注意前面的点 .)。我使用了 Notepad++。在其中输入以下几行:
[wsl2]
kernel=C:\\Users\\your-user-name\\bzImage
swap=0
localhostForwarding=true
退出您的 WSL2 实例,然后重新启动您的 WSL2 实例(使用 Powershell):
> wsl --shutdown
再次打开 WSL2 bash 会话并尝试加载 dm-crypt 模块:
$ sudo modprobe -v dm_crypt
insmod /lib/modules/4.19.81-microsoft-standard/kernel/drivers/md/dm-crypt.ko
更新 1:
关于对块设备的访问,嗯......截至撰写本文时,微软似乎仍在努力解决这个问题:https://github.com/Microsoft/WSL/issues/689
希望有帮助:)
更新2:
您可以通过 USB/IP 或 iSCSI 协议将主机的 USB 驱动器提供给 WSL2,从而解决 WSL2 上的块设备限制。我尝试了 USP/IP,但由于我的 USB 设备被归类为“集线器”,因此遇到了太多麻烦。因此,我尝试了 iSCSI 方法,即在我的 Windows 主机上创建一个 iSCSI 目标,然后从我的 WSL2 实例连接到它。
我使用了 TalAloni 的 github 存储库上的“iSCSIConsole”应用程序:https://github.com/TalAloni/iSCSIConsole创建目标。
您必须以管理员权限运行它才能连接物理磁盘(例如 USB 驱动器)。您可能还必须允许它通过 Windows 主机防火墙,才能使其与 WSL2 实例通信。我使用默认 iSCSI 目标名称“iqn.1991-05.com.microsoft:target1”连接了我的 USB 拇指驱动器。
运行后,您可以从 WSL2 实例连接到它。
首先,你必须确保已为自定义 WSL2 内核加载了 iSCSI 驱动程序模块。我在内核配置菜单中启用了它,然后重新编译:
$ KCONFIG_CONFIG=Microsoft/config-wsl make menuconfig
[*] Networking support --->
Networking options --->
[*] TCP/IP networking
Device Drivers --->
SCSI device support --->
<*> SCSI device support --->
<*> SCSI disk support
<*> SCSI generic support
SCSI Transports --->
<M> iSCSI Transport Attributes
[*] SCSI low-level drivers --->
<M> iSCSI Initiator over TCP/IP
$ sudo make && make modules_install
安装新内核和模块后,加载 iscsi 模块:
$ sudo modprobe libiscsi
$ sudo modprobe scsi_transport_iscsi
$ sudo modprobe iscsi_tcp
$ sudo modprobe libiscsi_tcp
然后,我在 WSL2 实例上设置了一个客户端/启动器。我们将使用 open-iscsi,但它需要 systemd,而默认情况下 WSL2 上未启用 systemd。但这很容易做到。以下是有关如何做到这一点的非常简短的指南:https://forum.snapcraft.io/t/running-snaps-on-wsl2-insiders-only-for-now/13033。您可以跳过快照部分。
然后安装 open-iscsi:
$ sudo apt install open-iscsi
编辑“/etc/iscsi/iscsid.conf”并将“node.startup”更改为“automatic”。 将其设置为自动将导致您的 WSL 会话在下次重新启动时启动非常缓慢,因为您的“主机”IP 发生变化并且无法重新连接。
启动 iscsi 启动器:
$ sudo /etc/init.d/open-iscsi start
然后连接到目标并列出存储设备:
$ export WSLHOSTIP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
$ sudo iscsiadm -m discovery -t st -p $WSLHOSTIP
172.26.240.1:3260,-1 iqn.1991-05.com.microsoft:target1
$ sudo iscsiadm -m node
172.26.240.1:3260,-1 iqn.1991-05.com.microsoft:target1
现在我们可以连接了:
$ sudo iscsiadm -m node --targetname "iqn.1991-05.com.microsoft:target1" --portal "$WSLHOSTIP:3260" --login
Logging in to [iface: default, target: iqn.1991-05.com.microsoft:target1, portal: 172.26.240.1,3260] (multiple)
Login to [iface: default, target: iqn.1991-05.com.microsoft:target1, portal: 172.26.240.1,3260] successful.
我的 USB 驱动器被列为/dev/sdb。
$ ls /dev/sd*
/dev/sda /dev/sdb
$ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3958509f
Device Boot Start End Sectors Size Id Type
/dev/sdb1 * 2048 62914559 62912512 30G b W95 FAT32
现在您可以对您的驱动器进行加密...
$ sudo modprobe dm_crypt
$ sudo cryptsetup -d /dev/urandom -c aes-xts-plain create delete /dev/sdb && shred -vzn 0 /dev/mapper/delete && sync && sleep 4 && cryptsetup remove delete
shred: /dev/mapper/delete: pass 1/1 (000000)...
shred: /dev/mapper/delete: pass 1/1 (000000)...32MiB/30GiB 0%
shred: /dev/mapper/delete: pass 1/1 (000000)...62MiB/30GiB 0%
shred: /dev/mapper/delete: pass 1/1 (000000)...90MiB/30GiB 0%
shred: /dev/mapper/delete: pass 1/1 (000000)...108MiB/30GiB 0%
shred: /dev/mapper/delete: pass 1/1 (000000)...137MiB/30GiB 0%
shred: /dev/mapper/delete: pass 1/1 (000000)...149MiB/30GiB 0%
...