[原创]一起认识几种挂载

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
头像
cifer
帖子: 140
注册时间: 2011-10-24 23:37
系统: Debian Wheezy
联系:

[原创]一起认识几种挂载

#1

帖子 cifer » 2014-05-06 22:55

这两天写了一篇文章, 是我个人对"挂载"的认识, 发在了博客里. 想想在社区潜水好几年了从来没发过什么贴, 就顺便贴在这里, 和大家一起讨论学习. 希望对不知道的人有帮助作用, 大侠可以略过不看.... :em02

首先引用一句 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.
意思是说, “挂载” 发生在计算机想要使用任何类型的存储设备 (如硬盘, CD-ROM, 网络设备) 之前. 操作系统必须将这个设备纳入自己的文件系统中去.

要注意的是, 这里的存储设备不一定必须是外部的存储设备, 也可以是你安装系统的硬盘上的分区.

例子先

光看上面说的还不够, 先看个例子吧, 这个例子摘自 man mount, 在 man 手册中这个例子下的一句话非常好的解释了 mount 到底是什么.

代码: 全选

mount -t _type_ _device_ _dir_
在这个例子下面有这么一句话:
This tells the kernel to attch the filesystem fount on device (which is of type type) at the directory dir.
这句话非常重要, 我们一定要明白, 挂载操作, 实际上是把设备 device 中的文件系统附加到 dir 上, 然后我们就可以通过访问 dir 来访问这个设备.

明白了这一点, 我们就能明白 “挂载” 的本质了, 挂载的本质就是针对某一设备, 分析出其文件系统结构, 并根据其文件系统类型调用 linux 中相应的驱动, 处理其的元数据, 将这些信息附加到 linux 的目录树上呈现出来.

明白这一点之后, 后面的 bind mount, loop mount 以及 remount 的区别就能够很清楚了.

挂载点

什么是挂载点呢? 还是先借用 Wiki 上的一句话:
A mount point is a physical location in the partition used as a root filesystem.
不幸的是, Wiki 上的这句话并不准确, 这句话的意思也就是说 “挂载点就是 root 分区中的一个位置”, 这句话错在 “root 分区” 上.

我们知道在安装 Linux 系统时可能会为磁盘分多个区, 最普遍的情况就是很多用户会给 /home 目录单独分一个区. 而且有一部分用户还会在 /home/username 目录下建立一个专门用来挂载各种设备的目录 (如 /home/username/mnt-point) 而不使用系统的 /mnt 目录. 那么这时候, 难道说 /home/username/mnt-point 这个目录就不是挂载点了吗? 显然它也是挂载点, 但它确并不是位于 root 分区 (即 / 分区).

国外有一篇文章, 用毫不装逼的方式说出了”挂载点”的本质:
In simple words a mount point is a directory to access your data (files and folders) which is stored in your disks.
所以说白了, 挂载点就是一个目录. 所以下文中当我应该说”挂载到某一挂载点”的时候我都直接说”挂载到某一目录”.
(注意: 在绝大多数情况下这句话是成立的, 下文的 Update 一节, 有一种非常特殊的情况使得这句话并不成立.)

假设备挂载 (loop mount)

loop device

明白 loop mount 之前, 最好先清除什么是 loop device, 有耐心的话可以参见维基百科中的条目, 比较长, 没耐心的话可以直接看我下面的描述, 简洁些.

简单来说, loop device 能够提供将一个档案挂载到某一目录的功能. 这和 bind mount (下文会介绍) 有些类似, 但并不相同. 原始的 mount 只是为了将正常的设备挂载, bind mount 使得可以挂载目录, 而 loop device 使得可以挂载档案.

在 linux 中, loop device 就是指 /dev/loop0, /dev/loop1, /dev/loop2 … 这些设备, 它们是虚假的设备(pseudo device), 不像 /dev/sda 在你的主机里物理存在. loop device 需要你在编译内核的时候将其静态编译或者编译为动态模块, 然后需要使用 modprobe 加载其模块(这个模块包含了 loop device 的驱动程序以及 losetup 这种提供给用户来操作 loop device 的程序), 这时其驱动程序就回创建 /dev/loop0, /dev/loop1 … 这几个设备文件.

