zutuanxue.com-linux磁盘管理基本管理

2023-11-03

linux磁盘管理基本管理

开课

​ 本章我们将学习到磁盘管理的相关知识,这部分知识在我们以后的工作中非常重要,它可以让我们知道如何去规划磁盘,如何去使用磁盘,如何去提高磁盘的利用率,这些都会影响服务器的性能和效率,而服务器性能和效率会影响到我们在行业中的个人价值。

知识点

  • 基本管理
    • 介绍
    • 工作原理
    • 性能指标
    • 磁盘的使用方法
    • 基本分区管理
  • GPT&LVM
    • GPT磁盘管理
    • LVM介绍&概念
    • LVM管理
    • 扩展
  • RAID
    • RAID介绍
    • 常见RAID级别
    • 软RAID
    • RAID的使用

课程目标

  • 能够知道磁盘的作用,相关概念,磁盘的性能指标
  • 能够掌握磁盘的使用方法
  • 能够管理GPT磁盘
  • 能够说出LVM的相关概念及使用
  • 能够了解如何扩容swap及LVM的额外应用
  • 能够说出raid的分类及优缺点
  • 能够熟练使用相关命令操作raid

一、磁盘介绍

磁盘:计算机中的外部存储设备,负责存储计算机数据,并且断电后也能保持数据不丢失。

分类:

按照物理结构:机械磁盘,固态磁盘

按照接口:IDE、SCSI、SATA、SAS、mSATA、M.2、NVME、PCIe

按照尺寸:

​ 机械硬盘:1.8寸 2.5寸 3.5寸

​ 固态硬盘:SATA: 2.5寸

​ M.2: 2242、2260、2280

二、熟悉磁盘的工作原理

机械磁盘的读写数据依靠电机带动盘片转动来完成数据读写的。

机械磁盘剖析图

请添加图片描述

为了使磁盘内部清洁,磁盘是在真空特殊环境中制作的,不能随意拆卸,拆开后基本报废了

机械磁盘工作是依靠马达带动盘片转动,通过磁头来读取磁盘上的数据。

磁盘术语

磁盘

硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内。盘片的编号自下向上从0开始,如最下边的盘片有0面和1面,再上一个盘片就编号为2面和3面。

磁头

负责读取盘面数据的设备

磁道

从盘片的最内侧向外有很多同心圆圈,我们称为磁道

扇区

从圆心向外画直线,可以将磁道划分为若干个弧段,称之为扇区,一个扇区通常为512B

请添加图片描述

磁柱

硬盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。磁盘的柱面数与一个盘面上的磁道数是相等的。由于每个盘面都有自己的磁头,因此,盘面数等于总的磁头数。

请添加图片描述

三、磁盘的性能指标

影响磁盘性能的指标

寻道时间(seek time)【和 转速 相关】:Tseek,是指将读写磁头移动至正确的磁道上所需要的时间。寻道时间越短,I/O操作越快,目前磁盘的平均寻道时间一般在3-15ms

旋转延迟:Trotation,是指盘片旋转将请求数据所在的扇区移动到读写磁头下方所需要的时间。旋转延迟取决于磁盘转速,通常用磁盘旋转一周所需时间的1/2表示。比如:7200rpm的磁盘平均旋转延迟大约为60*1000/7200/2 = 4.17ms,而转速为15000rpm的磁盘其平均旋转延迟为2ms。

数据传输时间:Ttransfer,是指完成传输所请求的数据所需要的时间

衡量磁盘性能的指标

IOPS:IOPS(Input/Output Per Second)即每秒的输入输出量(或读写次数),即指每秒内系统能处理的I/O请求数量。随机读写频繁的应用,如小文件存储等,关注随机读写性能,IOPS是关键衡量指标。可以推算出磁盘的IOPS = 1000ms / (Tseek + Trotation + Transfer),如果忽略数据传输时间,理论上可以计算出随机读写最大的IOPS。常见磁盘的随机读写最大IOPS为:

  • 7200rpm的磁盘 IOPS = 76 IOPS
  • 10000rpm的磁盘IOPS = 111 IOPS
  • 15000rpm的磁盘IOPS = 166 IOPS

**throughput :**吞吐量指单位时间内可以成功传输的数据数量。 单位为(m/s G/s)

请添加图片描述

**文件系统:**是告知操作系统使用何种方法和数据结构在存储设备或分区上读写数据的;是分区数据管家,负责如何将数据写入磁盘或者从磁盘读出

​ NTFS EXT3 EXT4 XFS ISO9660

具体有多少 man mount -t

 adfs,  affs,  autofs,  cifs,  coda,  coherent, cramfs,debugfs, devpts, efs, ext, ext2, ext3, ext4, hfs, hfsplus, hpfs,iso9660,  jfs, minix, msdos, ncpfs, nfs, nfs4, ntfs, proc, qnx4,ramfs, reiserfs, romfs, squashfs,  smbfs,  sysv,  tmpfs,  ubifs,udf,  ufs,  umsdos,  usbfs,  vfat, xenix, xfs, xiafs.

文件系统可以根据应用场景去选择使用哪一款,如果不会选择,推荐ext4或者XFS

page cache

其实就是内存上空闲的部分 用来缓存数据,比如buffer cache

作用:对IO读写做优化

测试缓存对读写的影响

[root@localhost ~]# echo 3 > /proc/sys/vm/drop_caches
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980          95        1807           9          77        1754
Swap:          2047           0        2047
[root@localhost ~]# dd if=/dev/zero of=/tmp/big bs=1M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
1048576000字节(1.0 GB)已复制,10.2412 秒,102 MB/[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980          95         779           9        1105        1698
Swap:          2047           0        2047
[root@localhost ~]# dd if=/dev/zero of=/tmp/big1 bs=1M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
1048576000字节(1.0 GB)已复制,7.89978 秒,133 MB/秒

读
[root@localhost ~]# echo 3 > /proc/sys/vm/drop_caches 
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980          95        1805           9          79        1753
Swap:          2047           0        2047
[root@localhost ~]# dd if=/tmp/big of=/dev/null 
记录了2048000+0 的读入
记录了2048000+0 的写出
1048576000字节(1.0 GB)已复制,2.23965 秒,468 MB/[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980          95         800           9        1084        1710
Swap:          2047           0        2047
[root@localhost ~]# dd if=/tmp/big of=/dev/null 
记录了2048000+0 的读入
记录了2048000+0 的写出
1048576000字节(1.0 GB)已复制,1.92811 秒,544 MB/

四、linux磁盘的使用方法

4.1、磁盘初始化

一块新的磁盘使用必须初始化为MBR或者GPT分区。

  • MBR <2TB fdisk 4个主分区或者3个主分区+1个扩展分区(N个逻辑分区)

MBR(Master Boot Record)的缩写,由三部分组成,即:

  1. Bootloader(主引导程序)446字节
    • 引导操作系统的主程序
  2. DPT分区表(Disk Partition Table)64字节
    • 分区表保存了硬盘的分区信息,操作系统通过读取分区表内的信息,就能够获得该硬盘的分区信息
    • 每个分区需要占用16个字节大小,保存有文件系统标识、起止柱面号、磁头号、扇区号、起始扇区位置(4个字节)、分区总扇区数目(4个字节)等内容
    • 分区表中保存的分区信息都是主分区与扩展分区的分区信息,扩展分区不能直接使用,需要在扩展分区内划分一个或多个逻辑分区后才能使用
    • 逻辑分区的分区信息保存在扩展分区内而不是保存在MBR分区表内,这样,就可以突破MBR分区表只能保存4个分区的限制
  3. 硬盘有效标志(校验位)2个字节
  • GPT >2TB gdisk(parted) 128个主分区

注意:从MBR转到GPT,或从GPT转换到MBR会导致数据全部丢失

4.2、分区

将磁盘合理分区,能使计算机或者使用者更快的存取数据

​ MBR 主分区+扩展分区<=4

​ GPT 主分区<=128

4.3、格式化

装载文件系统(相当于库管,负责数据的写入和读出)。

​ 常见的文件系统:NTFS EXT EXT2 EXT3 EXT4 XFS vfat

4.4、挂载

linux中设备不能直接使用,需要挂载到文件夹才可以。

挂载方式:

  1. 手动挂载
  2. 开机挂载
  3. 自动挂载

五、基本分区管理

5.1、linux磁盘表示方法介绍

硬盘命名方式
OS IDE(并口) SATA(串口) SCSI
CentOS6 /dev/hda /dev/sda /dev/sda
CentOS7 /dev/sda /dev/sda /dev/sda
CentOS8 /dev/sda /dev/sda /dev/sda
磁盘设备的命名

/dev/sda2

s=硬件接口类型(sata/scsi),d=disk(硬盘),a=第1块硬盘(b,第二块),2=第几个分区
/dev/hd h=IDE硬盘 /dev/hdd3
/dev/vd v=虚拟硬盘 /dev/vdf7

HP服务器硬盘

/dev/cciss/c0d0
/dev/cciss/c0d0p1 c0第一个控制器, d0第一块磁盘, p1分区1
/dev/cciss/c0d0p2 c0第一个控制器, d0第一块磁盘, p2分区2

5.2、磁盘分区

1. 磁盘划分思路
  • 进入分区表 新建分区 fdisk
  • 更新分区表<刷新分区表>
  • 格式化分区——>文件系统
  • 挂载使用——>mount【开机自动挂载|autofs自动挂载】
2. fdisk分区
2.1 使用fdisk分区
# lsblk		查看块设备
# df -h  查看正在挂载的设备情况
# blkid  打印某个已经格式化分区的UUID
# fdisk -l		查看当前系统的所有设备分区情况
# fdisk  /dev/sdb


[root@localhost ~]# fdisk  -l /dev/sdb
硬盘容量 = 柱面数 × 盘面数(磁头数) × 扇区数 × 扇区大小(一般为512字节)
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors	磁盘空间统计,大小和扇区数量
几何属性:255 个磁头, 63 个扇区/磁道, 2610 个柱面
 ###此行内容只有在使用fdisk分区时,使用c命令加上与dos兼容的标记时才会出现,这里面所提到的磁头等数量与磁盘中的物理寻址和逻辑块寻址相关,而且它们都是逻辑地址,产生访问时,磁盘控制器会把这些确定的逻辑地址转换为实际的物理地址;对于我们来讲这几个数值可以帮助我们计算磁盘空间的大小以及一个磁柱的大小,比如说
 ##一个磁柱的容量=255x63x512=8225280(约8M空间)
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x178c5f83


 设备       启动    起点     末尾     扇区 		大小 Id 类型
/dev/sda1  *       2048  2099199  2097152   1G 83 Linux
/dev/sda2       2099200 41943039 39843840  19G 8e Linux LVM

命令(输入 m 获取帮助)

任务:

添加一块硬盘,需要将其分区,最终需要使用2G空间。

思路:
1. 增加一块硬盘
2. 使用fdisk命令进行分区
3. 格式化指定分区
4. 创建一个空的目录作为挂载点
5. 挂载使用

步骤:
1. 增加硬盘
增加完硬盘记得重启系统
# lsblk	查看硬盘是否添加成功
...
sdb           8:16   0   20G  0 disk 
[root@localhost ~]# fdisk -l /dev/sdb
Disk /dev/sdb:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
2. 使用fdisk命令分区
[root@localhost ~]# fdisk /dev/sdb

欢迎使用 fdisk (util-linux 2.32.1)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

设备不包含可识别的分区表。
创建了一个磁盘标识符为 0x0c7799c3 的新 DOS 磁盘标签。

命令(输入 m 获取帮助):p
Disk /dev/sdb:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0c7799c3

命令(输入 m 获取帮助):n
分区类型
   p   主分区 (0个主分区,0个扩展分区,4空闲)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p):p
分区号 (1-4, 默认  1): 
第一个扇区 (2048-41943039, 默认 2048): 
上个扇区,+sectors 或 +size{K,M,G,T,P} (2048-41943039, 默认 41943039): +1G

创建了一个新分区 1,类型为“Linux”,大小为 1 GiB。

命令(输入 m 获取帮助):p
Disk /dev/sdb:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x80e196f2

设备       启动  起点    末尾    扇区 大小 Id 类型
/dev/sdb1        2048 2099199 2097152   1G 83 Linux

命令(输入 m 获取帮助):n
分区类型
   p   主分区 (1个主分区,0个扩展分区,3空闲)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p):p
