目录
1、概念
2、举例
3、补充
参考文献
1、概念
挂载:指的就是将设备文件中的顶级目录连接到Linux根目录下的某一目录,访问此目录就等同于访问设备文件。
Linux系统中"一切皆文件",所有文件都放置在以根目录为树根的树形目录结构中。
在Linux看来,任何硬件设备也都是文件,它们各有自己的一套文件系统。
当在Linux系统中使用这些硬件设备时,只有将硬件设备的文件目录 嫁接到Linux本身的文件目录,硬件设备才能为我们所用。这里的嫁接过程我们称之为"挂载"。
既将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使它们成为一个整体,称为挂载;
注意:纠正一个误区,并不是根目录下任何一个目录都可以作为挂载点,由于挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点,会造成系统异常甚至崩溃,挂载点最好是新建的空目录。
2、举例
举个例子,我们想通过命令行访问某个 U 盘中的数据,图 1 所示为 U 盘文件目录结构和 Linux 系统中的文件目录结构。
图 1 U 盘和 Linux 系统文件目录结构
图 1 中可以看到,目前 U 盘和 Linux 系统文件分属两个文件系统,还无法使用命令行找到 U 盘文件,需要将两个文件系统进行挂载。
接下来,我们在根目录下新建一个目录 /sdb-u,通过挂载命令将 U 盘文件系统挂载到此目录,
mount /dev/sdb1 /sdb-u
挂载效果如图 2 所示。
图 2 文件系统挂载
可以看到,U 盘文件系统已经成为 Linux 文件系统目录的一部分,此时访问 /sdb-u/ 就等同于访问 U 盘。
前面讲过,根目录下的 /dev/ 目录文件负责所有的硬件设备文件,事实上,当 U 盘插入 Linux 后,系统也确实会给 U 盘分配一个目录文件(比如 sdb1),就位于 /dev/ 目录下(/dev/sdb1),但无法通过 /dev/sdb1/ 直接访问 U 盘数据,访问此目录只会提供给你此设备的一些基本信息(比如容量)。
总之,Linux 系统使用任何硬件设备,都必须将设备文件与已有目录文件进行挂载。
3、补充
前面讲过,根目录下的/dev/目录文件负责所有的硬件设备文件。
事实上,当U盘插入Linux后,系统也确实会给U盘分配一个目录文件(比如:sdb4)。
位于/dev/sdb4,但是无法通过/dev/sdb4/直接访问U盘数据。
我们只要执行mount操作后就可以访问U盘数据了。
总之,Linux系统使用任何硬件设备,都必须将设备文件与已有目录文件进行挂载。
4、LINUX文件结构和WINDOWS的不同
Linux是多用户操作系统,所以制定一个固定的目录规划有助于对系统文件和不同的用户文件进行统一管理——Linux采用标准的树状目录结构
Windows不同的是,在最顶层的文件目录不是唯一的(多个盘符)
5、挂载文件系统
linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构;这里所说“按一定方式”就是指的挂载
通俗的说,将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使它们成为一个整体,称为挂载;我们把这个子目录叫“挂载点”
注意几点:
1. 挂载点必须是一个目录
2. 一个分区挂载在一个已存在的目录上,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用;对于其他操作系统建立的文件系统的挂载也是这样
挂载前要了解linux是否支持所要挂载的文件系统格式
6、mount结构与原理
在 Kernel 世界里,挂载是一项很了不起的特性,它可以将不同类型的文件系统组合成一个有机的整体,从使用者角度来看不同的文件系统并没有什么区别,那么 Kernel 是怎么做到呢?
首先,Kernel 会为每个文件系统准备一个 mount 结构,然后再把这个结构加入到 vfs 这颗大树上就好了。
这么一个小小的 mount 结构就这么神奇?
请看图,一个 mount 中有三个很重要的成员,他们分别指向父 mount 结构(6)、本文件系统自己的根目录(7)和本文件系统的挂载点(8)。
前两个很好理解,那么挂载点是什么呢?简单地说挂载点就是父级文件系统的某个目录(父级文件系统中的目录表示),一旦将某个文件系统efs挂载到某个目录上/home/a/,这个目录/home/a/就成了该文件系统efs的根目录了。并且该目录/home/a/的标志位 DCACHE_MOUNTED 将被置位,这将表明这个目录已经是一个挂载点了,如果要访问这个目录/home/a/的话就要顺着 mount 结构访问另一个文件系统了(因为efs能力处理/home/a/以下的内容,之上的内容就是另一个文件系统里的内容了),原来的内容将变得不可访问。
现在我们从图的左边讲起,带你一窥 mount 的风采。一个进程有一个叫 root 的 path 结构,它就是本进程的根目录(大多数情况下它就是系统根目录),root 中两个成员分别指向某个文件系统的 mount 结构(其实是指向 mount.mnt 但这样理解没问题)(1)(rootfs文件系统的mount结构)和该文件系统的根目录(2)(就是/目录),这个文件系统就是所谓根文件系统(在图中就是 rootfs)。由于它是根文件系统,所以它的父 mount 结构就是它自己(4)它的挂载点就是它自己的根目录(5)。
但是 rootfs 只是一个临时的根文件系统,在 Kernel 的启动过程中加载完 rootfs 之后会紧接着解压缩 initramfs 到 rootfs 中,这里面包括了驱动以及加载真正的根文件系统的工具,Kernel 通过加载这些驱动、使用这些工具实现了挂载真正的根文件系统。之后 rootfs 将退出历史舞台,但作为文件系统的总根 rootfs 并不会被卸载(注)。图中 fs1 就是所谓的真正的根文件系统,Kernel 把它挂载到了 rootfs 的根目录上(8),并且将它的父 mount 结构指向了 rootfs(6)。这时访问根目录的话就会直接访问到 fs1 的根目录,而 rootfs 就好像不存在了一样。
再看 fs1,他有一个子目录“mnt/”,以及“mnt/”的子目录“a”,此时路径“/mnt/a/”是可访问的。但现在我们还有另一个文件系统 fs2,我们把它挂载到“/mnt/”上会发生什么呢?首先 fs2 的父 mount 将指向 fs1(9),然后 fs2 的挂载点将指向 “/mnt/”(10),同时“mnt/”的 DCACHE_MOUNTED 将被置位。此时路径“/mnt/a/”就不可访问了,取而代之的是“/mnt/b/”。本着不怕麻烦的精神我们再折腾一下,把 fs3 也挂载到“/mnt/”上,这时和挂载 fs2 一样父 mount 将指向 fs2(11),但是挂载点应该指向哪里呢?答案是 fs2 的根目录(12)。这时“/mnt/b/”也消失了,我们只能看见“/mnt/c”了。这样整个结构就形成了一个挂载的序列,最后挂载的在序列末尾,Kernel 可以很容易的通过这个序列找到最初的挂载点和最终的文件系统。
在顺序查找的情景下,当遇到一个目录时 Kernel 会判断这个目录是不是挂载点(检查 DCACHE_MOUNTED 标志位),如果是就要找到挂载到这个目录的文件系统,继而找到该文件系统的根目录,然后在判断这个根目录是不是挂载点,如果是那就再往下找直到某个文件系统的根目录不再是挂载点。
反向查找也和顺序查找类似。
7、mount 和umount命令
挂载:把分区和目录对应的过程 建立映射
挂载点:挂载在文件树中的位置
mount 参数 设备名称 挂载点
-a 安装在/etc/fstab文件中列出的所有文件系统.
-l 列出当前已挂载的设备,文件系统名称和挂载点
-o 指定挂载选项,
-t 文件系统类型,指定设备的文件系统类型,
ext2
Msdos
Vfat
Nfs
iso9660
Audo 自动检测文件系统