在虛擬機器中安裝 Mac OS X

来自Tsetien’s Wiki
跳转到导航 跳转到搜索
一個安裝在虛擬機器中的 Mac OS X 10.20.6.1.

準備工作

前往 paolo-projects/auto-unlockerDrDonk/unlocker 處下載 VM­ware un­loc­ker 並解鎖 VM­ware 對在 Win­dows 上安裝 Mac OS X 虛擬機器的限制。

前往此處下載最新版本的 darwin.iso, 並與 %ProgramFiles(x86)%\VMware\VMware Workstation\ 下的同名檔案進行比對,如果 %ProgramFiles(x86)%\VMware\VMware Workstation\ 下的 darwin.iso 較舊,則使用下載的檔案取代之。

建立虛擬機器並完成安裝

如常設立一個 Mac OS X 的虛擬機器,並掛載好安裝 ISO. 完成後對 vmx 檔案進行如下修改:

刪除以下諸項 (如有)
ehci.pciSlotNumber
mks.vk.gpuHeapSizeMB
numa.autosize.cookie
numa.autosize.vcpu.maxPerVirtualNode
svga.graphicsMemoryKB
toolsInstallManager.lastInstallError
toolsInstallManager.updateCounter
vmotion.checkpointFBSize
vmotion.checkpointSVGAPrimarySize
vmotion.svga.baseCapsLevel
vmotion.svga.bc67
vmotion.svga.dxMaxConstantBuffers
vmotion.svga.dxProvokingVertex
vmotion.svga.gl43
vmotion.svga.graphicsMemoryKB
vmotion.svga.lineStipple
vmotion.svga.logicBlendOps
並添加以下諸項 (如已有則改之)
board-id.reflectHost = "FALSE"
ethernet0.virtualDev = "vmxnet3"
board-id = "Mac-AA95B1DDAB278B95"
hw.model.reflectHost = "FALSE"
hw.model = "iMacPro1,1"
serialNumber.reflectHost = "FALSE"
serialNumber = "C01234567890"
cpuid.coresPerSocket = "8"
disk.EnableUUID = "TRUE"
ehci.present = "FALSE"
logging = "FALSE"
mainMem.useNamedFile = "FALSE"
MemTrimRate = "0"
mks.forceDiscreteGPU = "TRUE"
mks.vsync = "0"
monitor.virtual_exec = "hardware"
monitor.virtual_mmu = "hardware"
nvme0:0.virtualSSD = "1"
sched.cpu.latencyTracking = "FALSE"
svga.renderer = "metal"
svga.vramSize = "268435456"
vassert.enforce = "FALSE"
vmm.isa.disableMMIO = "TRUE"
vprobe.enabled = "FALSE"

之後開機,如常安裝、初始設定完畢。

注意事項

在 Mac OS X 上,/usr/local/bin/ 是需要透過 sudo mkdir -p /usr/local/bin 來自行建立的,不過建立之後它就會自動存在於 PATH 中了。

除了在 Sys­tem Set­tings > Ac­ces­si­bi­li­ty > Dis­play 下面有 ‘Re­du­ce mo­tion’ 和 ‘Re­du­ce tr­ans­pa­ren­cy’ 以及在 Desk­top & Dock 的設定中可以將視窗縮小效果從 Ge­nie 變更為 Sca­le 外,還可透過以下命令列來將系統的動畫效果減到最小——

min_anim.zsh
#!/bin/zsh
defaults write -g NSWindowResizeTime -float 0.001
defaults write -g NSAutomaticWindowAnimationsEnabled -bool false
defaults write -g NSScrollAnimationEnabled -bool false
defaults write -g QLPanelAnimationDuration -float 0
defaults write -g NSScrollViewRubberbanding -bool false
defaults write com.apple.dock mineffect -string scale
defaults write com.apple.dock minimize-to-application -bool true
defaults write com.apple.dock autohide-delay -float 0
defaults write com.apple.dock autohide-time-modifier -float 0
defaults write com.apple.dock expose-animation-duration -float 0.1
defaults write com.apple.dock springboard-show-duration -int 0
defaults write com.apple.dock springboard-hide-duration -int 0
defaults write com.apple.dock springboard-page-duration -int 0
killall Dock
killall Finder

將以上指令碼片段保存、透過 chmod +x 使其可被執行,然後執行之,之後重新開機,就可以了。

其餘也沒有什麼好設定的,系統自帶的應用程式全都刪不掉、自動更新也無法關閉,因此能夠做的事情很少。

在 ‘ren’ 一篇中所給出的模擬 DOS 下 ren 命令的 bash 指令碼並不能夠直接搬過來用,而是要使用下面這則 zsh 版本的——