档案

注意, 我在说档案的时候, 指的是英文中的 archive, 它和文件 file 是不同的东西, 档案 archive 是一个打包的文件集, 里面一般包含许多文件, 比如 tar, jar, iso 就是常见的档案格式.

用过 dd 的人应该知道, 这个强大的命令可以将整个磁盘或者磁盘分区克隆下来, 放到一个文件里, 一般, 这样的文件我们都以 .img 后缀为其命名并称这样的文件为镜像文件. 我所说的档案也包含这类情况.

loop mount

ok, 明白了什么是 loop device, 也明白了档案是什么, 那么到底如何把一个档案挂载到某个目录下呢?

实际上 loop mount 采取了一个瞒天过海的方式, 它先将这个档案映射到某个 loop device 上, 像这样:

代码: 全选

# losetup /dev/loop0 xxxx.iso
通过这种方式来欺骗 mount 命令, 让 mount 命令以为 /dev/loop0 上面真的有设备. 这时运行 mount 就行了:

代码: 全选

# mount -t iso9660 /dev/loop0 /path/to/mount/point
这么看起来, 当你想挂载某一个档案的时候(比如某个 iso), 你首先得把这个档案和某一个 loop device 关联起来, 使用 losetup 命令. 然后使用 mount 命令将这个 loop device 设备挂载到某个目录上. 实际上不必这样, mount 命令自身其实就有一个能把这两步合并的功能, 那就是这样:

代码: 全选

# mount -t iso9660 -o loop /dev/loop0 /path/to/mount/point
最后我们再来想一想, 是不是所有的档案都可以用这种方式挂载? 显然不是的, 根据 mount 命令有个 -t 参数来看, 在挂载的时候是需要指定文件系统的类型的(不指定的话 mount 命令会自动识别), 还记得上面说的挂载的本质吗?

"挂载操作, 实际上是把设备 _device_ 中的**文件系统**附加到 _dir_ 上,".
不被识别的文件系统是不能被挂载的, 如果你没有加载 ReiserFS 模块, 那么挂载具有 ReiserFS 文件系统的设备时就会报 “unknown file system” 错误. 像上面说的 tar, jar, zip 这样的档案, 它们只是一种打包/压缩格式, 本身就不是一种文件系统格式, 当然是不能被 linux 识别的. 它们虽然可以映射到某一个 loop device, 但并不能被挂载.

但是像 .iso 文件, 它一般包含 iso 9660 文件系统, 都知道这是一种 CD 上采用的文件系统. 还有就是你可以使用 dd, mkfs 命令来创建一个 ext2, ext3 等文件系统的档案. 这样的档案才是可以被挂载的.

loop mount 一直以来是 Unix-like 系统下很有用的特性, 能帮助你当你拿到一个 iso 文件后, 不必将其刻录到 CD/DVD 里就能查看里面的内容. windows 下直到 windows 7 才支持这一特性, 在此之前都需要借助第三方软件如 Daemon Tools 来实现虚拟光驱的功能.

绑定式挂载 (bind mount)

上面所说的 “挂载” 都是指让你将某个设备挂载到某一目录, 不管这个设备是真实的物理设备, 还是假的 loop 设备, 它都是设备. 而 “绑定式挂载” 能够允许你将已经的存在目录挂载到另一目录. 比如:

代码: 全选

 #  mount --bind / /home/username/mnt-point
这样, 你的 mnt-point 目录下也会有 etc, opt, usr 等目录, 这一过程我们称作 “将根目录绑定到 /home/username/mnt-point 上”, 所以, 你在一处改变目录下的内容的话, 在另一处也能够看到改变.

