磁盘与文件系统管理

磁盘结构及分区表示

硬盘 Hard Disk Drive ,简称 HDD 是计算机常用的存储设备之一。

1 磁盘基础

1.1 硬盘的结构

1.1.1 数据结构

①扇区:磁盘上的每个磁道被等分为若干个弧段,这些弧段便是硬盘的扇区(Sector)。硬盘的第一个扇区,叫做引导扇区

②磁道:当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道 (Track)。

③柱面:在有多个盘片构成的盘组中,由不同盘片的面,但处于同一半径圆的多个磁道组成的一个圆柱面(Cylinder)

1.1.2 物理结构

盘片:硬盘有多个盘片,每盘片 2 面

磁头:每面一个磁头。

1.1.3 存储容量

硬盘存储容量=磁头数 X 磁道(柱面) 数 X 每道区数 X 每扇区字节数。

可以用柱面/磁头/扇区来唯一定位磁盘上每一个区域,用 fdisk -l 查看分区信息

在这里插入图片描述

1.2 硬盘的接口

硬盘按数据接口不同,大致分为 ATA (IDE) 和 SATA 以及 SCS和 SAS,接口速度不是实际硬盘数据传输的速度。

①ATA,全称Advanced Technology Attachment,并口数据线连接主板与硬盘,抗干扰性太差,且排线占用空间较大,不利电脑内部散热,已逐渐被 SATA 所取代。

SATA,全称 Serial ATA,抗干扰性强,支持热插拔等功能,速度快,纠错能力强。

SCSI,全称是 Small Computer System Interface (小型机系统接口),SCSI硬盘广为工作站级个人电脑以及服务器所使用,资料传输时 CPU 占用率较低,转速快,支持热插拔等。

④SAS (Serial Attached SCSI) 是新一代的 SCSI 技术,和 SATA 硬盘相同,都是采取序列式技术以获得更高的传输速度,可达到 6Gb/s。

2 磁盘分区表示

2.1 MBR 和 GPT 两种分区机制

①MBR (Master Boot Record)

MBR位于硬盘第一个物理扇区处,MBR中包含硬盘的主引导程序和硬盘分区表,分区表有4个分区记录区,每个分区记录区占16个字节。

作为传统的分区机制,应用于绝大多数使用BIOS的PC设备,但支持分区数量有限,MBR只支持不超过2T的硬盘,超过2T的硬盘将只能用2T空间。

②GPT (GUID Partition Table)

全局唯一标识分区表,是一个较新的分区机制,解决了MBR很多缺点支持超过2T的磁盘 (64位寻址空间) ,Linux分区使用parted命令。向后兼容MBR,必须在支持uEFI的硬件上才能使用 (Intel提出,用于取代BIOS),必须使用64位系统,Mac、Linux系统都能支持GPT分区格式。

总得来说 GPT 比 MBR 更先进,但是 MBR 的兼容性比 GPT 要好。

2.2 磁盘分区的表示

常见的硬盘可以划分为主分区、扩展分区和逻辑分区,通常情况下主分区只有四个,而扩展分区可以看成是一个特殊的主分区类型,在扩展分区中可以建立逻辑分区主分区一般用来安装操作系统,扩展分区则多用来存储文件数据。

在 Windows 系统中,使用盘符的形式(如 C 盘、D 、E 盘等)来表示不同的主分区、逻辑分区,而忽略了不能直接存储文件数据的扩展分区。

在 Linux 系统中,Linux 内核读取光驱、硬盘等资源时均通过“设备文件”的形式进行,因此在Linux 系统中,将硬盘和分区分别表示为不同的文件:

硬盘:
	IDE接口的硬盘设备
		hda hdb hdc hdd
	SCSI接口的硬盘设备
		sda sdb sdc sdd
	一般来说,将系统中的第1个IDE设备(硬盘)表示为“hda”,将第2个SCSI设备表示为“sdb”
	
分区:
	表示分区时,以硬盘设备的文件名作为基础,在后边添加该分区 (主分区、扩展分区、逻辑分区) 对应的数字序号即可。
	第1个IDE硬盘中的第1个分区:hda1
	第2个SCS硬盘中的第3个分区:sdb3
	
	需要注意的是,由于硬盘中的主分区数目只有 4 个,因此主分区和扩展分区的序号也就限制在1~4,而逻辑分区的序号将始终从5 开始。

2.3 Linux 中使用的文件系统类型

文件系统(File System)类型决定了向分区中存放、读取文件数据的方式和效率,在对分区进行格式化时需要选择所使用的文件系统类型。

Linux 系统中,最常使用的文件系统:

EXT4:第4代扩展文件系统,用于存放文件和目录数据的分区,是 Linux 系统中默认使用的文件系统。EXT4 是典型的日志型文件系统,其特点是保存有磁盘存取记录的日志数据,便于恢复,在存取性能和稳定性方面更加出色。
SWAP:交换文件系统,用于为 Linux 系统建立交换分区。交换分区的作用相当于虚拟内存,能够在一定程度上缓解物理内存不足的问题。一般建议将交换分区的大小设置为物理内存的 1.5~2 倍。例如,对于拥有512MB 物理内存的主机,其交换分区的大小建议设置为 1024MB。如果服务器的物理内存足够大(8GB 以上),也可以不设置交换分区。交换分区不用于直接存储用户的文件和目录等数据。
XFS:是一种高性能的日志文件系统,特别擅长于处理大文件,可支持上百万T字节的存储空间。由于 XFS 文件系统开启日志功能,所以即便发生宕机也不怕数据遭到破坏,这种文件系统可以根据日志记录在短时间内进行数据恢复。CentOS 7系统中默认使用的文件系统。

