一、挂载
前文中简单介绍了文件系统的挂载方法,即使用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.
# 读写,默认挂载方式
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 /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可以成功卸载该设备了
注意 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被挂载了
转载于:https://blog.51cto.com/wuyelan/1439721