您的位置:首页 > 运维架构

5.文件系统――文件系统挂载、卸载、自动挂载(mount,loop,umount,fuser)

2014-07-17 22:37 381 查看
一、挂载
前文中简单介绍了文件系统的挂载方法,即使用mount命令。事实上,mount命令可以使用的选项非常多,其功能十分强大。比如在挂载U盘时,有些程序会向U盘里写入数据,以此来传播病毒,如果采用只读的方式挂载U盘,则可以有效避免病毒的感染。再比如想对挂载的文件系统进行读写控制,如是否可以在新挂载的文件系统里创建设备文件等,都可以通过mount命令组合特定的选项来完成。下面使用man命令来查看一下mount命令可以使用的选项:[root@localhost ~]# man mount
MOUNT(8) Linux Programmer Manual MOUNT(8)NAME mount - mount a filesystemCOMMAND 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.# 读写,默认挂载方式noatime:Do 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章节中会详解此命令diratime:Update 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# 允许普通用户组用户挂载此文件系统,使用不多relatime:Update 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选项,等同于同时使用了上述rw,suid,exec等等多个选项。# 如果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 /mediaumount: /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可以成功卸载该设备了




注意 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
# 这里有六个字段,其含义如下:
# 要挂载的文件系统   挂载点       指定文件系统类型  挂载选项     转储频率  自检次序





这里需要对转储频率和自检次序做个说明:
转储频率是用来指定对挂载设备进行备份的频率,其中:
0: 表示从来不备份
1: 表示每天备份
2: 表示隔天备份

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


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被挂载了


本文出自 “重剑无锋 大巧不工” 博客,请务必保留此出处http://wuyelan.blog.51cto.com/6118147/1439721
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: