在虛擬機器中安裝 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 左右。