partman
多年来我一直使用以下设置来自动安装虚拟机:
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
这会在开始时创建一个小的交换分区,并将剩余的磁盘空间用作根分区。这很有效,当我需要增加虚拟磁盘的大小时,可以轻松扩展分区。
现在,我尝试调整此配方以安装多个相同的裸机服务器。为此,我只需切换分区并将大小设置为更合理的值,以适应具有 256GB RAM 和 460GB 系统磁盘(硬件 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 之间的交换分区。
其实不然。它创建一个 450MB 的分区,后面跟着一个 460GB 的交换分区。
当我使用预置的虚拟机安装同一台机器时,分区按照预置文件中的定义正确创建:
那么,我对裸机的配方做错了什么?
如果重要的话,安装 iso 基于 Ubuntu 16.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 { } \ .
# .
这没有什么区别,最终的根分区始终只有 453MB。
答案1
特别说明
没有提到是否有 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{ } .
回答这个问题
要使用余数,请使用-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 { } \
.
并确保它真的使用新的预置文件。我喜欢将其放入网络启动 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.cfg
答案2
总结:
安装了错误的图像。感谢@Peter 指出这一点。
长话短说:
在 Peters 评论之后,我重新检查了整个 iso 构建管道、.seed 文件、isolinux txt.cfg、自定义 bootlogo、构建 .iso 的 bash 脚本,没有发现任何问题。我再次更改了 .preseed 文件,这次添加了应作为 挂载的第三个分区/var
,重建了映像,在服务器的 BMC 界面中单击了“卸载”和“挂载”,重新启动,运行安装,你猜怎么着,它与之前的布局相同,没有额外的分区。我开始怀疑,我检查了/target/etc/issue
:
Ubuntu 16.04.1 LTS
那应该是 16.04.5。在我的安装测试期间,我完全重新创建了 Ubuntu .iso,以 16.04.5 为基础,而不是之前的 16.04.1(导致 iso 名称不同,因为 .iso 文件包含版本号)。
我有两种方法可以在这些 SuperMicro 主板上安装 ISO 映像。我可以连接到单个 BMC 并在那里安装 ISO,或者我可以使用 SuperMicro 服务器管理器一次在多台机器上安装 ISO。我有许多机器需要安装,所以我自然使用了 SSM 方法并在所有地方安装 ISO。
更改为 16.04.5 后,我仅直接在正在工作的主机的 BMC 中更改了文件名并重新挂载了它。我只得到了There is an iso file mounted.
确认,没有更多详细信息。
点击Save
挂载镜像页面上的按钮,会出现以下错误信息:
我没有以这种方式输入路径,这是由服务器管理器设置的,所以我假设它是正确的。显然它不正确。之后,我使用服务器管理器重新安装 .iso 文件,而不是直接在 BMC 上安装,然后就好了……
我已配置好了一切来测试这一点。
这个故事的寓意是:我浪费了大约一周的时间(以及你们这些乐于助人的人的宝贵时间),就因为一个廉价的 BMC 接口太愚蠢了。记住这一点,当你遇到无法解释的问题时,重新检查一切。