slacr_

Just to record my life and thoughts.
笔记/编程/杂乱/极简

[Linux]存储结构与管理硬盘

Oct 6, 2023Linux3963 words in 26 min

一切从/开始

物理设备命名规则


文件系统与数据资料

常见文件系统

Ext2:最早可追溯到1993年,是Linux系统第一个商业级文件系统,基本沿袭的是Unix文件系统的设计标准。但由于不包含读写日志功能,数据丢失可能性很大,能不用就不要用,或者顶多建议用于SD存储卡或U盘。

Ext3:是一款日志文件系统,它会把整个硬盘的每个写入动作的细节都预先记录下来,然后再实际操作,以便在发生异常宕机后能回溯追踪到被中断的部分。Ext3能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。

Ext4:Ext3的改进版本,作为RHEL6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。现在很多主流服务器也会使用。

XFS:是一种高性能的日志文件系统,而且是RHEL7/8中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为18EB,这几乎满足了所有需求。

在拿到了一块新的硬盘存储设备后,先需要分区,然后再格式化文件系统,最后才能挂载并正常使用。硬盘的分区操作取决于您的需求和硬盘大小;也可以选择不进行分区,但是必须对硬盘进行格式化处理。

计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。


±这个关联动作就是“挂载”。

mount命令用于挂载文件系统,格式为“mount 文件系统 挂载目录”。

1
2
3
4
lsblk
blkid
mount UUID=478fRb-1pOc-oPXv-fJOS-tTvH-KyBz-VaKwZ6 /backup

让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式写入到/etc/fstab文件中。

对于网络存储设备,建议您加上_netdev参数。加上后系统会等待联网成功后再尝试挂载这块网络存储设备,避免了开机时间过长或失败的情况

df命令用于已挂载的磁盘空间使用情况,英文全称为:“disk free”,语法格式为:“df -h”

1
2
3
mount -a 
df -h
umount /dev/sdb2

添加硬盘设备

fdisk

fdisk命令用新建、修改及删除磁盘的分区表信息,英文全称为:“format disk”,语法格式为: “fdisk 磁盘名称”。

1
fdish /dev/sdb1

可以输入partprobe命令手动将分区信息同步到内核

mkfs

如果硬件存储设备没有进行格式化,则Linux系统无法得知怎么在其上写入数据。因此,在对存储设备进行分区后还需要进行格式化操作。在Linux系统中用于格式化操作的命令是mkfs。

1
mkfs.xfs /dev/sdb1

创建一个用于挂载设备的挂载点目录;然后使用mount命令将存储设备与挂载点进行关联;最后使用df-h命令来查看挂载状态和硬盘使用量信息。

1
2
3
mkdir /newFS
mount /dev/sdb1 /newFS
df -h

du命令用查看分区或目录所占用的磁盘容量大小,英文全称为:“Disk Usage”,语法格式为:“du-sh目录名称”。简单来说,该命令就是用来查看一个或多个文件占用了多大的硬盘空间。

让这个设备文件的挂载永久有效,则需要把挂载的信息写入到配置文件中

1
2
vi /etc/fstab
...添加条目

添加交换分区

SWAP交换分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。通俗来讲就是让硬盘帮内存分担压力。但由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。
在生产环境中,交换分区的大小一般为真实物理内存的1.5~2倍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fdisk /dev/sdb2
# 新建分区, 修改文件系统类型为swap, hex code 是 82

mkswap /dev/sdb2
# 格式化swap分区

free -m
swapon /dev/sdb2
free -m
# 激活swap分区

vi /etc/fstab

/dev/sdb2 swap swap defaults 0 0
# 更新文件系统记录表

磁盘容量配额

root管理员就需要使用磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。可以使用quota技术进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。quota技术还有软限制和硬限制的功能。

软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。

RHEL8系统中已经安装了quota磁盘容量配额服务程序包,但存储设备却默认没有开启对quota技术的支持,此时需要手动编辑配置文件再重启一次,让系统中的启动目录(/boot)能够支持quota磁盘配额技术。

