本章主要介绍Linux磁盘管理
- 了解分区的概念
- 对硬盘进行分区
- swap分区的管理
新的硬盘首先需要对其进行分区和格式化,下面来了解一下硬盘的结构,如下图所示
磁盘上的磁道和扇区
硬盘的磁盘上有一个个圈,每两个圈组成一个磁道。从中间往外发射线,把每个磁道分成 一个个扇区,每个扇区的大小是512B。为了更好地理解,我们把所有磁盘拼接起来,如下图所示。
分区是以扇区划分的
假设磁盘有10000个扇区,第一个分区从2048到6000,第二个分区从6001到 8000,第 三个分区从8001到10000。
每个扇区只能属于一个分区,不能同时属于多个分区。
第一个扇区比较特殊,叫作 MBR(主引导记录)。
分区类型包括主分区、扩展分区和逻辑分区,如下图所示。
一套房子出租,李四和王五从房东手中直接各租一间自住,这个属于主分区。
赵六从房东手中租过来一个大间,但自己不住做起了二房东(扩展分区),然后隔成很多 隔间。赵六租的那一个大间就是扩展分区,大间里隔开的一些隔间就是逻辑分区。
- 主分区:直接从硬盘上划分,并可以直接格式化使用的分区。
- 扩展分区:直接从硬盘上划分,但是不直接使田的分区,傲更方甘上而机分事多的小分区
- 逻辑分区:在扩展分区上划分的分区。
分区表记录主分区和扩展分区的信息,如同房东从李四、王五、赵六手中收房租一样,但 是收不到tom、bob等的房租,tom、bob等的房租由赵六来收,因为赵六是二房东。
每记录一个分区(主分区或扩展分区)要消耗16B,所以分区表最多只能记录4个分区, 硬盘最多只能划分出来4个分区,且最多只能有一个扩展分区。
请关闭虚拟机并自行为虚拟机添加一块SCSI格式的硬盘,然后开机进入系统。(本案例添加一块60G的硬盘)
对磁盘进行分区
使用fdisk -1命令查看所有分区信息,命令如下。
[root@rhel03 ~]# fdisk -l
Disk /dev/nvme0n1:100 GiB,107374182400 字节,209715200 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xc3814681
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/nvme0n1p1 * 2048 2099199 2097152 1G 83 Linux
/dev/nvme0n1p2 2099200 4196351 2097152 1G 82 Linux swap / Solaris
/dev/nvme0n1p3 4196352 209715199 205518848 98G 83 Linux
Disk /dev/sda:60 GiB,64424509440 字节,125829120 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
[root@rhel03 ~]#
此命令可以查看系统所有硬盘的信息,这里可以看到刚添加的硬盘/dev/sda没有任何分区。如果想单独查看某硬盘的分区信息,可以使 用“fdisk -l/dev/硬盘”命令。例如,想单独查看/dev/sda的信息,则用fdisk -l /dev/sda 命令,命令如下。
[root@rhel03 ~]# fdisk -l /dev/sda
Disk /dev/sda:60 GiB,64424509440 字节,125829120 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
[root@rhel03 ~]#
分区的语法为“fdisk /dev/硬盘”,这里是对硬盘进行分区,而不是对分区再进行分区。 命令如下
[root@rhel03 ~]# fdisk /dev/sda
欢迎使用 fdisk (util-linux 2.32.1)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
设备不包含可识别的分区表。
创建了一个磁盘标识符为 0x78ade58d 的新 DOS 磁盘标签。
命令(输入 m 获取帮助):
此处进入分区的界面,按提示输入“m”可以获取帮助,常见的命令如下。
- p:打印分区表。
- n:添加一个分区。
- d:删除一个分区。
- l:列出分区类型。
- t:转换分区类型。
- q:不保存直接退出。
- w:保存并退出。
查看现有分区信息,此处输入“p”,命令如下。
命令(输入 m 获取帮助):p
Disk /dev/sda:60 GiB,64424509440 字节,125829120 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x78ade58d
此处并没有看到/dev/sda1、/dev/sda2等内容,说明并不存在任何分区。
按【n】键创建一个分区,命令如下。
命令(输入 m 获取帮助):n
分区类型
p 主分区 (0个主分区,0个扩展分区,4空闲)
e 扩展分区 (逻辑分区容器)
选择 (默认 p):
直接在硬盘上划分的分区有主分区(标记为p)和扩展分区(标记为e),逻辑分区(标记为 1)只能在扩展分区上创建,且扩展分区最多只能创建一个扩展分区。
所以,在硬盘中没有扩展分区时,选择分区类型时只能选择p和e这两种。如果已经存在 了扩展分区,就不能再创建第二个扩展分区了,但可以在扩展分区上创建逻辑分区,所以可 选择的分区类型有p和1。
先创建主分区或扩展分区都可以,这里先创建主分区,输入“p”,按【Enter】键。主 分区加扩展分区最多只能创建出来4个,所以分配的编号只能是1~4,这里选择默认的1,然 后按【Enter】键。
命令(输入 m 获取帮助):n
分区类型
p 主分区 (0个主分区,0个扩展分区,4空闲)
e 扩展分区 (逻辑分区容器)
选择 (默认 p):p
分区号 (1-4, 默认 1): (这里直接按回车,默认使用分区1)
硬盘总共有41943039个扇区,第一个分区从哪个扇区开始呢?默认为2048,直接按 【Enter】键,我们就从2048扇区开始。第一个分区我们给他5G的大小
命令(输入 m 获取帮助):n
分区类型
p 主分区 (0个主分区,0个扩展分区,4空闲)
e 扩展分区 (逻辑分区容器)
选择 (默认 p):p
分区号 (1-4, 默认 1):
第一个扇区 (2048-125829119, 默认 2048): (直接按回车,默认从2048开始)
上个扇区,+sectors 或 +size{K,M,G,T,P} (2048-125829119, 默认 125829119): +5G
创建了一个新分区 1,类型为“Linux”,大小为 5 GiB。
命令(输入 m 获取帮助):
现在计算一下:5G=5×1024M=5×1024× 1024K=5×1024×1024×2扇区(1扇区 =0.5K),所以一共需要2×1024×1024×2=10485760个扇区。从2048扇区开始算,最后一个 扇区应该落在2048+10485760-1=10487807的位置,这样创建出来的分区就是5G。
创建5G分区后,输入“p”查看分区信息,命令如下。
命令(输入 m 获取帮助):p
Disk /dev/sda:60 GiB,64424509440 字节,125829120 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x78ade58d
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 2048 10487807 10485760 5G 83 Linux
命令(输入 m 获取帮助):
可以看出,从2048开始,共10485760个扇区,在10487807这个位置结束,大小为5G。
再创建一个主分区/dev/sda2,大小为5G,命令如下。
命令(输入 m 获取帮助):n
分区类型
p 主分区 (1个主分区,0个扩展分区,3空闲)
e 扩展分区 (逻辑分区容器)
选择 (默认 p):
将使用默认回应 p。
分区号 (2-4, 默认 2):
第一个扇区 (10487808-125829119, 默认 10487808):
上个扇区,+sectors 或 +size{K,M,G,T,P} (10487808-125829119, 默认 125829119): +5G
创建了一个新分区 2,类型为“Linux”,大小为 5 GiB。
命令(输入 m 获取帮助):p
Disk /dev/sda:60 GiB,64424509440 字节,125829120 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x2831c07e
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 2048 10487807 10485760 5G 83 Linux
/dev/sda2 10487808 20973567 10485760 5G 83 Linux
命令(输入 m 获取帮助):
创建一个扩展分区/dev/sda4,把剩余所有空间全部给它(这里故意没有创 建/dev/sda3),命令如下。
命令(输入 m 获取帮助):n
分区类型
p 主分区 (2个主分区,0个扩展分区,2空闲)
e 扩展分区 (逻辑分区容器)
选择 (默认 p):e
分区号 (3,4, 默认 3): 4
第一个扇区 (20973568-125829119, 默认 20973568):
上个扇区,+sectors 或 +size{K,M,G,T,P} (20973568-125829119, 默认 125829119):
创建了一个新分区 4,类型为“Extended”,大小为 50 GiB。
输入“p”查看分区信息,命令如下。
命令(输入 m 获取帮助):p
Disk /dev/sda:60 GiB,64424509440 字节,125829120 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x2831c07e
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 2048 10487807 10485760 5G 83 Linux
/dev/sda2 10487808 20973567 10485760 5G 83 Linux
/dev/sda4 20973568 125829119 104855552 50G 5 扩展
命令(输入 m 获取帮助):
创建扩展分区后,就可以创建逻辑分区了,我们看到了编号3并未使用,所以现在还可以 创建一个主分区,但是硬盘已经没有多余的空间,所以不能再创建主分区只能创建逻辑分区, 逻辑分区的编号是从5开始,命令如下。
命令(输入 m 获取帮助):n
所有主分区的空间都在使用中。
添加逻辑分区 5
第一个扇区 (20975616-125829119, 默认 20975616):
上个扇区,+sectors 或 +size{K,M,G,T,P} (20975616-125829119, 默认 125829119): +10G
创建了一个新分区 5,类型为“Linux”,大小为 10 GiB。
命令(输入 m 获取帮助):
这里我们创建一个大小为10G的逻辑分区/dev/sda5,使用“p”命令查看。
命令(输入 m 获取帮助):p
Disk /dev/sda:60 GiB,64424509440 字节,125829120 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x2831c07e
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 2048 10487807 10485760 5G 83 Linux
/dev/sda2 10487808 20973567 10485760 5G 83 Linux
/dev/sda4 20973568 125829119 104855552 50G 5 扩展
/dev/sda5 20975616 41947135 20971520 10G 83 Linux
命令(输入 m 获取帮助):
依照此方法再创建几个分区,命令如下。
命令(输入 m 获取帮助):p
Disk /dev/sda:60 GiB,64424509440 字节,125829120 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x2831c07e
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 2048 10487807 10485760 5G 83 Linux
/dev/sda2 10487808 20973567 10485760 5G 83 Linux
/dev/sda4 20973568 125829119 104855552 50G 5 扩展
/dev/sda5 20975616 41947135 20971520 10G 83 Linux
/dev/sda6 41949184 62920703 20971520 10G 83 Linux
/dev/sda7 62922752 83894271 20971520 10G 83 Linux
命令(输入 m 获取帮助):
看上面最右侧的两列:Id和类型,这两列是对应的。因为分区的作用不一样,所以有的可以直接格式化使用,有的用于创建swap,有的用于创建逻辑卷等。这些类型是可以转换的,输 入字母l可以看到所有类型,如下所示。
命令(输入 m 获取帮助):l
0 空 24 NEC DOS 81 Minix / 旧 Linu bf Solaris
1 FAT12 27 隐藏的 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 隐藏 或 In c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux 扩展 c7 Syrinx
5 扩展 41 PPC PReP Boot 86 NTFS 卷集 da 非文件系统数据
6 FAT16 42 SFS 87 NTFS 卷集 db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux 纯文本 de Dell 工具
8 AIX 4e QNX4.x 第2部分 8e Linux LVM df BootIt
9 AIX 可启动 4f QNX4.x 第3部分 93 Amoeba e1 DOS 访问
a OS/2 启动管理器 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 休 ea Rufus 对齐
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs
f W95 扩展 (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT
10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/
11 隐藏的 FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC
12 Compaq 诊断 5c Priam Edisk a9 NetBSD f1 SpeedStor
14 隐藏的 FAT16 <3 61 SpeedStor ab Darwin 启动 f4 SpeedStor
16 隐藏的 FAT16 63 GNU HURD 或 Sys af HFS / HFS+ f2 DOS 次要
17 隐藏的 HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS
18 AST 智能睡眠 65 Novell Netware b8 BSDI swap fc VMware VMKCORE
1b 隐藏的 W95 FAT3 70 DiskSecure 多启 bb Boot Wizard 隐 fd Linux raid 自动
1c 隐藏的 W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep
1e 隐藏的 W95 FAT1 80 旧 Minix be Solaris 启动 ff BBT
命令(输入 m 获取帮助):
分区类型代码
常见分区类型如下。
- Linux :对应的Id为83,直接格式化使用的分区。
- Linux swap:对应的Id为82,用于创建swap
- Linux LVM:对应的Id为8e,用于创建LV。
- Linux raid :对应的Id为fd,用于创建fd。
例如,准备把/dev/sda5配置成逻辑卷,先把/dev/sda5的分区类型改为Linux LVM,操作 如下。
先按【t】键开始进行转换,命令如下。
命令(输入 m 获取帮助):t
分区号 (1,2,4-7, 默认 7):
然后输入要转换的分区号,这里输人“5”,按【Enter】键后输人要转换的分区Id(8e),命 令如下。
命令(输入 m 获取帮助):t
分区号 (1,2,4-7, 默认 7): 5
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”。
命令(输入 m 获取帮助):
输入“p”查看分区信息,命令如下。
命令(输入 m 获取帮助):p
Disk /dev/sda:60 GiB,64424509440 字节,125829120 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x2831c07e
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 2048 10487807 10485760 5G 83 Linux
/dev/sda2 10487808 20973567 10485760 5G 83 Linux
/dev/sda4 20973568 125829119 104855552 50G 5 扩展
/dev/sda5 20975616 41947135 20971520 10G 8e Linux LVM
/dev/sda6 41949184 62920703 20971520 10G 83 Linux
/dev/sda7 62922752 83894271 20971520 10G 83 Linux
命令(输入 m 获取帮助):
可以看到,/dev/sda5的类型已经变成Linux LVM
使用相同的方法,把/dev/sda6、/dev/sda7的分区类型也转变为Linux LVM。(按刚才方法自行转换)
同时为下一章节做准备,把/dev/sda2的分区类型改为 Linux swap,输入“t”,命令如下。
命令(输入 m 获取帮助):t
分区号 (1,2,4-7, 默认 7): 2
Hex 代码(输入 L 列出所有代码):82
已将分区“Linux”的类型更改为“Linux swap / Solaris”。
命令(输入 m 获取帮助):
然后输入“p”查看分区信息,命令如下
命令(输入 m 获取帮助):p
Disk /dev/sda:60 GiB,64424509440 字节,125829120 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x2831c07e
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 2048 10487807 10485760 5G 83 Linux
/dev/sda2 10487808 20973567 10485760 5G 82 Linux swap / Solaris
/dev/sda4 20973568 125829119 104855552 50G 5 扩展
/dev/sda5 20975616 41947135 20971520 10G 8e Linux LVM
/dev/sda6 41949184 62920703 20971520 10G 8e Linux LVM
/dev/sda7 62922752 83894271 20971520 10G 8e Linux LVM
命令(输入 m 获取帮助):
现在所做的一切并没有真的保存,如果不想保存直接退出,可以输人“q”并按 【Enter】键;如果想保存并退出,可以输入“w”并按【Enter】键,命令如下。
命令(输入 m 获取帮助):w
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。
[root@rhel03 ~]#
有时需要执行partprobe /dev/sda命令来刷新一下分区表,然后使用fdisk命令进行查 看,命令如下。
[root@rhel03 ~]# fdisk -l /dev/sda
Disk /dev/sda:60 GiB,64424509440 字节,125829120 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x2831c07e
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 2048 10487807 10485760 5G 83 Linux
/dev/sda2 10487808 20973567 10485760 5G 82 Linux swap / Solaris
/dev/sda4 20973568 125829119 104855552 50G 5 扩展
/dev/sda5 20975616 41947135 20971520 10G 8e Linux LVM
/dev/sda6 41949184 62920703 20971520 10G 8e Linux LVM
/dev/sda7 62922752 83894271 20971520 10G 8e Linux LVM
[root@rhel03 ~]#
交换分区
在物理内存不够用的情况下,系统会把物理内存中那些长时间没有操作的数据释放出来, 保存在交换分区(swap)中,这样物理内存中就有多余的空间,用于存放新的数据。
如果物理内存不够了可以使用swap分区,那么如果swap分区也不够了呢?我们就可以添加swap分区。下面就来讲讲如何管理swap分区。
查看当前系统中所有的swap分区,命令如下。
[root@rhel03 ~]# swapon -s
文件名 类型 大小 已用 权限
/dev/nvme0n1p2 partition 1048572 0 -2
[root@rhel03 ~]#
可以看到,当前/dev/nvme0n1p2是交换分区,大小是1G。这里的权限是,如果有多个swap分 区,优先使用哪个,数值越大越优先。查看swap分区也可以使用cat /proc/swaps命令。
下面开始创建swap分区,步骤如下。
(1)把/dev/sda2创建为swap分区,命令如下。
[root@rhel03 ~]# mkswap /dev/sda2
正在设置交换空间版本 1,大小 = 5 GiB (5368705024 个字节)
无标签,UUID=6da76aa9-c726-4e3b-90f9-1f9f450142b4
[root@rhel03 ~]#
(2)激活新创建的swap 分区,命令如下。
[root@rhel03 ~]# swapon /dev/sda2
[root@rhel03 ~]# swapon -s
文件名 类型 大小 已用 权限
/dev/nvme0n1p2 partition 1048572 0 -2
/dev/sda2 partition 5242876 0 -3
可以看到,此时已经有两个交换分区了。其中/dev/sda2的权限为-3,说明/dev/nvme0n1p2优先使用。如果想设置让/dev/sda2优先使用,可以调整/dev/sda2的优先级。
(3)关闭新创建的swap分区,命令如下。
[root@rhel03 ~]# swapoff /dev/sda2
(4)激活swap分区,并指定优先级,命令如下。
[root@rhel03 ~]# swapon -p 2 /dev/sda2
[root@rhel03 ~]# swapon -s
文件名 类型 大小 已用 权限
/dev/nvme0n1p2 partition 1048572 0 -2
/dev/sda2 partition 5242876 0 2
可以看到,/dev/sda2的权限是2,所以这个交换分区会优先使用。
上面设置的这个交换分区也只是临时生效,如果要让其重启系统之后仍然生效,就需要写 入/etc/fstab中。
编辑/etc/fstab,在最后一行添加,命令如下。
[root@rhel03 ~]# cat /etc/fstab | grep -v "#"
UUID=490dd874-5d96-4069-8682-71e6bf96ede7 / xfs defaults 0 0
UUID=75d3e2b6-ef2a-413a-88d2-dc22330c8325 /boot xfs defaults 0 0
UUID=d803fc6c-7e3f-4066-99b5-8bc150fa62dd none swap defaults 0 0
/dev/sda2 none swap defaults,pri=2 0 0
[root@rhel03 ~]#
这里grep -v “#”的意思是过滤掉#开头的行
上面每个字段用空格或【Tab】键隔开均可,第四列defaults后面的逗号两边没有空格。 如果不需要指定优先级,第四列直接写 defaults 即可。
如果/dev/sda2当前没有激活,则在写入/etc/fstab之后,执行swapon -a命令即可。