一、磁盘结构

1.1 设备文件

设备文件:关联至一个设备驱动程序,进而能够跟与之对应硬件设备进行通信

设备号码:

  • 主设备号:标识设备类型,如 /dev/sda,/dev/sdb …
  • 次设备号:标识同一类型下的不同设备,如 sda1,sda2 …

设备类型:

  • 块设备:block,存取单位为“块”,磁盘
  • 字符设备:char,存取单位“字符”,键盘

二、管理存储

2.1 磁盘分区

2.1.1 分区的原因

  • 优化 I/O 性能
  • 实现磁盘空间配额限制
  • 提高修复速度
  • 隔离系统和程序
  • 安装多个 OS
  • 采用不同的文件系统

2.1.2 分区的方式

两种方式:MBR 和 GPT

2.1.2.1 MBR 分区

MBR: Master Boot Record,使用32位表示扇区数,分区不超过2T

0磁道0扇区: 512Bytes

​ 446 bytes: boot loader 启动相关

​ 64 bytes: 分区表,其中每 16 bytes 标识一个分区

​ 2 bytes: 55AA

MBR 分区中一块硬盘最多有四个主分区,或者3个主分区+一个扩展分区(N个逻辑分区)

MBR 分区: 主和扩展分区为 1-4,逻辑分区从5开始

MBR(硬盘主引导记录)由4个部分组成

0000-0088 Master Boot Record 主引导程序
0089 - 01BD 出错信息数据区 数据区
01BE - 01CD 分区项1(16字节) 分区表
01CE - 01DD 分区项2(16字节) 分区表
01DE - 01ED 分区项3(16字节) 分区表
01EE - 01FD 分区项4(16字节) 分区表
01FE 55 结束标志
01FF AA 结束标志
  • 主引导程序(偏移地址 0000H-0088H),它负责从活动分区中装载,并运行系统引导程序
  • 出错信息数据区,偏移地址0089H-00E1H为出错信息,00E2H-01BDH全为0字节
  • 分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH-01FDH,每个分区表项长16个字节,划分成4个分区项,共64字节
  • 结束标志,偏移地址01FE-01FF的2个字节值为结束标志55AA

MBR中的DPT结构

存贮字节位 内容及含义
第1字节 引导标志 。若值为80H表示活动分区,若值为00H表示非活动分区。
第2、3、4字节 本分区的起始磁头号、扇区号、柱面号。其中:
磁头号 – 第2字节
扇区号 – 第3字节的低6位
柱面号 – 第3字节高2位+第4字节8位
第5字节 分区类型符
00H:表示该分区未使用
06H:FAT16 基本分区
0BH:FAT32 基本分区
05H:扩展分区
07H:NTFS分区
0FH:(LBA模式)扩展分区(83H 为 Linux 分区等)
第6、7、8字节 本分区的结束磁头号、扇区号、柱面号。
磁头号 – 第6字节
扇区号 – 第7字节的低6位
柱面号 – 第7字节的高2位+第8字节
第9、10、11、12字节 本分区之前已用了的扇区数
第13、14、15、16字节 本分区的总扇区数

示例:备份MBR的分区表,破坏之后恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 备份MBR分区表
dd if=/dev/sda of=/data/dpt.img bs=1 count=64 skip=446
scp /data/dpt.img 192.168.119.166:

# 破坏MBR分区表
dd if=/dev/zero of=/data/sda bs=1 count=64 seek=446

# 重启计算机,本机无法启动
reboot

# 使用光盘启动,进入rescue mode,选择第三项 skip to shell

scp 192.168.119.166:/root/dpt.img .

# 恢复分区表
dd if=dpt.img of=/dev/sda bs=1 count=64 seek=446

reboot

2.1.2.2 GPT 分区

GPT:GUID partition table 支持128个分区

使用128位UUID表示磁盘分区和分区,GPT分区表自动备份在头和尾两份,并有CRC校验位

UEFI(统一可扩展固件接口)硬件支持GPT,使得操作系统可以启动

GPT分区结构图

GPT分区结构分为4个区域:

  • GPT头
  • 分区表
  • GPT分区
  • 备份区域

2.1.3 BIOS 和 UEFI

BIOS(Basic Input Output System 基本输入输出系统)主要完成系统硬件自检和引导操作系统,操作系统开始启动之后,BIOS的任务就完成了。

UEFI (Unified Extensible Firmware Interface)统一的可扩展固件接口, 是一种详细描述类型接口的标准。UEFI 相当于一个轻量化的操作系统,提供了硬件和操作系统之间的一个接口,提供了图形化的操作界面。最关键的是引入了GPT分区表,支持2T以上的硬盘,硬盘分区不受限制。

BIOS 和 UEFI 的区别

  • BIOS采用了16位汇编语言编写,只能运行在实模式(内存寻址方式由16位段寄存器的内容乘以16(10H)当做段基地址,加上16位偏移地址形成20位的物理地址)下,可访问的内存空间为1MB,只支持字符操作界面
  • UEFI采用32位或者64位的C语言编写,突破了实模式的限制,可以达到最大的寻址空间,支持图形操作界面,使用文件方式保存信息,支持GPT分区启动,适合和较新的系统和硬件的配合使用

BIOS + MBR 与 UEFI + GPT

image-20221117201115270

Windows 只能安装BIOS + MBR 或 UEFI + GPT 的组合,而BIOS + GPT 和 UEFI + MBR 是不允许的,但是 BIOS + GPT + GRUB 启动Linux可以。

2.1.4 管理分区

列出块设备

1
lsblk

创建分区命令

1
2
3
fdisk 管理MBR分区
gdisk 管理GPT分区
parted 高级分区操作,可以是交互或非交互式

刷新内存中的分区信息,同步分区表

1
2
# 适用于除Centos 6之外的其它版本
partprobe

2.1.4.1 parted 命令

格式

1
parted [option]... [设备 [命令 [参数]...]...]

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 更改 /dev/sdb 的 Partition Table 的值为 gpt 或 msdos
parted /dev/sdb mklable gpt|msdos

# 打印指定设备的所有分区信息
parted /dev/sdb print

# 创建主分区, 大小为200M, 单位默认为M
parted /dev/sdb mkpart primary 1 200

# 删除指定设备分区 1 的信息
parted /dev/sdb rm 1

# 列出所有磁盘分区信息
parted -l

范例

1
2
3
4
5
6
7
8
9
[root@centos7 ~]# parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system Flags
1 1049kB 2149MB 2147MB primary ext4

2.1.4.2 fdisk 和 gdisk

常见用法

1
2
3
fdisk -l [device ...]    查看分区
fdisk [device ...] 管理MBR分区
gdisk [device ...] GPT分区工具,类fdisk使用

