磁盘挂载、mount命令和开机自动挂载
作为Linux的系统管理员,其中一项重要的工作就是管理服务器的磁盘和磁盘空间的文件系统格式,尤其是现在的大数据发展,各种数据对磁盘空间的需求越来越大,而且硬盘正在逐渐的演变成消耗品。
Linux新增一个新的硬盘需要经历大致下面的几个步骤。
- 查看硬盘是否已经正常的被系统识别
- 根据已经规划好的磁盘空间计划,对硬盘进行分区,创建磁盘的分区
- 对创建的分区进行格式化,创建对应可用的文件系统
- 如果细致一点,可用对刚刚创建的文件系统进行校验
- 在Linux的树型目录中合适的地方创建一个目录作为挂载点,将该硬盘的分区挂载上来
在挂载的这个过程,分为临时挂载和永久挂载的方式。临时挂载直接使用mount命令即可,而永久挂载则是通过编辑/etc/fstab文件,添加新的内容来完成。
物理服务器的硬盘添加其实相对比较简单,基本上服务器是支持硬盘的热插拔,将硬盘安装锁定在对应的硬盘盒中,然后将硬盘盒插入硬盘槽中就可以进行对应的配置和挂载了。
咱们这里使用一个VMware Fusion里面的ubuntu虚拟机中添加一个新的硬盘的方式来说明一下上面的几个过程。从创建一个硬盘开始,一步一步的来实现给Linux系统添加新硬盘的操作。
虚拟机添加新硬盘
在对应的虚拟机的设置里面,选择添加设备,进行添加新设备的操作。

在选择要添加的设备里面,先选择新硬盘,如果是宿主机中有多个硬盘,而你想使用这整个物理硬盘的话,可以选择现有硬盘。如果现在现有硬盘的添加方式,需要有宿主机的系统管理员权限才能操作。

在弹出的界面中,对新建的磁盘的文件名和磁盘大小进行设置,还有就是点开高级选项,在里面对硬盘的接口类型进行设置,使用默认的拆分为多个文件即可,如果有特殊的需求的话,比如这个硬盘后续可能需要复制到其他的地方或者机器上进行使用,可不拆分为多个文件,方便管理,如果使用的环境对这磁盘的空间有要求或者宿主机的空间管理有要求,可以勾选预先分配磁盘空间。

添加完成后,可以看见,在设置的界面中,多了一个新的磁盘出来。

完成上面的步骤后,给虚拟机添加一个硬盘的操作就完成了。
好了,我们下面启动虚拟机,开始进入挂载新硬盘的步骤。
查看硬盘的安装情况
Linux系统要查看列出所有的磁盘列表有 fdisk -l 和 lsblk 两种命令,fdisk是一个分区的命令。通过添加参数 -l 可以查看所有磁盘和它们的分区信息,使用fdisk命令需要管理员权限。lsblk可以看作是“list block device”的缩写,是个很好用的列出所有存储设备的命令。
使用 fdisk -l 查看磁盘的情况,因为Ubuntu系统处理挂载存储设备之外,还会存储多个虚拟的存储设备,截图仅截取了关于硬盘的信息部分,虚拟设备的部分就不截图。

使用 lsblk 命令查询的结果

从上面的两种查询方式可以看到,系统里面有两个nvme的硬盘。在lsblk中显示为:nvme0n1和nvme0n2。在fdisk中显示为/dev/nvme0n1和/dev/nvme0n2。因为这里添加的是nvme接口的硬盘,所以显示出来的是nvme数字n数字这样的形式,如果是sata、sas、scsi接口的硬盘,则是已sdx的形式显示,前面的sd是固定的,后面的x代表从a-z的字母。云服务器新增的硬盘一般情况下是vdx,和sdx类似。
给硬盘进行分区
从上面的fdisk那个截图其实可以发现,nvme0n1这个磁盘它的磁盘标签类型叫作“gpt”,也就是所,这个磁盘是用来gpt的格式分区的。处理gpt还有一种叫作mbr的格式分区。gpt和mbr是目前磁盘分区的两种主要格式。从分区限制上来看:mbr最多支持4个主分区或三个主分区加1个扩展分区(利用一个扩展分区来做不受限制的逻辑分区),而gpt支持128个主分区。如果从容量限制上来看,mbr分区最大只支持2TB只有的空间,大于2TB的空间就无法识别,而gpt分区表能支持2TB以上的硬盘空间。
通常来说,“mbr分区使用fdisk命令,gpt分区使用gdisk命令”,也就是说不同的分区表使用是使用不同的命令做出来的,当然还有另外一个常用的命令,两者都皆支持,这个命令就 parted 。
居然系统原来的硬盘是使用gpt作为分区表,那么我们新的硬盘也使用gpt分区表,也就是使用gdisk命令。
使用gdisk 设备名,可以进入对该设备的命令界面中,设备名在上面的时候已经查到了,是那个还没有任何分区表和分区信息的nvme0n2。所以用gdisk /dev/nvme0n2进入分区的界面。gdisk和fdisk都是需要使用超级管理员的权限才能使用的。我这里是一个有管理员权限的用户使用了sudo提权来进行操作的。

