Windows系统如何mount盘符到目录_windows mount-程序员宅基地

技术标签: windows mount  mountvol  diskpart  

本文是从另一篇关于Linux文件系统实现的文章里摘出来的。

在Windows上如何将一个文件系统分区挂载到一个目录,这其实是一个 硬需求! 是的,非常硬的需求。因为我们总是面临C盘,D盘满了却无法动态扩容问题。所以,在有一天我因为路上堵车撸了一个Linux上的最小的tinyfs之后,就想到顺便解决一下Windows的mount问题,并且发现了方法,就记录了下来。

我以前确实不知道Windows系统也能mount文件系统分区到目录,但是我一直都觉得有办法做到,毕竟Windows如此成熟的操作系统,怎能错过 UNIX正确的mount机制 呢?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树形的文件系统结构:

  1. 所有文件系统均通过目录组织。
  2. 目录是递归嵌套的。

所有的文件系统均通过目录组织,这意味着每一个文件系统均有一个根目录,而目录本身就是递归嵌套的,所有在一棵树上,每一个目录节点均可以看作一棵子树的根,这就是mount点:

  • 每一棵子树均可以挂载一个文件系统。

在这里插入图片描述
上图中每一个中间节点均可以挂载一个新的文件系统。

我们找到了mount的根源。

有了mount机制,试问一个目录可以有多大?答案是它可以无穷大,它可以挂载整个世界。

再谈谈Linux的实现

Linux作为类UNIX系统,当然实现了mount机制。先看Linux文件系统的表象:
在这里插入图片描述
但实际上,在mount机制下,它是这个样子:
在这里插入图片描述

两组链表将整个mount树组织了起来,让它成了我们看起来的树的样子:

  1. 文件系统链表。
  2. 每一个文件系统的mount挂载点链表。

接着谈谈Linux和Windows文件系统组织的异同

我平时喜欢把类似的东西放在一起比较,比如秦汉和罗马帝国之类的,所以圈内的经常有人想让我谈下Windows和Linux的文件系统之间区别。

先看一篇很早之前的文章:
Linux文件系统的设计: https://blog.csdn.net/dog250/article/details/6347504/
该文章讲了Linux文件系统mount机制的超级好处。

Windows系统并非和UNIX系统师出同门。Windows继承了DOS的文件系统的机制。

我不是很懂Windows的内在实现机理,所以我只能外在的谈一下。Windows和Linux对待文件系统组织的区别,貌似非常对称:

  • Linux是把文件系统(或者说格式化为某个文件系统的磁盘分区)挂载在目录上。
  • Windows是把目录挂在已经格式化的盘符(其实是一个逻辑卷,即磁盘分区)上。

注意,我说的是文件系统的组织,而不是文件系统本身,所以我并没有在比较NTFS/extX的格式和处理方面的区别,说白了,我就是在说Windows和Linux分别是怎么 "mount" 文件系统的。

UNIX一开始就 抽象 了文件系统,将其看作是一个树形的靠mount机制可以无限扩展目录,而DOS可能最初只是将一个具体的磁盘文件系统映射到了内存中。务实的PC操作系统并没有对文件系统做抽象。

所以说,按照以上的理解:

  • Linux若想挂一个文件系统,必须要有一个目录。
  • Windows若想挂一个文件系统的目录,必须要有一个盘符。

所以说,我们看到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挂载

“实际是否去做”“是否有能力去做” 完全是两码事。很少有人见过Windows系统的树形mount结构,因为:

  • Windows为了兼容,舍弃了很多表面的东西,至少它要看起来仍然很像最初的Windows 95甚至Windows 3。
  • 在Windows下,很少有人折腾命令行,所以很少有人去折腾diskpart,mountvol等命令。而彩蛋就在这些命令里。

下面我来step by step演示如何来做。

方法1:使用diskpart命令

