Linux常用命令--磁盘管理之基础篇

摘要

  • 磁盘的挂载、分区、格式化、扩容等命令

  • 本文基于AWS EC2 EBS CentOS8(x86_64)

添加新卷并绑定到新的路径下

1.aws控制台–>卷–>创建一个新卷(10G),注意选择可用区,然后点击操作–>挂载卷–>选择对应的ec2实例

2.ssh 登录 ec2,以下操作全责root下进行,初始磁盘情况如下

1
2
3
4
5
6
7
8
9
10
$ df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs tmpfs 2.0G 532K 2.0G 1% /run
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/xvda1 xfs 100G 13G 88G 13% /
tmpfs tmpfs 393M 0 393M 0% /run/user/1002
tmpfs tmpfs 393M 0 393M 0% /run/user/1001
tmpfs tmpfs 393M 0 393M 0% /run/user/1000

3.查看新挂载卷的名称,这里看到新挂载的卷名称为 xvdf

1
2
3
4
5
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 100G 0 disk
└─xvda1 202:1 0 100G 0 part /
xvdf 202:80 0 10G 0 disk

4.格式化新卷

可以查看磁盘的格式化类型

注意这里的磁盘名称有可能不一样,这和云厂商提供的磁盘种类有关系,请根据实际情况进行修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#方法1,更简单,格式化类型目前最常用的就是ext4和xfs
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
xvda
└─xvda1 ext4 / df24ba12-defa-4725-9a31-2ff9b332ae90 /


$ lsblk -f # 注意这里是两个分区 ,这里 nvme0n1p128 是一个特殊的系统分区,其不用于存储文件数据,而是为启动管理提供支持,在aws上只有作为系统盘时才会有该分区。
NAME FSTYPE LABEL UUID MOUNTPOINT
nvme0n1
├─nvme0n1p1 xfs / a79c006f-96af-49dc-a71a-2779441678a3 /
└─nvme0n1p128

#方法2,后面根磁盘名称或者分区名称
# 磁盘格式化类型
$ blkid /dev/xvda1
/dev/xvda1: LABEL="/" UUID="df24ba12-defa-4725-9a31-2ff9b332ae90" TYPE="ext4" PARTLABEL="Linux" PARTUUID="d6311ca9-f51b-419d-9c8d-beac61c0403a"

$ blkid /dev/nvme0n1p1
/dev/nvme0n1p1: LABEL="/" UUID="a79c006f-96af-49dc-a71a-2779441678a3" TYPE="xfs" PARTLABEL="Linux" PARTUUID="80232d14-a44a-48c8-844b-e54d7e6178eb"

# 磁盘分区类型,分区类型下文会有介绍
$ blkid /dev/xvda
/dev/xvda: PTTYPE="gpt"

blkid /dev/nvme0n1
/dev/nvme0n1: PTUUID="0bcd4d37-a271-4b2c-a475-a2bdb05f5f0d" PTTYPE="gpt"

4.1 不分区xfs

1
2
3
4
5
6
7
8
9
10
$ mkfs.xfs /dev/xvdf
meta-data=/dev/xvdf isize=512 agcount=4, agsize=655360 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=0
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

4.2 不分区ext4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ mkfs.ext4 /dev/xvdf
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2620416 blocks
131020 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2151677952
80 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

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

4.3 分区后格式化,后续操作没有进行分区,一块盘最大可以申请16384GiB,对于一般的业务来说足够了

4.3.1 MBR分区(一个分区必须小于2.2T,且最多3个主分区)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$ fdisk /dev/nvme2n1 # 磁盘名称

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


命令(输入 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): +5120M #设置第一个分区大小为5G

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

命令(输入 m 获取帮助):n #创建新分区,设置第二个分区
分区类型
p 主分区 (1个主分区,0个扩展分区,3空闲)
e 扩展分区 (逻辑分区容器)
选择 (默认 p):p #创建主分区
分区号 (2-4, 默认 2): #回车
第一个扇区 (10487808-41943039, 默认 10487808): #回车
上个扇区,+sectors 或 +size{K,M,G,T,P} (10487808-41943039, 默认 41943039): #回车 将剩余空间全部分配给第二个分区

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

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