管理分区时使用的子命令

1
2
3
4
5
6
7
8
p  分区列表
t 更改分区类型
n 创建新分区
d 删除分区
v 校验分区
u 转换单位
w 保存并退出
q 不保存退出

查看内核是否已经识别新的分区

1
cat /proc/partitions

CentOS 7,8 同步分区表

1
partprobe

2.2 文件系统

2.2.1 什么是文件系统

计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。

支持的文件系统类型

1
2
3
[root@Rocky8-mini ~]# ls /lib/modules/`uname -r`/kernel/fs
binfmt_misc.ko.xz ceph cramfs ext4 fscache gfs2 jbd2 mbcache.ko.xz nfs_common nls pstore udf
cachefiles cifs dlm fat fuse isofs lockd nfs nfsd overlayfs squashfs xfs

2.2.2 文件系统类型

Linux 中常用文件系统

  • ext4:ext 文件系统最新版
  • xfs:SGI,支持最大8EB的文件系统
  • swap
  • iso9660 光盘
  • btrfs(Oracle)
  • reiserfs

Windows 中常用文件系统

  • FAT32
  • NTFS
  • exFAT

2.2.3 文件系统的组成部分

内核中的模块:ext4, xfs, vfat

Linux的虚拟文件系统:VFS

用户空间的管理工具:mkfs.ext4, mkfs.xfs, mkfs.vfat

注:用户执行的命令不直接和各文件系统进行连接,而是通过虚拟文件系统,虚拟文件系统对外提供统一的访问接口,再通过虚拟文件系统和多个不同类型的文件系统连接,这样只要使用一个命令就可以访问不同的文件系统。

image-20221120202829203

2.2.4 文件系统选择管理

2.2.4.1 创建文件系统

创建文件管理工具

1
2
3
4
5
mkfs
mkfs.FS_TYPE /dev/DEVICE
FS_TYPE: ext4 xfs btrfs vfat
mkfs -t FS_TYPE /dev/DEVICE
-L 'LABEL' 设定卷标
1
2
3
4
5
6
7
8
9
10
11
mke2fs: ext 系列文件系统专用管理工具
-t {ext2|ext3|ext4|xfs} 指定文件系统类型
-b {1024|2048|4096} 指定块大小
-L 'LABEL' 设置卷标
-j 创建ext3系列文件系统
-i # 每多少个字节创建一个inode,不应该小于block大小
-N # 指定分区中创建多少个inode
-I 一个inode记录占用的磁盘空间大小,128-4096
-m # 为管理人员预留空间占总空间的百分比,默认5%
-O FEATURE 启用指定特性
-O ^FEATURE 关闭指定特性

2.2.4.2 查看和管理分区信息

blkid 查看块设备属性信息

格式

1
2
3
4
5
blkid [option] [DEVICE]

option:
-U UUID: 根据指定的UUID来查找对应的设备
-L LABEL: 根据指定的LABEL来查找对应的设备

e2label:管理ext系列文件系统的LABEL

1
e2label DEVICE [LABEL]

findfs:查找分区

1
2
3
4
5
findfs [options] LABEL=<label>
findfs [options] UUID=<uuid>

[root@Rocky8-mini ~]# findfs UUID="4ec1a2f6-693f-4d0a-a605-7335893cb82b"
/dev/sda1

tune2fs:重新设定ext系列文件系统可调整参数的值

1
2
3
4
5
6
7
-l  查看指定文件系统超级块信息
-L 'LABEL' 修改卷标
-m # 修改预留给管理员的空间百分比
-j 将ext2升级为ext3
-O 文件系统属性启用或禁用
-o 调整文件系统的默认挂载选项
-U UUID 修改UUID号

dumpe2fs:显示ext文件系统信息,将磁盘块分组管理

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
-h  查看超级块信息,不显示分组信息

[root@centos7 ~]# dumpe2fs -h /dev/sdb1
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none>
Last mounted on: /mnt/sdb1
Filesystem UUID: 9e5c5fe3-be05-4c0b-95cd-9edda1c6c8cb
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 131072
Block count: 524288
Reserved block count: 26214
Free blocks: 88531
Free inodes: 131060
First block: 0
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 255
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
Filesystem created: Mon Sep 12 20:13:42 2022
Last mount time: Thu Nov 17 20:43:15 2022
Last write time: Thu Nov 17 20:43:15 2022
Mount count: 47
Maximum mount count: -1
Last checked: Mon Sep 12 20:13:42 2022
Check interval: 0 (<none>)
Lifetime writes: 2700 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: af9e86d0-9c2c-4caf-a4fd-da1266fc172a
Journal backup: inode blocks
Journal features: journal_incompat_revoke journal_64bit
Journal size: 64M
Journal length: 16384
Journal sequence: 0x0000000c
Journal start: 0

xfs_info:显示未挂载或已挂载的xfs文件系统信息

1
2
3
4
5
6
7
8
9
10
11
12
13
xfs_info mountpoint|devname

[root@Rocky8-mini ~]# xfs_info /dev/sda1
meta-data=/dev/sda1 isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

超级块和 INODE TABEL

image-20221124213614993

块组描述符表(GDT)

ext文件系统每一个块组信息使用32字节描述,这32个字节称为块组描述符,所有块组的块组描述符组成块组描述符表GDT(group descriptor table)。虽然每个块组都需要块组描述符来记录块组的信息和属性元数据,但是不是每个块组中都存放了块组描述符。将所有块组的块组信息组成一个GDT保存,并将该GDT存放于某些块组中,类似存放superblock和备份superblock的块。

2.2.4.3 文件系统检测和修复

文件系统故障常发生于死机或者非正常关机之后,挂载文件系统标记为“no clean”

​ :warning: :进行磁盘修复时一定要取消文件系统的挂载

fsck:File System Check

1
2
3
4
5
6
7
fsck.FS_TYPE
fsck -t FS_TYPE
注:FS_TYPE 一定要与分区上的文件系统相同

常用选项:
-a 自动修复
-r 交互式修复错误

e2fsck:ext 系列文件专用的检测修复工具

1
2
3
-y 自动回答 yes
-f 强制修复
-p 安全的进行文件系统的修复

xfs_repair:xfs文件系统专用检测修复工具

1
2
3
-f 修复文件
-n 只检查
-d 紧急修复。允许修复只读的挂载设备,在单用户下修复 / 时使用,然后立即reboot

示例:修改破坏的ext文件系统

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
[root@Rocky8-mini ~]# !df
df -Th /dev/sdc
Filesystem Type Size Used Avail Use% Mounted on
/dev/sdc ext4 9.8G 37M 9.3G 1% /mnt/sdc
[root@Rocky8-mini ~]# ls /mnt/sdc/
fstab lost+found passwd

