Linux磁盘管理

TOC

一、磁盘基础管理

磁盘基本认知

基本磁盘:包含主磁盘分区、扩展分区、逻辑分区
分区方式:MBR(只能分四个区)  GPT(可以分很多个区)
文件系统:ntfs、fat32、ext4、xfs
RAID磁盘阵列分类:

  • RAID0:相当于带区卷
  • RAID1:相当于镜像卷
  • RAID5:至少3个硬盘以上,占用1/n的容量存放奇偶校验码,只能坏1个硬盘(n为硬盘数)(公司最为常用)
  • RAID6:至少4个硬盘以上,占用2/n的容量存放奇偶校验码,能坏2个硬盘(n为硬盘数)
  • RAID1+0:相当于RAID0和RAID1的结合+,实际使用容量为1/2
    磁盘创建步骤
    1.联机磁盘——> 2.设置成动态硬盘——> 3.选择添加分区卷
    分区卷分类:
  • 简单卷:单个磁盘就可以创建
  • 跨区卷:跨磁盘分区,至少两个磁盘,容量可以不一样,用完第一个再用第二个,全部容量能用
  • 带区卷(RAID0):跨磁盘分区,至少两个磁盘,容量一样,文件均分配(不安全)
  • 镜像卷(RAID1):跨磁盘分区,至少两个,容量一样,文件第二个磁盘自动备份(安全,但是容量使用大)
  • RAID5卷:跨磁盘分区,至少三个,容量一样,每个磁盘会生成奇偶数校验码(安全,常用,其中一个磁盘损坏可以通过其他磁盘恢复)

fdisk命令

磁盘分区操作命令,进入交互工具界面进行对该硬盘分区
命令格式:fdisk【磁盘硬盘目录】
-l:查看磁盘信息

lsblk命令

列出系统中的块设备信息,包括硬盘、分区、软盘和CD/DVD驱动器等信息
命令格式:lsblk【选项】
-a:显示所有设备,包括空设备。
-d:仅显示块设备,不显示其分区。
-f:显示设备的文件系统类型。
-m:以Mebibytes(兆字节)为单位显示设备大小。
-p:显示设备的完整路径。
-t:以树状结构显示设备和分区。
输出字段解释:
NAME:设备的名称。
MAJ:MIN:设备的主设备号和次设备号。
RM:可移动设备标志,0表示不可移动,1表示可移动。
SIZE:设备的大小。
RO:设备的只读标志,0表示可读写,1表示只读。
TYPE:设备的类型,如磁盘(disk)、分区(part)、软盘(rom)等。
MOUNTPOINT:设备的挂载点。
如下所示:

root@test:~# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0 40.4M  1 loop /snap/snapd/20671
loop1    7:1    0   87M  1 loop /snap/lxd/27428
loop2    7:2    0 39.1M  1 loop /snap/snapd/21184
loop4    7:4    0 63.9M  1 loop /snap/core20/2182
loop5    7:5    0   87M  1 loop /snap/lxd/27037
loop7    7:7    0 63.9M  1 loop /snap/core20/2105
vda    252:0    0   40G  0 disk
└─vda1 252:1    0   40G  0 part /
vdb    252:16   0  500G  0 disk
└─vdb1 252:17   0  500G  0 part /data

磁盘分区步骤

1.进入磁盘分区操作界面

fdisk /dev/sdb

添加的硬盘在/dev目录下,进入磁盘操作界面
2.进入之后,添加分区
m是帮助查看选项(如下所示)

Command (m for help): m
Command action
   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)

n:添加新分区   t:更改文件的类型(不同类型文件有不同id)
d:删除分区   w:保存   q:退出
选择n添加新分区(如下所示)

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p  #选择创建扩展或主分区
Partition number (1-4, default 1): 1  #添加第几个磁盘
First sector (2048-41943039, default 2048): #设置扇区,默认就好
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +10G  #设置磁盘大小
Partition 1 of type Linux and of size 10 GiB is set

e:创建扩展分区        p:创建主分区(可以分1-4个)
修改磁盘ID,也就是类型(如下所示)

