Linux【6】-硬盘管理4-4-挂载(mount/umount/fuser/fstab)

一、手动挂载分区

我们前面提到过,Linux 中的文件系统都是树形结构,所有的文件系统结合起来就形成一个大的目录树,这个目录树的“根”就是根目录“/”。根分区在开机的时候就自动挂载在根目录上。我们创建好的文件系统同样也要挂载到这个目录树上才能被我们使用。挂载点一定是目录,这个目录就是访问该文件系统的入口。

所以我们必须将我们刚刚格式化好的分区挂载到目录树上去,我们首先来挂载第一个分区/dev/sdb1。

[root@localhost ~]# mkdir /Log #我们的挂载点

[root@localhost ~]# mount -t ext4 /dev/sdb1 /Log
# -t 指明挂载的分区文件系统类型,/dev/sdb1 指明挂载的分区名,/Log 指明挂载点

[root@localhost ~]# mount
/dev/sda2 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")
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 /Log type ext4 (rw)
# 用 mount 命令不跟参数也可以查看当前挂载的设备,主要是设备名,设备挂载点和设
备# 的访问属性

[root@localhost ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 18577148 3451884 14181600 20% /
tmpfs 1026952 88 1026864 1% /dev/shm
/dev/sdb1 103216920 192116 97781592 1% /Log

用法

mount [选项] 分区/设备名 挂载目录

挂载文件系统

  • -t :与 mkfs 的选项非常类似的,可以加上文件系统种类来指定欲 挂载的类型常见的 Linux 支持类型有:ext2、ext3、ext4、vfat、 reiserfs、iso9660(光盘格式), nfs, cifs, smbfs(此三种为网络文件系统 类型)。
  • -L :系统除了利用设备名 (例如 /dev/hdc6) 之外,还可以利用文 件系统的标签(Label)来进行挂载。
  • -l :单纯的输入 mount 会显示目前挂载的信息。加上 -l 可列出目前挂载的设备的标签
  • -a :依照配置文件 /etc/fstab,将所有尚未挂载的设备都挂载上来
  • -n:在默认情况下,系统会将实际挂载的情况实时写入 /etc/mtab 文件中,但在某些场景下(例如单人维护模式),为了避免出现问题,会刻意不写入,此时就需要使用这个选项;
  • -o :后面可以接一些挂载时额外加上的参数,如读写权限等:
-o 选项后接的额外参数 意义
ro, rw 挂载文件系统成为只读(ro) 或可擦写(rw)
async, sync 此文件系统是否使用同步写入 (sync) 或异步(async) 的内存机制,请参考文件系统运行方式。默认为 async。
auto, noauto 允许此分区被 mount -a 自动挂载(auto)
dev, nodev 是否允许此分区上可创建设备文件, dev 为可允许
suid, nosuid 是否允许此分区含有 suid/sgid 的文件格式?
exec, noexec 是否允许此分区拥有可运行二进制可执行文件
user, nouser 是否允许 普通用户挂载此分区,一般来说,仅有 root 可以进行普通用户也能够对此 挂载这个分区。
defaults 默认值为:rw, suid, dev, exec, auto, nouser,和 async
remount 重新挂载

【例 1】

[root@localhost ~]# mount
#查看系统中已经挂载的文件系统,注意有虚拟文件系统
/dev/sda3 on / type ext4 (rw)  <--含义是,将 /dev/sda3 分区挂载到了 / 目录上,文件系统是 ext4,具有读写权限
proc on /proc type proc (rw)
sysfe on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw, gid=5, mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fe/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfe/rpc_pipefs type rpc_pipefs (rw)

【例 2】

修改特殊权限。通过例 1 我们查看到,/boot 分区已经被挂载了,而且采用的是 defaults 选项。这里我们重新挂载分区,并采用 noexec 权限禁止执行文件执行,看看会出现什么情况(注意不要用 / 分区做实验,否则系统命令也就不能执行了。

[root@localhost ~]# mount -o remount noexec /boot
#重新挂载 /boot 分区,并使用 noexec 权限

[root@localhost sh]# cd /boot
#写一个 shell 脚本,看是否会运行

[root@localhost boot]#vi hello.sh
#!/bin/bash
echo "hello!!"
[root@localhost boot]# chmod 755 hello.sh

[root@localhost boot]# ./hello.sh
-bash:./hello.sh:权限不够
#虽然赋予了hello.sh执行权限,但是仍然无法执行

[root@localhost boot]# mount -o remount exec /boot
#记得改回来,否则会影响系统启动

对于特殊选项的修改,除非特殊场景下需要,否则不建议大家随意修改,非常容易造成系统出现问题,而且还找不到问题的根源。

【例 3】挂载分区。

[root@localhost ~]# mkdir /mnt/disk1
#建立挂载点目录

[root@localhost ~]# mount /dev/sdb1 /mnt/disk1
#挂载分区

/dev/sdb1 分区还没有被划分。我们在这里只看看挂载分区的方式,非常简单,甚至不需要使用 “-ext4” 命令指定文件系统,因为系统可以自动检测。

可能读者会想,为什么使用 Linux 系统的硬盘分区这么麻烦,而不能像 Windows 系统那样,硬盘安装上就可以使用?

其实,硬盘分区(设备)挂载和卸载(使用 umount 命令)的概念源自 UNIX,UNIX 系统一般是作为服务器使用的,系统安全非常重要,特别是在网络上,最简单有效的方法就是“不使用的硬盘分区(设备)不挂载”,因为没有挂载的硬盘分区是无法访问的,这样系统也就更安全了。

另外,这样也可以减少挂载的硬盘分区数量,相应地,也就可以减少系统维护文件的规模,当然也就减少了系统的开销,即提高了系统的效率。

二、查看挂载

用法:df [选项]

显示所有文件系统 i 节点和磁盘块的使用情况。

  • -a 显示所有挂载的文件系统的磁盘使用情况(包括虚拟的不占用硬 盘空间的文件系统,如/proc 文件系统)。
  • -k 以 k 字节为单位显示。
  • -i 显示 inode 信息,而不是块。
  • -t 显示各指定类型的文件系统的磁盘空间使用情况。
  • -x 列出不是某一指定类型文件系统的磁盘空间使用情况(与 t 选项 相反)。
  • -T 显示文件系统类型

三、删掉挂载

3.1 fuser

在CentOS / RHEL 7上找不到fuser命令的情况下:

yum install psmisc 

功能

可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口,并给出程序进程的详细信息。

常用选项

-c :和-m一样,用于POSIX兼容。 
-k :杀掉访问文件的进程。如果没有指定-signal就会发送SIGKILL信号。结合 –signal

-signal: 使用指定的信号,而不是用SIGKILL来杀掉进程。可以通过名称或者号码来表示信号(例如-HUP,-1),这个选项要和-k一起使用,否则会被忽略。

-l :列出所有已知的信号名称。 
-i :杀掉进程之前询问用户,如果没有-k这个选项会被忽略。 
-m  name: 指定一个挂载文件系统上的文件或者被挂载的块设备(名称name)。这样所有访问这个文件或者文件系统的进程都会被列出来。如果指定的是一个目录会自动转换成"name/",并使用所有挂载在那个目录下面的文件系统。
-n space :指定一个不同的命名空间(space).这里支持不同的空间文件(文件名,此处默认)、tcp(本地tcp端口)、udp(本地udp端口)。对于端口,可以指定端口号或者名称,如果不会引起歧义那么可以使用简单表示的形式,例如:name/space (即形如:80/tcp之类的表示)。
-s :静默模式,这时候-u,-v会被忽略。-a不能和-s一起使用。  
-u :在每个PID后面添加进程拥有者的用户名称。 
-v :详细模式。输出似ps命令的输出,包含PID,USER,COMMAND等许多域,如果是内核访问的那么PID为kernel.

使用示例:

1)运行下面命令看一下哪个用户哪个进程占用着此设备

fuser -m -v /mnt/databak/

2)运行下面命令杀掉占用此设备的进程