[root@Rocky8-mini ~]# dd if=/dev/zero of=/dev/sdc bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00332407 s, 315 MB/s
[root@Rocky8-mini ~]# ls /mnt/sdc/
[root@Rocky8-mini ~]# tune2fs -l /dev/sdc
tune2fs 1.45.6 (20-Mar-2020)
tune2fs: Bad magic number in super-block while trying to open /dev/sdc
[root@Rocky8-mini ~]# df -Th /dev/sdc
Filesystem Type Size Used Avail Use% Mounted on
/dev/sdc ext4 64Z 64Z 9.8G 100% /mnt/sdc

[root@Rocky8-mini ~]# umount /mnt/sdc
[root@Rocky8-mini ~]# e2fsck -y -f /dev/sdc
e2fsck 1.45.6 (20-Mar-2020)
ext2fs_open2: Bad magic number in super-block
e2fsck: Superblock invalid, trying backup blocks...
Resize inode not valid. Recreate? yes

Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Block bitmap differences: +(98304--99330) +(163840--164866) +(229376--230402) +(294912--295938) +(819200--820226) +(884736--885762) +(1605632--1606658)
Fix? yes

Free blocks count wrong for group #0 (23510, counted=23511).
Fix? yes

Free blocks count wrong for group #1 (31741, counted=31739).
Fix? yes

Free blocks count wrong (2554686, counted=2554685).
Fix? yes

Free inodes count wrong for group #0 (8181, counted=8179).
Fix? yes

Free inodes count wrong (655349, counted=655347).
Fix? yes

Padding at end of inode bitmap is not set. Fix? yes


/dev/sdc: ***** FILE SYSTEM WAS MODIFIED *****
/dev/sdc: 13/655360 files (0.0% non-contiguous), 66755/2621440 blocks
[root@Rocky8-mini ~]# tune2fs -l /dev/sdc
tune2fs 1.45.6 (20-Mar-2020)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: 0a133b5e-e5f7-466e-8693-2250f0398266
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 655360
Block count: 2621440
Reserved block count: 131072
Free blocks: 2554685
Free inodes: 655347
First block: 0
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 1024
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
Filesystem created: Fri Nov 25 21:52:06 2022
Last mount time: n/a
Last write time: Fri Nov 25 21:56:53 2022
Mount count: 0
Maximum mount count: -1
Last checked: Fri Nov 25 21:56:53 2022
Check interval: 0 (<none>)
Lifetime writes: 8 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 32
Desired extra isize: 32
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: 7e999f31-eee7-479f-ad7f-f3d1f3f1b409
Journal backup: inode blocks
Checksum type: crc32c
Checksum: 0xd4f66ca7
[root@Rocky8-mini ~]# mount /dev/sdc /mnt/sdc/
[root@Rocky8-mini ~]# ls /mnt/sdc/
fstab lost+found passwd
[root@Rocky8-mini ~]# cat /mnt/fstab

#
# /etc/fstab
# Created by anaconda on Sun Mar 13 06:11:42 2022
#
# 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.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rl-root / xfs defaults 0 0
UUID=4ec1a2f6-693f-4d0a-a605-7335893cb82b /boot xfs defaults 0 0
/dev/mapper/rl-data /data ext4 defaults 1 2
/dev/mapper/rl-swap none swap defaults 0 0
[root@Rocky8-mini ~]# df -Th /dev/sdc
Filesystem Type Size Used Avail Use% Mounted on
/dev/sdc ext4 9.8G 37M 9.3G 1% /mnt/sdc

2.3 挂载

挂载:将额外文件系统与根文件系统某现存目录建立连接关系,使该目录作为访问该文件系统的入口

卸载:取消该关联关系的过程

挂载点原有文件在挂载完成后会被临时隐藏,因此,挂载点目录一般为空;挂载的设备正在使用中时无法被卸载

2.3.1 挂载文件系统 mount

格式

1
2
3
4
5
6
7
8
9
mount [-fnrsvw] [-t vfstype] [-o options] device mountpoint

device: 指明要挂载的设备
· 设备文件:如 /dev/sda1
· 卷标:-L 'LABEL'
· UUID:-U 'UUID'
· 伪文件系统名称:proc, sysfs, devtmpfs, configfs

mountpoint: 挂载点目录必须事先存在, 建议使用空目录

mount 常用命令选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-t fstype             指定要挂载的设备上的文件系统类型,如ext4、xfs
-r readonly,只读挂载
-w read and write,读写挂载,默认选项
-n 不更新/etc/mtab,mount 不可见
-a 自动挂载设备(定义在/etc/fstab文件中,且挂载选项中有auto功能)
-L 'LABEL' 以卷标指定挂载设备
-U 'UUID' 以UUID指定要挂载的设备
-B, --bind 绑定目录到另一个目录上
-o options: (挂载文件系统的选项,多个选项之间使用逗号分隔)
async 异步模式,内存更改,先写入缓冲区,之后写入磁盘,效率高,但不安全
sync 同步模式,内存更改直接写入磁盘,安全但效率低
atime/noatime 包含目录和文件
diratime/nodiratime 目录的访问时间戳
auto/noauto 是否支持开机自动选项,即是否支持-a选项
exec/noexec 是否支持在文件系统上运行应用程序
suid/nosuid 是否支持suid和sgid权限
remount 重新挂载
ro/rw 只读、读写
user/nouser 是否允许普通用户挂载此设备,在/etc/fstab中使用
acl/noacl 启用此文件系统上的acl功能
loop 使用loop设备
_netdev 当网络可用时对网络资源进行挂载,如 NFS 文件系统
defaults 相当于rw, suid, dev, exec, auto, nouser, async

挂载规则:

  • 一个挂载点同一时间只能挂载一个设备
  • 一个挂载点同一时间挂载了多个设备,只能看到最后一个设备的数据,其它设备上的数据将被隐藏
  • 一个设备可以同时挂载到多个挂载点
  • 通常挂载点一般是已经存在的空目录

2.3.2 卸载文件系统 umount

卸载:可使用设备,也可以使用挂载点

1
umount 设备名|挂载点

2.3.3 查看挂载情况

查看挂载

1
2
3
(1) 通过查看/etc/mtab文件显示当前已挂载的所有设备
(2) mount
(3) 查看内核追踪到的已挂载的所有设备 cat /proc/mounts

查看挂载点情况

1
findmnt MOUNT_POINT | DEVICE

查看正在访问指定文件系统的进程

1
2
lsof MOUNT_POINT
fuser -v MOUNT_POINT

终止所有正在访问指定的文件系统的进程

1
fuser -km MOUNT_POINT