Linux 系统还广泛支持其他各种类型的文件系统,如JFS、FAT16、FAT32、NTFS等

管理磁盘及分区

新增磁盘

第一步:关闭虚拟机

第二步:添加磁盘
在这里插入图片描述

1 检测并确定新的磁盘

挂接好新的硬盘设备并启动主机后,Linux 系统会自动检测并加载该硬盘,无须额外安装驱动。执行fdisk -l命令可以查看、确认新增硬盘的设备名称和位置。

在这里插入图片描述

/dev/sda:为原有的硬盘设备
设备:Device分区的设备文件名称
Boot:是否是引导分区。是,则有'*'标识
Start:该分区在硬盘中的起始位置;柱面数
End:该分区在硬盘中的结束位置;柱面数
Blocks:分区的大小,以Blocks ()为单位,默认的块大小为1024字节
Id:分区对应的系统ID号。83表示Linux中的EXT4分区、8e表示LVM逻辑卷
System:分区类型

2 规划硬盘中的分区

在硬盘设备中创建、删除、更改分区等操作同样通过 fdisk 命令进行,只要使用硬盘的设备文件作为参数。例如,执行fdisk /dev/sdb命令,即可进入到交互式的分区管理界面中

在这里插入图片描述

在该操作界面中的命令(输入 m 获取帮助):提示符后,输入特定的分区操作指令可以完成各项分区管理任务。例如,输入“m”指令后,可以查看各种操作指令的助信息

命令(输入 m 获取帮助):m
命令操作
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition    # 删除分区
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu    # 查看操作指令的帮助信息
   n   add a new partition    # 新建分区
   o   create a new empty DOS partition table
   p   print the partition table    # 列表查看分区信息
   q   quit without saving changes    # 放弃分区设置并退出
   s   create a new empty Sun disklabel
   t   change a partition's system id    # 变更分区类型
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit    # 保存分区设置并退出
   x   extra functionality (experts only)

①p指令,列出硬盘中的分区情况;等同于fdisk -l

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:8589 MB, 8589934592 字节,16777216 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x7aacb6d3

   设备 Boot      Start         End      Blocks   Id  System

②n指令,新建分区

命令(输入 m 获取帮助):n    # 新建第一个分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)    # 主分区
   e   extended    # 拓展分区
Select (default p): p    # 选择创建的为主分区
分区号 (1-4,默认 1):1    # 设置第一个主分区的编号为1
起始 扇区 (2048-16777215,默认为 2048)# 直接回车接受默认值
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-16777215,默认为 16777215):+2G
分区 1 已设置为 Linux 类型,大小设为 2 GiB    # 结束位置或大小使用+sizeM或+sizeG的形式

命令(输入 m 获取帮助):n    # 新建第二个分区
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
分区号 (2-4,默认 2):
起始 扇区 (4196352-16777215,默认为 4196352):
将使用默认值 4196352
Last 扇区, +扇区 or +size{K,M,G} (4196352-16777215,默认为 16777215):+2G
分区 2 已设置为 Linux 类型,大小设为 2 GiB

命令(输入 m 获取帮助):p    # 输入指令p,查看分区情况

磁盘 /dev/sdb:8589 MB, 8589934592 字节,16777216 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x7aacb6d3

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   83  Linux
/dev/sdb2         4196352     8390655     2097152   83  Linux

命令(输入 m 获取帮助):n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): e    # 首次建立拓展分区
分区号 (3,4,默认 3):4    # 选择4作为拓展分区的编号
起始 扇区 (8390656-16777215,默认为 8390656):    
将使用默认值 8390656 
Last 扇区, +扇区 or +size{K,M,G} (8390656-16777215,默认为 16777215):
将使用默认值 16777215    # 使用剩下的所有空间,全部空间分配完毕后,将无法建立新的主分区
分区 4 已设置为 Extended 类型,大小设为 4 GiB

命令(输入 m 获取帮助):n
Partition type:
   p   primary (2 primary, 1 extended, 1 free)
   l   logical (numbered from 5)
Select (default p): l    # 新建第一个逻辑分区
添加逻辑分区 5
起始 扇区 (8392704-16777215,默认为 8392704):
将使用默认值 8392704
Last 扇区, +扇区 or +size{K,M,G} (8392704-16777215,默认为 16777215):+200M
分区 5 已设置为 Linux 类型,大小设为 200 MiB

命令(输入 m 获取帮助):n
Partition type:
   p   primary (2 primary, 1 extended, 1 free)
   l   logical (numbered from 5)
Select (default p): l     # 新建第二个逻辑分区
添加逻辑分区 6
起始 扇区 (8804352-16777215,默认为 8804352):
将使用默认值 8804352
Last 扇区, +扇区 or +size{K,M,G} (8804352-16777215,默认为 16777215):+2G
分区 6 已设置为 Linux 类型,大小设为 2 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:8589 MB, 8589934592 字节,16777216 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x7aacb6d3

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   83  Linux
/dev/sdb2         4196352     8390655     2097152   83  Linux
/dev/sdb4         8390656    16777215     4193280    5  Extended
/dev/sdb5         8392704     8802303      204800   83  Linux
/dev/sdb6         8804352    12998655     2097152   83  Linux

