Test
This commit is contained in:
@@ -17,7 +17,7 @@ To install the required dependencies for building ChillcraftOS, run the followin
|
||||
```bash
|
||||
apt install coreutils quilt parted qemu-user-static debootstrap zerofree zip \
|
||||
dosfstools e2fsprogs libarchive-tools libcap2-bin grep rsync xz-utils file git curl bc \
|
||||
gpg pigz xxd arch-test bmap-tools kmod
|
||||
gpg pigz xxd arch-test bmap-tools kmod squashfs-tools xorriso mtools
|
||||
```
|
||||
|
||||
The `depends` file in the repository lists all the necessary tools, formatted as `<tool>[:<debian-package>]`.
|
||||
|
||||
@@ -245,8 +245,6 @@ export COMPRESSION_LEVEL=${COMPRESSION_LEVEL:-6}
|
||||
export LOG_FILE="${WORK_DIR}/build.log"
|
||||
|
||||
export TARGET_HOSTNAME=${TARGET_HOSTNAME:-chillcraftos}
|
||||
export FIRST_USER_NAME=${FIRST_USER_NAME:-system}
|
||||
export FIRST_USER_ISSYSTEM=${FIRST_USER_ISSYSTEM:-true}
|
||||
export WPA_COUNTRY
|
||||
export ENABLE_SSH="${ENABLE_SSH:-0}"
|
||||
export PUBKEY_ONLY_SSH="${PUBKEY_ONLY_SSH:-0}"
|
||||
@@ -260,8 +258,6 @@ export TIMEZONE_DEFAULT="${TIMEZONE_DEFAULT:-Americas/Los_Angeles}"
|
||||
|
||||
export GIT_HASH=${GIT_HASH:-"$(git rev-parse HEAD)"}
|
||||
|
||||
export PUBKEY_SSH_FIRST_USER
|
||||
|
||||
export CLEAN
|
||||
export APT_PROXY
|
||||
export TEMP_REPO
|
||||
@@ -321,12 +317,6 @@ if ! arch-test -n "$ARCH"; then
|
||||
fi
|
||||
fi
|
||||
|
||||
#check username is valid
|
||||
if [[ ! "$FIRST_USER_NAME" =~ ^[a-z][-a-z0-9_]*$ ]]; then
|
||||
echo "Invalid FIRST_USER_NAME: $FIRST_USER_NAME"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -n "${APT_PROXY}" ]] && ! curl --silent "${APT_PROXY}" >/dev/null; then
|
||||
echo "Could not reach APT_PROXY server: ${APT_PROXY}"
|
||||
exit 1
|
||||
@@ -337,11 +327,6 @@ if [[ -n "${WPA_PASSWORD}" && ${#WPA_PASSWORD} -lt 8 || ${#WPA_PASSWORD} -gt 63
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ "${PUBKEY_ONLY_SSH}" = "1" && -z "${PUBKEY_SSH_FIRST_USER}" ]]; then
|
||||
echo "Must set 'PUBKEY_SSH_FIRST_USER' to a valid SSH public key if using PUBKEY_ONLY_SSH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "Begin ${BASE_DIR}"
|
||||
|
||||
STAGE_LIST=${STAGE_LIST:-${BASE_DIR}/stage*}
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
IMG_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img"
|
||||
ROOT_DEV="$(awk "\$2 == \"${ROOTFS_DIR}\" {print \$1}" /etc/mtab)"
|
||||
BOOT_DEV="$(awk "\$2 == \"${ROOTFS_DIR}/boot\" {print \$1}" /etc/mtab)"
|
||||
EFI_DEV="$(awk "\$2 == \"${ROOTFS_DIR}/boot/efi\" {print \$1}" /etc/mtab)"
|
||||
|
||||
IMGID="$(dd if="${IMG_FILE}" skip=440 bs=1 count=4 2>/dev/null | xxd -e | cut -f 2 -d' ')"
|
||||
ROOT_UUID="$(blkid -s UUID -o value "${ROOT_DEV}")"
|
||||
BOOT_UUID="$(blkid -s UUID -o value "${BOOT_DEV}")"
|
||||
EFI_UUID="$(blkid -s UUID -o value "${EFI_DEV}")"
|
||||
|
||||
BOOT_PARTUUID="${IMGID}-01"
|
||||
ROOT_PARTUUID="${IMGID}-02"
|
||||
#HOME_PARTUUID="${IMGID}-03"
|
||||
|
||||
sed -i "s/BOOTDEV/PARTUUID=${BOOT_PARTUUID}/" "${ROOTFS_DIR}/etc/fstab"
|
||||
sed -i "s/ROOTDEV/PARTUUID=${ROOT_PARTUUID}/" "${ROOTFS_DIR}/etc/fstab"
|
||||
#sed -i "s/HOMEDEV/PARTUUID=${HOME_PARTUUID}/" "${ROOTFS_DIR}/etc/fstab"
|
||||
|
||||
sed -i "s/ROOTDEV/PARTUUID=${ROOT_PARTUUID}/" "${ROOTFS_DIR}/boot/firmware/cmdline.txt"
|
||||
# Write amd64-appropriate fstab (boot at /boot, EFI at /boot/efi)
|
||||
cat > "${ROOTFS_DIR}/etc/fstab" << EOF
|
||||
proc /proc proc defaults 0 0
|
||||
UUID=${BOOT_UUID} /boot vfat defaults 0 2
|
||||
UUID=${EFI_UUID} /boot/efi vfat defaults 0 2
|
||||
UUID=${ROOT_UUID} / ext4 defaults,noatime 0 1
|
||||
EOF
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
IMG_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img"
|
||||
INFO_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.info"
|
||||
SBOM_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.sbom"
|
||||
BMAP_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.bmap"
|
||||
ISO_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.iso"
|
||||
ISO_TEMP_DIR="${STAGE_WORK_DIR}/iso_temp"
|
||||
|
||||
# Step 1: Generate initramfs.
|
||||
# Because live-boot-initramfs-tools is installed, the generated initrd will
|
||||
# include live-boot hooks that can find and mount the squashfs from the ISO.
|
||||
on_chroot << EOF
|
||||
update-initramfs -k all -c
|
||||
if [ -x /etc/init.d/fake-hwclock ]; then
|
||||
/etc/init.d/fake-hwclock stop
|
||||
fi
|
||||
if hash hardlink 2>/dev/null; then
|
||||
hardlink -t /usr/share/doc
|
||||
fi
|
||||
EOF
|
||||
|
||||
if [ -f "${ROOTFS_DIR}/etc/initramfs-tools/update-initramfs.conf" ]; then
|
||||
@@ -20,122 +18,91 @@ if [ -f "${ROOTFS_DIR}/etc/initramfs-tools/update-initramfs.conf" ]; then
|
||||
sed -i 's/^MODULES=.*/MODULES=dep/' "${ROOTFS_DIR}/etc/initramfs-tools/initramfs.conf"
|
||||
fi
|
||||
|
||||
#if [ -d "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.config" ]; then
|
||||
# chmod 700 "${ROOTFS_DIR}/home/${FIRST_USER_NAME}/.config"
|
||||
#fi
|
||||
# Step 2: Build a standalone GRUB EFI binary inside the chroot.
|
||||
# grub-mkstandalone embeds all required modules so no separate EFI partition is needed.
|
||||
on_chroot << EOF
|
||||
mkdir -p /tmp/grub-standalone
|
||||
grub-mkstandalone \
|
||||
--format=x86_64-efi \
|
||||
--output=/tmp/grub-standalone/bootx64.efi \
|
||||
--modules="part_gpt part_msdos fat iso9660 ext2 normal search \
|
||||
search_fs_uuid search_fs_file search_label all_video \
|
||||
gfxterm gfxterm_background" \
|
||||
--locales="" \
|
||||
--fonts=""
|
||||
EOF
|
||||
|
||||
rm -f "${ROOTFS_DIR}/usr/bin/qemu-arm-static"
|
||||
# Step 3: Assemble ISO directory structure
|
||||
mkdir -p "${ISO_TEMP_DIR}/boot/grub"
|
||||
mkdir -p "${ISO_TEMP_DIR}/live"
|
||||
mkdir -p "${ISO_TEMP_DIR}/EFI/boot"
|
||||
|
||||
if [ "${USE_QEMU}" != "1" ]; then
|
||||
if [ -e "${ROOTFS_DIR}/etc/ld.so.preload.disabled" ]; then
|
||||
mv "${ROOTFS_DIR}/etc/ld.so.preload.disabled" "${ROOTFS_DIR}/etc/ld.so.preload"
|
||||
fi
|
||||
fi
|
||||
# Copy kernel and initrd (resolving symlinks)
|
||||
cp -L "${ROOTFS_DIR}/boot/vmlinuz" "${ISO_TEMP_DIR}/boot/vmlinuz"
|
||||
cp -L "${ROOTFS_DIR}/boot/initrd.img" "${ISO_TEMP_DIR}/boot/initrd.img"
|
||||
|
||||
rm -f "${ROOTFS_DIR}/etc/network/interfaces.dpkg-old"
|
||||
# Copy GRUB EFI binary from chroot
|
||||
cp "${ROOTFS_DIR}/tmp/grub-standalone/bootx64.efi" "${ISO_TEMP_DIR}/EFI/boot/bootx64.efi"
|
||||
|
||||
rm -f "${ROOTFS_DIR}/etc/apt/sources.list~"
|
||||
rm -f "${ROOTFS_DIR}/etc/apt/trusted.gpg~"
|
||||
# Step 4: Write the live-boot grub.cfg
|
||||
cat > "${ISO_TEMP_DIR}/boot/grub/grub.cfg" << 'GRUBEOF'
|
||||
set default=0
|
||||
set timeout=5
|
||||
|
||||
rm -f "${ROOTFS_DIR}/etc/passwd-"
|
||||
rm -f "${ROOTFS_DIR}/etc/group-"
|
||||
rm -f "${ROOTFS_DIR}/etc/shadow-"
|
||||
rm -f "${ROOTFS_DIR}/etc/gshadow-"
|
||||
rm -f "${ROOTFS_DIR}/etc/subuid-"
|
||||
rm -f "${ROOTFS_DIR}/etc/subgid-"
|
||||
insmod part_gpt
|
||||
insmod part_msdos
|
||||
insmod fat
|
||||
insmod iso9660
|
||||
insmod ext2
|
||||
insmod all_video
|
||||
insmod gfxterm
|
||||
|
||||
rm -f "${ROOTFS_DIR}"/var/cache/debconf/*-old
|
||||
rm -f "${ROOTFS_DIR}"/var/lib/dpkg/*-old
|
||||
menuentry "ChillcraftOS Live" {
|
||||
linux /boot/vmlinuz boot=live components quiet splash
|
||||
initrd /boot/initrd.img
|
||||
}
|
||||
|
||||
rm -f "${ROOTFS_DIR}"/usr/share/icons/*/icon-theme.cache
|
||||
menuentry "ChillcraftOS Live (safe mode)" {
|
||||
linux /boot/vmlinuz boot=live components nomodeset
|
||||
initrd /boot/initrd.img
|
||||
}
|
||||
GRUBEOF
|
||||
|
||||
rm -f "${ROOTFS_DIR}/var/lib/dbus/machine-id"
|
||||
# Step 5: Create squashfs of the rootfs.
|
||||
# live-boot will find this at /live/filesystem.squashfs on the boot medium.
|
||||
mksquashfs "${ROOTFS_DIR}" "${ISO_TEMP_DIR}/live/filesystem.squashfs" \
|
||||
-comp xz \
|
||||
-noappend \
|
||||
-e boot/efi \
|
||||
-e proc \
|
||||
-e sys \
|
||||
-e dev \
|
||||
-e tmp \
|
||||
-e run
|
||||
|
||||
true > "${ROOTFS_DIR}/etc/machine-id"
|
||||
# Step 6: Create small EFI FAT image for El Torito EFI boot entry
|
||||
EFI_IMG="${ISO_TEMP_DIR}/efi.img"
|
||||
dd if=/dev/zero of="${EFI_IMG}" bs=1M count=10
|
||||
mkfs.vfat "${EFI_IMG}"
|
||||
mmd -i "${EFI_IMG}" ::/EFI ::/EFI/boot
|
||||
mcopy -i "${EFI_IMG}" "${ISO_TEMP_DIR}/EFI/boot/bootx64.efi" ::/EFI/boot/bootx64.efi
|
||||
|
||||
ln -nsf /proc/mounts "${ROOTFS_DIR}/etc/mtab"
|
||||
# Step 7: Build the ISO (UEFI El Torito)
|
||||
xorriso -as mkisofs \
|
||||
-r -J -joliet-long \
|
||||
-eltorito-alt-boot \
|
||||
-e efi.img \
|
||||
-no-emul-boot \
|
||||
-isohybrid-gpt-basdat \
|
||||
-o "${ISO_FILE}" \
|
||||
"${ISO_TEMP_DIR}"
|
||||
|
||||
find "${ROOTFS_DIR}/var/log/" -type f -exec cp /dev/null {} \;
|
||||
rm -rf "${ISO_TEMP_DIR}"
|
||||
rm -f "${ROOTFS_DIR}/tmp/grub-standalone/bootx64.efi"
|
||||
|
||||
rm -f "${ROOTFS_DIR}/root/.vnc/private.key"
|
||||
rm -f "${ROOTFS_DIR}/etc/vnc/updateid"
|
||||
|
||||
update_issue "$(basename "${EXPORT_DIR}")"
|
||||
install -m 644 "${ROOTFS_DIR}/etc/rpi-issue" "${ROOTFS_DIR}/boot/firmware/issue.txt"
|
||||
if ! [ -L "${ROOTFS_DIR}/boot/issue.txt" ]; then
|
||||
ln -s firmware/issue.txt "${ROOTFS_DIR}/boot/issue.txt"
|
||||
fi
|
||||
|
||||
cp "$ROOTFS_DIR/etc/rpi-issue" "$INFO_FILE"
|
||||
|
||||
{
|
||||
if [ -f "$ROOTFS_DIR/usr/share/doc/raspberrypi-kernel/changelog.Debian.gz" ]; then
|
||||
firmware=$(zgrep "firmware as of" \
|
||||
"$ROOTFS_DIR/usr/share/doc/raspberrypi-kernel/changelog.Debian.gz" | \
|
||||
head -n1 | sed -n 's|.* \([^ ]*\)$|\1|p')
|
||||
printf "\nFirmware: https://github.com/raspberrypi/firmware/tree/%s\n" "$firmware"
|
||||
|
||||
kernel="$(curl -s -L "https://github.com/raspberrypi/firmware/raw/$firmware/extra/git_hash")"
|
||||
printf "Kernel: https://github.com/raspberrypi/linux/tree/%s\n" "$kernel"
|
||||
|
||||
uname="$(curl -s -L "https://github.com/raspberrypi/firmware/raw/$firmware/extra/uname_string7")"
|
||||
printf "Uname string: %s\n" "$uname"
|
||||
fi
|
||||
|
||||
printf "\nPackages:\n"
|
||||
dpkg -l --root "$ROOTFS_DIR"
|
||||
} >> "$INFO_FILE"
|
||||
|
||||
if hash syft 2>/dev/null; then
|
||||
syft scan dir:"${ROOTFS_DIR}" \
|
||||
--base-path="${ROOTFS_DIR}" \
|
||||
--source-name="${IMG_NAME}${IMG_SUFFIX}" \
|
||||
--source-version="${IMG_DATE}" \
|
||||
-o spdx-json="${SBOM_FILE}"
|
||||
fi
|
||||
|
||||
ROOT_DEV="$(awk "\$2 == \"${ROOTFS_DIR}\" {print \$1}" /etc/mtab)"
|
||||
|
||||
unmount "${ROOTFS_DIR}"
|
||||
zerofree "${ROOT_DEV}"
|
||||
|
||||
unmount_image "${IMG_FILE}"
|
||||
|
||||
if hash bmaptool 2>/dev/null; then
|
||||
bmaptool create \
|
||||
-o "${BMAP_FILE}" \
|
||||
"${IMG_FILE}"
|
||||
fi
|
||||
echo "Live ISO created at ${ISO_FILE}"
|
||||
|
||||
# Step 8: Deploy
|
||||
mkdir -p "${DEPLOY_DIR}"
|
||||
|
||||
rm -f "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.*"
|
||||
rm -f "${DEPLOY_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img"
|
||||
|
||||
case "${DEPLOY_COMPRESSION}" in
|
||||
zip)
|
||||
pushd "${STAGE_WORK_DIR}" > /dev/null
|
||||
zip -"${COMPRESSION_LEVEL}" \
|
||||
"${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.zip" "$(basename "${IMG_FILE}")"
|
||||
popd > /dev/null
|
||||
;;
|
||||
gz)
|
||||
pigz --force -"${COMPRESSION_LEVEL}" "$IMG_FILE" --stdout > \
|
||||
"${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.img.gz"
|
||||
;;
|
||||
xz)
|
||||
xz --compress --force --threads 0 --memlimit-compress=50% -"${COMPRESSION_LEVEL}" \
|
||||
--stdout "$IMG_FILE" > "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.img.xz"
|
||||
;;
|
||||
none | *)
|
||||
cp "$IMG_FILE" "$DEPLOY_DIR/"
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -f "${SBOM_FILE}" ]; then
|
||||
xz -c "${SBOM_FILE}" > "$DEPLOY_DIR/image_$(basename "${SBOM_FILE}").xz"
|
||||
fi
|
||||
if [ -f "${BMAP_FILE}" ]; then
|
||||
xz -c "${BMAP_FILE}" > "$DEPLOY_DIR/image_$(basename "${BMAP_FILE}").xz"
|
||||
fi
|
||||
cp "$INFO_FILE" "$DEPLOY_DIR/"
|
||||
rm -f "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.iso"
|
||||
cp "${ISO_FILE}" "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.iso"
|
||||
|
||||
+5
-130
@@ -1,134 +1,9 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
IMG_NAME="${IMG_FILENAME}${IMG_SUFFIX}"
|
||||
IMG_FILE="${STAGE_WORK_DIR}/${IMG_NAME}.img"
|
||||
MOUNT_DIR="${ROOTFS_DIR}"
|
||||
BOOT_SIZE=$((512 * 1024 * 1024))
|
||||
EFI_SIZE=$((128 * 1024 * 1024)) # 128MB EFI partition
|
||||
RECOVERY_SIZE=$((256 * 1024 * 1024))
|
||||
ALIGN=$((4 * 1024 * 1024))
|
||||
# For live ISO we don't need a disk image — just a plain working directory.
|
||||
# Substages (apt cleanup, network config) run on_chroot against this directory.
|
||||
|
||||
unmount_image "${IMG_FILE}"
|
||||
rm -f "${IMG_FILE}"
|
||||
rm -rf "${MOUNT_DIR}"
|
||||
mkdir -p "${MOUNT_DIR}"
|
||||
rm -rf "${ROOTFS_DIR}"
|
||||
mkdir -p "${ROOTFS_DIR}"
|
||||
|
||||
# Calculate rootfs size
|
||||
ROOT_SIZE=$(du -x --apparent-size -s "${EXPORT_ROOTFS_DIR}" --exclude var/cache/apt/archives --exclude boot/firmware --block-size=1 | cut -f 1)
|
||||
ROOT_MARGIN="$(echo "($ROOT_SIZE * 0.2 + 200 * 1024 * 1024) / 1" | bc)"
|
||||
BOOT_PART_START=$((ALIGN))
|
||||
BOOT_PART_SIZE=$(((BOOT_SIZE + ALIGN - 1) / ALIGN * ALIGN))
|
||||
EFI_PART_START=$((BOOT_PART_START + BOOT_PART_SIZE))
|
||||
EFI_PART_SIZE=$(((EFI_SIZE + ALIGN - 1) / ALIGN * ALIGN))
|
||||
ROOT_PART_START=$((EFI_PART_START + EFI_PART_SIZE))
|
||||
ROOT_PART_SIZE=$(((ROOT_SIZE + ROOT_MARGIN + ALIGN - 1) / ALIGN * ALIGN))
|
||||
RECOVERY_PART_START=$((ROOT_PART_START + ROOT_PART_SIZE))
|
||||
RECOVERY_PART_SIZE=$(((RECOVERY_SIZE + ALIGN - 1) / ALIGN * ALIGN))
|
||||
IMG_SIZE=$((BOOT_PART_START + BOOT_PART_SIZE + EFI_PART_SIZE + ROOT_PART_SIZE + RECOVERY_PART_SIZE))
|
||||
|
||||
# Create raw image
|
||||
truncate -s "${IMG_SIZE}" "${IMG_FILE}"
|
||||
parted --script "${IMG_FILE}" mklabel gpt
|
||||
parted --script "${IMG_FILE}" unit B mkpart primary fat32 "${BOOT_PART_START}" "$((BOOT_PART_START + BOOT_PART_SIZE - 1))"
|
||||
parted --script "${IMG_FILE}" set 1 boot on
|
||||
parted --script "${IMG_FILE}" unit B mkpart primary fat32 "${EFI_PART_START}" "$((EFI_PART_START + EFI_PART_SIZE - 1))"
|
||||
parted --script "${IMG_FILE}" set 2 esp on
|
||||
parted --script "${IMG_FILE}" unit B mkpart primary ext4 "${ROOT_PART_START}" "$((ROOT_PART_START + ROOT_PART_SIZE - 1))"
|
||||
parted --script "${IMG_FILE}" unit B mkpart primary ext4 "${RECOVERY_PART_START}" "$((RECOVERY_PART_START + RECOVERY_PART_SIZE - 1))"
|
||||
|
||||
# Create loop device
|
||||
cnt=0
|
||||
until ensure_next_loopdev && LOOP_DEV="$(losetup --show --find --partscan "$IMG_FILE")"; do
|
||||
((cnt++))
|
||||
if [ $cnt -ge 5 ]; then echo "ERROR: losetup failed"; exit 1; fi
|
||||
echo "Retrying losetup..."; sleep 5
|
||||
done
|
||||
ensure_loopdev_partitions "$LOOP_DEV"
|
||||
|
||||
BOOT_DEV="${LOOP_DEV}p1"
|
||||
EFI_DEV="${LOOP_DEV}p2"
|
||||
ROOT_DEV="${LOOP_DEV}p3"
|
||||
RECOVERY_DEV="${LOOP_DEV}p4"
|
||||
|
||||
# Format partitions
|
||||
FAT_SIZE=$([ "$BOOT_SIZE" -lt 134742016 ] && echo 16 || echo 32)
|
||||
mkdosfs -n bootfs -F "$FAT_SIZE" -s 4 "$BOOT_DEV"
|
||||
mkfs.fat -F 32 -n EFI "$EFI_DEV"
|
||||
mkfs.ext4 -L rootfs -O "^64bit,^huge_file" "$ROOT_DEV"
|
||||
mkfs.ext4 -L recovery "$RECOVERY_DEV"
|
||||
|
||||
|
||||
# Mount and copy rootfs
|
||||
mount "$ROOT_DEV" "$MOUNT_DIR" -t ext4
|
||||
mkdir -p "${MOUNT_DIR}/boot"
|
||||
mount "$BOOT_DEV" "${MOUNT_DIR}/boot" -t vfat
|
||||
mkdir -p "${MOUNT_DIR}/boot/efi"
|
||||
mount "$EFI_DEV" "${MOUNT_DIR}/boot/efi" -t vfat
|
||||
rsync -aHAXx --exclude /var/cache/apt/archives --exclude /boot/firmware --exclude /boot/overlays "${EXPORT_ROOTFS_DIR}/" "${MOUNT_DIR}/"
|
||||
|
||||
# Recovery partition
|
||||
mkdir -p "${MOUNT_DIR}/recovery"
|
||||
mount "$RECOVERY_DEV" "${MOUNT_DIR}/recovery" -t ext4
|
||||
# Optionally copy recovery tools
|
||||
# cp recovery-tools/recovery.sh "${MOUNT_DIR}/recovery/"
|
||||
|
||||
# Install GRUB (BIOS)
|
||||
mkdir -p "${MOUNT_DIR}/boot/grub"
|
||||
cat > "${MOUNT_DIR}/boot/grub/grub.cfg" <<EOF
|
||||
set default=0
|
||||
set timeout=5
|
||||
|
||||
menuentry "Linux" {
|
||||
linux /boot/vmlinuz root=/dev/sda3
|
||||
initrd /boot/initrd.img
|
||||
}
|
||||
EOF
|
||||
|
||||
grub-install \
|
||||
--target=i386-pc \
|
||||
--boot-directory="${MOUNT_DIR}/boot" \
|
||||
--modules="part_msdos ext2 fat normal biosdisk" \
|
||||
--force \
|
||||
--no-floppy \
|
||||
--boot-directory="${MOUNT_DIR}/boot" \
|
||||
"$LOOP_DEV"
|
||||
|
||||
# Install GRUB (UEFI)
|
||||
mkdir -p "${MOUNT_DIR}/boot/efi/EFI/boot"
|
||||
grub-install \
|
||||
--target=x86_64-efi \
|
||||
--efi-directory="${MOUNT_DIR}/boot/efi" \
|
||||
--boot-directory="${MOUNT_DIR}/boot" \
|
||||
--removable \
|
||||
--no-nvram \
|
||||
--modules="part_gpt part_msdos ext2 fat normal efi_gop efi_uga biosdisk" \
|
||||
--bootloader-id=GRUB \
|
||||
--recheck
|
||||
|
||||
# Unmount all
|
||||
umount -l "${MOUNT_DIR}/boot/efi"
|
||||
umount -l "${MOUNT_DIR}/boot"
|
||||
umount -l "${MOUNT_DIR}/recovery"
|
||||
umount -l "${MOUNT_DIR}"
|
||||
losetup -d "$LOOP_DEV"
|
||||
|
||||
# Create hybrid ISO using xorriso (make sure it's installed)
|
||||
ISO_FILE="${STAGE_WORK_DIR}/${IMG_NAME}.iso"
|
||||
EFI_IMG="${STAGE_WORK_DIR}/efi.img"
|
||||
dd if=/dev/zero of="${EFI_IMG}" bs=1M count=128
|
||||
mkfs.vfat "${EFI_IMG}"
|
||||
mmd -i "${EFI_IMG}" ::/EFI ::/EFI/boot
|
||||
mcopy -i "${EFI_IMG}" "${MOUNT_DIR}/boot/efi/EFI/boot/bootx64.efi" ::/EFI/boot/bootx64.efi
|
||||
xorriso -as mkisofs \
|
||||
-r -J -joliet -l \
|
||||
-b boot/grub/i386-pc/eltorito.img \
|
||||
-no-emul-boot -boot-load-size 4 -boot-info-table \
|
||||
-eltorito-alt-boot \
|
||||
-e efi.img \
|
||||
-no-emul-boot \
|
||||
-isohybrid-gpt-basdat \
|
||||
-o "${ISO_FILE}" \
|
||||
"${MOUNT_DIR}" \
|
||||
--efi-boot-part --efi-boot-image --protective-msdos-label
|
||||
|
||||
echo "Bootable ISO with BIOS and UEFI support created at ${ISO_FILE}"
|
||||
rsync -aHAXx --exclude /var/cache/apt/archives "${EXPORT_ROOTFS_DIR}/" "${ROOTFS_DIR}/"
|
||||
|
||||
@@ -1,18 +1,12 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
install -v -m 644 files/fstab "${ROOTFS_DIR}/etc/fstab"
|
||||
# SteamOS like readonly root
|
||||
install -m 755 files/system-readonly "${ROOTFS_DIR}/sbin/"
|
||||
|
||||
on_chroot << EOF
|
||||
if ! id -u ${FIRST_USER_NAME} >/dev/null 2>&1; then
|
||||
#adduser --disabled-password --gecos "" ${FIRST_USER_NAME}
|
||||
if [ "${FIRST_USER_ISSYSTEM}" = "true" ]; then
|
||||
useradd -r -M -d / ${FIRST_USER_NAME}
|
||||
else
|
||||
adduser --disabled-password --gecos "" ${FIRST_USER_NAME}
|
||||
fi
|
||||
fi
|
||||
# Create a system user
|
||||
useradd -r -M -d / system
|
||||
|
||||
# Set root password to "root"
|
||||
echo "root:root" | chpasswd
|
||||
EOF
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
on_chroot << EOF
|
||||
SUDO_USER="${FIRST_USER_NAME}" raspi-config nonint do_net_names 1
|
||||
raspi-config nonint do_net_names 1
|
||||
EOF
|
||||
|
||||
@@ -1,12 +1,5 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
if [ -n "${PUBKEY_SSH_FIRST_USER}" ]; then
|
||||
install -v -m 0700 -o 1000 -g 1000 -d "${ROOTFS_DIR}"/home/"${FIRST_USER_NAME}"/.ssh
|
||||
echo "${PUBKEY_SSH_FIRST_USER}" >"${ROOTFS_DIR}"/home/"${FIRST_USER_NAME}"/.ssh/authorized_keys
|
||||
chown 1000:1000 "${ROOTFS_DIR}"/home/"${FIRST_USER_NAME}"/.ssh/authorized_keys
|
||||
chmod 0600 "${ROOTFS_DIR}"/home/"${FIRST_USER_NAME}"/.ssh/authorized_keys
|
||||
fi
|
||||
|
||||
if [ "${PUBKEY_ONLY_SSH}" = "1" ]; then
|
||||
sed -i -Ee 's/^#?[[:blank:]]*PubkeyAuthentication[[:blank:]]*no[[:blank:]]*$/PubkeyAuthentication yes/
|
||||
s/^#?[[:blank:]]*PasswordAuthentication[[:blank:]]*yes[[:blank:]]*$/PasswordAuthentication no/' "${ROOTFS_DIR}"/etc/ssh/sshd_config
|
||||
@@ -32,15 +25,8 @@ on_chroot <<- EOF
|
||||
for GRP in input spi i2c gpio; do
|
||||
groupadd -f -r "\$GRP"
|
||||
done
|
||||
for GRP in adm dialout cdrom audio users sudo video games plugdev input gpio spi i2c netdev render; do
|
||||
adduser $FIRST_USER_NAME \$GRP
|
||||
done
|
||||
EOF
|
||||
|
||||
if [ -f "${ROOTFS_DIR}/etc/sudoers.d/010_pi-nopasswd" ]; then
|
||||
sed -i "s/^pi /$FIRST_USER_NAME /" "${ROOTFS_DIR}/etc/sudoers.d/010_pi-nopasswd"
|
||||
fi
|
||||
|
||||
on_chroot << EOF
|
||||
setupcon --force --save-only -v
|
||||
EOF
|
||||
|
||||
@@ -13,7 +13,7 @@ done
|
||||
|
||||
if [ -v WPA_COUNTRY ]; then
|
||||
on_chroot <<- EOF
|
||||
SUDO_USER="${FIRST_USER_NAME}" raspi-config nonint do_wifi_country "${WPA_COUNTRY}"
|
||||
raspi-config nonint do_wifi_country "${WPA_COUNTRY}"
|
||||
EOF
|
||||
elif [ -d "${ROOTFS_DIR}/var/lib/NetworkManager" ]; then
|
||||
# NetworkManager unblocks all WLAN devices by default. Prevent that:
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
firefox-esr
|
||||
firefox-esr
|
||||
grub-efi-amd64
|
||||
grub-efi-amd64-bin
|
||||
live-boot
|
||||
live-boot-initramfs-tools
|
||||
|
||||
@@ -39,10 +39,3 @@ install -m 644 files/gnome-default-settings "${ROOTFS_DIR}/etc/dconf/db/local.d/
|
||||
on_chroot << EOF
|
||||
dconf update
|
||||
EOF
|
||||
|
||||
# Remove setup user (only if it's not a system account)
|
||||
on_chroot << EOF
|
||||
if [ "${FIRST_USER_ISSYSTEM}" = "false" ]; then
|
||||
deluser --remove-home --remove-all-files ${FIRST_USER_NAME}
|
||||
fi
|
||||
EOF
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
on_chroot << EOF
|
||||
SUDO_USER="${FIRST_USER_NAME}" raspi-config nonint do_wayland W2
|
||||
raspi-config nonint do_wayland W2
|
||||
EOF
|
||||
|
||||
# Pi-Apps (this is a bash script that installs pi-apps when the user runs it, then gets overwritten by the actual pi-apps)
|
||||
|
||||
Reference in New Issue
Block a user