主题
磁盘与分区管理(lsblk、fdisk)
在 Rocky Linux 系统中,磁盘和分区管理是系统管理的基础任务之一。正确管理磁盘和分区可以确保系统的存储资源得到合理利用,提高系统性能,防止数据丢失。本教程将详细介绍如何使用 lsblk 和 fdisk 这两个常用工具来查看、创建、管理磁盘和分区。
磁盘管理概述
磁盘管理主要涉及以下几个方面:
- 识别物理磁盘:了解系统中安装的物理磁盘
- 查看磁盘信息:获取磁盘容量、型号、分区等信息
- 创建分区:将物理磁盘划分为多个逻辑分区
- 管理分区:修改、删除现有分区
- 设置分区类型:为不同用途的分区设置合适的类型
在 Linux 中,存储设备通常以以下方式命名:
- SATA/SCSI 磁盘:
/dev/sda、/dev/sdb等 - NVMe 磁盘:
/dev/nvme0n1、/dev/nvme1n1等 - 虚拟磁盘:
/dev/vda、/dev/vdb等 - 分区:在设备名后添加数字,如
/dev/sda1、/dev/nvme0n1p1等
查看磁盘信息
使用 lsblk 命令
lsblk(list block devices)命令用于列出所有块设备的信息,是查看磁盘和分区的首选工具。
基本用法
bash
# 列出所有块设备
lsblk
# 以列表格式显示
lsblk -l
# 显示详细信息
lsblk -a
# 显示文件系统信息
lsblk -f
# 显示所有者和组信息
lsblk -m
# 以字节为单位显示大小
lsblk -b
# 自定义输出格式
lsblk -o NAME,SIZE,TYPE,MOUNTPOINTlsblk 输出解释
当执行 lsblk 命令时,输出通常包括以下列:
- NAME:设备名称
- MAJ:MIN:主设备号和次设备号
- RM:是否为可移动设备(1 表示是,0 表示否)
- SIZE:设备大小
- RO:是否为只读设备(1 表示是,0 表示否)
- TYPE:设备类型(disk、part、lvm 等)
- MOUNTPOINT:挂载点(如果已挂载)
使用 -f 选项时,还会显示:
- FSTYPE:文件系统类型
- LABEL:文件系统标签
- UUID:文件系统唯一标识符
- MOUNTPOINT:挂载点
使用 fdisk 命令查看磁盘信息
fdisk 命令也可以用来查看磁盘分区信息:
bash
# 查看特定磁盘的分区表
sudo fdisk -l /dev/sda
# 查看所有磁盘的分区表
sudo fdisk -l
# 以字节为单位显示
sudo fdisk -b 512 -l /dev/sda使用其他命令查看磁盘信息
bash
# 查看磁盘空间使用情况
df -h
# 查看磁盘 I/O 统计信息
iostat -d
# 查看当前挂载的文件系统
mount
# 查看磁盘几何信息(较旧的命令)
sudo hdparm -g /dev/sda磁盘分区基础
分区类型
在 Linux 中,主要有两种分区方案:
MBR(Master Boot Record):旧的分区方案
- 最大支持 2TB 磁盘
- 最多支持 4 个主分区,或 3 个主分区 + 1 个扩展分区(扩展分区中可以创建多个逻辑分区)
GPT(GUID Partition Table):新的分区方案
- 支持超过 2TB 的磁盘
- 最多可以创建 128 个分区(具体数量取决于实现)
- 提供更好的数据完整性检查
- 支持 UEFI 引导
分区标识符
- MBR 分区类型:使用十六进制代码表示,如 83(Linux)、82(Linux swap)
- GPT 分区类型:使用 GUID 表示,如 EBD0A0A2-B9E5-4433-87C0-68B6B72699C7(Linux 文件系统数据)
使用 fdisk 管理分区
fdisk 是一个传统的磁盘分区工具,支持 MBR 和 GPT 分区表。
进入 fdisk 交互模式
bash
# 对指定磁盘进行分区操作
sudo fdisk /dev/sdb进入交互模式后,可以使用以下命令:
- m:显示帮助信息
- p:显示当前分区表
- n:创建新分区
- d:删除分区
- t:更改分区类型
- w:保存更改并退出
- q:不保存更改并退出
- g:创建 GPT 分区表
- o:创建 MBR 分区表
创建 GPT 分区表
bash
# 进入 fdisk 交互模式
sudo fdisk /dev/sdb
# 创建 GPT 分区表(输入 g)
Command (m for help): g
Created a new GPT disklabel (GUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)
# 保存并退出(输入 w)
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.创建新分区
bash
# 进入 fdisk 交互模式
sudo fdisk /dev/sdb
# 显示当前分区表(输入 p)
Command (m for help): p
# 创建新分区(输入 n)
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-41943039, default 2048): Enter
# 输入结束扇区或分区大小
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +10G
# 显示新创建的分区表(输入 p)
Command (m for help): p
# 保存并退出(输入 w)
Command (m for help): w更改分区类型
bash
# 进入 fdisk 交互模式
sudo fdisk /dev/sdb
# 查看分区表(输入 p)
Command (m for help): p
# 更改分区类型(输入 t)
Command (m for help): t
# 选择分区号
Partition number (1-4, default 4): 1
# 输入分区类型代码
# 对于 Linux 文件系统,使用 83(MBR)或默认值(GPT)
# 对于交换分区,使用 82(MBR)或 19(GPT)
Hex code or alias (type L to list all): 82
# 验证更改(输入 p)
Command (m for help): p
# 保存并退出(输入 w)
Command (m for help): w删除分区
bash
# 进入 fdisk 交互模式
sudo fdisk /dev/sdb
# 查看分区表(输入 p)
Command (m for help): p
# 删除分区(输入 d)
Command (m for help): d
# 选择要删除的分区号
Partition number (1-4, default 4): 1
# 确认分区已删除(输入 p)
Command (m for help): p
# 保存并退出(输入 w)
Command (m for help): w应用分区表更改
在保存分区表更改后,系统需要重新读取分区表。可以通过以下方法实现:
bash
# 重新加载分区表
sudo partprobe /dev/sdb
# 或者重启系统(不推荐在生产环境中)
sudo reboot高级分区管理
创建扩展分区和逻辑分区(MBR)
在 MBR 分区表中,如果需要创建超过 4 个分区,必须使用扩展分区:
bash
# 进入 fdisk 交互模式
sudo fdisk /dev/sdb
# 创建主分区 1
Command (m for help): n
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048): Enter
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +10G
# 创建主分区 2
Command (m for help): n
Select (default p): p
Partition number (2-4, default 2): 2
First sector (20973568-41943039, default 20973568): Enter
Last sector, +sectors or +size{K,M,G,T,P} (20973568-41943039, default 41943039): +10G
# 创建主分区 3
Command (m for help): n
Select (default p): p
Partition number (3-4, default 3): 3
First sector (41945088-41943039, default 41945088): Enter
Last sector, +sectors or +size{K,M,G,T,P} (41945088-41943039, default 41943039): +10G
# 创建扩展分区
Command (m for help): n
Select (default e): e
Partition number (4, default 4): 4
First sector (62916608-41943039, default 62916608): Enter
Last sector, +sectors or +size{K,M,G,T,P} (62916608-41943039, default 41943039): Enter
# 在扩展分区中创建逻辑分区
Command (m for help): n
All space for primary partitions is in use.
Adding logical partition 5
First sector (62918656-41943039, default 62918656): Enter
Last sector, +sectors or +size{K,M,G,T,P} (62918656-41943039, default 41943039): +5G
# 创建另一个逻辑分区
Command (m for help): n
Adding logical partition 6
First sector (73402368-41943039, default 73402368): Enter
Last sector, +sectors or +size{K,M,G,T,P} (73402368-41943039, default 41943039): Enter
# 保存并退出
Command (m for help): w创建交换分区
交换分区是 Linux 系统中用于虚拟内存的特殊分区:
bash
# 进入 fdisk 交互模式
sudo fdisk /dev/sdb
# 创建新分区
Command (m for help): n
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048): Enter
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +4G
# 更改分区类型为交换分区
Command (m for help): t
Partition number (1-4, default 4): 1
# 对于 MBR,使用 82;对于 GPT,输入 L 列出所有类型,然后选择 swap
Hex code or alias (type L to list all): 82
# 保存并退出
Command (m for help): w
# 格式化交换分区
sudo mkswap /dev/sdb1
# 启用交换分区
sudo swapon /dev/sdb1
# 设置开机自动挂载,编辑 /etc/fstab
UUID=$(sudo blkid -s UUID -o value /dev/sdb1)
echo "UUID=$UUID none swap defaults 0 0" | sudo tee -a /etc/fstab创建 EFI 系统分区(ESP)
EFI 系统分区在 UEFI 引导的系统中是必需的:
bash
# 进入 fdisk 交互模式
sudo fdisk /dev/sdb
# 确保使用 GPT 分区表
Command (m for help): g
# 创建 EFI 系统分区
Command (m for help): n
Select (default p): p
Partition number (1-128, default 1): 1
First sector (2048-41943039, default 2048): Enter
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +512M
# 更改分区类型为 EFI 系统分区
Command (m for help): t
Partition number (1-128, default 1): 1
# 输入 L 查看所有类型,然后找到 EFI 类型
Hex code or alias (type L to list all): 1
# 保存并退出
Command (m for help): w
# 格式化 EFI 分区为 FAT32
sudo mkfs.fat -F32 /dev/sdb1分区操作注意事项
备份重要数据:在进行任何分区操作前,确保已备份所有重要数据
小心选择磁盘:确保对正确的磁盘进行操作,避免意外修改系统磁盘
分区对齐:确保分区边界正确对齐,特别是对于 SSD 或高级文件系统
使用适当的分区大小:根据实际需求规划分区大小
考虑使用 LVM:对于需要灵活管理存储空间的场景,考虑使用 LVM(逻辑卷管理)
理解分区限制:了解 MBR 和 GPT 分区表的限制
常见问题与故障排除
无法看到新创建的分区
如果创建分区后无法看到新分区:
bash
# 重新加载分区表
sudo partprobe /dev/sdb
# 或者使用 partx
sudo partx -u /dev/sdb
# 查看是否已识别新分区
lsblk /dev/sdb无法删除分区
如果无法删除分区:
确保分区未被挂载:
bashsudo umount /dev/sdb1确保没有进程正在使用该分区:
bashsudo fuser -m /dev/sdb1尝试使用 wipefs 清除分区签名:
bashsudo wipefs -a /dev/sdb1
分区表错误
如果遇到分区表错误:
bash
# 检查并修复分区表
sudo fdisk /dev/sdb
Command (m for help): x # 专家模式
Command (m for help): b # 修复分区边界
Command (m for help): r # 返回主菜单
Command (m for help): w # 保存更改无法格式化分区
如果无法格式化分区:
- 确保分区已正确创建并识别
- 检查是否有进程正在使用该分区
- 尝试使用不同的文件系统类型
- 检查磁盘是否有硬件问题
分区最佳实践
合理规划分区布局:
- 为根目录(/)分配足够空间
- 考虑将 /home、/var、/tmp 等目录放在单独的分区
- 为交换空间分配适当大小(通常为物理内存的 1-2 倍)
使用 UUID 挂载分区:使用 UUID 而不是设备名称挂载分区,提高系统稳定性
定期检查磁盘健康状态:
bashsudo smartctl -a /dev/sda考虑使用 GPT 分区表:对于现代系统,特别是大磁盘,推荐使用 GPT 分区表
为服务器设置合理的分区策略:
- Web 服务器:单独的 /var/www 分区
- 数据库服务器:单独的数据分区
- 邮件服务器:单独的 /var/spool/mail 分区
总结
磁盘和分区管理是 Rocky Linux 系统管理的基础技能。本教程详细介绍了如何使用 lsblk 和 fdisk 工具查看磁盘信息、创建和管理分区。
通过掌握这些工具和技术,您可以有效地管理系统的存储资源,为各种应用程序和服务提供合适的存储空间。在进行任何磁盘操作时,务必小心谨慎,始终备份重要数据,并确保对正确的磁盘和分区进行操作。
对于更复杂的存储管理需求,如动态调整分区大小、创建逻辑卷等,可以考虑学习 LVM(逻辑卷管理)相关知识,它提供了更灵活的存储管理能力。