]>
Commit | Line | Data |
---|---|---|
3b403b32 | 1 | #!/bin/bash |
cc02093d HH |
2 | # |
3 | # Copyright 2005-2010 Harald Hoyer <harald@redhat.com> | |
4 | # Copyright 2005-2010 Red Hat, Inc. All rights reserved. | |
5 | # | |
6 | # This program is free software; you can redistribute it and/or modify | |
7 | # it under the terms of the GNU General Public License as published by | |
8 | # the Free Software Foundation; either version 2 of the License, or | |
9 | # (at your option) any later version. | |
10 | # | |
11 | # This program is distributed in the hope that it will be useful, | |
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | # GNU General Public License for more details. | |
15 | # | |
16 | # You should have received a copy of the GNU General Public License | |
17 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
18 | # | |
074d12c1 | 19 | |
f7bccf37 HH |
20 | usage() |
21 | { | |
dde2db3d | 22 | { |
7d9bb76a HH |
23 | echo "Usage: ${0##*/} [options] [<initramfs file> [<filename> [<filename> [...] ]]]" |
24 | echo "Usage: ${0##*/} [options] -k <kernel version>" | |
dde2db3d | 25 | echo |
7d9bb76a HH |
26 | echo "-h, --help print a help message and exit." |
27 | echo "-s, --size sort the contents of the initramfs by size." | |
05d2a145 | 28 | echo "-m, --mod list modules." |
7d9bb76a | 29 | echo "-f, --file <filename> print the contents of <filename>." |
97bbba69 | 30 | echo "--unpack unpack the initramfs, instead of displaying the contents." |
143420bc KS |
31 | echo " If optional filenames are given, will only unpack specified files," |
32 | echo " else the whole image will be unpacked. Won't unpack anything from early cpio part." | |
97bbba69 | 33 | echo "--unpackearly unpack the early microcode part of the initramfs." |
143420bc | 34 | echo " Same as --unpack, but only unpack files from early cpio part." |
97bbba69 | 35 | echo "-v, --verbose unpack verbosely." |
7d9bb76a | 36 | echo "-k, --kver <kernel version> inspect the initramfs of <kernel version>." |
dde2db3d HH |
37 | echo |
38 | } >&2 | |
f7bccf37 HH |
39 | } |
40 | ||
b208aad5 HH |
41 | |
42 | [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut | |
43 | ||
3ea5d2e2 | 44 | sorted=0 |
05d2a145 | 45 | modules=0 |
97bbba69 | 46 | unset verbose |
7d9bb76a HH |
47 | declare -A filenames |
48 | ||
49 | unset POSIXLY_CORRECT | |
50 | TEMP=$(getopt \ | |
97bbba69 | 51 | -o "vshmf:k:" \ |
7d9bb76a HH |
52 | --long kver: \ |
53 | --long file: \ | |
05d2a145 | 54 | --long mod \ |
7d9bb76a HH |
55 | --long help \ |
56 | --long size \ | |
97bbba69 HH |
57 | --long unpack \ |
58 | --long unpackearly \ | |
59 | --long verbose \ | |
7d9bb76a HH |
60 | -- "$@") |
61 | ||
62 | if (( $? != 0 )); then | |
63 | usage | |
64 | exit 1 | |
65 | fi | |
66 | ||
67 | eval set -- "$TEMP" | |
68 | ||
69 | while (($# > 0)); do | |
70 | case $1 in | |
97bbba69 HH |
71 | -k|--kver) KERNEL_VERSION="$2"; shift;; |
72 | -f|--file) filenames[${2#/}]=1; shift;; | |
73 | -s|--size) sorted=1;; | |
74 | -h|--help) usage; exit 0;; | |
75 | -m|--mod) modules=1;; | |
76 | -v|--verbose) verbose="--verbose";; | |
77 | --unpack) unpack=1;; | |
78 | --unpackearly) unpackearly=1;; | |
79 | --) shift;break;; | |
80 | *) usage; exit 1;; | |
3ea5d2e2 | 81 | esac |
7d9bb76a | 82 | shift |
3ea5d2e2 | 83 | done |
3ea5d2e2 | 84 | |
7d9bb76a | 85 | [[ $KERNEL_VERSION ]] || KERNEL_VERSION="$(uname -r)" |
dde2db3d | 86 | |
7d9bb76a | 87 | if [[ $1 ]]; then |
dde2db3d HH |
88 | image="$1" |
89 | if ! [[ -f "$image" ]]; then | |
90 | { | |
91 | echo "$image does not exist" | |
92 | echo | |
93 | } >&2 | |
94 | usage | |
95 | exit 1 | |
96 | fi | |
dde2db3d | 97 | else |
727e68d0 HH |
98 | [[ -f /etc/machine-id ]] && read MACHINE_ID < /etc/machine-id |
99 | ||
093bc9b5 JG |
100 | if [[ -d /efi/loader/entries || -L /efi/loader/entries ]] \ |
101 | && [[ $MACHINE_ID ]] \ | |
102 | && [[ -d /efi/${MACHINE_ID} || -L /efi/${MACHINE_ID} ]] ; then | |
103 | image="/efi/${MACHINE_ID}/${KERNEL_VERSION}/initrd" | |
104 | elif [[ -d /boot/loader/entries || -L /boot/loader/entries ]] \ | |
7d9bb76a HH |
105 | && [[ $MACHINE_ID ]] \ |
106 | && [[ -d /boot/${MACHINE_ID} || -L /boot/${MACHINE_ID} ]] ; then | |
727e68d0 HH |
107 | image="/boot/${MACHINE_ID}/${KERNEL_VERSION}/initrd" |
108 | else | |
d928724c | 109 | image="/boot/initramfs-${KERNEL_VERSION}.img" |
727e68d0 | 110 | fi |
dde2db3d HH |
111 | fi |
112 | ||
7d9bb76a HH |
113 | shift |
114 | while (($# > 0)); do | |
115 | filenames[${1#/}]=1; | |
116 | shift | |
117 | done | |
727e68d0 | 118 | |
dde2db3d HH |
119 | if ! [[ -f "$image" ]]; then |
120 | { | |
121 | echo "No <initramfs file> specified and the default image '$image' cannot be accessed!" | |
122 | echo | |
123 | } >&2 | |
124 | usage | |
125 | exit 1 | |
126 | fi | |
074d12c1 | 127 | |
cbf32008 MR |
128 | TMPDIR="$(mktemp -d -t lsinitrd.XXXXXX)" |
129 | trap "rm -rf '$TMPDIR'" EXIT | |
130 | ||
d3be9275 AŻ |
131 | dracutlibdirs() { |
132 | for d in lib64/dracut lib/dracut usr/lib64/dracut usr/lib/dracut; do | |
133 | echo "$d/$1" | |
134 | done | |
135 | } | |
136 | ||
b208aad5 HH |
137 | extract_files() |
138 | { | |
139 | (( ${#filenames[@]} == 1 )) && nofileinfo=1 | |
3721635b | 140 | for f in "${!filenames[@]}"; do |
b208aad5 HH |
141 | [[ $nofileinfo ]] || echo "initramfs:/$f" |
142 | [[ $nofileinfo ]] || echo "========================================================================" | |
8379784a | 143 | $CAT "$image" 2>/dev/null | cpio --extract --verbose --quiet --to-stdout "$f" 2>/dev/null |
b208aad5 HH |
144 | ((ret+=$?)) |
145 | [[ $nofileinfo ]] || echo "========================================================================" | |
146 | [[ $nofileinfo ]] || echo | |
147 | done | |
148 | } | |
149 | ||
05d2a145 HB |
150 | list_modules() |
151 | { | |
152 | echo "dracut modules:" | |
d3be9275 AŻ |
153 | $CAT "$image" | cpio --extract --verbose --quiet --to-stdout -- \ |
154 | $(dracutlibdirs modules.txt) 2>/dev/null | |
05d2a145 HB |
155 | ((ret+=$?)) |
156 | } | |
157 | ||
b208aad5 HH |
158 | list_files() |
159 | { | |
160 | echo "========================================================================" | |
161 | if [ "$sorted" -eq 1 ]; then | |
bce6823a | 162 | $CAT "$image" 2>/dev/null | cpio --extract --verbose --quiet --list | sort -n -k5 |
b208aad5 | 163 | else |
bce6823a | 164 | $CAT "$image" 2>/dev/null | cpio --extract --verbose --quiet --list | sort -k9 |
b208aad5 HH |
165 | fi |
166 | ((ret+=$?)) | |
167 | echo "========================================================================" | |
168 | } | |
169 | ||
1ff306a3 KS |
170 | list_squash_content() |
171 | { | |
172 | SQUASH_IMG="squash/root.img" | |
cbf32008 MR |
173 | SQUASH_TMPFILE="$TMPDIR/initrd.root.sqsh" |
174 | ||
1ff306a3 KS |
175 | $CAT "$image" 2>/dev/null | cpio --extract --verbose --quiet --to-stdout -- \ |
176 | $SQUASH_IMG > "$SQUASH_TMPFILE" 2>/dev/null | |
177 | if [[ -s $SQUASH_TMPFILE ]]; then | |
178 | echo "Squashed content ($SQUASH_IMG):" | |
179 | echo "========================================================================" | |
180 | unsquashfs -ll "$SQUASH_TMPFILE" | tail -n +4 | |
181 | echo "========================================================================" | |
182 | fi | |
183 | } | |
184 | ||
97bbba69 HH |
185 | unpack_files() |
186 | { | |
f81c864e KS |
187 | if (( ${#filenames[@]} > 0 )); then |
188 | for f in "${!filenames[@]}"; do | |
189 | $CAT "$image" 2>/dev/null | cpio -id --quiet $verbose $f | |
190 | ((ret+=$?)) | |
191 | done | |
192 | else | |
193 | $CAT "$image" 2>/dev/null | cpio -id --quiet $verbose | |
194 | ((ret+=$?)) | |
195 | fi | |
97bbba69 HH |
196 | } |
197 | ||
cbf32008 MR |
198 | read -N 2 bin < "$image" |
199 | if [ "$bin" = "MZ" ]; then | |
200 | command -v objcopy > /dev/null || { echo "Need 'objcopy' to unpack an UEFI executable."; exit 1; } | |
201 | objcopy \ | |
202 | --dump-section .linux="$TMPDIR/vmlinuz" \ | |
203 | --dump-section .initrd="$TMPDIR/initrd.img" \ | |
204 | --dump-section .cmdline="$TMPDIR/cmdline.txt" \ | |
205 | --dump-section .osrel="$TMPDIR/osrel.txt" \ | |
206 | "$image" /dev/null | |
207 | uefi="$image" | |
208 | image="$TMPDIR/initrd.img" | |
209 | [ -f "$image" ] || exit 1 | |
210 | fi | |
b208aad5 | 211 | |
97bbba69 | 212 | if (( ${#filenames[@]} <= 0 )) && [[ -z "$unpack" ]] && [[ -z "$unpackearly" ]]; then |
32dfd416 | 213 | if [ -n "$uefi" ]; then |
cbf32008 MR |
214 | echo -n "initrd in UEFI: $uefi: " |
215 | du -h $image | while read a b || [ -n "$a" ]; do echo $a;done | |
216 | if [ -f "$TMPDIR/osrel.txt" ]; then | |
217 | name=$(sed -En '/^PRETTY_NAME/ s/^\w+=["'"'"']?([^"'"'"'$]*)["'"'"']?/\1/p' "$TMPDIR/osrel.txt") | |
218 | id=$(sed -En '/^ID/ s/^\w+=["'"'"']?([^"'"'"'$]*)["'"'"']?/\1/p' "$TMPDIR/osrel.txt") | |
219 | build=$(sed -En '/^BUILD_ID/ s/^\w+=["'"'"']?([^"'"'"'$]*)["'"'"']?/\1/p' "$TMPDIR/osrel.txt") | |
220 | echo "OS Release: $name (${id}-${build})" | |
221 | fi | |
222 | if [ -f "$TMPDIR/vmlinuz" ]; then | |
223 | version=$(strings -n 20 "$TMPDIR/vmlinuz" | sed -En '/[0-9]+\.[0-9]+\.[0-9]+/ { p; q 0 }') | |
224 | echo "Kernel Version: $version" | |
225 | fi | |
226 | if [ -f "$TMPDIR/cmdline.txt" ]; then | |
227 | echo "Command line:" | |
228 | sed -En 's/\s+/\n/g; s/\x00/\n/; p' "$TMPDIR/cmdline.txt" | |
229 | fi | |
230 | else | |
231 | echo -n "Image: $image: " | |
232 | du -h $image | while read a b || [ -n "$a" ]; do echo $a;done | |
233 | fi | |
234 | ||
b208aad5 HH |
235 | echo "========================================================================" |
236 | fi | |
237 | ||
884e1cda | 238 | read -N 6 bin < "$image" |
b208aad5 HH |
239 | case $bin in |
240 | $'\x71\xc7'*|070701) | |
18a5011f | 241 | CAT="cat --" |
b208aad5 | 242 | is_early=$(cpio --extract --verbose --quiet --to-stdout -- 'early_cpio' < "$image" 2>/dev/null) |
ce62465c TM |
243 | # Debian mkinitramfs does not create the file 'early_cpio', so let's check if firmware files exist |
244 | [[ "$is_early" ]] || is_early=$(cpio --list --verbose --quiet --to-stdout -- 'kernel/*/microcode/*.bin' < "$image" 2>/dev/null) | |
b208aad5 | 245 | if [[ "$is_early" ]]; then |
f81c864e KS |
246 | if [[ -n "$unpack" ]]; then |
247 | # should use --unpackearly for early CPIO | |
248 | : | |
249 | elif [[ -n "$unpackearly" ]]; then | |
97bbba69 HH |
250 | unpack_files |
251 | elif (( ${#filenames[@]} > 0 )); then | |
b208aad5 HH |
252 | extract_files |
253 | else | |
254 | echo "Early CPIO image" | |
255 | list_files | |
256 | fi | |
98fd0693 HH |
257 | if [[ -d "$dracutbasedir/skipcpio" ]]; then |
258 | SKIP="$dracutbasedir/skipcpio/skipcpio" | |
259 | else | |
260 | SKIP="$dracutbasedir/skipcpio" | |
261 | fi | |
b208aad5 HH |
262 | if ! [[ -x $SKIP ]]; then |
263 | echo | |
264 | echo "'$SKIP' not found, cannot display remaining contents!" >&2 | |
265 | echo | |
266 | exit 0 | |
267 | fi | |
268 | fi | |
269 | ;; | |
270 | esac | |
271 | ||
3ce14286 HD |
272 | if [[ $SKIP ]] ; then |
273 | bin="$($SKIP "$image" | { read -N 6 bin && echo "$bin" ; })" | |
274 | else | |
275 | read -N 6 bin < "$image" | |
276 | fi | |
277 | case $bin in | |
278 | $'\x1f\x8b'*) | |
279 | CAT="zcat --" | |
280 | ;; | |
281 | BZh*) | |
282 | CAT="bzcat --" | |
283 | ;; | |
284 | $'\x71\xc7'*|070701) | |
18a5011f | 285 | CAT="cat --" |
3ce14286 HD |
286 | ;; |
287 | $'\x02\x21'*) | |
288 | CAT="lz4 -d -c" | |
289 | ;; | |
290 | $'\x89'LZO$'\0'*) | |
291 | CAT="lzop -d -c" | |
292 | ;; | |
ebfd53e1 | 293 | $'\x28\xB5\x2F\xFD'*) |
7dbadcc7 TPG |
294 | CAT="zstd -d -c" |
295 | ;; | |
3ce14286 HD |
296 | *) |
297 | if echo "test"|xz|xzcat --single-stream >/dev/null 2>&1; then | |
298 | CAT="xzcat --single-stream --" | |
fd9f9024 | 299 | else |
3ce14286 HD |
300 | CAT="xzcat --" |
301 | fi | |
302 | ;; | |
303 | esac | |
66fe35eb | 304 | |
b208aad5 HH |
305 | skipcpio() |
306 | { | |
307 | $SKIP "$@" | $ORIG_CAT | |
308 | } | |
309 | ||
310 | if [[ $SKIP ]]; then | |
311 | ORIG_CAT="$CAT" | |
312 | CAT=skipcpio | |
313 | fi | |
314 | ||
986b12d3 | 315 | if (( ${#filenames[@]} > 1 )); then |
cbf32008 | 316 | TMPFILE="$TMPDIR/initrd.cpio" |
986b12d3 | 317 | $CAT "$image" 2>/dev/null > $TMPFILE |
986b12d3 KS |
318 | pre_decompress() |
319 | { | |
320 | cat $TMPFILE | |
321 | } | |
322 | CAT=pre_decompress | |
323 | fi | |
324 | ||
884e1cda HH |
325 | ret=0 |
326 | ||
97bbba69 HH |
327 | if [[ -n "$unpack" ]]; then |
328 | unpack_files | |
329 | elif (( ${#filenames[@]} > 0 )); then | |
b208aad5 | 330 | extract_files |
3ea5d2e2 | 331 | else |
d3be9275 AŻ |
332 | version=$($CAT "$image" | cpio --extract --verbose --quiet --to-stdout -- \ |
333 | $(dracutlibdirs 'dracut-*') 2>/dev/null) | |
4460416a | 334 | ((ret+=$?)) |
ae01bd18 | 335 | echo "Version: $version" |
b208aad5 | 336 | echo |
05d2a145 HB |
337 | if [ "$modules" -eq 1 ]; then |
338 | list_modules | |
339 | echo "========================================================================" | |
340 | else | |
341 | echo -n "Arguments: " | |
d3be9275 AŻ |
342 | $CAT "$image" | cpio --extract --verbose --quiet --to-stdout -- \ |
343 | $(dracutlibdirs build-parameter.txt) 2>/dev/null | |
05d2a145 HB |
344 | echo |
345 | list_modules | |
346 | list_files | |
1ff306a3 | 347 | list_squash_content |
05d2a145 | 348 | fi |
3ea5d2e2 | 349 | fi |
4460416a | 350 | |
884e1cda | 351 | exit $ret |