Command (m for help): t
Partition number (1-4): 1 #第几个分区
Hex code (type L to list codes): 83  #修改成什么文件的id
Changed type of partition 'Linux' to 'Linux'

l:查看不同文件的id(如下所示)

Hex code (type L to list all codes): l
 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx         
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data    
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility   
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt         
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access     
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi eb  BeOS fs        
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT            
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor      
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f4  SpeedStor      
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f2  DOS secondary  
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS    
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fe  LANstep        
1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT            
1e  Hidden W95 FAT1 80  Old Minix      

3.格式化(创建文件系统)
设置为ext4(默认)命令(有两种方式)

mkfs.ext4 /dev/sdb1
#或者另外一种方式
mkfs.ext –t ext4 /dev/sdb1

设置为swap(交换分区)

#设置swap交换分区
mkswap /dev/sdb1
#启用swap命令
swapon /dev/sdb1
#关闭swap命令
swapoff /dev/sdb1

4.磁盘挂载

mkdir /test
mount /dev/sdb1 /test

磁盘挂载

查看挂载信息:mount -l(会显示卷标名称 )
mount命令: 将磁盘设备挂载到系统目录上
命令格式:mount【选项】【磁盘设备】【挂载的目录】
-t vsftype:指定要挂载的设备上的文件系统类型(一般不用加,会自动选择正确的类型)
-o 特殊选项: 可以指定挂载的额外选项,比如读写权限、同步异步等,如果不指定,则默认值生效
-a:自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中)
-r: readonly,只读挂载
-w: read and write, 读写挂载
-n: 不更新/etc/mtab
-L ‘LABEL’: 以卷标指定挂载设备
-U ‘UUID’: 以UUID指定要挂载的设备
-B, --bind: 绑定目录到另一个目录上
umount命令: 卸载挂载
命令格式:umount【已挂载的目录】
开机自动挂载
有个挂载记录文件/etc/fstab,可以把需要挂载的目录添加进去,如果服务器重启mount挂载的会失效
编写格式:/dev/sdb1(磁盘) /test(挂载目录) ext4(文件类型) deaults(默认) 0(是否备份) 0(是否检测)(如下所示)

vim /etc/fstab
---------------------------
# /etc/fstab
# Created by anaconda on Fri Apr 15 08:53:41 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
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=7d93cd95-5c1e-4d21-a14a-229f91c390cb /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sdb1  /test                                ext4              defaults        0 0

二、动态磁盘管理

RAID磁盘阵列

RAID磁盘阵列使用硬操作(没有RAID卡)方法:

RAID 0

RAID 0需要至少两块硬盘,假设有/dev/sdb和/dev/sdc两个磁盘
1.创建RAID 0

mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc

2.格式化并挂载

mkfs.ext4 /dev/md0
mount /dev/md0 /mnt/data

RAID 1

RAID 1需要至少两块硬盘,假设有/dev/sdb和/dev/sdc两个磁盘
1.创建RAID0

mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

2.格式化并挂载

mkfs.ext4 /dev/md1
mount /dev/md1 /mnt/data

RAID 0+1

RAID0需要至少四块硬盘,假设有/dev/sdb、/dev/sdc、/dev/sdd和/dev/sde四个磁盘
1.先创建两个RAID 0设备

mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
mdadm --create --verbose /dev/md1 --level=0 --raid-devices=2 /dev/sdd /dev/sde

2.再创建RAID 1设备

mdadm --create --verbose /dev/md2 --level=1 --raid-devices=2 /dev/md0 /dev/md1

3.格式化并挂载

mkfs.ext4 /dev/md2
mount /dev/md2 /mnt/data

RAID 5

1.创建RAID5:创建4硬盘分区并把id改为fd

mdadm -C /dev/md5 -l5 -n3 /dev/sd{b,c,d}1 -x1 /dev/sde1

-C:创建   -l:版本等级   -n:启用硬盘数量   -x:备用硬盘数
2.格式化md5卷

mkfs -t ext4 /dev/md5

3.创建文件目录然后挂载

mkdir /md5
mount /dev/md5 /md5

4.查看测试md5情况

mdadm –D /dev/md5

