多年来,我一直在使用以下partman设置来自动安装VM:
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string regular
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/alignment string "optimal"
d-i partman-auto/expert_recipe string \
boot-root :: \
64 512 300% linux-swap \
$primary{ } \
method{ swap } format{ } \
. \
500 10000 1000000000 ext4 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ / } \
.
d-i partman/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true这将在开头创建一个小交换分区,并为根分区使用磁盘的其余部分。当我需要增加虚拟磁盘的大小时,这可以很好地工作,并且允许简单的分区扩展。
现在,我正在尝试调整这个配方来安装一些相同的裸金属服务器。要做到这一点,我只需切换分区并将大小设置为具有256‘t和460’t系统磁盘的计算机(硬件RAID1中的SSD,但这不重要):
boot-root :: \
32768 65536 1000000000 ext4 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ / } \
. \
16384 16384 65536 linux-swap \
$primary{ } \
method{ swap } format{ } \
. 其余的partman*指令是相同的。
就我所理解的文档(和其他像这样的帖子)而言,这应该会创建一个大根分区,该分区几乎跨越整个磁盘,最后是16到64 GB的交换分区。
它创建了一个450‘t的分区,然后是一个460’t的交换分区。

当我安装同一台带有VM预置种子的机器时,分区将按照预设文件中的定义正确创建:

那么,我对裸金属机的配方做了什么错事?
如果重要的话,安装iso是基于Ubuntu16.04.5服务器iso。
fdisk /dev/sda和parted /dev/sda print的输出:

我尝试了更多的变体:
# this belongs to tha last block, as suggested by @Peter
#d-i partman-basicfilesystems/choose_label string gpt
#d-i partman-basicfilesystems/default_label string gpt
#d-i partman-partitioning/choose_label string gpt
#d-i partman-partitioning/default_label string gpt
#d-i partman/choose_label string gpt
#d-i partman/default_label string gpt
d-i partman-auto/expert_recipe string \
boot-root :: \
##########################
65536 1 -1 ext4 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ / } \
. \
65536 65536 65536 linux-swap \
$primary{ } \
method{ swap } format{ } \
.
##########################
# 1 1 -1 ext4 \
# $primary{ } $bootable{ } \
# method{ format } format{ } \
# use_filesystem{ } filesystem{ ext4 } \
# mountpoint{ / } \
# . \
# 65536 65536 65536 linux-swap \
# $primary{ } \
# method{ swap } format{ } \
# .
##########################
# 32768 50 5242880 ext4 \
# $primary{ } $bootable{ } \
# method{ format } format{ } \
# use_filesystem{ } filesystem{ ext4 } \
# mountpoint{ / } \
# . \
# 16384 100 65536 linux-swap \
# $primary{ } \
# method{ swap } format{ } \
# .
##########################
# use along with the annoted partman-* directives above
# 538 538 1075 free \
# $iflabel{ gpt } \
# $reusemethod{ } \
# method{ efi } \
# format{ } \
# . \
# 1 1 -1 ext4 \
# $primary{ } $bootable{ } \
# method{ format } format{ } \
# use_filesystem{ } filesystem{ ext4 } \
# mountpoint{ / } \
# . \
# 65536 65536 65536 linux-swap \
# $primary{ } \
# method{ swap } format { } \ .
# .这并没有什么区别,结果的根分区总是只有453‘t。
发布于 2019-02-21 07:41:04
TL;DR:
安装了错误的图像。谢谢彼得给我指路。
The长篇故事:
在彼得斯的评论之后,我重新检查了我的整个iso构建管道、.seed文件、isolinux txt.cfg、自定义引导标志、构建.iso的bash脚本,没有发现任何问题。我再次更改了.preseed文件,这次添加了第三个分区,应该以/var的形式挂载,重建映像,在服务器的BMC接口上单击“卸载”和“挂载”,重新启动,运行安装,然后猜怎么着,它的布局和以前一样,没有额外的分区。我开始怀疑,我检查了/target/etc/issue:
Ubuntu 16.04.1 LTS应该是16.04.5。在我的安装测试中,我完全重新创建了,它基于16.04.5而不是以前的16.04.1 (导致了一个不同的.iso名称,因为.iso文件包含版本号)。
我有两种方法将ISO图像安装到那些SuperMicro板上。我可以连接到单个BMC并在那里挂载ISO,或者可以使用SuperMicro服务器管理器一次在多台计算机上挂载ISO。我有许多机器要安装,所以我自然地使用SSM方法,并安装ISO无处不在。
在更改到16.04.5之后,我只在我正在处理的主机的BMC中直接更改了文件名并重新挂载它。我只得到There is an iso file mounted.作为确认,没有更多的细节。
单击挂载映像页上的Save按钮将导致以下错误消息:

我没有以这种方式输入路径,这是由服务器管理器设置的,所以我假设它是正确的。显然不是。在这之后,我用服务器管理器而不是直接在BMC上重新装入.iso文件,然后瞧.

正是我所配置的来测试这个。
这个故事的寓意是:我浪费了大约一个星期的时间(还有你们这些乐于助人的宝贵时间),仅仅是因为一个廉价的BMC界面的愚蠢。记住这一点,当你遇到无法解释的问题时,重新检查每件事。
发布于 2019-02-19 20:52:38
Special注释
没有提到是否有bios_grub、ESP、GPT或MBR,也没有提到固件使用哪种方法。当使用GPT时,您需要一个或另一个(或两者兼备)。因此,将会发生的是安装程序将为您选择,基于一些未知的标准,可能与磁盘大小有关。为了强制使用GPT,您可以设置这样的东西(我记得,尽管使用了我在这里找到的所有6种方法,但这并不一定总是有效的):
d-i partman-basicfilesystems/choose_label string gpt
d-i partman-basicfilesystems/default_label string gpt
d-i partman-partitioning/choose_label string gpt
d-i partman-partitioning/default_label string gpt
d-i partman/choose_label string gpt
d-i partman/default_label string gpt例如,对于bios_grub,您可以设置:
1 1 1 free \
$primary{} \
$bios_boot{} \
method{ biosgrub } \
. \(我没有在其中放一个$iflabel{ gpt },这可能很有用,因为如果出了什么问题,然后将它从MBR转换为GPT,您需要保留空间)
对于EFI (无耻地从预置debian安装- EFI复制和粘贴并且没有删除iflabel):
538 538 1075 free
$iflabel{ gpt }
$reusemethod{ }
method{ efi }
format{ } .回答问题的And
要使用剩余的值,您使用的是-1,而不是任意大的数字,然后将其他数字设置为伪值,如1。我只是对不同的硬件使用不同的预置文件,而不是debian的自动文件。所以我把它设定为65536,而不是一个范围。
d-i partman-auto/expert_recipe string \
boot-root :: \
1 1 -1 ext4 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ / } \
. \
65536 65536 65536 linux-swap \
$primary{ } \
method{ swap } format { } \
.并确保它是<#>真的使用您的新预置文件。我喜欢把它放在netboot initrd映像中,因为这样它就不依赖于网络等等,并且发现它很好用。如果您更改了上面的内容,但它不工作,检查它一次又一次。如果是http/tftp,请检查http/tftp日志或tcpdump。或者做一个你一定会注意到的改变,看看它是否做到了。
如果是initrd,看看initrd,看看它是否真的在那里。例如:
cd emptydir
gunzip -c path_to_initrd | cpio -i
# It must be named "preseed.cfg" if it's in the initrd.
cat preseed.cfghttps://serverfault.com/questions/953322
复制相似问题