Linux硬盘分区

一、 核心概念与工具

1.1 启动模式检测:UEFI vs BIOS

在开始分区前,需确定系统的启动模式,这将决定分区表类型。

1
2
# 检查是否为 UEFI 启动
ls /sys/firmware/efi/efivars
  • 目录存在:系统以 UEFI 模式启动,必须使用 GPT 分区表
  • 目录不存在:系统以传统 BIOS/CSM 模式启动,通常使用 MBR 分区表
1.2 分区工具选择
  • fdisk:传统工具,简单易用,但不支持 GPT 分区表,无法处理大于 2TB 的磁盘。
    1
    2
    fdisk -l # 查看所有分区
    # 常用交互命令:p(显示), n(新建), d(删除), t(改类型), w(写入), q(退出)
  • parted:功能强大的现代化工具,支持 GPT 和 MBR,可处理任意大小的磁盘,支持脚本化。
1.3 parted 命令详解

基本语法parted [选项] <设备> [命令]

  • 常用选项
    • -l:列出所有设备的分区信息。
    • -s:脚本模式,不提示用户。
    • -i:交互模式(默认)。

交互模式常用命令

命令 说明
print 打印当前磁盘的分区表。
mklabel <类型> 创建新的磁盘标签(分区表),如 gptmsdos (MBR)。
mkpart <类型> [文件系统] 起点 终点 创建分区。类型:primary(主), extended(扩展), logical(逻辑)。
rm <分区号> 删除指定编号的分区。
set <分区号> <标志> on/off 设置分区标志,如 boot, lvm
unit <单位> 设置显示单位,如 GB, MB, s(扇区), %(百分比)。
quit 退出。

示例:创建 GPT 分区表并分区

1
2
3
4
5
6
parted /dev/sda
(parted) mklabel gpt
(parted) mkpart primary ext4 1MiB 500GiB
(parted) mkpart primary linux-swap 500GiB 508GiB
(parted) print
(parted) quit
1.4 GPT 分区表简介

对于 UEFI 系统或大容量磁盘(>2TB),推荐使用 **GPT (GUID Partition Table)**。

  • 优点
    • 支持超过 2TB 的磁盘。
    • 最多支持 128 个主分区。
    • 包含冗余的备份分区表,更健壮。
    • 使用全局唯一标识符 (GUID)。
  • 结构:包含一个保护性 MBR (LBA 0)、GPT 头 (LBA 1) 和分区表项 (LBA 2-33)。备份结构位于磁盘末尾。

二、 实战分区流程(以 Arch Linux 安装为例)

2.1 环境检查与规划
  1. 检查启动模式(见 1.1)。
  2. 规划分区方案(示例):
挂载点 设备 大小 文件系统 说明
/boot/efi (UEFI) 或 /boot (BIOS) /dev/sda1 512 MiB FAT32 EFI 系统分区 (ESP) 或 BIOS 启动分区。
[SWAP] /dev/sda2 8 GiB swap 交换空间。
/ /dev/sda3 200 GiB ext4 根分区。
/home /dev/sda4 剩余空间 ext4 用户家目录。
2.2 执行分区操作

使用 partedfdisk 按规划创建分区。以下是 parted 的 UEFI+GPT 方案示例:

1
2
3
4
5
6
7
8
9
parted /dev/sda
(parted) mklabel gpt
(parted) mkpart ESP fat32 1MiB 513MiB
(parted) set 1 esp on # 为 ESP 分区设置 `esp` 标志
(parted) mkpart primary linux-swap 513MiB 8705MiB # 8GiB swap
(parted) mkpart primary ext4 8705MiB 208705MiB # 200GiB root
(parted) mkpart primary ext4 208705MiB 100% # 剩余空间给 home
(parted) print
(parted) quit
2.3 格式化分区
1
2
3
4
5
6
7
8
9
10
11
# UEFI: 格式化 ESP 分区为 FAT32
mkfs.fat -F 32 /dev/sda1

# 格式化交换分区
mkswap /dev/sda2
swapon /dev/sda2 # 启用

# 格式化根分区和家目录分区
mkfs.ext4 /dev/sda3
mkfs.ext4 /dev/sda4
# 或使用其他文件系统,如 xfs: mkfs.xfs /dev/sda4
2.4 挂载分区
1
2
3
4
5
6
7
8
9
10
11
12
13
# 挂载根分区
mount /dev/sda3 /mnt

