win10版本1803,内部版本17134.885
由于最近卸载了以前安装的 Legacy 版本的 wsl(ubuntu 16.04),然后重新安装了 ubuntu 18.04. 之后偶然发现居然只在wsl的根目录下创建的文件(夹)区分大小写,而 /mnt/c 和 /mnt/d 都不能区分大小写了。网上的文章大多是让大家使用 fsutil 工具来修改CaseSensitive Flag,但是这样并不能使子文件以及wsl创建的目录生效。
我根据查找的资料,总结了以下方法,来解决这个问题。
- 确定windows build 大于 17110,因为 17110 以前的版本不存在这个问题
- 进入 wsl,输入mount 命令,查看 /mnt/c 等路径的信息
rootfs on / type lxfs (rw,noatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)
none on /dev type tmpfs (rw,noatime,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,noatime,gid=5,mode=620)
none on /run type tmpfs (rw,nosuid,noexec,noatime,mode=755)
none on /run/lock type tmpfs (rw,nosuid,nodev,noexec,noatime)
none on /run/shm type tmpfs (rw,nosuid,nodev,noatime)
none on /run/user type tmpfs (rw,nosuid,nodev,noexec,noatime,mode=755)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noatime)
C: on /mnt/c type drvfs (rw,noatime,uid=0,gid=0,case=off)
D: on /mnt/d type drvfs (rw,noatime,uid=0,gid=0,case=off)
可以看到 C: 和 D: 的挂载选项是 case=off,关于这个选项的说明如下表:
case=dir | case=off | case=force | |
---|---|---|---|
Flag为enable的目录 | Case Sensitive | Case Sensitive | Case Sensitive |
Flag为disable的目录 | Case Insensitive | Case Insensitive | Case Sensitive |
wsl中创建目录的Flag | Enabled | Disabled | Enabled |
- 我们可以通过创建或者修改 /etc/wsl.conf 来进行配置。
[automount]
options = "case=dir"
- 然后 exit 退出控制台,重新打开 wsl 即可(也有需要重启计算机才能生效的情况)。
- 注意,如果你希望使用 case=force 选项,那么你还需要在管理员权限的powershell下执行以下命令
reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\lxss /v DrvFsAllowForceCaseSensitivity /t REG_DWORD /d 1
好了,现在大家就可以愉快的享受“完美”的 Linux 体验了。
注意:由于微软不愿意花费人力与资源,wsl 目前没有办法在 64位系统下运行 32 位的程序。
引用:
Per-directory case sensitivity and WSL
Automatically Configuring WSL
Improved per-directory case sensitivity support in WSL
附一个遍历文件夹修改 CaseSensitive 的 BAT 脚本
for /R /d %%i in (*) do (
fsutil.exe file setCaseSensitiveInfo "%%i" enable
)
pause