挂载(mount)机制详解
一直对挂载有些迷惑,因此查了很多资料,在这里进行一个汇总
什么是挂载?
wiki 上的定义:
Mounting takes place before a computer can use any kind of storage device (such as a hard drive, CD-ROM, or network share). The user or their operating system must make it accessible through the computer’s file system. A user can only access files on mounted media.
挂载操作, 实际上是把设备device中的文件系统附加到dir上, 然后我们就可以通过访问dir来访问这个设备。
为什么要挂载?
因为在 Linux 中所有的数据和设备都是以文件的形式来体现的,而文件又是放置在目录下的,所以在 Linux 中的目录结构管理变得至关重要。所谓的目录结构 (directory tree) 就是以根目录为主,然后向下呈现分支的目录结构的自用文件结构。所以对Linux来说磁盘设备也是一个文件,而磁盘分区也是一个文件,要将这个文件放置在哪个目录,或者说哪个目录为分区的入口,这个设置过程被称为挂载,而该目录被称为挂载点。
如果不挂载,通过Linux系统中的图形界面系统可以查看找到硬件设备,但命令行方式无法找到。
具体参考这篇知乎文章Linux操作系统为什么要挂载硬盘?
挂载原理
跟据Jerome H.Saltzer 和 M.Frans Kaashoek 的 Principles of Computer System Design 2.5.10,挂载是通过符号连接层实现的,即通过符号连接或软连接将一个文件名绑定至另一个文件名,并且将挂载点目录项对应的inode的type域设置为SYMLINK,在lookup到这个文件系统挂载点的时候经过一系列操作(详见挂载流程)转换到被挂载文件系统,比如某个磁盘,或者某个分区,使用它的根目录对应的inode继续查询。
硬连接vs软连接(符号连接)
硬连接是直接绑定至inode,是更低一层的名字空间的名字,软连接是绑定至文件名,是同一名字空间的另一个名字。由于每个文件系统都有自己独立的inode号名字空间,所以硬连接只能连接到同一文件系统中的文件,而文件名是属于整个操作系统的名字空间,所以可以连接到其他磁盘的文件(也因此挂载是由软连接而不是硬连接实现)。
挂载流程
所有挂载点的信息都是保存在内存中的,所以关机之后就要重新挂载(/ ,/home, /root等一些重要分区会自动挂载之外)具体是怎么挂载的,如何确定挂载的是哪个磁盘,我觉得这篇文章写的非常清晰:linux文件系统之mount流程分析
关于分区
一个分区就是一个文件系统(file system),一个磁盘可以有最多四组分区,包括主分区 (Primary Patition) 和扩展分区(Extended Partition),其中扩展分区可以分为多个逻辑分区,每个分区在分配好时都有固定的大小,且大小是柱面大小的整数倍,也就是说,分区的最小单位为柱面 (cylinde)。
磁盘在系统中都会有一个名字,比如/dev/sda,/dev/sdb等等,然后磁盘上的分区的名字就是在后面加一个1-4的十进制数,比如/dev/sda1,5以及之后的数字是逻辑分区的名字,详情参考Device Names in Linux。
有几个比较特殊的分区,在装Linux系统的时候就会需要分好,包括主分区(挂载到/),home分区(挂载到/home,用于放用户目录,就是我们每次登陆进去都可以看到处于一个波浪线~的位置,如果pwd
就会发现是我们登陆的用户的用户目录的路径,如果没有这个分区的话可能会无法登录),交换分区(挂载到/swap,用于内存交换)。
每个分区在创建的时候就已经分配了大小,当把一个分区挂载到另一个分区里面的某个目录的时候,是不会占用该分区的储存空间的(但是挂载之前要新建一个空文件夹,这是会占一小丢丢空间的),只会通过一个软连接链接到那个分区。所以看某个目录在哪个分区,应该是先df -h
,然后看Mounted on
那一列,找到最靠近自己的父目录,然后看其对应的分区是哪一个。
分区必须要挂载到目录结构 (directory tree)里面才可以被使用,被挂载的目录就是该分区的根目录,所以被用来挂载的目录必须是个空目录,否则里面的内容会不见。一个文件在该分区的路径为/a.txt,然后该分区被挂载到/home,那么在整个操作系统中要访问该文件就应该用/home/a.txt,如果挂载之前没有把/home下面的内容进行一个备份,那么原来的内容就访问不了了,而且还可能导致其无法释放。不过一般不会直接挂载到/home,而是新建一个文件夹专门用于挂载,但是也不是不行,可以参考这篇文章:ubuntu18.04、20.04 磁盘分区并挂载到home下(更换home的挂载分区),毕竟自己的电脑,随便作。