2.3.4 持久挂载

将挂载信息写入到 /etc/fstab 文件中,下次开机时实现自动挂载;写入后,可使用mount -a及时生效

/etc/fstab 格式帮助man 5 fstab

该文件中,每行定义一个要挂载的文件系统,包括如下选项

  • 要挂载的设备或伪文件系统
    • 设备文件
    • LABEL:LABEL=“”
    • UUID:UUID=“”
    • 伪文件系统名称:proc,sysfs
  • 挂载点:必须是事先存在的目录
  • 文件系统类型:ext4,xfs,iso9600,nfs,none
  • 挂载选项:defaults,acl,bind
  • 转储频率:0 不做备份,1 每天转储,2 每隔一天转储
  • fsck 检查文件系统的顺序:0 不自检,1 首先自检 一般rootfs使用,2 非rootfs使用

示例:Centos7,8 中 /etc/fstab 的分区UUID错误导致系统无法启动

1
2
3
4
系统进入到 Emergency mode,输入 root 密码
cat /proc/mounts 可以看见 / 以读写形式挂载
vim /etc/fstab 修改错误的挂载信息
reboot

示例:Centos6 中 /etc/fstab 的分区挂载信息错误导致无法正常启动操作系统

1
2
3
4
5
# 若挂载设备的文件系统出现错误,且实行开机自检,修改 /etc/fstab 文件时,需要修改为0(开机不自检)
系统自动进入到 Emergency mode,输入 root 密码
cat /proc/mounts 可以看见 / 以只读形式挂载,无法直接修改配置文件
mount -o remount,rw /
vim /etc/fstab

2.4 处理交换文件和分区

2.4.1 swap

swap 交换分区是系统RAM的补充,swap 分区支持虚拟内存。当没有足够的 RAM 保存系统处理的数据时会将数据写入swap分区,当系统缺乏 swap 空间时,内核会因 RAM 内存耗尽而终止进程。过多的 swap 空间会造成存储设备处于分配状态但闲置,造成浪费,过多 swap 空间还会掩盖内存泄露。

推荐 swap 空间的分配

系统中的 RAM 大小 推荐的 swap 空间 允许休眠的 swap 空间大小建议
低于2GB RAM 大小的2倍 RAM 大小的3倍
2GB - 8GB 等于 RAM 的大小 等于 RAM 的大小
8GB - 64GB 4GB 至 RAM 空间大小的0.5倍 RAM 空间大小的 1.5 倍
超过 64GB 独立负载(至少4GB) 不建议使用休眠功能

2.4.2 交换分区的实现过程

1、创建交换分区或文件

2、使用mkswap写入特殊签名

3、在 /etc/fstab 文件中添加挂载项

4、使用swapon -a激活交换空间

启用swap分区

1
2
3
4
5
swapon [options] [DEVICES]

[options]
-a 激活所有交换分区
-p priority 指定优先级,或在/etc/fstab文件中的第4列指定 pri=value

