使用PowerCli来创建自定义ESXi ISO镜像

之前我们封装ESXi ISO镜像大多使用的是GitHub – VFrontDe/ESXi-Customizer-PS: PowerCLI script that greatly simplifies and automates the process of creating fully patched and customized VMware ESXi installation images 这个项目的powershell脚本,把一些社区版驱动(比如网卡驱动,USB网卡驱动等)封装进ESXi ISO,这样安装时就可以直接识别相应的硬件了。

实际上上述脚本就是基于VMware.PowerCLI 来实现的。PowerCLI是VMware的一个非常强大的Powershell命令库,有近700 cmdlets 可以用来管理和自动化VMware很多产品(比如vSphere, vCloud Director, vRealize Operations Manager, vSAN, NSX-T, VMware Cloud Services, VMware Cloud on AWS, VMware HCX, VMware Site Recovery Manager, and VMware Horizon environments)。而PowerCLI 12.0.0版本更新中,关于ISO镜像,有如下描述:

New cmdlets for managing auto-bootstrapping and new-style depots in vSphere 7.0 have been added to the VMware.DeployAutomation and VMware.ImageBuilder module:

New/Set/Reset-LCMClusterRuleWithTransform
Get-DepotAddons
Get-DepotBaseImages
Get-DepotComponents
Get-DepotInfo
Get-DepotVibs
New-IsoImage
New-PxeImage

我们注意到它提到了加入了 New-IsoImage (通过VMware.ImageBuilder module)。

查询相关文档,New-IsoImage Command | VMware PowerCLI ReferenceCreate a Custom ESXi ISO Image with PowerCLI Cmdlets (vmware.com) 有很详细的使用方法。

接下来我们在Windows 11 (Windows 10同理)环境下配置下环境来学习下用法。

  1. “以管理员身份运行” Windows Powershell 或者Windows Terminal。
  2. Install-Module -Name VMware.PowerCLI 此过程中如果有提示是否安装NuGet以及是否要从”PSGallery”安装模块请选择“是”,“全是”。视网络情况,此安装过程可能需要几分钟。
  3. 设置Execution policy, Windows 默认不允许执行此类第三方脚本Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine 具体详细用法可以参照 Set-ExecutionPolicy (Microsoft.PowerShell.Security) – PowerShell | Microsoft Docs
  4. Import-Module VMware.ImageBuilder
  5. 我们先使用VMwre的官方online repo来查看有哪些Image profile Get-DepotBaseImages -Depot https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml 查询需要几十秒:

Version Vendor Release date
——- —— ————
7.0.0-1.25.16324942 VMware, Inc. 06/15/2020 23:00:00
7.0.0-1.20.16321839 VMware, Inc. 06/15/2020 23:00:00
7.0.0-1.0.15843807 VMware, Inc. 03/16/2020 08:40:41
7.0.1-0.35.19324898 VMware, Inc. 02/14/2022 23:00:00
7.0.1-0.15.17168206 VMware, Inc. 11/18/2020 23:00:00
7.0.1-0.10.17119627 VMware, Inc. 11/03/2020 23:00:00
7.0.1-0.25.17325551 VMware, Inc. 12/16/2020 23:00:00
7.0.1-0.20.17325020 VMware, Inc. 12/16/2020 23:00:00
7.0.1-0.30.17551050 VMware, Inc. 02/03/2021 23:00:00
7.0.1-0.0.16850804 VMware, Inc. 09/04/2020 16:33:22
7.0.2-0.0.17867351 VMware, Inc. 04/28/2021 23:00:00
7.0.2-0.15.18295176 VMware, Inc. 08/23/2021 23:00:00
7.0.2-0.20.18426014 VMware, Inc. 08/23/2021 23:00:00
7.0.2-0.25.18538813 VMware, Inc. 09/13/2021 23:00:00
7.0.2-0.30.19290878 VMware, Inc. 02/14/2022 23:00:00
7.0.3-0.20.19193900 VMware, Inc. 01/17/2022 23:00:00
7.0.3-0.30.19482531 VMware, Inc. 03/28/2022 23:00:00
7.0.3-0.35.19482537 VMware, Inc. 03/28/2022 23:00:00

其实-Depot这个参数也是可以指向一个本地的离线包(非ISO),比如:

Get-DepotBaseImages -Depot C:\CustomImage\VMware-ESXi-7.0U3c-19193900-depot.zip

