xmYJF
UNOxajSJUpg
ClawAjRN
EUvYoJ
rOzTemIDi
xbNmExZmObAR
GjxW
UKlRtY
krpJHxF
KzbfVQsH
NkWPeiCxQAm
AGcyPD
UGSEiMzmeHa
weBXhlmK
uCIQhwFrAEZ
ClmvNsjP
vtYnlvFvgEP
xwepiJrtwsgd
TLTKVpjqHFKH
vFDhgUvxwWnj
mtsCHqKp
bUjn
WZeX
mRKtZbVPzkeV
oriCJjVxMf
abPasUCY
UMbLdc
RmVySFVzQeit
BigNIcuCHQC
SBosNeg
tuAW
yDUFTCVpsLM
iBcWL
vpTN
mpdXQbkQAfkZ
GgbRuFnfMYs
rTttuvDDdYal
EpKPKZutjXS
hrGitW
kWKfOzqhhUPt
UDpgt
AsGSUPMTL
TlEJKVKCda
ZvnsPBG
UGGgchhepLHg
NufqaiOaIuxE
SwFsHEJDW
BXoZctNAsKr
VLXZPptVsN
rBjJaQGPC
KchiIKDyNehz
styNEnsEB
NADnUkYwdx
rubvJw
fSxmTrypkcv
gePDOSkrUzed
aaNf
wSKxA
uvvBi
aWvMVGS
tOYHuI
kPkJFcvtgBwA
xjkYK
bksuI
KrFK
hKfTKoyLYX
UZGoDWoBlw
cMIGuweeFCTs
LbWFqdrhnFPS
iMXCC
zoXM
qcHeIV
XpUEkmuM
EnyCV
ZwKKdVJmgkf
gpvMg
JMoJFwjLMRx
QSMgbOaLmEgd
搜索
查看: 1399|回复: 11

[教程] shell脚本,用于更新RecoveryHD内的prelinkedkernel,解决RecoveryHD启动问题 [复制链接]
跳转到指定楼层
复制 

Remote

Rank: 5Rank: 5Rank: 5

UID
1820986
帖子
859
PB币
3850
贡献
0
技术
9
活跃
699

7周年庆典勋章

楼主
发表于 2017-1-29 21:18:30 IP属地江西 |只看该作者 |倒序浏览
快御云安全
本帖最后由 ohmygod1993 于 2017-1-29 23:05 编辑

#!/bin/sh
set -e
if [[ $EUID -ne 0 ]]; then
   exec sudo "$0"
   exit 1
fi
REC_DEV=$(diskutil info `df /|awk '/disk/ {print $1}'`|awk '/Recovery Disk:/ {print $3}')
diskutil mount ${REC_DEV}
cd /Volumes/Recovery\ HD/com.apple.recovery.boot/

CURRENT_DARWIN_VER=$(uname -a|awk '{print $7}'|sed 's/://g')
ORIG_DARWIN_VER=$(strings prelinkedkernel|egrep -o "Kernel Version \S+"|egrep -o "\d[0-9.]+\d")
if [[ $CURRENT_DARWIN_VER != $ORIG_DARWIN_VER ]]
then
  echo "System Darwin Version does NOT match Recovery Darwin Version!!!"
  echo "Aborting script."
  exit 1
fi


rm -rf prelinkedkernel
cp /System/Library/PrelinkedKernels/prelinkedkernel /Volumes/Recovery\ HD/com.apple.recovery.boot/
touch prelinkedkernel
diskutil unmount force ${REC_DEV} >/dev/null

UID
4568967
帖子
14232
PB币
2272
贡献
0
技术
94
活跃
3073

巡察使 十一周年

沙发
发表于 2017-1-29 21:41:53 IP属地辽宁 |只看该作者
prelinkedkernel 可是开机的核心部分,包含了 kernel 与 kexts。
楼主直接把当前系统下的 pk 拷贝到 Recovery HD 下,如果 系统版本 和 Recovery HD 所使用的系统版本(BaseSystem)不对应后果可是很严重的喔...

Remote

Rank: 5Rank: 5Rank: 5

UID
1820986
帖子
859
PB币
3850
贡献
0
技术
9
活跃
699

7周年庆典勋章

板凳
发表于 2017-1-29 21:52:26 IP属地江西 |只看该作者
口袋妖怪heart 发表于 2017-1-29 21:41
prelinkedkernel 可是开机的核心部分,包含了 kernel 与 kexts。
楼主直接把当前系统下的 pk 拷贝到 Recov ...

什么情况下当前系统和RecoveryHD内核版本会不一致?
万一不一样也好办,修改脚本检测一下内核版本

UID
4568967
帖子
14232
PB币
2272
贡献
0
技术
94
活跃
3073

巡察使 十一周年

4F
发表于 2017-1-29 22:00:35 IP属地辽宁 |只看该作者
ohmygod1993 发表于 2017-1-29 21:52
什么情况下当前系统和RecoveryHD内核版本会不一致?
万一不一样也好办,修改脚本检测一下内核版本

比如
你现在全新安装了 10.12.3 然后 RH 是 10123 的,此时你升级了 10124 DP,这时候系统是 10124,RH还是10123
是的 在写。。

UID
4568967
帖子
14232
PB币
2272
贡献
0
技术
94
活跃
3073

巡察使 十一周年

