TOC
WSL2といえば未だに使ったRAMが開放されずにどんなにRAMを積んでいようとも足りなくなる運命から抜け出せていない状況が続いていますが、それとは別にWindows10 20211では新しく「PCの他のパーティションをWSL2からマウントできる」という素敵機能が追加されました。
安定版の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”を実行することです。
WSL2でRAMがめちゃくちゃ枯渇する件、とりあえずwsl.exe --shutdownしなくてもroot権限でsync && sysctl -w vm.drop_caches=3を実行すれば同じ効果を得られることを確認。
— 雅楽斎/garakusai (@garakusai1) January 17, 2020
LinuxカーネルがSlabを溜め込んでるのかな。よくわからん。
本格的な対処法
シェルスクリプトを/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