# 7.Linux 磁盘管理

# 1.Linux 物理设备介绍

1.1 一切从 “/” 开始
在 Linux 系统中,目录、字符设备、块设备、套接字、打印机等都被抽象成了文件,既然平时我们打交道的都是文件,那么又应该如何找到它们呢?
在 Linux 系统中并不存在 C/D/E/F 等盘符,Linux 系统中的一切文件都是从 “根( / )” 目录开始的,并按照文件系统层次化标准(FHS)采用树形结构来存放文件,以及定义了常见目录的用途。
另外,Linux 系统中的文件和目录名称是严格区分大小写的。例如,root、rOOt、Root、rooT 均代表不同的目录,并且文件名称中不得包含斜杠( / )。
image-20200529164004729

1.2 物理设备的命名规则
在 Linux 系统中一切都是文件,硬件设备也不例外。既然是文件,就必须有文件名称。系统内核中的 udev 设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等。另外,udev 设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理 /dev 目录下的设备文件。

硬件设备文件名称
IDE 设备/dev/hd[a-d]
SCSI/SATA/U 盘/dev/sd[a-p]
软驱/dev/fd[0-1]
打印机/dev/lp[0-15]
光驱/dev/cdrom
鼠标/dev/mouse

由于现在的 IDE 设备已经很少见了,所以一般的硬盘设备都会是以 “/dev/sd” 开头的。而一台主机上可以有多块硬盘,因此系统采用 a~p 来代表 16 块不同的硬盘(默认从 a 开始分配),而且硬盘的分区编号也很有讲究:主分区或扩展分区的编号从 1 开始,到 4 结束;逻辑分区从编号 5 开始。

image-20200529164208420

1.3 文件系统与数据资料
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。常见的文件系统有 ext3、ext4、xfs 等。
Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。
Ext4:Ext3 的改进版本,作为 RHEL 6 系统中的默认文件管理系统,它支持的存储容量高达 1EB(1EB=1,073,741,824GB),且能够有无限多的子目录
XFS:是一种高性能的日志文件系统,而且是 RHEL 7 中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。

# 2. 挂载硬件设备

2.1 硬件设备文件介绍
当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是 “挂载”。而硬盘设备或者分区如何表示呢?在 Linux 的 /dev 目录中放置的就是我们的设备文件。常见的硬件设备文件如下:
/dev/sda 第 1 个 SCSI 磁盘 (整个磁盘)
/dev/sda1 第 1 个 SCSI 磁盘的第一个分区
/dev/sdb 第 2 个 SCSI 磁盘 (整个磁盘)
/dev/sda1 第 2 个 SCSI 磁盘的第一个分区
/dev/cdrom 光盘
/dev/sr0 光盘

2.2 挂载硬件设备
mount 命令
用于挂载文件系统,只需使用 mount 命令把硬盘设备或分区与一个目录文件进行关联,然后就能在这个目录中看到硬件设备中的数据了。对于比较新的 Linux 系统来讲,一般不需要使用 - t 参数来指定文件系统的类型,Linux 系统会自动进行判断。
命令格式: mount [-t 文件系统类型] 设备文件 挂载目录
常用选项:
-a 挂载所有在 /etc/fstab 中定义的文件系统
- t 指定文件系统的类型
实例:
把设备 /dev/cdrom 挂载到 /backup 目录
#mount -t iso9660 /dev/cdrom /backup

执行 mount 命令后就能立即使用文件系统了,但系统在重启后挂载就会失效,也就是说我们需要每次开机后都手动挂载一下。
如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式 “设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检” 写入到 /etc/fstab 文件中。 /etc/fstab 文件中包含着挂载所需的诸多信息项目,一旦配置好之后就能开机自动挂载了
/dev/sdb1 /newdisk xfs defaults 0 0
设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检

字段意义
设备文件一般为设备的路径 + 设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier)
挂载目录指定要挂载到的目录,需在挂载前创建好
格式类型指定文件系统的格式,比如 Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等
权限选项若设置为 defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async
是否备份若为 1 则开机后使用 dump 进行磁盘备份,为 0 则不备份
是否自检若为 1 则开机后自动进行磁盘自检,为 0 则不自检

3.3 卸载硬件设备
umount 命令
用于撤销已经挂载的设备文件。
命令格式: umount [挂载点/设备文件]
实例:
#umount /dev/sdb2 把设备 /dev/sdb2 从 /backup 目录卸载掉
或者 #umount /backup

# 3. 添加硬盘设备

3.1 磁盘管理命令
free 命令
查看内存使用情况,包括虚拟内存、物理内存和缓冲区
命令格式: free [选项]
常用选项:
-b 以字节为单位,默认选项
- k 以 KB 为单位
- m 以 MB 为单位

du 命令
显示目录中文件的空间大小
命令格式: du [参数] [路径名]
常用选项:
-m 以 MB 为单位,统计文件的容量(默认为 KB)
实例:
#du /etc 显示 /etc 下文件的容量

