Root/
| |
---|---|
Source at commit 1158 created 13 years 16 days ago. By azimutz, Match nvidia.c with the one on my branch (Chazi) adding dev id's from issue 99 and Asus G74SX (0DF4, 1251). | |
1 | #!/bin/bash␊ |
2 | ␊ |
3 | ␊ |
4 | diskloader="boot0"␊ |
5 | partitionloader="boot1h"␊ |
6 | filesystemloader="boot"␊ |
7 | ␊ |
8 | diskmicrocodetype[1]="GRUB,47525542"␊ |
9 | diskmicrocodetype[2]="LILO,4c494c4f"␊ |
10 | ␊ |
11 | start ()␊ |
12 | {␊ |
13 | # 1 volume␊ |
14 | ␊ |
15 | bootvolume="${@}"␊ |
16 | bootresources="${0%/*}"␊ |
17 | ␊ |
18 | if [ -z "${bootvolume}" ]; then␊ |
19 | ␉echo␊ |
20 | ␉echo "Cannot find the volume. Exiting."␊ |
21 | ␉echo␊ |
22 | ␉exit␊ |
23 | fi␊ |
24 | ␊ |
25 | bootdev=$( df "${bootvolume}" | sed -n '2p' | awk '{print $1}' )␊ |
26 | bootrdev=${bootdev/disk/rdisk}␊ |
27 | ␊ |
28 | if [ "${bootdev}" = "${bootdev#*disk*s}" ]; then␊ |
29 | ␉echo␊ |
30 | ␉echo "ERROR Volume does not use slices."␊ |
31 | ␉echo␊ |
32 | ␉exit␉␉␉␉␊ |
33 | fi␊ |
34 | ␊ |
35 | bootdisk=${bootdev%s*}␊ |
36 | bootrdisk=${bootdisk/disk/rdisk}␊ |
37 | bootslice=${bootdev#*disk*s}␊ |
38 | ␊ |
39 | echo "Volume is ${bootvolume}"␊ |
40 | echo "Volume device is ${bootdev}"␊ |
41 | echo "Volume raw device is ${bootrdev}"␊ |
42 | echo "Volume slice is ${bootslice}"␊ |
43 | echo "Disk device is ${bootdisk}"␊ |
44 | echo "Disk raw device is ${bootrdisk}"␊ |
45 | echo "Disk loader is ${diskloader}"␊ |
46 | echo "Partition loader is ${partitionloader}"␊ |
47 | echo "Filesystem loader is ${filesystemloader}"␊ |
48 | echo "Boot Resources is ${bootresources}"␊ |
49 | ␊ |
50 | }␊ |
51 | ␊ |
52 | checkdiskmicrocodetype ()␊ |
53 | {␊ |
54 | diskmicrocode=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=1 bs=437 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
55 | ␊ |
56 | diskmicrocodetypecounter=0␊ |
57 | while [ ${diskmicrocodetypecounter} -lt ${#diskmicrocodetype[@]} ]; do␊ |
58 | diskmicrocodetypecounter=$(( ${diskmicrocodetypecounter} + 1 ))␊ |
59 | diskmicrocodetypeid=${diskmicrocodetype[${diskmicrocodetypecounter}]#*,}␊ |
60 | if [ ! "${diskmicrocode}" = "${diskmicrocode/${diskmicrocodetypeid}/}" ]; then␊ |
61 | echo "${diskmicrocodetype[${diskmicrocodetypecounter}]%,*} found."␊ |
62 | fi␊ |
63 | done␊ |
64 | }␊ |
65 | ␊ |
66 | checkdiskmicrocode ()␊ |
67 | {␊ |
68 | # 1 action ( check or set )␊ |
69 | ␊ |
70 | diskmicrocode=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=1 bs=437 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
71 | diskmicrocodemd5=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=1 bs=437 | md5 )␊ |
72 | ␊ |
73 | if [ $( echo "${diskmicrocode}" | awk -F0 '{print NF-1}' ) = 874 ]; then␊ |
74 | ␉if [ "${1}" = "set" ]; then␊ |
75 | ␉␉echo "No disk microcode found. Updating."␊ |
76 | ␉␉diskupdate=true␊ |
77 | ␉else␊ |
78 | ␉␉echo "No disk microcode found."␊ |
79 | ␉fi␊ |
80 | else␊ |
81 | ␉if [ ${1} = set ]; then␊ |
82 | ␉␉echo "Disk microcode found. Preserving."␊ |
83 | ␉else␊ |
84 | ␉␉echo "Disk microcode found."␊ |
85 | ␉fi␊ |
86 | ␉echo "Disk microcode MD5 is ${diskmicrocodemd5}"␊ |
87 | fi␊ |
88 | }␊ |
89 | ␊ |
90 | checkdisksignature ()␊ |
91 | {␊ |
92 | disksignature=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=4 bs=1 skip=440 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
93 | ␊ |
94 | if [ $( echo "${disksignature}" | awk -F0 '{print NF-1}' ) = 8 ]; then␊ |
95 | ␉echo "No disk signature found."␊ |
96 | else␊ |
97 | ␉echo "Disk signature found."␊ |
98 | ␉echo "Disk signature is 0x${disksignature}"␊ |
99 | fi␊ |
100 | }␊ |
101 | ␊ |
102 | checkpartitionbootcode ()␊ |
103 | {␊ |
104 | # 1 action ( check or set )␊ |
105 | ␊ |
106 | partitionbootcode=$( dd if=${bootrdev} count=1 2>/dev/null | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
107 | partitionbootcodeextended=$( dd if=${bootrdev} count=1 skip=1 2>/dev/null | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
108 | ␊ |
109 | if [ $( echo "${partitionbootcode}" | awk -F0 '{print NF-1}' ) = 1024 ]; then␊ |
110 | ␉if [ "${1}" = "set" ]; then␊ |
111 | ␉␉echo "No partition bootcode found. Updating."␊ |
112 | ␉else␊ |
113 | ␉␉echo "No partition bootcode found."␊ |
114 | ␉fi␊ |
115 | else␊ |
116 | ␉if [ "${1}" = "set" ]; then␊ |
117 | ␉␉echo "Partition bootcode found. Overwriting."␊ |
118 | ␉else␊ |
119 | ␉␉echo "Partition bootcode found."␊ |
120 | ␉fi␊ |
121 | ␉if [ $( echo "${partitionbootcodeextended}" | awk -F0 '{print NF-1}' ) = 1024 ]; then␊ |
122 | ␉␉partitionbootcodemd5=$( dd 2>/dev/null if=${bootrdev} count=1 | md5 )␊ |
123 | ␉else␊ |
124 | ␉␉partitionbootcodemd5=$( dd 2>/dev/null if=${bootrdev} count=2 | md5 )␊ |
125 | ␉␉echo "Partition bootcode is dual sector."␊ |
126 | ␉fi␊ |
127 | ␉echo "Partition bootcode MD5 is ${partitionbootcodemd5}"␊ |
128 | fi␊ |
129 | }␊ |
130 | ␊ |
131 | checkpartitionactive ()␊ |
132 | {␊ |
133 | partitionactive=$( fdisk -d ${bootrdisk} | grep -n "*" | awk -F: '{print $1}')␊ |
134 | ␊ |
135 | if [ -n "${partitionactive}" ]; then ␊ |
136 | ␉echo "Partition flagged active is ${partitionactive}"␊ |
137 | else␊ |
138 | ␉echo "No partition flagged active."␊ |
139 | fi␊ |
140 | ␊ |
141 | }␊ |
142 | ␊ |
143 | start ${3}␊ |
144 | ␊ |
145 | #partitiontable=$( diskutil list ${bootdisk} | sed -n '3p' | awk '{print $2}' )␊ |
146 | #[ "${partitiontable}" = "GUID_partition_scheme" ] && echo "GPT found."␊ |
147 | #[ "${partitiontable}" = "FDisk_partition_scheme" ] && echo "MBR found."␊ |
148 | #[ "${partitiontable}" = "Apple_partition_scheme" ] && echo "APT found." && exit␊ |
149 | ␊ |
150 | partitiontable=$( dd 2>/dev/null if=${bootdisk} count=1 skip=1 | dd 2>/dev/null count=8 bs=1 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
151 | if [ "${partitiontable:0:16}" == "4546492050415254" ]; then␉␊ |
152 | ␉partitiontable=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=64 bs=1 skip=446 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
153 | ␉if [ "${partitiontable:8:2}" == "ee" ]; then␊ |
154 | ␉␉if [ "${partitiontable:40:2}" == "00" ] && [ "${partitiontable:72:2}" == "00" ] && [ "${partitiontable:104:2}" == "00" ]; then␊ |
155 | ␉␉␉partitiontable="GPT"␊ |
156 | ␉ ␉else␊ |
157 | ␉␉␉partitiontable="GPT/MBR"␊ |
158 | ␉␉fi␊ |
159 | ␉fi␊ |
160 | else␊ |
161 | ␉partitiontable="MBR"␊ |
162 | fi␊ |
163 | ␊ |
164 | echo "${partitiontable} found."␊ |
165 | ␊ |
166 | diskupdate=false␊ |
167 | ␊ |
168 | checkdiskmicrocodetype␊ |
169 | checkdiskmicrocode set␊ |
170 | checkdisksignature␊ |
171 | checkpartitionbootcode set␊ |
172 | checkpartitionactive␊ |
173 | ␊ |
174 | if ${diskupdate}; then␊ |
175 | ␉echo "Executing command: fdisk -u -f /usr/standalone/i386/${diskloader} -y ${bootdisk}"␊ |
176 | ␉fdisk -u -f "${bootvolume}/usr/standalone/i386/${diskloader}" -y ${bootdisk}␊ |
177 | fi␊ |
178 | ␊ |
179 | echo "Executing command: dd if=/usr/standalone/i386/${partitionloader} of=${bootrdev}"␊ |
180 | dd if="${bootvolume}/usr/standalone/i386/${partitionloader}" of=${bootrdev}␊ |
181 | ␊ |
182 | echo "Executing command: cp /usr/standalone/i386/${filesystemloader} ${bootvolume}"␊ |
183 | cp "${bootvolume}/usr/standalone/i386/${filesystemloader}" "${bootvolume}"␊ |
184 | ␊ |
185 | echo "Executing command: ${bootresources}/Tools/SetFile -a V ${bootvolume}/${filesystemloader}"␊ |
186 | "${bootresources}/Tools/SetFile" -a V "${bootvolume}/${filesystemloader}"␊ |
187 | ␊ |
188 | # If table is GPT make the first partition active (BadAxe compatibility).␊ |
189 | [ "${partitiontable}" = "GPT" ] && bootslice=1␊ |
190 | fdisk -e ${bootdisk} <<-MAKEACTIVE␊ |
191 | print␊ |
192 | flag ${bootslice}␊ |
193 | write␊ |
194 | y␊ |
195 | quit␊ |
196 | MAKEACTIVE␊ |
197 | ␊ |
198 | checkdiskmicrocode check␊ |
199 | checkdisksignature␊ |
200 | checkpartitionbootcode check␊ |
201 | checkpartitionactive␊ |
202 | ␊ |
203 | if ! [ -d "${bootvolume}/Extra/Extensions" ]; then␊ |
204 | ␉echo "Executing command: mkdir -p ${bootvolume}/Extra/Extensions"␊ |
205 | ␉mkdir -p "${bootvolume}/Extra/Extensions"␊ |
206 | fi␊ |
207 | # unpack any existing Extensions.mkext already on the booter volume␊ |
208 | if [ -f "${2}/Extra/Extensions.mkext" ]; then␊ |
209 | ␉echo "Executing command: mkextunpack -d ${2}/Extra/Extensions ${2}/Extra/Extensions.mkext"␊ |
210 | ␉mkextunpack -d "${2}/Extra/Extensions" "${2}/Extra/Extensions.mkext"␊ |
211 | ␉echo "Executing command: rm -R -f ${2}/Extra/Extensions.mkext"␊ |
212 | ␉rm -R -f "${2}/Extra/Extensions.mkext"␊ |
213 | fi␉␊ |
214 | ␊ |
215 | # setup link for extras␊ |
216 | [ -h "${2}/.Chameleon" ] && unlink "${2}/.Chameleon"␊ |
217 | echo "Executing command: ln -s . ${2}/.Chameleon"␊ |
218 | ln -s "." "${2}/.Chameleon"␊ |
219 | ␊ |
220 | exit␊ |
221 |