Участник с: 07 февраля 2019
|
В отличии от lsinitrd не только распаковывает, но и запаковывает
#!/bin/sh
#250402 sfs
( [ ! "$1" ] || [ "$1" = "--help" ] ) && echo "Use:
$0 initramfs-linux.img (unpack)
$0 dir [gz|lz|xz|zst] (pack ; zstd -default)" && exit 1
i="`realpath "$1"`"
b="`basename "$1" | awk -F. '{print $1}'`"
if [ -d "$1" ];then
[ -f "$b"/initrd_early/early.cpio ] || e=1
[ -d "$b"/initrd_main ] || e=1
[ "$e" ] && cd "$1" || cd "$i"/initrd_main
[ "$2" ] && x="$2" || x=zst
[ -f "$1.$x" ] && ( dt="$(date +%y%m%d-%H%M)" && mv "$1.$x" "$1.$x"."$dt" || exit 1 )
case "${x}" in
"xz") find . | cpio -o -H newc | xz -T0 --check=crc32 --x86 --lzma2 > "../$1.$x" ;;
"gz") find . | cpio -o -H newc | gzip -9 > "../$1.$x" ;;
"lz") find . | cpio -o -H newc | lzma -7 > "../$1.$x" ;;
"zst") find . | cpio -o -H newc | zstd -f -18 > "../$1.$x" ;;
*) "$0" && exit 1 ;;
esac
[ ! "$e" ] && cd ../.. && cat "$b"/initrd_early/early.cpio "$b/$1.$x" > "$b"-custom.img
else
U(){
file -b ../"$f" |egrep '^gzip ' > /dev/null && zcat "../"$f"" | cpio -i -d
file -b ../"$f" |egrep '^LZMA ' > /dev/null && cd .. && lzma -dc -S .lz "$f" | cpio -i -d
file -b ../"$f" |egrep '^XZ ' > /dev/null && xz -dc "../"$f"" | cpio -i -d
file -b ../"$f" |egrep '^Zst' > /dev/null && zstd -dc "../"$f"" | cpio -i -d
}
if [ "`file "$i" |grep "ASCII cpio archive"`" ]; then
[ ! "`cpio -ivt < "$i" |head -1 |grep -E ' early_cpio$'`" ] && echo "No early_cpio" && exit 1
c=`cpio -ivt < $i 2>&1 >/dev/null | awk '{print $1}'` &&
mkdir -p "$b"/initrd_early "$b"/initrd_main && cd "$b"/initrd_early &&
dd if="$i" of=early.cpio bs=512 count=$c &&
dd if="$i" of=main.img bs=512 skip=$c &&
cd ../initrd_main && f=initrd_early/main.img && U
else
f="$1"
mkdir "$b" && cd "$b" && U
fi
|