学习是一个逐步发现自己无知的过程!

挂载

1.挂载文件系统
    每一个文件系统都会提供一个根目录 (Root Directory),该文件系统中的所有文件,就是储存在其根目录下。DOS或Windows操作系统,允许你以硬盘符号(Driver Letter) ,直接指定要使用哪个磁盘的文件系统根目录;但是在 Red Hat Enterprise Linux 中,整个系统只会有一个根目录(Single Root Directory),不允许有第二个以外的根目录。因此要在 Red Hat Enterprise Linux系统中,使用某个磁盘空间的根目录与其中的所有文件,就必须将该文件系统挂载(mount)到根文件系统(Root Filesystem)的某一个目录下。挂载文件系统时,这个挂载目录绑定在系统根目录树中一个已有的目录上,这个已有目录叫做文件系统的挂载点(mount point)。我们说起挂载点时,指的其实是挂载文件系统到系统根目录下的某个目录。简单的说,就是“现在有一个磁盘空间,请你把它放在系统根某一个目录中,好让用户可以调用里面的数据”。

完成挂载文件系统动作后,Red Hat Enterprise Linux 就会知道,在某个挂载点目录下的文件,实际上是存放于某个文件系统中。当有人调用挂载点目录中的文件时,Red Hat Enterprise Linux 就会转到该文件系统上找寻文件。

例如,你把 /dev/sda1 挂载到 /tmp/ 目录,当用户在 /tmp/ 下使用 ls 读取目录内容、或者使用 cat 开启 /tmp/ 中的某一个文件时,Red Hat Enterprise Linux 就知道要到  /dev/sda1 上执行相关的操作。

2.挂载的好处
    也许有人心里会想,在 Red Hat Enterprise Linux 中读取某一个磁盘上的文件,竟然这么麻烦,还必须要先挂载才行? 为什么 Red Hat Enterprise Linux不能像 DOS/Windows 系统一样,给每一个硬盘一个代号,用户可以直接以 C:\ 或 A:\ 来代表某一个硬盘呢?其实 Red Hat Enterprise Linux 使用挂载的原因,是来自于 UNIX 的习惯;而UNIX 提供挂载的方法也已经有数十年的时间,至今都没有放弃这项功能,就表示挂载已经获得无数的管理者所认同。

那么,挂载的功能到底有何迷人之处,让它历久不衰呢?挂载的优点,主要如下:

1
简化用户调用文件之不便:我们都知道一台UNIX 的用户可以有两 种,一种是系统管理员 (System Administrator),负责系统管理的工作; 另外一种为最终用户 (End User),只会利用计算机完成他们的工作,像是打打报告、输入订单……等等。通常最终用户对于计算机的知识远不及系统管理者,因此UNIX 的设计者认为,UNIX 并不需要让一般用户在使用 UNIX 前得先知道这台电脑中有哪些硬盘。对一般用户来说,他们只需要记得“我的某个文件放在哪个目录”就够了;而计算机有几台硬盘的事情应该是系统管理者才要关心的。

至于哪个目录中的文件是被储存在哪个磁盘上,则是由系统管理者通过挂载配置而成。

2
便于灾难恢复:UNIX 使用挂载的第二个好处就是:在磁盘故障时,系统管理者可以轻松的恢复原本的状态。举例,如果你的 Red Hat Enterprise Linux 突然有某一个硬盘故障了,此时 root  只要增加一个新的磁盘,挂载到相同的目录下;接着再把之前的备份还原回来,就可以轻轻松松恢复回原本的样子。

3
与平台无关的操作习惯:而挂载的第三个优点,是可以让用户能够在不同的硬件平台中,以原本的习惯就可以继续完成他们的工作。试想,原本你的公司有一台配置较差的UNIX 服务器,由于业务成长,原本的 UNIX 已经不堪重负,所以,最近添购了一台配置较好的 UNIX 系统。

如果这两台 UNIX  中的磁盘设备都不相同,例如,旧的系统使用IDE 磁盘,而新的系统使用SCSI 磁盘。由于用户记得他们的数据放在哪个目录,系统管理者只需要在新的系统上配置好正确的挂载设置,那么用户还可以继续之前的习惯,使用新的系统。

    基于上述的几个原因,所以 UNIX 系统至今还保留挂载这样的功能。
3.挂载命令:mount
    挂载文件系统需使用 mount 命令。mount 命令语法如下:
mount [-a]
或者
mount [-t FSTYPE] [-o MOUNT_OPTIONS] [DEVICE] [MOUNT_POINTER]
    执行 mount 时,如果没有指定任何的参数,代表要查看目前的挂载数据表 (MountingTable) 。至于 mount 命令的常用参数,请参阅下表。