分区号 (2-4, 默认  2): 2
第一个扇区 (2099200-41943039, 默认 2099200): 
上个扇区,+sectors 或 +size{K,M,G,T,P} (2099200-41943039, 默认 41943039): +1G

创建了一个新分区 2,类型为“Linux”,大小为 1 GiB。

命令(输入 m 获取帮助):p
Disk /dev/sdb:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x80e196f2

设备       启动    起点    末尾    扇区 大小 Id 类型
/dev/sdb1          2048 2099199 2097152   1G 83 Linux
/dev/sdb2       2099200 4196351 2097152   1G 83 Linux

命令(输入 m 获取帮助):w
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。



3. 再次查看分区情况
# lsblk
sdb                       8:16   0   20G  0 disk 
├─sdb1                    8:17   0    1G  0 part 
└─sdb2                    8:18   0    1G  0 part 

4. 刷新分区表信息
[root@localhost ~]# partprobe /dev/sdb


5. 格式化分区
[root@localhost ~]# mkfs.xfs /dev/sdb1
[root@localhost ~]# mkfs.vfat /dev/sdb2

6. 创建新的挂载点
[root@localhost ~]# mkdir /u01
[root@localhost ~]# mkdir /u02

7. 挂载使用
[root@localhost ~]# mount /dev/sdb1 /u01
[root@localhost ~]# mount /dev/sdb2 /u02

注意

MBR分区表最多允许4个主分区,或者3个主分区+1个扩展分区

扩展分区不能直接存储数据

扩展分区的大小决定了所有逻辑分区的大小,逻辑分区的编号从5开始

删除扩展分区后下面的逻辑分区都被删除

分完区后需要手动刷新分区表,如果刷新不成功需要重启操作系统

创建分区的时候尽可能注意分区序号的连续性

2.2 挂载分区设备

手动挂载:

mount   [options]     需要挂载的设备     挂载点
特点:系统重启后需要重新挂载;手动卸载后需要手动挂载

-o:挂载选项	ro,sync,rw,remount
-t:文件系统类型
mount -t nfs=mount.nfs
mount -t cifs=mount.cifs

[root@localhost ~]# mount -o remount,ro /u02		//可以是挂载点也可以是设备
remount:重新挂载一个正在挂载的设备

# mount -o remount,ro /dev/sdb1		
# mount -o remount,ro /u01
注意:后面可以根挂载点也可以跟设备本身


挂载设备:真实设备、设备UUID,设备的卷标
/dev/sdb
/dev/sdb1
[root@localhost ~]# blkid /dev/sdb1				//查看设备的UUID和文件系统类型
/dev/sdb1: UUID="96b67b7b..." TYPE="xfs" PARTUUID="80e196f2-01"
[root@localhost ~]# blkid /dev/sdb2
/dev/sdb2: UUID="6821-049E" TYPE="vfat" PARTUUID="80e196f2-02"

ext*设置&查看卷标
[root@localhost ~]# e2label /dev/sdb1 DISK1			ext*设置卷标
[root@localhost ~]# e2label /dev/sdb1						ext*查看卷标

xfs设置&查看卷标
[root@localhost ~]# xfs_admin -L DISK1 /dev/sdb1	xfs设置卷标
[root@localhost ~]# xfs_admin -l /dev/sdb1				xfs查看卷标
label = "DISK1"

vfat设置&查看卷标
[root@localhost ~]# dosfslabel /dev/sdb2 hello
[root@localhost ~]# dosfslabel /dev/sdb2

也可以使用blkid查看卷标
[root@localhost ~]# blkid /dev/sdb1
/dev/sdb1: LABEL="DISK1" UUID="96.." TYPE="xfs" PARTUUID="80..-01"
[root@localhost ~]# blkid /dev/sdb2
/dev/sdb2: LABEL="disk2" UUID="6..." TYPE="vfat" PARTUUID="8e.2-02"


卸载设备:umount
[root@localhost ~]# umount /u01
[root@localhost ~]# umount /dev/sdb2


##如果希望将本机的某个文件夹挂到另一个文件夹
 mount -o bind /etc /opt/data3

开机自动挂载:

/etc/fstab        //开机自动挂载
特点:系统开机或重启会自动挂载;手动卸载后,使用mount -a自动挂载
格式:
要挂载的资源路径	挂载点	文件系统类型	挂载选项	dump备份支持  文件系统检测
UUID=289370eb-9459-42a8-8cee-7006507f1477   /      ext4    defaults        1 1
1段:挂载的设备(磁盘设备的文件名或设备的卷标或者是设备的UUID)
2段:挂载点(建议用一个空目录),建议不要将多个设备挂载到同一个挂载点上
3段:文件系统类型(ext3、ext4、vfat、ntfs(安装软件包)、swap等等)
4段:挂载选项
dev/nodev		被挂载的设备上的设备文件,是否被识别为设备文件
async/sync  异步/同步 同步利于数据保存 异步利于提高性能
auto/noauto     自动/非自动:
rw/ro   读写/只读:
exec/noexec     被挂载设备中的可执行文件是否可执行
remount     重新挂在一个已经挂载的文件系统,常用于修改挂载参数
user/nouser     允许/不允许其他普通用户挂载:
suid/nosuid     具有/不具有suid权限:该文件系统是否允许SUID的存在。
usrquota    这个是在启动文件系统的时候,让其支持磁盘配额,这个是针对用户的。
grpquota    支持用户组的磁盘配额。
....
defaults 同时具有rw, dev, exec,  async,nouser等参数。

mount -a  重新读取/etc/fstab文件内容

man mount 可以找到详细信息

5段:是否支持dump备份。//dump是一个用来备份的命令,0代表不要做dump备份,1代表要每天进行dump的动作,2也代表其他不定日期的dump备份。通常这个数值不是0就是1。数字越小优先级越高。

6段:是否用 fsck 检验扇区。//开机的过程中,系统默认会用fsck检验文件系统是否完整。0是不要检验,1表示最先检验(一般只有根目录会设定为1),2也是要检验,只是1是最先,2是其次才进行检验。

# fsck -f /dev/sdb2		强制检验/dev/sdb2上文件系统

说明:
要挂载的资源路径可以是文件系统的UUID,设备路径,文件系统的标签 ,光盘镜像文件(iso),亦或是来自网络的共享资源等

自动挂载 Automount:

特点:挂载是由访问产生;卸载是由超时产生;依赖于后台的autofs服务
思路:
1. 所有的监控都是由一个程序完成  autofs
2. 服务启动后才会监控挂载的设备
3. 修改配置文件来指定需要监控的设备


需求:让系统自动挂载/dev/sdb2设备,如果2分钟没有被用自动卸载

步骤:
1)安装autofs软件
[root@localhost ~]# rpm -q autofs
package autofs is not installed
[root@localhost ~]# dnf install autofs