df 命令
统计分区的使用情况
命令格式: df [参数] [分区号/装载点]
常用选项:
-m 以 MB 为单位,统计使用情况
实例:
#df 显示当前所有已装载的分区使用情况
#df /home 显示 /home 分区的使用情况

3.2 添加硬盘设备
首先需要在虚拟机中模拟添加入一块新的硬盘存储设备,然后再进行分区、格式化、挂载等操作,最后通过检查系统的挂载状态并真实地使用硬盘来验证硬盘设备是否成功添加。我们不需要为了做这个实验而特意买一块真实的硬盘,而是通过虚拟机软件进行硬件模拟,因此这再次体现出了使用虚拟机软件的好处

第 1 步:首先把虚拟机系统关机,稍等几分钟会自动返回到虚拟机管理主界面,然后单击 “编辑虚拟机设置” 选项,在弹出的界面中单击 “添加” 按钮,新增一块硬件设备。
第 2 步:选择想要添加的硬件类型为 “硬盘”,然后单击 “下一步” 按钮就可以了。
第 3 步:选择虚拟硬盘的类型为 SCSI (默认推荐),并单击 “下一步” 按钮,这样虚拟机中的设备名称过一会儿后应该为 /dev/sdb。
第 4 步:选中 “创建新虚拟磁盘” 单选按钮,而不是其他选项,再次单击 “下一步” 按钮。
第 5 步:将 “最大磁盘大小” 设置为默认的 20GB。这个数值是限制这台虚拟机所使用的最大硬盘空间,而不是立即将其填满,因此默认 20GB 就很合适了,单击 “下一步” 按钮。
第 6 步:设置磁盘文件的文件名和保存位置(这里采用默认设置即可,无需修改),直接单击 “完成” 按钮。
第 7 步:将新硬盘添加好后就可以看到设备信息了。这里不需要做任何修改,直接单击 “确认” 按钮后就可以开启虚拟机了。

在虚拟机中模拟添加了硬盘设备后就应该能看到抽象成的硬盘设备文件了。按照前文讲解的 udev 服务命名规则,第二个被识别的 SCSI 设备应该会被保存为 /dev/sdb,这个就是硬盘设备文件了,但在开始使用该硬盘之前还需要进行分区操作。
image-20200529170421670
fdisk 命令
在 Linux 系统中,管理硬盘设备最常用的方法就当属 fdisk 命令了。 fdisk 命令用于管理磁盘分区,它提供了集添加、删除、转换分区等功能于一身的 “一站式分区服务”。
语法格式: fdisk [磁盘名称]
参数:
m 查看全部可用的参数
n 添加新的分区
d 删除某个分区信息
l 列出所有可用的分区类型
t 改变某个分区的类型
p 查看分区表信息
w 保存并退出

第 1 步:我们首先使用 fdisk 命令来尝试管理 /dev/sdb 硬盘设备。在看到提示信息后输入参数 p 来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息:
第 2 步:输入参数 n 尝试添加新的分区。系统会要求您是选择继续输入参数 p 来创建主分区,还是输入参数 e 来创建扩展分区。这里输入参数 p 来创建一个主分区:
第 3 步:在确认创建一个主分区后,系统要求您先输入主分区的编号。主分区的编号范围是 1~4,因此这里输入默认的 1 就可以了。接下来系统会提示定义起始的扇区位置,敲击回车键保留默认设置即可。系统会要求定义分区的结束扇区位置,只需要输入 + 2G 即可创建出一个容量为 2GB 的硬盘分区。
第 4 步:再次使用参数 p 来查看硬盘设备中的分区信息。果然就能看到一个名称为 /dev/sdb1、起始扇区位置为 2048、结束扇区位置为 4196351 的主分区了。这时候千万不要直接关闭窗口,而应该敲击参数 w 后回车,这样分区信息才是真正的写入成功啦。
第 5 步:在上述步骤执行完毕之后,Linux 系统会自动把这个硬盘主分区抽象成 /dev/sdb1 设备文件。我们可以使用 file 命令查看该文件的属性,如果系统并没有自动把分区信息同步给 Linux 内核,而且这种情况似乎还比较常见(但不能算作是严重的 bug)。我们可以输入 partprobe 命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令,效果会更好。如果使用这个命令都无法解决问题,那么就重启计算机。

3.3 格式化硬盘设备
如果硬件存储设备没有进行格式化,则 Linux 系统无法得知怎么在其上写入数据。因此,在对存储设备进行分区后还需要进行格式化操作。在 Linux 系统中用于格式化操作的命令是 mkfs。这条命令很有意思,因为在 Shell 终端中输入 mkfs 名后再敲击两下用于补齐命令的 Tab 键,会有如下所示的效果:
这个 mkfs 命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,用起来也非常简单:mkfs. 文件类型名称。
要格式分区为 XFS 的文件系统,则命令应为: mkfs.xfs /dev/sdb1