需要注意的一点是如果根目录树下有某个目录是挂载到另一个磁盘分区的话, 那么它可能不会被绑定到新的目录下. 比如说如果 /usr 和 / 处于不同的磁盘分区(/ 在 sda1, /usr 在 sda2), 那么你可能会发现 /home/username/mnt-point/usr 是空的, 那么这时可以额外挂载一次来使得 /usr 也出现在 /home/username/mnt-point/usr:

代码: 全选

 #  mount --bind /usr /home/username/mnt-point/usr
不过你也可以在一开始就执行:

代码: 全选

 #  mount --rbind / /home/username/mnt-point
关于绑定式挂载, man 2 mount 中的描述是 “使一个文件, 或者一个目录树在另一个目录上可见”. 这地方不太理解, 就我所知, 只能将目录绑定到目录, 不能将文件绑定到目录的. 我尝试过将一个普通的文件绑定到目录, 但报错了. 不知道 man 手册里这个说法是什么意思. 我只能这么理解: 目录也是文件, 所以这种说法没错吧….

重新挂载 (remount)

借助于绑定式挂载, 可以实现有趣的效果, 比如说, 你可以将 / 绑定到 /, 将 /tmp/test/ 绑定到 /tmp/test/ (运行 mount 命令就能看到效果). 不过… 这么干有个鸟用啊!! 谁这么无聊会去这么干啊!!

这就是 remount 存在的原因, 我们虽然可以通过绑定式挂载耍点小聪明, 将自己绑定到自己上, 但这与没绑定没有任何区别啊; 然而借助 remount, 我们就可以在重新挂载的时候修改挂载的参数.

remount 最常用的情况就是将一个文件系统由只读重新挂载为读写, 或者相反. 比如:

代码: 全选

# mount -o remount,rw /
关于 remount 的详情, 可以看一下 man 手册, 这里就不多介绍了.

supermount

“超级挂载”, 这个项目的目的是让你能够免去手动 mount/umount 的过程, 达到 “插上 U 盘就开始拷文件” 以及 “拷完文件就拔掉 U 盘” 的效果.

Update:

经 @astolia 大侠指正, 关于 "绑定式挂载", 虽然不能将一个文件挂载到目录, 但确是可以将一个文件挂载到另一个文件的! 比如说这样:

代码: 全选

# touch /tmp/test
# touch /tmp/test2
# echo "hello mount" > /tmp/test
# mount --bind /tmp/test /tmp/test2
然后你再去查看 /tmp/test2, 会发现它也有 "hello mount" 这个内容.

所以这样一开始说的 "挂载点就是目录" 这个说法也不太对了.....

再次感谢 @astolia, 又学到新东西啦~~

原文: http://cifer-lee.github.io/2014/05/06/m ... ation.html
上次由 cifer 在 2014-05-07 11:57,总共编辑 1 次。
自由, 是对人一生最重要的东西.

终于给博客想了个清新脱俗的名字, 望星听雨

听说这里挂推能够涨 fo, 于是... @cifer
ipposis
帖子: 333
注册时间: 2013-12-23 13:42

Re: [原创]一起认识几种挂载

#2

帖子 ipposis » 2014-05-07 1:27

一直都是这样子
mount ./xx.iso ./xx -o loop
mount /dev/hda1 ./xx

郁闷的是fstab里的1和2都是干啥的,man是英文的
poloshiao
论坛版主
帖子: 18279
注册时间: 2009-08-04 16:33

Re: [原创]一起认识几种挂载

#3

帖子 poloshiao » 2014-05-07 7:59

什么是挂载点呢? 还是先借用 Wiki 上的一句话:
A mount point is a physical location in the partition used as a root filesystem.
不幸的是, Wiki 上的这句话并不准确, 这句话的意思也就是说 “挂载点就是 root 分区中的一个位置”, 这句话错在 “root 分区” 上.
以下 假設實例 提供思考
1. /dev/sda1 掛載 /
1-1. df /
/dev/sda1
2. 想要掛載 /dev/sda2 到 /data
2-1. 先產生 /data
sudo mkdir /data
2-2. df /data
/dev/sda1
3. 掛載 /dev/sda2 到 /data
sudo mount /dev/sda2 /data
3-1. df /data
/dev/sda2
4. 卸載 /dev/sda2 或 /data
sudo umount /dev/sda2