[root@localhost ~]# rpm -q autofs
autofs-5.1.4-29.el8.x86_64
2)修改配置文件(指定需要监控的设备和挂载的目录)
vim /etc/auto.master		//定义一级挂载点/u01和子配置文件
/u01    /etc/auto.test	-t 120 或者 --timeout 120  单位秒   (设置超时时间去卸载)

vim /etc/auto.test			//子配置文件自己创建,定义二级挂载点和需要挂载的设备
test  -fstype=ext4,ro   :/dev/sdb2


3)重启服务
[root@localhost ~]# systemctl restart autofs

4)测试验证
[root@localhost ~]# ls /u01/test
[root@localhost ~]# df -h


后续补充:
如果想要将/dev/sdb2挂载到/u01下,怎么做?
vim /etc/auto.master
/-		/etc/auto.test

vim /etc/auto.test
/u01	-fstype=ext4 :/dev/sdb2

linux磁盘管理-逻辑卷

一、GPT磁盘管理

GPT分区工具:fdisk gdisk

gdisk分区

GPT  128个主分区
[root@localhost ~]# gdisk -l /dev/sdc
[root@localhost ~]# gdisk -l /dev/sdc   查看sdc信息
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present			###GPT分区无法使用


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. 
***************************************************************

Disk /dev/sdc: 41943040 sectors, 20.0 GiB
Model: VMware Virtual S
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): B228357D-34EC-4E47-BB81-A7312F3BCF8D
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 37748669 sectors (18.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2099199   1024.0 MiB  8300  Linux filesystem
   2         2099200         4196351   1024.0 MiB  8300  Linux filesystem




将MBR转换成GPT分区
[root@localhost ~]# gdisk /dev/sdc
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************


Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.



[root@localhost ~]# gdisk -l /dev/sdc
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present			###GPT可用了

Found valid GPT with protective MBR; using GPT.
Disk /dev/sdc: 41943040 sectors, 20.0 GiB
Model: VMware Virtual S
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 7CA4232A-4A9E-467D-AADD-BB84DB2126E3
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 41942973 sectors (20.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name



#再次分区
[root@localhost ~]# gdisk /dev/sdc
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +2G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): p
Disk /dev/sdc: 41943040 sectors, 20.0 GiB
Model: VMware Virtual S
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 7CA4232A-4A9E-467D-AADD-BB84DB2126E3
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 37748669 sectors (18.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         4196351   2.0 GiB     8300  Linux filesystem
Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.


[root@localhost ~]# partprobe /dev/sdc

2.创建文件系统(格式化)CentOS8默认使用xfs
[root@localhost ~]# mkfs.xfs -f /dev/sdc1


3.挂载
[root@localhost ~]# mkdir /disk1
[root@localhost ~]# mount -t xfs -o ro /dev/sdc1 /disk1		//手动挂载
[root@localhost ~]# umount /disk1		##卸载

二、逻辑卷介绍

逻辑卷:
逻辑卷(LVM):它是Linux环境下对磁盘分区进行管理的一种机制,它是建立在物理存储设备之上的一个抽象层,优点在于灵活管理。
特点:
1、动态在线扩容
2、离线裁剪
3、数据条带化
4、数据镜像

三、逻辑卷概念

请添加图片描述

  • 物理卷(Physical Volume,PV)

物理卷是底层真正提供容量,存放数据的设备,它可以是整个硬盘、硬盘上的分区等。

  • 卷组(Volume Group, VG)

卷组建立在物理卷之上,它由一个或多个物理卷组成。即把物理卷整合起来提供容量分配。
一个LVM系统中可以只有一个卷组,也可以包含多个卷组。

  • 逻辑卷(Logical Volume, LV)

逻辑卷建立在卷组之上,它是从卷组中“切出”的一块空间。它是最终用户使用的逻辑设备。逻辑卷创建之后,其大小可以伸缩。

  • 物理区域 PE(physical extent)

每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是能被LVM寻址的最小单元。PE的大小可指定,默认为4 MB。 PE的大小一旦确定将不能改变,同一个卷组中的所有物理卷的PE的大小是一致的。
4MB=4096kb=4096kb/4kb=1024个block

  • 逻辑区域 LE(logical extent)

逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。

流程

真实的物理设备---->物理卷(pv)---->卷组(vg)---->逻辑卷(lv)------>逻辑卷格式化---->挂载使用

四、逻辑卷管理

逻辑卷LVM应用
4.1 逻辑卷创建

需求:创建一个2.5G大小的逻辑卷

思路:
1. 物理的设备
2. 将物理设备做成物理卷
3. 创建卷组并将物理卷加入其中
4. 创建逻辑卷
5. 格式化逻辑卷
6. 挂载使用

步骤:
1. 物理设备
[root@localhost ~]# 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 /disk1
├─sdb2   8:18   0   2G  0 part 
├─sdb3   8:19   0   2G  0 part 
├─sdb4   8:20   0   2G  0 part 
└─sdb5   8:21   0   2G  0 part 


2. 创建物理卷
[root@localhost ~]# pvcreate /dev/sdb{1,2}
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdb2" successfully created.
查看物理卷:
[root@localhost ~]# pvs
  PV         VG Fmt  Attr PSize   PFree
  /dev/sda2  cl lvm2 a--  <19.00g    0 
  /dev/sdb1     lvm2 ---    2.00g 2.00g
  /dev/sdb2     lvm2 ---    2.00g 2.00g
[root@localhost ~]# pvscan 
  PV /dev/sda2   VG cl              lvm2 [<19.00 GiB / 0    free]
  PV /dev/sdb1                      lvm2 [2.00 GiB]
  PV /dev/sdb2                      lvm2 [2.00 GiB]
  Total: 3 [<23.00 GiB] / in use: 1 [<19.00 GiB] / in no VG: 2 [4.00 GiB]

[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   				#PE大小
  Total PE              0						#PE总数
  Free PE               0						#空闲PE
  Allocated PE          0						#可分配PE
  PV UUID               3M4...lT		#UUID


3. 创建卷组并将物理卷加入其中
[root@localhost ~]# vgcreate vg1 /dev/sdb{1,2}
  Volume group "vg1" successfully created
查看卷组信息:
[root@localhost ~]# vgs vg1
  VG  #PV #LV #SN Attr   VSize VFree
  vg1   2   0   0 wz--n- 3.99g 3.99g
  
[root@localhost ~]# vgscan	#扫描系统中有哪些卷组
  Reading all physical volumes.  This may take a while...
  Found volume group "vg1" using metadata type lvm2
  Found volume group "cl" using metadata type lvm2
  
 [root@localhost ~]# vgdisplay vg1
  --- Volume group ---
  VG Name               vg1
  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		#PE大小
  Total PE              1022				#PE数量
  Alloc PE / Size       0/0   		#已分配的PE/容量
  Free  PE / Size       1022/3.99 GiB	#可分配的PE/容量
  VG UUID               CQ6p...K9I

4. 创建逻辑卷
[root@localhost ~]# lvcreate -n lv1 -L 2.5G vg1 
  Logical volume "lv1" created.
在操作系统层面映射两个地方:
[root@localhost ~]# ll /dev/mapper/vg1-lv1 
lrwxrwxrwx 1 root root 7 12月 10 05:47 /dev/mapper/vg1-lv1 -> ../dm-2
[root@localhost ~]# ll /dev/vg1/lv1 
lrwxrwxrwx 1 root root 7 12月 10 05:47 /dev/vg1/lv1 -> ../dm-2
[root@localhost ~]# ll /dev/dm-2 
brw-rw---- 1 root disk 253, 2 12月 10 05:47 /dev/dm-2

lvcreate参数
-n:指定逻辑卷的名字
-L:指定逻辑卷的大小
-l:指定逻辑卷的大小
举例:
-l 100			100个PE,每个PE大小默认4M,故逻辑卷大小为400M
-l 50%free		卷组剩余空间的50%
[root@localhost ~]# vgs vg1 
  VG  #PV #LV #SN Attr   VSize VFree
  vg1   2   1   0 wz--n- 3.99g 1.49g
 
创建大小为200M的逻辑卷lv02;每个PE为4M,-l 50指定50个PE,大小为200M
[root@localhost ~]# lvcreate -n lv2 -l 50 vg1
  Logical volume "lv2" created.
[root@localhost ~]# vgs vg1 
  VG  #PV #LV #SN Attr   VSize VFree 
  vg1   2   2   0 wz--n- 3.99g <1.30g

[root@manage01 ~]# lvs /dev/vg01/lv02
  LV   VG   Attr       LSize   Pool Origin Data%  Move Log Cpy%Sync Convert
  lv02 vg01 -wi-a----- 200.00m  
  
创建大小为剩余卷组vg01空间的50%的逻辑卷lv03
[root@localhost ~]# lvcreate -n lv3 -l 50%free vg1
  Logical volume "lv3" created.
[root@localhost ~]# vgs vg1 
  VG  #PV #LV #SN Attr   VSize VFree  
  vg1   2   3   0 wz--n- 3.99g 664.00m

查看逻辑卷的信息:
[root@localhost ~]# lvs /dev/vg1/lv1 
  LV   VG  Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv1  vg1 -wi-a----- 2.50g                                                    
[root@localhost ~]# lvs /dev/vg1/lv2
  LV   VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv2  vg1 -wi-a----- 200.00m                                                    
[root@localhost ~]# lvs /dev/vg1/lv3
  LV   VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv3  vg1 -wi-a----- 664.00m                                                    
[root@localhost ~]# lvdisplay /dev/vg1/lv1 
  --- Logical volume ---
  LV Path                /dev/vg1/lv1
  LV Name                lv1
  VG Name                vg1
  LV UUID                jj9Sj1-zHuo-qpBZ-Dkk1-LVYB-HyUH-LQ6edW
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2019-12-10 05:46:59 -0500
  LV Status              available
  # open                 0
  LV Size                2.50 GiB
  Current LE             640
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

 
5. 格式化逻辑卷
[root@localhost ~]# mkfs.ext4 /dev/vg1/lv1 

6. 挂载使用
1)创建一个空的挂载点
[root@localhost /]# mkdir /lv1
2)挂载使用
[root@localhost /]# mount /dev/vg1/lv1 /lv1/

4.2 逻辑卷动态扩容

需求:将/lv1目录动态扩容到3G

思路:
1. 查看/lv1目录所对应的逻辑卷是哪一个  /dev/mapper/vg1-lv1
2. 查看当前逻辑卷所在的卷组vg1剩余空间是否足够
3. 如果vg1空间不够,得先扩容卷组,再扩容逻辑卷
4. 如果vg1空间足够,直接扩容逻辑卷

步骤:
1. 查看/lv1目录属于哪个卷组
[root@localhost /]# df -h
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/vg1-lv1  2.4G  7.5M  2.3G    1% /lv1

[root@localhost /]# lvs
  LV   VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root cl  -wi-ao---- <17.00g                                                    
  swap cl  -wi-ao----   2.00g                                                    
  lv1  vg1 -wi-ao----   2.50g                                                    
  lv2  vg1 -wi-a----- 200.00m                                                    
  lv3  vg1 -wi-a----- 664.00m                                                    
2. 卷组的剩余空间
[root@localhost /]# vgs
  VG  #PV #LV #SN Attr   VSize   VFree  
  cl    1   2   0 wz--n- <19.00g      0 
  vg1   2   4   0 wz--n-   3.99g 664.00m
结果:当前卷组空间不足我扩容

3. 扩容逻辑卷所在的卷组
1)首先得有物理设备 /dev/sdb3
2) 将物理设备做成物理卷
[root@localhost /]# pvcreate /dev/sdb3 
  Physical volume "/dev/sdb3" successfully created.
