一、挂载

 

前文中简单介绍了文件系统的挂载方法,即使用mount命令。事实上,mount命令可以使用的选项非常多,其功能十分强大。比如在挂载U盘时,有些程序会向U盘里写入数据,以此来传播病毒,如果采用只读的方式挂载U盘,则可以有效避免病毒的感染。再比如想对挂载的文件系统进行读写控制,如是否可以在新挂载的文件系统里创建设备文件等,都可以通过mount命令组合特定的选项来完成。

下面使用man命令来查看一下mount命令可以使用的选项:

[root@localhost ~]# man mount

MOUNT(8)       Linux Programmer Manual      MOUNT(8)

NAME    mount - mount a filesystem

COMMAND LINE OPTIONS

-O, --test-opts opts  

Used in conjunction with -a, to limit the set of filesystems to which the -a is applied.

    # 用于指定挂载选项,常用的挂载选项有:

ro:  Mount the filesystem read-only.

只读挂载

rw: Mount the filesystem read-write.

读写,默认挂载方式

noatimeDo not update inode access times on this filesystem (e.g, for faster access on

 the news spool to speed up news servers).

关闭文件访问时间的更新,由于文件被访问时会产生时间戳,如果有些文件被频繁访问,

而每一次访问都会产生一个时间戳,这样就会导致大量不必要的I/O操作,

从而降低系统性能,故关闭时间戳更新是系统优化时常用的选项

atime: Do not use noatime feature, then the inode access time is controlled by kernel defaults. 

noatime相反,开启访问时间的更新

auto:  Can be mounted with the -a option.

是否能够由“mount -a”挂载,在后期关于fstab章节中会详解此命令

diratimeUpdate directory inode access times on this filesystem. This is the default.

atime命令类似,但这里是更新目录的访问时间

        nodiratime:  Do not update directory inode access times on this filesystem.

关闭更新目录的访问时间。事实上,noatime命令已经包含了关闭nodiratime命令,

只不过nodiratime命令可以单独使用。如果已经使用了noatime,则无需使用此命令

async:  All I/O to the filesystem should be done asynchronously.

异步写入。由于文件的写入,首先是由cpu在内存中完成编辑,如果要保存,

则只保存到内存里,而没有马上写入硬盘,需要过一段时间,当内存中积累了

大量的写操作后,一次性将这些写操作都保存到硬盘上,而不是直接操作硬盘,

这个过程就称为异步写入。异步的性能要远远高于同步,但异步的缺陷在于如果

出现断电等意外情况,有可能造成数据丢失。解决数据丢失的办法,可以采用

自定义内核的磁盘刷写策略,如每一秒刷写一次内存

sync:   All I/O to the filesystem should be done synchronously.

同步写入。和异步写入相反,编辑一个文件时,在内存中完成的同时也保存到硬盘上的过程,

同步写入性能较差,通常情况下不使用。

dirsync:   All  directory updates within the filesystem should be done synchronously.

目录同步。实际操作中,可以使用文件异步而目录同步,这样可以保证即使文件丢失了

目录结构也不会丢失

dev:   Interpret character or block special devices on the filesystem.

允许挂载的磁盘启用设备文件

nodev: Do not interpret character or block special devices on the file system.

不允许使用设备文件

exec:  Permit execution of binaries.

         # 允许在挂载的设备上执行二进制程序,这是默认挂载选项

        noexec: Do not allow direct execution of any binaries on the mounted filesystem.

不允许在挂载的设备上执行二进制程序,U盘通常建议不允许执行以防止病毒

group:  Allow an ordinary (i.e., non-root) user to mount the filesystem

允许普通用户组用户挂载此文件系统,使用不多

relatimeUpdate  inode  access  times  relative to modify or change time.

当访问时间被改变时,更新修改时间

norelatime: Do not use relatime feature

relatime相反,当访问时间被更改时,不更新修改时间

remount:   Attempt to remount an already-mounted filesystem.

重新挂载。如果挂载了某个文件系统后,觉得其中的某些属性不合要求,

可以使用此选项,而无需先卸载再挂载。如:

[root@localhost ~]# mount -o remount,ro /dev/sdb3

这里使用remount重新挂载/dev/sdb3,将挂载属性改为只读。重新挂载无需

指定挂载点了

[root@localhost ~]# mount

—————————————运行结果———————————————

/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sdb3 on /mydata type ext4 (ro)
# 重新挂载的/dev/sdb3已经变为只读属性了


 

        THE LOOP DEVICE: One further possible type is a mount via the loop device.            

本地回环设备,事实上它不是一个设备,而是一个文件。如果挂载了一个光盘,

那么就可以使用光盘中的文件了。如果挂载的不是光盘而是一个ISO镜像文件

则无法将该镜像挂载到光驱中,此时就需要用到本地回环设备了。如以下操作:

 

[root@localhost ~]# man mount

[root@localhost ~]# mount /dev/cdrom /media

