VMWare安裝及設定

      在〈VMWare安裝及設定〉中尚無留言

Virtual Machine 是一個很神奇的東西,  它可以在一個系統裏模擬出不同的作業系統, 比如在Win10中, 可以安裝Linux系統.

能寫出這種東西, 其實都是極度聰明的人或是極具遠觀的公司才辦得到的. 這些人都需具有作業系統能力的人.

目前常用的VM有二種

1. VMWare — 開發者為 VMWare, 需付錢的
2. Virtual Box — 開發者為 Oracle, 免費

那一種比較好呢, 公說公有理, 婆說婆有理. 其實都沒差, 自己用習慣就好了. 本人是一直用 VMWare 比較習慣.

VMWare workstation pro 免付費使用

VMWare workstation pro 在 2024/11/11 宣佈一項震驚電腦業界的消息,就是自 17.6.2 版開始,個人非商業化行為不需序號註冊即可免付費使用,請由如下網址下載。

VMWare Workstation pro 下載 17.6.2 的版本,進入後需先註冊一個帳號,登入後才能下載。

啟動 Virtualize Intel VT-x/EPT

啟動 Intel (VMX) 虛擬化技術會讓 VMWare 更有效率,有四個步驟要確實執行

關閉Hyper-V

如果有使用 Hyper-V 的人,應該都知道怎麼關閉 Hyper-V,如果忘了請 Google 查詢 關閉 Hyper-V。如果沒聽過 Hyper-V 的人可以直接跳過,因為Win10/Win11 預設不會開啟 Hyper-V,這邊就不再贅述。

BIOS 啟動 Intel (VMX)

將電腦重新開機,然後進入 BIOS,在 CPU 選項中把 Intel (VMX) 虛擬化技術設定為 Enabled,然後重新開機,如下圖所示。

核心隔離

核心隔離是 Win11 的新功能,預設是打開的,其目的是為了保護 Win11 記憶体安全性,但這會讓 VMWare 的 VT-x/EPT 失效,所以需手動關閉核心隔離

請開啟 Window 安全性/裝置安全性/核心隔離,將記憶體完整性關閉,然後重新開機,如下圖所示。

關閉 Virtualization Based Security

在 Win11 裏有一項 Virtualization Based Security ,中文為 虛擬化型安全性,在 開始/執行 輸入 msinfo32如果虛擬化型安全性顯示的狀態是已啟用,那麼 VMWare 就無法使用 VT-x,因為這層 Virtual Layer 會一直在 Win11 下幹活,如下圖所示。

很不幸的是 Win11 在 24H2 更新後強制把萬惡的 VBS 打開。

要把 VBS 關閉變成 “未啟用”,需開啟一個空白的 vbs.bat 文字檔,輸入如下Script

@echo off
dism /Online /Disable-Feature:microsoft-hyper-v-all /NoRestart
dism /Online /Disable-Feature:IsolatedUserMode /NoRestart
dism /Online /Disable-Feature:Microsoft-Hyper-V-Hypervisor /NoRestart
dism /Online /Disable-Feature:Microsoft-Hyper-V-Online /NoRestart
dism /Online /Disable-Feature:HypervisorPlatform /NoRestart

mountvol X: /s
copy %WINDIR%\System32\SecConfig.efi X:\EFI\Microsoft\Boot\SecConfig.efi /Y
bcdedit /create {0cb3b571-2f2e-4343-a879-d86a476d7215} /d "DebugTool" /application osloader
bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} path "\EFI\Microsoft\Boot\SecConfig.efi"
bcdedit /set {bootmgr} bootsequence {0cb3b571-2f2e-4343-a879-d86a476d7215}
bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} loadoptions DISABLE-LSA-ISO,DISABLE-VBS
bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} device partition=X:
mountvol X: /d
bcdedit /set hypervisorlaunchtype off

echo.
echo.
echo =======================================================
pause > nul
echo.
echo.

儲存後使用系統管理員執行上面 Script,然後手動重新開機,就會在開機過程中詢問三次是否要關閉 VBS,請連續按二次 F3/空格

開機完進入 Win11 後,會出現 pin number 失效需重建。此時 Win11 會要求重新輸入微軟帳號的密碼,並寄發驗証碼到 e-mail 中。輸入驗証碼後,即可重建 pin number。

完全進入 Windows 後,再次執行 msinfo32 就可以看到未啟用。

請注意,網路上的一些教學,有的是使用 regedit 修改HKEY_LOCAL_MACHINE/System\CurrentControlSet\Control\DeviceGuard 裏的EnableVirtualizationBasedSecurity 將其設置為 0 ,又或都在 cmd 執行 bcdedit /set hypervisorlaunchtype off,這些都是沒有用的

經過上述的折騰後,就可以後續的動作,把 VMWare 的 VT-x 打開。

建立新VM

從File/new Virtual Machine開始.

常見的問題如下

1. Inatall from

如果選擇Installer disc image file(iso), 則會啟用Easy Install, 這樣就無法自己規畫硬碟Partition大小及一些相關設定

所以建議選擇I will install the operating system later.

 vmware6

2. 上述建立一個空的VM後, 再點選CD/DVD, 然後選定要安裝的ISO檔案

3.  CPU數量 : 通常就實体CPU的一半, 盡可能不要影響實体機的速度, 另請記得勾選 Virtualize Intel VT-x or AMD-V/RVI, 這樣效能就會比較好

4. RAM : 4G以上. 通常Ram沒大於16G的話, 你是沒資格玩VM的

5. Network Adapter :