早期的Linux系统要想让硬盘设备支持quota磁盘容量配额服务,使用的是usrquota参数,而RHEL7/8系统使用的则是uquota参数。在重启系统后使用mount命令查看,即可发现/boot目录已经支持quota磁盘配额技术了:

xfs_quota命令用于管理设备的磁盘容量配额,语法格式为:“xfs_quota [参数] 配额文件系统”。
这是一个专门针对XFS文件系统来管理quota磁盘容量配额服务而设计的命令,其中,-c参数用于以参数的形式设置要执行的命令;-X参数是专家模式,让运维人员能够对quota服务进行更多复杂的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
useradd tom
chmod -R o+w /boot
xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot

xfs_quota -x -c report /boot
...

su - tom
cd /boot
dd if/dev/zero of=/boot/tom_add bs=5M count=1

dd if/dev/zero of=/boot/tom_add bs=8M count=1
## dd: error writing—/boot/to m_add':Disk quota exceeded

在Linux系统中每个文件都会被一个独立的inode信息块所保存属性信息,一个文件对应一个inode信息块,所有isoft和ihard就是通过限制了系统最大使用的inode个数来限制了文件格式。bsoft和bhard则是代表文件所占用的block块大小,也就是文件最多所占用的总统计。
soft是软限制,超过了也只是写到日志中,不对用户行为进行限制。而hard是硬限制,一旦超过就会马上进行禁止,再也不能创建或新占任何的硬盘容量。

edquota

edquota命令用于管理系统的磁盘配额,英文全称为:“edit quota”,语法格式为:“edquota [参数]用户名”。

1
2
3
edquota -u tom
...

VDO虚拟数据优化

Virtual Data Optimize是一种通过压缩或删除存储设备上的数据来优化存储空间的技术,简称VDO,中文名叫虚拟数据优化。是由红帽公司收购了Permabit公司后获取的新技术,在2019年至2020年前后,多次在RHEL7.5/7.6/7.7上进行测试,最终随RHEL8系统正式公布。VDO技术的关键就是对硬盘内原有的数据进行删重操作,理论上只用原来的一半空间就够了,有点类似于大家平时用的网盘服务,第一次正常上传特别慢,第二次上传的文件几乎可以达到“秒传”的效果,无需再多占用一份空间及漫长等待。除了删重操作,还可以对日志和数据库进行自动压缩,进一步减少存储浪费的情况.
VDO可以作为本地文件系统、iSCSI或Ceph存储下的附加存储层使用,支持本地和远程存储。

其一,如果公司服务器上已有DM crypt之类的技术是可以与VDO兼容的,但记得要先做加密卷再使用VDO。因为加密会使重复的数据变得有所不同,因此删重操作无法实现,始终记得把加密层放到VDO之下
其二,VDO技术不可叠加使用,1T物理存储提升成10T逻辑存储没问题,再用10T翻成100T就不行了。

RHEL 9 中 VDO 是由 LVM 统一管理的, VDO 作为 LVM 逻辑卷(LV)的一种类型. 和 RHEL 8 中直接使用 VDO 软件管理不同. 参考 直接使用vdo命令会发现找不到.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
lvm version    
pvcreate /dev/sdc # 创建物理卷
pvdisplay

vgcreate myvg /dev/sdc # 创建卷组
vgdisplay

lvcreate --type vdo --name vdo1 --size 19G --virtualsize 200G myvg # 创建逻辑卷, 类型为VDO
lvdisplay

mkfs.xfs -K /dev/myvg/vdo1 # 格式化文件系统
udevadam settle # 等待 Udev 事件处理完成,以确保设备节点已经创建或删除

mkdir /vdo1
mount /dev/myvg/vdo1 /vdo1 # 挂载

vdostats --human-readable
df -h

