【问题标题】:bhyve VM & while loopbhyve 虚拟机和 while 循环
【发布时间】:2020-11-18 01:33:05
【问题描述】:

我正在尝试使用以下 while 循环来实现以下目标:

  1. 循环中的第一个命令是只运行一次安装。
  2. 第二条命令是在没有ISO文件的情况下正常运行VM。

你能告诉我实现这一目标的正确方法吗?

代码:

# The VM loop

while true; do # Start the installation

    bhyve -Hw -c ${cpu} -m ${ram}G \
      -s 0,hostbridge \
      -s 1,virtio-net,${tap} \
      -s 2,virtio-blk,/dev/zvol/zroot/VMs/${name}/disk0 \
      -s 3,ahci-cd,${FreeBSD_ISO} \
      -s 29,fbuf,tcp=0.0.0.0:${vnc},w=1024,h=768,wait \
      -s 30,xhci,tablet \
      -s 31,lpc \
      -l bootrom,/zroot/VMs/efi.fd \
      ${name}

    exit=$?

    if [ $exit -eq 0 ]; then

        bhyve -Hw -c ${cpu} -m ${ram}G \
          -s 0,hostbridge \
          -s 1,virtio-net,${tap} \
          -s 2,virtio-blk,/dev/zvol/zroot/VMs/${name}/disk0 \
          -s 29,fbuf,tcp=0.0.0.0:${vnc},w=1024,h=768 \
          -s 30,xhci,tablet \
          -s 31,lpc \
          -l bootrom,/zroot/VMs/efi.fd \
          ${name}

    elif [ $exit -ne 0 ]; then

        break;

    fi

done > /dev/null 2>&1 &

bhyve 的退出状态。

0 重启
1 关机
2 停止
3 三重故障
4 因错误退出

【问题讨论】:

  • edit您的问题并添加更多详细信息:假设脚本不起作用,请描述实际发生的情况以及您希望发生的情况。复制并粘贴实际输出和/或错误消息,并显示预期的输出(如果有)。

标签: shell unix sh


【解决方案1】:

我是通过从循环中删除第一个命令(安装)并在安装命令完成后启动循环来实现的,如下所示:

Installation()
{
bhyve -Hw -c ${cpu} -m ${ram}G \
  -s 0,hostbridge \
  -s 1,virtio-net,${tap} \
  -s 2,virtio-blk,/dev/zvol/zroot/VMs/${name}/disk0 \
  -s 3,ahci-cd,${FreeBSD_ISO} \
  -s 29,fbuf,tcp=0.0.0.0:${vnc},w=1024,h=768,wait \
  -s 30,xhci,tablet \
  -s 31,lpc \
  -l bootrom,/zroot/VMs/efi.fd \
  ${name}
} 
Starting()
{
bhyve -Hw -c ${cpu} -m ${ram}G \
  -s 0,hostbridge \
  -s 1,virtio-net,${tap} \
  -s 2,virtio-blk,/dev/zvol/zroot/VMs/${name}/disk0 \
  -s 29,fbuf,tcp=0.0.0.0:${vnc},w=1024,h=768 \
  -s 30,xhci,tablet \
  -s 31,lpc \
  -l bootrom,/zroot/VMs/efi.fd \
  ${name}
}   
# Start the installation
Installation &&
# Starting the loop after completion of installation
while true; do
  Starting;
  es=$?
  if [ ${es} -ne 0 ]; then
  break;
  fi
done &

【讨论】:

  • 这回答的实际问题是什么?您没有在上面或此处描述此更改修复了您遇到的问题。
  • 顺便说一句,即使在固定代码中也存在一些引用问题 - 考虑通过 shellcheck.net 运行您的代码并修复它发现的内容。
  • 嗨查尔斯,我想为两个命令创建一个循环,第一个应该只运行一次。我通过从循环中删除它并在安装完成后运行循环解决了这个问题。
  • 有道理。你能提取一个关于这个的问题,并删除与该问题不直接相关的所有内容吗?我们不是脚本的集合,我们是编程问题及其答案的集合。
猜你喜欢
  • 2016-05-31
  • 2015-05-31
  • 1970-01-01
  • 2015-05-11
  • 2017-04-16
  • 1970-01-01
  • 2013-01-14
  • 2011-03-22
  • 2012-07-13
相关资源
最近更新 更多