[root@localhost /]# pvs
  PV         VG  Fmt  Attr PSize   PFree  
  /dev/sda2  cl  lvm2 a--  <19.00g      0 
  /dev/sdb1  vg1 lvm2 a--   <2.00g      0 
  /dev/sdb2  vg1 lvm2 a--   <2.00g 464.00m
  /dev/sdb3      lvm2 ---    2.00g   2.00g
  3)将物理卷加入到卷组中(卷组扩容)
[root@localhost /]# vgextend vg1 /dev/sdb3 
  Volume group "vg1" successfully extended
[root@localhost /]# pvs
  PV         VG  Fmt  Attr PSize   PFree  
  /dev/sda2  cl  lvm2 a--  <19.00g      0 
  /dev/sdb1  vg1 lvm2 a--   <2.00g      0 
  /dev/sdb2  vg1 lvm2 a--   <2.00g 464.00m
  /dev/sdb3  vg1 lvm2 a--   <2.00g  <2.00g
  
注意:
正常情况下,应该先将/dev/sdb3物理设备创建为物理卷再加入到卷组中;如果直接加入卷组,系统会自动帮你将其做成物理卷。

[root@localhost /]# vgs
  VG  #PV #LV #SN Attr   VSize   VFree 
  cl    1   2   0 wz--n- <19.00g     0 
  vg1   3   4   0 wz--n-  <5.99g <2.45g

4. 扩容逻辑卷
[root@localhost /]# lvextend -L 3G /dev/vg1/lv1 
		-L 3G最终的大小
或者
[root@localhost /]# lvextend -L +1.5G /dev/vg1/lv1 	 -L +1.5G 扩容1.5G

5. 查看结果
[root@localhost /]# lvs
  LV   VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root cl  -wi-ao---- <17.00g                                                    
  swap cl  -wi-ao----   2.00g                                                    
  lv1  vg1 -wi-ao----   3.00g       已经扩容到了3G
  
[root@localhost /]# df -h
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/vg1-lv1  2.4G  7.5M  2.3G    1% /lv1
		实际并没有改变

6. 同步文件系统
[root@localhost /]# resize2fs /dev/vg1/lv1    #该命令适用于ext分区
[root@manage01  ~]# xfs_growfs /dev/vg1/lv1  #该命令适用于xfs分区
7. 再次查看验证
[root@localhost /]# df -h
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/vg1-lv1  2.9G  7.5M  2.8G    1% /lv1
		扩容成功


4.3 离线裁剪逻辑卷
[root@localhost /]# umount /lv1
[root@localhost /]# e2fsck -f /dev/vg1/lv1		检验文件系统
[root@localhost /]# resize2fs /dev/vg1/lv1  2G	裁剪文件系统到2G
[root@localhost /]# lvreduce /dev/vg1/lv1 -L 2G	裁剪逻辑卷
[root@localhost /]# mount /dev/vg1/lv1 /lv1/		挂载使用
[root@localhost /]# df -h
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/vg1-lv1  2.0G  9.0M  1.8G    1% /lv1


xfs裁剪
将lv2的文件系统格式化为xfs
将/dev/vg1/lv2挂载到/lv2
在/lv2中建立一个文件,写入内容
备份数据
卸载分区并裁剪逻辑卷
格式化裁剪后的逻辑卷
导入数据


1)备份数据命令
xfsdump
2)备份数据
[root@localhost /]# xfsdump -f /root/lv2.img /lv2
#挂载点目录后面不要加"/"
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)
 -> lv2
session label entered: "lv2"

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

xfsdump: level 0 dump of localhost.localdomain:/lv2
xfsdump: dump date: Tue Dec 10 06:33:44 2019
xfsdump: session id: 15936371-b967-4c2c-8995-49eb702792fe
xfsdump: session label: "lv2"
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: 20800 bytes

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

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

 --------------------------------- 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 21016 bytes
xfsdump: dump size (non-dir files) : 0 bytes
xfsdump: dump complete: 14 seconds elapsed
xfsdump: Dump Summary:
xfsdump:   stream 0 /root/lv2.img OK (success)
xfsdump: Dump Status: SUCCESS


3)裁剪
[root@localhost ~]# umount /lv2
[root@localhost ~]# lvreduce /dev/vg1/lv2 -L 100M
  WARNING: Reducing active logical volume to 2.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg01/lv01? [y/n]: y
  Size of logical volume vg01/lv01 changed from 7.00 GiB (1792 extents) to 2.00 GiB (512 extents).
  Logical volume vg01/lv01 successfully resized.

4)格式化
[root@localhost ~]# mkfs.xfs -f /dev/vg1/lv2
[root@localhost ~]# mount /dev/vg1/lv2 /lv2

5)恢复数据 -f source
[root@localhost ~]# xfsrestore -f /root/lv2.img /lv2
.
.
.
xfsrestore: Restore Status: SUCCESS


root@localhost ~]# df -h
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/vg1-lv2   95M  6.0M   89M    7% /lv2



[root@localhost ~]# cat /lv2/filea 
hahaha


4.4 删除LVM

建立: 分区–PV–VG–LV–挂载–fstab(autofs)–写入数据

删除: 备份重要数据–fstab(autofs)–卸载–LV–VG–PV–分区

1	备份数据(如果有需要)	
2	编辑fstab文件或者autofs服务相关文件,删除相关设置
3	卸载
[root@localhost ~]#umount /lv1
4	删除逻辑卷
[root@localhost ~]#lvremove	/dev/vg1/lv1
5	删除卷组
[root@localhost ~]#vgchange -an vg1 
[root@localhost ~]#vgremove vg1
6	删除物理卷
[root@localhost ~]#pvremove /dev/sdxx
7	删除分区
[root@localhost ~]#fdisk /dev/sdxx
[root@localhost ~]#partprobe

五、课程拓展

swap的作用:swap分区在系统的运行内存不够用的时候,把运行内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。可以缓解物理内存不足的压力,如果物理内存不足,还没有swap空间,会宕机

5.1、 扩容swap空间

方法1:增加一个设备(硬盘,分区,逻辑卷)来扩容swap空间

查看swap空间大小:
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3918        1309        2002          15         606        2358
Swap:          2047           0        2047

[root@localhost ~]# swapon -s
文件名				类型					大小			已用	权限
/dev/dm-1   partition		2097148			0		-2
[root@localhost ~]# mkswap /dev/sdb4
正在设置交换空间版本 1,大小 = 2 GiB (2147479552  个字节)
无标签,UUID=8235e59a-1043-4251-8694-ba619cb36f1c

[root@localhost ~]# blkid /dev/sdb4
/dev/sdb4: UUID="8...c" TYPE="swap" PARTUUID="b...e"

//激活swap分区。swap空间不能手动挂载
[root@localhost ~]# swapon /dev/sdb4
[root@localhost ~]# swapon -s
文件名						类型				大小		已用	权限
/dev/dm-1       partition	2097148		0		-2
/dev/sdb4       partition	2097148		0		-3


[root@localhost ~]# free -m
      total  used  free shared buff/cache available
Swap:  4095   0    4095

LVM形式
[root@localhost ~]# mkswap /dev/vg1/swap		#创建swap
[root@localhost ~]# swapon /dev/vg1/swap		#开启swap
[root@localhost ~]# lvextend -L 4G	/dev/vg1/swap	#放大LVM形式的swap
[root@localhost ~]# swapoff /dev/vg1/swap		#关闭lvm形式的swap
[root@localhost /]# mkswap /dev/vg1/lv-swap	#重新制作swap
[root@localhost ~]# swapon /dev/vg1/swap		#开启lvm形式的swap
[root@localhost ~]# free -m	#确认swap分区是否放大