③d指令,删除分区

使用d指令可以删除指定的分区,根据提示继续输入需要删除的分区序号即可。在执行删除分区时一定要慎重,应首先使用p指令查看分区的序号,确定无误后再进行删除。需要注意的是,若拓展分区被删除,则拓展分区之下的逻辑分区也将同时被删除。因此建议从最后一个分区开始删除,以免fdisk识别序号发生紊乱。

删除逻辑分区’/dev/sdb6’
在这里插入图片描述

④t指令,变更分区的类型

使用“t”指令可以变更分区的 ID 号。操作时需要依次指定目标分区序号、新的系统 ID 号。不同类型的文件系统对应不同的 ID 号,以十六进制数表示,在 fdisk交互环境中可以输入“l”指令进行列表查看。最常用的 EXT4、Swap 文件系统的 ID号分别为83、82,而用于 Windows 中的 NTFS 文件系统的 ID 号一般为 86。

在这里插入图片描述

命令(输入 m 获取帮助):t     # 变更分区类型
分区号 (1,2,4,5,默认 5):5
Hex 代码(输入 L 列出所有代码):82
已将分区“Linux”的类型更改为“Linux swap / Solaris”

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:8589 MB, 8589934592 字节,16777216 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xe022b2c4

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   83  Linux
/dev/sdb2         4196352     8390655     2097152   83  Linux
/dev/sdb4         8390656    16777215     4193280    5  Extended
/dev/sdb5         8392704     8802303      204800   82  Linux swap / Solaris

⑤w,q指令,退出fdisk分区工具

完成对硬盘的分区操作以后,可以执行“w”或“g”指令退出 fdisk分区工具

w:保存退出
q:不保存退出

在这里插入图片描述

管理文件系统

1 创建文件系统

创建文件系统的过程也即格式化分区的过程,在 Linux 系统中使用 mkfs (MakeFilesystem,创建文件系统)命令工具可以格式化XFS、EXT4、FAT 等不同类型的分区,而使用 mkswap 命令可以格式化 Swap 交换分区。

1.1 mkfs 命令

实际上 mkfs 命令是一个前端工具,可以自动加载不同的程序来创建各种类型的分区,而后端包括有多个与 mkfs 命令相关的工具程序,这些程序位于 /sbin/ 目录中,如支持 EXT4 分区格式的 mkfs.ext4 程序等。

在这里插入图片描述

# 基本语法
mkfs -t 文件系统类型 分区设备

案例①:将分区/dev/sdb1 格式化为EXT4文件系统

在这里插入图片描述

案例②:将分区/dev/sdb5 格式化为 FAT32 文件类型

mkfs -t vfat -F 32 /dev/sdb6
或
mkfs.vfat -F 32 /dev/sdb6

一般来说,不建议在 Linux 系统中创建或使用 Windows 中的文件系统类型,包括FAT16、FAT32等。但有一些特殊情况,如 Windows系统不可用、U 盘系统被病毒破坏等除外

CentOS 6 系统默认使用 ext4 文件系统,而 CentOS 7系统默认使用 xfs 文件系统。当然文件系统的选择是要根据实际的生产环境和硬盘类型等条件来决定的,例如 SAS/SATA 硬盘文件系统选择方案可根据具体情况分为以下几类:

  • 如果是数据库业务,则选择 xfs 类型的文件系统。

  • 如果有大量小文件的业务,一般首选 ReiserFS 的文件系统

  • 常规应用选择默认的文件系统即可。

2 mkswap 命令的使用

在Linux 系统中,Swap 分区的作用类似于 Windows 系统中的“虚拟内存”,可在一定程度上缓解物理内存不足的情况。当当前 Linux 主机运行的服务较多,需要更多的交换空间支撑应用时,可以为其增加新的交换分区。
使用 mkswap 命令工具可以在指定的分区上创建交换文件系统,目标分区应先通过fdisk工具将ID 号设为82。

案例:将分区/dev/sdb5创建为交换分区

[root@localhost ~]# mkswap /dev/sdb5
正在设置交换空间版本 1,大小 = 204796 KiB
无标签,UUID=748e0b3e-f9ad-4ead-8526-f39ae1b8c13c
[root@localhost ~]# cat /proc/meminfo | grep "SwapTotal:"    //查看总交换空间的大小
SwapTotal:       2097148 kB
[root@localhost ~]# swapon /dev/sdb5    //对于新增的交换分区,需要swapon命令启用
[root@localhost ~]# cat /proc/meminfo | grep "SwapTotal:"
SwapTotal:       2301944 kB    //交换空间大小已增加
[root@localhost ~]# swapoff /dev/sdb5    //关闭交换分区

3 挂载和卸载文件系统

①挂载文件系统

# 基本语法
mount [ -t 文件系统类型 ] 存储设备 挂载点目录
文件系统类型通常可以省略(由系统自动识别)# 挂载ISO镜像文件
mount -o loop ISO镜像文件 挂载点目录

②卸载文件系统

# 基本语法
umount 设备文件
或
umount 挂载点目录

③设置文件系统的自动挂载