mount: block device /dev/sr0 is write-protected, mounting read-only


出现警告信息,是因为光盘被写保护了

[root@localhost ~]# umount /media

[root@localhost ~]# mount -o ro /dev/cdrom /media

卸载后以只读方式重新挂载,则没有警告信息

[root@localhost ~]# ll /media

total 227
-r-xr-xr-x. 1 root root 232019 Jul 17  2011 commons-beanutils-1.8.3.jar

 

这里使用了cdrom来挂载,事实上cdrom是一个链接,它指向的是src0

        [root@localhost ~]# ll /dev

—————————————运行结果———————————————        

        lrwxrwxrwx. 1 root root           3 Jul 11 05:58 cdrom -> sr0
        lrwxrwxrwx. 1 root root           3 Jul 11 05:58 dvd -> sr0
        lrwxrwxrwx. 1 root root           3 Jul 11 05:58 scd0 -> sr0


       

        如果刚才的光盘被制作成了ISO镜像文件直接下载到了本地上,那么就必须采用本地回环设备来挂载:

        [root@localhost /]# mount -o loop,ro /commons-beanutils-1.8.3.iso /media

        [root@localhost /]# ll /media

        total 227
        -r-xr-xr-x. 1 root root 232019 Jul 17  2011 commons-beanutils-1.8.3.jar


defaults:  Use default options: rw, suid, dev, exec, auto, nouser, async, and relatime.

使用defaults选项,等同于同时使用了上述rwsuidexec等等多个选项。

如果mount -o不指定任何选项,则默认使用defaults

 

 mount命令除了-o选项外,还有一些其他的选项也经常用到:

-v, --verbose  Verbose mode.

挂载时显示详细的设备信息,如:

[root@localhost /]# mount -o loop -v /u01/commons-beanutils-1.8.3.iso /media

—————————————运行结果——————————————— 

mount: going to use the loop device /dev/loop0
mount: you didn't specify a filesystem type for /dev/loop0
       I will try type iso9660
/u01/commons-beanutils-1.8.3.iso on /media type iso9660 (rw,loop=/dev/loop0)

-n, --no-mtab  Mount  without  writing  in  /etc/mtab.

挂载文件系统时,不更新/etc/mtab文件。/etc/mtab文件会随时更新挂载情况,

如果不希望这些更新状况保存到 /etc/mtab文件中,就可以使用该选项

[root@localhost /]# cat /etc/mtab

—————————————运行结果———————————————

/dev/mapper/VolGroup-lv_root / ext4 rw 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs rw,rootcontext="system_u:object_r:tmpfs_t:s0" 0 0
/dev/sda1 /boot ext4 rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
gvfs-fuse-daemon /root/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev 0 0
/dev/sdb3 /mydata ext4 ro 0 0
/dev/sr0 /media iso9660 ro 0 0
/u01/commons-beanutils-1.8.3.iso /media iso9660 rw,loop=/dev/loop0 0 0 
# 这里可以看到/etc/mtab文件和直接输入mount命令的结果很相似,事实上/etc/mtab
# 文件是用来追踪mount命令的结果的,mount命令默认显示的也是该文件的内容


 

[root@localhost /]# umount /media

[root@localhost /]# cat /etc/mtab

卸载/media后再次查看/etc/mtab文件

—————————————运行结果———————————————

/dev/mapper/VolGroup-lv_root / ext4 rw 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs rw,rootcontext="system_u:object_r:tmpfs_t:s0" 0 0
/dev/sda1 /boot ext4 rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
gvfs-fuse-daemon /root/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev 0 0
/dev/sdb3 /mydata ext4 ro 0 0
/dev/sr0 /media iso9660 ro 0 0
# 可以看到最后一项消失了


[root@localhost /]# mount

—————————————运行结果———————————————

/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sdb3 on /mydata type ext4 (ro)
/dev/sr0 on /media type iso9660 (ro)
# 对比可以看出mount命令显示的实际上是对/dev/mtab中的内容的解释

 

 -r, --read-only  Mount the filesystem read-only. A synonym is -o ro.

只读挂载,相当于 -o ro

 

二、卸载

前文中介绍过当使用umount卸载某个挂载设备时,有时候会报device is busy的错误,这可能是由于当前该设备正在被访问,使用fuser命令可以用来显示正在访问某个文件的进程。如以下实例:

[root@localhost ~]# mount -o ro,loop /u01/commons-beanutils-1.8.3.iso /media

[root@localhost ~]# mount

—————————————运行结果———————————————

/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sdb3 on /mydata type ext4 (ro)
/u01/commons-beanutils-1.8.3.iso on /media type iso9660 (ro,loop=/dev/loop0)
# 新挂载的设备


[root@localhost ~]# cd /media

进入/media设备中

[root@localhost ]# umount /media

umount: /media: device is busy.

        (In some cases useful info about processes that use

         the device is found by lsof(8) or fuser(1))

这时如果再开启一个终端,试图卸载/media设备,会报错。

