我正在尝试预先安装 Ubuntu 12.04 服务器,并创建了一个在 2 个驱动器上创建 RAID 1 的配方,然后使用 LVM 对其进行分区。不幸的是,partman 在创建 LVM 卷时抱怨配方中没有可用于 LVM 的分区(在控制台中,它抱怨配方不可用)。
我追求的布局是 sdb 和 sdc 上的 RAID 1(从 USB 记忆棒安装,因此需要 sda),然后使用 LVM 创建启动、根和交换。
奇怪的是,如果我将 boot_lv 的挂载点更改为 home,配方可以正常工作(除了挂载在错误的位置),但在 /boot 上挂载时会失败
我知道我可以使用单独的 /boot 主分区,但有人能告诉我为什么会失败吗?下面是配方和相关选项。
## Partitioning using RAID
d-i partman-auto/disk string /dev/sdb /dev/sdc
d-i partman-auto/method string raid
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
#d-i partman-lvm/confirm boolean true
d-i partman-auto-lvm/new_vg_name string main_vg
d-i partman-auto/expert_recipe string \
multiraid :: \
100 512 -1 raid \
$lvmignore{ } \
$primary{ } \
method{ raid } \
. \
256 512 256 ext3 \
$defaultignore{ } \
$lvmok{ } \
method{ format } \
format{ } \
use_filesystem{ } \
filesystem{ ext3 } \
mountpoint{ /boot } \
lv_name{ boot_lv } \
. \
2000 5000 -1 ext4 \
$defaultignore{ } \
$lvmok{ } \
method{ format } \
format{ } \
use_filesystem{ } \
filesystem{ ext4 } \
mountpoint{ / } \
lv_name{ root_lv } \
. \
64 512 300% linux-swap \
$defaultignore{ } \
$lvmok{ } \
method{ swap } \
format{ } \
lv_name{ swap_lv } \
.
d-i partman-auto-raid/recipe string \
1 2 0 lvm - \
/dev/sdb1#/dev/sdc1 \
.
d-i mdadm/boot_degraded boolean true
#d-i partman-md/confirm boolean true
#d-i partman-partitioning/confirm_write_new_label boolean true
#d-i partman/choose_partition select Finish partitioning and write changes to disk
#d-i partman/confirm boolean true
#d-i partman-md/confirm_nooverwrite boolean true
#d-i partman/confirm_nooverwrite boolean true
答案1
经过一番谷歌搜索后,我发现了以下来自 partman-auto-lvm 的代码片段,似乎如果 lvm 配方在 LVM 上检测到 /boot 分区,它就会退出,尽管在 LVM 上完全可以有 /boot。根据我的研究,在 GRUB 2 之前,您无法从 LVM 启动,因此您需要单独的主启动分区。
# Make sure a boot partition isn't marked as lvmok
if echo "$scheme" | grep lvmok | grep -q "[[:space:]]/boot[[:space:]]"; then
bail_out unusable_recipe
fi
一种解决方法是不指定挂载点并从安装屏幕手动执行,但这在某种程度上违背了无人值守安装的目的。
答案2
经过反复尝试,我得出了以下配方和设置,我已使用它成功预置了我们的服务器。目前,它会在未经确认的情况下覆盖磁盘,因此在实际测试之前请调整选项。
## Partitioning using RAID
# The method should be set to "raid".
d-i partman-auto/method string raid
# Specify the disks to be partitioned. They will all get the same layout,
# so this will only work if the disks are the same size.
d-i partman-auto/disk string /dev/sda /dev/sdb
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-auto-lvm/new_vg_name string main_vg
# Next you need to specify the physical partitions that will be used.
d-i partman-auto/expert_recipe string \
multiraid :: \
256 512 256 raid \
$lvmignore{ } \
$primary{ } \
method{ raid } \
raidid{ 1 } \
. \
4000 5000 -1 raid \
$lvmignore{ } \
method{ raid } \
raidid{ 2 } \
. \
2000 5000 -1 ext4 \
$defaultignore{ } \
$lvmok{ } \
method{ format } \
format{ } \
use_filesystem{ } \
filesystem{ ext4 } \
mountpoint{ / } \
lv_name{ root_lv } \
. \
512 512 300% linux-swap \
$defaultignore{ } \
$lvmok{ } \
method{ swap } \
format{ } \
lv_name{ swap_lv } \
.
# Last you need to specify how the previously defined partitions will be
# used in the RAID setup. Remember to use the correct partition numbers
# for logical partitions. RAID levels 0, 1, 5, 6 and 10 are supported;
# devices are separated using "#".
# Parameters are:
# <raidtype> <devcount> <sparecount> <fstype> <mountpoint> \
# <devices> <sparedevices>
d-i partman-auto-raid/recipe string \
1 2 0 ext3 /boot \
raidid=1 \
. \
1 2 0 lvm - \
raidid=2 \
.
d-i mdadm/boot_degraded boolean true
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select Finish partitioning and write changes to disk
d-i partman/confirm boolean true
d-i partman-md/confirm_nooverwrite boolean true
d-i partman/confirm_nooverwrite boolean true