]>
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 HH |
29 | echo "-f, --file <filename> print the contents of <filename>." |
30 | echo "-k, --kver <kernel version> inspect the initramfs of <kernel version>." | |
dde2db3d HH |
31 | echo |
32 | } >&2 | |
f7bccf37 HH |
33 | } |
34 | ||
b208aad5 HH |
35 | |
36 | [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut | |
37 | ||
3ea5d2e2 | 38 | sorted=0 |
05d2a145 | 39 | modules=0 |
7d9bb76a HH |
40 | declare -A filenames |
41 | ||
42 | unset POSIXLY_CORRECT | |
43 | TEMP=$(getopt \ | |
05d2a145 | 44 | -o "shmf:k:" \ |
7d9bb76a HH |
45 | --long kver: \ |
46 | --long file: \ | |
05d2a145 | 47 | --long mod \ |
7d9bb76a HH |
48 | --long help \ |
49 | --long size \ | |
50 | -- "$@") | |
51 | ||
52 | if (( $? != 0 )); then | |
53 | usage | |
54 | exit 1 | |
55 | fi | |
56 | ||
57 | eval set -- "$TEMP" | |
58 | ||
59 | while (($# > 0)); do | |
60 | case $1 in | |
61 | -k|--kver) KERNEL_VERSION="$2"; shift;; | |
62 | -f|--file) filenames[${2#/}]=1; shift;; | |
63 | -s|--size) sorted=1;; | |
64 | -h|--help) usage; exit 0;; | |
05d2a145 | 65 | -m|--mod) modules=1;; |
7d9bb76a HH |
66 | --) shift;break;; |
67 | *) usage; exit 1;; | |
3ea5d2e2 | 68 | esac |
7d9bb76a | 69 | shift |
3ea5d2e2 | 70 | done |
3ea5d2e2 | 71 | |
7d9bb76a | 72 | [[ $KERNEL_VERSION ]] || KERNEL_VERSION="$(uname -r)" |
dde2db3d | 73 | |
7d9bb76a | 74 | if [[ $1 ]]; then |
dde2db3d HH |
75 | image="$1" |
76 | if ! [[ -f "$image" ]]; then | |
77 | { | |
78 | echo "$image does not exist" | |
79 | echo | |
80 | } >&2 | |
81 | usage | |
82 | exit 1 | |
83 | fi | |
dde2db3d | 84 | else |
727e68d0 HH |
85 | [[ -f /etc/machine-id ]] && read MACHINE_ID < /etc/machine-id |
86 | ||
7d9bb76a HH |
87 | if [[ -d /boot/loader/entries || -L /boot/loader/entries ]] \ |
88 | && [[ $MACHINE_ID ]] \ | |
89 | && [[ -d /boot/${MACHINE_ID} || -L /boot/${MACHINE_ID} ]] ; then | |
727e68d0 HH |
90 | image="/boot/${MACHINE_ID}/${KERNEL_VERSION}/initrd" |
91 | else | |
d928724c | 92 | image="/boot/initramfs-${KERNEL_VERSION}.img" |
727e68d0 | 93 | fi |
dde2db3d HH |
94 | fi |
95 | ||
7d9bb76a HH |
96 | shift |
97 | while (($# > 0)); do | |
98 | filenames[${1#/}]=1; | |
99 | shift | |
100 | done | |
727e68d0 | 101 | |
dde2db3d HH |
102 | if ! [[ -f "$image" ]]; then |
103 | { | |
104 | echo "No <initramfs file> specified and the default image '$image' cannot be accessed!" | |
105 | echo | |
106 | } >&2 | |
107 | usage | |
108 | exit 1 | |
109 | fi | |
074d12c1 | 110 | |
d3be9275 AŻ |
111 | dracutlibdirs() { |
112 | for d in lib64/dracut lib/dracut usr/lib64/dracut usr/lib/dracut; do | |
113 | echo "$d/$1" | |
114 | done | |
115 | } | |
116 | ||
b208aad5 HH |
117 | extract_files() |
118 | { | |
119 | (( ${#filenames[@]} == 1 )) && nofileinfo=1 | |
120 | for f in ${!filenames[@]}; do | |
121 | [[ $nofileinfo ]] || echo "initramfs:/$f" | |
122 | [[ $nofileinfo ]] || echo "========================================================================" | |
123 | $CAT $image | cpio --extract --verbose --quiet --to-stdout $f 2>/dev/null | |
124 | ((ret+=$?)) | |
125 | [[ $nofileinfo ]] || echo "========================================================================" | |
126 | [[ $nofileinfo ]] || echo | |
127 | done | |
128 | } | |
129 | ||
05d2a145 HB |
130 | list_modules() |
131 | { | |
132 | echo "dracut modules:" | |
d3be9275 AŻ |
133 | $CAT "$image" | cpio --extract --verbose --quiet --to-stdout -- \ |
134 | $(dracutlibdirs modules.txt) 2>/dev/null | |
05d2a145 HB |
135 | ((ret+=$?)) |
136 | } | |
137 | ||
b208aad5 HH |
138 | list_files() |
139 | { | |
140 | echo "========================================================================" | |
141 | if [ "$sorted" -eq 1 ]; then | |
142 | $CAT "$image" | cpio --extract --verbose --quiet --list | sort -n -k5 | |
143 | else | |
144 | $CAT "$image" | cpio --extract --verbose --quiet --list | sort -k9 | |
145 | fi | |
146 | ((ret+=$?)) | |
147 | echo "========================================================================" | |
148 | } | |
149 | ||
150 | ||
151 | if (( ${#filenames[@]} <= 0 )); then | |
6d58fa27 | 152 | echo "Image: $image: $(du -h $image | while read a b || [ -n "$a" ]; do echo $a;done)" |
b208aad5 HH |
153 | echo "========================================================================" |
154 | fi | |
155 | ||
884e1cda | 156 | read -N 6 bin < "$image" |
b208aad5 HH |
157 | case $bin in |
158 | $'\x71\xc7'*|070701) | |
159 | CAT="cat --" | |
160 | is_early=$(cpio --extract --verbose --quiet --to-stdout -- 'early_cpio' < "$image" 2>/dev/null) | |
161 | if [[ "$is_early" ]]; then | |
162 | if (( ${#filenames[@]} > 0 )); then | |
163 | extract_files | |
164 | else | |
165 | echo "Early CPIO image" | |
166 | list_files | |
167 | fi | |
168 | SKIP="$dracutbasedir/skipcpio" | |
169 | if ! [[ -x $SKIP ]]; then | |
170 | echo | |
171 | echo "'$SKIP' not found, cannot display remaining contents!" >&2 | |
172 | echo | |
173 | exit 0 | |
174 | fi | |
175 | fi | |
176 | ;; | |
177 | esac | |
178 | ||
fd9f9024 HH |
179 | CAT=$({ |
180 | if [[ $SKIP ]]; then | |
181 | $SKIP "$image" | |
182 | else | |
183 | cat "$image" | |
184 | fi } | { | |
185 | read -N 6 bin | |
186 | case $bin in | |
187 | $'\x1f\x8b'*) | |
188 | echo "zcat --" | |
189 | ;; | |
190 | BZh*) | |
191 | echo "bzcat --" | |
192 | ;; | |
193 | $'\x71\xc7'*|070701) | |
194 | echo "cat --" | |
195 | ;; | |
196 | $'\x02\x21'*) | |
197 | echo "lz4 -d -c" | |
198 | ;; | |
773d6a7d TG |
199 | $'\x89'LZO$'\0'*) |
200 | echo "lzop -d -c" | |
201 | ;; | |
fd9f9024 HH |
202 | *) |
203 | if echo "test"|xz|xzcat --single-stream >/dev/null 2>&1; then | |
204 | echo "xzcat --single-stream --" | |
205 | else | |
206 | echo "xzcat --" | |
207 | fi | |
208 | ;; | |
209 | esac | |
210 | }) | |
66fe35eb | 211 | |
b208aad5 HH |
212 | skipcpio() |
213 | { | |
214 | $SKIP "$@" | $ORIG_CAT | |
215 | } | |
216 | ||
217 | if [[ $SKIP ]]; then | |
218 | ORIG_CAT="$CAT" | |
219 | CAT=skipcpio | |
220 | fi | |
221 | ||
884e1cda HH |
222 | ret=0 |
223 | ||
4460416a | 224 | if (( ${#filenames[@]} > 0 )); then |
b208aad5 | 225 | extract_files |
3ea5d2e2 | 226 | else |
d3be9275 AŻ |
227 | version=$($CAT "$image" | cpio --extract --verbose --quiet --to-stdout -- \ |
228 | $(dracutlibdirs 'dracut-*') 2>/dev/null) | |
4460416a | 229 | ((ret+=$?)) |
ae01bd18 | 230 | echo "Version: $version" |
b208aad5 | 231 | echo |
05d2a145 HB |
232 | if [ "$modules" -eq 1 ]; then |
233 | list_modules | |
234 | echo "========================================================================" | |
235 | else | |
236 | echo -n "Arguments: " | |
d3be9275 AŻ |
237 | $CAT "$image" | cpio --extract --verbose --quiet --to-stdout -- \ |
238 | $(dracutlibdirs build-parameter.txt) 2>/dev/null | |
05d2a145 HB |
239 | echo |
240 | list_modules | |
241 | list_files | |
242 | fi | |
3ea5d2e2 | 243 | fi |
4460416a | 244 | |
884e1cda | 245 | exit $ret |