方法2:使用dd命令模拟大文件来扩容swap

[root@localhost ~]# dd if=/dev/zero of=/tmp/swapfile bs=1M count=2048

if=源文件,in file指定从哪里读入数据
of=目标文件,out file指定将数据写入什么位置
bs=复制数据的大小,block size
count=复制的个数

注意:
1. 一般可以使用dd命令做块设备文件的备份
2. /dev/zero 特殊设备,一般用来模拟一个大文件,源源不断的二进制的数据流;
/dev/null  空设备,类似黑洞

步骤:
1. 使用dd命令模拟大文件
# dd if=/dev/zero of=/tmp/swapfile bs=1M count=2048
2. 格式化大文件
[root@localhost ~]# mkswap /tmp/swapfile 
mkswap: /tmp/swapfile:不安全的权限 0644,建议使用 0600。
正在设置交换空间版本 1,大小 = 2 GiB (2147479552  个字节)
无标签,UUID=3d855316-c97c-42ca-9c52-9df26a4517a0 
[root@localhost ~]# ll /tmp/swapfile 
-rw-r--r-- 1 root root 2147483648 12月 10 21:02 /tmp/swapfile
[root@localhost ~]# chmod 600 /tmp/swapfile 

3.激活大文件
[root@localhost ~]# swapon -p1 /tmp/swapfile
-p:指定优先级,数字越大优先级越高,-1~32767

4. 查看
[root@localhost ~]# swapon -s
文件名							类型				大小			已用	权限
/dev/dm-1         partition	2097148		 268	-2
/dev/sdb4         partition	2097148		 0		-3
/tmp/swapfile     file    	2097148		 0		 1
[root@localhost ~]# free -m
      total used  free  shared  buff/cache available
Swap:  6143  0    6143



如果开机自动挂载,需要修改文件:/etc/fstab
[root@localhost ~]# vim /etc/fstab 
/dev/sda4  			swap    swap     defaults       0 0
/tmp/swapfile   swap    swap     dfaults,pri=1  0 0
[root@localhost ~]# swapon -a

关闭swap
[root@localhost ~]# swapoff /dev/sdb4
[root@localhost ~]# swapoff /tmp/swapfile
或者
[root@localhost ~]# swapoff -a	#关闭所有swap****慎用*****
5.2、逻辑卷实现条带化
条带化:
        把保存到逻辑卷的数据分成n等分,分别写到不同的物理卷,可以提高数据的读写效率;如果任何一个涉及到的物理卷出现故障,数据都会无法恢复。
环境准备:
删除之前创建的逻辑卷
[root@localhost ~]# umount /lv1
[root@localhost ~]# lvremove /dev/vg1/lv1

[root@localhost ~]# lsblk
sdb           8:16   0   20G  0 disk 
├─sdb1        8:17   0    2G  0 part 
├─sdb2        8:18   0    2G  0 part


如果没有物理卷的话,需要先创建物理卷,再创建卷组,如果有物理卷和卷组的话可以直接创建条带化逻辑卷

创建物理卷
[root@manage01 ~]# pvcreate /dev/sdb[12]

查看物理卷
[root@manage01 ~]# pvs
/dev/sdb1            lvm2 a--   2.01g  2.01g
/dev/sdb2            lvm2 a--   2.01g  2.01g


创建卷组:
[root@manage01 ~]# vgcreate vg01 /dev/sdb[12]

[root@manage01 ~]# pvs /dev/sdb[12]
  PV         VG   Fmt  Attr PSize PFree
 /dev/sdb1  vg01      lvm2 a--   2.00g  2.00g
 /dev/sdb2  vg01      lvm2 a--   2.00g  2.00g


创建实现条带化的逻辑卷:
[root@localhost ~]# lvcreate -n lv1 -L 1G vg01 -i 2 /dev/sdb{1,2}

-i 参数:给出条带化的数量
[root@localhost ~]# lvs /dev/vg01/lv01


格式化挂载使用:
[root@localhost ~]# mkfs.ext4 /dev/vg1/lv1
[root@localhost ~]# mount /dev/vg1/lv1 /lv1


测试:
[root@localhost ~]# dnf install sysstat -y
[root@localhost ~]# iostat -m -d /dev/sdb[12] 2 
-d 查看磁盘
-m 以什么速度显示,每秒M
 2 每隔2s显示一次 
   如果后面还有数字则代表总共显示多少次
   
[root@localhost ~]# dd if=/dev/zero of=/lv1/test bs=1M count=1000    模拟写数据
[root@localhost ~]# iostat -m -d /dev/sdb[12] 1
.
.
.
Device tps  		MB_read/s  MB_wrtn/s MB_read MB_wrtn
sdb1   4015.00  0.01       364.38    0       364
sdb2   4005.00  0.00       364.33    0       364

5.3、逻辑卷实现镜像
逻辑卷实现镜像:
镜像:镜像是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。对某个逻辑卷的数据做镜像,起到数据备份的作用。

当前环境:
[root@localhost ~]# lsblk
├─sdb3        8:19   0    2G  0 part 
├─sdb4        8:20   0    2G  0 part 


创建物理卷:
[root@localhost ~]# pvcreate /dev/sdb[34]
[root@localhost ~]# pvs
  PV         VG  Fmt  Attr PSize   PFree 
  /dev/sdb3      lvm2 ---    2.00g  2.00g
  /dev/sdb4      lvm2 ---    2.00g  2.00g

  
 将物理卷加入到vg1卷组:
[root@localhost ~]# vgextend vg1 /dev/sdb[34]
  Volume group "vg1" successfully extended
[root@localhost ~]# vgs
  VG  #PV #LV #SN Attr   VSize   VFree
  vg1   4   1   0 wz--n-   7.98g 6.98g


创建实现镜像的逻辑卷:
[root@localhost ~]# lvcreate -n lv2 -L 1G vg1 -m 1 /dev/sdb[34]
  Logical volume "lv2" created.

-m参数:给出镜像的个数;1表示1个镜像

[root@localhost ~]# lvs -a -o +devices
[root@localhost ~]# lvs -a -o +devices
  LV             VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices                        
  root           cl  -wi-ao---- <17.00g                                                     /dev/sda2(512)                 
  swap           cl  -wi-ao----   2.00g                                                     /dev/sda2(0)                   
  lv1            vg1 -wi-ao----   1.00g                                                     /dev/sdb1(0),/dev/sdb2(0)      
  lv2            vg1 rwi-a-r---   1.00g                                    100.00           lv2_rimage_0(0),lv2_rimage_1(0)
  [lv2_rimage_0] vg1 iwi-aor---   1.00g                                                     /dev/sdb3(1)                   
  [lv2_rimage_1] vg1 iwi-aor---   1.00g                                                     /dev/sdb4(1)                   
  [lv2_rmeta_0]  vg1 ewi-aor---   4.00m                                                     /dev/sdb3(0)                   
  [lv2_rmeta_1]  vg1 ewi-aor---   4.00m                                                     /dev/sdb4(0)         

说明: Cpy%Sync 18.77该值是100%说明复制ok 


格式化逻辑卷:
[root@localhost ~]# mkfs.ext4 /dev/vg1/lv2
挂载使用
[root@localhost ~]# mount /dev/vg1/lv2 /lv2/

[root@localhost ~]# touch /lv2/file{1..10}
[root@localhost ~]# mkdir /lv2/dir{1..10}

 
测试验证:
思路:损坏一个磁盘,测试数据是否在第二个物理卷中
1. 使用dd命令破坏一个物理卷
[root@localhost ~]# dd if=/dev/zero of=/dev/sdb3 bs=1M count=100

2. 再次查看物理卷发现有一个unknown Device    pvs命令
 [unknown]  vg1 lvm2 a-m   <2.00g 1016.00m

3. 将损坏的盘从卷组中移除
[root@localhost ~]# vgreduce vg1 --removemissing --force

4. 再次查看挂载点/lv2数据依然存在

自己也可以再次测试:
1. 再拿刚刚人为损坏的盘做成物理卷再次加入到vg1卷组中
[root@localhost /]# pvcreate /dev/sdb3 
 
[root@localhost /]# vgextend vg1 /dev/sdb3


2. 修复
[root@localhost /]# lvconvert --repair /dev/vg1/lv2 /dev/sdb[34]

5.4、逻辑卷快照
快照的作用:保存做快照那一刻数据的状态,方便用户实现数据回滚,避免重要数据被覆盖。
快照的大小:快照需要占用卷组空间,快照的大小决定了允许有多少数据发生改变,如果制作快照时分配的容量与对应的逻辑卷相同,那么就允许逻辑卷中所有的数据发生改变。
COW:copy on write 当系统检测到做快照的逻辑卷当中的数据发生了改变,会在改变前将逻辑卷中的PE的数据复制到快照中的PE,然后再写入新的数据


1. 创建快照 (EXT4)
[root@localhost /]# lvcreate -L 200M -s -n lv1-snap /dev/vg1/lv1	给lv1逻辑卷创建快照
[root@localhost /]# mount -o ro /dev/vg1/lv1-snap /lv1-snap/	挂载快照

[root@localhost /]# lvscan 
  ACTIVE   Original '/dev/vg1/lv1' [2.00 GiB] inherit
  ACTIVE   Snapshot '/dev/vg1/lv1-snap' [200.00 MiB] inherit


[root@localhost /] dmsetup ls --tree
vg1-lv2--snap (252:5)
 ├─vg1-lv1--snap-cow (253:4)		保存原卷改变前的数据
 │  └─ (8:17)
 └─vg1-lv1-real (253:3)				真实的逻辑卷(原卷)
    ├─ (8:17)
    └─ (8:18)