# 测试
ls -lh /media/cdrom/images/install.img
cp /media/cdrom/images/install.img /vdo1/
ls -lh /vdo1/install.img
vdostats --human-readable

cp /media/cdrom/images/install.img /vdo1/rhel.img
vdostats --human-readable
# 节省了很多空间

# 写入fstab
blkid /dev/myvg/vdo1

vim /etc/fstab
UUID=3f52a808-8b9c-4da3-a27a-5de54db22d85 /vdo1 xfs defaults,_netdev 0 0

加上_netdev参数,代表等系统及网络都启动后再挂载VDO设备卷,保证万无一失。

软硬件方式链接

在Linux系统中存在软链接和硬链接两种不同类型

  • 软链接(symbolic link):
    也叫符号链接,仅仅包含所链接文件的名称和路径,像个记录地址的标签。当原始文件被删除或移动后,新的链接文件也会随之失效,不能被访问,可以对文件、目录做软链接,跨文件系统也不是问题,从这一点来看与Windows系统的“快捷方式”具有一样的性质。

  • 硬链接(hard link):
  • 可以将它理解为一个“指向原始文件block的指针”,系统会创建出一个与原来一摸一样的inode信息块。所以,硬链接文件与原始文件其实是一摸一样的,只是名字不同。每添加一个硬链接,该文件的inode个数就会增加1;而且只有当该文件的inode个数为0时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件block的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,不能跨分区对目录文件进行硬链接。

ln命令用于创建文件的软硬链接,英文全称为:“link”,语法格式为:“In [参数] 原始文件名 链接文件名”。

1
2
3
4
5
6
7
8
# soft link
echo "test for soft link" > old.txt
ln -s old.txt new.txt
cat new.txt
ll
rm old.txt
cat new.txt
ll

1
2
3
4
5
6
7
8
# hard link
echo "test for hard link" > old.txt
ln old.txt new.txt
cat new.txt
ll
rm old.txt
cat new.txt
ll

创建的硬链接文件会让文件属性第二列的数字变成了2,这个数字就是文件的inode信息块数量。即便删除了原始文件,新的文件也会一如既往的可以读取,因为只有当文件inode数量被“清零”时,才真正代表这个文件被删除了。

其他

superblock 和 inode

Superblock(超级块)是文件系统的元数据之一,它存储了文件系统的整体信息,包括文件系统的大小、块大小、inode表的位置、数据块的位置等。Superblock记录了文件系统的结构和配置信息,是文件系统的入口点。

Inode(索引节点)是文件系统中的另一个重要元数据。每个文件和目录在文件系统中都有对应的Inode,它包含了文件或目录的元信息,如文件大小、所有者、权限、时间戳等。Inode还包含了指向实际数据块的指针,用于定位文件的内容。

Superblock和Inode是文件系统的核心组成部分,它们共同协作来管理文件系统中的文件和目录。Superblock提供了整体的文件系统信息,而Inode则用于表示和管理每个文件和目录的元数据和数据块的位置。

在文件系统中,Superblock和Inode的数量是有限的,这限制了文件和目录的数量。不同文件系统的Superblock和Inode的分布和使用方式可能有所不同,具体取决于文件系统的设计和实现。

关闭订阅提示

1
2
3
4
5
6
vim /etc/yum/pluginconf.d/subscription-manager.conf 

enable=0

## or
yum remove subscription-manager

参考

  1. Linux就该这么学
  2. [鸟哥linux基础学习篇4th]
  3. linux命令
  4. 开源许可证总览
  5. LSB标准
  6. 硬盘结构
  7. RHCSA学习
  8. RHEL订阅
  9. 如何在 RHEL 9 上创建本地 Yum/DNF 仓库
  10. VDO github地址
  11. RHEL9 VDO文档
  • Author:

    slacr_

  • Copyright:

  • Published:

    October 6, 2023

  • Updated:

    October 6, 2023

Buy me a cup of coffee ☕.

1000000