终于完成了存储设备的分区和格式化操作,接下来就是要来挂载并使用存储设备了。与之相关的步骤也非常简单:首先是创建一个用于挂载设备的挂载点目录;然后使用 mount 命令将存储设备与挂载点进行关联;最后使用 df -h 命令来查看挂载状态和硬盘使用量信息。

# 4. 添加交换分区

SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。但由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。
交换分区的创建过程与前文讲到的挂载并使用存储设备的过程非常相似。在对 /dev/sdb 存储设备进行分区操作前,有必要先说一下交换分区的划分建议:在生产环境中,交换分区的大小一般为真实物理内存的 1.5~2 倍,为了让大家更明显地感受交换分区空间的变化,这里取出一个大小为 5GB 的主分区作为交换分区资源。在分区创建完毕后保存并退出即可:
image-20200529190354858

使用 SWAP 分区专用的格式化命令 mkswap,对新建的主分区进行格式化操作:
image-20200529190741677

使用 swapon 命令把准备好的 SWAP 分区设备正式挂载到系统中。我们可以使用 free -m 命令查看交换分区的大小变化(由 2043MB 增加到 7163MB):
image-20200529190758609
为了能够让新的交换分区设备在重启后依然生效,需要按照下面的格式将相关信息写入到配置文件中,并记得保存:
image-20200529190819525

# 5. 磁盘容量配额

5.1 磁盘配额介绍
Linux 系统的设计初衷就是让许多人一起使用并执行各自的任务,从而成为多用户、多任务的操作系统。但是,硬件资源是固定且有限的,如果某些用户不断地在 Linux 系统上创建文件或者存放电影,硬盘空间总有一天会被占满。针对这种情况,root 管理员就需要使用磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。
可以使用 quota 命令进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。quota 命令还有软限制和硬限制的功能。
软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
硬限制:当达到硬限制时会提示用户,且强制终止用户的操作

5.2 磁盘容量配额设置
磁盘容量配额设置步骤:
步骤一:在存储设备中开启对 quota 的支持
步骤二:创建检查 quota 磁盘容量配额效果的用户
步骤三:利用 xfs_quota 命令配置磁盘配额
步骤四:测试效果

步骤一、RHEL 7 系统中已经安装了 quota 磁盘容量配额服务程序包,但存储设备却默认没有开启对 quota 的支持,此时需要手动编辑配置文件,让 RHEL 7 系统中的 /boot 目录能够支持 quota 磁盘配额技术。Linux 系统要想让硬盘设备支持 quota 磁盘容量配额服务,RHEL 7 系统使用的是 uquota 参数。
image-20200529191805732

在重启系统后使用 mount 命令查看,即可发现 /boot 目录已经支持 quota 磁盘配额技术了。
对 EXT 系列文件系统,quota 仅能针对整个文件系统进行设计,无法对单一的目录进行磁盘配额;而在 xfs 的文件系统中,可以使用 quota 对目录进行磁盘配额,因此在进行磁盘配额前,一定要对文件系统进行检查。
核心必须支持 quota,centos7 默认支持 quota 功能。
只对一般用户有效,因为 root 拥有全部的磁盘空间。
若启用 SELinux 功能,不是所有的目录都能设定 quota,默认 quota 仅能对 /home 进行设定。

步骤二、接下来创建一个用于检查 quota 磁盘容量配额效果的用户 tom,并针对 /boot 目录增加其他人的写权限,保证用户能够正常写入数据
useradd xxx
chmod -Rf o+w /boot

步骤三、利用 xfs_quota 命令配置磁盘配额
xfs_quota 命令可以配置磁盘配额
命令格式: xfs_quota -x -c "command" [挂载点]
选项说明:
-x 专家模式,后续才可以跟 - c 选项
- c 后边跟命令
command: print 简单列出主机内文件系统的信息
report 后边必须跟支持 quota 的载入点,列出 quota 的项目设置

命令格式: xfs_quota -x -c "command" [挂载点]
limit 实际限制选项(block inode name, 名字为 bsoft/bhard/isoft/ihard name)
timer 设置 grace time"
设置用户 myquota1 的 block 限制值:
xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota1" /boot
设置用户组的 myquotagrp 的 block 限制值:
xfs_quota -x -c "limit -g bsoft=950M bhard=1G myquotagrp" /boot
设置 block 的 grace time : xfs_quota -x -c "timer -u -b 14days" /boot
查看磁盘配额: xfs_quota -x -c "state" /boot

利用 xfs_quota 命令配置磁盘配额
[root@linuxprobe ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 xxx' /boot
[root@linuxprobe ~]# xfs_quota -x -c report /boot

测试磁盘配额
dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
命令格式: dd [option]
选项说明:
if = 文件名:输入文件名,缺省为标准输入
of = 文件名:输出文件名,缺省为标准输出
bs=bytes:同时设置读入 / 输出的块大小为 bytes 个字节
count=blocks:仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数

步骤四、测试磁盘配额
当配置好上述的各种软硬限制后,尝试切换到这个普通用户,然后分别尝试创建一个体积为 5MB 和 8MB 的文件。可以发现,在创建 8MB 的文件时受到了系统限制

-->