a. NAT : 可以讓VM形成另一個網域, 跟主機不同網域
b. Bridged : 跟實機同樣的網域, 這樣就可以模擬成同網域中有多台機器.

掛載share folder

此說明是在VmWare裏啟動Ubuntu Server時, 掛載 share folder的方法

VmWare需先enabled folder
cd /media
sudo mkdir cdrom
sudo mount /dev/cdrom cdrom
cd
mkdir tmp && cd tmp

#將cdrom裏的所有檔案 copy 到 ~/tmp內再執行
cp -r /media/cdrom/. .
tar zxvf VMwareTools-10.3.22-15902021.tar.gz
cd vmware-tools-distrib
#sudo ./vmware-install.pl

然後一直按enter
sudo reboot
重新開機後, 就可以在/mnt/hgfs看到share folder了

為何要自動啟動VMWare

為什麼開機後要自動啟動VMWare呢?! 當然是要啟動VMWare裏的伺服器, 比如在VMWare裏安裝了Ubuntu系統, 然後架設了ftp server及Apache web server. 當外殼Windows啟動後, 也要順便啟動Ubuntu. 此時就有此需求了

現在問題來了, 當Windows 7啟動後, 一定要先登入, VMWare才有可能自動啟動. 如果希望Windows7在未登入任何使用者時, 就啟動VMWare, 依目前網路上大家的說明, 幾乎都是廢文, 完全不可能.

此篇文章就是為了破除網路上的廢文, 讓VMWare可以在未登入前, 就在背景啟動服務

網路常見的錯誤說明

網路常介紹的, 不外乎如下

1. 寫個bat檔, 然後放在shell:startup裏面
這有二個問題, 一個是此法必需登入才會執行, 另一個問題是為什麼要寫腳本呢, 直接把vmware.exe 或vmplayer.exe的捷徑放在shell:startup裏就好了啊, 這樣啟動時也不會出現一個很礙眼的DOS視窗‧

2. 執行 gpedit.msc, 然後進入Windows設定/指令碼, 於啟動/關機二個項目裏執行指令碼. 此法是完全沒用的, 不用再試了,  試了也是白試。(此法好像需先用其他指令允許啟動本機群組原則,懶的試了)

3.開始/附屬應用程式/系統工具/工作排程器, 在裏面新增一個工作, 觸發時機選電腦啟動時執行. 此方法可行,不過記得要勾選 “不論使用者登入與否均執行”,如此不需要登入亦會自動執行。 不過關機前若要先結束VMWare呢? 又是無解.

正確解決方式

那到底要如何解決呢!! 唯一的方法, 就是自己寫 Windows 服務程式, 本人是使用C# 撰寫的. 不知什麼是 Windows服務的話, 請參照本人所撰寫的文章 — 背景服務Windows Service

請注意, 上述程式碼一定要執行外部程式 vmrun.exe. 因為只有vmrun才能控制VMWare的啟動及停止.

OnStart中, 執行參數是 “-T ws start 映像檔名 nogui”, 記得要加 nogui, 這樣才能無聲無息的在背景中偷偷的運作, 也只有nogui才能正常執行

OnStop中, 執行參數是 “stop 映像檔 soft”, 記得要加 soft, 才能把VMWare正常關機

在C#中, 程式碼撰寫如下

    public partial class 啟動Ubuntu : ServiceBase
    {
        public 啟動Ubuntu()
        {
            InitializeComponent();
        }
        protected override void OnStart(string[] args)
        {
            Process.Start(@"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe", @"-T ws start C:\vmware\ubuntu16045\Ubuntu16045.vmx nogui");
        }

        protected override void OnStop()
        {
            Process.Start(@"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe", @"stop C:\vmware\ubuntu16045\Ubuntu16045.vmx soft");
        }
    }

安裝Windows服務

上述建置程式後, 在dos下輸入 installUtil 程式名.exe, 即可安裝此服務, 可於如下圖看到VMSrv開始於背景執行

vmsrv

若要移除安裝, 請使用 installUtil /u 程式名.exe

操作方式

重新開機後, 就會在背景啟動VMWare, 如下圖所示, vmware-vmx.exe即為正在執行的程式碼‧

vmsrv2

若要停止VMWare, 在dos下使用 stop xxx soft是沒有用的. 需於服務的VMSrv按右鍵/停止服務 才可以‧

請注意, 連 vmrun list, 也是無法列出目前正在執行的VMWare列表

完整程式碼如下 : VMService.rar

工作排程

在 “開始/Windows 系統管理工具/工作排程” 也可以指定開機時就執行 vmware.exe,但卻沒有關機時要執行的選項,所以關機時 vmware 的 lock 檔沒被刪除,導致在下次重新開機時,無法啟重 vmware,因此工作排程是行不通的。

工作排程跟系統服務是完全不一樣的東西,且工作排程其實有很多的 bug,建議還是不要常用工作排程。

Virtual Box 共用資料夾

ubuntu 下必需先安裝如下

sudo apt-get install gcc make perl

然後再於Virtual Box掛載 Guest Additional 光碟片, 再進行安裝.

Virtual Box設定共用資料夾, 資料夾名稱改為 “shared”

ubuntu重新開機後, 會多一個sf_shared的目錄, 需使用如下指令掛載

mkdir ~/data
sudo mount -t vboxsf shared ~/data

啟動vm

如果不想透過VirtualBox開啟虛擬機器, 那可以直接執行vboxmanager, 此程式位於 C:\Program Files\Oracle\VirtualBox.

vboxmanage startvm ubuntu_server_18042

如果不想啟動GUI, 可下達 –type headless

vboxmanage startvm ubuntu_server_18042  --type headless

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *