Skip to content

Commit a758488

Browse files
committed
add faster lsinitrd substitute
1 parent 8791deb commit a758488

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

lsinitrd-quick

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
#! /bin/bash
2+
3+
trap 'echo error in $BASH_COMMAND >&2; exit 1' ERR
4+
5+
MG_CPIO=$'\x71\xc7'
6+
MG_CPIO1=070701
7+
MG_GZ=$'\x1f\x8b'
8+
MG_GZ1=$'\x1f\x9e'
9+
MG_BZ="BZh"
10+
MG_XZ=$'\xfd7zXZ'
11+
MG_LZ4=$'\x02\x21'
12+
MG_LZO=$'\x89LZO'
13+
MG_ZSTD=$'\x28\xB5\x2F\xFD'
14+
15+
check_fmt() {
16+
case $1 in
17+
$MG_CPIO*|$MG_CPIO1)
18+
echo cpio;;
19+
$MG_GZ*|$MG_GZ1*)
20+
echo gzip;;
21+
$MG_BZ*)
22+
echo bz2;;
23+
$MG_XZ*)
24+
echo xz;;
25+
$MG_LZ4*)
26+
echo lz4;;
27+
$MG_LZO*)
28+
echo lzo;;
29+
$MG_ZSTD*)
30+
echo zstd;;
31+
esac
32+
}
33+
34+
uncomp() {
35+
case $1 in
36+
$MG_CPIO*|$MG_CPIO1)
37+
cat;;
38+
$MG_GZ*)
39+
zcat;;
40+
$MG_BZ*)
41+
bzcat;;
42+
$MG_XZ*)
43+
xzcat;;
44+
$MG_LZ4*)
45+
lz4 -d -c;;
46+
$MG_LZO*)
47+
lzop -d -c;;
48+
$MG_ZSTD*)
49+
zstd -d -c;;
50+
esac
51+
}
52+
53+
check_size () {
54+
[[ "$SIZE" -gt $1 ]] || {
55+
echo "$INITRD: file too small, cannot read magic" >&2
56+
exit 1
57+
}
58+
}
59+
60+
INITRD=$1
61+
[[ "$INITRD" && -f "$INITRD" ]] || {
62+
echo "$INITRD: file not found" >&2
63+
exit 1
64+
}
65+
SIZE=$(stat -L -c %s "$INITRD")
66+
check_size 6
67+
68+
read -r -d'\0' -n 6 MAGIC <"$INITRD"
69+
FMT=$(check_fmt "$MAGIC")
70+
BYTES=0
71+
if [[ ! $FMT ]]; then
72+
echo "$INITRD: unknown format" >&2
73+
exit 1
74+
elif [[ "$FMT" = cpio ]]; then
75+
# check for "early CPIO" image
76+
TMPFILE=$(mktemp "${TMPDIR:-/tmp}/initrd-XXXXXX")
77+
EARLY=$(cpio -t early_cpio "kernel/*/microcode/*.bin" \
78+
<"$INITRD" 2>"$TMPFILE")
79+
BLOCKS=$(cut -d" " -f1 "$TMPFILE")
80+
rm -f "$TMPFILE"
81+
if [[ -z "$EARLY" ]]; then
82+
# just plain uncompressed cpio
83+
cpio -t <"$INITRD" 2>/dev/null
84+
exit
85+
fi
86+
BYTES=$((512*BLOCKS))
87+
check_size $((BYTES + 6))
88+
read -r -d '\0' -n 6 MAGIC \
89+
< <(dd if="$INITRD" bs=1b count=1 skip=$BLOCKS 2>/dev/null)
90+
fi
91+
92+
tail -c +$((BYTES + 1)) "$INITRD" | uncomp "$MAGIC" | cpio -t 2>/dev/null

0 commit comments

Comments
 (0)