系统中的 etc/fstab 文件可以视为 mount命令的配置文件,其中存储了文件系统的静态挂载数据。Linux 系统在每次开机时,会自动读取这个文件的内容,自动挂载所指定的文件系统。默认的 stab 文件中包括了根分区、boot 分区、交换分区及 proc、tmmpfs 等伪文件系统的挂载配置。

在这里插入图片描述

在“/etc/fstab”文件中,每一行记录对应一个分区或设备的挂载配置信息,从左到右包括六个字段(使用空格或制表符分隔),各部分的含义如下所述。

第1字段: 设备名或设备卷标名

第2字段: 文件系统的挂载点目录的位置

第3字段: 文件系统类型,如 EXT4、Swap 等

第4字段: 挂载参数,即 mount 命令“-o”选项后可使用的参数。例如0defaults、rw、ro、noexec 分别表示默认参数、可写、只读、禁用执行程序。

第5字段: 表示文件系统是否需要dump备份 (dump 是一个备份工具)。一般设为1时表示需要,设为0时将被dump所忽略。

第6字段: 该数字用于决定在系统启动时进行磁盘检查的顺序。0 表示不进行检查,1 表示优先检查,2 表示其次检查。对于根分区应设为 1,其他分区设为 2

通过在“/etc/fstab”文件中添加相应的挂载配置,可以实现开机后自动挂载指定的分区。

使用 mount、umount进行挂载、卸载操作时,若在 /etc/fstab 文件中已设置有对应的挂载记录,则只需指定挂载点目录或设备文件名中的一个作为参数。例如,直接执行“mount /dev/sdb1”或“mount /mailbox”,都可以将分区 /dev/sdb1 挂载到/mailbox目录下。

管理LVM逻辑卷

1 LVM

1.1 概述

LVM 是 Linux 系统中对磁盘分区进行管理的一种逻辑机制,它是建立在硬盘和分区之上,文件系统之下的一个逻辑层,在建立文件系统时屏蔽了下层的磁盘分区布局,能够在保持现有数据不变的情况下动态调整磁盘容量,从而提高磁盘管理的灵活性。

在安装 CentOS 系统的过程中选择自动分区时,就会默认采用 LVM 分区方案,不需要再进行手动配置。如果有特殊需要,也可以使用安装向导提供的磁盘定制工具调LVM 分区。需要注意的是,“boot”分区不能基于 LVM 创建,必须独立出来。

1.2 LVM 的几个基本术语:

①PV( Physical Volume,物理卷 )

物理卷是 LVM 机制的基本存储设备,通常对应为一个普通分区或整个硬盘。创建物理卷时,会在分区或硬盘的头部创建一个保留区块,用于记录 LVM 的属性,并把存诸空间分割成默认大小为 4MB 的基本单元(Physical Extent,PE),从而构成物理卷。物理卷一般直接使用设备文件名称,如 /dev/sdb1、/dev/sdb2、/dev/sdd 等。

对用于转换成物理卷的普通分区,建议先使用 disk 工具将分区类型的 ID 标记inuX 系统管均改为“8e”。若是整块硬盘,可以将所有磁盘空间划分为一个主分区后再做相应调整。

②VG (Volume Group,卷组)

由一个或多个物理卷组成一个整体,即称为卷组,在卷组中可以动态地添加或移除物理卷。许多个物理卷可以分别组成不同的卷组,卷组的名称由用户自行定义。

③LV (Logical Volume,逻辑卷)

逻辑卷建立在卷组之上,与物理卷没有直接关系。对于逻辑卷来说,每一个卷组就是一个整体,从这个整体中“切出”一小块空间,作为用户创建文件系统的基础,这一小块空间就称为逻辑卷。使用 mkfs 等工具在逻辑卷上创建文件系统以后,就可以挂载到 Linux 系统中的目录下使用。

④总结:

创建及使用 LVM 方案的基本过程:首先,将普通分区或整个硬盘创建为物理卷;接下来,将物理上比较分散的各物理卷的存储空间组成一个逻辑整体,即卷组;最后,基于卷组这个整体,分割出不同的数据存储空间,形成逻辑卷。逻辑卷才是最终用户可以格式化并挂载使用的存储单位。

创建物理卷>创建卷组>创建逻辑卷>格式化文件系统>挂载使用

2 管理LVM

在这里插入图片描述

2.1 PV 物理卷管理

①pvscan命令

pvscan 用于扫描系统中的所有物理卷,并输出相关信息。

使用自动分区方案安装的CentOS 系统,系统盘 sda 被划分为 sdal和 sda2 两个分区,其中 sda2 分区被转换为物理卷,并基于该物理卷创建 VolGroup 卷组。

[root@localhost ~]# pvscan
  PV /dev/sda2   VG centos          lvm2 [<19.00 GiB / 0    free]
  Total: 1 [<19.00 GiB] / in use: 1 [<19.00 GiB] / in no VG: 0 [0   ]
②pvcreate命令

pvcreate 用于将分区或整个硬盘转换成物理卷。

主要是添加 LVM 属性信息并划分PE 存储单位。该命令需要使用硬盘或分区的设备文件作为参数(可以有多个)。

案例:将把分区 /dev/sdb1、/dev/sdb2、/dev/sdb3 转换成物理卷。

[root@localhost -]# pvcreate /dev/sdb1 /dev/sdb2 /dev/sdb3
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdb2" successfully created
Physical volume "/dev/sdb3" successfully created
③pvdisplay命令

pvdisplay 用于显示物理卷的详细信息。

