在虛擬機器中安裝 Mac OS X

准备工作
前往 pa
前往此处下载最新版本的 dar
建立虚拟机器并完成安装
如常设立一个 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 上,/sudo mkdir -p /usr/local/bin 来自行建立的,不过建立之后它就会自动存在于 PATH 中了。
除了在 System Settings > Accessibility > Display 下面有 ‘Reduce motion’ 和 ‘Reduce transparency’ 以及在 Desktop & Dock 的设定中可以将视窗缩小效果从 Genie 变更为 Scale 外,还可透过以下命令列来将系统的动画效果减到最小——
#!/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 版本的——
#!/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 也需要小做修改——
#!/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 指令码,则可参考以下两则——
#!/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
#!/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 大多就是改个 she
使用再生龙对 Mac OS X 虚拟机器执行“倒硬碟”作业

Mac OS X 的虚拟机器也可以使用再生龙来倒一遍硬碟从而缩小 vmdk 档案的大小,不过其中有一些小窍门需要注意。
在准备好要进行“倒硬碟”的系统后(也即将该清的都清一清,尽管 Mac OS X 也没什么好容许你去清的),先关闭虚拟机器,然后将 vmx 档案复制一份备份。
之后,在该虚拟机器的 Virtual Machine Settings > Options 中,将虚拟机器的作业系统改为 Windows (10 或 11 都好).
然后如对 Linux 虚拟机器进行“倒硬碟”时的作业一样,添加一块新硬碟、挂上再生龙的 LiveCD, 然后再在 Virtual Machine Settings > Hardware > Display 中勾上 ‘Stretch mode’.
之后,关闭 VMware, 再次开启 vmx 档案,在结尾处添加一列 bios 并保存。
然后再开启虚拟机器,这样便会自动进入到选择开机选项的介面,之后选择再生龙所在的光碟,然后轻车熟路地完成备份工作。
在使用再生龙完成了备份工作并关闭了虚拟机器后,再换上新的空硬碟准备还原备份之前,需要再次重复“关闭 VMware, 开启 vmx 档案,在结尾处添加 bios 列并保存”的作业。
然后再开启虚拟机器,并透过再生龙将刚刚备份的镜像还原到空白硬碟上。
关闭虚拟机器后,再次来到该虚拟机器的 Virtual Machine Settings > Options 中,将虚拟机器的作业系统改回 Mac OS X.
然后对刚刚透过再生龙还原的硬碟进行 Defragment 和 Compact. 完成后关闭 VMware.
这时使用最初备份的 vmx 档案取代现在的 vmx 档案,然后移除“倒硬碟”过程中的中间档案。
这样整个“倒硬碟”过程就完成了。初次作业时大抵能够节省约 13 GB 左右。