为 VM 应用程序创建包

若要创建 VM 应用程序,需要应用程序包和脚本才能正确安装、更新和删除应用程序。 本文介绍如何为可以用作 VM 应用程序有效负载的不同作系统和格式创建包和脚本。

在 Linux 上打包和安装 VM 应用程序

适用于 Linux 的第三方应用程序可以通过几种方式打包。 让我们探讨如何针对一些最常见情况创建安装命令。

.tar 和 .gz 文件

这些文件是压缩存档,可提取到所需位置。 检查原始包的安装说明,以防需要将其提取到特定位置。 如果 .tar.gz 文件包含源代码,请参阅包的说明以了解如何从源位置安装。

在 Linux 计算机上安装 golang 的安装命令示例:

sudo tar -C /usr/local -xzf go_linux

删除命令示例:

sudo rm -rf /usr/local/go

使用 .deb.rpm 和其他平台特定的包为互联网访问受限的 VM 创建应用程序包

可以为特定于平台的包管理器下载单独的包,但这些包通常不一定包含所有依赖项。 对于这些文件,还必须在应用程序包中包括所有依赖项,或者让系统包管理器通过 VM 可用的存储库来下载依赖项。 如果使用的 VM 在 Internet 访问方面受到限制,则必须自己打包所有依赖项。

找出依赖项可能有点棘手。 有第三方工具可以显示整个依赖项树。

以下过程演示如何识别应用程序依赖项,下载它们并将其打包为不同的 Linux OS 风格。

在 Ubuntu 中,你可以运行 sudo apt show <package_name> | grep Depends 显示执行 sudo apt-get install <packge_name> 命令时安装的所有包。 然后,可以使用该输出下载所有 .deb 文件,以创建可用作应用程序包的存档。

若要创建用于在 Ubuntu 上安装 PowerShell 的 VM 应用程序包,请执行以下步骤:

  1. 运行以下命令,使存储库能够下载 PowerShell 并识别新 Ubuntu VM 上的包依赖项
# Download the Microsoft repository GPG keys
wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb"
# Register the Microsoft repository GPG keys
sudo dpkg -i packages-microsoft-prod.deb
sudo rm -rf packages-microsoft-prod.deb
sudo apt update
sudo apt show powershell | grep Depends
  1. 请检查输出的“依赖”行,它列出了以下包:
Depends: libc6, lib32gcc-s1, libgssapi-krb5-2, libstdc++6, zlib1g, libicu72|libicu71|libicu70|libicu69|libicu68|libicu67|libicu66|libicu65|libicu63|libicu60|libicu57|libicu55|libicu52, libssl3|libssl1.1|libssl1.0.2|libssl1.
  1. 使用 sudo apt-get download <package_name> 下载其中的每个文件,然后创建包含所有文件的 tar 压缩存档。
  • Ubuntu 18.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download lib32gcc
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl1.1
sudo apt-get download libicu60
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
  • Ubuntu 20.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download lib32gcc-s1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl1.1
sudo apt-get download libicu66
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
  • Ubuntu 22.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download lib32gcc-s1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl3
sudo apt-get download libicu70
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
  • Ubuntu 24.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download lib32gcc-s1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl3t64
sudo apt-get download libicu74
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
  1. 此 tar 存档将是应用程序包文件。
  • 在这种情况下,安装命令为:
sudo tar -xvzf powershell.tar.gz && sudo dpkg -i *.deb
  • 删除命令为:
sudo apt remove powershell

使用 sudo apt autoremove,而不是明确尝试删除所有依赖项。 你可能已经安装了包含重叠依赖项的其他应用程序,在这种情况下,显式删除命令将失败。

如果你不想自行解决依赖项并且 apt 能够连接到存储库,则可以使用一个 .deb 文件来安装应用程序,并让 apt 处理依赖项。

安装命令示例:

dpkg -i <package_name> || apt --fix-broken install -y

在 Windows 上创建 VM 应用程序

Windows 中的大多数第三方应用程序作为 .exe 或 .msi 安装程序提供。 部分应用程序还可用作提取和运行 zip 文件。 让我们看看它们各自的最佳实践。

.exe 安装程序

安装程序可执行文件通常启动用户界面 (UI),并要求用户通过用户界面进行选择。 如果安装程序支持静默模式参数,则应将此参数包含在安装字符串中。

cmd.exe 还要求可执行文件具有扩展名 .exe,因此你需要重命名该文件,加上 .exe 扩展名。

如果想要创建 myApp.exeVM 应用程序包(作为可执行文件提供),则 VM 应用程序称为“myApp”,因此,假设应用程序包位于当前目录中,则编写命令:

"move .\\myApp .\\myApp.exe & myApp.exe /S -config myApp_config"

如果安装程序可执行文件不支持卸载参数,有些情况下你可以在测试计算机上查找注册表,以了解卸载程序所在的位置。

在注册表中,卸载字符串存储在 Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<installed application name>\UninstallString 中,以便我将内容用作删除命令:

'\"C:\\Program Files\\myApp\\uninstall\\helper.exe\" /S'

.msi 安装程序

要通过命令行来执行 .msi 安装程序,安装或删除应用程序的命令应使用 msiexec。 通常,msiexec 作为单独的进程运行,cmd 不会等待它完成,这可能会导致在安装多个 VM 应用程序时出现问题。 start 命令可以与 msiexec 结合使用,以确保在命令返回之前安装完成。 例如:

start /wait %windir%\\system32\\msiexec.exe /i myapp /quiet /forcerestart /log myapp_install.log

删除命令示例:

start /wait %windir%\\system32\\msiexec.exe /x myapp /quiet /forcerestart /log myapp_uninstall.log

通常,start 命令将在批处理脚本中调用。 如果与参数一起使用 /wait ,调用脚本将暂停,直到调用进程终止。 完成后,批处理脚本将检查 errorlevel 命令设置的 start 变量,然后退出,如下所示:

start /wait %windir%\\system32\\msiexec.exe /i myapp /quiet /forcerestart /log myapp_install.log
if %errorlevel% neq 0 exit /b %errorlevel%
...

压缩文件

对于.zip 或压缩文件,请将应用程序包的内容重命名并解压到所需的目标。

安装命令示例:

rename myapp myapp.zip && mkdir C:\myapp && powershell.exe -Command "Expand-Archive -path myapp.zip -destinationpath C:\myapp"

删除命令示例:

rmdir /S /Q C:\\myapp

后续步骤