ren
#!/bin/zsh
if [[ $# -lt 1 ]]; then
	exit 1
fi
if [[ $# -eq 1 ]]; then
	setopt NULL_GLOB
	local -a fs
	fs=( ${(f)1} )
	for f in "${fs[@]}"; do
		if [[ -f "$f" ]]; then
			d=$(dirname "$f")
			b=$(basename "$f")
			bs="${b:r}"
			nf="$d/$bs"
			mv -- "$f" "$nf"
		fi
	done
	unsetopt NULL_GLOB
else
	tg="${@[-1]}"
	local -a sc
	sc=( "${@[1,-2]}" )
	if [[ "$tg" == *'*'* ]]; then
		setopt NULL_GLOB
		for p in "${sc[@]}"; do
			local -a fs
			fs=( ${(f)p} )
			for f in "${fs[@]}"; do
				if [[ -f "$f" ]]; then
					d=$(dirname "$f")
					b=$(basename "$f")
					bs="${b:r}"
					nf="$d/${tg/\*/$bs}"
					mv -- "$f" "$nf"
				fi
			done
		done
		unsetopt NULL_GLOB
	else
		if [[ "${#sc[@]}" -ne 1 ]]; then
			exit 1
		fi
		f="${sc[1]}"
		d=$(dirname "$f")
		nf="$d/$tg"
		mv -- "$f" "$nf"
	fi
fi

而在 ‘fup and d’ 一篇中所給出的 bash 版的 fup 也需要小做修改——

fup
#!/bin/zsh
d=""
i=""
u=""
while [[ $# -gt 0 ]]; do
	if [[ "$1" = "-d" ]]; then
		d="1"
	elif [[ -z "$i" ]]; then
		i="$1"
	fi
	shift
done
if [[ -z "$i" ]]; then
	exit 0
fi
u="https://your.file-HTTP.com/$(printf '%s' "$i" | perl -pe 's/([^a-zA-Z0-9_.!-])/sprintf("%%%02X", ord($1))/ge' | sed 's/(/%28/g; s/)/%29/g')"
if [[ "$d" = "1" ]]; then
	curl -Q "DELE $i" ftp://your.file-FTP.com/ --user USERNAME:PASSWORD
else
	curl -T "$i" ftp://your.file-FTP.com/ --user USERNAME:PASSWORD
	if [[ $? -eq 0 ]]; then
		echo "$u" | pbcopy
		echo
		echo "Done!"
		echo "The following link has already been copied to the clipboard:"
		echo "$u"
	else
		echo
		echo "Something happened. The upload has FAILED."
	fi
fi

其餘大多數的 bash 指令碼皆可直接在 Mac OS X 下使用——這當然不包含 inst——這自是不必說的。 ‘fup and d’ 一篇中的 d 應該可以直接用,不過沒有經過試驗;‘7pk’ 一篇中的 7pk 經不完全試驗,感覺直接用好像也沒有出現什麼錯誤。但若追求「純正」,一定要轉換為 zsh 指令碼,則可參考以下兩則——

d
#!/bin/zsh
a=""
b=""
d=""
f=""
i=""
n=""
o=""
p=""
x=""
while [[ $# -gt 0 ]]; do
	a="$1"
	case "$a" in
		-d) d="1" ;;
		-n) n="1" ;;
		-o) o="$2"; shift ;;
		-p) p="$2"; shift ;;
		*)
			if [[ -z "$i" ]]; then
				i="$1"
			fi
			;;
	esac
	shift
done
if [[ -z "$i" ]]; then
	exit 0
fi
if echo "$i" | grep -q "/"; then
	if ! echo "$i" | grep -qi "^http://\|^https://\|^ftp://\|^ftps://"; then
		i="https://$i"
	fi
else
	i="https://your.file-HTTP.com/$(printf '%s' "$i" | perl -pe 's/([^a-zA-Z0-9_.!-])/sprintf("%%%02X", ord($1))/ge' | sed 's/(/%28/g; s/)/%29/g')"
fi
f=$(basename "$i")
f=$(printf '%b' "$(echo "$f" | sed 's/%/\\x/g')")
b="${f%.*}"
x=".${f##*.}"
if [[ -n "$p" ]]; then
	if [[ "$p" = "=" ]]; then
		p="$HOME/Downloads"
	elif [[ "${p:0:1}" = "=" ]]; then
		p="${p:1}"
		p="$HOME/Downloads$p"
	fi
fi
if [[ -n "$o" ]]; then
	if [[ -z "$p" ]]; then
		if [[ "$o" = "=" ]]; then
			o="$HOME/Downloads/$f"
		elif [[ "${o:0:2}" = "=/" ]]; then
			o="${o:1}"
			o="$HOME/Downloads$o"
			o="${o//=b/$b}"
			o="${o//=x/$x}"
			o="${o//=/$f}"
		fi
	else
		o="${o//=b/$b}"
		o="${o//=x/$x}"
		o="${o//=/$f}"
	fi
fi
if [[ -z "$o" ]]; then
	if [[ -z "$p" ]]; then
		if [[ "$n" = "1" ]]; then
			curl -L "$i" -o "$f"
		else
			curl -L "$i" -O
		fi
	else
		if [[ "$n" = "1" ]]; then
			curl -L "$i" -o "$f" --output-dir "$p" --create-dirs
		else
			curl -L "$i" -O --output-dir "$p" --create-dirs
		fi
	fi
else
	if [[ -z "$p" ]]; then
		curl -L "$i" -o "$o" --create-dirs
	else
		curl -L "$i" -o "$o" --output-dir "$p" --create-dirs
	fi
fi
if [[ "${i:0:22}" = "https://your.file-HTTP.com/" ]] && [[ "$d" = "1" ]]; then
	curl -Q "DELE $f" ftp://your.file-FTP.com/ --user USERNAME:PASSWORD
fi
7pk
#!/bin/zsh
setopt NULL_GLOB
dt=$(date '+%y%m%d-%H%M')
dn=$(basename "$PWD")
an="${dt}.7z"
fl=()
pw=""
o=0
r=0
ep=0
while (( $# )); do
	case "$1" in
		-o)
			o=1
			shift
			an="$1"
			shift
			;;
		-p*)
			pw="$1"
			shift
			;;
		-r0)
			r=2
			shift
			;;
		-r)
			r=1
			shift
			;;
		-ep)
			ep=1
			shift
			;;
		*)
			fl+=("$1")
			shift
			;;
	esac