[root@localhost ~]# fuser /media

/media:               7133c
# 使用fuser命令查看正在访问 /media的进程


[root@localhost ~]# fuser -km /media

/media:               7133c
# 使用 -km选项杀掉使用/media的进程

[root@localhost ~]# umount /media

再次使用umount可以成功卸载该设备了

 

wKiom1PH2ougcwNLAAZRRSdwJrc711.jpg 

注意 fuser -km 命令可以杀掉一些不起作用且占用了系统资源的进程,但这是个比较危险的操作,因为其他用户可能正在编辑该文件,该命令会导致数据丢失。该命令的使用需要一定的权限。

 

三、自动挂载的环境配置

上文中提到过,手动挂载的设备,系统重启后不会自动挂载。如果希望某个设备能在系统启动时自动挂载,就需要编辑 /etc/fstab这个文件。下面来简单介绍一下这个文件

   [root@localhost ~]# vim /etc/fstab

—————————————配置文件———————————————
#
# /etc/fstab
# Created by anaconda on Wed Jul  9 21:21:40 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root /                       ext4    defaults   1 1
UUID=d9512fb3-8dd6-4613-ae55-8e99ba0ef627 /boot      ext4    defaults   1 2
/dev/mapper/VolGroup-lv_swap swap                    swap    defaults   0 0
tmpfs              /dev/shm         tmpfs    defaults        0      0
devpts             /dev/pts         devpts   gid=5,mode=620  0      0
sysfs              /sys             sysfs    defaults        0      0
proc               /proc            proc     defaults        0      0
# 这里有六个字段,其含义如下:
# 要挂载的文件系统   挂载点       指定文件系统类型  挂载选项     转储频率  自检次序

 

wKioL1PH3kmBZhNFAAPC7UOZ3GA758.jpg 

 

这里需要对转储频率和自检次序做个说明:

转储频率是用来指定对挂载设备进行备份的频率,其中:

0: 表示从来不备份

1: 表示每天备份

2: 表示隔天备份

 

自检是系统开机检测的过程,当某个文件在创建过程中被意外破坏如断电),而这个文件已经收录在索引中,这样会导致索引中存在此文件,但无法访问,自检的过程就是清除索引中已经坏掉的文件。不同的文件系统,自检方式也会不同:

ext2的文件系统,其自检过程是将索引和文件一一比对,这样的检查速度比较缓慢;

 wKioL1PH3tuxo51GAAOqpHusgrQ072.jpg

ext3的文件系统又称为日志文件系统。它可以使自检过程效率更高,但缺陷是同一个索引要写入两次,从而导致I/O操作的冗余。因此日志文件系统开机检测速度高于非日志文件系统,但写入速度低于非日志文件系统。

自检次序就是系统开机自检时的检测顺序。自检时永远首先检测 根文件,这里的数字所代表的含义是:

0: 不检测;

1: 表示第一个检测,一般只有根文件系统被第一个检测;

2、 3、 4...依次类推

 

如果想要使某个设备能在开机时自动挂载,可以进行如下配置:

 [root@localhost ~]# vim /etc/fstab

—————————————配置文件———————————————

#
# /etc/fstab
# Created by anaconda on Wed Jul  9 21:21:40 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root /                  ext4  defaults         1 1
UUID=d9512fb3-8dd6-4613-ae55-8e99ba0ef627 /boot ext4  defaults         1 2
/dev/mapper/VolGroup-lv_swap swap               swap  defaults         0 0
tmpfs                   /dev/shm               tmpfs  defaults         0 0
devpts                  /dev/pts               devpts gid=5,mode=620   0 0
sysfs                   /sys                   sysfs  defaults         0 0
proc                    /proc                  proc   defaults         0 0
/dev/sdb3               /mydata                ext4   defaults,noatime 0 0
# 要挂载的文件系统为 /dev/sdb3;挂载点为/mydata; 文件系统的类型为ext4;挂载选项为
# defaults,且不需要更新访问时间;挂载后不用备份,也无需自检
# (如果该文件系统有问题,可以手动检测)

 

修改了此配置文件后,并不会马上生效,/dev/sdb3这个文件系统只有在下次开机时才会挂载,当前则不会;如果现在要挂载这个文件,只需使用mount [DEVICE]命令手动挂载即可。而使用 mount -a 这个命令,也可以挂载该文件系统。mount -a 命令表示挂载所有定义在 /etc/fstab下且支持auto挂载选项的文件系统,如:

[root@localhost ~]# umount /dev/sdb3

[root@localhost ~]# mount

—————————————配置文件———————————————

/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
# 此时没有挂载 /etc/sdb3这个文件系统


[root@localhost ~]# mount -a

使用 mount -a 挂载所有/etc/fstab下的文件系统

[root@localhost ~]# mount

—————————————配置文件———————————————

/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sdb3 on /mydata type ext4 (rw,noatime)
# 可以看到/dev/sdb3被挂载了