sudo umount /data
4-1. df /data
/dev/sda1
5. 如果說 掛載點是 /data
那麼 卸載 /dev/sda2 或 /data
重新開機
意思是 還沒在 /etc/fstab 加上 掛載 /dev/sda2 到 /data 這一行
5-1. sudo ls -al /data
會發現 還是有的 只是內容是空的
5-2. df /data
/dev/sda1
5-3. 移除 /data
sudo rmdir /data
重開機
5-4. sudo ls -al /data
會發現 出現 /data 不存在的錯誤 訊息

6. 以上 重點在測試 /data 是在 /dev/sda1 還是 /dev/sda2

7. 如有錯誤 歡迎更正.

8. 欣賞你的分享.
上次由 poloshiao 在 2014-05-07 8:13,总共编辑 3 次。
poloshiao
论坛版主
帖子: 18279
注册时间: 2009-08-04 16:33

Re: [原创]一起认识几种挂载

#4

帖子 poloshiao » 2014-05-07 8:04

郁闷的是fstab里的1和2都是干啥的,man是英文的
可以把 1 和 2 的內容 複製 貼上來嗎
可以避免 提供錯誤的理解 給你
头像
cifer
帖子: 140
注册时间: 2011-10-24 23:37
系统: Debian Wheezy
联系:

Re: [原创]一起认识几种挂载

#5

帖子 cifer » 2014-05-07 9:41

poloshiao,

如果 / 是放在 /dev/sda1 上的, 而且安装系统的时候没有创建 /data 目录, 那么安装完系统之后 /etc/fstab 应该是类似这样:

代码: 全选

/dev/sda1      /        ext4        errors=remount-ro        0    1
如此, 在创建 /data 目录的时候, /data 目录自然是位于 /dev/sda1 的啦. 那么这时将 /dev/sda2 挂载到 /data 上, 也就是将 /dev/sda2 挂载到 "root 分区" 的目录树上.

如果在安装系统的时候, 你特意将 /home 目录安装到了 /dev/sda3 分区上, 那么装完系统后 /etc/fstab 应该是类似这样的:

代码: 全选

/dev/sda1      /                ext4        errors=remount-ro        0    1
/dev/sda3      /home        ext4        defaults                       0    2
如果创建一个目录 /home/data, 那么这里 /home/data 自然是位于 /dev/sda3 上, 将 /dev/sda2 挂载到 /home/data 的话, 那就不是 "root 分区" 了
自由, 是对人一生最重要的东西.

终于给博客想了个清新脱俗的名字, 望星听雨

听说这里挂推能够涨 fo, 于是... @cifer
头像
cifer
帖子: 140
注册时间: 2011-10-24 23:37
系统: Debian Wheezy
联系:

Re: [原创]一起认识几种挂载

#6

帖子 cifer » 2014-05-07 9:46

ipposis,

你说的是 /etc/fstab 文件中最后一列的 1 或 2 吧, 那个是在系统启动时告诉系统先检查那个文件系统的, 一般 / 和 /boot 的这个值是 1, 代表先检查这两个文件系统, 其它的一般都是 2
自由, 是对人一生最重要的东西.

终于给博客想了个清新脱俗的名字, 望星听雨

听说这里挂推能够涨 fo, 于是... @cifer
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: [原创]一起认识几种挂载

#7

帖子 eexpress » 2014-05-07 10:00

挂载,就是给设备分配一个地方(路径)而已,然后通过不同的方法(协议)让设备能用。
● 鸣学
头像
astolia
论坛版主
帖子: 6450
注册时间: 2008-09-18 13:11

Re: [原创]一起认识几种挂载

#8

帖子 astolia » 2014-05-07 10:40