示例:创建交换分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@centos7 ~]# echo -e "n\np\n\n+1G\nt\82\nw\n" | fdisk /dev/sdb
[root@centos7 ~]# partprobe
[root@centos7 ~]# mkswap /dev/sdb2
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=84124053-781e-4f29-821a-3bbed29a13fa
[root@centos7 ~]# vim /etc/fstab
UUID=84124053-781e-4f29-821a-3bbed29a13fa swap swap defaults 0 0
[root@centos7 ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 187M 1.4G 9.6M 186M 1.4G
Swap: 3.0G 0B 3.0G
# 优先级越大越优先
[root@centos7 ~]# cat /proc/swaps
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
/dev/sdb2 partition 1048572 0 -3

禁用swap分区

1
2
3
4
5
swapoff [option] [device]

示例:
sed -i.bak '/swap/d' /etc/fstab
swapoff -a

swap 优先级

可以指定swap分区的优先级从0到32767,值越大优先级越高

如果没有指定,会自动指定一个优先级,从-1开始。每加入一个没有指定优先级的swap,优先级减一

先添加的swap的缺省优先级高 ,用户可以指定优先级且必须是正数,那么永远高于默认指定的优先级

示例:以文件形式实现swap功能

1
2
3
4
5
6
7
8
9
10
11
[root@Rocky8-mini ~]# dd if=/dev/zero of=/root/swapfile bs=1M count=1024
[root@Rocky8-mini ~]# mkswap swapfile
# 此处挂载直接使用文件名称,不要使用UUID
[root@Rocky8-mini ~]# vim /etc/fstab
/root/swapfile swap swap defaults 0 0
[root@Rocky8-mini ~]# chmod 600 /root/swapfile
[root@Rocky8-mini ~]# swapon -a
[root@Rocky8-mini ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
/root/swapfile file 1048572 0 -3

2.4.3 swap 的使用策略

/proc/sys/vm/swappiness的值决定了当内存占用达到一定的百分比时,会启用swap分区的空间

1
2
3
4
[root@Rocky8-mini ~]# cat /proc/sys/vm/swappiness 
30
root@ubuntu18-server:~# cat /proc/sys/vm/swappiness
60

注:内存使用到100-30=70%的时候,就开始出现有交换分区的使用。简单的说这个参数定义了系统对swap的使用倾向,值越大越倾向于使用swap。可以设置为0,但并不会禁止对swap的使用,只是最大限度的降低使用swap。

2.5 磁盘常见工具

2.5.1 文件系统实际占用空间查看工具 df

1
2
3
4
5
6
7
8
df [option] [device]

常用选项:
-H 以10为单位
-T 文件系统类型
-h 易于阅读
-i 使用inode的使用情况代替block的使用情况
-P 以POSIX兼容的格式输出

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@Rocky8-mini ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 877M 0 877M 0% /dev
tmpfs tmpfs 896M 0 896M 0% /dev/shm
tmpfs tmpfs 896M 8.8M 887M 1% /run
tmpfs tmpfs 896M 0 896M 0% /sys/fs/cgroup
/dev/mapper/rl-root xfs 30G 3.1G 27G 11% /
/dev/sda1 xfs 1014M 212M 803M 21% /boot
/dev/mapper/rl-data ext4 17G 54M 16G 1% /data
tmpfs tmpfs 180M 0 180M 0% /run/user/0

[root@Rocky8-mini ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 xfs 4ec1a2f6-693f-4d0a-a605-7335893cb82b /boot
└─sda2 LVM2_member odzCiV-0bL1-GIR3-7651-S41G-ZvHI-8Mm2Y3
├─rl-root xfs 62ae4f5a-be31-4cf7-ab63-b33f57740bbd /
├─rl-swap swap e342fd6e-55ce-4947-802a-38e589a95440 [SWAP]
└─rl-data ext4 fefe9937-ef64-40af-a057-0a126274aba5 /data
sdb
sdc
sr0 iso9660 Rocky-8-5-x86_64-dvd 2021-11-14-09-31-13-00

2.5.2 查看目录空间的使用情况 du

显示指定目录下各个子目录的大小,单位为KB

1
2
3
4
5
6
7
du [option] DIR

常用选项
-h 易于阅读
-s summary
--max-depth=# 指定最大的目录层
-x, --one-file-system 忽略不在同一个文件系统的目录

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@Rocky8-mini ~]# du -h -x --max-depth=1 /
24M /etc
1.1G /root
233M /var
1.5G /usr
36K /home
0 /media
0 /mnt
33M /opt
0 /srv
4.0K /tmp
24M /backup
2.8G /

[root@Rocky8-mini ~]# du -s -h -x /
2.8G /

面试题:df 和 du 的区别

1
2
3
4
5
6
7
8
9
10
11
df 查看文件系统的大小
du 查看的是目录中所有文件的大小

# 刚创建的文件系统 df > du
刚创建一个文件系统时,没有产生任何数据,使用df查看会因为文件系统中的元数据而造成df查看的大小比du查看的空间要大

# 目录中挂载其它分区 df < du
当一个目录中存在被其它分区挂载的挂载点,使用df只会统计该目录的文件系统大小,挂载的设备分区不会统计;而使用du命令查看时,它只关系该目录中的文件占用了多少空间,会将挂载点的其它分区使用大小也会计算进去

# 删除文件但不释放空间时 df > du
当某一个文件正在使用,如果此时将它删除,那么该文件不会立刻释放。使用df查看会认为该文件没有释放,但使用du查看会认为该文件被删除了,所以不存在。此时df查看的空间比du查看的空间要大

2.5.3 dd 工具

dd:Copy a file, converting and formatting according to the operands.

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
格式
dd if=/PATH/SRC_FILE of=/PATH/DEST_FILE bs=# count=#

常用选项
if=file read from FILE instead of stdin
of=file write to FILE instead of stdout
ibs=size read up to BYTES bytes at a time (default: 512)
obs=size write BYTES bytes at a time (default: 512)
bs=size read and write up to BYTES bytes at a time (default: 512); overrides ibs and obs
cbs=size convert BYTES bytes at a time
skip=N skip N ibs-sized blocks at start of input
seek=N skip N obs-sized blocks at start of output
count=N copy only N input blocks
conv=conversion convert the file as per the comma separated symbol list

conversion 转换参数:
ascii from EBCDIC to ASCII
ebcdic from ASCII to EBCDIC
lcase change upper case to lower case
ucase change lower case to upper case
nocreat do not create the output file
noerror continue after read errors
notrunc do not truncate the output file
sync pad every input block with NULs to ibs-size; when used with block or unblock, pad with spaces rather than NULs
fdatasync physically write output file data before finishing

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@Rocky8-mini ~]# cat f1.txt f2.txt 
abcdefg
123456789
[root@Rocky8-mini ~]# dd if=f1.txt of=f2.txt bs=1 count=2 skip=3 seek=4
2+0 records in
2+0 records out
2 bytes copied, 0.000114454 s, 17.5 kB/s
[root@Rocky8-mini ~]# cat f2.txt
1234de[root@Rocky8-mini ~]# echo 123456789 > f2.txt

[root@Rocky8-mini ~]# cat f1.txt f2.txt
abcdefg
123456789
[root@Rocky8-mini ~]# dd if=f1.txt of=f2.txt bs=1 count=2 skip=3 seek=4 conv=notrunc
2+0 records in
2+0 records out
2 bytes copied, 8.7494e-05 s, 22.9 kB/s
[root@Rocky8-mini ~]# cat f2.txt
1234de789

示例2

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
35
# 备份MBR
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1

# 破坏MBR中的BootLoader
dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446

# 有一个大于2K的二进制文件fileA。现想从第64个字节开始读取,需要读取128 Bytes。又有文件fileB,想将之前读取到的128 Bytes写入到第32字节开始的位置,替换128字节。
dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc

# 将本地的/dev/sdx整盘备份到/dev/sdy中
dd if=/dev/sdx of=/dev/sdy

# 将/dev/sdx全盘数据备份到指定路径的image文件
dd if=/dev/sdx of=/PATH/TO/image

# 备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径
dd if=/dev/sdx | gzip > /path/to/image.gz

# 将备份文件恢复到指定盘
dd if=/path/to/image of=/dev/sdx

# 将压缩的备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/sdx

# 拷贝光盘数据到root文件夹中,并保存为cdrom.iso文件
dd if=/dev/cdrom of=/root/cdrom.iso

# 销毁磁盘数据
dd if=/dev/urandom of=/dev/sda1

# 测试硬盘写速度
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000

# 测试硬盘读速度
dd if=/root/1Gb.file bs=64k | dd of=/dev/null

练习

1、创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/test目录,且默认有acl挂载选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 创建一个2G大小的空间
[root@Rocky8-mini ~]# fdisk /dev/sdb
[root@Rocky8-mini ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 2G 0 part

# 创建文件系统
[root@Rocky8-mini ~]# mke2fs -t ext4 -b 2048 -L 'TEST' -m 1 /dev/sdb1
[root@Rocky8-mini ~]# blkid /dev/sdb1
/dev/sdb1: LABEL="TEST" UUID="de913645-871f-40bf-a737-820ace5def18" BLOCK_SIZE="2048" TYPE="ext4" PARTUUID="c4a635d0-01"

# 持久挂载
[root@Rocky8-mini ~]# mkdir /test
[root@Rocky8-mini ~]# vim /etc/fstab
/dev/sdb1 /test ext4 acl 0 0
[root@Rocky8-mini ~]# mount -a
[root@Rocky8-mini ~]# df -Th /dev/sdb1
Filesystem Type Size Used Avail Use% Mounted on
/dev/sdb1 ext4 2.0G 9.1M 2.0G 1% /test

三、RAID

3.1 什么是RAID

独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),简称磁盘阵列。利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的为提升性能或数据冗余,或是两者同时提升。

RAID 层级不同,数据会以多种模式分散于各个硬盘,RAID 层级的命名会以 RAID 开头并带数字,例如:RAID 0、RAID 1、RAID 5、RAID 6、RAID 7、RAID 01、RAID 10、RAID 50、RAID 60。每种模式都有其理论上的优缺点,不同的等级在两个目标间获取平衡,分别是增加数据可靠性以及增加存储器(群)读写性能。

3.2 RAID 级别

3.2.1 RAID 0

image-20221121202456048

条带卷
最少两块
可用空间:N * min(disk1, disk2, …)
无容错

3.2.2 RAID 1

image-20221121202550639

读性能略有提升,写性能略有下降
利用率:50%
可用空间:1 * min(disk1, disk2, …)
有冗余
最少两块

3.2.3 RAID 4

image-20221121202614625

其中一块磁盘保存其余磁盘信息的奇偶校验
利用率:(N-1)/N
有冗余
至少3块

3.2.4 RAID 5

image-20221121202658516

阵列数据的奇偶校验信息分布在阵列的所有磁盘上
利用率:(N-1)/N
有容错
至少3块

3.2.5 RAID 6

image-20221121202720771

类似于 RAID5,双奇偶校验信息位
利用率:(N-2)/N
有容错
至少4块

3.2.6 RAID 10

image-20221121202756833

多块磁盘先组合成 RAID 1,在两两组合成 RAID 0
至少4块

3.2.7 RAID 01

image-20221121202831767

多块磁盘先组合成 RAID 0,在两两组合成 RAID 1
至少4块

3.2.8 RAID 50

image-20221121202903746

多块磁盘先组合成 RAID 5,再组合成 RAID 0
至少6块

3.2.9 RAID 60

image-20221121202946490

多块磁盘先组合成 RAID 6,再组合成 RAID 0
至少6块

3.2.10 其它级别

JBOD:Just a Bunch Of Disks

功能:将多块磁盘的空间合并成一个大的连续的空间使用
第一块磁盘存放所有磁盘的分段信息,如果损坏,整个阵列会失败;后续磁盘损坏只会影响本块磁盘的数据

RAID 7

RAID 7并非公开的RAID标准,而是Storage Computer Corporation的专利硬件产品名称,RAID 7是以RAID 3及RAID 4为基础所发展,但是经过强化以解决原来的一些限制。另外,在实现中使用大量的缓冲存储器以及用以实现异步数组管理的专用即时处理器,使得RAID 7可以同时处理大量的IO要求,所以性能甚至超越了许多其他RAID标准的实现产品。但也因为如此,在价格方面非常的高昂。

SHR(Synology Hybrid RAID)

群辉公司的技术,适合不了解RAID的普通用户,根据磁盘的个数自动组成不同的RAID,只支持群辉系统

3.2.11 RAID 总结

image-20221127190830485

四、逻辑卷管理器

4.1 LVM 介绍

LVM:Logical Volume Manager 可以允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小,允许在多个物理设备之间重新组织文件系统

实现过程:

  • 将设备指定成物理卷
  • 用一个或多个物理卷组成一个卷组
  • 在卷组中分配空间创建逻辑卷
  • 逻辑卷中创建文件系统并挂载

PV 加入到 VG 中后,VG 在逻辑层次上将空间划分成固定大小的块,称之为 PE(默认为 4M);在 VG 上创建 LV 时,就是在 VG 中指定特定数量的 PE 来组织成 LV 的大小,当 PE 被分配给 LV 时,在 LV 中的存储概念称之为 LE。

物理区域–PE(Physical Extent)
物理区域是物理卷中可⽤于分配的最⼩存储单元,物理区域的大小可根据实际情况在建⽴物理卷时指定。物理区域大小一旦确定将不能更改,同⼀卷组中的所有物理卷的物理区域大小需要⼀致。

逻辑区域―LE(Logical Extent)
逻辑区域是逻辑卷中可⽤于分配的最⼩存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的⼤小。

4.2 实现逻辑卷

4.2.1 pv 管理工具

1
2
3
4
5
6
7
8
9
# 创建物理卷 pv
pvcreate /dev/DEVICe

# 显示 pv 信息
pvs
pvdisplay

# 删除 pv
pvremove /dev/DEVICE

4.2.2 vg 管理工具

1
2
3
4
5
6
7
8
9
10
# 创建卷组 vg
vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath

# 显示卷组
vgs
vgdisplay

# 管理卷组
vgextend VolumeGroupName PhysicalDevicePath
vgreduce VolumeGroupName PhysicalDevicePath

4.2.3 lv 管理工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 显示逻辑卷
lvs
lvdisplay

# 创建逻辑卷
lvcreate -L #[mMgGtT] -n NAME VolumeGroup
## 创建60%的lv大小
lvcreate -l 60%VG -n mylv testvg
## 将卷组中剩余空间全部用于创建lv
lvcreate -l 100%FREE -n lv2 testvg

# 删除逻辑卷
lvremove /dev/VGName/LVName

# 重新设定文件系统大小
resize2fs [-f] [-F] [-M] [-P] [-p] device [new_size]
xfs_growfs /mountpoint

示例:逻辑卷创建示例

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
1、创建分区并调整分区类型为8e
[root@localhost ~]# fdisk /dev/sdb
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): e // 直接创建扩展分区
Partition number (1-4, default 1):
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759):
Using default value 10485759
Partition 1 of type Extended and of size 5 GiB is set