需要使用指定的物理卷作为命令参数,默认时将显示所有物理卷的信息。

[root@localhost ~]# pvdisplay /dev/sdb1
  "/dev/sdb1" is a new physical volume of "2.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name
  PV Size               2.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               V3pUU4-tK4d-1f7i-xUGF-12tQ-3eEF-Dw69Id

2.2 VG 卷组管理

①vgscan命令

vgscan 命令用于扫描系统中已建立的 LVM 卷组及相关信息。

案例:通过执vgscan 命令后可以列出 VolGroup 卷组。

[root@localhost ~]# vgscan
  Reading volume groups from cache.
  Found volume group "centos" using metadata type lvm2
②vgcreate命令

vgcreate 用于将一个或多个物理卷创建为一个卷组,第一个命令参数用于设置亲卷组的名称,其后依次指定需要加入到该卷组的物理卷作为参数。例如,使用物理卷“/dev/sdb1”和“/dev/sdb2”创建名为 web_document 的卷组

[root@localhost ~]# vgcreate web_document /dev/sdb1 /dev/sdb2
  Volume group "web_document" successfully created
③vgdisplay命令

vgdisplay 用于显示系统中各卷组的详细信息,需要使用指定卷组名作为命令参数(未指定卷组时将显示所有卷组的信息) 。

案例:查看卷组 web_document 的详细信息

[root@localhost ~]# vgdisplay web_document
  --- Volume group ---
  VG Name               web_document
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               3.99 GiB
  PE Size               4.00 MiB
  Total PE              1022
  Alloc PE / Size       0 / 0
  Free  PE / Size       1022 / 3.99 GiB
  VG UUID               KqKSNd-UZoI-f4Zo-Di58-KcCn-F33n-DtlDiw

④vgremove 命令

vgremove 命令用于删除指定的卷组,指定卷组名称作为参数即可。

删除时应确保该卷组中没有正在使用的逻辑卷 。

案例:删除名为web_document的 LVM 卷组

[root@localhost ~]# vgremove web_document
  Volume group "web_document" successfully removed
⑤vgextend 命令

vgextend 用于扩展卷组的磁盘空间。

当创建了新的物理卷,并需要将其添加到己有卷组中时,就可以使用 vgextend 命令。该命令的第一个参数为需要扩展容量的卷组名称,其后为需要添加到该卷组中的各物理卷。

案例:将重新创建卷组web_document,只包含物理卷“/dev/sdb1”,然后通过 vgextend 命令将物理卷“/dev/sdb2”添加到卷组 web_document 中

[root@localhost ~]# vgcreate web_document /dev/sdb1
  Volume group "web_document" successfully created
[root@localhost ~]# vgextend web_document /dev/sdb2
  Volume group "web_document" successfully extended

2.3 LV 逻辑卷管理

①lvscan命令

lvscan 命令用于扫描系统中已建立的逻辑卷及相关信息。

[root@localhost ~]# lvscan
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit
  ACTIVE            '/dev/centos/root' [<17.00 GiB] inherit
②lvcreate命令

lvcreate 用于从指定的卷组中分制空间,以创建新的逻辑卷。需要指定逻辑卷大小名称及所在的卷组名作为参数。逻辑卷创建好以后,可以通过“/dev/ 卷组名/逻辑卷名形式的设备文件进行访问(或“/dev/mapper/ 卷组名-逻卷名”)。

# 基本语法
lvcreate -L 容量大小 -n 逻辑卷名 卷组名

案例:在卷组 web_document 中建立一个新的逻辑卷,容量为1GB,名称设为 kgc。

[root@localhost ~]# lvcreate -L 2G -n kgc web_document
  Logical volume "kgc" created.
[root@localhost ~]# ls /dev/web_document/kgc
/dev/web_document/kgc
[root@localhost ~]# ls /dev/mapper/web_document-kgc
/dev/mapper/web_document-kgc
③lvdisplay命令

lvdisplay命令用于显示逻辑卷的详细信息,需要指定逻辑卷的设备文件作为参数也可以使用卷组名作为参数,以显示该卷组中所有逻辑卷的信息。

案例:查看前面创建的 kgc 逻辑卷的详细信息。

[root@localhost ~]# lvdisplay /dev/web_document/kgc
  --- Logical volume ---
  LV Path                /dev/web_document/kgc
  LV Name                kgc
  VG Name                web_document
  LV UUID                Qtk32p-xg39-b9p1-Ymo8-zYL1-31YS-5MtifY
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2023-06-25 23:14:00 +0800
  LV Status              available
  # open                 0
  LV Size                2.00 GiB
  Current LE             512
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
④lvextend命令

lvextend 用于动态扩展逻辑卷的空间,当目前使用的逻辑卷空间不足时,可以从所在卷组中分割额外的空间进行扩展。只要指定需增加的容量大小及逻辑卷文件位置即可。前提条件是该卷组中还有尚未分配的磁盘空间,否则需要先扩展卷组容量。另外酒整逻辑卷的容量后,需要执行“resize2fs /dev/ 卷组名/卷名”命令以便 Linux系统重新识别文件系统的大小(resize2fs 命令用于在线调整文件系统大小)。

# 基本语法
lvextend -L + 大小 /dev/卷组名/逻辑卷名

案例:为 kge 逻辑卷扩展(增加) 1GB 大小的磁盘空间,并使用resize2fs 命令重设大小。