楼主的认识存在一些问题。
cifer 写了:所以说白了, 挂载点就是一个目录
这个就错了,导致后面跟着出了一些错
cifer 写了:关于绑定式挂载, man 2 mount 中的描述是 “使一个文件, 或者一个目录树在另一个目录上可见”. 这地方不太理解, 就我所知, 只能将目录绑定到目录, 不能将文件绑定到目录的. 我尝试过将一个普通的文件绑定到目录, 但报错了. 不知道 man 手册里这个说法是什么意思. 我只能这么理解: 目录也是文件, 所以这种说法没错吧….
man 2 mount查出来的原文是
MS_BIND (Linux 2.4 onward)
Perform a bind mount, making a file or a directory subtree visi‐
ble at another point within a filesystem.
里面可没有说是绑定到目录

man 8 mount才是mount命令的用法,那里面写的更清楚
One can also remount a single file (on a single file)
也就是说,如果要绑定一个文件,目标也必须是一个文件

代码: 全选

touch /tmp/a
sudo mount --bind /dev/sda /tmp/a
头像
tang.zhe
帖子: 1505
注册时间: 2010-07-15 13:31

Re: [原创]一起认识几种挂载

#9

帖子 tang.zhe » 2014-05-07 11:13

marks
poloshiao
论坛版主
帖子: 18279
注册时间: 2009-08-04 16:33

Re: [原创]一起认识几种挂载

#10

帖子 poloshiao » 2014-05-07 11:23

fstab里的1和2都是干啥的
1. /etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
2. 最後兩欄位是 dump 及 pass
https://help.ubuntu.com/community/Fstab#Dump
2-1. Dump
This field sets whether the backup utility dump will backup file system. If set to "0" file system ignored, "1" file system is backed up.
Dump is seldom used and if in doubt use 0.
一般設定 0 如果設定 1 檔案系統將會使用 dump 備存
2-2. Pass (fsck order)
Fsck order is to tell fsck what order to check the file systems, if set to "0" file system is ignored.
Often a source of confusion, there are only 3 options :
0 == do not check.
1 == check this partition first.
2 == check this partition(s) next
In practice, use "1" for your root partition, / and 2 for the rest. All partitions marked with a "2" are checked in sequence and you do not need to specify an order.
Use "0" to disable checking the file system at boot or for network shares.
You may also "tune" or set the frequency of file checks (default is every 30 mounts) but in general these checks are designed to maintain the integrity of your file system and thus you should strongly consider keeping the default settings.

通常發生在開機掛載過程
預設 每掛載 30 次 會使用 fsck 檢查 該檔案系統 目的 檢查 檔案系統 是否健全 次數可以微調
設為 0 不檢查 (例如 : Fat32 / NTFS 不能使用 fsck 指令檢查)
設為 1 最優先檢查 通常 / 設為 1
設為 2 次優先檢查 通常 / 以外的 掛載 檔案系統 不須再區分檢查順序 由系統安排
上次由 poloshiao 在 2014-05-07 11:41,总共编辑 1 次。
头像
cifer
帖子: 140
注册时间: 2011-10-24 23:37
系统: Debian Wheezy
联系:

Re: [原创]一起认识几种挂载

#11

帖子 cifer » 2014-05-07 11:40

astolia 写了:楼主的认识存在一些问题。
cifer 写了:所以说白了, 挂载点就是一个目录
这个就错了,导致后面跟着出了一些错
cifer 写了:关于绑定式挂载, man 2 mount 中的描述是 “使一个文件, 或者一个目录树在另一个目录上可见”. 这地方不太理解, 就我所知, 只能将目录绑定到目录, 不能将文件绑定到目录的. 我尝试过将一个普通的文件绑定到目录, 但报错了. 不知道 man 手册里这个说法是什么意思. 我只能这么理解: 目录也是文件, 所以这种说法没错吧….
man 2 mount查出来的原文是
MS_BIND (Linux 2.4 onward)
Perform a bind mount, making a file or a directory subtree visi‐
ble at another point within a filesystem.
里面可没有说是绑定到目录