vg1-lv1 (253:2)
 └─vg1-lv1-real (253:3)
    ├─ (8:17)
    └─ (8:18)
    
2. 修改原卷的数据
[root@localhost /]# dd if=/dev/zero of=/lv1/test bs=1M count=30

3. 观察Snapshot
[root@localhost /]# lvs /dev/vg1/lv1-snap 
  LV       VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv1-snap vg1 swi-aos--- 200.00m      lv1    0.02                                   
[root@localhost /]# lvs /dev/vg1/lv1-snap 
  LV       VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv1-snap vg1 swi-aos--- 200.00m      lv1    15.10                                  
  

XFS:
[root@node1 ~]# mount -o nouuid,ro /dev/vg1/lv1-snap /lv1-snap
挂载快照,尽量使用ro的方式,将不会破坏快照卷中的数据


快照实现自动扩容:
/etc/lvm/lvm.conf 
snapshot_autoextend_threshold = 80
snapshot_autoextend_percent = 20
//当快照使用到80%时,自动扩容20%;当snapshot_autoextend_threshold = 100表示关闭自动扩容

修改完成后建议重启

linux磁盘管理-RAID

一、RAID介绍

RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘,同时希望磁盘失效时不会使对数据的访问受损失而开发出一定水平的数据保护技术。RAID就是一种由多块廉价磁盘构成的冗余阵列,在操作系统下是作为一个独立的大型存储设备出现。RAID可以充分发挥出多块硬盘的优势,可以提升硬盘速度,增大容量,提供容错功能,能够确保数据安全性,易于管理的优点,在任何一块硬盘出现问题的情况下都可以继续工作,不会 受到损坏硬盘的影响。

二、常见的RAID级别

1. RAID0

请添加图片描述

RAID0特点:

  • 至少需要两块磁盘
  • 数据条带化分布到磁盘,高的读写性能,100%高存储空间利用率
  • 数据没有冗余策略,一块磁盘故障,数据将无法恢复
  • 应用场景:
    • 对性能要求高但对数据安全性和可靠性要求不高的场景,比如音频、视频等的存储。
2. RAID1

请添加图片描述

RAID1特点:

  • 至少需要2块磁盘
  • 数据镜像备份写到磁盘上(工作盘和镜像盘),可靠性高,磁盘利用率为50%
  • 读性能可以,但写性能不佳
  • 一块磁盘故障,不会影响数据的读写
  • 应用场景:
    • 对数据安全可靠要求较高的场景,比如邮件系统、交易系统等。
3. RAID5

请添加图片描述

RAID5特点:

  • 至少需要3块磁盘
  • 数据条带化存储在磁盘,读写性能好,磁盘利用率为(n-1)/n
  • 以奇偶校验(分散)做数据冗余
  • 一块磁盘故障,可根据其他数据块和对应的校验数据重构损坏数据(消耗性能)
  • 是目前综合性能最佳的数据保护解决方案
  • 兼顾了存储性能、数据安全和存储成本等各方面因素(性价比高)
  • 适用于大部分的应用场景
4. RAID6

请添加图片描述

RAID6特点:

  • 至少需要4块磁盘
  • 数据条带化存储在磁盘,读取性能好,容错能力强
  • 采用双重校验方式保证数据的安全性
  • 如果2块磁盘同时故障,可以通过两个校验数据来重建两个磁盘的数据
  • 成本要比其他等级高,并且更复杂
  • 一般用于对数据安全性要求非常高的场合
5. RAID10

请添加图片描述

RAID10特点:

  • RAID10是raid1+raid0的组合
  • 至少需要4块磁盘
  • 两块硬盘为一组先做raid1,再将做好raid1的两组做raid0
  • 兼顾数据的冗余(raid1镜像)和读写性能(raid0数据条带化)
  • 磁盘利用率为50%,成本较高
6. 总结
类型 读写性能 可靠性 磁盘利用率 成本
RAID0 最好 最低 100% 较低
RAID1 读快;写一般 50%
RAID5 读:近似RAID0 写:多了校验 RAID0<RAID5<RAID1 (n-1)/n RAID0<RAID5<RAID1
RAID6 读:近似RAID0 写:多了双重校验 RAID6>RAID5 RAID6<RAID5 RAID6>RAID1
RAID10 读:RAID10=RAID0 写:RAID10=RAID1 50% 最高

三、软硬RAID

1. 软RAID

软RAID运行于操作系统底层,将SCSI或者IDE控制器提交上来的物理磁盘,虚拟成虚拟磁盘,再提交给管理程序来进行管理。软RAID有以下特点:

  • 节省成本,系统支持就可以使用相应功能
  • 占用内存空间
  • 占用CPU资源
  • 如果程序或者操作系统故障就无法运行
2. 硬RAID

通过用硬件来实现RAID功能的就是硬RAID,独立的RAID卡,主板集成的RAID芯片都是硬RAID。RAID卡就是用来实现RAID功能的板卡。硬RAID的特点:

  • 硬RAID有独立的运算单元,性能好
  • 可能需要单独购买额外的硬件
  • 不同RAID卡支持的功能不同,需要根据自己的需求选择

四、软raid创建

0. 环境准备

添加一个20G的虚拟硬盘,分成10个2G的分区

1. raid的创建

#####创建RAID0

系统中如果没有mdadm命令请安装相关工具:
[root@localhost ~]# which mdadm
/usr/sbin/mdadm
[root@localhost ~]# rpm -qf /usr/sbin/mdadm 
mdadm-4.1-4.el8.x86_64
[root@localhost ~]# dnf install -y mdadm

创建raid0:
[root@localhost ~]# mdadm --create /dev/md0 --raid-devices=2 /dev/sdb1 /dev/sdb2 --level=0
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
或者
[root@localhost ~]# mdadm -C /dev/md0 -l 0 -n 2 /dev/sdb1 /dev/sdb2
-C:创建软raid
-l:指定raid级别
-n:指定raid中设备个数

查看RAID信息:
/proc/mdstat文件记录了所有raid信息
[root@localhost ~]# cat /proc/mdstat 
Personalities : [raid0] 
md0 : active raid0 sdb2[1] sdb1[0]
#md0为raid0,两个成员sdb2(第二个成员),sdb1(第一个成员)
      41905152 blocks super 1.2 512k chunks
#一共有多少个块(每块1K)	数据段的大小是512K
#chunk决定了阵列中每个成员盘写入的数据量,大于这个值才会到下一个盘读写
unused devices: <none>

查看指定的RAID信息:
[root@localhost ~]# mdadm -D/--detail /dev/md0
[root@localhost ~]# mdadm  --detail /dev/md0
/dev/md0:	#名称
         Version : 1.2	#工具版本
   Creation Time : Wed Dec 11 03:05:31 2019	#建立时间
   Raid Level : raid0	#类型
   Array Size : 41905152 (39.96 GiB 42.91 GB)#容量
   Raid Devices : 2	#组成RAID的硬盘数量
   Total Devices : 2#成员总数,包含备用磁盘
   Persistence : Superblock is persistent

   Update Time : Wed Dec 11 03:05:31 2019
   State : clean 	#raid的状态
   Active Devices : 2	#活跃的设备数量
   Working Devices : 2	#工作的设备数量
   Failed Devices : 0	#故障的数量
   Spare Devices : 0	#备用设备数量

   Chunk Size : 512K	

	 Consistency Policy : none

   Name : localhost.localdomain:0  (local to host localhost.localdomain)
   UUID : 06b2d3b2:3ace3ddf:b5b65dd7:eb40b040
   Events : 0

Number Major Minor RaidDevice State
 0     8     17    0      	active sync   /dev/sdb1
 1     8     33    1      	active sync   /dev/sdb2

格式化挂载使用:
[root@localhost ~]# mkfs.ext4 /dev/md0
[root@localhost ~]# mkdir /md0
[root@localhost ~]# mount /dev/md0 /md0/


查看空间使用情况:
[root@localhost ~]# df -h
文件系统             容量  已用  可用 已用% 挂载点
/dev/md0           3.9G  16M  3.7G    1% /md0
#可用空间100%


测试:
[root@localhost ~]# iostat -m -d /dev/sdb1 /dev/sdb2 2
[root@server ~]# dd if=/dev/zero of=/md0/file bs=1M count=1024


创建RAID1
创建raid1:
[root@localhost ~]# mdadm -C /dev/md1 -l 1 -n 2 /dev/sdb3 /dev/sdb4 
查看状态信息:
root@localhost ~]# watch -n1 "cat /proc/mdstat" 	watch命令监控该文件变化情况,1秒钟显示一次
或者直接查看
[root@localhost ~]# cat /proc/mdstat 
Personalities : [raid0] [raid1] 
md1 : active raid1 sdb4[1] sdb3[0]
      20953024 blocks super 1.2 [2/2] [UU]
      #两个UU说明状态ok,一个盘故障则显示_U
      [==============>......]  resync = 73.5% (15404032/20953024) finish=0.4min speed=205582K/sec
unused devices: <none>
      #以上信息说明两块盘在进行同步,100%说明同步完成

查看raid1详细信息
[root@localhost ~]# mdadm -D /dev/md1   

格式化挂载使用:
[root@localhost ~]# mkfs.ext4 /dev/md1
[root@localhost ~]# mount /dev/md1 /md1

查看空间使用情况:
[root@localhost ~]# df -h
文件系统             容量  已用  可用 已用% 挂载点
/dev/md1            2.0G  6.0M  1.9G    1% /md1
#可用空间50%

测试验证热插拔:
1. 模拟一块盘故障(将磁盘标记为失效)
[root@localhost ~]# mdadm /dev/md1 -f /dev/sdb3
mdadm: set /dev/sdb1 faulty in /dev/md1

