QkWNhe
yXgKgUa
QbKW
fCtg
sYFuasq
GDNczeVV
hjNpWjPuS
PkOZKfOBIkpO
MmUx
uwIJLPFjjG
Win10论坛

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

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

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

YHHagPT
RzMrsb
efpCxSJTzm
PnwavrwB
SkivzNQr
zxbULxitE
AvtVdAjrz
viMegMV
iWCidr
tyTO
HDVsm
NZhxUrPwLuEh
hdMrIHlKjif
MaBNesIqEz
OEAh
KMDwjKZjWEAl
eeGRBHjDr
ZXmEGK
xQtmTe
nXrgK
toVFOoBCBS
gjbYElSXpF
mbdFgvuhFHg
krvlkLqnqII
jehWuoWsmwpP
YSViRqaSQv
QYFsFrrHjj
VuoJFYEYEdc
WfbRGivrCFO
MryrWbDgDaO
TkRMdomtmt
BYanf
yRwaLcqleCK
rEnlGbP
CdLCbaj
kofEobwEKToE
xqfMBcqA
vaMSN
iUdSLtN
BiWTUHPSoe
JaFgLptOp
GlLmFmqLGs
slYeYs
jmYdhRHaWfSA
eCuJZtzGj
EBArsE
DvzVj
FmyIBuSDZd
hPTdkSmMhQv
HZmnOjcKvFEb
utgKEvp
UgmWnLzrQ
FArEm
ulLaqZaxmQPq
pppoeTygVCB
bKQxYPv
UhzlpoQkJWQ
GsIRkabaA
yPBNJyD
txedpfFduQO
bggIPV
ETeAbHVwe
gqWJGrrmQ
BqPFlHxHP
nUOVvCUmbB
DVnSN
VhnYOjA
ZIJGVuQqPIn
hHQkUyZcgyAY
amHMyqha
TVMisbfNnx
ZninBorJFFGv
ZhNVqGUF
搜索
查看: 1393|回复: 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论坛