7.4 设置开机挂载

手动处理 mount 不是很人性化,我们总是需要让系统“自动”在开机时进行挂载的!本小节就是在谈这玩意儿! 另外,从 FTP 服务器捉下来的镜像文件能否不用烧录就可以读取内容?我们也需要谈谈先!

7.4.1 开机挂载 /etc/fstab 及 /etc/mtab

刚刚上面说了许多,那么可不可以在开机的时候就将我要的文件系统都挂好呢?这样我就不需要每次进入 Linux 系统都还要在挂载一次呀!当然可以啰!那就直接到 /etc/fstab 里面去修修就行啰!不过,在开始说明前,这里要先跟大家说一说系统挂载的一些限制:

  • 根目录 / 是必须挂载的﹐而且一定要先于其它 mount point 被挂载进来。
  • 其它 mount point 必须为已创建的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则 (FHS)
  • 所有 mount point 在同一时间之内﹐只能挂载一次。
  • 所有 partition 在同一时间之内﹐只能挂载一次。
  • 如若进行卸载﹐您必须先将工作目录移到 mount point(及其子目录) 之外。

让我们直接查阅一下 /etc/fstab 这个文件的内容吧!

[root@study ~]# cat /etc/fstab
# Device                              Mount point  filesystem parameters    dump fsck
/dev/mapper/centos-root                   /       xfs     defaults            0 0
UUID=94ac5f77-cb8a-495e-a65b-2ef7442b837c /boot   xfs     defaults            0 0
/dev/mapper/centos-home                   /home   xfs     defaults            0 0
/dev/mapper/centos-swap                   swap    swap    defaults            0 0

其实 /etc/fstab (filesystem table) 就是将我们利用 mount 指令进行挂载时, 将所有的选项与参数写入到这个文件中就是了。除此之外, /etc/fstab 还加入了 dump 这个备份用指令的支持! 与开机时是否进行文件系统检验 fsck 等指令有关。 这个文件的内容共有六个字段,这六个字段非常的重要!你“一定要背起来”才好! 各个字段的总结数据与详细数据如下:

鸟哥的图示

