之前的回顾:先说那些关于WSL的事情

文件系统

WSL特性出来后,很多人争相安装,包括笔者的同学争先恐后体验,但最后都成了黑子,因为大家都发现WSL中File IO太慢了。

*图16 Inode实际上在中间维护了一个文件句柄

Windows本身可以处理区分大小写。如前所述,Windows和NTFS实际上支持区分大小写的操作,所以无论如何控制全局注册密钥,VolFs都会请求对象管理器将路径视为区分大小写。因此,切记不要在根目录外使用WSL创建同名但大小写不同的文件,这样会对Windows的文件管理产生不可预知的后果。

Linux文件名也支持将所有字符视为合法字符。但是NT中有更多的限制,有些字符根本不允许作为文件名,有些字符可能有特殊含义。为了支持所有Linux文件名,VolFs对文件名中的非法字符进行转义。

Linux中的解除链接和重命名有一些不同的语义。具体来说,即使一个文件有一个打开的文件描述符指向它,它也可能被破坏。同样,即使文件已打开,也可以重命名。在Windows中,如果要删除一个文件,其最终状态必须是关闭,文件名在文件系统中可见。为了支持Linux中的断链语义,在请求删除之前,VolFs会将断链文件重命名为一个隐藏的临时文件夹。

Linux inodes有一些Windows中不存在的属性,包括所有者和组、文件模式等等。这些属性存储在与磁盘文件相关联的NTFS扩展属性中。存储在扩展属性中的信息如下:

模式:包括文件类型和文件的权限位。

所有者:拥有该文件的Linux用户标识和组标识。

设备编号:设备档案的主要设备编号和次要设备编号。请注意,WSL目前不允许用户在卷文件系统中创建设备文件。

文件时间:Linux中文件访问时间、修改时间、更改时间的格式和粒度与Windows不同,所以这些时间也存储在EAs中。

其他索引节点属性,如索引节点号和文件大小,是从存储在NTFS中的信息中派生出来的。

所以WSL下的一些文件如果直接从Windows操作,这些基本信息很多都不会更新到Volfs,导致权限紊乱。

Drvfs

WSL使用DrvFs文件系统,方便文件存储与Windows系统的交互。WSL自动将具有可支持文件系统的卷装载到/mnt目录,如/mnt/c、/mnt/d等。目前只能支持NTFS和ReFs。

DrvFs的操作类似于VolFs。创建信息节点和文件对象时,请打开窗口文件的句柄。相比VolFs,DrvFs遵循Windows规则。比如DrvFs使用Windows权限,只允许合法的NTFS文件名;而且DrvFs不支持特殊的文件类型,比如FIFOs和sockets。

在DrvFs中,当打开一个文件时,启动WSL的用户令牌的Windows权限是继承的,也就是说,令牌是由执行bash.exe的用户生成的。因此,如果要访问WSL中C:Windows目录下的文件,就不能在bash环境中使用“sudo”。虽然您有根权限,但您的Windows用户令牌没有更改,您必须启动bash.exe才能进一步获得适当的权限。

为了提示用户他对文件的权限,DrvFs检查用户的有效文件权限,并将其转换为“读/写/可执行”位,例如,通过执行“ls -l”命令。然而,这些并不都是一对一的映射。例如,在Windows中,在目录中创建文件和子目录需要不同的权限。如果用户有任何种类的权限,DrvFs被认为对目录具有写访问权限,但实际上,由于拒绝访问,一些操作仍然可能失败。

*图片17 Drvfs尽可能实现一对一映射

因为对文件的有效访问权限将根据bash.exe是否启动而变化,所以DrvFs中显示的文件权限也将随着bash实例权限的提升而变化。

DrvFs支持区分大小写的文件,也就是说可以创建两个不同文件名的drvf。请注意,许多Windows应用程序可能无法处理这种情况,并且可能无法打开一个或两个文件。.

*图片18哦...WSL和Windows打起来了