Command (m for help): n
Partition type:
p primary (0 primary, 1 extended, 3 free)
l logical (numbered from 5)
Select (default p): l // 在扩展分区上创建逻辑分区5,6,7,8,9
Adding logical partition 6
First sector (1030144-10485759, default 1030144):
Using default value 1030144
Last sector, +sectors or +size{K,M,G} (1030144-10485759, default 10485759): +500M
Partition 6 of type Linux and of size 500 MiB is set

Command (m for help): t // 调整分区类型
Partition number (1,5-9, default 9): 5
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): p
Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5372fd24
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10485759 5241856 5 Extended
/dev/sdb5 4096 1028095 512000 8e Linux LVM
/dev/sdb6 1030144 2054143 512000 8e Linux LVM
/dev/sdb7 2056192 3080191 512000 8e Linux LVM
/dev/sdb8 3082240 5179391 1048576 8e Linux LVM
/dev/sdb9 5181440 10485759 2652160 8e Linux LVM

Command (m for help): w // 保存退出
The partition table has been altered!

2、刷新分区
[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 5G 0 disk
├─sdb1 8:17 0 1K 0 part
├─sdb5 8:21 0 500M 0 part
├─sdb6 8:22 0 500M 0 part
├─sdb7 8:23 0 500M 0 part
├─sdb8 8:24 0 1G 0 part
└─sdb9 8:25 0 2.5G 0 part

3、创建 pv
[root@localhost ~]# pvcreate /dev/sdb{5,6,7}
Physical volume "/dev/sdb5" successfully created.
Physical volume "/dev/sdb6" successfully created.
Physical volume "/dev/sdb7" successfully created.
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb5 lvm2 --- 500.00m 500.00m
/dev/sdb6 lvm2 --- 500.00m 500.00m
/dev/sdb7 lvm2 --- 500.00m 500.00m

4、创建 VG
[root@localhost ~]# vgcreate myvg /dev/sdb{5,6}
Volume group "myvg" successfully created
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
myvg 2 0 0 wz--n- 992.00m 992.00m
[root@localhost ~]# vgextend myvg /dev/sdb7 // 扩展vg
Volume group "myvg" successfully extended

5、创建 LV
[root@localhost ~]# lvcreate -L 400M -n mylv myvg // -L 大小 -n lv_name vg_name
Logical volume "mylv" created.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
mylv myvg -wi-a----- 400.00m

6、创建文件系统
[root@localhost ~]# mke2fs -t ext4 -b 1024 -L MYLV /dev/myvg/mylv
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=MYLV
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
102400 inodes, 409600 blocks
20480 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=34078720
50 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

7、挂载
[root@localhost ~]# mount /dev/myvg/mylv /mnt/mylv.mount/
[root@localhost mapper]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 5G 0 disk
├─sdb1 8:17 0 1K 0 part
├─sdb5 8:21 0 500M 0 part
│ └─myvg-mylv 253:2 0 400M 0 lvm /mnt/mylv.mount
├─sdb6 8:22 0 500M 0 part
├─sdb7 8:23 0 500M 0 part
├─sdb8 8:24 0 1G 0 part
└─sdb9 8:25 0 2.5G 0 part

4.2.4 扩展和缩减逻辑卷

1
2
3
4
5
6
7
8
9
10
11
12
# 扩展和缩减准备
[root@Rocky8-mini ~]# pvcreate /dev/sdb
[root@Rocky8-mini ~]# vgcreate vg0 /dev/sdb
[root@Rocky8-mini ~]# lvcreate -L 1G -n mylv vg0
[root@Rocky8-mini ~]# mkfs.ext4 /dev/vg0/mylv
[root@Rocky8-mini ~]# mount /dev/vg0/mylv /mnt/mylv

[root@Rocky8-mini ~]# pvcreate /dev/sdc
[root@Rocky8-mini ~]# vgcreate vg1 /dev/sdc
[root@Rocky8-mini ~]# lvcreate -L 1G -n xfs_lv vg1
[root@Rocky8-mini ~]# mkfs.xfs /dev/vg1/xfs_lv
[root@Rocky8-mini ~]# mount /dev/vg1/xfs_lv /mnt/xfs_lv

1、扩展逻辑卷

第一步先扩展逻辑卷的空间大小
第二步实现文件系统的扩展

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
# 查看逻辑卷 mylv 的大小
[root@Rocky8-mini ~]# lvs /dev/vg0/mylv
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mylv vg0 -wi-ao---- 1.00g
# 查看卷组的剩余空间,如果空间不足需要先扩容卷组的空间
[root@Rocky8-mini ~]# vgs /dev/vg0
VG #PV #LV #SN Attr VSize VFree
vg0 1 1 0 wz--n- <20.00g <19.00g

# 扩展逻辑卷 mylv 的空间至3G
[root@Rocky8-mini ~]# lvextend -L +2G /dev/vg0/mylv
Size of logical volume vg0/mylv changed from 1.00 GiB (256 extents) to 3.00 GiB (768 extents).
Logical volume vg0/mylv successfully resized.

# 实现 mylv 文件系统的扩展
## 对于 ext 系列文件系统使用 resize2fs 命令
[root@Rocky8-mini ~]# resize2fs /dev/vg0/mylv
[root@Rocky8-mini ~]# df -Th /dev/vg0/mylv
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg0-mylv ext4 3.0G 3.0M 2.8G 1% /mnt/mylv
## 对于 xfs 系列文件系统使用 xfs_growfs
## xfs 文件系统空间扩展同ext系列,大小由1G扩展到2G
[root@Rocky8-mini ~]# xfs_growfs /mnt/xfs_lv/
[root@Rocky8-mini ~]# df -Th /dev/vg1/xfs_lv
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg1-xfs_lv xfs 2.0G 47M 2.0G 3% /mnt/xfs_lv

### 文件系统扩展命令
resize2fs /dev/VG_NAME/LV_NAME
xfs_growfs MOUNTPOINT

### 不关注文件系统类型,一次性扩容并同步文件系统大小
#### 将卷组中剩余空间全部分配给指定逻辑卷
lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME

2、缩减逻辑卷

注:缩减有数据损坏的风险,建议先备份在缩减,xfs 文件系统不支持缩减

缩减逻辑卷相关过程命令

1
2
3
4
5
umount /dev/VG_NAME/LV_NAME
e2fsck -f /dev/VG_NAME/LV_NAME
resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
lvreduce -L #[mMgGtT] /dev/VG_NAME/LV_NAME
mount /dev/VG_NAME/LV_NAME mountpoint

示例:缩减ext系列文件系统

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
35
36
37
38
39
40
41
42
43
44
45
46
47
# 以 /dev/mapper/vg0-mylv 为例
[root@Rocky8-mini mnt]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 877M 0 877M 0% /dev
tmpfs tmpfs 896M 0 896M 0% /dev/shm
tmpfs tmpfs 896M 8.8M 887M 1% /run
tmpfs tmpfs 896M 0 896M 0% /sys/fs/cgroup
/dev/mapper/rl-root xfs 30G 3.1G 27G 11% /
/dev/sda1 xfs 1014M 212M 803M 21% /boot
/dev/mapper/rl-data ext4 17G 54M 16G 1% /data
tmpfs tmpfs 180M 0 180M 0% /run/user/0
/dev/mapper/vg0-mylv ext4 3.0G 3.0M 2.8G 1% /mnt/mylv
/dev/mapper/vg1-xfs_lv xfs 2.0G 47M 2.0G 3% /mnt/xfs_lv

# 取消挂载
[root@Rocky8-mini mnt]# umount /mnt/mylv

# 进行磁盘检查
[root@Rocky8-mini mnt]# fsck -f /dev/vg0/mylv
fsck from util-linux 2.32.1
e2fsck 1.45.6 (20-Mar-2020)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/mapper/vg0-mylv: 11/196608 files (0.0% non-contiguous), 21308/786432 blocks

# 缩减文件系统大小至2G
[root@Rocky8-mini mnt]# resize2fs /dev/vg0/mylv 2G
resize2fs 1.45.6 (20-Mar-2020)
Resizing the filesystem on /dev/vg0/mylv to 524288 (4k) blocks.
The filesystem on /dev/vg0/mylv is now 524288 (4k) blocks long.

# 缩减逻辑卷空间大小
[root@Rocky8-mini mnt]# lvreduce -L 2G /dev/vg0/mylv
WARNING: Reducing active logical volume to 2.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg0/mylv? [y/n]: y
Size of logical volume vg0/mylv changed from 3.00 GiB (768 extents) to 2.00 GiB (512 extents).
Logical volume vg0/mylv successfully resized.

# 重新挂载该逻辑卷
[root@Rocky8-mini mnt]# mount /dev/vg0/mylv /mnt/mylv/
[root@Rocky8-mini mnt]# df -Th /mnt/mylv/
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg0-mylv ext4 2.0G 3.0M 1.9G 1% /mnt/mylv

示例:缩减xfs系列文件系统

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# XFS文件系统不支持缩减,但可采取以下方法
## 使用xfsdump命令
[root@Rocky8-mini ~]# yum -y install xfsdump
[root@Rocky8-mini xfs_lv]# ls
file1 file2 file3 file4 file5

# 先备份xfs文件系统数据
[root@Rocky8-mini ~]# xfsdump -f data.img /mnt/xfs_lv
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.8 (dump format 3.0) - type ^C for status and control

============================= dump label dialog ==============================

please enter label for this dump session (timeout in 300 sec)
-> xfs_lv
session label entered: "xfs_lv"

--------------------------------- end dialog ---------------------------------

xfsdump: level 0 dump of Rocky8-mini:/mnt/xfs_lv
xfsdump: dump date: Wed Nov 23 20:36:58 2022
xfsdump: session id: 3a187a59-a2f2-4637-81dc-cd1090d16dea
xfsdump: session label: "xfs_lv"
xfsdump: ino map phase 1: constructing initial dump list
xfsdump: ino map phase 2: skipping (no pruning necessary)
xfsdump: ino map phase 3: skipping (only one dump stream)
xfsdump: ino map construction complete
xfsdump: estimated dump size: 22400 bytes

============================= media label dialog =============================

please enter label for media in drive 0 (timeout in 300 sec)
-> q
media label entered: "q"

--------------------------------- end dialog ---------------------------------

xfsdump: creating dump session media file 0 (media 0, file 0)
xfsdump: dumping ino map
xfsdump: dumping directories
xfsdump: dumping non-directory files
xfsdump: ending media file
xfsdump: media file size 22576 bytes
xfsdump: dump size (non-dir files) : 0 bytes
xfsdump: dump complete: 26 seconds elapsed
xfsdump: Dump Summary:
xfsdump: stream 0 /root/data.img OK (success)
xfsdump: Dump Status: SUCCESS

# 取消挂载
[root@Rocky8-mini ~]# umount /mnt/xfs_lv

# 缩减逻辑卷大小
[root@Rocky8-mini ~]# lvreduce -L 1G /dev/vg1/xfs_lv
WARNING: Reducing active logical volume to 1.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg1/xfs_lv? [y/n]: y
Size of logical volume vg1/xfs_lv changed from 2.00 GiB (512 extents) to 1.00 GiB (256 extents).
Logical volume vg1/xfs_lv successfully resized.

# 重新创建文件系统
[root@Rocky8-mini ~]# mkfs.xfs -f /dev/vg1/xfs_lv

# 重新挂载
[root@Rocky8-mini ~]# mount /dev/vg1/xfs_lv /mnt/xfs_lv/

# 还原数据
[root@Rocky8-mini ~]# xfsrestore -f data.img /mnt/xfs_lv
[root@Rocky8-mini ~]# ls /mnt/xfs_lv/
file1 file2 file3 file4 file5

4.2.5 跨主机迁移卷组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## 在源主机中,取消挂载所有的逻辑卷

## 禁用卷组
vgchange -a n vg0

## 导出卷组
vgexport vg0
pvscan
vgdisplay

## 拆下旧硬盘在目标计算机上,并导入卷组
vgimport vg0

## 启用卷组
vgchange -ay vg0

## 挂载所有卷组上的逻辑卷在迁移之后的新主机上

4.2.6 拆除指定的PV存储设备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@Rocky8-mini etc]# df -Th /mnt/mylv
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg0-mylv ext4 2.0G 3.0M 1.9G 1% /mnt/mylv

