0x01 Linux 分区简介
0x02 挂载点目录简介
以上是目录结构 以下是文件存储结构 在linux正统的文件系统(eg:ext2、ext3)中,一个文件由以下三个部分组成: 1. 目录项:包括文件名和inode节点号。 2. Inode::又称文件索引节点,记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码。 3. data block:实际记录文件的内容,若文件太大时,会占用多个block。
0x03 实战分区挂载
$ mount /dev/sda3 /data ##sda3分区挂载在data目录下
$ umount /data ##卸载data目录下分区
LABEL=/data /data ext3 defaults 1 2
修改为:
/dev/sda3 /data ext3 defaults 1 2
PS:fstab 是文件系统分配表的配置文件,该文件有着严格的语法格式限制,类似 crontab 一样,保存时也会对你的输入格式进行校验,请慎重使用,否则会有意想不到的问题发生。其一共有 6 个字段,空格分隔。
modprobe
加载其模块(这个模块包含了 loop device 的驱动程序以及 losetup 这种提供给用户来操作 loop device 的程序), 这时其驱动程序就回创建 /dev/loop0, /dev/loop1 … 这几个设备文件.
注意, 我在说档案的时候, 指的是英文中的 archive, 它和文件 file 是不同的东西, 档案 archive 是一个打包的文件集, 里面一般包含许多文件, 比如 tar, jar, iso 就是常见的档案格式.
用过 dd 的人应该知道, 这个强大的命令可以将整个磁盘或者磁盘分区克隆下来, 放到一个文件里, 一般, 这样的文件我们都以 .img 后缀为其命名并称这样的文件为镜像文件. 我所说的档案也包含这类情况.
5.loop mount
ok, 明白了什么是 loop device, 也明白了档案是什么, 那么到底如何把一个档案挂载到某个目录下呢?
实际上 loop mount 采取了一个瞒天过海的方式, 它先将这个档案映射到某个 loop device 上, 像这样:
通过这种方式来欺骗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 来实现虚拟光驱的功能.
6.绑定式挂载 (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 手册里这个说法是什么意思. 我只能这么理解: 目录也是文件, 所以这种说法没错吧….
7.重新挂载 (remount)
借助于绑定式挂载, 可以实现有趣的效果, 比如说, 你可以将 / 绑定到 /, 将 /tmp/test/ 绑定到 /tmp/test/ (运行 mount 命令就能看到效果). 不过… 这么干有个鸟用啊!! 谁这么无聊会去这么干啊!!
这就是 remount 存在的原因, 我们虽然可以通过绑定式挂载耍点小聪明, 将自己绑定到自己上, 但这与没绑定没有任何区别啊; 然而借助 remount, 我们就可以在重新挂载的时候修改挂载的参数.
remount 最常用的情况就是将一个文件系统由只读重新挂载为读写, 或者相反. 比如:
# mount -o remount,rw /
关于 remount 的详情, 可以看一下 man 手册, 这里就不多介绍了.
# losetup /dev/loop0 xxxx.iso
0x04 通过 fstab 设置开机挂载的问题
Linux 在启动的时候通过 fstab 中的信息挂载各个分区,一个典型的分区条目就像这样:
/dev/sda3 /data ext3 defaults 1 2
/dev/sda3 为需要挂载的分区,sda3是 Linux 检测硬盘时按顺序给分区的命名,一般来讲,这个名称并不会变化,但是如果你有多块硬盘,硬盘在电脑中的顺序变化的时候,相同的名称可能代表着不同的硬盘分区。这样的话上面设置的开机自动挂载就会出现找不到分区上面的文件情况 这个时候 UUID 就派上用场了,UUID 全称是 Universally Unique Identifier,也就是说,每个分区有一个唯一的 UUID 值,这样就不会发生分区识别混乱的问题了。 在 fstab 中用 UUID 挂载分区格式如下:
UUID=7cc82613-5be2-4e58-b359-0920613f9509 /data ext3 defaults 1 2
可以通过下面命令得到分区的UUID
$ ls -l /dev/disk/by-uuid/
0x05 FAQ
a. 挂载点不一定是一个目录, 可以是文件 b. 一个分区挂载在一个已存在的目录上,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用。对于其他操作系统建立的文件系统的挂载也是这样,卸载后,目录以前的文件都还在,不会有任何丢失 c. 目录只占磁盘里的一个inode,存放文件属性等信息 d. 任何一个分区都必须挂载到某个目录上 e. 目录是逻辑上的。分区是物理上的. f. 磁盘Linux分区都必须挂载到目录树中的某个具体的目录上才能进行读写操作 g. 根目录是所有Linux的文件和目录所在的地方,需要挂载上一个磁盘分区 h. 一个分区可以挂在多个目录,但反过来一个目录只能是一个分区的挂载点
参考:
http://cn.linux.vbird.org/linux_basic/0230filesystem_6.php#special_waste