输入?可以查看gdisk的一些使用上的帮助

从上面的帮助信息可以看到,输入n就是增加一个新的分区,输入n后会提示需要新建的分区数量,从哪里开始,到哪里结束(也就是决定分区的大小),还有文件系统格式,因为我这里是要做一个硬盘为一个分区,且是Linux的文件系统格式,后面的4步,直接按回车将,使用默认的预设值。配置完成后,再输入w保存分区表并退出。

再次使用lsblk查看磁盘信息,会发现磁盘已经分区完成了。在nvme0n2下面已经有了一个nvme0n2p1的分区的信息。

硬盘分区格式化
分区完成之后,自然就是需要初始化文件系统,也就是格式化分区。命令其实很好记,既然是初始化的格式就是make,文件系统是filesystem,和起来就是 make filesystem 简称mkfs。没错,这个命令就是mkfs, mkfs命令的使用格式就是mkfs -t 文件系统格式名 设备名,当然,这个命令还有一个简便的用法,就是mkfs.文件系统格式名 设备名。当前Ubuntu发行版本默认的文件系统格式是ext4,这里也就一样使用ext4作为新硬盘的文件系统格式。设备名已经从上面知道了是/dev/nvme0n2p1。输入命令稍等片刻就格式化完成。

文件系统的校验
在硬盘出现问题或者服务器出现了未知且不可预期的意外断电后等莫名其妙的情况后就可能出现文件系统的错乱,这是就需要使用文件系统的校验命令来看能不能抢救一下。校验就是check,大概猜到了吧,文件系统校验就是filesystem check,简称fsck。就是fsck命令了,使用起来和mkfs类似,就是命令后加文件系统格式名和设备名称。
当然,你如果怀疑自己刚刚格式化的硬盘是否已经成功,会不会存在问题也可以使用fsck校验一下。使用fsck校验的分区必须是没有挂载的。如果挂载了,就需要先卸载后在校验。

分区的挂载和卸载
经过了上面的各种小心翼翼,各种的分区操作,这个分区现在就可以用了吗?还没有,还需要把这个分区进行挂载,才可以使用。挂载点是一个目录,而这个目录就是进入这个被挂载的分区(文件系统)的入口。关于挂载还需要注意以下的几个点:
- 单一文件系统不嫩重复挂载在不同的目录中
- 单个目录不能挂载多个文件系统
- 理论上,作为挂载点应该是空目录,如果目录非空,则原目录中的内容会被隐藏,直到该目录不再作为挂载点被挂载,内容才重新出现
要将分区进行挂载,就需要用到mount这个命令。这个命令是系统运维人员常用的命令之一。可以挂载的内容也极其丰富。在这里指是简单的介绍一下关于硬盘分区的挂载和卸载。
简单来说,要挂载一个分区的命令格式就是 mount 设备名 挂载点 就可以了。在Linux的树型目录结构中有预留一个暂时挂载额外设备的目录/mnt,但一般情况下,生产环境是在根目录下面新建一个目录来作为挂载点,咱们就以一个较多ssd_disk为例来做挂载点进行示范,有操作如下图:
sudo mkdir /ssd_disk # 在根目录里面创建一个ssd_disk目录
sudo mount /dev/nvme0n2p1 /ssd_disk/ #挂载设备到目录中
sudo chmod 777 -R /ssd_disk # 重新赋权这个目录为所有人都可以读写的权限,方便这个目录挂载后其他用户也可以使用
df -hT # 查看各磁盘的使用情况,可以发现设备已经被挂载到这个目录中了。