[root@Rocky8-mini etc]# umount /mnt/mylv
[root@Rocky8-mini etc]# lvremove /dev/vg0/mylv
Do you really want to remove active logical volume vg0/mylv? [y/n]: y
Logical volume "mylv" successfully removed.
[root@Rocky8-mini etc]# vgremove /dev/vg0
Volume group "vg0" successfully removed
[root@Rocky8-mini etc]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rl lvm2 a-- <49.00g 0
/dev/sdb lvm2 --- 20.00g 20.00g
/dev/sdc vg1 lvm2 a-- <10.00g <9.51g
[root@Rocky8-mini etc]# pvremove /dev/sdb
Labels on physical volume "/dev/sdb" successfully wiped.

4.3 逻辑卷快照

4.3.1 逻辑卷快照工作原理

image-20221124212331438

快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝,对于需要备份或者复制的现有数据临时拷贝以及其它操作来说,快照是最合适的选择,快照只有在它们和原来的逻辑卷不同时才会消耗空间,建立快照的卷大小小于等于原始逻辑卷,也可以使用lvextend扩展快照

逻辑卷管理器快照
快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据改动了,则原始数据会被移动到快照区,没有改动的区域则由快照区和文件系统共享

逻辑卷快照工作原理

  • 在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间
  • 当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中
  • 快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据