补充:
q :不保存退出
d :删除分区,删除分区前要先 umount 掉挂载路径:umount /data
4.3.2 GPT分区(分区大小没有限制,主分区个数也没有限制)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 对/dev/nvme3n1进行分区,如果parted命令不存在可以用 yum 安装
$ parted /dev/nvme3n1
GNU Parted 3.1
使用 /dev/nvme3n1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt #将sdb磁盘改成大分区格式 ,改回MBR模式: mklabel msdos
(parted) print #打印信息,看到分区类型已经修改为gpt:Partition Table: gpt
Model: NVMe Device (nvme)
Disk /dev/nvme3n1: 21.5GB
Sector size (logical/physical): 512B/512B #这里显示的是扇区大小
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name 标志

(parted) mkpart primary 0 10gb #设置第一块分区分配10G空间 start end ,从0开始
警告: The resulting partition is not properly aligned for best performance.
忽略/Ignore/放弃/Cancel? c #这里看到警告,输入 '放弃'或者'c' ,经过反复尝试,发现设置分区的开始大小为 2048个扇区大小时不会抛出警告,一个扇区为512B
(parted) mkpart primary 1048576b 10gb #设置第一块分区分配10G空间 start end ,从1048576b开始:2048 * 512b
(parted) print #打印信息,看到第一个分区已经创建好了
Model: NVMe Device (nvme)
Disk /dev/nvme3n1: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name 标志
1 1049kB 10.0GB 10000MB primary

(parted) mkpart primary 10gb 21.5gb #设置第二块分区分配剩余空间 start end ,从10gb开始 ,print中显示 Disk /dev/nvme3n1: 21.5GB ,所以end设置为 21.5gb
(parted) print #打印信息,看到第二个分区已经创建好了
Model: NVMe Device (nvme)
Disk /dev/nvme3n1: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name 标志
1 1049kB 10.0GB 10000MB primary
2 10.0GB 21.5GB 11.5GB primary

(parted) quit # 退出即可
信息: You may need to update /etc/fstab.




补充:
删除分区: 删除分区前要先 umount 掉挂载路径:umount /gtp_data
parted /dev/nvme3n1
(parted) rm 1 #要删除那个分区直接输入Number即可,通过print命令查看Number,这里表示删除第一块分区
(parted) quit
4.3.3 查看磁盘信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 8G 0 disk
├─nvme0n1p1 259:1 0 8G 0 part /
└─nvme0n1p128 259:2 0 1M 0 part
nvme1n1 259:3 0 10G 0 disk /data
nvme2n1 259:4 0 20G 0 disk
├─nvme2n1p1 259:7 0 5G 0 part
└─nvme2n1p2 259:8 0 15G 0 part
nvme3n1 259:5 0 20G 0 disk
├─nvme3n1p1 259:10 0 9.3G 0 part
└─nvme3n1p2 259:11 0 10.7G 0 part

# 通过该命令,可以查看磁盘的分区类别。比如这里默认的系统盘的分区类型为GPT--磁盘标签类型:gpt。BMR:磁盘标签类型:dos
$ fdisk -l
Disk /dev/nvme0n1:8 GiB,8589934592 字节,16777216 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘标签类型:gpt
磁盘标识符:465F350B-EC19-47A2-9A1D-44ECF9FF38AC

设备 起点 末尾 扇区 大小 类型
/dev/nvme0n1p1 4096 16777182 16773087 8G Linux 文件系统
/dev/nvme0n1p128 2048 4095 2048 1M BIOS 启动

分区表记录没有按磁盘顺序。


Disk /dev/nvme1n1:15 GiB,16106127360 字节,31457280 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节


Disk /dev/nvme2n1:25 GiB,26843545600 字节,52428800 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘标签类型:dos
磁盘标识符:0x8b37421e

设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/nvme2n1p1 2048 10487807 10485760 5G 83 Linux
/dev/nvme2n1p2 10487808 52428766 41940959 20G 83 Linux


Disk /dev/nvme3n1:25 GiB,26843545600 字节,52428800 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘标签类型:gpt
磁盘标识符:6F603681-4682-445A-8F10-0095F7536D6B

设备 起点 末尾 扇区 大小 类型
/dev/nvme3n1p1 2048 19531775 19529728 9.3G Microsoft 基本数据
/dev/nvme3n1p2 19531776 52426751 32894976 15.7G Microsoft 基本数据
4.3.4 分区后格式化,注意格式化时要指定分区名称,这里以mbr分区为例,gpt与其类似
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 格式化第一个分区
$ mkfs.ext4 /dev/nvme2n1p1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=1342177280
40 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

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