删除md5上的sdb1硬盘查看情况测试

mdad –f /dev/md5/sdb1

5.配置成开机启动

mdadm --detail --scan > /etc/mdadm.conf

在/etc/fstab下添加开机自动挂载/md5目录

LVM逻辑卷的管理

动态调整磁盘容量,灵活地增加减少磁盘容量
注意:/boot分区不能基于LVM创建
Systen-config-kxm:图形工具

  • PV(Physical Volume):物理卷,PV可以是整个磁盘(/dev/sdb)或者分区(dev/sdb1)
  • PE(Physical Extent):物理扩展块,管理卷的最小单位(4MB,默认大小)
  • VG(Volume Group):卷组,LVM的存储池,由一个或多个PV组成
  • LV(Logical Volume):逻辑卷,可改变大小的分区,从VG中分得指定大小的空间
    注意:创建分区必须为4MB的倍数,并且最多只能有65536个,如果PE设置为最小4MB的话那么LVM卷磁盘最大就为256GB大小

创建LVM逻辑分区

1.创建PV

(1).普通磁盘分区
对vdb磁盘进行创建分区为3个把id都改为8e

[root@test ~]# fdisk /dev/vdb

Welcome to fdisk (util-linux 2.39.3).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS (MBR) disklabel with disk identifier 0x5b8e5b20.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-83886079, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-83886079, default 83886079): +10G

Created a new partition 1 of type 'Linux' and of size 10 GiB.

Command (m for help): t
Partition number (1-3, default 3): 1
Hex code or alias (type L to list all): 8e

Changed type of partition 'Linux' to 'Linux LVM'.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

查看PV详情:

[root@test ~]# fdisk -l
......
Disk /dev/vdb: 40 GiB, 42949672960 bytes, 83886080 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
Disklabel type: dos
Disk identifier: 0x5b8e5b20

Device     Boot    Start      End  Sectors Size Id Type
/dev/vdb1           2048 20973567 20971520  10G 8e Linux LVM
/dev/vdb2       20973568 41945087 20971520  10G 8e Linux LVM
/dev/vdb3       41945088 62916607 20971520  10G 8e Linux LVM

(2).设置/dev/vdb1、/dev/vdb2、/dev/vdb3为pv
创建物理卷PV:pvcreate【磁盘或分区名】【磁盘或分区名】

pvcreate /dev/vdb{1,2,3}

查看详情:

[root@test ~]# pvscan                  
  PV /dev/vdb1                      lvm2 [10.00 GiB]
  PV /dev/vdb2                      lvm2 [10.00 GiB]
  PV /dev/vdb3                      lvm2 [10.00 GiB]
  Total: 3 [30.00 GiB] / in use: 0 [0   ] / in no VG: 3 [30.00 GiB]
[root@test ~]# pvdisplay               
  "/dev/vdb1" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/vdb1
  VG Name               
  PV Size               10.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               dJovbh-tPkm-Pm9S-JPvC-Svkr-Quvk-PKFP93
  ......

2.创建VG

创建卷组VG:vgcreate 【卷组名】【创建的物理卷名】 

vgcreate vg-test /dev/vdb{1,2}

补充:如果需要指定PE单独块的大小则需要加上-s参数

vgcreate -s 16M vg-test /dev/vdb{1,2}

查看VG详情:

[root@test ~]# vgscan                        
  Found volume group "vg-test" using metadata type lvm2
[root@test ~]# vgdisplay
  --- Volume group ---
  VG Name               vg-test
  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               19.99 GiB
  PE Size               4.00 MiB
  Total PE              5118
  Alloc PE / Size       0 / 0   
  Free  PE / Size       5118 / 19.99 GiB
  VG UUID               9sUUDL-dJDL-eaXt-2JIA-rgwR-Px9y-9w4sXQ

VG新添加PV

[root@test ~]# vgextend vg-test /dev/vdb3
  Volume group "vg-test" successfully extended
[root@test ~]# vgdisplay                 
  --- Volume group ---
  VG Name               vg-test
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               <29.99 GiB
  PE Size               4.00 MiB
  Total PE              7677
  Alloc PE / Size       0 / 0   
  Free  PE / Size       7677 / <29.99 GiB
  VG UUID               9sUUDL-dJDL-eaXt-2JIA-rgwR-Px9y-9w4sXQ

