在適用於 Linux 1 或 2 的 Windows 子系統中的 Ubuntu Server 18.04 LTS 上載入 dm-crypt

在適用於 Linux 1 或 2 的 Windows 子系統中的 Ubuntu Server 18.04 LTS 上載入 dm-crypt

我在 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 嗎?

我正在使用 WSL1 和 64 位元 Ubuntu 18.04 LTS。

更新:
我再次嘗試使用 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 模組並成功了。

dm-crypt 模組已載入

您必須先啟用 WSL2。截至撰寫本文時,它僅適用於 Windows 預覽體驗成員: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」的檔案(注意前面的點 .)。我用的是記事本++。將以下行放入其中:

[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 實例進行通訊。我連接了 USB 隨身碟,預設 iSCSI 目標名稱為「iqn.1991-05.com.microsoft:target1」。

新增 iSCSI 目標

選擇物理磁碟

運行該程式後,您可以從 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%
...

相關內容