技术标签: windows mount mountvol diskpart
本文是从另一篇关于Linux文件系统实现的文章里摘出来的。
在Windows上如何将一个文件系统分区挂载到一个目录,这其实是一个 硬需求! 是的,非常硬的需求。因为我们总是面临C盘,D盘满了却无法动态扩容问题。所以,在有一天我因为路上堵车撸了一个Linux上的最小的tinyfs之后,就想到顺便解决一下Windows的mount问题,并且发现了方法,就记录了下来。
我以前确实不知道Windows系统也能mount文件系统分区到目录,但是我一直都觉得有办法做到,毕竟Windows如此成熟的操作系统,怎能错过 UNIX正确的mount机制 呢?UNIX的古老mount是如此的完美!
这是个古老的机制。早在UNIX初始,经典创世论文《The UNIX time-sharing system》里就提到了mount机制:
mount机制如此设计的源泉在于目录的定义:
Directories provide the mapping between the names of files and the files themselves, and thus induce a structure on the file system as a whole.
而我们知道,UNIX最初定义的文件类型包括三大类:
这决定了目录是一个递归嵌套的结构。最终是下面的两个核心造就了UNIX树形的文件系统结构:
所有的文件系统均通过目录组织,这意味着每一个文件系统均有一个根目录,而目录本身就是递归嵌套的,所有在一棵树上,每一个目录节点均可以看作一棵子树的根,这就是mount点:
上图中每一个中间节点均可以挂载一个新的文件系统。
我们找到了mount的根源。
有了mount机制,试问一个目录可以有多大?答案是它可以无穷大,它可以挂载整个世界。
Linux作为类UNIX系统,当然实现了mount机制。先看Linux文件系统的表象:
但实际上,在mount机制下,它是这个样子:
两组链表将整个mount树组织了起来,让它成了我们看起来的树的样子:
我平时喜欢把类似的东西放在一起比较,比如秦汉和罗马帝国之类的,所以圈内的经常有人想让我谈下Windows和Linux的文件系统之间区别。
先看一篇很早之前的文章:
Linux文件系统的设计: https://blog.csdn.net/dog250/article/details/6347504/
该文章讲了Linux文件系统mount机制的超级好处。
Windows系统并非和UNIX系统师出同门。Windows继承了DOS的文件系统的机制。
我不是很懂Windows的内在实现机理,所以我只能外在的谈一下。Windows和Linux对待文件系统组织的区别,貌似非常对称:
注意,我说的是文件系统的组织,而不是文件系统本身,所以我并没有在比较NTFS/extX的格式和处理方面的区别,说白了,我就是在说Windows和Linux分别是怎么 "mount" 文件系统的。
UNIX一开始就 抽象 了文件系统,将其看作是一个树形的靠mount机制可以无限扩展目录,而DOS可能最初只是将一个具体的磁盘文件系统映射到了内存中。务实的PC操作系统并没有对文件系统做抽象。
所以说,按照以上的理解:
所以说,我们看到Windows系统中的 “C盘” ,就像看到Linux中的 “/目录” 一样
为什么Windows没有采用几乎已经是范式的UNIX/Linux文件系统树形mount的实现方式,非要采用一个盘符一个文件系统的方式呢?几乎每个人都知道UNIX/Linux的mount机制会更好一些,无缝插拔,无限扩展,然而Windows却貌似并未采用。
我们进入Linux系统后,输入mount命令,会看到下面的信息:
每一个磁盘,都挂载在一个目录上,这是一个典型的 可插拔的分层树形 结构。
在Windows系统,类似的信息如下(这里只是初步看来):
可见,Windows的文件系统是直接诉诸逻辑卷的,缺失了目录挂载点。因此,在对待 文件系统动态扩容(而不是磁盘分区扩容) 操作上,就非常麻烦,可插拔操作几近不可能。
请注意在微软系Windows系统的前身是DOS,DOS这个单词中的D指的就是Disk的意思。在DOS时代,内存及其少,少得可怜,所以干嘛不直接用盘符来直接索引目录的起始呢?更何况,彼时一般只有一块磁盘,磁盘即系统,系统宿主就是磁盘,故名曰 Disk Operating System ,即 DOS 。
磁盘文件系统,即DOS的内在灵魂,一直延续到了今日。
如何非要和Linux文件系统类比,Windows的盘符更像是Linux的mount数据结构,而不仅仅是个盘符,照着Linux文件系统的结构,我试着画一画Windows的类似结构,不出意外,它看起来是这个样子:
但事实上,这只是个表象,或者说这只是Windows系统在最初时候文件系统的样子,如今,Windows NT虽然表面上仍然保持这个样子,但实际上内在的实现早就类似于UNIX/Linux的mount机制了。
好了,Windows文件系统的种种不如UNIX/Linux就到此为止,接下来要说的是,Windows系统有能力做到UNIX/Linux系统那般的树形目录mount结构。我们看看如何来做。
“实际是否去做” 和 “是否有能力去做” 完全是两码事。很少有人见过Windows系统的树形mount结构,因为:
下面我来step by step演示如何来做。
diskpart命令类似Linux的fdisk命令,详见:https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/diskpart
DISKPART> remove mount=c:\mnt\vol_D
DISKPART> select vol=3
DISKPART> assign mount=d:
所谓万变不离其宗,这就是了。Windows的内在依然没有逃过mount目录树?。
这个命令像极了UNIX/Linux的mount命令。详见:https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/mountvol
前一个diskpart实验中,我们已经将D盘挂在了C:\mnt\vol_D目录了,现在从那里接着做:
照着指引就可以做。比如我们把D盘挂载到C盘新建目录C:\mnt\newD上:
可见,Windows也是可以将同一个文件系统分区挂在不同的目录的。
你可以将Linux的ext2,ext3等分区挂在Windows的目录,就像Windows的fat,ntfs分区挂在Linux上一样。实现这个只需要安装Windows下的ext2,ext3驱动即可,我用的是ext2IFS:
http://www.fs-driver.org/
安装好它以后,就可以识别接入Windows的ext2,ext3分区了,用IFS Driver给它们指派盘符(IFS Driver在控制面板可以找到):
然后就可以用mountvol来挂载了。
其实,不指派盘符也可以,用mountvol命令也是可以显示出其uuid的,只不过你可能不好识别:
其实,Windows提供了mount逻辑卷的界面,只是很少被人使用罢了。
计算机管理中点击磁盘管理:
选中一个逻辑卷,右键点击更改驱动器号和路径:
这样就可以删除,添加或者更改一个逻辑卷的挂载点了。
可见,Windows系统也可以很方便的做到UNIX/Linux那样mount整个世界,而且方法还多种多样。
这便解决了一个很大的痛点,即C盘满了的问题。然而切记,Windows无法将逻辑卷mount到非空目录,所以就很难靠mount一个块更大的磁盘分区完成诸如C:\Program Files之类目录的扩容,但是方法还是有的,本文不谈。
最终,Windows内部维护文件系统的结构大概会是下面的样子:
嗯,如果让我来设计,我就会设计成这个样子。
结论是,Windows系统表面上保持了C,D等盘符,但实际实现上,和UNIX/Linux无异。
浙江温州皮鞋湿,下雨进水不会胖!
文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录
文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.
文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表
文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值
文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment
文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals
文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac
文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术
文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;::-webkit-scrollbar { height: 5px; } &amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner
文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!
文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点
文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue