Windows10の20211でネイティブのパーティションをマウント可能に

Posted by 雅楽斎 on Tuesday, September 15, 2020

TOC

WSL2といえば未だに使ったRAMが開放されずにどんなにRAMを積んでいようとも足りなくなる運命から抜け出せていない状況が続いていますが、それとは別にWindows10 20211では新しく「PCの他のパーティションをWSL2からマウントできる」という素敵機能が追加されました。

https://blogs.windows.com/windows-insider/2020/09/10/announcing-windows-10-insider-preview-build-20211/

安定版のWindows10でリリースされるまではここに記載している手順が変わることもあると思うので、変更がわかったら追記します。

マウント可能なパーティションのファイルシステムは使っているWSL2ディストロで異なる

今回追加された機能で具体的にマウントできるパーティションとしてext4が代表として書かれていますが、私はデュアルブートのLinuxは最近はもっぱらbtrfsを使っているので、ext4だけマウントできるんじゃ恩恵がないなぁと思っていたのですが、実際にマウントできるパーティションはWSL2対応カーネルの/proc/filesystemsに書かれているものになります。

WSL 2 (プレビュー) で linux ディスクのマウントを開始する

Ubuntu 20.04の場合

  • sysfs
  • rootfs
  • tmpfs
  • bdev
  • proc
  • cpuset
  • cgroup
  • cgroup2
  • devtmpfs
  • binfmt_misc
  • debugfs
  • tracefs
  • sockfs
  • dax
  • bpf
  • pipefs
  • ramfs
  • hugetlbfs
  • rpc_pipefs
  • devpts
  • ext3
  • ext2
  • ext4
  • squashfs
  • vfat
  • msdos
  • iso9660
  • nfs
  • nfs4
  • nfsd
  • cifs
  • smb3
  • autofs
  • fuseblk
  • fuse
  • fusectl
  • overlay
  • xfs
  • 9p
  • ceph
  • mqueue
  • btrfs

Ubuntu 18.04の場合

  • sysfs
  • rootfs
  • bdev
  • proc
  • tmpfs
  • binfmt_misc
  • debugfs
  • sockfs
  • usbfs
  • pipefs
  • anon_inodefs
  • devpts
  • ext3
  • ext2
  • ext4
  • ramfs
  • nodev hugetlbfs
  • vfat
  • msdos
  • iso9660
  • fuseblk
  • fuse
  • fusectl
  • yaffs
  • yaffs2
  • overlayfs
  • overlay
  • mqueue

実際のマウント手順(動作確認はできていないので参考)

DiskPathの取得

コマンドプロンプトかPowerShellで以下のコマンドを実行します。

>wmic diskdrive list brief
Caption                  DeviceID            Model                    Partitions  Size
WDC  WDS500G2B0A-00SM50  \\.\PHYSICALDRIVE0  WDC  WDS500G2B0A-00SM50  4           500105249280

SSD1台でWindowsとLinuxをデュアルブートしているので結果は1行です。ここで表示されるDeviceID列の「\.\PHYSICALDRIVE0」がDiskPathなんだそうです。

WSLコマンドでマウント

コマンドプロンプトかPowerShellで以下のコマンドを実行します。

物理デバイスのマウント手順

DiskPathには実際に入力するはずのDiskPathを指定しています。

>wsl --mount \\.\PHYSICALDRIVE0 --bare

これが成功した場合はWSL2へのHDDの接続が完了しているということのようです。bareと書かれているので物理的に繋いだということでしょうか。

特定パーティションのマウント手順

>wsl --mount \\.\PHYSICALDRIVE0 --partition 1

partitionオプションを使用する場合はこちらになるようです。ファイルシステムは何もしないとext4でマウントするそうなので、ext4以外のファイルシステムを指定する場合は

>wsl --mount \\.\PHYSICALDRIVE0 --partition 1 --type btrfs

となるはずです。

WSL2からファイルアクセス

WSL2内部のマウントポイントは上記コマンド実行時は/mnt/wsl/PHYSICALDRIVE0p1になるようです。

エクスプローラーからのファイルアクセス

マウントをしてしまえば、WSL2を起動しなくてもエクスプローラーからもファイルアクセスができるようです。アクセス先は

\\wsl$\PHYSICALDRIVE0p1\

が割り当てられるようです。

WSLコマンドでアンマウント

使い終わったら以下のコマンドでアンマウントできるようです。

>wsl --unmount \\.\PHYSICALDRIVE0

なお、DiskPathを省略した場合は全てのマウント済みデバイス/パーティションがアンマウントされるそうです。

逆(デュアルブートしているOSからWindowsパーティションをマウント)は簡単にできている

普段デュアルブートのLinuxを使う場面も多い私としては、LinuxからWindows10のパーティションに置かれているファイルを取り出したい時にWindows10で起動し直してファイルをFTPとかUSBメモリ経由でコピーしてといった作業はせず、必要に応じてLinuxからパーティションをマウントしています。

Caja(MATEのファイルマネージャ)を開くとデバイスにパーティションが表示されているので、クリックします。

クリックするとマウントされて、デスクトップにもアイコンが表示されます。Cajaにはアンマウント用のボタンも表示されます。

アンマウント用のボタンをクリックするか、右クリックしてアンマウントを選ぶことでアンマウントが完了します。

普段から何も考えずにやっていますが、おそらくntfs-3gでマウントしているものだと思っています。できればWSL2もこのくらい簡便な仕組みでできるようになってほしいですね。

改めてWSL2のRAMを手軽に開放できるようにしてくれ…

https://github.com/microsoft/WSL/issues/4166

この問題の確実な解決法は、常にログインしてコマンドを実行できるならroot権限で”sync && sysctl -w vm.drop_caches=3”を実行することです。

本格的な対処法

シェルスクリプトを/usr/local/sbin/dropcachecron.shという名前で作成

#!/bin/bash

PATH="/bin:/usr/bin:/sbin:${PATH}"
REGEX="^SReclaimable"
MEMINFO="/proc/meminfo"
THRESHOLDKB="50000"

IFS='
'

LINE=($(egrep $REGEX $MEMINFO))
for i in ${LINE[@]}; do
        NUMPRE=$(echo $i | tr -s ' ')
        NUM=$(echo $NUMPRE | cut -d ' ' -f2)
        if [ $NUM -gt $THRESHOLDKB ]; then
                sync && sysctl -w vm.drop_caches=3
        fi
done

実行権をrootユーザーで追加

# chmod +x /usr/local/sbin/dropcachecron.sh

cronエントリを追加すること(この場合5分間隔)

*/5 * * * * /usr/local/sbin/dropcachecron.sh

cronサービスを起動(systemdが動いてないのでwsl2起動時毎回やる必要がある)

# service cron start

スポンサーリンク


comments powered by Disqus