
私は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 カーネルを実行しているため、WSL1 をサポートしているようです。実際、dm-crypt モジュールをロードしようとしたところ、成功しました。
まず WSL2 を有効にする必要があります。この記事の執筆時点では、Windows Insider のみが利用できます。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:
ブロック デバイスへのアクセスに関しては、この記事の執筆時点では、Microsoft がまだ取り組んでいるようです。https://github.com/Microsoft/WSL/issues/689
お役に立てれば幸いです :)
更新2:
WSL2 のブロック デバイス制限を回避するには、USB/IP または iSCSI プロトコルを介してホストの USB ドライブを WSL2 に提供します。USP/IP を試しましたが、USB デバイスが「ハブ」として分類されていたため、非常に問題が発生しました。そこで、Windows ホストに iSCSI ターゲットを作成し、WSL2 インスタンスからそれに接続するという iSCSI 方式を試しました。
私は、TalAloni の github リポジトリにある「iSCSIConsole」アプリケーションを使用しました。https://github.com/TalAloni/iSCSIコンソールターゲットを作成します。
USB ドライブなどの物理ディスクを接続するには、管理者権限で実行する必要があります。また、WSL2 インスタンスと通信するには、Windows ホスト ファイアウォールの通過を許可する必要がある場合もあります。私は、デフォルトの 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 が必要です。systemd は WSL2 ではデフォルトで有効になっていません。しかし、これは非常に簡単に実行できます。以下に、その方法についての非常に短いガイドを示します。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」に変更します。 自動に設定すると、「ホスト」IP が変更されて再接続できなくなるため、次回再起動時に WSL セッションの起動が非常に遅くなります。
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%
...