man 8 mount才是mount命令的用法,那里面写的更清楚
One can also remount a single file (on a single file)
也就是说,如果要绑定一个文件,目标也必须是一个文件

代码: 全选

touch /tmp/a
sudo mount --bind /dev/sda /tmp/a
:em02 受教啦, 在知道了能够 "将一个文件绑定到另一个文件上" 之后, "挂载点就是一个目录" 的说法确实不对啊.... 我得马上改改, 以免误导众人.

我是觉得 man 2 mount 这个是系统调用, man 8 mount 里的 mount 命令是要调用这个系统调用的, 所以没仔细看 man 8 mount ... 还是大侠认识的更深啊~~
自由, 是对人一生最重要的东西.

终于给博客想了个清新脱俗的名字, 望星听雨

听说这里挂推能够涨 fo, 于是... @cifer
头像
astolia
论坛版主
帖子: 6450
注册时间: 2008-09-18 13:11

Re: [原创]一起认识几种挂载

#12

帖子 astolia » 2014-05-07 11:49

poloshiao 写了:例如 : Fat32 / NTFS 不能使用 fsck 指令檢查
这句不对。能不能用fsck是看有没有对应的filesystem的checker。
ubuntu中默认安装的dosfstools就提供了fsck.vfat来处理fat32。
记得以前源里有个处理ntfs的工具提供了fsck.nfts,现在没了。
但ntfs-3g包提供了/bin/ntfsck,如果做个软链接,还是可以让fsck用的

代码: 全选

sudo ln -s /bin/ntfsck /sbin/fsck.ntfs
不过要做开机挂载时检查,可能还要预先加载相应的模块
头像
adagio
论坛版主
帖子: 22110
注册时间: 2008-02-17 23:47
来自: 美丽富饶的那啥星球

Re: [原创]一起认识几种挂载

#13

帖子 adagio » 2014-05-07 12:02

A mount point is a physical location in the partition used as a root filesystem.
楼主,我觉得上面这句话,应该是“挂载点就是存在于根文件系统下某个物理分区的已有位置
不像是你说的“root 分区”的意思吧?当然我英文不行,只是按照我所理解去翻译,至于他的原意表达的对不对我还真说不清
如果以我理解的话,这句话应该没有什么问题,因为mount命令的最终目标参数必须是类似于 /xxx/xxx/xxx 这样的,即使是loop挂载也必须指向某个已存在的目录,当然也就是在根文件系统亦即root filesystem之下
明天就换大三八!
——8核CPU、8G内存、8T硬盘……
8卡交火,80寸大屏放8个……
IPv8的光纤要8条……

---------------------------------------------------------------------------------
[图片版]新手当自强(续)FAQ
[新手进阶]挂载、fstab、调整linux分区
[图片版]E17桌面环境配置手把手
头像
cifer
帖子: 140
注册时间: 2011-10-24 23:37
系统: Debian Wheezy
联系:

Re: [原创]一起认识几种挂载

#14

帖子 cifer » 2014-05-07 13:24

adagio,

我觉得这句话直译过来确实应该是 "一个挂载点就是用作 root 文件系统的磁盘分区上的一个物理位置".
主要是这句话里面的 "partition" 这个单词让我有点迷糊, 要知道, "partition" 这个单词确实是在各类英文计算机文章里都表示磁盘分区的意思

其实我也更倾向于你的说法, 即使是 /home, /var, /usr 这些目录与 / 不处于同一个磁盘分区, 他们都是根文件系统的 subtree, 也都属于根文件系统的.
自由, 是对人一生最重要的东西.

终于给博客想了个清新脱俗的名字, 望星听雨

听说这里挂推能够涨 fo, 于是... @cifer
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

Re: [原创]一起认识几种挂载

#15

帖子 YeLee » 2014-05-07 14:57

这论坛的高手真多,菜鸟进来学习了。 :em11
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
回复