参数
说明
-a
挂载 /etc/fstab 中所有具备 auto 挂载参数的文件系统
-t FSTYPE
指定设备上的文件系统类型。FSTYPE 即为文件系统的名称
-o MOUNT_OPTIONS
指定要使用的挂载参数
DEVICE
要挂载的磁盘空间之设备文件名
MOUNT_POINTER
挂载点,也就是磁盘空间上的文件要被放置于哪个目录
 使用mount挂载文件系统
    以下是我使用mount命令挂载分区的例子:
    # mkdir /mnt/sdb1/ ①# ls /mnt/sdb1/ ②

# mount /dev/sdb1 /mnt/sdb1/ ③

# ls /mnt/sdb1/

lost+found/ ④

    ① 先建立 /mnt/sdb1/ 目录,作为这个范例中的挂载点。② 然后查看一下 /mnt/sdb1/ 的内容,目前是空的,表示没有任何的文件资料。

③ 接着使用 mount 命令,把 /dev/sdb1 分区的文件系统挂载到 /mnt/sdb1/。

④ 再度查看一下 /mnt/sdb1/,结果显示有一个 lost+found/ 的目录,这个目录实际上就是存放在 /dev/sdb1 分区中的文件系统。

挂载数据表
    如果想要知道目前的 Red Hat Enterprise Linux 共挂载了哪些文件系统,该怎么办呢??此时,你可以直接使用不加上任何参数的 mount 命令,就可以查看目前的挂载数据表 (Mounting Table)。

以下是我使用mount命令查看目前的挂载数据表。

    # mount/dev/sda7 on / type ext3 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

/dev/sda1 on /boot type ext3 (rw)

tmpfs on /dev/shm type tmpfs (rw)

/dev/sda6 on /home type ext3 (rw)

/dev/sda3 on /usr type ext3 (rw)