diskpart命令类似Linux的fdisk命令,详见:https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/diskpart

  1. 首先准备若干空闲的逻辑卷。在我的例子中,我准备了两个NTFS分区,D盘和E盘:
    在这里插入图片描述
  2. 我们看一下diskpart命令里的assign子命令:
    在这里插入图片描述
    Windows命令行的help非常棒,让我有种操作Cisco路由器的感觉。
    值得注意的是, 上述help提示中,PATH代表的目录必须是一个空目录。 这是和UNIX/Linux的文件系统挂载点任意覆盖已有目录所不同的。
  3. 现在让我们看一下D盘和E盘的表象:
    在这里插入图片描述
  4. 我们在C盘新建一个目录mnt,希望将E盘的NTFS系统挂载在mnt目录:
    在这里插入图片描述
  5. 让我们开始吧!先list一下所有的逻辑卷:
    在这里插入图片描述
  6. 选择标识E盘的逻辑卷标号,并且挂载它到C盘的mnt目录:
    在这里插入图片描述
  7. 我们看到E盘消失了:
    在这里插入图片描述
  8. E盘被mount到了C盘的mnt目录:
    在这里插入图片描述
  9. 哇!果然如此:
    在这里插入图片描述
  10. 让我们操作一番E盘,就像操作C盘的mnt目录一般:
    在这里插入图片描述
  11. 让我们继续在E盘的mount点C:\mnt继续创建新目录挂载D盘:
    在这里插入图片描述
  12. D盘mount成功,并创建个文件:
    在这里插入图片描述
    这个时候,C盘就类似UNIX/Linux的根目录( “/” )了,所有其它两个逻辑卷盘符D盘,E盘嵌套mount在C盘下的目录!
  13. diskpart命令提示符下输入以下命令序列,恢复D盘逻辑卷:
    DISKPART> remove mount=c:\mnt\vol_D
    DISKPART> select vol=3
    DISKPART> assign mount=d:
    
  14. 最后我们看到的是这样:
    在这里插入图片描述

所谓万变不离其宗,这就是了。Windows的内在依然没有逃过mount目录树?。

方法2:使用mountvol命令

这个命令像极了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的,只不过你可能不好识别:
在这里插入图片描述
在这里插入图片描述

方法3:使用系统管理GUI

其实,Windows提供了mount逻辑卷的界面,只是很少被人使用罢了。

计算机管理中点击磁盘管理:
在这里插入图片描述
选中一个逻辑卷,右键点击更改驱动器号和路径:
在这里插入图片描述
这样就可以删除,添加或者更改一个逻辑卷的挂载点了。

操作总结

可见,Windows系统也可以很方便的做到UNIX/Linux那样mount整个世界,而且方法还多种多样。

这便解决了一个很大的痛点,即C盘满了的问题。然而切记,Windows无法将逻辑卷mount到非空目录,所以就很难靠mount一个块更大的磁盘分区完成诸如C:\Program Files之类目录的扩容,但是方法还是有的,本文不谈。


最终,Windows内部维护文件系统的结构大概会是下面的样子:
在这里插入图片描述

嗯,如果让我来设计,我就会设计成这个样子。

结论是,Windows系统表面上保持了C,D等盘符,但实际实现上,和UNIX/Linux无异。

浙江温州皮鞋湿,下雨进水不会胖

浙江温州皮鞋湿,下雨进水不会胖!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dog250/article/details/100140882

智能推荐

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

SDUT OJ逆置正整数-程序员宅基地

文章浏览阅读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*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表

matlab 提取struct结构体中某个字段所有变量的值_matlab读取struct类型数据中的值-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值

Android fragment的用法_android reader fragment-程序员宅基地

文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment

FFT of waveIn audio signals-程序员宅基地

文章浏览阅读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

随便推点

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读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技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点

原生JS 与 VUE获取父级、子级、兄弟节点的方法 及一些DOM对象的获取_获取子节点的路径 vue-程序员宅基地

文章浏览阅读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