温馨提示×

Linux分区:如何实现分区的自动化管理

小樊
42
2025-12-29 18:10:04
栏目: 智能运维

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)

    1. root 执行;2) 选择目标盘(如 /dev/sdb);3) 建 GPT 分区表并创建单一分区;4) 格式化为 ext4;5) 挂载到目录;6) 写入 /etc/fstab 使用 UUID 保证稳定性。
    #!/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)"
    

    说明:

    • parted 的 -s 为非交互模式;GPT 更适合 >2TB 磁盘;对齐默认已优化。
    • 使用 UUID 而非设备名(如 /dev/sdb1)写入 fstab,避免盘符漂移导致挂载错乱。
  • 使用 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
    

    说明:

    • sfdisk 适合批量与自动化,支持从标准输入读取布局;早期版本对 GPT 支持有限,复杂 GPT 场景优先用 parted/gdisk

三、使用 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
    
    说明:
    • LVM 提供卷组、逻辑卷、快照与在线调整等能力,便于后续按需扩容与维护。

四、批量与标准化部署

  • 使用 Ansible 管理 LVM(幂等、可重复)
    1. 安装集合:ansible-galaxy collection install community.general
    2. 示例 Playbook(创建 VG/LV/FS 并挂载):
    - 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
    
    说明:
    • Ansible 模块具备幂等性可回滚,适合大规模标准化交付与日常运维。

五、安装期自动化与注意事项

  • 安装期无人值守分区
    • Kickstart(RHEL/CentOS):在 %pre/%post 或分区指令中定义分区方案,实现装机即分区。
    • AutoYaST(SUSE):通过 XML 定义存储与分区,适合 SUSE 系的标准化安装。
  • 关键注意事项
    • 始终以 root 执行;操作前确认目标盘,避免误伤系统盘(如 /dev/sda)。
    • 大磁盘优先 GPT;MBR 对 >2TB 有局限。
    • 写入 /etc/fstab 建议使用 UUID,并在变更后用 mount -a 校验。
    • 变更前备份分区表(如 sfdisk -d /dev/sdX > backup.txt),必要时先快照或停机。
    • 生产环境先在测试环境验证脚本,确保幂等与可回滚流程可靠。

0