/dev/sda5 on /var type ext3 (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

/dev/sdb1 on /mnt/sdb1 type ext3 (rw)

    上述数据中,会以下列的格式显示文件系统的挂载信息:
DEVICE  on  MOUNT_POINTER   type  FSTYPE  (MOUNT_OPTIONS)
    其中的每一个字段如下说明:DEVICE:文件系统的设备文件名。若 DEVICE 显示为 none 的,代表不是实体的磁盘空间。

MOUNT_POINTER:挂载点的路径名称。

FSTYPE:文件系统的类型。

MOUNT_OPTIONS:挂载时的参数。

除此之外,每当你挂载一个文件系统的时候,Red Hat Enterprise Linux 会自动将挂载的信息加入到 /etc/mtab 文件中;而卸载一个文件系统时,Red Hat Enterprise Linux 也会自动的删除 /etc/mtab 中相关的纪录。所以,第二种查看目前文件系统挂载信息的方法,就是直接读取 /etc/mtab 文件。

4.挂载参数
    使用mount 挂载文件系统时,你可以指定挂载的参数来修改文件系统的功能。可以用在任何文件系统上的参数叫共享参数,共享参数大部分是两两一组成双成对,同一组的参数通常是互斥的;也就是说如果你使用了其中一个,就不能使用同一组的另外一个参数。例如,ro/rw 就是一组共享的挂载参数,若使用 ro,就不能使用 rw。

常见的共享参数如下表所示

参数
说明
async/sync
定义在执行时是否使用同步读取方式。async (Asynchronous) 代表异步;而 sync (Synchronous) 则 代表同步。两者相较而言,异步的 I/O 效率较高。
auto/noauto
定义在执行 mount -a 时要不要自动挂载。auto参数代表需被自动的挂载。而 noauto则代表不要挂载。
exec/noexec
在该文件系统上的执行文件是否允许被执行。exec 参数代表将可以被执行;而 noexec 则代表不可以被执行。
atime/noatime
文件被异动时是否更新其访问时间戳记 (Access Time Timestamp)的资料。atime 代表要更新,而 noatime 则代表不要更新。
dev/nodev
定义是否要启用这个文件系统上的成组设备 (Block Device)、字元设备 (Character Device) 的设备节点 (Device Node) 文件。如果使用 dev 参数代表将被启用;而 nodev 则代表不要启用设备文件。
suid/nosuid
定义在这个文件系统上是否要启用特殊权限 (Special Permission)之功能。suid 代表要启用;而 nosuid 则代表停用。
user/nouser
定义是否允许普通用户执行mount命令挂载文件系统。user代表可以;nouser 代表不允许。挂载文件系统属于系统管理工作,故不该让普通用户可以挂载文件系统。
rw/ro
定义这个文件系统是只读或可读可写。rw参数代表可读可写 (Read-Write);ro参数代表只能读取 (Read Only),任何人都无法写入。
    另外,还有一个名为 defaults的共享挂载参数,当你挂载文件系统,没有指定任何挂载参数时,Red Hat Enterprise Linux 会自动使用 defaults作为挂载参数。defaults 这个挂载参数等于 rw、suid、dev、exec、auto、nouser、async几个参数的组合。
指定与修改挂载参数
    当我们使用 mount 命令挂载文件系统时,若没有指定挂载参数,mount 将会自动以 defaults作为其挂载参数。如果你需要使用其他的挂载参数,可以使用两种方式,来改变文件系统的挂载参数:执行 mount 时,直接指定 -o MOUNT_OPTIONS 参数。

使用 mount -o remount,MOUNT_OPTIONS 修改挂载参数。

第一种方法,仅适用于新挂载文件系统时,如果文件系统已经挂载起来,就得先卸载后,再使用第一种方法重新挂载一次;而第二种方式,则可以不需卸载,就直接修改文件系统的挂载参数。

修改挂载参数
    以下是我修改挂载参数的示范:
    # mount /dev/sdb1 /mnt/sdb1/ ①# mount | grep '/dev/sdb1'

/dev/sdb1 on /mnt/sdb1 type ext2 (rw) ②

# touch /mnt/sdb1/file1③

# umount /dev/sdb1

# mount -o ro /dev/sdb1 /mnt/sdb1/ ④

# mount | grep '/dev/sdb1'

/dev/sdb1 on /mnt/sdb1 type ext2 (ro) ⑤

# touch /mnt/sdb1/file2

touch: cannot touch `/mnt/sdb1/file2': Read-only file system ⑥

# mount -o remount,rw /dev/sdb1 /mnt/sdb1/ ⑦

# mount | grep '/dev/sdb1'

/dev/sdb1 on /mnt/sdb1 type ext2 (rw) ⑧

# touch /mnt/sdb1/file3 ⑨

#

    ① 使用 mount 命令,直接把 /dev/sdb1 挂载到 /mnt/sdb1/ 目录中。此时因未 指定挂载参数,所以 mount 会使用 defaults 作为挂载参数。由于 defaults 包含 rw,故 /dev/sdb1 应为可读可写的。② 查看目前的挂载数据表,/dev/sdb1 的确是 rw 的状态。

③ 试着去生成 /mnt/sdb1/file1 文件。嘿!!没有任何错误信息,所以应该已经顺利建立 /mnt/sdb1/file1 了。

④ 卸载 /dev/sdb1 文件系统后,再使用 mount 挂载 /dev/sdb1 到 /mnt/sdb1/ 中。此时使用 mount 时指定挂载参数为 ro,所以/dev/sdb1 的读写状态应该是只读的。

⑤ 果然,挂载数据表中显示的的确是 ro。

⑥ 试着去生成 /mnt/sdb1/file2 文件,结果Red Hat Enterprise Linux 告诉我们这 是一个只读的文件系统 (Read-only file system),当然就无法生成 /mnt/sdb1/file2 文件了!!

⑦ 最后,使用mount -o remount 的技巧,在不卸载 /dev/sdb1 的情形下,直接修改 /dev/sdb1 的挂载参数再度成为可读可写。

⑧ 修改后,/dev/sdb1 的挂载参数就变成了rw了。

⑨ 当然,/mnt/sdb1/file3 就可以被生成出来。

 

5.挂载的特性
    挂载文件系统时,挂载具备“挂载将遮住挂载点原来的文件”特性。
挂载将遮住挂载点原来的文件
    请先看以下的操作:
    # mount | grep '/mnt/sdb1' ①# ls /mnt/sdb1/

oldfile ②

# mount /dev/sdb1 /mnt/sdb1/ ③

# ls /mnt/sdb1/

file1  file3  lost+found/ ④

# umount /mnt/sdb1/ ⑤

# ls /mnt/sdb1/

oldfile ⑥

#

    ① 查看一下,有没有哪个文件系统挂载到 /mnt/sdb1/ 目录?? 答案是没有。② 所以,/mnt/sdb1/oldfile 是存放在另外一个分区中。

③ 接着,把 /dev/sdb1 挂载到 /mnt/sdb1/ 目录。

④ 你会发现,此时 /mnt/sdb1/ 的内容并未包含 oldfile 文件!!

⑤ 接着,再把 /mnt/sdb1/ 的文件系统给卸载掉。

⑥ /mnt/sdb1/oldfile 又重现江湖了!!

 为什么会这样呢??
    这是因为每一个文件系统都有一个根目录,挂载这个动作其实只是告诉 Red Hat Enterprise Linux:嘿,请把某一个文件系统的根目录,放到另外一个目录吧!!原本文件系统的目录下的文件,就会暂时被遮蔽住;就像把窗帘挂在窗户上,那么,原本窗户的景色就会暂时消失一样。当你把文件系统卸载后,原本的文件就会浮现;这与把窗户上的窗帘拆下后就可以再度看到窗户外美丽的景色,是相同的道理。下图显示了挂载前和挂载后的不同。

自动草稿

自动草稿

    所以,我们可以得到一个结论:挂载一个文件系统到某一个目录后,挂载点原本的文件会暂时被遮蔽起来;直到卸载后,原本储存于该挂载点的文件就会再度出现。
赞(1)
未经允许不得转载:劉大帥 » 挂载

你的评论可能会一针见血! 抢沙发

登录

找回密码

注册