done
an="$(echo "$an" | sed 's/^ *//; s/ *$//')"
[[ "$an" == *.7z ]] && an="${an:r}"
an="$(echo "$an" | sed 's/^ *//; s/ *$//')"
an="${an}.7z"
if [[ "$an" == */* ]]; then
	bn="${an:t}"
	an="${an:h}/"
else
	bn="$an"
	an=""
fi
bn="${bn:r}"
bn="$(echo "$bn" | sed 's/^ *//; s/ *$//')"
np="$bn"
pf=0
sf=0
if [[ "$np" == \[* && "$np" != *\]* ]]; then
	np="${np#[}"
	pf=1
fi
if [[ "$np" == *_ ]]; then
	np="${np%_}"
	sf=1
fi
bn="$np"
(( pf == 1 )) && bn="[$(date '+%y%m%d')] $bn"
(( sf == 1 )) && bn="${bn}_$dt"
bn="${bn//=/$dn}"
bn="$(echo "$bn" | sed 's/^ *//; s/ *$//')"
bn="$(echo "$bn" | tr -s ' ')"
an="${an}${bn}.7z"
[[ ${#fl[@]} -eq 0 ]] && fl=(".")
bc=(7z a -t7z -mx=9 -aoa -mfb=273 -md=1024m -ms=on -mqs=on -mtc -mta -mtm -stl -mhe)
(( ep == 1 )) && bc+=(-spf2)
(( r == 1 )) && bc+=(-r)
(( r == 2 )) && bc+=(-r0)
[[ -n "$pw" ]] && bc+=("$pw")
bc+=("$an" "${fl[@]}")
"${bc[@]}"

其餘的改 zsh 大多就是改個 shebang 列的問題,就不贅述了。

使用再生龍對 Mac OS X 虛擬機器執行「倒硬碟」作業

經過「倒硬碟」後的虛擬機器大小 (~18.70 GB) 以及可以壓縮到的程度 (~11.38 GB).

Mac OS X 的虛擬機器也可以使用再生龍來倒一遍硬碟從而縮小 vmdk 檔案的大小,不過其中有一些小竅門需要注意。

在準備好要進行「倒硬碟」的系統後(也即將該清的都清一清,儘管 Mac OS X 也沒什麼好容許你去清的),先關閉虛擬機器,然後將 vmx 檔案複製一份備份。

之後,在該虛擬機器的 Vir­tu­al Ma­chi­ne Set­tings > Op­tions 中,將虛擬機器的作業系統改為 Windows (10 或 11 都好).

然後如對 Linux 虛擬機器進行「倒硬碟」時的作業一樣,添加一塊新硬碟、掛上再生龍的 LiveCD, 然後再在 Vir­tu­al Ma­chi­ne Set­tings > Hard­ware > Dis­play 中勾上 ‘Stre­tch mo­de’.

之後,關閉 VM­ware, 再次開啟 vmx 檔案,在結尾處添加一列 bios.forceSetupOnce = "TRUE" 並保存。

然後再開啟虛擬機器,這樣便會自動進入到選擇開機選項的介面,之後選擇再生龍所在的光碟,然後輕車熟路地完成備份工作。

在使用再生龍完成了備份工作並關閉了虛擬機器後,再換上新的空硬碟準備還原備份之前,需要再次重複「關閉 VM­ware, 開啟 vmx 檔案,在結尾處添加 bios.forceSetupOnce = "TRUE" 列並保存」的作業。

然後再開啟虛擬機器,並透過再生龍將剛剛備份的鏡像還原到空白硬碟上。

關閉虛擬機器後,再次來到該虛擬機器的 Vir­tu­al Ma­chi­ne Set­tings > Op­tions 中,將虛擬機器的作業系統改回 Mac OS X.

然後對剛剛透過再生龍還原的硬碟進行 De­frag­ment 和 Com­pact. 完成後關閉 VM­ware.

這時使用最初備份的 vmx 檔案取代現在的 vmx 檔案,然後移除「倒硬碟」過程中的中間檔案。

這樣整個「倒硬碟」過程就完成了。初次作業時大抵能夠節省約 13 GB 左右。