fuser -m -v -k /mnt/databak/

或者fuser -m -v -k -i  /mnt/databak/(每杀掉一下进程会让你确认)

3)执行umount就可以正常卸载了

3.2 umount [选项] 分区/设备名|挂载目录

卸载文件系统

  • -f 强制卸载

例子:

[root@localhost ~]# umount /dev/sdb1
[root@localhost ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 18577148 3451884 14181600 20% /
tmpfs 1026952 88 1026864 1% /dev/shm
# 可以用 umount 命令卸载一个设备
  • 尽量将分区挂载空目录上
  • 不要重复挂载分区

四、自动挂载分区

4.1 fstab

fstab文件包含了你的电脑上的存储设备及其文件系统的信息。它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的文件。具体来说:用fstab可以自动挂载各种文件系统格式的硬盘、分区、可移动设备和远程设备等。对于Windows与Linux双操作系统用户,用fstab挂载FAT格式和NTFS格式的分区,可以在Linux中共享windows系统下的资源。

这个文件的全路径是/etc/fstab。它只是一个文本文件,你能够用你喜欢的编辑器打开它,但是必须是root用户才能编辑它。同时fsck、mount、umount的等命令都利用该程序。

/etc/fstab 是启动时的配置文件,不过,实际 filesystem 的挂载是记录到 /etc/mtab 与 /proc/mounts 这两个文件当中的。每次我们在更动 filesystem 的挂载时,也会同时更动这两个文件喔!

系统挂载的一些限制:

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

vim /etc/fstab

示例:

# <fs>            <mountpoint>    <type>        <opts>        <dump/pass>

# NOTE: If your BOOT partition is ReiserFS, add the notail option to opts.

/dev/sda10        /boot            ext4        noauto,noatime    1 2
/dev/sda6         /                ext4        noatime           0 1
/dev/sda9         none             swap        sw                0 0
/dev/cdrom        /mnt/cdrom       auto        noauto,ro         0 0

其实 /etc/fstab (filesystem table) 就是将我们利用 mount 命令进行挂载时, 将所有的选项与参数写入到这个文件中就是了。除此之外, /etc/fstab 还加入了 dump 这个备份用命令的支持! 与启动时是否进行文件系统检验 fsck 等命令有关

<file systems>  挂载设备 : 不是我们通常理解的文件系统,而是指设备(硬盘及其分区,DVD光驱等)。它告知我们设备(分区)的名字,这是你在命令行中挂载(mount)、卸载(umount)设备时要用到的。
<mountpoint> 挂载点:告诉我们设备挂载到哪里。
<type> 文件系统类型:Linux支持许多文件系统。 要得到一个完整的支持名单查找mount man-page。典型 的名字包括这些:ext2, ext3, reiserfs, xfs, jfs,iso9660, vfat, ntfs, swap和auto, 'auto' 不是一个文件系统,而是让mount命令自动判断文件类型,特别对于可移动设备,软盘,DVD驱动器,这样做是很有必要的,因为可能每次挂载的文件类型不一致。
<opts> 文件系统参数:这部分是最有用的设置!!! 它能使你所挂载的设备在开机时自动加载、使中文显示不出现乱码、限制对挂载分区读写权限。它是与mount命令的用法相关的,要想得到一个完整的列表,参考mount manpage.
<dump> 备份命令:dump utility用来决定是否做备份的. dump会检查entry并用数字来决定是否对这个文件系统进行备份。允许的数字是0和1。如果是0,dump就会忽略这个文件系统,如果是1,dump就会作一个备份。大部分的用户是没有安装dump的,所以对他们而言<dump>这个entry应该写为0。
<pass> 是否以fsck检验扇区:启动的过程中,系统默认会以fsck检验我们的 filesystem 是否完整 (clean)。 不过,某些 filesystem 是不需要检验的,例如内存置换空间 (swap) ,或者是特殊文件系统例如 /proc 与 /sys 等等。fsck会检查这个头目下的数字来决定检查文件系统的顺序,允许的数字是0, 1, 和2。0 是不要检验, 1 表示最早检验(一般只有根目录会配置为 1), 2 也是要检验,不过1会比较早被检验啦!一般来说,根目录配置为1,其他的要检验的filesystem都配置为 2 就好了。

opts常用参数:

  • noatime 关闭atime特性,提高性能,这是一个很老的特性,放心关闭,还能减少loadcycle
  • defaults 使用默认设置。等于rw,suid,dev,exec,auto,nouser,async,具体含义看下面的解释。
  • 自动与手动挂载:
  • auto 在启动或在终端中输入mount -a时自动挂载
  • noauto 设备(分区)只能手动挂载
  • 读写权限:
  • ro 挂载为只读权限
  • rw 挂载为读写权限
  • 可执行:
  • exec 是一个默认设置项,它使在那个分区中的可执行的二进制文件能够执行
  • noexec 二进制文件不允许执行。千万不要在你的root分区中用这个选项!!!
  • I/O同步:
  • sync 所有的I/O将以同步方式进行
  • async 所有的I/O将以非同步方式进行
  • 户挂载权限:
  • user 允许任何用户挂载设备。 Implies noexec,nosuid,nodev unless overridden.
  • nouser 只允许root用户挂载。这是默认设置。
  • 临时文件执行权限:
  • suid Permit the operation of suid, and sgid bits. They are mostly used to allow users on a computer system to execute binary executables with temporarily elevated privileges in order to perform a specific task.
  • nosuid Blocks the operation of suid, and sgid bits.

其他版本的解释:

序号 字段名 解释
字段 1 设备名/UUID/设备标签 etc/fstab 文件的第一个字段指定了要挂载的设备,可以是一个/dev 目录下的设备文件,例如:/dev/sdb1 或者/dev/cdrom 之类的。也可以通过设备标签或者所谓的 UUID 来指定要挂载的设备如‘LABEL=pa_disk’ 或者 ‘UUID=3e6be9de-8139-11d1-9106-a43f08d823a6’。用设备标签或者设备的 UUID 来指定要挂载的设备更加安全和稳定(后面会详细分析)。
字段 2 挂载点 指定了挂载设备的目录,对于 swap,挂载点为none;对于挂载目录包含空格的情况,用“\040”来表示空格
字段 3 挂载分区文件系统类型 定义了该设备上的文件系统,一般常见的文件类型为 ext2、ext3 ext4 (Linux 设备的常用文件类型)、或者 iso9600(光盘文件系统类型)等.如果这个字段定义为swap,这条纪录将关联到一个用于交换目的的文件或分区。如果这个字段定义为ignored,这行将被忽略。这对于显示目前没有使用的分区非常有用。
字段 4 挂载参数 指定加载该设备的文件系统是需要使用的特定参数选项,多个参数是由逗号分隔开来。
字段 5 Dump 参数 该选项被"dump"命令使用来检查一个文件系统是否应该进行 dump 备份,若不需要就设置该字段为 0,如果需要每天备份的,这个字段就应该为1,如果需要不定期备份的的 这个字段就应该为 2.
字段 6 启动检查分区的次序 该字段被 fsck 命令所使用来确定进行在系统重启进行文件系统检查时的顺序,对于根分区“/”这个值应设为 1,其它文件系统可以设为 2,在同一个物理硬盘内的文件系统应该被顺序检测,而不同硬盘中的文件系统则应该同时检测以充分利用系统的并行性。如果最后一个字段值为 0 或没有设置,fsck 程序装跳过此文件系统的检测。

e2label 可以给分区加上标签(label),然后就可以使用标签来挂载/卸载该分区。 这对于有很多磁盘的系统,并且磁盘次序可能会发生变化的情况,会很有帮助。 假设有下列情况出现:主机上有若干块可以热插拔的硬盘,在主机运行过程中, 这些硬盘需要经常插拔,因此硬盘的次序包括硬盘的设备名会经常改变(如 /etc/sdb 在下次可能会变成/etc/sdd),那么如何才能保证在/etc/fstab 文件中将设 备能够挂载到正确的挂载点上呢?

这是就可以用 e2label 给分区设置一个标签名,在/etc/fstab 中利用标签而不 是设备名来自动挂载分区.

[root@localhost ~]# e2label /dev/sdb1 “log_disk”
[root@localhost ~]# e2label /dev/sdb1
log_disk

#
# /etc/fstab
# Created by anaconda on Thu Nov 15 10:29:31 2012
#
# 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
#
UUID=7791d2ce-c9dd-4780-bffc-4c9d5d1467c5 / ext4
defaults 1 1
UUID=3e45eea0-bf5c-406f-84c0-a38cf9b9d2ba 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
Label=log_disk /Log ext4 defaults 0 2
/dev/sdb5 /Project/pa ext4 defaults 1 2
/dev/sdb6 /Project/pb vfat defaults 1 2
/dev/sdb7 /Backup ext4 defaults 1 2

用法:e2label 分区设备名 [标签名]

用来设定或显示 ext2 或 ext3 分区的卷标。

注意:新设定的标签名称。不能超过 16 字符

当然这样挂载分区也是有缺点的,因为有可能两个分区的标签会重名,这系 统就无法确定到底要挂载哪个分区了,事实上,最保险的方法是通过分区设备的 UUID 来挂载文件系统。

UUID 全称是 Universally Unique Identifier,也即便说,每个分区有一个唯 一的 UUID 值。准确来说,UUID 是一个标识你系统中的存储设备的字符串,其 目的是帮助使用者唯一的确定系统中的所有存储设备,不管它们是什么类型的。 它可以标识光盘驱动器,USB 存储设备以及系统中的硬盘分区等。

与设备名和设备标签相比,UUID 有如下优点:

  • 它是真正的唯一标志符。UUID 为系统中的存储设备提供唯一的标识字符串, 与分区标签不同,系统中不会出现有两个设备的 UUID 相同的情况
  • 它总是不变的。分区的设备名称并非总是相同的,它们依赖于启动时内核加 载模块的顺序。如果你在插入了 USB 盘时启动了系统,而下次启动时又把 它拔掉了,就有可能导致设备名分配不一致。但是 UUID 总是不变的,无论 如何插拔,如何调换设备次序。

我们可以通过 blkid 命令来列出系统中所有存储设备的 UUID:

[root@localhost ~]# blkid
/dev/sda2: UUID="7791d2ce-c9dd-4780-bffc-4c9d5d1467c5" TYPE="ext4"
/dev/sda1: UUID="3e45eea0-bf5c-406f-84c0-a38cf9b9d2ba" TYPE="swap"
/dev/sdb1: LABEL="log_disk" UUID="feda157d-c51a-4f8b-8264-545ecfc06c21"
TYPE="ext4"
/dev/sdb5: UUID="19523fce-666e-4ec9-a53e-21723437eeb1" TYPE="ext4"
/dev/sdb6: UUID="5156-CFF4" TYPE="vfat"
/dev/sdb7: UUID="e2e2044b-34a1-4397-ba30-ad06bd964596" TYPE="ext4"

注意,UUID 依据分区不同,长度和格式都可能会不相同。

#
# /etc/fstab
# Created by anaconda on Thu Nov 15 10:29:31 2012
#
# 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
#
UUID=7791d2ce-c9dd-4780-bffc-4c9d5d1467c5 / ext4
defaults 1 1
UUID=3e45eea0-bf5c-406f-84c0-a38cf9b9d2ba 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
UUID= feda157d-c51a-4f8b-8264-545ecfc06c21 /Log ext4 defaults
0 2
/dev/sdb5 /Project/pa ext4 defaults 1 2
/dev/sdb6 /Project/pb vfat defaults 1 2
/dev/sdb7 /Backup ext4 defaults 1 2

4.2 rc.local

修改/etc/rc.d/rc.local文件

需要修改/etc/rc.d/rc.local 为可执行权限

将mount命令添加进rc.local文件是另一种实现开机自动挂载的方式

mount /dev/mapper/vg_study-lv_study /lvm_study

五、讨论

3.1 fstab与rc.locl比较

相当于先挂载,再开机;而rc.local 这种方式相当于先开机,再挂载。如果挂载本身就有问题,通过fstab是很难开机哒

六、报错

6.1 报错

umount /mnt/cdrom/ 

报错

umount: /mnt/cdrom: device is busy

接着:

umount /mnt/cdrom/ -f //强制卸载也不行

发现还是报上面的错误

查看占用的进程

fuser -m /mnt/cdrom/

fuser -m -v -k mnt/cdrom/  # 杀掉进程

重新umount

umount /mnt/cdrom/ 

6.1 报错

ls: cannot access share: Stale file handle

解决办法:

1.这个时候需要重启一下nfs服务器就可以了

systemctl restart nfs

2.重新挂载

umount -f /directory
fuser –k /path
mount ...

3.如果上述方法都不管用,可以用如下命令

lsof | grep data_dir

执行如下命令行删掉相关任务

for i in lsof | grep datalake |awk '{print $2}';do kill -9 $i;done

4.如果还有问题,建议重启服务器

6.3 报错

Resource temporarily unavailable

6.4 报错

mkdir -p /mnt/nfs

[root@localhost /]# mount 2.2.2.1:/test /mnt/nfs
mount: wrong fs type, bad option, bad superblock on 2.2.2.1:/test,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

因为重装系统了,需要重新安装nfs

yum list |grep nfs
yum install -y nfs-utils.x86_64

mount 2.2.2.1:/test /mnt/nfs

6.5 解决mount时发生错误wrong fs type, bad option, bad superblock

centos中安装nfs-utils:

yum install nfs-utils

七、我的案例

7.1 取消挂载后重新挂载

fuser -m -v -k /mnt/nfs
umount /mnt/nfs

mount 2.2.2.1:/test /mnt/nfs

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn