Skip to content

Commit db5c6ae

Browse files
feat(iot): switch image preprocessing to ISO + squashfs extraction
- Stop treating IMG_URL as a preinstalled disk image - Download ISO via wget and extract with 7z - Prefer casper/minimal.squashfs (fallback to filesystem.squashfs) - Unsquash into squashfs-root and copy to $ROOTFS_DIR - Silently ensure 7z (p7zip-full) is installed on Ubuntu - Add robust checks, clearer logs, and safe defaults Rationale: This aligns with the new distribution format where IMG_URL always points to an ISO and avoids loop/partition logic that no longer applies. Impact: - Ubuntu Server supported Signed-off-by: Bjordis Collaku <[email protected]>
1 parent 0c5d032 commit db5c6ae

File tree

1 file changed

+90
-50
lines changed

1 file changed

+90
-50
lines changed

rootfs/scripts/build-ubuntu-rootfs.sh

Lines changed: 90 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -150,43 +150,98 @@ parse_configuration() {
150150
# Distro-specific handling is done via an inner case.
151151
# ==============================================================================
152152
image_preproccessing_iot() {
153-
case "$(echo "$DISTRO" | tr '[:upper:]' '[:lower:]')" in
154-
ubuntu|ubuntu-server)
155-
local LOOP_DEV PART_DEV
156-
echo "[INFO][iot][ubuntu] Downloading base image..."
157-
if ! wget -c "$IMG_URL" -O "$IMG_XZ_NAME"; then
158-
echo "[ERROR] Failed to download image from: $IMG_URL"
159-
exit 1
160-
fi
153+
case "$(echo "$DISTRO" | tr '[:upper:]' '[:lower:]')" in
154+
ubuntu|ubuntu-server)
155+
echo "[INFO][iot][ubuntu] Preparing environment..."
156+
157+
# --- Silent ensure of 7z (p7zip-full) ---
158+
if ! command -v 7z >/dev/null 2>&1; then
159+
echo "[INFO][iot][ubuntu] '7z' not found. Installing p7zip-full silently..."
160+
export DEBIAN_FRONTEND=noninteractive
161+
# Use -qq for quiet and redirect all output to /dev/null
162+
apt-get -qq update >/dev/null 2>&1 || true
163+
apt-get -qq install -y p7zip-full >/dev/null 2>&1 || {
164+
echo "[ERROR] Failed to install 'p7zip-full' required for 7z."
165+
exit 1
166+
}
167+
fi
168+
169+
# Check unsquashfs (required). Keep explicit to avoid unexpected installs.
170+
if ! command -v unsquashfs >/dev/null 2>&1; then
171+
echo "[ERROR] 'unsquashfs' not found. Please install 'squashfs-tools'."
172+
echo " e.g., apt-get install -y squashfs-tools"
173+
exit 1
174+
fi
161175

162-
echo "[INFO][iot][ubuntu] Extracting preinstalled image..."
163-
7z x "$IMG_XZ_NAME"
176+
echo "[INFO][iot][ubuntu] Downloading ISO..."
164177

165-
echo "[INFO][iot][ubuntu] Setting up loop device..."
166-
LOOP_DEV=$(losetup --show --partscan --find "$IMG_NAME")
167-
PART_DEV="${LOOP_DEV}p1"
178+
# Derive a sane ISO_NAME if not provided
179+
if [[ -z "$ISO_NAME" ]]; then
180+
ISO_NAME=$(basename "${IMG_URL%%\?*}")
181+
[[ -z "$ISO_NAME" || "$ISO_NAME" == "/" ]] && ISO_NAME="image.iso"
182+
fi
168183

169-
if [[ ! -b "$PART_DEV" ]]; then
170-
losetup -d "$LOOP_DEV"
171-
echo "[ERROR] Partition not found: $PART_DEV"
172-
exit 1
173-
fi
184+
# Working dirs
185+
ISO_EXTRACT_DIR="${ISO_EXTRACT_DIR:-isoImage}"
186+
SQUASHFS_WORK_DIR="${SQUASHFS_WORK_DIR:-squashfs-root}"
187+
MNT_DIR="${MNT_DIR:-/mnt/iot-iso-tmp}" # kept for compatibility with other logic
188+
189+
# Fetch ISO
190+
if ! wget -q -c "$IMG_URL" -O "$ISO_NAME"; then
191+
echo "[ERROR] Failed to download ISO from: $IMG_URL"
192+
exit 1
193+
fi
174194