3.创建LV

按照容量大小创建逻辑卷LV:lvcreate –L【容量大小】-n【LV逻辑卷名】【创建的VG卷组名】 
按照PE数量创建逻辑卷LV:lvcreate –l【PE数量】-n【LV逻辑卷名】【创建的VG卷组名】 
1.创建LV
按照容量大小创建:

lvcreate -L 10G -n lv-test vg-test

按照PE的数量来创建,默认为4MB,要创建10G的LVM卷则数量就是2560

lvcreate -l 2560 -n lv-test vg-test

使用所有的容量创建

lvcreate -l 100%FREE -n lv-test vg-test

查看LV详情:

[root@test ~]# lvscan                            
  ACTIVE            '/dev/vg-test/lv-test' [10.00 GiB] inherit
[root@test ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vg-test/lv-test
  LV Name                lv-test
  VG Name                vg-test
  LV UUID                vBuHYX-FIsO-yfp2-idK4-5db7-wkZa-Egd0jp
  LV Write Access        read/write
  LV Creation host, time islide-jenkins, 2025-03-20 15:41:25 +0800
  LV Status              available
  # open                 0
  LV Size                10.00 GiB
  Current LE             2560
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           252:0

2.格式化LVM逻辑卷

mkfs -t ext4 /dev/vg-test/lv-test

3.挂载LVM逻辑卷
注意:根目录下创建文件目录方便挂载

mkdir /lvm
mount /dev/vg-test/lv-test /lvm_data

逻辑卷扩容和减小

增加容量

1.给lv增加容量

# 原来的基础上增加5G
lvextend -L +5G /dev/vg-test/lv-test
# 扩展到20G容量
lvextend -L 20G /dev/vg-test/lv-test

2.扩展文件系统

# ext4文件系统
resize2fs /dev/vg-test/lv-test
# XFS文件系统
xfs_growfs /lvm_data

减小容量

注意:必须按照步骤实行,否则可能丢失数据,建议先备份分区中的数据再执行对减小容量的文件系统卸载挂载(根文件系统无法卸载)
操作步骤:

# 卸载挂载目录
umount /lvm_data
# 检测lvm卷类型
e2fsck -f /dev/vg-test/lv-test
# 减小卷容量到10G
resize2fs /dev/vg-test/lv-test 10G
lvreduce -L 10G /dev/vg-test/lv-test
# 重新挂载目录
mount /dev/vg-test/lv-test /lvm_data

磁盘配额

限制用户或用户组对的使用容量
限制的范围:分区
限制对象:用户账号、组账号
可以限制的类型:容量、文件数量
限制方法:软限制(只提醒)、硬限制(直接限制超过则不行)
注意:查询selinux是否开启状态getenforce:查看selinux状态
使用vim进去把SELINUX值修改成disabled,enforcing为开启状态
磁盘配额配置
1.把需要限制的分区以支持配额的功能进行挂载

mount -o usrquota,grpquota /dev/vg/lv /lvm

补充:如果已经挂载了

mount -o remount,usrquota,grpquota /dev/vg/lv /lvm

开机自动以配额限制设置挂载(defaylts后面多了usrquota和grpquota)
2.生成并修改配额文件
quota服务启动

service quota_nld start
quotacheck -augcv

3.修改配额文件
注意:直接使用vim查看配额文件会乱码,以二进制形式,所以用命令进入
修改用户的配额文件:edquota -u【要限制的用户名】
修改用户组的配额文件:edquota -g【要限制的组名】
blocks:已使用容量 inodes:已用文件数量 soft:软限制容量 hard:硬限制
4.启动配额功能

quotaon -ugv /lvm

5.验证
先进入限制配额的用户进行测试

dd if=/dev/zero of=/LVM/test.txt bs=1M count=10

意思是将/dev/zero文件复制到/LVM/目录下创建test.txt文件写入每次1M大小,执行10次
查看配额信息:
quota -u【查询的用户名】 
quota -g【查询的组名】