# 格式化第二个分区
$ mkfs.ext4 /dev/nvme2n1p2
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
983040 inodes, 3931904 blocks
196595 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2151677952
120 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

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

5.创建新路径并将新卷挂载上

1
2
3
4
5
6
7
8
9
10
11
12
13
$ mkdir /data
$ mount /dev/xvdf /data
$ df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs tmpfs 2.0G 532K 2.0G 1% /run
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/xvda1 xfs 100G 13G 88G 13% /
tmpfs tmpfs 393M 0 393M 0% /run/user/1002
tmpfs tmpfs 393M 0 393M 0% /run/user/1001
tmpfs tmpfs 393M 0 393M 0% /run/user/1000
/dev/xvdf xfs 10G 43M 10G 1% /data

6.永久挂载卷

6.1 xfs

1
2
$ echo '/dev/xvdf  /data xfs    defaults    0  0' >> /etc/fstab
$ mount -a

6.2 ext4

1
2
$ echo '/dev/xvdf  /data ext4    defaults    0  0' >> /etc/fstab
$ mount -a

修改ebs的大小后扩展磁盘

  • 使用云盘作为数据盘时,磁盘空间不足的情况比较常见,日常维护大部分情况都是扩容磁盘,所以这里以扩容 aws 云盘为例,其他类型的云盘扩展方式基本类似。

  • 扩容前要先查看磁盘信息,确认磁盘是否进行了分区、格式化的方式以及挂载情况。

1
2
3
4
5
6
7
# 通过如下命令都可以查看磁盘信息
# 简单看,包含挂载的路径和格式化类型
lsblk -f
df -hT

# 详细看,包含挂载的路径和格式化类型,也包含分区类型
fdisk -l

1.登录aws控制台–>卷–>找到指定的卷–>修改–修改卷大小(修改为20G)(只能调大),注意调整容量后要查看其状态变为正在使用,此时才能进行下面的操作

2.ssh登录ec2

3.扩展分区大小: 不区分mbr与gpt

3.1 不分区时: 什么都不用做

3.2分区时: 只能调整最后一个分区的大小

1
2
3
# /dev/nvme2n1:磁盘名称 2:第几个分区,实测分两个区的时只能扩展第二个分区,扩展第一个分区会提示:NOCHANGE: partition 1 is size 10485760. it cannot be grown
$ growpart /dev/nvme2n1 2
CHANGED: partition=2 start=10487808 old: size=31455232 end=41943040 new: size=41940959 end=52428767

growpart
growpart 命令是用于调整硬盘分区大小的工具,它基于 cloud-utils 包提供了一种扩展分区的方法。然而,growpart 命令确实有一个限制,它只能调整并扩展磁盘上最后一个分区的大小,而不能直接用于非最后一个分区的大小调整。
这个限制源于底层的分区表结构和文件系统布局。分区表通常是基于硬盘的特定格式(比如 MBR 或 GPT),这些格式决定了分区的组织方式。在这种结构下,非最后一个分区的大小调整可能会影响到其他分区的布局,这可能会导致数据丢失或破坏。
因此,growpart 仅专注于扩展最后一个分区是出于安全和数据完整性的考虑。如果你需要调整非最后一个分区的大小,可能需要采取其他方法,比如使用其他工具或者进行手动操作。但务必在这样做之前备份重要数据,因为调整分区大小可能会对数据安全带来风险。

PS:
执行 growpart 可能会抛出如下错误提示:/bin/growpart:行242: 个扇区: 语法错误: 期待操作数 (错误符号是 “个扇区”)
解决方法:命令行输入 LANG=en_US.UTF-8 回车后再次运行 growpart 即可

4.扩容后重置磁盘

4.1 xfs

1
2
# /data 就是 mount 对应的磁盘
$ xfs_growfs -d /data

4.2 ext4

1
2
3
4
5
6
# 不分区时是磁盘名称
$ resize2fs /dev/xvdf


#分区时是分区名称,可能会提示先执行 e2fsck -f /dev/nvme2n1p2 执行文件系统检查
$ resize2fs /dev/nvme2n1p2