@@ -10,90 +10,6 @@ source /buildout/settings.sh
1010rm -f /buildout/settings.sh
1111
1212
13- # --- Multilayer initrd helpers ---
14-
15- is_multilayer_initrd () {
16- grep -aob ' TRAILER!!!' " $1 " | head -n1 | grep -q .
17- }
18-
19- extract_multilayer_initrd () {
20- IMG=" $1 "
21- OUTDIR=" $2 "
22- # Find TRAILER!!! marker
23- TRAILER_OFFSET=$( grep -aob ' TRAILER!!!' " $IMG " | head -n1 | cut -d: -f1)
24- if [ -z " $TRAILER_OFFSET " ]; then
25- echo " Could not find TRAILER!!! marker in $IMG "
26- exit 1
27- fi
28- SEARCH_START=$(( TRAILER_OFFSET + 10 ))
29- MAGIC=" "
30- ARCHIVE_OFFSET=" "
31- for (( i= 0 ; i< 1048576 ; i++ )) ; do
32- offset=$(( SEARCH_START + i))
33- magic=$( dd if=" $IMG " bs=1 skip=" $offset " count=6 2> /dev/null | xxd -p)
34- case " $magic " in
35- fd377a585a00)
36- MAGIC=" xz"
37- ARCHIVE_OFFSET=" $offset "
38- break
39- ;;
40- 1f8b0800* )
41- MAGIC=" gz"
42- ARCHIVE_OFFSET=" $offset "
43- break
44- ;;
45- 28b52ffd* )
46- MAGIC=" zst"
47- ARCHIVE_OFFSET=" $offset "
48- break
49- ;;
50- 5d000080* )
51- MAGIC=" lzma"
52- ARCHIVE_OFFSET=" $offset "
53- break
54- ;;
55- esac
56- done
57- if [ -z " $ARCHIVE_OFFSET " ]; then
58- echo " Could not find known compressed archive after TRAILER!!! marker."
59- exit 2
60- fi
61- # Save outer part and embedded archive
62- head -c " $ARCHIVE_OFFSET " " $IMG " > " $OUTDIR /outer_part.bin"
63- dd if=" $IMG " bs=1 skip=" $ARCHIVE_OFFSET " of=" $OUTDIR /embedded_archive.$MAGIC " status=none
64- # Decompress embedded archive
65- case " $MAGIC " in
66- xz) xz -dc " $OUTDIR /embedded_archive.xz" > " $OUTDIR /embedded_archive.cpio" ;;
67- gz) gzip -dc " $OUTDIR /embedded_archive.gz" > " $OUTDIR /embedded_archive.cpio" ;;
68- zst) zstd -dc " $OUTDIR /embedded_archive.zst" > " $OUTDIR /embedded_archive.cpio" ;;
69- lzma) lzma -dc " $OUTDIR /embedded_archive.lzma" > " $OUTDIR /embedded_archive.cpio" ;;
70- esac
71- mkdir -p " $OUTDIR /initrd_files"
72- (cd " $OUTDIR /initrd_files" && cpio -id < ../embedded_archive.cpio)
73- echo " $ARCHIVE_OFFSET " > " $OUTDIR /.embedded_offset"
74- echo " $MAGIC " > " $OUTDIR /.embedded_magic"
75- }
76-
77- rebuild_multilayer_initrd () {
78- OUTDIR=" $1 "
79- NEW_INITRD_DIR=" $2 "
80- OUTPUT=" $3 "
81- ARCHIVE_OFFSET=$( cat " $OUTDIR /.embedded_offset" )
82- MAGIC=$( cat " $OUTDIR /.embedded_magic" )
83- TMP_CPIO=$( mktemp --suffix=.cpio)
84- TMP_COMPRESSED=$( mktemp --suffix=.$MAGIC )
85- (cd " $NEW_INITRD_DIR " && find . | cpio -o -H newc > " $TMP_CPIO " )
86- case " $MAGIC " in
87- xz) xz -c " $TMP_CPIO " > " $TMP_COMPRESSED " ;;
88- gz) gzip -c " $TMP_CPIO " > " $TMP_COMPRESSED " ;;
89- zst) zstd -19 -c " $TMP_CPIO " > " $TMP_COMPRESSED " ;;
90- lzma) lzma -c " $TMP_CPIO " > " $TMP_COMPRESSED " ;;
91- esac
92- cat " $OUTDIR /outer_part.bin" > " $OUTPUT "
93- cat " $TMP_COMPRESSED " >> " $OUTPUT "
94- rm -f " $TMP_CPIO " " $TMP_COMPRESSED "
95- }
96-
9713# initrd package and exit
9814if [[ " ${COMPRESS_INITRD} " == " true" ]]; then
9915 # move files needed to build output
@@ -109,12 +25,6 @@ if [[ "${COMPRESS_INITRD}" == "true" ]];then
10925 done <<< " ${CONTENTS}"
11026 # compress initrd folder into bootable file
11127 cd /buildin/initrd_files
112- # --- multilayer rebuild ---
113- if [[ -f /buildin/.multilayer_outer/.embedded_offset ]]; then
114- rebuild_multilayer_initrd " /buildin/.multilayer_outer" " ." " /buildout/${INITRD_NAME} "
115- chmod 777 /buildout/*
116- exit 0
117- fi
11828 if [[ " ${INITRD_TYPE} " == " xz" ]] || [[ " ${INITRD_TYPE} " == " lz4" ]] ; then
11929 find . 2> /dev/null | cpio -o -H newc | xz --check=crc32 > /buildout/${INITRD_NAME}
12030 elif [[ " ${INITRD_TYPE} " == " zstd" ]]; then
@@ -177,13 +87,8 @@ if [[ "${EXTRACT_INITRD}" == "true" ]] && [[ "${INITRD_TYPE}" != "lz4" ]];then
17787 INITRD_ORG=${INITRD_NAME}
17888 COUNTER=1
17989 cd /buildout
180- # --- multilayer extraction ---
181- if is_multilayer_initrd " ${INITRD_NAME} " ; then
182- mkdir -p .multilayer_outer
183- extract_multilayer_initrd " ${INITRD_NAME} " " .multilayer_outer"
184- cp -r .multilayer_outer/initrd_files .
185- INITRD_NAME=" initrd_files"
186- else
90+ while :
91+ do
18792 # strip microcode from initrd if it has it
18893 LAYERCOUNT=$( cat ${INITRD_NAME} | cpio -tdmv 2>&1 > /dev/null | wc -c)
18994 if [[ ${LAYERCOUNT} -lt 5000 ]] && [[ " ${INITRD_TYPE} " != " uncomp" ]]; then
0 commit comments