#-f or --fail  表示失效

2. 查看raid1状态
[root@localhost ~]# cat /proc/mdstat 
Personalities : [raid0] [raid1] 
md1 : active raid1 sdb4[1] sdb3[0](F)	F表示失效失败
      20953024 blocks super 1.2 [2/1] [_U]
      #_表示有一块盘失效
unused devices: <none>

[root@localhost ~]# mdadm -D /dev/md1
。。。
Number Major Minor RaidDevice State
-      0     0     0      		removed
1      8     33    1          active sync  /dev/sdb4
0      8     17    -          faulty       /dev/sdb3
 #失效盘等待移除
       
3. 移除故障或者失效硬盘(热拔)
[root@localhost ~]# mdadm /dev/md1 -r /dev/sdb3
mdadm: hot removed /dev/sdb3 from /dev/md1

#-r or --remove 表示移除

[root@localhost ~]# mdadm -D /dev/md1
。。。
  Number   Major   Minor   RaidDevice State
       -       0        0        0      removed
       1       8       33        1      active sync   /dev/sdb4

4. 加入新的磁盘到raid1中(热插)
[root@localhost ~]# mdadm  /dev/md1 -a /dev/sdb5
mdadm: added /dev/sdd5

#-a or --add 表示增加

[root@localhost ~]# cat /proc/mdstat 

创建RAID5
创建raid5:
[root@localhost ~]# mdadm -C /dev/md5 -l 5 -n 3 -x 1 /dev/sdb{6,7,8,9}

#-x, --spare-devices=  表示指定热备盘

[root@localhost ~]# cat /proc/mdstat 
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] 
md5 : active raid5 sdb8[4] sdb9[3](S) sdb7[1] sdb6[0]	#S备用盘
      4188160 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      
unused devices: <none>


说明:热备盘表示当其中一块盘故障后,热备盘会立马顶上去,而不需要人为手动干预。

[root@localhost ~]# mdadm -D /dev/md5 		查看详细信息
。。。
    Number   Major   Minor   RaidDevice State
       0       8       22        0      active sync   /dev/sdb6
       1       8       23        1      active sync   /dev/sdb7
       4       8       24        2      active sync   /dev/sdb8

       3       8       25        -      spare   /dev/sdb9


格式化挂载使用:
[root@localhost ~]# mkfs.ext4 /dev/md5
[root@localhost ~]# mkdir /md5
[root@localhost ~]# mount /dev/md5 /md5/


查看空间使用情况:
[root@localhost ~]# df -h
文件系统             容量  已用  可用 已用% 挂载点
/dev/md5             3.9G   16M  3.7G    1% /md5
#可用空间 (磁盘数量-1)x 单一磁盘容量

测试热备磁盘作用:
1. 标记一块活动盘失效
[root@localhost /]# mdadm /dev/md5 -f /dev/sdb6
mdadm: set /dev/sdb6 faulty in /dev/md5

立即查看状态:
[root@localhost /]# cat /proc/mdstat 
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] 
md5 : active raid5 sdb8[4] sdb9[3] sdb7[1] sdb6[0](F)
说明:
sdb6(F)失效后,原来的sdb9(S)热备盘立马顶上去同步数据
      4188160 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]
      [==>..................]  recovery = 13.0% ..          
unused devices: <none>

[root@localhost /]# mdadm -D /dev/md5
...
      Number   Major   Minor   RaidDevice State
       3       8       25        0      active sync   /dev/sdb9
       1       8       23        1      active sync   /dev/sdb7
       4       8       24        2      active sync   /dev/sdb8

       0       8       22        -      faulty   /dev/sdb6

       
2. 移除失效的盘
[root@localhost /]# mdadm  /dev/md5 -r /dev/sdb6 
mdadm: hot removed /dev/sdb6 from /dev/md5


3. 为了日后考虑,再次添加一个热备盘到raid5中
[root@localhost /]# mdadm /dev/md5 -a /dev/sdb6
mdadm: added /dev/sdb6
2. 保存RAID信息
问:为什么要保存raid信息?
答:如果不做信息的保存,在CentOS6中,重启系统后raid不能自动被识别到,7,8系统中不会出现这种状况。
1. 创建配置文件
[root@localhost ~]# mdadm -D --scan >> /etc/mdadm.conf 
[root@localhost ~]# cat /etc/mdadm.conf 
ARRAY /dev/md/1 metadata=1.2 name=localhost.localdomain:1 UUID=170d690d:4f7ccd02:646c3ce0:8f6012be
ARRAY /dev/md/0 metadata=1.2 name=localhost.localdomain:0 UUID=a845702e:9251cae9:25d1bc8b:9a337df2
ARRAY /dev/md/5 metadata=1.2 spares=1 name=localhost.localdomain:5 UUID=d49e6cca:5312271b:7e8e83d5:adac4ed5

3. raid停止与启动
以RAID5为例说明:
停止raid:
1. 卸载raid
[root@localhost ~]# umount /md5 
2. 使用命令停止raid
[root@localhost ~]# mdadm --stop /dev/md5
mdadm: stopped /dev/md5

启动raid:
1. 配置文件(/etc/mdadm.conf)存在如下启动
[root@localhost ~]# mdadm -A /dev/md5
mdadm: /dev/md5 has been started with 3 drives and 1 spare.

#-A:Assemble a pre-existing array  表示装载一个已存在的raid

2. 配置文件(/etc/mdadm.conf)不存在如下启动
[root@localhost ~]# mdadm -A /dev/md5 /dev/sdb[6789]
mdadm: /dev/md5 has been started with 3 drives and 1 spare.

3. 如果设备名不知道,可以去查看每个设备的raid信息,使用uuid把raid设备重新组合
[root@localhost ~]# mdadm -E /dev/sdb6 | grep UUID
     Array UUID : d49e6cca:5312271b:7e8e83d5:adac4ed5
    Device UUID : b933b8d5:04a6e003:90e9b230:d13cacf5

 说明:同一个raid里每个磁盘查看的UUID都是这个值
。。。
[root@localhost ~]# mdadm -E /dev/sdb7 | grep UUID
     Array UUID : d49e6cca:5312271b:7e8e83d5:adac4ed5
    Device UUID : b8ca85bd:7809faa4:48882a21:98ef9349

通过以上方法找到后进行重新组合,如下:
[root@localhost ~]# mdadm -A --uuid=d49e6cca:5312271b:7e8e83d5:adac4ed5 /dev/md5
mdadm: /dev/md5 has been started with 3 drives and 1 spare.

4. raid的删除
1. 卸载设备
[root@localhost ~]# umount /md5/
2. 移除所有磁盘
[root@localhost ~]# mdadm /dev/md5 -f /dev/sdb[6789]
mdadm: set /dev/sdb6 faulty in /dev/md5
mdadm: set /dev/sdb7 faulty in /dev/md5
mdadm: set /dev/sdb8 faulty in /dev/md5
mdadm: set /dev/sdb9 faulty in /dev/md5
[root@localhost ~]# mdadm /dev/md5 -r /dev/sdb[6789]
mdadm: hot removed /dev/sdb6 from /dev/md5
mdadm: hot removed /dev/sdb7 from /dev/md5
mdadm: hot removed /dev/sdb8 from /dev/md5
mdadm: hot removed /dev/sdb9 from /dev/md5

3. 停止raid
[root@localhost ~]# mdadm --stop /dev/md5
mdadm: stopped /dev/md5

4. 擦出超级块(superblock)清除相关信息
[root@localhost ~]# mdadm --zero-superblock /dev/sdb[6789]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