175-
mkdir -p "$MNT_DIR" "$ROOTFS_DIR"
176-
mount "$PART_DEV" "$MNT_DIR"
177-
cp -rap "$MNT_DIR/"* "$ROOTFS_DIR/"
178-
umount -l "$MNT_DIR"
179-
losetup -d "$LOOP_DEV"
180-
;;
181-
debian)
182-
echo "[ERROR][iot][debian] Not implemented yet."
195+
echo "[INFO][iot][ubuntu] Extracting ISO with 7z..."
196+
rm -rf "$ISO_EXTRACT_DIR" "$SQUASHFS_WORK_DIR"
197+
mkdir -p "$ISO_EXTRACT_DIR" "$ROOTFS_DIR"
198+
199+
if ! 7z x "$ISO_NAME" -o"$ISO_EXTRACT_DIR" -y >/dev/null; then
200+
echo "[ERROR] Failed to extract ISO: $ISO_NAME"
201+
exit 1
202+
fi
203+
204+
# Prefer minimal.squashfs; fallback to filesystem.squashfs
205+
SQUASHFS_PATH=""
206+
if [[ -f "$ISO_EXTRACT_DIR/casper/minimal.squashfs" ]]; then
207+
SQUASHFS_PATH="$ISO_EXTRACT_DIR/casper/minimal.squashfs"
208+
elif [[ -f "$ISO_EXTRACT_DIR/casper/filesystem.squashfs" ]]; then
209+
SQUASHFS_PATH="$ISO_EXTRACT_DIR/casper/filesystem.squashfs"
210+
echo "[WARN][iot][ubuntu] 'minimal.squashfs' not found, using 'filesystem.squashfs'."
211+
else
212+
echo "[ERROR] Neither 'casper/minimal.squashfs' nor 'casper/filesystem.squashfs' found in ISO."
213+
echo " Looked under: $ISO_EXTRACT_DIR/casper/"
183214
exit 1
184-
;;
185-
*)
186-
echo "[ERROR][iot] Unsupported distro: $DISTRO"
215+
fi
216+
217+
echo "[INFO][iot][ubuntu] Unsquashing rootfs from: $SQUASHFS_PATH"
218+
if ! unsquashfs -d "$SQUASHFS_WORK_DIR" "$SQUASHFS_PATH" >/dev/null; then
219+
echo "[ERROR] Failed to unsquash: $SQUASHFS_PATH"
220+
exit 1
221+
fi
222+
223+
echo "[INFO][iot][ubuntu] Copying rootfs into: $ROOTFS_DIR"
224+
mkdir -p "$ROOTFS_DIR"
225+
if ! cp -rap "${SQUASHFS_WORK_DIR}/"* "$ROOTFS_DIR/"; then
226+
echo "[ERROR] Failed to copy rootfs into: $ROOTFS_DIR"
187227
exit 1
188-
;;
189-
esac
228+
fi
229+
230+
echo "[INFO][iot][ubuntu] Rootfs prepared at: $ROOTFS_DIR"
231+
# Optional cleanup:
232+
# rm -rf "$ISO_EXTRACT_DIR" "$SQUASHFS_WORK_DIR"
233+
;;
234+
235+
debian)
236+
echo "[ERROR][iot][debian] Not implemented yet."
237+
exit 1
238+
;;
239+
240+
*)
241+
echo "[ERROR][iot] Unsupported distro: $DISTRO"
242+
exit 1
243+
;;
244+
esac
190245
}
191246

192247
# Empty stubs for future targets
@@ -207,35 +262,23 @@ else
207262
CFG["CODENAME"]="questing"
208263
CFG["ARCH"]="arm64"
209264
CFG["VARIANT"]="server"
210-
CFG["CHANNEL"]="daily-preinstalled"
211-
CFG["STREAM"]="current"
212-
CFG["FLAVOR"]="ubuntu-server"
265+
CFG["BASE_IMAGE_URL"]="https://cdimage.ubuntu.com/releases/questing/release/ubuntu-25.10-live-server-arm64.iso"
213266
fi
214267

215268
TARGET_PLATFORM="${CFG[QCOM_TARGET_PLATFORM]:-iot}"
216269
DISTRO="${CFG[DISTRO]:-ubuntu}"
217270
CODENAME="${CFG[CODENAME]:-questing}"
218271
ARCH="${CFG[ARCH]:-arm64}"
219272
VARIANT="${CFG[VARIANT]:-server}"
220-
CHANNEL="${CFG[CHANNEL]:-daily-preinstalled}"
221-
STREAM="${CFG[STREAM]:-current}"
222-
FLAVOR="${CFG[FLAVOR]:-ubuntu-server}"
273+
BASE_IMAGE_URL="${CFG[BASE_IMAGE_URL]:-"https://cdimage.ubuntu.com/releases/questing/release/ubuntu-25.10-live-server-arm64.iso"}"
223274

224275
# Derive image parameters for Ubuntu (others can be added later)
225276
case "$(echo "$DISTRO" | tr '[:upper:]' '[:lower:]')" in
226277
ubuntu|ubuntu-server)
227-
IMG_STEM="${CODENAME}-preinstalled-${VARIANT}-${ARCH}.img"
228-
IMG_XZ_NAME="${IMG_STEM}.xz"
229-
# Ubuntu daily-preinstalled URL format (no codename directory in the path):
230-
# https://cdimage.ubuntu.com/<flavor>/<channel>/<stream>/<codename>-preinstalled-<variant>-<arch>.img.xz
231-
IMG_URL="https://cdimage.ubuntu.com/${FLAVOR}/${CHANNEL}/${STREAM}/${IMG_XZ_NAME}"
232-
IMG_NAME="$IMG_STEM"
278+
IMG_URL=${BASE_IMAGE_URL}
233279
;;
234280
*)
235281
# Leave unsupported distros to be implemented inside the respective target function later.
236-
IMG_STEM=""
237-
IMG_XZ_NAME=""
238-
IMG_NAME=""
239282
IMG_URL=""
240283
;;
241284
esac
@@ -246,10 +289,7 @@ echo " DISTRO=$DISTRO"
246289
echo " CODENAME=$CODENAME"
247290
echo " ARCH=$ARCH"
248291
echo " VARIANT=$VARIANT"
249-
echo " CHANNEL=$CHANNEL"
250-
echo " STREAM=$STREAM"
251-
echo " FLAVOR=$FLAVOR"
252-
[[ -n "$IMG_URL" ]] && echo " URL=$IMG_URL"
292+
echo " BASE_IMAGE_URL=${BASE_IMAGE_URL}"
253293

254294
# ==============================================================================
255295
# Step 2–3: Target platform switch – preprocess image to fill rootfs/

0 commit comments

Comments
 (0)