由于快照区与原本的LV共用很多PE的区块,因此快照与被快照的LV必须在同一个VG中.系统恢复的时候的文件数量不能高于快照区的实际容量

快照特点:

  • 备份速度快,瞬间完
  • 应用场景是测试环境,不能完成代替备份
  • 快照后,逻辑卷的修改速度会一定有影响

4.3.2 逻辑卷快照的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@Rocky8-mini ~]# df -Th /mnt/xfs_lv
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg1-xfs_lv xfs 495M 29M 466M 6% /mnt/xfs_lv

# 为该逻辑卷创建快照,ext4必须使用 -p r 实现只读
[root@Rocky8-mini ~]# lvcreate -l 64 -s -n data-snapshot /dev/vg1/xfs_lv
Logical volume "data-snapshot" created.

# 挂载快照,xfs 需使用 -o ro 实现只读,防止快照被修改
[root@Rocky8-mini ~]# mkdir /mnt/snap
[root@Rocky8-mini ~]# mount -o ro,nouuid /dev/vg1/data-snapshot /mnt/snap

# 恢复快照
[root@Rocky8-mini ~]# umount /mnt/xfs_lv
[root@Rocky8-mini ~]# umount /mnt/snap
[root@Rocky8-mini ~]# lvconvert --merge /dev/vg1/data-snapshot
Merging of volume vg1/data-snapshot started.
vg1/xfs_lv: Merged: 100.00%