# 创建并挂载其他目录
mkdir -p /mnt/boot/efi # UEFI
mount /dev/sda1 /mnt/boot/efi

mkdir -p /mnt/home
mount /dev/sda4 /mnt/home

# BIOS 系统挂载 /boot (如果单独分区)
# mkdir -p /mnt/boot
# mount /dev/sda1 /mnt/boot
2.5 生成引导(GRUB 示例)
  • BIOS 系统
    1
    2
    3
    pacman -S grub os-prober
    grub-install --target=i386-pc --recheck /dev/sda # 注意是磁盘 (sda),不是分区 (sda1)
    grub-mkconfig -o /boot/grub/grub.cfg
  • UEFI 系统
    1
    2
    3
    pacman -S grub efibootmgr
    grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
    grub-mkconfig -o /boot/grub/grub.cfg

三、 高级案例与脚本

3.1 故障处理:坏盘更换与重建

案例:在 RAID 卡(如 MegaRAID)环境下更换故障硬盘并重建。

1
2
3
4
5
6
7
8
# 1. 清除控制器上保留的缓存(如果之前有虚拟磁盘丢失)
/opt/MegaRAID/MegaCli/MegaCli64 -DiscardPreservedCache -L<VD编号> -a0

# 2. 将新物理盘做成单盘 RAID0(根据 Enclosure ID 和 Slot Number)
/opt/MegaRAID/MegaCli/MegaCli64 -CfgLdAdd -r0[8:11] WB RA Direct -a0

# 3. 开始重建(可选,通常会自动开始)
/opt/MegaRAID/MegaCli/MegaCli64 -PDRbld -ShowProg -PhysDrv [8:11] -a0

之后,对新磁盘 (/dev/sdk) 进行分区、格式化、更新 /etc/fstab 并挂载。

注意:如果 mount -a 失败,尝试执行 systemctl daemon-reload 后重试。

3.2 自动化分区脚本

以下脚本用于将单块磁盘快速分区为单个 GPT 分区并格式化为 ext4。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# fenqu.sh - 快速格式化单磁盘为单个分区
disk_to_parted="$1"
if [ $# -eq 0 ]; then
echo "Usage: $0 /dev/sdX"
exit 1
fi

echo "****** Partitioning ${disk_to_parted} ... ******"
parted -s ${disk_to_parted} mklabel gpt
parted -s ${disk_to_parted} mkpart primary 0% 100%

echo "****** Formatting ${disk_to_parted}1 as ext4 ... ******"
mkfs.ext4 ${disk_to_parted}1

echo "****** New UUID: ******"
blkid ${disk_to_parted}1

使用方式sh fenqu.sh /dev/sdb

3.3 批量分区与挂载

在多磁盘环境中(如 Hadoop 数据节点),可以结合循环和 blkid 实现批量操作。

1
2
3
4
5
6
7
8
9
10
11
# 1. 批量分区格式化(排除系统盘 sda 和特定盘 sdb)
for i in $(lsblk | grep -v sda | awk '{print $1}' | sed '1d' | grep -v sdb); do
sh fenqu.sh /dev/${i}
done

# 2. 获取所有新分区的 UUID,用于编写 /etc/fstab
blkid | grep -v sda | grep -v sdb | awk -F '"' '{print "UUID="$2" /hadoop/"NR" ext4 defaults 0 0"}'

# 3. 创建挂载点并挂载
for i in {1..8}; do mkdir -p /hadoop/0$i; done
mount -a

四、 关键注意事项与技巧

  1. 分区对齐:使用 parted 时,建议起点从 1MiB (2048扇区) 开始,以获得最佳性能,避免“未对齐”警告。
  2. 谨慎操作parted 命令在交互模式下立即生效,没有类似 fdisk 的“写入”确认步骤。删除或格式化前务必确认设备名。
  3. 低格填零:如需彻底清空磁盘(如安全擦除),可使用 dd,但极其耗时且伤盘。
    1
    dd if=/dev/zero of=/dev/sda bs=16M status=progress
  4. 文件系统选择
    • ext4:稳定、兼容性好,通用选择。
    • xfs:擅长处理大文件和高并发,适合数据存储。
    • btrfs:支持快照、压缩等高级特性,但相对年轻。
  5. **/etc/fstab**:使用 UUID= 而非 /dev/sdX 来标识分区,避免设备名变化导致启动失败。使用 blkid 命令获取 UUID。