挂载完成后,就可以通进入这个目录的方式进入到这个分区进行操作,保存或创建文件、目录等。

卸载分区就更简单了,用umount加目录名即可,卸载前需确保该磁盘分区已经没有在使用。否则会报错target is busy。

修改/etc/fstab开机自动挂载
上面提到使用mount命令将分区挂载到目录的办法很简单,但是有一个缺陷,就是系统重启后需要重新挂载,也许有朋友很出名的想到,可以把这个命令写到开机自启动的脚本中去实现需求。其实在系统里面有一个配置文件专门来处理这件事的,这就是/etc/fstab这个文件了。
从文件名可以大概猜到这个是什么的缩写并且从名字上看出这个配置文件是干什么的,fs应该就filesystem,tab应该是table,和起来就是filesystem table,那这就是文件系统表,既然是称为表了,这里面就放的是和filesystem有关的信息和配置数据啰。来看看这个文件里面默认的内容:

从这个文件的内容可以看出,一行数据被分成了6列,从左到右分别是:文件系统、挂载点、文件系统的类型、选项、备份、校验。虽然在Ubuntu这里最后一列写的是pass,但是其实它是配置要不要在开机流程中校验文件系统,这个功能在早期的系统中较为重要,现在的大多数发行版本会自己进行校验,不需要这个额外的动作,直接填0就可以。
重新看会文件,这里面已经有三条配置的信息,一条的挂载点是/,也就是根目录;一条的挂载点是/boot/efi,相信从这个目录的名称也可以猜到,没错,这个就是启动分区efi的分区挂载;最后这条是swapfile,它是交换空间的文件系统,相当于windows系统下的虚拟内存,它是没有挂载点,直接使用了磁盘的空间分区去作为内存交换的空间,故没有挂载点。
有没有发现,除了上面说到的点,如挂载到根和启动目录的两个文件系统,它们都没有使用设备名,上面咱们已经知道他们的设备名其实是/dev/nvme0np3和/dev/nvme0np2。可是这里使用了一个上面没有提到得到叫作UUID的东西,这个东西是怎么来的呢?它通过命令`blkid可以查询到,UUID在上面的创建分区是,其实已另外一个名称出现过,当时咱们直接按回车使用了默认提供的值,UUID是唯一的,在文件中使用UUID而不是设备名是因为在系统启动后读取设备名的时候,如果有多个硬盘设备,可能每次启动时设备的获取顺序不同,导致设备名的对应产生变动。引起混乱。而UUID是唯一的,且不重新格式化的话是不变的。所以使用了UUID。
再来说说几个系统挂载的限制:
- 根目录/是必须挂载,且必须先于其他挂载点被挂载
- 其他挂载点必须是一个已经创建的目录,可以在树形目录除了根的任意位置,且需要指定绝对路径
- 所有的挂载点在同一时间内只能挂载一次
- 所有的分区在同一时间内只能挂载一次
- 要完成卸载,和umount的规则一致,不能挂载点正在使用
啰嗦了这么多,现在开始来挂载上面那个分区了。
首先使用管理员权限来查看分区的UUID,下面接下来的操作基本上都需要使用root用户或者用sudo提权为管理员权限才能完成
sudo blkid

得到这个UUID后,就可以根据这个UUID来组合fstab里面的条目,并且将其写入到文件中。目标是将这个分区挂载到上面提及到的/ssd_disk目录中去。分区的格式是ext4,需要读写等权限,不需要备份和校验。得到的完整一行数据就是这样的:
UUID=244c8dfd-3e59-4455-9fce-16c96dfd730c /ssd_disk ext4 rw,defaults 0 0
空格的多少没有具体的限制,但是建议格式保持和已有的一致就好。这样做也方便后续的维护事阅读。
sudo nano /etc/fstab # 使用nano或者vi来编辑文件,在文件的尾部添加上面组合出来的内容
cat /etc/fstab # 查看是否已经保存修改完成
sudo mount -a # 重新挂载一遍全部的设备,这个步骤很重要。
sudo df -h # 查看磁盘的使用情况,就会发现分区已经挂载

挂载完成。