zutuanxue.com-linux磁盘管理基本管理 的相关文章

  • 虚拟内存澄清——大连续内存的分配

    我有一个应用程序 我必须在 Windows 上分配 使用运算符 new 相当大的内存空间 数百 MB 该应用程序是 32 位 我们现在不使用 64 位 即使在 64 位系统上也是如此 我启用了 LARGEADDRESSAWARE 链接器选项
  • EULA 接受 Bash 脚本

    我有一个尝试安装垃圾箱的脚本 除了 bin 在 more 中打开 EULA 之外 一切正常 在脚本再次开始并自行完成安装之前 您必须手动 ctrl c 退出此 more 实例 因为这更多的是逃离 shell 所以脚本在打开后不知道要运行什么
  • 使用 Vala 和 GLib 的正则表达式

    有没有一个函数 比如http php net manual en function preg match all php http php net manual en function preg match all php 使用 GLibh
  • X 按键/释放事件捕获,与焦点窗口无关

    我想记录所有传入的按键事件 无论哪个窗口处于焦点状态或指针位于何处 我编写了一个示例代码 它应该捕获当前焦点窗口的按键事件 include
  • 使用 hcitool 扫描低功耗蓝牙?

    当我运行此命令时 BLE 设备扫描仅持续 5 秒 sudo timeout 5s hcitool i hci0 lescan 输出显示在终端屏幕中 但是 当我将输出重定向到文件以保存广告设备的地址时 每次运行该命令时 我都会发现该文件是空的
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 在 CentOS 中安装 PHP Zip 扩展

    我正在尝试在 CentOS 中安装 PHP Zip 扩展 我的服务器没有外部互联网访问权限 所以我自己从 PECL 下载了它 http pecl php net package zip http pecl php net package z
  • 如何清理 Runtime.exec() 中使用的用户输入?

    我需要通过命令行调用自定义脚本 这些脚本需要很少的参数并在 Linux 机器上调用 当前版本容易出现各种shell注入 如何清理用户给出的参数 参数包括登录名和路径 Unix 或 Windows 路径 用户应该能够输入任何可能的路径 该路径
  • 如何从命令行执行 PHP 代码?

    我想执行单个 PHP 语句 例如if function exists my func echo function exists 直接使用命令行 无需使用单独的 PHP 文件 这怎么可能 如果您要在命令行中执行 PHP 我建议您安装phpsh
  • X 服务器使用什么像素格式?

    X 服务器使用什么像素格式 RGBA ARBG BGRA 如果有任何特定格式的话 Update 我专门寻找有关颜色分量顺序和位模式的信息 你的意思是帧缓冲区格式 或者所有支持的像素图格式 无论是哪一种 都取决于您的图形硬件 驱动程序和配置
  • 在哪里可以找到所有 C 标准库的源代码?

    我正在寻找所有 C 标准库的完整源代码 也就是说 我正在寻找 stdio h stdlib h string h math h 等的源代码 我想看看它们是如何创建的 我认为这取决于不同的平台 但 Linux 或 Windows 都会受到欢迎
  • OS X 对 /usr/local/lib 的权限被拒绝

    我正在寻找有关权限问题的任何建议 直觉 线索 答案 自从我切换到新的 Macbook Pro 以来 这个问题一直困扰着我 这就是困境 某些程序在安装期间复制 usr local lib 下的库 并且在运行这些程序时出现崩溃 我认为这与此文件
  • 如何在 Linux 中显示进程状态(阻塞、非阻塞)

    有没有办法查询 Linux 进程表中进程的状态 以便能够演示执行查询时进程是正在运行还是被阻止 我的目标是从进程或程序的 外部 执行此操作 因为我希望从操作系统进程的角度来理解这一点 但欢迎任何想法 这是Python代码阻塞的过程 impo
  • Python pip 安装错误 [SSL: CERTIFICATE_VERIFY_FAILED]

    我已经尝试解决这个问题有一段时间了 由于某种原因 我陷入了 ssl 问题 并且不知道发生了什么 问题 我已经安装了 python2 7 和 easy install2 7 但是当尝试使用 easy install2 7 安装 pip 时 出
  • /usr/bin/as:无法识别的选项“-EL”

    因此 在为我的1plus手机编译android内核时 经过3天的多次尝试 我放弃了并尝试在这里询问是否有人以前遇到过这个问题 这个错误对我来说有点模糊 但我觉得问题来自于我最近对 GNU Linux 发行版 Gentoo 的更改 它在不应该
  • Docker 容器可以访问 DNS,但无法解析主机

    我在运行 docker 容器时遇到一个有趣的问题 突然间 我无法从容器内解析 DNS 这是一个概要 一切都没有解决 apt get pip 一次性 ping 容器等正在运行docker run it dns 8 8 8 8 ubuntu p
  • Tk 初始化失败:无显示名称且无 $DISPLAY 环境变量

    我试图从 Ubuntu 终端调用 Centos 服务器上的工具 我收到以下错误 Tk 初始化失败 没有显示名称 也没有 DISPLAY 环境变量 请帮我解决这个问题 提前致谢 连接到你的 CentOS 机器ssh Y其中 每man ssh
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • 检查 Linux 中给定进程的打开 FD 限制

    我最近有一个 Linux 进程 泄露 了文件描述符 它打开了文件描述符 但没有正确关闭其中一些文件描述符 如果我对此进行监控 我就可以提前得知该过程已达到其极限 有没有一种很好的 Bash 或 Python 方法来检查 Ubuntu Lin
  • Python 线程与 Linux 中的多处理

    基于此question https stackoverflow com questions 807506 threads vs processes in linux我假设创建新流程应该几乎和创造新线程在Linux中 然而 很少的测试显示出截

随机推荐

  • 蓝绿发布、滚动发布、灰度发布,有什么区别?

    目录 01 蓝绿发布 02 滚动发布 03 灰度发布 04 A B测试 在项目迭代的过程中 不可避免需要 上线 上线对应着部署 或者重新部署 部署对应着修改 修改则意味着风险 目前有很多部署发布的技术 这儿将常见的做一个总结 举一个情景例子
  • 第一次使用Xshell服务器跑程序(保姆教程)

    前期准备 1 提前下载好Xshell和Xftp 2 有自己的服务器账号名 密码 服务器IP 默认端口号 我的是组里师兄给我创建的 以上两步下载注册步骤可以参考文章1和文章2 3 我的服务器默认安装好了Anaconda3和cuda11 1 1
  • Flutter之状态管理Provider使用和详解

    在前端页面 状态管理和消息传递一直是我们开发一个交互性好 体验好的前端应用或者APP必须要提到的东西 设想一下我们需要两个组件之间共享数据 而且两个组件之间具有联动效果 对于Flutter来说我们能够把数据保存到一个全局变量 然后每次使用的
  • Spring源码分析之createBean主流程分析

    我们知道 在调用getBean获取bean实例的实例 首先会从缓存中获取bean实例 如果没有获取到 就会去创建bean的时候 关于获取bean实例 可以参考Spring源码分析之getBean主流程分析 而本文将会对创建bean实例的主流
  • 分享一个前后端分离的web项目(vue+spring boot)

    Github地址 https github com smallsnail wh 前端项目名为wh web 后端项目名为wh server 项目展示地址为我的github pages https smallsnail wh github io
  • simple and useful command lines

    pip list grep package name 显示获取已安装包的信息 包名与版本号 pip show package name 能显示该安装的包的相关信息 其中包括它的安装路径 实际上包通常被安装在python安装目录下的lib s
  • Numpy学习笔记

    文章目录 常用函数 np linspace numpy arange start end step dtype numpy tile A reps np array numpy ndim A np flatten np reshape np
  • RPA机器人有效解决低效能业务流程升级难点

    企业的数字化 自动化转型是一个综合命题 RPA也绝非是低效套用的通用模板 在决策各个阶段的关键要点都需要量体裁衣 细致考量 为了达到更好的效果 企业在从厘清内部需求阶段就应引入专业的咨询人员有针对性地开展交流和指导 以结果为导向 协助企业全
  • ue4 命令行编译 烘焙 打包 存档

    首先是官方wiki的说明 How to package your game with commands Jump to navigation search Template Rating This aims to be a quick gu
  • 爬虫做js逆向分析的思路

    1 为什么要做逆向 正常我们访问一个网站是由html css js 文件组成的 下图是某网站的正常访问 当然我们也可以看到是谁调用了这个请求执行了什么 2图为某网站登录链接 分析URL 我们可以看到这个链接他的请求参数 传输方式等 我们可以
  • 蚁群算法原理及matlab代码实现

    蚁群算法基本原理 背景 在自然界中 生物群体所表现出的智能得到越来越多的关注 许多的群智能优化算法都是通过对群体智能的模拟而实现的 其中模拟蚂蚁群体觅食的蚁群算法成为一种主要的群智能算法 算法原理 在自然界中 对于觅食的蚂蚁群体 其可以在任
  • MATLAB PreScan CarSim 联合仿真

    参考视频 PreScan carsim simulink联合仿真 哔哩哔哩 bilibili 参考文档 matlab carsim prescan联合仿真从零开始详细步骤 版本 MATLAB2021b Prescan8 5 CarSim20
  • java注解-ElementType详解

    java注解使用是相当频繁 特别是在搭建一些框架时 用到类的反射获取方法和属性 用的尤其多 java中元注解有四个 Retention Target Document Inherited Retention 注解的保留位置 Retentio
  • go安装

    windows 1 建议去go语言中文网下载 网址 https studygolang com dl 2 配置环境变量 先创建GOPANTH 再配置path 如图 3 检测环境是否安装成功
  • python - os.walk()

    介绍 讲解 概述 os walk 方法用于通过在目录树中游走输出在目录中的文件名 向上或者向下 os walk 方法是一个简单易用的文件 目录遍历器 可以帮助我们高效的处理文件 目录方面的事情 语法 walk 方法语法格式如下 os wal
  • Android反编译apk逆向分析

    Android反编译apk 反编译 逆向 软件下载地址 反编译 逆向 反编译 高级语言源程序经过 编译 变成可执行文件 反编译就是逆过程 但是通常不能把可执行文件变成高级语言源代码 只能转换成汇编程序 计算机软件反向工程 Reversepe
  • QNX网络驱动-设备驱动编写处理方式

    锋影 e mail 174176320 qq com 第一部分 QNX系统的安装与使用 1 QNX的微内核 甚至不包括进程管理 仅提供进程间的通信 Software Bus 但在实际编译的系统中 仍然是进程调度 同步 进程间通信等编译在同一
  • Spring的基本使用

    大家好我是栋zzzz 今天介绍一下Spring的基本使用 为了更好的熟悉Spring 可以先看一下我前面的文章 初识Spring 目录 一 Spring的创建和使用 1 创建一个Maven项目 2 添加Spring框架支持 3 添加启动类
  • YOLO系列训练时出现loss出现nan值或者测试时P\R\map全部为0值的解决办法(GTX16xx系列显卡大坑)

    目录 0 前言 用处不大 可以直接看解决办法 1 产生问题的原因 2 解决办法 YOLO V5 YOLO V7 2 小结 这个问题是GTX16xx用户的大坑 基本上每个GTX16xx用户使用YOLO系列算法 都会遇到这些问题 这个方法是不彻
  • zutuanxue.com-linux磁盘管理基本管理

    linux磁盘管理基本管理 开课 本章我们将学习到磁盘管理的相关知识 这部分知识在我们以后的工作中非常重要 它可以让我们知道如何去规划磁盘 如何去使用磁盘 如何去提高磁盘的利用率 这些都会影响服务器的性能和效率 而服务器性能和效率会影响到我