我正在尝试在 FreeBSD 下的 vm-bhyve 中自动安装 Alpine Linux,并预计在启动菜单超时并启动 Alpine Linux 安装后不久就会死亡。
#!/usr/bin/env expect
spawn vm install -f alpine alpine.iso # shortened for brevity
expect "localhost login:"
send "root\r"
...
这会导致以下错误:
"while executing
"send "root\r"
我怀疑,每当屏幕清除并开始启动时,都会让人感到困惑,以为程序已经完成了?结果,脚本就死了。
我以前从来没有以这种方式编写过期望代码,可以用期望代码来做到这一点吗?
我还尝试在生成 vm install cmd 之前设置全局超时,该命令启动后会立即进入客户机的控制台,但这并没有改变任何东西,所以我将其从上面的脚本中排除。在同一个位置休眠没有帮助,它只是延迟了启动(以及随后的失败,延迟量是我为休眠设置的量)。
编辑:我尝试在后台启动安装程序,休眠 30 秒,然后连接控制台。此时,Expect应该工作。
答案1
我在两种情况下都让它工作(vm install -f 和使用 vm 控制台连接到正在运行的 VM)。
在我的案例中,问题在于我以全新配置启动,而全新配置有一个无效设置(PCI 直通)。我以为我已经意外启动并正常工作;然而,我已经重新镜像了机器,我的配置被覆盖了。
使用 autoexpect 可以让我捕获更多原本无法获得的细节,这是一种准备预期脚本的好方法。
现在,对我来说,这个过程是执行 freebsd 安装,然后启动系统,并在启动时检查虚拟机是否存在,如果不存在,则使用 expect 创建它们。