[root@localhost ~]# lvextend -L +1G /dev/web_document/kgc
  Size of logical volume web_document/kgc changed from 2.00 GiB (512 extents) to 3.00 GiB (768 extents).
  Logical volume web_document/kgc successfully resized.
[root@localhost ~]# lvdisplay /dev/web_document/kgc
  --- Logical volume ---
  LV Path                /dev/web_document/kgc
  LV Name                kgc
  VG Name                web_document
  LV UUID                Qtk32p-xg39-b9p1-Ymo8-zYL1-31YS-5MtifY
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2023-06-25 23:14:00 +0800
  LV Status              available
  # open                 0
  LV Size                3.00 GiB
  Current LE             768
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

[root@localhost ~]# resize2fs /dev/web_document/kgc
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block 当尝试打开 /dev/web_document/kgc 时
找不到有效的文件系统超级块.

在为逻辑卷扩展容量时,能够扩展的大小受限于所在卷组剩余空间(未被其他逻辑卷使用) 的大小。例如,当卷组 web document 的剩余空间只有 8GB 时,通过lvextend命令最多也只能为kgc逻辑卷增加8GB 的空间,若还需要增加更多的磁盘空间必须先通过 vgextend 扩展卷组的容量。

⑤lvremove命令

lvremove用于删除指定的逻辑卷,直接使用逻辑卷的设备文件作为参数即可。例如执行以下操作可以删除名为 kgc 的逻辑卷。需要注意的是,在删除逻辑卷之前,应确保该逻辑卷已不再使用,且必要的数据已做好备份。

[root@localhost ~]# lvremove /dev/web_document/kgc
Do you really want to remove active logical volume web_document/kgc? [y/n]: y
  Logical volume "kgc" successfully removed

RAID 磁盘阵列与阵列卡

1 概述

RAID 独立冗余磁盘阵列,是英文 Redundant Array of Independent Disks 的缩写。

RAID 是把多块独立的物理硬盘按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘具有更高存储性能和存储容量的数据备份技术。

在用户看来,组成的磁盘组就像是一个硬盘,用户可以对它进行分区,格式化等等组成磁盘阵列的不同方式为RAID级别(RAID Levels)。

2 RAID 磁盘阵列详解

常用的 RAID 级别:

① RAID 0

RAID 0 称为条带化存储Striping,以连续位或字节为单位进行数据分割,将数据分段存储于各个硬盘中,并行读写。因此:

  • 数据传输率可达单个硬盘的N倍(N为组成 RAID 0 硬盘的个数)
  • 没有数据冗余,单个磁盘损坏将影响到所有数据
  • RAID 0 不能用于数据安全性要求高的场合

在这里插入图片描述

② RAID 1

RAID 1 称为镜像存储mirroring,通过磁盘数据镜像实现数据冗余,原理是成对的独立磁盘上产生互为备份的数据。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,无需重组失效的数据。

  • 数据被同等地写入成对的磁盘中,所以写性能比较慢
  • 数据可以直接从镜像拷贝中读取数据,因此读取性能比较快
  • 成本最高,数据安全性与可用性也很高
  • 如果N(偶数)块硬盘组合成一组镜像,只能利用其中N/2的容量

在这里插入图片描述

③ RAID 5

RAID 5 把数据以块分段条带化进行存储,并且奇偶校验信息和相对应的数据分别存储与不同的磁盘中,其中任意N-1(N>=3)块磁盘的容量都存储完整的数据,磁盘的利用率为 (N-1)/N ,也就是说相当于有一块磁盘的容量空间用于存储奇偶校验信息。

  • 一块磁盘的损坏不影响数据的完整性,安全性可以保障
  • 当被损坏的磁盘替换后,RAID 5 会利用剩余的信息去重建损坏磁盘上的数据信息,保持 RAID 5 的可靠性
  • 由于校验机制,写性能不高

在这里插入图片描述

④ RAID 6

RAID 6 采用双重校验技术,在 RAID 5 的技术上增加了第二个独立的奇偶校验信息块,两个独立的奇偶系统使用不同的算法使得数据的可靠性非常高。由N(N>=4)块盘组成,磁盘的利用率为 (N-2)/N。

  • 即使两块磁盘损坏也不会影响数据的使用
  • 需要给奇偶校验信息更大的磁盘空间,相对于 RAID 5 有更大的写损失
  • 第二块的校验区也减少了有效存储空间

在这里插入图片描述

⑤ RAID 1+0

RAID 1+0 是 RAID 1 和 RAID 0 的结合,先做镜像1,再做条带0,属于混合型RAID。比如N(偶数,N>=4)块盘两两镜像后,磁盘的利用率为N/2,N/2块盘同时写入数据,N块盘同时读取数据。

  • 兼顾了 RAID 1 的容错能力和 RAID 0 的条带化读写数据的优点,性能好、可靠性高
  • 最多允许所有磁盘基组中的磁盘各损坏一个,但不允许同一基组中的磁盘同时有坏的

在这里插入图片描述

阵列卡介绍与配置

1 阵列卡介绍

阵列卡全称为磁盘阵列卡,是用来实现 RAID 功能的板卡,RAID 卡一般分为硬 RAID 卡和软 RAID 卡两种。

通过硬件来实现 RAID 的功能的就是硬 RAID ,通常是由I/0处理器、硬盘控制器、硬盘连接器和缓存等一系列组件构成。

