通过 Cobbler 管理磁盘分区的实践指南

一、总体思路与关键点
说到 Cobbler 管理分区,其实核心思路并不复杂:安装器的磁盘分区策略,说白了就是由 Kickstart(RHEL/CentOS)或 preseed(Debian/Ubuntu)模板来驱动的。常见的做法是,在 profile 或 system 级别为不同机型、不同磁盘规格维护多套分区模板,然后通过变量拆分公共片段,必要时再在 %pre 或 %post 阶段做些补丁工作。
那么,具体操作中有哪些关键点?
- 清盘:用
clearpart --all --initlabel把磁盘清理干净,这是第一步。 - 分区定义:用
part命令指定 /boot、/、swap、biosboot 等分区,同时可控制文件系统类型、大小以及是否允许增长。 - 自动分区:如果需求比较通用,直接用
autopart让安装器帮你搞定一切。 - 软 RAID:需要创建
raid.XX分区,然后通过raid指令组装成 md 设备。 - 引导方式:传统 BIOS 必须配
biosboot分区;UEFI 则需要一个--fstype=efi的 EFI 分区,大小通常在 200M 到 500M 之间。
二、RHEL/CentOS 的 Kickstart 示例
标准分区(MBR,适配多数服务器)
# 清盘并初始化卷标
clearpart --all --initlabel
# 引导分区(BIOS)
part biosboot --fstype=biosboot --size=1
# 启动分区
part /boot --fstype=ext4 --size=1024
# 根分区(示例 40GB)
part / --fstype=ext4 --size=40960
# 交换分区(示例 8GB)
part swap --fstype=swap --size=8192
LVM 示例(便于后续在线扩缩)
clearpart --all --initlabel
part /boot --fstype=ext4 --size=1024
part pv.01 --fstype=lvmpv --grow --ondisk=sda
volgroup vg_root pv.01
logvol / --vgname=vg_root --size=30G --name=lv_root
logvol swap --vgname=vg_root --size=8G --name=lv_swap
logvol /data --vgname=vg_root --size=1 --grow --name=lv_data
软 RAID-5 示例
clearpart --all --initlabel
part raid.01 --fstype=raid --grow --ondisk=sda --size=1
part raid.02 --fstype=raid --grow --ondisk=sdb --size=1
part raid.03 --fstype=raid --grow --ondisk=sdc --size=1
part raid.04 --fstype=raid --grow --ondisk=sdd --size=1
part raid.05 --fstype=raid --grow --ondisk=sde --size=1
raid / --device=md0 --fstype=ext4 --level=5 raid.01 raid.02 raid.03 raid.04 raid.05
使用提示
- 如果对分区没太细的要求,直接用
autopart代替手工逐条定义,省时省力。 - 想复用分区等公共配置段?可以在 ks 模板中引用
$SNIPPET('xxx'),挺方便的。
三、Ubuntu 的 preseed 示例
原子模式(自动 LVM)
这种方式最适合快速交付和通用场景:安装器会自动创建一个约 250M 的 /boot 分区,然后创建一个约 10G 的卷组,swap 分区大小接近内存大小,剩下的空间全部给 /。
手工 LVM 模式(精细控制)
# 磁盘与分区
d-i partman-auto/method string lvm
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
# 引导分区(MBR)
d-i partman-auto/expert_recipe string \
boot-root ::
256 256 256 ext2 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext2 } \
mountpoint{ /boot } .
10240 10240 10240 ext4 \
$lvmok{ } lv_name{ lv_root } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ / } .
512 512 512 linux-swap \
$lvmok{ } lv_name{ lv_swap } \
method{ swap } format{ } .
5120 5120 5120 ext4 \
$lvmok{ } lv_name{ lv_www } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ /www } .
d-i partman-auto/choose_recipe select boot-root
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/confirm_write_new_label boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman/choose_partition finish
d-i partman/confirm finish
简单说:原子模式适合“开箱即用”,而手工模式则对 /boot、/、swap、/data 等分区的大小有明确规划的场景。
四、大容量磁盘与 LVM 的注意事项
这里有两个地方需要特别留心。
- 大于 16TB 的磁盘:传统 ext4 在 32 位寻址下存在大约 16TB 的上限。在 CentOS 6 上,得升级工具并启用 64 位模式才能支持,而 CentOS 5 及以下根本不支持。如果使用 ext4 的
--grow去填满超过 16TB 的磁盘,可能会出现“只能用到 16TB”或者格式化异常的情况。建议优先使用 XFS,或者在装机完成后对数据盘重新分区/格式化,避免安装阶段触发 ext4 的限制。 - LVM 与后续扩容:LVM 虽然方便在线扩容,但根分区在线扩容的可行性取决于文件系统本身的支持能力(ext4 和 xfs 的在线扩容能力差别不小)。在生产环境做变更前,务必先在测试环境验证,并准备好回滚方案。
五、安装后处理与数据盘自动化
安装完系统后,如果还有未用上的硬盘,完全可以在 %post 阶段自动完成分区、格式化和挂载。下面给一个示例脚本的思路:
%post
NUM=01
for DEVICE in $(awk '$NF ~ /sd/ && $NF !~ /[0-9]$/ {print $NF}' /proc/partitions | sort); do
DEVICE="/dev/$DEVICE"
# 跳过已挂载或已用作 swap 的设备
[[ -b ${DEVICE}1 ]] && FSTYPE=$(parted -s ${DEVICE}1 print 2>/dev/null | awk '/^ / {print $5}')
if [[ $FSTYPE == "swap" ]]; then continue; fi
LABEL="hadoop${NUM}"
if ! e2label ${DEVICE}1 2>/dev/null; then
parted -s $DEVICE mklabel gpt
parted -s $DEVICE mkpart primary ext4 0% 100%
partprobe; sleep 3
mkfs.ext4 -q -L "$LABEL" ${DEVICE}1
else
e2label ${DEVICE}1 "$LABEL"
fi
grep -q "LABEL=$LABEL" /etc/fstab || \
echo "LABEL=$LABEL /$LABEL ext4 defaults,noatime,nodiratime 0 0" >>/etc/fstab
mkdir -p "/$LABEL"
NUM=$(printf "%02d" $((10#$NUM + 1)))
done
%end
这个脚本可以批量初始化类似 /data01、/data02 的数据盘。当然,你也可以按需改成 xfs、调整挂载选项,甚至后续用 systemd mount 单元或 Ansible 来做更灵活的编排。