質問: linux 1または2のwindowsサブシステムでubuntu server 18.04 ltsにdm-cryptをロードする windows 10システムでlinux用のwindowsサブシステム(wsl1)を使用していて、usbデバイスからallデータを削除し、次の疑似乱数で上書きしようとしました thisチュートリアル (ドイツ語でのみ見つかりましたが、この質問ではそれほど重要ではありません)が、必要なカーネルモジュールをロードできませんでした。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とubuntu18.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
回答: wsl1を保証することはできませんが、完全なlinuxカーネルを実行しているため、wsl2はwsl1をサポートしているようです。実際、私はdm-cryptモジュールをロードしようとして、成功しました。 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 microsoftwsl2カーネルのクローンを作成します。$ 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 やりたいことは、「cryptographic api」の下の「xts support」を選択する必要があります。設定を保存して、カーネルをコンパイルします。$ 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:ホストのusbドライブをusb/ipまたはiscsiプロトコル経由でwsl2に提供することにより、wsl2のブロックデバイス制限を回避できます。 usp/ipを試してみましたが、usbデバイスが「ハブ」に分類されていたため、問題が多すぎました。そこで、windowsホストでiscsiターゲットを作成し、wsl2インスタンスからそれに接続してiscsi方式を試しました。talaloniのgithubリポジトリで「iscsiconsole」アプリケーションを使用しました: https://github.com/talaloni/iscsiconsole ターゲットを作成しました。usbドライブなどの物理ディスクを接続するには、管理者権限で実行する必要があります。また、wsl2インスタンスと通信するために、windowsホストファイアウォールを通過できるようにする必要がある場合もあります。 usbサムドライブをデフォルトのiscsiターゲット名「iqn.1991-05.com.microsoft:target1」で接続しました。 iscsiターゲットの追加 物理ディスクの選択 実行したら、wsl2インスタンスから接続できます。まず、カスタムwsl2カーネル用のiscsiドライバーモジュールがロードされていることを確認する必要があります。カーネル構成メニューで有効にしてから、再コンパイルしました。$ export 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/130 。スナップパーツはスキップできます。次に、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% ...