Skip to content

Commit 5f1b117

Browse files
committed
Fix postinst to support both /boot and /boot/firmware locations
The postinst scripts were hardcoded to /boot/firmware, causing installation failures on systems using /boot (older Raspberry Pi OS versions). Changes: - Add boot partition detection with sticky location preference - Validate package contents before installation - Add config.txt backup (preserves original) - Fix glob expansion issues with nullglob - Remove error suppression to surface real failures - Add early validation with clear error messages The detection priority ensures upgrades use the same location as the existing installation, preventing orphaned files and configuration mismatches.
1 parent 748e765 commit 5f1b117

2 files changed

Lines changed: 110 additions & 37 deletions

File tree

build-kernel-legacy.sh

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -262,45 +262,77 @@ cat <<'EOF' > "$PACKAGE_DIR/DEBIAN/postinst"
262262
#!/bin/bash
263263
set -e
264264
265-
# Variables
266-
FIRMWARE_DIR="/boot/firmware"
267265
PACKAGE_KERNEL_DIR="/usr/local/lib/wlanpi-kernel/boot/firmware"
268-
CONFIG_TXT="$FIRMWARE_DIR/config.txt"
269266
KERNEL_IMAGE="wlanpi-kernel8.img"
270267
271-
echo "Post-installation: Installing kernel image and DTBs to $FIRMWARE_DIR..."
268+
if [ ! -d "$PACKAGE_KERNEL_DIR" ]; then
269+
echo "ERROR: Package directory $PACKAGE_KERNEL_DIR not found"
270+
exit 1
271+
fi
272272
273-
# Ensure the firmware directory exists
274-
if [ ! -d "$FIRMWARE_DIR" ]; then
275-
echo "ERROR: Firmware directory $FIRMWARE_DIR does not exist."
273+
if [ ! -f "$PACKAGE_KERNEL_DIR/$KERNEL_IMAGE" ]; then
274+
echo "ERROR: Kernel image $KERNEL_IMAGE not found in package"
276275
exit 1
277276
fi
278277
279-
# Ensure the overlays directory exists; create it if it doesn't
280-
if [ ! -d "$FIRMWARE_DIR/overlays" ]; then
281-
echo "Overlays directory $FIRMWARE_DIR/overlays does not exist. Creating it..."
282-
mkdir -p "$FIRMWARE_DIR/overlays"
278+
# Detect boot partition location
279+
# Priority: existing kernel location, then /boot/firmware, then /boot
280+
if [ -f "/boot/firmware/$KERNEL_IMAGE" ]; then
281+
FIRMWARE_DIR="/boot/firmware"
282+
elif [ -f "/boot/$KERNEL_IMAGE" ]; then
283+
FIRMWARE_DIR="/boot"
284+
elif [ -d "/boot/firmware" ]; then
285+
FIRMWARE_DIR="/boot/firmware"
286+
elif [ -d "/boot" ]; then
287+
FIRMWARE_DIR="/boot"
288+
else
289+
echo "ERROR: Boot partition not found"
290+
exit 1
283291
fi
284292
285-
# Copy kernel image
286-
echo "Copying kernel image..."
293+
CONFIG_TXT="$FIRMWARE_DIR/config.txt"
294+
295+
echo "Installing kernel to $FIRMWARE_DIR..."
296+
297+
if [ ! -f "$CONFIG_TXT" ]; then
298+
echo "ERROR: $CONFIG_TXT not found"
299+
exit 1
300+
fi
301+
302+
if [ ! -f "$CONFIG_TXT.wlanpi-kernel.bak" ]; then
303+
cp -f "$CONFIG_TXT" "$CONFIG_TXT.wlanpi-kernel.bak"
304+
fi
305+
mkdir -p "$FIRMWARE_DIR/overlays"
306+
307+
# Install kernel
308+
echo "Installing $KERNEL_IMAGE..."
287309
cp -f "$PACKAGE_KERNEL_DIR/$KERNEL_IMAGE" "$FIRMWARE_DIR/"
288310
289-
# Copy DTBs
290-
echo "Copying DTBs..."
291-
cp -f "$PACKAGE_KERNEL_DIR/"*.dtb "$FIRMWARE_DIR/"
292-
cp -f "$PACKAGE_KERNEL_DIR/overlays/"*.dtbo "$FIRMWARE_DIR/overlays/"
311+
# Install DTBs
312+
shopt -s nullglob
313+
dtb_files=("$PACKAGE_KERNEL_DIR"/*.dtb)
314+
if [ ${#dtb_files[@]} -gt 0 ]; then
315+
echo "Installing ${#dtb_files[@]} DTB files..."
316+
cp -f "$PACKAGE_KERNEL_DIR/"*.dtb "$FIRMWARE_DIR/"
317+
fi
318+
319+
# Install overlays
320+
dtbo_files=("$PACKAGE_KERNEL_DIR/overlays/"*.dtbo)
321+
if [ ${#dtbo_files[@]} -gt 0 ]; then
322+
echo "Installing ${#dtbo_files[@]} overlay files..."
323+
cp -f "$PACKAGE_KERNEL_DIR/overlays/"*.dtbo "$FIRMWARE_DIR/overlays/"
324+
fi
325+
shopt -u nullglob
293326
294-
# Update config.txt with the new kernel
295-
echo "Updating $CONFIG_TXT with the new kernel parameter..."
327+
# Update config.txt
328+
echo "Configuring boot to use $KERNEL_IMAGE..."
296329
if grep -q "^kernel=" "$CONFIG_TXT"; then
297330
sed -i "s|^kernel=.*|kernel=$KERNEL_IMAGE|" "$CONFIG_TXT"
298331
else
299332
echo "kernel=$KERNEL_IMAGE" >> "$CONFIG_TXT"
300333
fi
301334
302-
echo "Kernel image and DTBs installed successfully."
303-
335+
echo "Installation complete"
304336
exit 0
305337
EOF
306338

build-kernel.sh

Lines changed: 57 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -471,48 +471,89 @@ EOF
471471
#!/bin/bash
472472
set -e
473473
474-
FIRMWARE_DIR="/boot/firmware"
475474
PACKAGE_KERNEL_DIR="/usr/local/lib/wlanpi-kernel/boot/firmware"
475+
476+
if [ ! -d "$PACKAGE_KERNEL_DIR" ]; then
477+
echo "ERROR: Package directory $PACKAGE_KERNEL_DIR not found"
478+
exit 1
479+
fi
480+
481+
# Detect boot partition location
482+
# Priority: existing kernel location, then /boot/firmware, then /boot
483+
if [ -f "/boot/firmware/wlanpi-kernel8.img" ] || [ -f "/boot/firmware/wlanpi-kernel_2712.img" ]; then
484+
FIRMWARE_DIR="/boot/firmware"
485+
elif [ -f "/boot/wlanpi-kernel8.img" ] || [ -f "/boot/wlanpi-kernel_2712.img" ]; then
486+
FIRMWARE_DIR="/boot"
487+
elif [ -d "/boot/firmware" ]; then
488+
FIRMWARE_DIR="/boot/firmware"
489+
elif [ -d "/boot" ]; then
490+
FIRMWARE_DIR="/boot"
491+
else
492+
echo "ERROR: Boot partition not found"
493+
exit 1
494+
fi
495+
476496
CONFIG_TXT="$FIRMWARE_DIR/config.txt"
477497
478498
echo "Installing WLAN Pi kernel to $FIRMWARE_DIR..."
479499
480-
if [ ! -d "$FIRMWARE_DIR" ]; then
481-
echo "ERROR: Firmware directory $FIRMWARE_DIR does not exist."
500+
if [ ! -f "$CONFIG_TXT" ]; then
501+
echo "ERROR: $CONFIG_TXT not found"
482502
exit 1
483503
fi
484504
505+
if [ ! -f "$CONFIG_TXT.wlanpi-kernel.bak" ]; then
506+
cp -f "$CONFIG_TXT" "$CONFIG_TXT.wlanpi-kernel.bak"
507+
fi
485508
mkdir -p "$FIRMWARE_DIR/overlays"
486509
487-
# Copy kernel images (whatever is in the package)
488-
for img in "$PACKAGE_KERNEL_DIR"/*.img; do
489-
if [ -f "$img" ]; then
490-
echo "Installing: $(basename "$img")"
491-
cp -f "$img" "$FIRMWARE_DIR/"
492-
fi
510+
# Install kernel images
511+
shopt -s nullglob
512+
kernel_images=("$PACKAGE_KERNEL_DIR"/*.img)
513+
if [ ${#kernel_images[@]} -eq 0 ]; then
514+
echo "ERROR: No kernel images found in package"
515+
exit 1
516+
fi
517+
518+
for img in "${kernel_images[@]}"; do
519+
echo "Installing $(basename "$img")..."
520+
cp -f "$img" "$FIRMWARE_DIR/"
493521
done
494522
495-
# Copy DTBs and overlays
496-
cp -f "$PACKAGE_KERNEL_DIR/"*.dtb "$FIRMWARE_DIR/" 2>/dev/null || true
497-
cp -f "$PACKAGE_KERNEL_DIR/overlays/"*.dtbo "$FIRMWARE_DIR/overlays/" 2>/dev/null || true
523+
# Install DTBs
524+
dtb_files=("$PACKAGE_KERNEL_DIR"/*.dtb)
525+
if [ ${#dtb_files[@]} -gt 0 ]; then
526+
echo "Installing ${#dtb_files[@]} DTB files..."
527+
cp -f "$PACKAGE_KERNEL_DIR/"*.dtb "$FIRMWARE_DIR/"
528+
fi
498529
499-
# Update config.txt
530+
# Install overlays
531+
dtbo_files=("$PACKAGE_KERNEL_DIR/overlays/"*.dtbo)
532+
if [ ${#dtbo_files[@]} -gt 0 ]; then
533+
echo "Installing ${#dtbo_files[@]} overlay files..."
534+
cp -f "$PACKAGE_KERNEL_DIR/overlays/"*.dtbo "$FIRMWARE_DIR/overlays/"
535+
fi
536+
shopt -u nullglob
537+
538+
# Select kernel for config.txt
500539
if [ -f "$FIRMWARE_DIR/wlanpi-kernel8.img" ]; then
501540
KERNEL_IMG="wlanpi-kernel8.img"
502541
elif [ -f "$FIRMWARE_DIR/wlanpi-kernel_2712.img" ]; then
503542
KERNEL_IMG="wlanpi-kernel_2712.img"
504543
else
505-
echo "WARNING: No WLAN Pi kernel image found"
506-
exit 0
544+
echo "ERROR: No kernel image found after installation"
545+
exit 1
507546
fi
508547
548+
# Update config.txt
549+
echo "Configuring boot to use $KERNEL_IMG..."
509550
if grep -q "^kernel=" "$CONFIG_TXT"; then
510551
sed -i "s|^kernel=.*|kernel=$KERNEL_IMG|" "$CONFIG_TXT"
511552
else
512553
echo "kernel=$KERNEL_IMG" >> "$CONFIG_TXT"
513554
fi
514555
515-
echo "Kernel installation complete!"
556+
echo "Installation complete"
516557
exit 0
517558
POSTINST_EOF
518559

0 commit comments

Comments
 (0)