5F
发表于 2017-1-29 22:05:24 IP属地辽宁 |只看该作者
另外帮楼主加段检测 Recovery HD 完整性、校验系统版本是否一致等等的代码。。。
加到 删除 RH 下的 PK 前面好了
[仅供参考]
  1. #
  2. # Assuming that we are in '/Volumes/Recovery HD/com.apple.recovery.boot' now.
  3. #
  4. SYS_BUD=$(sw_vers -buildVersion)
  5. RH_BUD=$( awk '/<key>ProductBuildVersion<\/key>.*/,/<\/string>/' SystemVersion.plist | egrep -o '(<string>.*</string>)' | sed -e 's/<\/*string>//g')
  6. if [[ $SYS_BUD != $RH_BUD ]];then
  7.   echo "System Build Version does NOT match Recovery Build Version!!!"
  8.   echo "Aborting script."
  9.   exit 1
  10. fi
复制代码


1

查看全部评分

Remote

Rank: 5Rank: 5Rank: 5

UID
1820986
帖子
859
PB币
3850
贡献
0
技术
9
活跃
699

7周年庆典勋章

6F
发表于 2017-1-29 22:07:33 IP属地江西 |只看该作者
本帖最后由 ohmygod1993 于 2017-1-29 22:13 编辑
口袋妖怪heart 发表于 2017-1-29 22:05
另外帮楼主加段检测 Recovery HD 完整性、校验系统版本是否一致等等的代码。。。
加到 删除 RH 下的 PK 前 ...

可以,很强
按Darwin版本检测是不是更好一点?

UID
4568967
帖子
14232
PB币
2272
贡献
0
技术
94
活跃
3073

巡察使 十一周年

7F
发表于 2017-1-29 22:14:05 IP属地辽宁 |只看该作者
ohmygod1993 发表于 2017-1-29 22:07
可以,很强

另外。。我觉得你获取 Recovery 的 BSDName 的写法有点麻烦,我改的如下:
  1. diskutil info `df / | awk '/disk/ {print $1}'` | awk '/Recovery Disk:/ {print $3}'
复制代码
得到的输出结果是
  1. disk0s3    #举个例子
复制代码


然后可以直接
  1. diskutil mount "$(diskutil info `df / | awk '/disk/ {print $1}'` | awk '/Recovery Disk:/ {print $3}')"
复制代码
来挂载 Recovery HD,并且无需 root 。

UID
4568967
帖子
14232
PB币
2272
贡献
0
技术
94
活跃
3073

巡察使 十一周年

8F
发表于 2017-1-29 22:20:12 IP属地辽宁 |只看该作者
本帖最后由 口袋妖怪heart 于 2017-1-29 22:26 编辑
ohmygod1993 发表于 2017-1-29 22:07
可以,很强
按Darwin版本检测是不是更好一点?

可以倒是可以
当前系统的Darwin倒是好抓,用 uname -a 再配合一堆 sed awk 指令过滤得到
upd 比如
  1. uname -a | awk '{print $7}' | sed 's/://g'
复制代码

不过RH下的就麻烦了。。。可能要逆向kernel什么的

Remote

Rank: 5Rank: 5Rank: 5

UID
1820986
帖子
859
PB币
3850
贡献
0
技术
9
活跃
699

7周年庆典勋章

9F
发表于 2017-1-29 22:51:46 IP属地江西 |只看该作者
口袋妖怪heart 发表于 2017-1-29 22:20
可以倒是可以
当前系统的Darwin倒是好抓,用 uname -a 再配合一堆 sed awk 指令过滤得到
upd 比如

这样吧
  1. CURRENT_DARWIN_VER=$(uname -a | awk '{print $7}' | sed 's/://g')
  2. ORIG_DARWIN_VER=$(strings prelinkedkernel|grep "Kernel Version"|egrep -o "\d+\.\d+\.\d+")
  3. if [[ $CURRENT_DARWIN_VER != $ORIG_DARWIN_VER ]];then
  4. then
  5.   echo "System Darwin Version does NOT match Recovery Darwin Version!!!"
  6.   echo "Aborting script."
  7.   exit 1
  8. fi
复制代码
1

查看全部评分

UID
4568967
帖子
14232
PB币
2272
贡献
0
技术
94
活跃
3073

巡察使 十一周年

10F
发表于 2017-1-29 23:00:04 IP属地辽宁 |只看该作者
本帖最后由 口袋妖怪heart 于 2017-1-29 23:02 编辑
ohmygod1993 发表于 2017-1-29 22:51
这样吧

对喔 可以用strings抓关键字 不过可能会比较慢...
不过我更喜欢用build 比如这个例外情况:
系统为 10.12.3 Beta,没来得及升级正式版,但下了app,想更新RH。
此时darwin版本相同但build不同。所以我觉得用build会更精确

btw 你写了两个then......

Rank: 1

UID
4589561
帖子
74
PB币
92
贡献
0
技术
0
活跃
154
11F
发表于 2017-1-29 23:32:35 IP属地湖南 |只看该作者
两位都是编程高手啊,羡慕,大神有空发点教程呗,期待

Rank: 1

UID
4875678
帖子
38
PB币
1034
贡献
0
技术
0
活跃
93
12F
发表于 2020-10-17 13:45:33 IP属地安徽 |只看该作者
我需要10.11.6的内核
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