<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>VMware on 卡螺絲</title><link>https://caloskao.org/categories/vmware/</link><description>Recent content in VMware on 卡螺絲</description><generator>Hugo -- gohugo.io</generator><language>zh-Hant</language><lastBuildDate>Thu, 07 May 2026 15:42:17 +0800</lastBuildDate><atom:link href="https://caloskao.org/categories/vmware/index.xml" rel="self" type="application/rss+xml"/><item><title>在 ESXi 建立自訂 Firewall Rule</title><link>https://caloskao.org/vsphere-esxi-create-custom-firewall-rule/</link><pubDate>Tue, 28 Apr 2026 00:00:00 +0800</pubDate><guid>https://caloskao.org/vsphere-esxi-create-custom-firewall-rule/</guid><description>&lt;img src="https://caloskao.org/images/logo/vmware.png" alt="Featured image of post 在 ESXi 建立自訂 Firewall Rule" /&gt;&lt;p&gt;ESXi 的 firewall 預設只開放少數必要的出入站流量。如果需要讓 ESXi 主機本身連到特定 port（例如把系統 log 轉送到 Graylog），就需要新增自訂規則。&lt;/p&gt;
&lt;p&gt;本文以開放 ESXi outbound TCP/UDP port 5140（Graylog syslog）為例。&lt;/p&gt;
&lt;h2 id="準備啟用-ssh"&gt;準備：啟用 SSH
&lt;/h2&gt;&lt;p&gt;在 vSphere 介面啟用 ESXi SSH，登入後進行後續操作。&lt;/p&gt;
&lt;h2 id="建立規則設定檔"&gt;建立規則設定檔
&lt;/h2&gt;&lt;p&gt;ESXi 的 firewall 規則以 XML 格式存放在 &lt;code&gt;/etc/vmware/firewall/&lt;/code&gt;。新增規則只需複製一份現有範本再修改：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /etc/vmware/firewall
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp vltd-firewall.xml graylog-syslog.xml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;修改 &lt;code&gt;graylog-syslog.xml&lt;/code&gt;，定義 TCP 和 UDP 兩條規則：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ConfigRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;service&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0000&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;graylog-syslog-tcp&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;rule&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0000&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;direction&amp;gt;&lt;/span&gt;outbound&lt;span class="nt"&gt;&amp;lt;/direction&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;protocol&amp;gt;&lt;/span&gt;tcp&lt;span class="nt"&gt;&amp;lt;/protocol&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;porttype&amp;gt;&lt;/span&gt;dst&lt;span class="nt"&gt;&amp;lt;/porttype&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;port&amp;gt;&lt;/span&gt;5140&lt;span class="nt"&gt;&amp;lt;/port&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/rule&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;enabled&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/enabled&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;required&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/required&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/service&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;service&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0001&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;graylog-syslog-udp&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;rule&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0000&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;direction&amp;gt;&lt;/span&gt;outbound&lt;span class="nt"&gt;&amp;lt;/direction&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;protocol&amp;gt;&lt;/span&gt;udp&lt;span class="nt"&gt;&amp;lt;/protocol&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;porttype&amp;gt;&lt;/span&gt;dst&lt;span class="nt"&gt;&amp;lt;/porttype&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;port&amp;gt;&lt;/span&gt;5140&lt;span class="nt"&gt;&amp;lt;/port&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/rule&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;enabled&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/enabled&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;required&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/required&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/service&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/ConfigRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="重新載入-firewall-規則"&gt;重新載入 Firewall 規則
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;esxcli network firewall refresh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;確認新規則已出現：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# esxcli network firewall ruleset list | grep graylog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;graylog-syslog-tcp &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;graylog-syslog-udp &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="啟用規則"&gt;啟用規則
&lt;/h2&gt;&lt;p&gt;用 CLI 指定規則 ID 啟用，或在 vSphere Web GUI 的 &lt;strong&gt;Manage &amp;gt; Security &amp;amp; users &amp;gt; Firewall&lt;/strong&gt; 勾選：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;esxcli network firewall ruleset &lt;span class="nb"&gt;set&lt;/span&gt; --ruleset-id&lt;span class="o"&gt;=&lt;/span&gt;graylog-syslog-udp --enabled&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kb.vmware.com/s/article/2008226?lang=en_US" target="_blank" rel="noopener"
&gt;Custom Firewall Rules in ESXi | VMware KB 2008226&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://communities.vmware.com/t5/ESXi-Discussions/How-can-I-add-ESXi-v7-custom-firewall-rule-set/td-p/2915472" target="_blank" rel="noopener"
&gt;How can I add ESXi v7 custom firewall rule set? | VMware Communities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://communities.vmware.com/t5/ESXi-Discussions/custom-firewall-setting-in-ESXI7-0-operation-not-permitted/m-p/2872876#M278564" target="_blank" rel="noopener"
&gt;Custom firewall setting in ESXi 7.0 — operation not permitted | VMware Communities&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</description></item><item><title>壓縮 VMware 虛擬機的 VMDK 磁碟大小</title><link>https://caloskao.org/vmware-esxi-shrink-vmdk/</link><pubDate>Fri, 30 Jan 2026 00:00:00 +0800</pubDate><guid>https://caloskao.org/vmware-esxi-shrink-vmdk/</guid><description>&lt;img src="https://caloskao.org/images/logo/vmware.png" alt="Featured image of post 壓縮 VMware 虛擬機的 VMDK 磁碟大小" /&gt;&lt;p&gt;在 VM 中刪除大量檔案後，VMDK 的占用空間並不會自動縮小——VMware 看不到「哪些 sector 現在是空的」。要真正釋放空間，需要在 guest OS 內執行一套清零流程，再由 VMware Tools 壓縮磁碟。&lt;/p&gt;
&lt;p&gt;以下步驟在 Linux guest 上執行。&lt;/p&gt;
&lt;h2 id="step-1磁碟碎片整理"&gt;Step 1：磁碟碎片整理
&lt;/h2&gt;&lt;p&gt;先整理 ext4 filesystem，讓後續的 zerofill 更有效率：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo e4defrag /
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;部分檔案（symlink、device file）無法碎片整理，出現相關錯誤可忽略。&lt;/p&gt;
&lt;h2 id="step-2零填充空閒空間"&gt;Step 2：零填充空閒空間
&lt;/h2&gt;&lt;p&gt;用零覆蓋所有未使用的 sector，讓 VMware 識別出哪些空間可以回收：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;wipefile &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1M&lt;span class="p"&gt;;&lt;/span&gt; sync&lt;span class="p"&gt;;&lt;/span&gt; rm wipefile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這個指令會把磁碟寫滿（產生 &lt;code&gt;wipefile&lt;/code&gt;），同步後再刪除，空閒空間就全部變成連續的零值 sector。&lt;/p&gt;
&lt;h2 id="step-3執行壓縮"&gt;Step 3：執行壓縮
&lt;/h2&gt;&lt;p&gt;透過 VMware Tools 通知 hypervisor 壓縮磁碟：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo vmware-toolbox-cmd disk shrinkonly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;完成後 VMDK 檔案大小就會縮小。&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://superuser.com/a/1116213/904739" target="_blank" rel="noopener"
&gt;How to shrink a VMware virtual disk - Super User&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</description></item><item><title>ovftool 失敗：vim.fault.FileNotFound</title><link>https://caloskao.org/ovftool-error-vim-fault-file-not-found/</link><pubDate>Thu, 05 Dec 2024 00:00:00 +0800</pubDate><guid>https://caloskao.org/ovftool-error-vim-fault-file-not-found/</guid><description>&lt;img src="https://caloskao.org/images/logo/vmware.png" alt="Featured image of post ovftool 失敗：vim.fault.FileNotFound" /&gt;&lt;p&gt;在 ESXi 中匯入 OVA / OVF 範本只能透過上傳本機檔案，無法從 ESXi 上的 datastore 匯入，因此需透過 &lt;a class="link" href="https://docs.vmware.com/en/VMware-Cloud-on-AWS/services/com.vmware.vsphere.vmc-aws-manage-data-center-vms.doc/GUID-6DA60A4B-323A-4F11-BD90-834D601F89BB.html" target="_blank" rel="noopener"
&gt;&lt;code&gt;ovftool&lt;/code&gt;&lt;/a&gt; 來完成這件事情。但執行時碰到了 &lt;code&gt;vim.fault.FileNotFound&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;calos@ASUS-ESC500G3:~ ovftool &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --net:LAN_172.16.1.X&lt;span class="o"&gt;=&lt;/span&gt;VM&lt;span class="se"&gt;\ &lt;/span&gt;Network &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --net:LAN2_172.16.2.X&lt;span class="o"&gt;=&lt;/span&gt;VM&lt;span class="se"&gt;\ &lt;/span&gt;Network &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --net:LAN3_172.16.3.X&lt;span class="o"&gt;=&lt;/span&gt;VM&lt;span class="se"&gt;\ &lt;/span&gt;Network &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --net:DMZ_172.16.60.X&lt;span class="o"&gt;=&lt;/span&gt;VM&lt;span class="se"&gt;\ &lt;/span&gt;Network &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://172.16.1.10/folder/templates/template_bastion-host.ovf&lt;span class="se"&gt;\?&lt;/span&gt;dcPath&lt;span class="se"&gt;\=&lt;/span&gt;ha%252ddatacenter&lt;span class="se"&gt;\&amp;amp;&lt;/span&gt;dsName&lt;span class="se"&gt;\=&lt;/span&gt;datastore1 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vi://172.16.1.10
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter login information &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; https://172.16.1.10/folder/templates/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Username: calos
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Password: ***************
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Opening OVF source: https://172.16.1.10/folder/templates/template_bastion-host.ovf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The manifest validates
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter login information &lt;span class="k"&gt;for&lt;/span&gt; target vi://172.16.1.10/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Username: calos
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Password: ***************
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Opening VI target: vi://calos@172.16.1.10:443/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Error:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - A general system error occurred: Fault cause: vim.fault.FileNotFound
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Completed with errors
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;查了一下原因，發現是 OVF 本身的 CD/DVD 還掛著 ISO，導致失敗。參考了&lt;a class="link" href="https://communities.vmware.com/thread/496484" target="_blank" rel="noopener"
&gt;這篇&lt;/a&gt;使用 &lt;code&gt;--noImageFiles&lt;/code&gt;，但依然沒有成功。&lt;/p&gt;
&lt;p&gt;最後嘗試直接編輯 OVF 檔，把 CD/DVD 裝置直接刪掉：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- 下關鍵字找 DVD，找到這節把它刪掉 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Item&lt;/span&gt; &lt;span class="na"&gt;ovf:required=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;rasd:AddressOnParent&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/rasd:AddressOnParent&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;rasd:AutomaticAllocation&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/rasd:AutomaticAllocation&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;rasd:ElementName&amp;gt;&lt;/span&gt;CD/DVD drive 1&lt;span class="nt"&gt;&amp;lt;/rasd:ElementName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;rasd:InstanceID&amp;gt;&lt;/span&gt;8&lt;span class="nt"&gt;&amp;lt;/rasd:InstanceID&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;rasd:Parent&amp;gt;&lt;/span&gt;4&lt;span class="nt"&gt;&amp;lt;/rasd:Parent&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;rasd:ResourceSubType&amp;gt;&lt;/span&gt;vmware.cdrom.iso&lt;span class="nt"&gt;&amp;lt;/rasd:ResourceSubType&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;rasd:ResourceType&amp;gt;&lt;/span&gt;15&lt;span class="nt"&gt;&amp;lt;/rasd:ResourceType&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/Item&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再次執行，還是失敗了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Opening OVF source: https://172.16.1.10/folder/templates/template_bastion-host.ovf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The manifest validates
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Error: SHA digest of file template_bastion-host.ovf does not match manifest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Completed with errors
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這邊是因為當初將 OVF 匯出時，會同時倒出一個 &lt;code&gt;.mf&lt;/code&gt; 檔案，裡面記錄了 VMDK 與 OVF 檔的 hash，可用來檢測是否被更改過。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SHA1(template_bastion-host-disk1.vmdk)= 6f9c36327d0b00e4d52d93484c54fa625d4a48f2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SHA1(template_bastion-host.ovf)= 71aafebf0a44f2b59f00af0c71a7ef26ff7869e5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這邊有兩個處理方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;重新對 OVF 檔產生一個相應的 hash，換掉原本的 hash sum，然後把更改過的 MF 檔覆蓋上去&lt;/li&gt;
&lt;li&gt;直接砍掉 MF 檔&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這裡使用第一種方法，因為 MF 檔裡面使用的是 &lt;code&gt;SHA1&lt;/code&gt;，因此這邊使用 &lt;code&gt;sha1sum&lt;/code&gt; 產生 OVF 檔的 hash sum，然後蓋掉原本的 hash sum&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;calos@ASUS-ESC500G3:~ $ sha1sum template_bastion-host.ovf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aacf02cdea9311e0e2dd96d37eb41cf217705541 template_bastion-host.ovf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再次執行 &lt;code&gt;ovftool&lt;/code&gt;，終於成功了！&lt;/p&gt;
&lt;p&gt;
&lt;img src="https://caloskao.org/post/ovftool-error-vim-fault-file-not-found/img_264499660662_hu_62cc0a2d4e1db31a.jpg"
width="1920"
height="634"
srcset="https://caloskao.org/post/ovftool-error-vim-fault-file-not-found/img_264499660662_hu_62cc0a2d4e1db31a.jpg 1280w, https://caloskao.org/post/ovftool-error-vim-fault-file-not-found/img_264499660662_hu_63e6874ceec31364.jpg 1920w" sizes="100vw"
loading="lazy"
alt="ovftool 成功執行截圖"
class="gallery-image"
data-flex-grow="302"
data-flex-basis="726px"
&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://communities.vmware.com/thread/496484" target="_blank" rel="noopener"
&gt;ovftool fails with Error: vim.fault.FileNotFound |VMware Communities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.virtuallyghetto.com/2012/03/how-to-deploy-ovf-located-on-esxi.html" target="_blank" rel="noopener"
&gt;How to Deploy an OVF Located On ESXi Datastore Using ovftool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://michaelstoica.com/ovftool-fails-with-error-vimfault-filenotfound/" target="_blank" rel="noopener"
&gt;Ovftool fails with error: vimfault.FileNotFound – Michael Stoica&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://medium.com/@rootedshell/failed-to-open-virtual-machine-sha1-digest-of-file-xxxxxxxx779-disk1-vmdk-does-not-match-manifest-7d0d94db4451" target="_blank" rel="noopener"
&gt;Failed to open virtual machine: SHA1 digest of file xxxxxxxx779-disk1.vmdk does not match manifest. | by Rajesh D | Medium&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</description></item></channel></rss>