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