Tips 鸟哥比较龟毛一点,因为某些 distributions 的 /etc/fstab 文件排列方式蛮丑的, 虽然每一栏之间只要以空白字符分开即可,但就是觉得丑,所以通常鸟哥就会自己排列整齐, 并加上注解符号(就是 # ),来帮我记忆这些信息!

[设备/UUID等]  [挂载点]  [文件系统]  [文件系统参数]  [dump]  [fsck]
  • 第一栏:磁盘设备文件名/UUID/LABEL name:

这个字段可以填写的数据主要有三个项目:

  • 文件系统或磁盘的设备文件名,如 /dev/vda2 等
  • 文件系统的 UUID 名称,如 UUID=xxx
  • 文件系统的 LABEL 名称,例如 LABEL=xxx

因为每个文件系统都可以有上面三个项目,所以你喜欢哪个项目就填哪个项目!无所谓的!只是从鸟哥测试机的 /etc/fstab 里面看到的,在挂载点 /boot 使用的已经是 UUID 了喔!那你会说不是还有多个写 /dev/mapper/xxx 的吗?怎么回事啊? 因为那个是 LVM 啊!LVM 的文件名在你的系统中也算是独一无二的,这部份我们在后续章节再来谈。 不过,如果为了一致性,你还是可以将他改成 UUID 也没问题喔!(鸟哥还是比较建议使用 UUID 喔!) 要记得使用 blkid 或 xfs_admin 来查询 UUID 喔!

  • 第二栏:挂载点 (mount point)::

就是挂载点啊!挂载点是什么?一定是目录啊~要知道啊!忘记的话,请回本章稍早之前的数据瞧瞧喔!

  • 第三栏:磁盘分区的文件系统:

在手动挂载时可以让系统自动测试挂载,但在这个文件当中我们必须要手动写入文件系统才行! 包括 xfs, ext4, vfat, reiserfs, nfs 等等。

  • 第四栏:文件系统参数:

记不记得我们在 mount 这个指令中谈到很多特殊的文件系统参数? 还有我们使用过的“-o codepage=950”?这些特殊的参数就是写入在这个字段啦! 虽然之前在 mount 已经提过一次,这里我们利用表格的方式再汇整一下:

参数 内容意义
async/sync 非同步/同步 设置磁盘是否以非同步方式运行!默认为 async(性能较佳)
auto/noauto 自动/非自动 当下达 mount -a 时,此文件系统是否会被主动测试挂载。默认为 auto。
rw/ro 可读写/只读 让该分区以可读写或者是只读的型态挂载上来,如果你想要分享的数据是不给使用者随意变更的, 这里也能够设置为只读。则不论在此文件系统的文件是否设置 w 权限,都无法写入喔!
exec/noexec 可执行/不可执行 限制在此文件系统内是否可以进行“执行”的工作?如果是纯粹用来储存数据的目录, 那么可以设置为 noexec 会比较安全。不过,这个参数也不能随便使用,因为你不知道该目录下是否默认会有可执行文件。举例来说,如果你将 noexec 设置在 /var ,当某些软件将一些可执行文件放置于 /var 下时,那就会产生很大的问题喔! 因此,建议这个 noexec 最多仅设置于你自订或分享的一般数据目录。
user/nouser 允许/不允许使用者挂载 是否允许使用者使用 mount指令来挂载呢?一般而言,我们当然不希望一般身份的 user 能使用 mount 啰,因为太不安全了,因此这里应该要设置为 nouser 啰!
suid/nosuid 具有/不具有 suid 权限 该文件系统是否允许 SUID 的存在?如果不是可执行文件放置目录,也可以设置为 nosuid 来取消这个功能!
defaults 同时具有 rw, suid, dev, exec, auto, nouser, async 等参数。 基本上,默认情况使用 defaults 设置即可!
  • 第五栏:能否被 dump 备份指令作用:

dump 是一个用来做为备份的指令,不过现在有太多的备份方案了,所以这个项目可以不要理会啦!直接输入 0 就好了!

  • 第六栏:是否以 fsck 检验扇区:

早期开机的流程中,会有一段时间去检验本机的文件系统,看看文件系统是否完整 (clean)。 不过这个方式使用的主要是通过 fsck 去做的,我们现在用的 xfs 文件系统就没有办法适用,因为 xfs 会自己进行检验,不需要额外进行这个动作!所以直接填 0 就好了。

好了,那么让我们来处理一下我们的新建的文件系统,看看能不能开机就挂载呢?

例题:假设我们要将 /dev/vda4 每次开机都自动挂载到 /data/xfs ,该如何进行?答:首先,请用 nano 将下面这一行写入 /etc/fstab 最后面中;

[root@study ~]# nano /etc/fstab
UUID="e0fa7252-b374-4a06-987a-3cb14f415488"  /data/xfs  xfs  defaults  0 0

再来看看 /dev/vda4 是否已经挂载,如果挂载了,请务必卸载再说!

[root@study ~]# df
Filesystem              1K-blocks    Used Available Use% Mounted on
/dev/vda4                 1038336   32864   1005472   4% /data/xfs
# 竟然不知道何时被挂载了?赶紧给他卸载先!
# **因为,如果要被挂载的文件系统已经被挂载了(无论挂载在哪个目录),那测试就不会进行喔!**

[root@study ~]# umount /dev/vda4

最后测试一下刚刚我们写入 /etc/fstab 的语法有没有错误!这点很重要!因为这个文件如果写错了, 则你的 Linux 很可能将无法顺利开机完成!所以请务必要测试测试喔!

[root@study ~]# mount -a
[root@study ~]# df /data/xfs

最终有看到 /dev/vda4 被挂载起来的信息才是成功的挂载了!而且以后每次开机都会顺利的将此文件系统挂载起来的! 现在,你可以下达 reboot 重新开机,然后看一下默认有没有多一个 /dev/vda4 呢?

/etc/fstab 是开机时的配置文件,不过,实际 filesystem 的挂载是记录到 /etc/mtab 与 /proc/mounts 这两个文件当中的。每次我们在更动 filesystem 的挂载时,也会同时更动这两个文件喔!但是,万一发生你在 /etc/fstab 输入的数据错误,导致无法顺利开机成功,而进入单人维护模式当中,那时候的 / 可是 read only 的状态,当然你就无法修改 /etc/fstab ,也无法更新 /etc/mtab 啰~那怎么办?没关系,可以利用下面这一招:

[root@study ~]# mount -n -o remount,rw /

7.4.2 特殊设备 loop 挂载 (镜像文件不烧录就挂载使用)

如果有光盘镜像文件,或者是使用文件作为磁盘的方式时,那就得要使用特别的方法来将他挂载起来,不需要烧录啦!

  • 挂载光盘/DVD镜像文件

想像一下如果今天我们从国家高速网络中心(http://ftp.twaren.net)或者是昆山科大(http://ftp.ksu.edu.tw)下载了 Linux 或者是其他所需光盘/DVD的镜像文件后, 难道一定需要烧录成为光盘才能够使用该文件里面的数据吗?当然不是啦!我们可以通过 loop 设备来挂载的!

那要如何挂载呢?鸟哥将整个 CentOS 7.x 的 DVD 镜像文件捉到测试机上面,然后利用这个文件来挂载给大家参考看看啰!

[root@study ~]# ll -h /tmp/CentOS-7.0-1406-x86_64-DVD.iso
-rw-r--r--. 1 root root 3.9G Jul  7  2014 /tmp/CentOS-7.0-1406-x86_64-DVD.iso
# 看到上面的结果吧!这个文件就是镜像文件,文件非常的大吧!

[root@study ~]# mkdir /data/centos_dvd
[root@study ~]# mount -o loop /tmp/CentOS-7.0-1406-x86_64-DVD.iso /data/centos_dvd
[root@study ~]# df /data/centos_dvd
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/loop0       4050860 4050860         0 100% /data/centos_dvd
# 就是这个项目! .iso 镜像文件内的所有数据可以在 /data/centos_dvd 看到!

[root@study ~]# ll /data/centos_dvd
total 607
-rw-r--r--. 1  500  502     14 Jul  5  2014 CentOS_BuildTag <==瞧!就是DVD的内容啊!
drwxr-xr-x. 3  500  502   2048 Jul  4  2014 EFI
-rw-r--r--. 1  500  502    611 Jul  5  2014 EULA
-rw-r--r--. 1  500  502  18009 Jul  5  2014 GPL
drwxr-xr-x. 3  500  502   2048 Jul  4  2014 images
.....(下面省略).....

[root@study ~]# umount /data/centos_dvd/
# 测试完成!记得将数据给他卸载!同时这个镜像文件也被鸟哥删除了...测试机容量不够大!

非常方便吧!如此一来我们不需要将这个文件烧录成为光盘或者是 DVD 就能够读取内部的数据了! 换句话说,你也可以在这个文件内“动手脚”去修改文件的!这也是为什么很多镜像文件提供后,还得要提供验证码 (MD5) 给使用者确认该镜像文件没有问题!

  • 创建大文件以制作 loop 设备文件!

想一想,既然能够挂载 DVD 的镜像文件,那么我能不能制作出一个大文件,然后将这个文件格式化后挂载呢? 好问题!这是个有趣的动作!而且还能够帮助我们解决很多系统的分区不良的情况呢!举例来说,如果当初在分区时, 你只有分区出一个根目录,假设你已经没有多余的容量可以进行额外的分区的!偏偏根目录的容量还很大! 此时你就能够制作出一个大文件,然后将这个文件挂载!如此一来感觉上你就多了一个分区啰!用途非常的广泛啦!

下面我们在 /srv 下创建一个 512MB 左右的大文件,然后将这个大文件格式化并且实际挂载来玩一玩! 这样你会比较清楚鸟哥在讲啥!

  • 创建大型文件

首先,我们得先有一个大的文件吧!怎么创建这个大文件呢?在 Linux 下面我们有一支很好用的程序 dd !他可以用来创建空的文件喔!详细的说明请先翻到下一章 压缩指令的运用 来查阅,这里鸟哥仅作一个简单的范例而已。 假设我要创建一个空的文件在 /srv/loopdev ,那可以这样做:

[root@study ~]# dd if=/dev/zero of=/srv/loopdev bs=1M count=512
512+0 records in   <==读入 512 笔数据
512+0 records out  <==输出 512 笔数据
536870912 Bytes (537 MB) copied, 12.3484 seconds, 43.5 MB/s
# 这个指令的简单意义如下:
# if    是 input file ,输入文件。那个 /dev/zero 是会一直输出 0 的设备!
# of    是 output file ,将一堆零写入到后面接的文件中。
# bs    是每个 block 大小,就像文件系统那样的 block 意义;
# count 则是总共几个 bs 的意思。所以 bs*count 就是这个文件的容量了!

[root@study ~]# ll -h /srv/loopdev
-rw-r--r--. 1 root root 512M Jun 25 19:46 /srv/loopdev

dd 就好像在叠砖块一样,将 512 块,每块 1MB 的砖块堆叠成为一个大文件 (/srv/loopdev) ! 最终就会出现一个 512MB 的文件!粉简单吧!

  • 大型文件的格式化

默认 xfs 不能够格式化文件的,所以要格式化文件得要加入特别的参数才行喔!让我们来瞧瞧!

[root@study ~]# mkfs.xfs -f /srv/loopdev
[root@study ~]# blkid /srv/loopdev
/srv/loopdev: UUID="7dd97bd2-4446-48fd-9d23-a8b03ffdd5ee" TYPE="xfs"

其实很简单啦!所以鸟哥就不输出格式化的结果了!要注意 UUID 的数值,未来会用到!

  • 挂载

那要如何挂载啊?利用 mount 的特殊参数,那个 -o loop 的参数来处理!

[root@study ~]# mount -o loop UUID="7dd97bd2-4446-48fd-9d23-a8b03ffdd5ee" /mnt
[root@study ~]# df /mnt
Filesystem     1K-blocks  Used Available Use% Mounted on
/dev/loop0        520876 26372    494504   6% /mnt

通过这个简单的方法,感觉上你就可以在原本的分区在不更动原有的环境下制作出你想要的分区就是了! 这东西很好用的!尤其是想要玩 Linux 上面的“虚拟机”的话, 也就是以一部 Linux 主机再切割成为数个独立的主机系统时,类似 VMware 这类的软件, 在 Linux 上使用 xen 这个软件,他就可以配合这种 loop device 的文件类型来进行根目录的挂载,真的非常有用的喔! ^_^

比较特别的是,CentOS 7.x 越来越聪明了,现在你不需要下达 -o loop 这个选项与参数,它同样可以被系统挂上来! 连直接输入 blkid 都会列出这个文件内部的文件系统耶!相当有趣!不过,为了考虑向下兼容性,鸟哥还是建议你加上 loop 比较妥当喔! 现在,请将这个文件系统永远的自动挂载起来吧!

[root@study ~]# nano /etc/fstab
/srv/loopdev  /data/file  xfs  defaults**,loop**   0 0
# 毕竟系统大多仅查询 block device 去找出 UUID 而已,因此使用文件创建的 filesystem,
# 最好还是使用原本的文件名来处理,应该比较不容易出现错误讯息的!

[root@study ~]# umount /mnt
[root@study ~]# mkdir /data/file
[root@study ~]# mount -a
[root@study ~]# df /data/file
Filesystem     1K-blocks  Used Available Use% Mounted on
/dev/loop0        520876 26372    494504   6% /data/file