本章将从Linux系统中的文件存储结构开始,讲述文件系统层次标准(Filesystem Hierarchy Standard,FHS)、udev硬件命名规则以及硬盘设备的原理。分析Linux系统中最常见的Ext3、Ext4与XFS文件系统的不同之处,并着重练习硬盘设备分区、格式化以及挂载等常用的硬盘管理操作,以便熟练掌握文件系统的使用方法。
将进一步完整地部署交换(SWAP)分区、配置quota磁盘配额服务、使用VDO(虚拟数据优化)技术,以及掌握 ln 命令的软硬链接。会对Linux系统以及Windows系统中的磁盘存储以及文件系统有深入的理解。
6.1 一切从“/”开始
在 Linux 系统中,目录、字符设备、套接字、硬盘、光驱、打印机等都被抽象成文件形式;既然平时我们打交道的都是文件,那么又应该如何找到它们呢?在 Windows 操作系统中,想要找到一个文件,要依次进入该文件所在的磁盘分区(也叫盘符),然后再进入该分区下的具体目录,最终找到这个文件。但是在 Linux 系统中并不存在 C、D、E、F 等盘符,Linux 系统中的一切文件都是从“根”目录(/)开始的,并按照文件系统层次标准(FHS)采用倒树状结构来存放文件,以及定义了常见目录的用途。
Linux 系统中的文件和目录名称是严格区分大小写的。例如,root、rOOt、Root、rooT 均代表不同的目录,并且文件名称中不得包含斜杠(/)。文件存储结构如图。
FHS 是根据以往无数 Linux 系统用户和开发者的经验而总结出来的,是Linux 系统中存储文件时需要的规范,用于指导用户应该把文件保存到什么位置,以及告诉用户应该在何处找到所需的文件。要灵活运用所学的知识,千万不要认准这个 FHS
协定只讲死道理。最常见的目录以及所对应的存放内容如图。
Linux 系统中另外还有一个重要的概念—路径。路径指的是如何定位到某个文件,分为绝对路径与相对路径。绝对路径指的是从根目录(/)开始写起的文件或目录名称,而相对路径则指的是相对于当前路径的写法。比如问网卡文件 ifcfg-ens160 在哪里?相关表诉如下。
➢ 绝对路径(absolute path):/etc/sysconfig/network-scripts/这里
➢ 相对路径(relative path):/network-scripts/这里
6.2 物理设备的命名规则
Linux 系统中一切都是文件,硬件设备也不例外。系统内核中的 udev 设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;udev
设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev 目录下的设备文件。常见的硬件设备及其文件名称如图。
现在的 IDE 设备已经很少见了,所以一般的硬盘设备都是以“/dev/sd”开头。而一台主机上可以有多块硬盘,因此系统采用 a~z 来代表 26 块不同的硬盘(默认从 a 开始分配),而且硬盘的分区编号也很有讲究:
➢ 主分区或扩展分区的编号从 1 开始,到 4 结束;
➢ 逻辑分区从编号 5 开始。
关于存储还有两个冷知识:
第一个 /dev 目录中 sda 设备之所以是 a,并不是由插槽决定的,而是由系统内核的识别顺序来决定的,而恰巧很多主板的插槽顺序就是系统内核的识别顺序,因此才会被命名为/dev/sda。比如使用 iSCSI 网络存储设备时发现,明明主板上第二个插槽是空着的,但系统却能识别到/dev/sdb 这个设备—就是这个道理。
第二个 /dev/sda3 是设备上的第 3 个分区,普通情况下确实是这样。但分区的数字编码不一定是强制顺延下来的,是可以手工指定的。因此 sda3 只能表示是编号为 3 的分区,而不能断定 sda 设备上已经存在 3 个分区。
下面分析一下/dev/sda5 这个设备文件名称包含哪些内容如图。
“/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为 5 的逻辑分区的设备文件”。硬盘设备是由大量的扇区组成的,每个扇区的容量为 512 字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用 446 字节,分区表占用 64 字节,结束符占用 2 字节;其中分区表中每记录一个分区信息就需要 16 字节,这样一来最多只有 4 个分区信息可以写到第一个扇区中,这 4 个分区就是 4 个主分区。第一个扇区中的数据信息如图
每块硬盘最多只能创建出 4 个分区?在很多时候明显不够用。于是为了解决分区不够的问题,可以将第一个扇区的分区表中 16 字节(原本要写入主分区信息)的空间(称为扩展分区)拿出来指向另外一个分区。扩展分区其实并不是一个真正的分区,而更像是一个占用 16 字节分区表空间的指针—一个指向另外一个分区的指针。这样 3 个主分区加 1 个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,从而来满足多分区(大于 4 个)的需求。
注意!扩展分区严格地讲它不是一个实际的分区,而仅仅是一个指向其他分区的指针,这种指针结构将形成一个单向链表。因此扩展分区不能存储数据,需要在其指向的对应分区(逻辑分区)上操作存储。
6.3 文件系统与数据资料
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的;文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。
Linux系统支持数十种文件系统,而最常见的文件系统如下。
➢ Ext2:最早可追溯到1993年,是Linux系统的第一个商业级文件系统,它基本沿袭了UNIX文件系统的设计标准。但由于不包含日志读写功能,数据丢失的可能性很大。
➢ Ext3:是一款日志文件系统,它会把整个硬盘的每个写入动作的细节都预先记录下来,然后再进行实际操作,以便在发生异常宕机后能追踪到被中断的部分并自动修复数据与错误。但当硬盘容量较大时,所需的修复时间也会很长,而且也不能100%地保证资料不会丢失。
➢ Ext4:Ext3的改进版本,作为RHEL 6系统中默认的文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。且Ext4文件系统能够批量分配block(块),从而极大地提高了读写效率。现在很多主流服务器也会使用Ext4文件系统。
➢ XFS:是一种高性能的日志文件系统,而且是RHEL 7/8中默认的文件管理系统。它的优势在于发生意外宕机后可以快速地恢复可能被破坏的文件,而且强大的日志功能只需花费极低的计算和存储性能。它支持的最大存储容量为18EB,这几乎满足了所有需求。
RHEL 7/8 系统中默认使用了 XFS 作为文件系统,这不同于 RHEL 6 使用的 Ext4;从红帽公司官方发布的说明来看,确实是一个不小的进步。不论实际使用如何,最卓越的亮点当属可支持高达 18EB 的存储容量。18EB 等于 18,874,368TB。假设每块硬盘的容量是 100TB,那么需要 19 万块硬盘才能把 18EB 的数据都装下。
一块新的硬盘存储设备先需要分区,然后再格式化文件系统,最后才能挂载并正常使用。硬盘的分区操作取决于用户的需求和硬盘大小;也可以选择不进行分区,但是必须对硬盘进行格式化处理。
Linux 系统中有一个名为 super block 的“硬盘地图”。日常使用不是把文件内容直接写入到“硬盘地图”里面,而是在里面记录着整个文件系统的信息。如果把所有的文件内容都写入到里面,它的体积将变得非常大,而且文件内容的查询与写入速度也会变得很慢。因此只是把每个文件的权限与属性记录在 inode 中,每个文件占用一个独立的 inode 表格,该表格的大小默认为 128 字节,里面记录着如下信息。
➢ 该文件的访问权限(read、write、execute);
➢ 该文件的所有者与所属组(owner、group);
➢ 该文件的大小(size);
➢ 该文件的创建或内容修改时间(Ctime);
➢ 该文件的最后一次访问时间(Atime);
➢ 该文件的修改时间(Mtime);
➢ 文件的特殊权限(SUID、SGID、SBIT);
➢ 该文件的真实数据地址(point)。
而文件的实际内容则保存在 block 块中(大小一般是 1KB、2KB 或 4KB),一个 inode 的默认大小仅为 128 字节,记录一个 block 则消耗 4 字节。当文件的 inode 被写满后系统会自动分配出一个 block,专门用于像 inode 那样记录其他 block 块的信息,这样把各个 block
块的内容串到一起,就能够让用户读到完整的文件内容了。对于存储文件内容的 block 块有两种常见的情况(以 4KB 大小的 block 为例进行说明)。
➢ 情况 1:文件很小(1KB),但依然会占用一个 block,因此会潜在地浪费 3KB。
➢ 情况 2:文件很大(5KB),那么会占用两个 block(5KB−4KB 后剩下的 1KB 也要占用一个 block)。
说到 block 这个特性在其他系统也一样,只不过我们平时没有留意到。比如查看一个Windows电脑中已有的文件,看看文件的实际大小与占用空间是否一致如图。
Linux 内核中的软件层为用户程序提供了一个虚拟文件系统(Virtual File
System,VFS)接口,这样用户在操作文件时就是统一对这个虚拟文件系统进行操作了。下图所示为 VFS 的架构示意图;从中可见VFS 也有点像一个翻译官。我们不需要知道对方的情况,只要告诉 VFS 想进行的操作是什么,它就会自动判断翻译并交代下去。这样用户在日常使用时会觉得“文件系统都是一样的”,也就可以使用各种命令在文件系统中进行各种操作了(比如使用 touch 命令来新建文件)。
6.4 挂载硬件设备
在用惯了 Windows 系统后会忽略一些细节,平时把 U 盘插入到电脑后不会考虑到 Windows 系统后台做了哪些事情,才使得我们可以访问 U 盘里的文件。前面讲到一块全新的硬盘存储设备要先分区,然后格式化,最后才能挂载并正常使用。“分区”和“格式化”以前经常听到,但“挂载”
又是什么呢?Linux系统中当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联这个操作就是“挂载”;而在Windows系统中则是分配了一个盘符(如E盘、F盘)相当于挂载。
6.4.1 mount 命令
mount 命令用于挂载文件系统,格式为“mount 文件系统 挂载目录”。mount 命令中可用的参数及作用如下图。挂载是在使用硬件设备前所执行的最后一步操作,只需使用
mount 命令把硬盘设备或分区与一个目录文件进行关联,然后就能在这个目录中看到硬件设备中的数据了。对于比较新的 Linux 系统来讲,一般不需要使用-t 参数来指定文件系统的类型,Linux 系统会自动进行判断。而 mount 中的-a 参数则厉害了,它会在执行后自动检查 /etc/fstab
文件中有无被漏挂载的设备文件,如果有则进行自动挂载操作。
例如把设备/dev/sdb2 挂载到/word 目录,只需要在 mount 命令中输入设备与挂载目录名称就行,系统会自动判断挂载文件的类型。
如果要挂载一块网络存储设备,该设备的名字可能会变来变去,这样再写为
sdb 就不太合适了。这时可以用 UUID(Universally Unique Identifier,通用唯一识别码)进行挂载操作。UUID 是一串用于标识每块独立硬盘的字符串,具有唯一性及稳定性,特别适合用来挂载网络设备。
这时就需要先知道独立硬盘的 UUID ,使用 blkid 命令用于显示设备的属性信息,英文全称为“block id”,语法格式为“blkid [UUID=*] 挂在目录”。使用 blkid 命令来查询设备 UUID 如下:
执行 mount 命令后就能立即使用文件系统了,但系统在重启后挂载就会失效,也就是说需要每次开机后都手动挂载一下。如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”(各字段的意义见下图)写入到/etc/fstab 文件中。这个文件中包含着挂载所需的诸多信息,一旦配置好之后系统启动时会自动挂载。
如果想将文件系统为 Ext4 的硬件设备/dev/sdb2 在开机后自动挂载到 /word 目录上,并保持默认权限且无须开机自检,就需要在/etc/fstab 文件中写入下面的信息,这样在系统重启后也会成功挂载。要使用本地系统镜像制作 Yum/DNF 软件仓库,也可将光盘设备挂载到
/media/sr0 目录中。光盘设备的文件系统格式是 iso9660。
6.4.2 df 命令
df 命令用于查看已挂载的磁盘空间使用情况,英文全称为“disk free”,语法格式为
“df -h”。它不仅能够列出系统中正在使用的设备有哪些,还可以用-h 参数便捷地对存储容量进行“进位”换算显示。例如在遇到 10240K 的时候会自动进位写成 10M,非常方便我们的查看。
说到网络存储设备,建议在 fstab 文件挂载信息中加上_netdev 参数。加上后系统会等联网成功后再尝试挂载这块网络存储设备,从而避免了开机时间过长或失败的情况(在后面 17 章学习 iSCSI 技术时可以用上)。
6.4.3 umount 命令
挂载文件系统的目的是为了使用硬件资源,而卸载文件系统则意味不需要某硬件资源了。既然挂载操作就是把硬件设备与目录两者进行关联的动作,那么卸载操作只需要说明想要取消关联的设备文件或挂载目录的其中一项即可,一般不需要加其他额外的参数。umount 命令用于卸载设备或文件系统,英文全称为“un mount”,语法格式为“umount [设备文件/挂载目录]”。
如果系统中硬盘特别多,分区也多都不知道它们是否有被使用,又或者是做了些什么。此时就可以用 lsblk 命令以树状图的形式列举显示,类似于tree文件查看命令。lsblk 命令用于查看已挂载的磁盘的空间使用情况,英文全称为“list block id”,直接输入该命令执行即可。
6.5 添加硬盘设备
这里以虚拟机中模拟添加入一块新的硬盘存储设备,然后再进行分区、格式化、挂载等操作,最后通过检查系统的挂载状态并真实地使用硬盘来验证硬盘设备是否成功添加。首先把虚拟机系统关机,稍等会自动返回到虚拟机管理主界面,然后单击“编辑虚拟机设置”选项,在弹出的界面中单击“添加”按钮,新增一块硬件设备,再下一步如图。
选择虚拟硬盘的类型为 SCSI/SATA,并单击“下一步”按钮,如图所示。这样虚拟机中的设备名称过一会儿后应该为/dev/sdb。
选中“创建新虚拟磁盘”单选按钮(不用其他选项),单击“下一步”如图。
最大磁盘大小默认是20GB。这个数值是限制目前虚拟机添加的最大硬盘空间,默认的 20GB 就很合适了,不用选立即分配所有磁盘空间。单击“下一步”如图。
最后是设置磁盘文件的名字和保存位置(这里保持默认设置即可),直接单击“完成”按钮;将新硬盘添加好后就可以看到设备信息了。这里不需要做任何修改,直接单击“确定” 按钮后就可以启虚拟机了如图。
按照前面讲解的 udev 服务命名规则,第二个被识别的 SCSI/SATA 设备会被保存为/dev/sdb,这个就是硬盘设备文件了。但在开始使用该硬盘之前还需要进行分区操作,例如从中分出一个 2GB 的分区以供后面的操作使用。
6.5.1 fdisk 命令
fdisk 命令用于新建、修改及删除磁盘的分区表信息,英文全称为“format disk”,语法格式为“fdisk 磁盘名称”。
在 Linux 系统中管理硬盘设备最常用的方法就当属 fdisk 命令了。它提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”。有趣的是这条命令的参数是交互式的一问一答的形式,因此在管理硬盘设备时特别方便,可以根据需求即时调整。
首先使用 fdisk 命令来管理 /dev/sdb 硬盘设备。在看到提示信息后输入参数 p 来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息。输入参数 n 添加新的分区。系统会要求用户是选择继续输入参数 p 来创建主分区,还是输入参数 e 来创建扩展分区。这里输入参数 p 来创建一个主分区。
在确认创建一个主分区后,系统要求输入主分区的编号?在前面讲到主分区的编号范围是 1~4,因此这里输入默认的 1 就可以了。系统提示定义起始的扇区位置?敲击回车键保留默认设置即可,系统会自动计算出最靠前的空闲扇区的位置。最后系统要求定义分区的结束扇区位置,这其实就是要定义整个分区的大小是多少。输入+2G 即可创建出一个容量为 2GB
的硬盘分区。
再次使用 p 来查看硬盘设备中的分区信息。就能看到一个名称为/dev/sdb1、起始扇区位置为 2048、结束扇区位置为 4196351 的主分区了。最后应该敲击参数 w 后按回车键,这样分区信息才是真正地写入成功。
分区信息中第 6 个字段的 Id 值是一个编码,用于标识该分区的作用,可帮助用户快速了解该分区的作用,一般没必要修改。使用 l 参数查看一下磁盘编码都有哪些。
可以使用 file 命令查看新建的 /dev/sdb1 分区文件的属性,但有些时候系统并没有自动把新分区信息同步给 Linux 内核,可以输入 partprobe 命令手动将分区信息同步到内核,推荐连续两次执行该命令效果会更好。如果使用这个命令都无法解决问题,那么就重启计算机吧。
如果硬件存储设备没有进行格式化,Linux 系统就无法在上面写入数据。因此在对存储设备进行分区后还需要进行格式化操作。在 Linux 系统中用于格式化操作的命令是
mkfs。这条命令很有意思,因为在 Shell 终端中输入 mkfs 名后再敲击两下用于补齐命令的 Tab
键,会有多个类似文件名。
mkfs 命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,用起来也非常简单—mkfs.文件类型名称。例如要将分区为 XFS 的文件系统进行格式化,则命令应为 mkfs.xfs /dev/sdb1。
完成格式化最后就是要来挂载并使用存储设备了。首先是创建一个用于挂载设备的目录;然后使用 mount
命令将存储设备与挂载点进行关联。可以使用 df -h 命令来查看挂载状态和硬盘使用量信息。重启后也生效记得把关联项写入到 /etc/fstab文件。
6.5.2 du 命令
du 命令用来查看分区或目录所占用的磁盘容量大小,英文全称为“disk usage”,语法格式为“du -sh 目录名称”。
在使用 Window 系统时,我们总会遇到“C 盘容量不足,清理垃圾后又很快被占满”的情况。在 Linux 系统中可以使用 du -sh /*命令来查看在 Linux 系统根目录下所有一级目录分别占用的空间大小,在 1s 之内就能找到哪个目录占用的空间最多。
一般会单独看某个文件夹,试着从某目录中复制一批文件到新分区目录 /new,然后查看这些文件总共占用了多大的容量。
6.6 添加交换分区
交换(SWAP)分区是一种通过在硬盘中预先划分一定的空间,然后把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。通俗来讲就是让硬盘帮内存分担压力。但由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。交换分区的大小一般为真实物理内存的 1.5~2 倍。这里取出一个大小为 3GB 的主分区作为交换分区资源。
在上面的操作后就得到了一个容量为 3GB 的新分区。然后输入 t 修改硬盘的标识码,这里将其改成 82(Linux swap)表示将会作为交换分区。
关于两个与交换分区相关的简单命令。
mkswap 命令用于对新设备进行交换分区格式化,英文全称为“make swap”,语法格式为
“mkswap 设备名称”;swapon 命令用于激活新的交换分区设备,英文全称为“swap on”,语法格式为“swapon
设备名称”。
下面用 mkswap 格式化交换分区,再用 swapon 命令挂载启用到系统中。可以使用 free -m 命令查看交换分区的大小变化(由 2047MB 增加到 5119MB)。写入到 /etc/fstab文件时不一样的是关联目录对应的是swap。
6.7 磁盘容量配额
硬件资源是固定且有限的,如果某些用户不断地在 Linux 系统上创建文件或者存放电影,硬盘空间总有一天会被占满。针对这种情况,root
管理员就需要使用磁盘容量配额服务来限制某位用户或组,针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。可以使用 quota 技术进行磁盘容量配额管理,同时还有软限制和硬限制的功能。
➢ 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
➢ 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
RHEL 8 系统中已经安装了 quota 磁盘容量配额服务程序包,但存储设备却默认没有开启对 quota 技术,此时需要手动编辑 /etc/fstab配置文件并重启一次系统,让系统中的启动目录(/boot)能够支持 quota 磁盘配额技术。
早期的 Linux 系统要想让硬盘设备支持 quota 磁盘容量配额服务,使用的是
usrquota 参数,而 RHEL 7/8 系统使用的则是 uquota 参数。在重启系统后使用 mount 命令查看,即可发现/boot 目录已经支持 quota 磁盘配额技术了。
6.7.1 xfs_quota 命令
xfs_quota 命令用于管理设备的磁盘容量配额,语法格式为“xfs_quota [参数] 配额 目录”。这是一个专门针对 XFS 文件系统来管理 quota 磁盘容量配额服务而设计的命令。其中,-c 参数用于以参数的形式设置要执行的命令;-x 参数是专家模式,让运维人员能够对 quota
服务进行更多复杂的配置。
下面使用 xfs_quota 命令来设置用户 b1 对/boot 目录的 quota 磁盘容量配额。具体的限额控制包括:硬盘使用量的软限制和硬限制分别为 3MB 和 6MB;创建文件数量的软限制和硬限制分别为 3 个和 6 个。并针对/boot 目录增加其他人的写权限,保证用户能够正常写入数据。
上面所使用的参数分为两组,分别是 isoft/ihard 与 bsoft/bhard,开始用 limit 结束为 b1用户。在
6.3 节中讲过在 Linux 系统中每个文件都会使用一个独立的 inode 信息块来保存属性信息,一个文件对应一个 inode 信息块,所以 isoft 和 ihard 就是通过限制系统最大使用的 inode
个数来限制了文件数量。bsoft 和 bhard 则是代表文件所占用的 block 大小,也就是文件占用的最大容量的总统计。
soft 是软限制,超过该限制后也只是将操作记录写到日志中,不对用户行为进行限制。而 hard 是硬限制,一旦超过系统就会马上禁止,用户再也不能创建或新占任何的硬盘容量。
切换到普通用户 b1 ,然后分别创建一个体积为 5MB 和 8MB 的文件。可以发现,在创建 8MB 的文件时受到了系统限制。
6.7.2 edquota 命令
edquota 命令用于管理系统的磁盘配额,英文全称为“edit quota”,语法格式为“edquota [参数] 用户名”。在为用户设置了 quota 磁盘容量配额限制后,可以使用 edquota 命令按需修改限额的数值。其中,-u 参数表示要针对哪个用户进行设置;-g 参数表示要针对哪个用户组进行设置如图。
edquota 命令会调用 Vi 或 Vim 编辑器来让 root 管理员修改要限制的具体细节,记得用
wq 保存退出。下面把用户 b1 的硬盘使用量的硬限额从 5MB 提升到 8MB,再次切换测试结果成功。
6.8 VDO(虚拟数据优化)
VDO(Virtual Data Optimize,虚拟数据优化)是一种通过压缩或删除存储设备上的数据来优化存储空间的技术。VDO 是红帽公司收购了 Permabit 公司后获取的新技术,并在 2019-2020 年前后,多次在 RHEL 7.5/7.6/7.7 上进行测试,最终随 RHEL 8 系统正式公布。VDO
技术的关键就是对硬盘内原有的数据进行删重操作,它有点类似于我们平时使用的网盘服务,在第一次正常上传文件时速度特别慢,在第二次上传相同的文件时仅作为一个数据指针,几乎可以达到“秒传”的效果,无须再多占用一份空间。除了删重操作,VDO 技术还可以对日志和数据库进行自动压缩,进一步减少存储浪费的情况。VDO 针对各种类型文件的压缩效果如图。
VDO 技术支持本地存储和远程存储,可以作为本地文件系统、iSCSI 或 Ceph 存储下的附加存储层使用。红帽公司在 VDO 介绍页面中提到,在部署虚拟机或容器时,建议采用逻辑存储与物理存储为 10∶1 的比例进行配置,即 1TB 物理存储对应 10TB 逻辑存储;而部署对象存储时 (例如使用 Ceph)则采用逻辑存储与物理存储为 3∶1 的比例进行配置,即使用 1TB物理存储对应 3TB 逻辑存储。
其中有两种特殊情况,1.公司服务器上已有的 dm-crypt 之类的技术是可以与 VDO 技术兼容的,但记得要先对卷进行加密再使用 VDO。因为加密会使重复的数据变得有所不同,因此删重操作无法实现。要始终记得把加密层放到 VDO 之下如图。2.VDO 技术不可叠加使用,1TB 的物理存储提升成 10TB 的逻辑存储没问题,但是再用 10TB 翻成 100TB 就不行了。
下面创建一个新的VDO卷,关闭虚拟机再次添加一块容量为 20GB 的新硬盘,开机后就能看到这块名称为/dev/sdc 的新硬盘了。RHEL/CentOS 8 系统中默认已经启用了 VDO 技术。VDO 技术现在是红帽公司自己的技术,兼容性自然没得说。如果系统没有安装 VDO 的话可以用命令 dnf install kmod-kvdo vdo 安装。
新添加进来的物理设备就是使用 vdo 命令来管理的,其中 name 参数代表新的设备卷的名称;device 参数代表由哪块磁盘进行创建;vdoLogicalSize(L、S必须大写) 参数代表制作后的设备大小。依据红帽公司推荐的原则,20GB 硬盘将翻成 200GB 的逻辑存储。在创建成功后,使用 [status] 参数查看新建卷的概述信息,可见在输出信息中包含了 VDO 卷创建的时间、主机名、版本、是否压缩(Compression)及是否删重(Deduplication)等。
新建的 VDO 卷设备会被乖乖地存放在/dev/mapper 目录下,以上面自定义的名字存在对它操作就行。挂载前可以用 udevadm settle 命令对设备进行一次刷新操作,避免刚才的配置没有生效。使用 vdostats 命令可以查看使用情况。[human-readable] 参数的作用是将存储容量自动进位换算,以M或G的单位显示。显示的 Size 是实际物理存储的大小(即 20.0GB 是硬盘的大小),如果想看逻辑存储空间,可以使用 df 命令进行查看。
复制一个大文件到VDO卷,看看占用了多少容量,以及空间节省率(Space saving)是多少。原先 448MB 的文件这次只占用了不到 100MB 的容量,空间节省率也从 18%提升到了 55%。这还仅仅是两次操作而已,压缩率就已经如此明显了。
手动编辑/etc/fstab 文件后才能在下一次重启后自动挂载生效,对于这种逻辑存储设备,这里不太建议使用/dev/mapper/storage 的设备名进行挂载。可以用前面所说的 UUID 号,再加上_netdev 参数。
6.9 软硬方式链接
在 Windows 系统中,快捷方式就是指向原始文件的一个链接文件,可以让用户从不同的位置来访问原始的文件;原文件一旦被删除或剪切到其他地方,会导致链接文件失效。但是,这个看似简单的东西在 Linux 系统中可不太一样。Linux 系统中存在软链接和硬链接两种不同的类型。
➢ 软链接(soft link):也叫符号链接(symbolic link),仅仅包含所链接文件的名称和路径,很像一个记录地址的标签。当原始文件被删除或移动后,链接文件也会随之失效。可以针对文件、目录设置软链接,跨文件系统进行链接也不是问题。从这一点来看,它与Windows系统的“快捷方式”具有一样的性质。用户访问软链接的效果如图。
➢ 硬链接(hard link):可以将它理解为一个“指向原始文件 block 的指针”,系统会创建出一个与原来一模一样的 inode 信息块。硬链接文件与原始文件其实是一模一样的,只是名字不同。每添加一个硬链接,该文件的inode个数就会增加1;而且只有当该文件的 inode 个数为0时,才算彻底将它删除。由于硬链接实际上是指向原文件 block 的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。由于技术的局限性,不能跨分区对目录文件进行硬链接。用户访问硬链接的效果如图。
ln 命令
ln 命令用于创建文件的软硬链接,英文全称为“link”,语法格式为“ln [参数]原始文件名 链接文件名”。ln 命令的可用参数以及作用如下图。在使用 ln 命令时,是否添加-s 参数,将创建出性质不同的两种“快捷方式”。
为了更好地理解软链接、硬链接的不同性质,我们先创建出一个文件,为其创建一个软链接;原始文件名为 so,新的软链接文件名为 newso。删掉原始文件so后,软链接文件newso就无法读取了。
再针对原始文件 ha 创建一个硬链接,相当于针对原始文件的硬盘存储位置创建了一个指针。这样一来,新创建的这个硬链接就不再依赖于原始文件的名称等信息,也不会因为原始文件的删除而导致无法读取了。同时可以看到创建硬链接后,原始文件的硬盘链接数量增加到了2个。
创建的硬链接文件竟然会让文件属性第二列的数字变成了
2,这个数字表示的是文件的 inode 信息块的数量。即便删除了原始文件,新的文件也可以读取,因为只有当文件 inode 数量被“清零”时,才真正代表这个文件被删除了。
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com