Linux 分区自动化管理实践
一、方案总览与选型
| 场景 | 推荐工具 | 关键要点 |
|---|---|---|
| 一次性脚本化分区、格式化、挂载 | parted/sfdisk + mkfs + mount | 非交互、可脚本化;大磁盘用 GPT;注意对齐与数据安全 |
| 大规模与可重复部署 | Ansible(配合 LVM 模块) | 批量执行、幂等、可回滚,适合多机标准化 |
| 安装阶段无人值守分区 | Kickstart(RHEL/CentOS)、AutoYaST(SUSE) | 安装即分区,适合新机交付 |
| 图形化与半自动 | GParted / GNOME Disks / KDE Partition Manager | 适合桌面或小规模操作,不便于批量 |
以上工具覆盖了从安装期到运维期的自动化需求,脚本方案以 parted/sfdisk 为核心,批量与标准化推荐 Ansible,安装期可用 Kickstart/AutoYaST。
二、命令行脚本自动化
使用 parted 全自动分区、格式化并挂载(适配大磁盘,GPT)
#!/usr/bin/env bash
set -Eeuo pipefail
DISK="${1:-/dev/sdb}"
MOUNT="/data"
[[ $EUID -ne 0 ]] && { echo "请使用 root"; exit 1; }
# 简单盘符校验
[[ ! -b "$DISK" ]] && { echo "设备不存在: $DISK"; exit 2; }
# 使用 parted 非交互创建 GPT 分区(整个磁盘)
parted -s "$DISK" mklabel gpt
parted -s "$DISK" mkpart primary ext4 0% 100%
# 等待内核重读分区表
udevadm settle || sleep 2
PART="${DISK}1"
# 若已有文件系统则跳过格式化
if ! blkid -p "$PART" >/dev/null 2>&1; then
mkfs.ext4 -F "$PART"
fi
mkdir -p "$MOUNT"
UUID=$(blkid -s UUID -o value "$PART")
# 幂等追加 fstab(避免重复)
grep -qxF "UUID=$UUID $MOUNT ext4 defaults 0 2" /etc/fstab || \
echo "UUID=$UUID $MOUNT ext4 defaults 0 2" >> /etc/fstab
mount -a || { echo "mount 失败,请检查 /etc/fstab"; exit 3; }
echo "已挂载到 $MOUNT(UUID=$UUID)"
说明:
使用 sfdisk 的脚本化分区示例(MBR,便于“描述即分区”)
#!/usr/bin/env bash
set -Eeuo pipefail
DISK="${1:-/dev/sdb}"
[[ $EUID -ne 0 ]] && { echo "请使用 root"; exit 1; }
[[ ! -b "$DISK" ]] && { echo "设备不存在: $DISK"; exit 2; }
# 备份当前分区表
sfdisk -d "$DISK" > "${DISK}.sfdisk.bak"
# 从 stdin 描述分区:label + 一个从 1MiB 开始、占满剩余空间的 Linux 分区
sfdisk "$DISK" <<'EOF'
label: dos
unit: sectors
,,83
EOF
udevadm settle || sleep 2
PART="${DISK}1"
mkfs.ext4 -F "$PART"
mkdir -p /data
UUID=$(blkid -s UUID -o value "$PART")
grep -qxF "UUID=$UUID /data ext4 defaults 0 2" /etc/fstab || \
echo "UUID=$UUID /data ext4 defaults 0 2" >> /etc/fstab
mount -a
说明:
三、使用 LVM 获得弹性容量
#!/usr/bin/env bash
set -Eeuo pipefail
PV="/dev/sdb"
VG="data_vg"
LV="data_lv"
SIZE="100%FREE" # 或例如 50G
MOUNT="/data"
yum install -y lvm2 || apt-get update && apt-get install -y lvm2
# 初始化并创建卷组/逻辑卷
pvcreate "$PV"
vgcreate "$VG" "$PV"
lvcreate -l "$SIZE" -n "$LV" "$VG"
mkfs.ext4 -F "/dev/$VG/$LV"
mkdir -p "$MOUNT"
UUID=$(blkid -s UUID -o value "/dev/$VG/$LV")
grep -qxF "UUID=$UUID $MOUNT ext4 defaults 0 2" /etc/fstab || \
echo "UUID=$UUID $MOUNT ext4 defaults 0 2" >> /etc/fstab
mount -a
说明:
四、批量与标准化部署
ansible-galaxy collection install community.general- hosts: storage_nodes
become: yes
vars:
pv: /dev/sdb
vg: data_vg
lv: data_lv
size: 100%FREE
mount: /data
fstype: ext4
tasks:
- name: 安装 LVM 工具
package:
name: lvm2
state: present
- name: 初始化物理卷
community.general.lvg:
vg: "{{ vg }}"
pvs: "{{ pv }}"
state: present
- name: 创建逻辑卷
community.general.lvol:
vg: "{{ vg }}"
lv: "{{ lv }}"
size: "{{ size }}"
state: present
- name: 创建文件系统
filesystem:
fstype: "{{ fstype }}"
dev: "/dev/{{ vg }}/{{ lv }}"
- name: 创建挂载点
file:
path: "{{ mount }}"
state: directory
mode: '0755'
- name: 获取 LV UUID
command: blkid -s UUID -o value "/dev/{{ vg }}/{{ lv }}"
register: lv_uuid
changed_when: false
- name: 配置 fstab 并挂载
mount:
path: "{{ mount }}"
src: "UUID={{ lv_uuid.stdout }}"
fstype: "{{ fstype }}"
opts: defaults
state: mounted
说明:
五、安装期自动化与注意事项
%pre/%post 或分区指令中定义分区方案,实现装机即分区。mount -a 校验。sfdisk -d /dev/sdX > backup.txt),必要时先快照或停机。