在卷根上禁用了区分大小写,但它可以在其他地方使用。因此,为了使用区分大小写的文件。与其尝试创建/mnt/c,不如创建一个可以创建文件的目录。

与VolFs不同,DrvFs不存储任何额外的信息。相反,所有inode属性都是通过查询NT中使用的文件属性、有效权限等信息派生出来的。DrvFs还禁用目录条目缓存,以确保即使Windows进程修改目录内容,它也能始终提供正确和最新的信息。因此,在使用DrvFs时,对Windows进程处理文件的方式没有任何限制。

DrvFs也对文件使用Windows删除语义,所以如果一个文件中有任何打开的文件描述符,我们就不能取消它的链接。

*图片19是WSL文件IO慢的原因之一

回到本段开头提到的问题,WSL的File IO为什么慢?其实看完整篇文章应该猜到原因了:因为WSL只是简单的实现了Windows文件系统的抽象,所以WSL的File IO慢其实是Windows文件系统和Linux文件系统的区别造成的。在我的实验中,我使用了一个压缩包,它有一个很深的目录和许多小文件。对于这种小文件,Windows本身比Linux弱,导致问题本身。

无线传感器网络存在的一些问题

虽然目前WSL的设计很完善,但WSL本身仍然存在很多问题。比如目前WSL中的所有进程都是在Windows操作系统中直接以内核模式运行的。虽然进程本身是由Linux维护的,但是一旦出现前面提到的CVE,lxcore翻译进程就会直接受到攻击技术的攻击,这个进程就会变得像沙盒逃逸一样,对Windows本身的内核产生影响。

WSL中的Elf和它所依赖的各种库在加载时不设置标志SEC_IMAGE,这意味着Windows的某些API和功能将无法跟踪这个映像的映射过程。比如PsSetLoadImageNotifyRoutine会无法跟踪相关的elf映射,导致监控一些杀毒软件失败,AppLocker就不行。而且它的操作是强制区分大小写的,所以可以绕过Windows中的注册表开关,强制区分大小写。

WSL2

*图片20 WSL还没学完。又来了一个WSL2

在学习WSL的过程中,作者遇到了很多麻烦。当研究有所进展的时候,BUILD2019宣布WSL2发布。这时,内心很复杂。

随着6月13日WSL2的发布,很多粉丝也体验到了它的特色。以下是对WSL中WSL2不同部分的简要介绍:

1.WSL2不直接翻译Linux内核中断调用,而是使用类似虚拟机的技术。以前微软通过翻译Linux的各种中断和文件系统来抽象Linux系统。但是,其实还是有很多问题的。在直译的过程中,有些内容,比如命名空间,linux下的systemd,从VBF+EXT4到NTFS的转换,还是很不方便的。新推出的WSL2将直接在Windows 4.19版本中嵌入一个Linux内核,这是Linux内核版本的LTS版本。如果是Linux的内核,就意味着不再需要lx*的内核驱动来翻译中断/文件系统的各种映射,可以原生支持Linux下的各种中断调用。

2.WSL将保留,并且可以与WSL2交换,甚至可以同时运行两个不同的WSL

3.因为是轻量级VM,所以依赖于Hyper-V的内核,打开WSL2会和VBox、Vmware等软件冲突

4.WSL2使用VHDX存储根目录,让WSL2使用EXT4+VFS文件系统,尽可能与真实的Linux保持一致。

总体来说,WSL2已经有了很多新的特性,但是似乎还有很多问题还在开发中。让我们拭目以待未来的特性。

参考网站:

http://www . Alex-iones Cu . com/publications/BlueHat/BlueHat 2016 . pdf

https://dev blogs . Microsoft . com/command line/annowing-wsl-2/

https://blogs.msdn.microsoft.com/wsl/

https://dev blogs . Microsoft . com/command line/what-new-for-wsl-in-windows-10-version-1903/

*以上部分图片来自互联网

1.《wsl 一起聊聊WSL的那些事儿(下)》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《wsl 一起聊聊WSL的那些事儿(下)》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/shehui/1769491.html