Version Vendor Release date
——- —— ————
7.0.3-0.20.19193900 VMware, Inc. 01/17/2022 23:00:00

类似的还有Get-DepotAddons 和 Get-DepotComponents

比如可以查询社区版网卡驱动包:

Get-DepotComponents -Depot C:\CustomImage\Net-Community-Driver_1.2.7.0-1vmw.700.1.0.15843807_19480755.zip

  • 接下来创建一个自定义镜像的Spec (json格式):
{
    "base_image": {
        "version": "7.0.3-0.35.19482537"
    },
    "components": {
       "Net-Community-Driver": "1.2.7.0-1vmw.700.1.0.15843807"
   }
}
  • 利用前面查询到的离线包,驱动文件和spec文件来制作自定义镜像:
New-IsoImage -Depots "c:\CustomImage\VMware-ESXi-7.0U3c-19193900-depot.zip" , "c:\CustomImage\Net-Community-Driver_1.2.7.0-1vmw.700.1.0.15843807_19480755.zip" -SoftwareSpec "c:\CustomImage\spec.json" -Destination "c:\CustomImage\ESXi-70U3c-custom.iso"

此方法尝试封装USB NIC Flings时会报错,是该驱动的一个小bug,估计后续会修复。

New-IsoImage : Error retrieving file for VIB 'VMW_bootbank_vmkusb-nic-fling_1.8-3vmw.703.0.15.51233328':
("<zipfile.ZipExtFile name='vib20/vmkusb-nic-fling/VMW_bootbank_vmkusb-nic-fling_1.8-3vmw.703.0.15.51233328.vib'
mode='r' compress_type=deflate>", "Error opening file object for VIB
'VMW_bootbank_vmkusb-nic-fling_1.8-3vmw.703.0.15.51233328': Expected value '[]' for attribute 'swplatforms', but found
value '[<vmware.esximage.Vib.SoftwarePlatform object at 0x0000015A1ECEBB08>]'.").

ESXi社区版网卡驱动2022年3月更新

https://flings.vmware.com/community-networking-driver-for-esxi 社区版网卡驱动再次更新.

从changelog看,此次更新内容如下:
Mar 15, 2022 – v1.2.7

      Net-Community-Driver_1.2.7.0-1vmw.700.1.0.15843807_19480755.zip

md5: cd505cfc2e435510b2e23e87870e4822

What’s New:

Support for additional Intel I225 devices with any PHY ID

Support for new Intel I226-K devices with any PHY ID

Fixed potential deadlock in changing MTU

Fixed potential RX hang in device layer ops

Fixed potential PHY reset failure

重点的内容是增加了Intel I225的更多PHY ID,和对I226-K PHY ID的支持.

修复的是一些已知的稳定性问题.

推荐使用I225的网友在现有ESXi下更新或者重新封装ESXi.

说说ESXi虚拟交换机和端口组的“MAC地址更改”和“伪传输”

https://virtualtips.info/?p=316文章中提到过“MAC地址更改”和“伪传输”安全策略。作用范围和“混杂模式”是一样的。

这两个策略分别是做什么的呢?

先了解一些基本概念。

一个物理网卡的ROM中存储着它的MAC地址,不可更改,叫做“初始MAC地址”。

而在操作系统中,比如Windows,该网卡也有个MAC地址,叫做“有效MAC地址”,它是可以通过网卡属性或者注册表修改的。

在默认情况下,初始MAC地址和有效MAC地址是相同的,除非用户修改,修改后,通过物理网卡发送到网络上的帧,源MAC地址就是修改后的“有效MAC地址”,不同于固化的“初始MAC地址”。

虚拟网卡也有类似概念,固化的“初始MAC地址”就是在虚拟机VMX文件中的MAC地址,(ESXi管理员可以修改它,但对虚拟机系统来说,它是固化不可修改的)。而虚拟机系统中的网卡MAC地址,就是“有效MAC地址”,同样可以修改。这些MAC地址,vSphere/ESXi自然都是知道的。

MAC地址更改

ESXi知晓虚拟机的“初始MAC地址”和“有效MAC地址”,当两者不同时,需要执行相应的安全策略:

拒绝:此VM修改了MAC地址,它是想冒充别的VM吗?我把它的端口禁用掉。

允许:我知道VM修改了MAC地址,并启用它的端口。

此时,执行策略的是虚拟交换机,虽然我们说禁用了端口,但其实虚拟机OS本身是不知道的,因为并非在物理层或链路层断开网卡,而是丢弃了发给这个虚拟机OS的帧。

伪传输

MAC地址更改是修改“有效MAC地址”,此时通过此网卡向外传输的帧的源MAC地址也随着“有效MAC地址”修改了。还有些恶意软件,它不修改“有效MAC地址”,直接修改向外传输的帧的源MAC地址。伪传输这个策略检查的就是源MAC是否和“有效MAC地址”一致。

拒绝:当恶意软件修改了源MAC地址(伪造传输),该虚拟机的虚拟网卡就会删除该帧。但会允许没伪造的帧传输出去。

允许:随便什么源MAC,随便发。

此时,执行策略的是虚拟网卡。

两个策略的区别:

MAC地址更改比较的是“有效MAC地址”和“初始MAC地址”,方向是入站(从外界向虚拟机网卡传输的帧),而伪传输比较的是“源MAC”和“有效MAC地址”,方向是出站(从虚拟机网卡向外界发送的帧)。前者是断开入站的端口,后者是过滤出站的伪传输帧。

这两个安全策略可以通过类似“网络执法官”之类的应用配合ARP和PING命令来验证。

参考文档:

MAC 地址更改 (vmware.com)

伪传输 (vmware.com)

说说ESXi虚拟交换机和端口组的“混杂模式”

很多Up主在ESXi虚拟机软路由教程里都提到了ESXi虚拟交换机的安全里要设置“混杂模式”,但基本没有太详细说明什么是”混杂模式”,什么情况要开启“混杂模式”的,先给自己挖个坑,明天出玩回来写一下。

游玩归来填坑~(时隔快一年,再次填坑。)

vSphere虚拟网络02 – 虚拟交换机中,我介绍过vSphere的两种虚拟交换机。标准和分布式。关于“混杂模式”的生效范围,两种虚拟交换机也是有所区别的。以标准虚拟交换机为例,虚拟交换机级别的安全下有“混杂模式”,虚拟交换机的端口组可以继承虚拟交换机的安全属性,也可以覆盖该安全属性。而分布式交换机的”混杂模式“则是作用在端口组和端口级别。PS: 另外的两种安全策略“MAC地址更改”和“伪传输”和“混杂模式”是同理的。可参照官方文档 安全策略,在《关于vSphere网络连接》这个文档中。

关于混杂模式的解释:

混杂模式会清除虚拟机适配器执行的任何接收筛选,以便客户机操作系统接收在网络上观察到的所有流量。默认情况下,虚拟机适配器不能在混杂模式中运行。

尽管混杂模式对于跟踪网络活动很有用,但它是一种不安全的运行模式,因为混杂模式中的任何适配器均可访问数据包,即使某些数据包是否仅由特定的网络适配器接收也是如此。这意味着虚拟机中的管理员或根用户可以查看发往其他客户机或主机操作系统的流量。

注:有时您可能确实需要将标准虚拟交换机或分布式虚拟交换机配置为在混杂模式中运行(例如运行网络入侵检测软件或数据包嗅探器时)。

物理交换机是一个点对点的设备,它维护一个连接到到它上面的设备的MAC地址表。所以它可以实现只把数据送达到指定MAC地址的设备所连接的端口。

虚拟交换机在这方面也是同理。

在虚拟交换机默认不开启混杂模式时,举个例子,假设vSwitch0交换机下有两个端口组,端口组1下有若干Windows虚拟机用于员工办公使用,端口组2下一台Linux虚拟机,管理员用来进行一些网络分析。当我们在端口组2的Linux虚拟机上安装Wireshark之类的抓包工具时,只能抓取到发送到此台Linux虚拟机的数据包(上面提到的点对点),而抓取不到端口组1中的Windows虚拟机之间的数据包或者外界发到Windows虚拟机的数据包,也就是说Wireshark此时是不能远程抓包的。

我们可以对vSwitch0开启混杂模式,或者对端口组2开启混杂模式。推荐对端口组开启,授予权限或安全策略时,一般建议遵守最小化原则。

当端口组2开启混杂模式时,Linux虚拟机就可以抓取vSwitch0上所有数据包了。

这意味着虚拟机中的管理员或根用户可以查看发往其他客户机或主机操作系统的流量。

一个相对易懂的描述就是,混杂模式所做的就是将通过此虚拟交换机的数据流量开放给开启了混杂模式的端口组下面所连接的虚拟机可见。(所以如果是整个虚拟交换机开启混杂模式,就是此虚拟交换机所有流量开放给虚拟交换机下的所有虚拟机都可见。)

如果想尝试上述实验,可以照此创建实验环境,使用Wireshark或者tcpdump在Linux虚拟机上尝试抓取Windows虚拟机的数据包。记得修改混杂模式后重启下虚拟机。

ESXi社区版NVMe驱动更新v1.1

Community NVMe Driver for ESXi | VMware Flings 最近更新,支持到了ESXi 7.0,支持了三款NVMe设备:

VendorVendorIDProductID
ADATA0x1cc18201
Micro/Crucial0xc0a90x2263
Silicon Motion0x126f0x2262

也就是说能匹配以上vid,pid的NVMe设备就可以通过此驱动在ESXi上识别并使用。(在6.7U2更新时,由于ESXi遵照了NVMe 1.3 规范去识别和支持设备,某些消费级别的NVMe因为不支持该规范而无法被ESXi识别并使用,虽说也有用ESXi6.5的某些文件进行替换的变通办法,但还是很麻烦。)

可以下载此驱动,封装到ESXi安装镜像,也可以在已安装好的ESXi系统中离线安装此驱动。

esxcli software vib install -d /xxxxxx/nvme-community-driver_1.0.1.0-2vmw.700.1.0.15843807-component-18290856.zip

ESXi 社区版网卡驱动

最近 VMware的flings网站里新增加了Community Networking Driver for ESXi | VMware Flings.

此驱动旨在对一些官方安装包里不支持的网卡提供一个相对稳定的网卡驱动,可以通过封装到安装镜像或者在现有的ESXi主机上安装来使用.

从requirements一页中可以看到此驱动支持了哪些网卡.

2.5GbE
1GbE

看了下NUC8和NUC11 Pro and Performance的网卡都属于这个驱动可以支持的.

PS: 此前也有一个类似的社区版网卡驱动,之前已经集成到了ESXi7.0.1里.

ESXi 7.0 Update 1c中加入的systemMediaSize启动选项

本周VMware发布了ESXi 7.0 Update 1c更新,查看Release notes,发现有一段比较有意思.

With ESXi 7.0 Update 1c, you can use the installer boot option systemMediaSize to limit the size of system storage partitions on the boot media. If your system has a small footprint that does not require the maximum 138 GB system-storage size, you can limit it to the minimum of 33 GB. The systemMediaSize parameter accepts the following values:

  • min (33 GB, for single disk or embedded servers)
  • small (69 GB, for servers with at least 512 GB RAM)
  • default (138 GB)
  • max (consume all available space, for multi-terabyte servers)

The selected value must fit the purpose of your system. For example, a system with 1TB of memory must use the minimum of 69 GB for system storage. To set the boot option at install time, for example systemMediaSize=small, refer to Enter Boot Options to Start an Installation or Upgrade Script. For more information, see VMware knowledge base article 81166.

对于这个启动选项,我的理解是之前ESXi 7.0默认最大会占用138GB左右硬盘,就是上文中提到的default(其中包括BOOTBANK1, BOOTBANK2, 还有OSDATA, 当硬盘为HDD时,OSDATA不会被当作虚拟闪存使用,此时OSDATA类型为VMFS-L. 当硬盘为SSD时,OSDATA会被同时当作虚拟闪存,此时OSDATA类型为VFFS.) 之前写过我们可以通过设置autoPartitionOSDataSize来调整OSDATA的大小. https://virtualtips.info/?p=42 ,但该方法并非官方提供的解决方案.

此次systemMediaSize参数可以理解官方为此提供了几种预设值(min, small, default, max). 我们可以在安装启动前Shift+O来加上参数systemMediaSize=min,或者在安装介质的boot.cfg文件中的kernelopt=runweasel这行后面加上诸如systemMediaSize=min的参数,让此安装程序自动设置参数.

kernelopt=runweasel systemMediaSize=min

此时,安装好以后的硬盘空间大致情况如下图,系统空间占用大概是33GB.

ESXi on ARM v1.2 (2020年11月更新)

还是不支持更新,只能全新安装选择保留VMFS,然后重新注册虚拟机。我暂时先不更新了,changelog如下:

November 30, 2020 – v1.2 

Note: Upgrade is NOT possible, only fresh installation is supported. If you select “Preserve VMFS” option, you can re-register your existing Virtual Machines.

UI: Disable datastore browsing when no datastores are present

PSCI: Fix missing context_id argument for CPU_ON calls

GICv2: Always enable SGIs, as GIC-500

arm64: Support for big-endian guests

Remove requirements/restrictions on initrd for UEFI-less VMs

关于Fusion on Apple Silicon的谨慎猜测

苹果发布M1芯片的新Mac设备以后,许多用户想要PD或者Fusion运行在Apple Silicon上,并虚拟x86 windows(准确说是模拟)。

从PD的博客看到https://www.parallels.com/blogs/parallels-desktop-apple-silicon-mac/,模拟x86 windows并未在计划中。其中提到了在虚拟的windows on Arm中利用微软的支持来模拟运行x86 windows程序 https://blogs.windows.com/windowsexperience/2020/09/30/now-more-essential-than-ever-the-role-of-the-windows-pc-has-changed/

所以模拟x86 windows OS并未在PD的计划中,同理去模拟其它AMD64 Linux或者x86 macOS也不在计划。

而Fusion并未在博客或者官网中提到类似计划,只在官方twitter和论坛中有所提及会去支持Apple Silicon。

对此,我谨慎做些猜测:

  1. Fusion on Apple Silicon首先会以universal app形式支持Apple Silicon,并首先可以虚拟一些arm64的 Linux虚拟机,正如现在ESXi on Arm所支持的。这个应该不会很久。
  2. 虚拟windows on Arm也会类似PD一样,在微软提供类似授权和模拟运行x86 windows程序后去提供支持。
  3. 至于模拟x86 windows或者其他x86/AMD64系统,我觉得短期不可能实现,这个工作量不是一般的大。如果2做的好话,模拟x86 windows这个意义也没那么重要了。

欢迎PD和Fusion来打脸。

监控安装ESXi on Arm的树莓派4b的CPU温度

在传统的x86服务器上,ESXi可以监控该服务器的cpu温度,如图:

我们平时玩树莓派时,是可以获取到cpu温度,并且可以通过程序来联动启停风扇的。(网络上教程很多)

当ESXi on Arm安装在树莓派4b以后,默认肯定是获取不到这个温度的。

前几天一位网友在https://github.com/thebel1/thpimon中提供了thpimon-0.1.0-1OEM.701.1.0.40650718.aarch64.vib 这一驱动,在ESXi on Arm上安装这一vib驱动以后,就可以通过python脚本来获取相应数据了。具体步骤在上述项目的说明中已经包含了。这里就不演示步骤了。看下python脚本的显示结果:

这里虽然解决了数据的采集问题,但是还不能形成时间序列数据,那么就需要接着改造python脚本来实现,恰好有另一个https://github.com/fgrehl/esxi-raspi,在前者基础上实现了时间序列数据的生成。

设定interval抓取:

运行结果:

仅仅是在Console里打印时间序列数据,显然达不到“监控”级别,于是又加入了将数据发送至Graphite主机的CARBON端口,这样就可以在Graphite前端来图形化显示时间序列数据了。

设定发送主机:

因为涉及到从ESXi向外(CARBON)发送数据,可以尝试关闭防火墙:esxcli network firewall set –enabled false,在重要环境中,请单独为此行为设定防火墙规则,不要整体关掉。

看下运行时Console的显示:

可以看到格式为指标,数据,时间

Graphite主机的搭建不详细说明了,可以参照https://graphite.readthedocs.io/en/latest/install.html通过Docker安装并运行,我就是在一台虚拟机Photon OS中运行的此Docker,这里顺便安利下Photon OS,很适合玩Docker。

访问Graphite webui:

可以从树形结构的Metrics下找到我们发送过来的数据。

双击cputemp即可在右侧显示图形,并可自定义图形的一些属性。

除此之外,我们还可以在Dashboard中添加该指标,如果有多台机器或者多项指标,就可以定义出我们自己想要的Dashboard:

保存后,该访问地址http://192.168.1.235/dashboard/ESXi-pi2%20cputemp%20Dashboard可以之后随时访问查看。

从图中看,这段时间该ESXi on Arm所运行的树莓派4b的cpu温度基本在46-48.5度之间。