通过软件并使用 CPU 的 RAID 卡就是软 RAID 。

因为软 RAID 占用 CPU 资源比较高,所有绝大多数的服务器设备都是用的硬 RAID。不同的 RAID 卡支持的 RAID 功能不同,比如支持 RAID 0、1、5、6等。

2 RAID 卡的接口类型

RAID卡目前支持的接口有 IDE 接口、SCSI 接口、SATA 接口和 SAS 接口。

① IDE 接口

IDE 全称 Integrated Drive Electronics,即电子集成驱动器,属于并行接口。把“硬盘控制器”与“盘体”集成在一起的硬盘驱动器,使得硬盘接口的电缆数目与长度有所减少,从而数据传输的可靠性得到增强。IDE 接口拥有价格低廉、兼容性强的特点,从而造就了它不可替代的地位。这一接口技术从诞生至今就一直在不断发展,性能也不断提高。在实际的应用中,逐渐被后续发展分支出更多类型的硬盘接口所取代。

② SCSI 接口

SCSI 全称为“Small Computer System Interface”(小型计算机系统接口),是同IDE 完全不同的接口,IDE 接口是普通 PC 的标准接口,而 SCSI 并不是专门为硬盘设计的接口,而是一种通用接口标准,具备与多种不同类型外部设备进行通信的能力,是一种广泛应用于小型机上的高速数据传输技术。
SCSI是个多任务接口,设有母线仲裁功能,挂在一个 SCSI母线上的多个外部设备可以同时工作,并且平等占有总线。SCSI接口可以同步或异步传输数据,同步传输速率可以达到 10MB/s,异步传输速率可以达到 1.5MB/s。并且 SCSI接口的CPU 占用率低,支持热插拔,但较高的价格使得它很难如 IDE 硬盘般及,因此SCSI硬盘主要应用于中、高端工作站中。

③ SATA 接口

SATA 是“Serial ATA”的缩写,主要用在主板和大量存储设备之间传输数据。拥有这种接口的硬盘又叫串口硬盘,以采用串行方式传输数据而知名。

SATA 总线使用了嵌入式时钟信号,使得其具备更强的纠错能力。如果发现数据传输中的错误会自动进行矫正,很大程度上提高了数据传输的可靠性。也是一种支持热插拔的接口。

④ SAS 接口

SAS 的英文全称为“Serial Attached SCSI”是新一代的 SCSI 技术,称为序列式 SCSI,SAS 可以看做是 SATA 与 SCSI的结合体,是同时发挥两者的优势产生的,主要用在周边零件的数据传输上,和现在流行的 SerialATA (SATA)硬盘相同,都是采用串行技术以获得更高的传输速度。此外 SAS 的接口技术可以向下兼容 SATA 设备。

3 阵列卡的缓存

缓存(Cache) 是 RAID 卡与外部总线交换数据的场所,它是 RAID 卡电路板上的“块存储芯片,与硬盘盘片相比,具有极快的存取速度。工作过程中 RAID 卡先将数据传送到缓存,再由缓存和外边数据总线进行数据交换。缓存的大小与速度是 RAID 卡的实际传输速度的重要因素,大缓存能够大幅度地提高数据命中率从而提高 RAID卡整体性能。

多数的 RAID 卡都会配备一定数量的内存来作为高速缓存使用,不同的 RAID 卡出厂时配备的内存容量不同,一般为几兆到数百兆容量不等,主要取决于磁盘阵列产品所应用的范围。

部署磁盘阵列

mdadm 命令

1 概念

mdadm是multiple devices admin的简称,它是Linux下的一款标准的软件 RAID 管理工具

mdadm能够诊断、监控和收集详细的阵列信息   
mdadm是一个单独集成化的程序而不是一些分散程序的集合,因此对不同RAID管理命令有共通的语法   
mdadm能够执行几乎所有的功能而不需要配置文件(也没有默认的配置文件)

2 基本语法
mdadm [模式] <RAID设备> [选项] [成员设备名称]
-a 检测设备名称
-n 指定设备数量
-l 指定RAID级别
-C 创建一个RAID阵列卡
-v 显示创建过程
-f 模拟设备损坏
-r 移除设备
-Q 查看摘要信息
-D 查看详细信息
-S 停止RAID磁盘阵列
案例:通过软 RAID 部署 RAID 1+0 磁盘阵列

1 为虚拟机添加4块硬盘

2 创建 RAID 1+0

