如何在 WSL shell 中获取 Windows 磁盘的卷标?

如何在 WSL shell 中获取 Windows 磁盘的卷标?

在 WSL 中运行 Ubunutu 20.04,Windows 磁盘安装为

/mnt/c
/mnt/d
/mnt/e

等等。

在 bash shell 中,如何获取 /mnt/d 处磁盘的卷标?

lsblk并且tune2fs /mnt/d不给出卷标

答案1

虽然大多数东西都在@爱德华的回答是真的,有WSL 中的解决方法允许您读取卷名称。

由于(至少默认情况下)WSL 允许您调用命令行(和其他)Windows 可执行文件,因此可以轻松使用 PowerShell(通过 WSL)读取特定于 Windows 的数据。

$ powershell.exe -c "(Get-Volume d).FileSystemLabel"
Crucial SSD 2TB

当然,您可以使用类似的脚本(WSL2 特定,由于安装):

mount | 
    grep "^drvfs on .* 9p" | 
    awk '{print $3}' |
    xargs -I{} bash -c '''
        mnt={}
        drv="${mnt:0-1}"
        echo -en "${mnt}\t"
        powershell.exe -c "(Get-Volume $drv).FilesystemLabel"
    '''

答案2

WSL2 实际上是一个运行 Microsoft 内核的 VM:

root@test-ubuntu-wsl2:/home/edward# uname -a
Linux test-ubuntu-wsl2 5.10.102.1-microsoft-standard-WSL2 #1 SMP Wed Mar 2 00:30:59 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

您可以使用 Windows 端用户空间连接磁盘wsl.exe,例如,请参阅https://learn.microsoft.com/en-us/windows/wsl/wsl2-mount-disk或者https://devblogs.microsoft.com/commandline/access-linux-filesystems-in-windows-and-wsl-2/

Windows 文件系统似乎是使用以下9p协议挂载的:

root@test-ubuntu-wsl2:/home/edward# mount | grep '\\'
C:\ on /mnt/c type 9p (rw,noatime,dirsync,aname=drvfs;path=C:\;uid=1000;gid=1000;symlinkroot=/mnt/,mmap,access=client,msize=65536,trans=fd,rfd=8,wfd=8)
M:\ on /mnt/m type 9p (rw,noatime,dirsync,aname=drvfs;path=M:\;uid=1000;gid=1000;symlinkroot=/mnt/,mmap,access=client,msize=65536,trans=fd,rfd=8,wfd=8)

Windows 主机运行 9p 服务器,WSL 实例连接到该服务器。因此,没有直接设备访问(没有硬件访问):lsblk并且tune2fs所有其他直接设备用户空间工具将看不到主机驱动器。

另请参阅https://superuser.com/questions/1643551/windows-10-wsl-mount-creates-9p-filesystem-instead-of-drvfs

太长了;您需要直接设备访问才能查看磁盘标签。从 WSL2 内部(本质上是一个虚拟机)来看,这是不可能的。

相关内容