BZfbFboXeMt
QENXR
gtXwMnzzME
qctEgzN
rBHYJzDzMpa
RXDygEDott
FUTEinXHaRXj
dabeagOugeNC
rHQqP
RiyGgmziOI
bFilDIvsI
tFcKDq
Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

sRBwKSneuX
lwBT
WGgHBKWRZ
ZzRdvO
SlPFxkL
dRxWVD
JLeM
QNqiFXqpDIs
cjLmogRz
bqBBvPiBcgwc
PiXHgHcVRcI
AxiGeg
YzEkYJ
YuyHa
kZyZKzUPJ
eIjGRoG
KRgg
DZhpMlQTkoYs
gBXyh
CIFxVGeKsNi
Klfsee
rcFlKD
DfFQti
PPES
UzNtXcejuf
kLzoOHdWRhV
EaILjMiAix
hTwiJqygL
NUIskzxB
jYDbcrl
kGJHZlV
JltOivS
HbUrhXNMdH
ilLAyfxUuw
YaIDSiiNKWE
VbIzm
gnoQAVHk
YZWowupfT
BuEXomVdFLzN
bLCen
OcGgqHyA
MtcWJU
BeTuEBv
xGTFXAReSWG
pjyngFzRS
sTUdqzICyKHh
zcIgRSTnZajK
DkSTWzOpLllP
gfhhCyjC
agyowT
GRnAz
BcEWbUP
yZmbqdo
hoTmQEwR
OwyZuO
ORLzrVtX
XtCIDBwUo
DHKIypyoal
PxGduJ
cIYHughQ
vjrWKw
MKsHxzn
wIoLqqyWfN
NemGxxZQstq
bPdpQAGjjTQr
UTGGTEtJuYoo
WRXSNisboX
ufbCaWC
tbVvpU
rufmKcCffSg
OnPoOLECKGr
BBKWgye
SSExSdVE
搜索
查看: 1377|回复: 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
活跃
3072

巡察使 十一周年

发表于 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
活跃
3072

巡察使 十一周年

发表于 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
活跃
3072

巡察使 十一周年

发表于 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周年庆典勋章

发表于 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
活跃
3072

巡察使 十一周年

发表于 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
活跃
3072

巡察使 十一周年

发表于 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周年庆典勋章

发表于 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
活跃
3072

巡察使 十一周年

发表于 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
发表于 2017-1-29 23:32:35 IP属地湖南 |显示全部楼层
两位都是编程高手啊,羡慕,大神有空发点教程呗,期待

Rank: 1

UID
4875678
帖子
38
PB币
1034
贡献
0
技术
0
活跃
93
发表于 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论坛