[root@web ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sd[b-e]
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 20954112K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

3 将制作好的 RAID 磁盘格式化为 ext4 格式

[root@web ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
2621440 inodes, 10477056 blocks
523852 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2157969408
320 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624

Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

4 创建挂载目录,然后挂载

[root@web ~]# mkdir /tudou
[root@web ~]# mount /dev/md0 /tudou/
[root@web ~]# df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        17G  6.5G   11G   38% /
devtmpfs                devtmpfs  894M     0  894M    0% /dev
tmpfs                   tmpfs     910M     0  910M    0% /dev/shm
tmpfs                   tmpfs     910M   11M  900M    2% /run
tmpfs                   tmpfs     910M     0  910M    0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  179M  836M   18% /boot
tmpfs                   tmpfs     182M   12K  182M    1% /run/user/42
tmpfs                   tmpfs     182M     0  182M    0% /run/user/0
/dev/md0                ext4       40G   49M   38G    1% /tudou

5 查看磁盘阵列的详细信息

[root@web ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Mon Jun 26 16:02:06 2023
        Raid Level : raid10
        Array Size : 41908224 (39.97 GiB 42.91 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Mon Jun 26 16:06:30 2023
             State : clean
    Active Devices : 4
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 0

            Layout : near=2
        Chunk Size : 512K

Consistency Policy : resync

              Name : web.lamp.slave:0  (local to host web.lamp.slave)
              UUID : a6fc8d97:48dcff0f:93d9ff58:392d7ba0
            Events : 19

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync set-A   /dev/sdb
       1       8       32        1      active sync set-B   /dev/sdc
       2       8       48        2      active sync set-A   /dev/sdd
       3       8       64        3      active sync set-B   /dev/sde

案例:模拟 RAID 磁盘阵列损坏并修复

1 模拟/dev/sdb设备损坏

[root@web ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@web ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Mon Jun 26 16:02:06 2023
        Raid Level : raid10
        Array Size : 41908224 (39.97 GiB 42.91 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Mon Jun 26 16:12:32 2023
             State : clean, degraded
    Active Devices : 3
   Working Devices : 3
    Failed Devices : 1
     Spare Devices : 0

            Layout : near=2
        Chunk Size : 512K

Consistency Policy : resync

              Name : web.lamp.slave:0  (local to host web.lamp.slave)
              UUID : a6fc8d97:48dcff0f:93d9ff58:392d7ba0
            Events : 21

    Number   Major   Minor   RaidDevice State
       -       0        0        0      removed    # /dev/sdb已经移除
       1       8       32        1      active sync set-B   /dev/sdc
       2       8       48        2      active sync set-A   /dev/sdd
       3       8       64        3      active sync set-B   /dev/sde

       0       8       16        -      faulty   /dev/sdb

2 由于是虚拟机,可以重启后虚拟机后,重新将/dev/sdb加入到/dev/md0

mdadm /dev/md0 -a /dev/sdb
案例:在 RAID 5 阵列中添加一块备份盘,模拟硬盘故障,观察备份盘的状态

备份盘平时处于限制状态,一旦阵列中的硬盘故障,备份盘会自动顶替上去同步数据

# 创建 RAID 5 阵列盘和一个备份盘
[root@localhost ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sd[b-e]
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: size set to 20954112K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
# 格式化磁盘
[root@localhost ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
2621440 inodes, 10477056 blocks
523852 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2157969408
320 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624

Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

# 挂载
[root@localhost ~]# mount /dev/md0 /mnt
[root@localhost ~]# df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        17G  1.7G   16G   10% /
devtmpfs                devtmpfs  475M     0  475M    0% /dev
tmpfs                   tmpfs     487M     0  487M    0% /dev/shm
tmpfs                   tmpfs     487M  7.7M  479M    2% /run
tmpfs                   tmpfs     487M     0  487M    0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  133M  882M   14% /boot
tmpfs                   tmpfs      98M     0   98M    0% /run/user/0
/dev/md0                ext4       40G   49M   38G    1% /mnt
[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Mon Jun 26 17:21:10 2023
        Raid Level : raid5
        Array Size : 41908224 (39.97 GiB 42.91 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Mon Jun 26 17:23:44 2023
             State : clean
    Active Devices : 3
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : localhost.localdomain:0  (local to host localhost.localdomain)
              UUID : 9351fafa:4af68d99:6c69be1e:444b0e62
            Events : 28

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       3       8       64        -      spare   /dev/sde    # 有一个备用盘


# 永久保存
touch /etc/mdadm.conf
mdadm -Ds > /etc/mdamd.conf
# 模拟故障
[root@localhost ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Mon Jun 26 17:21:10 2023
        Raid Level : raid5
        Array Size : 41908224 (39.97 GiB 42.91 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Mon Jun 26 17:27:33 2023
             State : clean, degraded, recovering
    Active Devices : 2
   Working Devices : 3
    Failed Devices : 1
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

    Rebuild Status : 2% complete

              Name : localhost.localdomain:0  (local to host localhost.localdomain)
              UUID : 9351fafa:4af68d99:6c69be1e:444b0e62
            Events : 30

    Number   Major   Minor   RaidDevice State
       3       8       64        0      spare rebuilding   /dev/sde  # 正在同步
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       0       8       16        -      faulty   /dev/sdb   # 失效了

  Version : 1.2
 Creation Time : Mon Jun 26 17:21:10 2023
    Raid Level : raid5
    Array Size : 41908224 (39.97 GiB 42.91 GB)
 Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
  Raid Devices : 3
 Total Devices : 4
   Persistence : Superblock is persistent

   Update Time : Mon Jun 26 17:27:33 2023
         State : clean, degraded, recovering
Active Devices : 2

Working Devices : 3
Failed Devices : 1
Spare Devices : 1

        Layout : left-symmetric
    Chunk Size : 512K

Consistency Policy : resync

Rebuild Status : 2% complete

          Name : localhost.localdomain:0  (local to host localhost.localdomain)
          UUID : 9351fafa:4af68d99:6c69be1e:444b0e62
        Events : 30

Number   Major   Minor   RaidDevice State
   3       8       64        0      spare rebuilding   /dev/sde  # 正在同步
   1       8       32        1      active sync   /dev/sdc
   4       8       48        2      active sync   /dev/sdd

   0       8       16        -      faulty   /dev/sdb   # 失效了



  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值