Fix critical PATH issues and add related projects to README
- Fixed sfdisk PATH issue in Containerfile.base (sfdisk is in /usr/sbin) - Updated Containerfile.minimal to use full path for grub-install - Enhanced test-bootc-deployment.sh to properly check utility locations - Added comprehensive section about related projects (apt-ostree, deb-bootupd, debian-bootc-corrected) - Updated validation script to handle Debian-specific utility locations - Improved error messages with specific solutions for PATH and utility issues This addresses the critical requirements from scope.md regarding disk utilities and PATH environment variables for bootc deployment.
This commit is contained in:
parent
04c7fd1e4c
commit
f9fb8d3bd0
149 changed files with 1625 additions and 9188 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -72,4 +72,6 @@ out/
|
||||||
|
|
||||||
02-installer-bootc/debs/*.deb
|
02-installer-bootc/debs/*.deb
|
||||||
02-installer-bootc/debs/*.tar.xz
|
02-installer-bootc/debs/*.tar.xz
|
||||||
02-installer-bootc/debs/*.dsc
|
02-installer-bootc/debs/*.dsc
|
||||||
|
|
||||||
|
.archive
|
||||||
|
|
@ -1,143 +0,0 @@
|
||||||
FROM debian:trixie
|
|
||||||
|
|
||||||
# Set locale to fix UTF-8 encoding issues
|
|
||||||
ENV LANG=C.UTF-8
|
|
||||||
ENV LC_ALL=C.UTF-8
|
|
||||||
|
|
||||||
# Copy the compiled bootc and ostree packages
|
|
||||||
COPY debs/ /tmp/debs/
|
|
||||||
|
|
||||||
# Install essential packages for a minimal bootable system
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
systemd \
|
|
||||||
dbus \
|
|
||||||
sudo \
|
|
||||||
systemd-sysv \
|
|
||||||
systemd-timesyncd \
|
|
||||||
network-manager \
|
|
||||||
openssh-server \
|
|
||||||
curl \
|
|
||||||
wget \
|
|
||||||
vim \
|
|
||||||
less \
|
|
||||||
htop \
|
|
||||||
locales \
|
|
||||||
linux-image-amd64 \
|
|
||||||
linux-headers-amd64 \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Generate locale
|
|
||||||
RUN locale-gen C.UTF-8
|
|
||||||
|
|
||||||
# Install disk utilities (parted instead of sfdisk, plus other essential tools)
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
util-linux \
|
|
||||||
parted \
|
|
||||||
fdisk \
|
|
||||||
e2fsprogs \
|
|
||||||
dosfstools \
|
|
||||||
grub-efi-amd64 \
|
|
||||||
efibootmgr \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Ensure PATH includes system utilities directories
|
|
||||||
ENV PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin"
|
|
||||||
|
|
||||||
# Verify disk utilities are available
|
|
||||||
RUN which parted && parted --version && \
|
|
||||||
which sfdisk && sfdisk --version && \
|
|
||||||
which mkfs.ext4 && mkfs.ext4 -V && \
|
|
||||||
which mkfs.fat && mkfs.fat --help | head -1
|
|
||||||
|
|
||||||
# Install dependencies for ostree and bootc
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
libarchive13t64 \
|
|
||||||
libavahi-client3 \
|
|
||||||
libavahi-common3 \
|
|
||||||
libavahi-glib1 \
|
|
||||||
libgpg-error0 \
|
|
||||||
libgpgme11t64 \
|
|
||||||
libfuse3-4 \
|
|
||||||
podman \
|
|
||||||
skopeo \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Install ostree packages first (dependencies)
|
|
||||||
RUN apt-get update && apt-get install -y /tmp/debs/libostree-1-1_*.deb && rm -rf /var/lib/apt/lists/*
|
|
||||||
RUN apt-get update && apt-get install -y /tmp/debs/ostree_*.deb && rm -rf /var/lib/apt/lists/*
|
|
||||||
RUN apt-get update && apt-get install -y /tmp/debs/ostree-boot_*.deb && rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Install bootc package
|
|
||||||
RUN apt-get update && apt-get install -y /tmp/debs/bootc_*.deb && rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Install apt-ostree package
|
|
||||||
RUN apt-get update && apt-get install -y /tmp/debs/apt-ostree_*.deb && rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Fix any dependency issues
|
|
||||||
RUN apt-get update && apt-get install -f -y && rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Set up OSTree system configuration
|
|
||||||
RUN mkdir -p /etc/ostree
|
|
||||||
RUN echo '{"mode": "bare-user-only"}' > /etc/ostree/remotes.d/self.conf
|
|
||||||
|
|
||||||
# Create the prepare-root.conf file that bootc needs (proper key-value format)
|
|
||||||
RUN mkdir -p /usr/lib/ostree
|
|
||||||
RUN echo '[prepare-root]' > /usr/lib/ostree/prepare-root.conf
|
|
||||||
RUN echo 'enabled=true' >> /usr/lib/ostree/prepare-root.conf
|
|
||||||
|
|
||||||
# Set up basic immutable filesystem structure
|
|
||||||
RUN mkdir -p /var/home
|
|
||||||
RUN ln -sf ../var/home /home
|
|
||||||
|
|
||||||
# Create /sysroot directory required by bootc
|
|
||||||
RUN mkdir -p /sysroot
|
|
||||||
RUN mkdir -p /sysroot/ostree
|
|
||||||
RUN ln -sf sysroot/ostree /ostree
|
|
||||||
|
|
||||||
# Create bootc configuration for root filesystem
|
|
||||||
RUN mkdir -p /etc/bootc
|
|
||||||
RUN echo '{"root-filesystem": "ext4"}' > /etc/bootc/config.json
|
|
||||||
|
|
||||||
# Enable systemd services
|
|
||||||
RUN systemctl enable systemd-timesyncd
|
|
||||||
RUN systemctl enable NetworkManager
|
|
||||||
RUN systemctl enable ssh
|
|
||||||
|
|
||||||
# Create a default user
|
|
||||||
RUN useradd -m -s /bin/bash -G sudo user
|
|
||||||
RUN echo "user:password" | chpasswd
|
|
||||||
|
|
||||||
# Set up basic system configuration
|
|
||||||
RUN echo "debian-atomic" > /etc/hostname
|
|
||||||
|
|
||||||
# Final verification that disk utilities are available
|
|
||||||
RUN which parted && which sfdisk && which mkfs.ext4 && which mkfs.fat && which grub-install
|
|
||||||
|
|
||||||
# Verify bootc and ostree are installed
|
|
||||||
RUN which bootc && bootc --version
|
|
||||||
RUN which ostree && ostree --version
|
|
||||||
|
|
||||||
# Verify kernel is installed and create symlink for bootc
|
|
||||||
RUN ls -la /boot/ && ls -la /usr/lib/modules/
|
|
||||||
RUN ln -sf 6.12.38+deb13-amd64 /usr/lib/modules/default
|
|
||||||
|
|
||||||
# Create generic symlinks for kernel and initramfs in /boot
|
|
||||||
RUN ln -sf vmlinuz-6.12.38+deb13-amd64 /boot/vmlinuz
|
|
||||||
RUN ln -sf initrd.img-6.12.38+deb13-amd64 /boot/initramfs.img
|
|
||||||
|
|
||||||
# Create ostree-boot directory and copy kernel files
|
|
||||||
RUN mkdir -p /usr/lib/ostree-boot
|
|
||||||
RUN cp /boot/vmlinuz-6.12.38+deb13-amd64 /usr/lib/ostree-boot/vmlinuz
|
|
||||||
RUN cp /boot/initrd.img-6.12.38+deb13-amd64 /usr/lib/ostree-boot/initramfs.img
|
|
||||||
RUN cp -r /usr/lib/modules/6.12.38+deb13-amd64 /usr/lib/ostree-boot/modules
|
|
||||||
|
|
||||||
# Add OSTree labels for bootable image
|
|
||||||
LABEL ostree.bootable=true
|
|
||||||
LABEL ostree.version=2025.2
|
|
||||||
LABEL ostree.osname=debian-atomic
|
|
||||||
|
|
||||||
# Clean up
|
|
||||||
RUN apt-get clean
|
|
||||||
|
|
||||||
# Set the default command
|
|
||||||
CMD ["/bin/bash"]
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
||||||
# Debian Atomic Desktop - Phase 1
|
|
||||||
|
|
||||||
This is Phase 1 of the Debian Atomic Desktop project, focusing on creating a minimal, bootable Debian OSTree image with automated build processes.
|
|
||||||
|
|
||||||
## Project Overview
|
|
||||||
|
|
||||||
This project aims to create a Debian-based atomic desktop distribution using `bootc`, similar to `ublue-os` but leveraging the Debian ecosystem. Phase 1 focuses on establishing the foundational build system and creating a minimal bootable image.
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
- `podman` or `docker` for container builds
|
|
||||||
- `just` for build automation
|
|
||||||
- `bootc` for OSTree image management (for testing)
|
|
||||||
|
|
||||||
## Quick Start
|
|
||||||
|
|
||||||
1. **Build the image:**
|
|
||||||
```bash
|
|
||||||
just build-image
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Test the image:**
|
|
||||||
```bash
|
|
||||||
just test-image
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Test with systemd (for bootc compatibility):**
|
|
||||||
```bash
|
|
||||||
just test-image-systemd
|
|
||||||
```
|
|
||||||
|
|
||||||
## Available Commands
|
|
||||||
|
|
||||||
Use `just --list` to see all available commands, or run `just help` for a summary.
|
|
||||||
|
|
||||||
### Build Commands
|
|
||||||
- `just build-image` - Build the container image with latest tag
|
|
||||||
- `just build-image-tag <tag>` - Build with a specific tag
|
|
||||||
|
|
||||||
### Testing Commands
|
|
||||||
- `just test-image` - Run the image interactively
|
|
||||||
- `just test-image-systemd` - Run with systemd support (privileged mode)
|
|
||||||
|
|
||||||
### Maintenance Commands
|
|
||||||
- `just clean` - Remove the latest image
|
|
||||||
- `just clean-all` - Remove all debian-atomic images
|
|
||||||
- `just list-images` - List all debian-atomic images
|
|
||||||
- `just inspect-image` - Show detailed image information
|
|
||||||
|
|
||||||
## Image Contents
|
|
||||||
|
|
||||||
The Phase 1 image includes:
|
|
||||||
- Debian Trixie base
|
|
||||||
- Essential system packages (systemd, dbus, sudo, etc.)
|
|
||||||
- Network management (NetworkManager)
|
|
||||||
- SSH server
|
|
||||||
- Basic utilities (curl, wget, vim, htop)
|
|
||||||
- Default user account (user/password)
|
|
||||||
|
|
||||||
## Next Steps
|
|
||||||
|
|
||||||
This is Phase 1 of the roadmap. Future phases will include:
|
|
||||||
- Phase 2: Calamares installer integration
|
|
||||||
- Phase 3: Desktop environment and kernel modules
|
|
||||||
- Phase 4: Polish and distribution
|
|
||||||
|
|
||||||
## Development
|
|
||||||
|
|
||||||
The project uses:
|
|
||||||
- `Containerfile` - Defines the container image
|
|
||||||
- `justfile` - Build automation and testing
|
|
||||||
- `roadmap.md` - Project roadmap and phases
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
This is currently in Phase 1 development. The focus is on establishing a solid foundation before adding more complex features.
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,52 +0,0 @@
|
||||||
-----BEGIN PGP SIGNED MESSAGE-----
|
|
||||||
Hash: SHA512
|
|
||||||
|
|
||||||
Format: 3.0 (quilt)
|
|
||||||
Source: ostree
|
|
||||||
Binary: gir1.2-ostree-1.0, libostree-1-1, libostree-dev, libostree-doc, ostree, ostree-boot, ostree-tests
|
|
||||||
Architecture: linux-any all
|
|
||||||
Version: 2025.2-1
|
|
||||||
Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org>
|
|
||||||
Uploaders: Matthias Klumpp <mak@debian.org>, Simon McVittie <smcv@debian.org>, Sjoerd Simons <sjoerd@debian.org>, Dylan Aïssi <daissi@debian.org>
|
|
||||||
Homepage: https://github.com/ostreedev/ostree/
|
|
||||||
Standards-Version: 4.7.2
|
|
||||||
Vcs-Browser: https://salsa.debian.org/debian/ostree
|
|
||||||
Vcs-Git: https://salsa.debian.org/debian/ostree.git
|
|
||||||
Testsuite: autopkgtest
|
|
||||||
Testsuite-Triggers: build-essential, gnome-desktop-testing, pkgconf
|
|
||||||
Build-Depends: attr, autoconf, automake, bison, bsdextrautils <!nocheck>, ca-certificates, cpio, debhelper (>= 13.11.6~), debhelper-compat (= 13), dh-sequence-gir, docbook-xml <!nodoc>, docbook-xsl <!nodoc>, libext2fs-dev, elfutils, fuse3:native, gir1.2-gio-2.0-dev, gjs:native [!alpha !armel !hppa !ia64 !m68k !sh4 !sparc64 !x32], gnupg <!nocheck>, gobject-introspection, gobject-introspection (>= 1.78.1-7~) <cross>, gtk-doc-tools <!nodoc>, libarchive-dev, libattr1-dev, libavahi-client-dev, libavahi-glib-dev, libcap-dev, libcurl4-gnutls-dev | libcurl-dev, libfuse3-dev, libglib2.0-dev, libgpgme-dev, liblzma-dev, libmount-dev, libselinux1-dev, libsoup-3.0-dev (>= 3.0.0), libsystemd-dev, libtool, pkgconf, procps, python3 <!nocheck>, python3-yaml <!nocheck>, xsltproc <!nodoc>, zlib1g-dev
|
|
||||||
Build-Depends-Indep: libglib2.0-doc
|
|
||||||
Package-List:
|
|
||||||
gir1.2-ostree-1.0 deb introspection optional arch=linux-any
|
|
||||||
libostree-1-1 deb libs optional arch=linux-any
|
|
||||||
libostree-dev deb libdevel optional arch=linux-any
|
|
||||||
libostree-doc deb doc optional arch=all profile=!nodoc
|
|
||||||
ostree deb admin optional arch=linux-any
|
|
||||||
ostree-boot deb admin optional arch=linux-any
|
|
||||||
ostree-tests deb admin optional arch=linux-any
|
|
||||||
Checksums-Sha1:
|
|
||||||
b39d0847461ccd41cd293b773f5975d295cae93d 2119744 ostree_2025.2.orig.tar.xz
|
|
||||||
4b2aadc5ad3847a6ae95eaa7a5979fe2412bb26d 31164 ostree_2025.2-1.debian.tar.xz
|
|
||||||
Checksums-Sha256:
|
|
||||||
f244a408c909998a778e127fcc22c1b502b4d013f15f26948f47cc72ffe2eef4 2119744 ostree_2025.2.orig.tar.xz
|
|
||||||
0c38a7cbbe75a8b7871ab5ee17c21715815794e04fceb592dd1404ca4c740ea1 31164 ostree_2025.2-1.debian.tar.xz
|
|
||||||
Files:
|
|
||||||
dc5346ab549b51ea1765514ca6874677 2119744 ostree_2025.2.orig.tar.xz
|
|
||||||
0efc808c737bdde4661b22c756c5d321 31164 ostree_2025.2-1.debian.tar.xz
|
|
||||||
|
|
||||||
-----BEGIN PGP SIGNATURE-----
|
|
||||||
|
|
||||||
iQIzBAEBCgAdFiEEmjwHvQbeL0FugTpdYS7xYT4FD1QFAmfsBjUACgkQYS7xYT4F
|
|
||||||
D1S4Cg//fvcXq3aRIgjLL8RFk5kjEJVgox6kPH/gyv8Q30FLEPv4QW5n/DYIxERi
|
|
||||||
l+I5RjBiNzqx4SpqxnjN/wbCkqVfjwb8KkzSrofLk/mCiyNp+frMPAmZN8CI4v6q
|
|
||||||
1E9hWuplW4sgcUXCCJYvezH19Y3KqnxuvuhCrmgnFqasR1nRVnWuds0Nf5WMJMS+
|
|
||||||
RimY7SxGWPLWwjenNFagpx6thYSKlkxqkMOEOR4Nfghqn2M8pXGo6VIhF2L2ZzwY
|
|
||||||
OLRLg3c4cnpHSKapqRClRRqumnjiWY7+C3Bec0yY5gEkwz5U02nAMLsWRqvyRLCv
|
|
||||||
VDs3KtUge6u7FLmOs5bXLnMUJ/SEGK/KjKOo94fbGvpnGM12+oRElCvWYMzzE0RF
|
|
||||||
v7R+LBFS/tvTUECTjId8q+ltpUI18JdBF9BW5Dc+19UFbF1NKgkCRwHw89cT1fw7
|
|
||||||
wo3KbXzZq+F/ujUsLblNeM+CiSWLvSpNfygz4BZQEq+HQfea7OZFULLhJkAbfPSl
|
|
||||||
KECnVwcF5RAHAELS/23h1TeJKsCwO2lzO6IGe3SHsSEQKXR57V9/DG/qJoRErKWV
|
|
||||||
PdOxxzWG9mWF+cfzal6yob1LkqsazNgeCoIYpGUqGxAFKG+4tcWb6PHz+IuUooqq
|
|
||||||
vfQsnYfhUppfqLsP2zVpjTSmwaWFTyxIRuQ/zKtecz677u2NGsM=
|
|
||||||
=ClnE
|
|
||||||
-----END PGP SIGNATURE-----
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,292 +0,0 @@
|
||||||
# Justfile for Debian Atomic Desktop - Phase 1
|
|
||||||
# Build and manage the minimal bootable Debian image
|
|
||||||
|
|
||||||
# Default recipe
|
|
||||||
default:
|
|
||||||
@just --list
|
|
||||||
|
|
||||||
# Build the container image
|
|
||||||
build-image:
|
|
||||||
podman build -t debian-atomic:latest .
|
|
||||||
|
|
||||||
# Build with a specific tag
|
|
||||||
build-image-tag tag:
|
|
||||||
podman build -t debian-atomic:{{tag}} .
|
|
||||||
|
|
||||||
# Clean up container images
|
|
||||||
clean:
|
|
||||||
podman rmi debian-atomic:latest || true
|
|
||||||
|
|
||||||
# Clean all debian-atomic images
|
|
||||||
clean-all:
|
|
||||||
podman rmi debian-atomic:latest || true
|
|
||||||
podman rmi debian-atomic:dev || true
|
|
||||||
|
|
||||||
# Test the image by running it interactively
|
|
||||||
test-image:
|
|
||||||
podman run -it --rm debian-atomic:latest
|
|
||||||
|
|
||||||
# Test the image with systemd (requires privileged mode)
|
|
||||||
test-image-systemd:
|
|
||||||
podman run -it --rm --privileged --systemd=always debian-atomic:latest
|
|
||||||
|
|
||||||
# List all debian-atomic images
|
|
||||||
list-images:
|
|
||||||
podman images debian-atomic
|
|
||||||
|
|
||||||
# Show image details
|
|
||||||
inspect-image:
|
|
||||||
podman inspect debian-atomic:latest
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# BOOTC DEPLOYMENT TESTING RECIPES
|
|
||||||
# =============================================================================
|
|
||||||
|
|
||||||
# Test bootc deployment to loop device (requires root)
|
|
||||||
test-bootc-loop:
|
|
||||||
# Create a test disk image
|
|
||||||
@echo "Creating test disk image..."
|
|
||||||
qemu-img create -f raw test-disk.img 10G
|
|
||||||
# Set up loop device
|
|
||||||
@echo "Setting up loop device..."
|
|
||||||
sudo losetup -f test-disk.img
|
|
||||||
LOOP_DEV=$$(sudo losetup -j test-disk.img | cut -d: -f1)
|
|
||||||
@echo "Using loop device: $$LOOP_DEV"
|
|
||||||
# Run bootc install with proper environment
|
|
||||||
@echo "Running bootc install to-disk..."
|
|
||||||
sudo env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
podman run --rm --privileged --pid=host --volume /dev:/dev \
|
|
||||||
--env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
--env LANG=C.UTF-8 \
|
|
||||||
--env LC_ALL=C.UTF-8 \
|
|
||||||
localhost/debian-atomic:latest \
|
|
||||||
/usr/bin/bootc install to-disk $$LOOP_DEV --filesystem ext4
|
|
||||||
# Clean up
|
|
||||||
@echo "Cleaning up..."
|
|
||||||
sudo losetup -d $$LOOP_DEV
|
|
||||||
rm -f test-disk.img
|
|
||||||
|
|
||||||
# Test bootc deployment with wipe option
|
|
||||||
test-bootc-wipe:
|
|
||||||
# Create a test disk image
|
|
||||||
@echo "Creating test disk image..."
|
|
||||||
qemu-img create -f raw test-disk-wipe.img 10G
|
|
||||||
# Set up loop device
|
|
||||||
@echo "Setting up loop device..."
|
|
||||||
sudo losetup -f test-disk-wipe.img
|
|
||||||
LOOP_DEV=$$(sudo losetup -j test-disk-wipe.img | cut -d: -f1)
|
|
||||||
@echo "Using loop device: $$LOOP_DEV"
|
|
||||||
# Run bootc install with wipe option
|
|
||||||
@echo "Running bootc install to-disk with wipe..."
|
|
||||||
sudo env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
podman run --rm --privileged --pid=host --volume /dev:/dev \
|
|
||||||
--env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
--env LANG=C.UTF-8 \
|
|
||||||
--env LC_ALL=C.UTF-8 \
|
|
||||||
localhost/debian-atomic:latest \
|
|
||||||
/usr/bin/bootc install to-disk $$LOOP_DEV --filesystem ext4 --wipe
|
|
||||||
# Clean up
|
|
||||||
@echo "Cleaning up..."
|
|
||||||
sudo losetup -d $$LOOP_DEV
|
|
||||||
rm -f test-disk-wipe.img
|
|
||||||
|
|
||||||
# Test bootc deployment with verbose output
|
|
||||||
test-bootc-verbose:
|
|
||||||
# Create a test disk image
|
|
||||||
@echo "Creating test disk image..."
|
|
||||||
qemu-img create -f raw test-disk-verbose.img 10G
|
|
||||||
# Set up loop device
|
|
||||||
@echo "Setting up loop device..."
|
|
||||||
sudo losetup -f test-disk-verbose.img
|
|
||||||
LOOP_DEV=$$(sudo losetup -j test-disk-verbose.img | cut -d: -f1)
|
|
||||||
@echo "Using loop device: $$LOOP_DEV"
|
|
||||||
# Run bootc install with verbose output
|
|
||||||
@echo "Running bootc install to-disk with verbose output..."
|
|
||||||
sudo env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
podman run --rm --privileged --pid=host --volume /dev:/dev \
|
|
||||||
--env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
--env LANG=C.UTF-8 \
|
|
||||||
--env LC_ALL=C.UTF-8 \
|
|
||||||
localhost/debian-atomic:latest \
|
|
||||||
/usr/bin/bootc install to-disk $$LOOP_DEV --filesystem ext4 --verbose
|
|
||||||
# Clean up
|
|
||||||
@echo "Cleaning up..."
|
|
||||||
sudo losetup -d $$LOOP_DEV
|
|
||||||
rm -f test-disk-verbose.img
|
|
||||||
|
|
||||||
# Test bootc deployment with debug output
|
|
||||||
test-bootc-debug:
|
|
||||||
# Create a test disk image
|
|
||||||
@echo "Creating test disk image..."
|
|
||||||
qemu-img create -f raw test-disk-debug.img 10G
|
|
||||||
# Set up loop device
|
|
||||||
@echo "Setting up loop device..."
|
|
||||||
sudo losetup -f test-disk-debug.img
|
|
||||||
LOOP_DEV=$$(sudo losetup -j test-disk-debug.img | cut -d: -f1)
|
|
||||||
@echo "Using loop device: $$LOOP_DEV"
|
|
||||||
# Run bootc install with debug output
|
|
||||||
@echo "Running bootc install to-disk with debug output..."
|
|
||||||
sudo env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
podman run --rm --privileged --pid=host --volume /dev:/dev \
|
|
||||||
--env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
--env LANG=C.UTF-8 \
|
|
||||||
--env LC_ALL=C.UTF-8 \
|
|
||||||
--env RUST_LOG=debug \
|
|
||||||
localhost/debian-atomic:latest \
|
|
||||||
/usr/bin/bootc install to-disk $$LOOP_DEV --filesystem ext4 --verbose
|
|
||||||
# Clean up
|
|
||||||
@echo "Cleaning up..."
|
|
||||||
sudo losetup -d $$LOOP_DEV
|
|
||||||
rm -f test-disk-debug.img
|
|
||||||
|
|
||||||
# Test bootc deployment to specific device (interactive)
|
|
||||||
test-bootc-device device:
|
|
||||||
@echo "Testing bootc deployment to device: {{device}}"
|
|
||||||
@echo "WARNING: This will overwrite the specified device!"
|
|
||||||
@echo "Press Ctrl+C to cancel or any key to continue..."
|
|
||||||
@read
|
|
||||||
# Run bootc install to specified device
|
|
||||||
sudo env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
podman run --rm --privileged --pid=host --volume /dev:/dev \
|
|
||||||
--env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
--env LANG=C.UTF-8 \
|
|
||||||
--env LC_ALL=C.UTF-8 \
|
|
||||||
localhost/debian-atomic:latest \
|
|
||||||
/usr/bin/bootc install to-disk {{device}} --filesystem ext4
|
|
||||||
|
|
||||||
# Test bootc deployment with custom image
|
|
||||||
test-bootc-custom-image image:
|
|
||||||
# Create a test disk image
|
|
||||||
@echo "Creating test disk image..."
|
|
||||||
qemu-img create -f raw test-disk-custom.img 10G
|
|
||||||
# Set up loop device
|
|
||||||
@echo "Setting up loop device..."
|
|
||||||
sudo losetup -f test-disk-custom.img
|
|
||||||
LOOP_DEV=$$(sudo losetup -j test-disk-custom.img | cut -d: -f1)
|
|
||||||
@echo "Using loop device: $$LOOP_DEV"
|
|
||||||
# Run bootc install with custom image
|
|
||||||
@echo "Running bootc install to-disk with custom image: {{image}}"
|
|
||||||
sudo env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
podman run --rm --privileged --pid=host --volume /dev:/dev \
|
|
||||||
--env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
--env LANG=C.UTF-8 \
|
|
||||||
--env LC_ALL=C.UTF-8 \
|
|
||||||
{{image}} \
|
|
||||||
/usr/bin/bootc install to-disk $$LOOP_DEV --filesystem ext4
|
|
||||||
# Clean up
|
|
||||||
@echo "Cleaning up..."
|
|
||||||
sudo losetup -d $$LOOP_DEV
|
|
||||||
rm -f test-disk-custom.img
|
|
||||||
|
|
||||||
# Test bootc deployment in VM environment
|
|
||||||
test-bootc-vm:
|
|
||||||
@echo "Testing bootc deployment in VM environment..."
|
|
||||||
# This would be run inside a VM with proper disk utilities
|
|
||||||
sudo env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
podman run --rm --privileged --pid=host --volume /dev:/dev \
|
|
||||||
--env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
--env LANG=C.UTF-8 \
|
|
||||||
--env LC_ALL=C.UTF-8 \
|
|
||||||
localhost/debian-atomic:latest \
|
|
||||||
/usr/bin/bootc install to-disk /dev/vda --filesystem ext4
|
|
||||||
|
|
||||||
# Verify disk utilities in container
|
|
||||||
verify-disk-utils:
|
|
||||||
@echo "Verifying disk utilities in container..."
|
|
||||||
podman run --rm localhost/debian-atomic:latest \
|
|
||||||
bash -c "which sfdisk parted mkfs.ext4 mkfs.fat grub-install efibootmgr && \
|
|
||||||
echo 'All disk utilities found!' && \
|
|
||||||
sfdisk --version && \
|
|
||||||
parted --version"
|
|
||||||
|
|
||||||
# Check kernel files in container
|
|
||||||
check-kernel-files:
|
|
||||||
@echo "Checking kernel files in container..."
|
|
||||||
podman run --rm localhost/debian-atomic:latest \
|
|
||||||
bash -c "echo '=== /boot contents ===' && ls -la /boot/ && \
|
|
||||||
echo '=== /usr/lib/modules contents ===' && ls -la /usr/lib/modules/ && \
|
|
||||||
echo '=== /usr/lib/ostree-boot contents ===' && ls -la /usr/lib/ostree-boot/ 2>/dev/null || echo 'ostree-boot directory not found'"
|
|
||||||
|
|
||||||
# Test bootc status and info
|
|
||||||
test-bootc-info:
|
|
||||||
@echo "Testing bootc info commands..."
|
|
||||||
podman run --rm localhost/debian-atomic:latest \
|
|
||||||
bash -c "bootc --version && bootc --help"
|
|
||||||
|
|
||||||
# Validate image with bootc container lint (CRITICAL)
|
|
||||||
validate-image:
|
|
||||||
@echo "Validating image with bootc container lint..."
|
|
||||||
podman run --rm localhost/debian-atomic:latest \
|
|
||||||
bash -c "bootc container lint"
|
|
||||||
|
|
||||||
# Check image labels and OSTree configuration
|
|
||||||
check-image-labels:
|
|
||||||
@echo "Checking image labels and OSTree configuration..."
|
|
||||||
podman inspect localhost/debian-atomic:latest | grep -A 10 -B 10 ostree
|
|
||||||
|
|
||||||
# Test via-loopback deployment (working method)
|
|
||||||
test-via-loopback:
|
|
||||||
@echo "Testing via-loopback deployment..."
|
|
||||||
qemu-img create -f raw test-loopback.img 10G
|
|
||||||
sudo env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
podman run --rm --privileged --pid=host --volume /dev:/dev \
|
|
||||||
--volume .:/work --env PATH="/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin" \
|
|
||||||
--env LANG=C.UTF-8 --env LC_ALL=C.UTF-8 --workdir /work \
|
|
||||||
localhost/debian-atomic:latest \
|
|
||||||
/usr/bin/bootc install to-disk --via-loopback test-loopback.img --filesystem ext4 --wipe
|
|
||||||
rm -f test-loopback.img
|
|
||||||
|
|
||||||
# Clean up all test files
|
|
||||||
clean-test-files:
|
|
||||||
@echo "Cleaning up test files..."
|
|
||||||
rm -f test-disk*.img
|
|
||||||
# Clean up any remaining loop devices
|
|
||||||
@echo "Cleaning up loop devices..."
|
|
||||||
for dev in $$(losetup -j test-disk*.img 2>/dev/null | cut -d: -f1); do \
|
|
||||||
sudo losetup -d $$dev 2>/dev/null || true; \
|
|
||||||
done
|
|
||||||
|
|
||||||
# Show all available test commands
|
|
||||||
test-help:
|
|
||||||
@echo "Available bootc testing commands:"
|
|
||||||
@echo " just test-bootc-loop - Test deployment to loop device"
|
|
||||||
@echo " just test-bootc-wipe - Test deployment with wipe option"
|
|
||||||
@echo " just test-bootc-verbose - Test deployment with verbose output"
|
|
||||||
@echo " just test-bootc-debug - Test deployment with debug output"
|
|
||||||
@echo " just test-bootc-device /dev/sdX - Test deployment to specific device"
|
|
||||||
@echo " just test-bootc-custom-image image:tag - Test with custom image"
|
|
||||||
@echo " just test-bootc-vm - Test deployment in VM environment"
|
|
||||||
@echo " just verify-disk-utils - Verify disk utilities in container"
|
|
||||||
@echo " just check-kernel-files - Check kernel files in container"
|
|
||||||
@echo " just test-bootc-info - Test bootc info commands"
|
|
||||||
@echo " just clean-test-files - Clean up test files"
|
|
||||||
|
|
||||||
# Help
|
|
||||||
help:
|
|
||||||
@echo "Available recipes:"
|
|
||||||
@echo " Build commands:"
|
|
||||||
@echo " just build-image - Build the container image"
|
|
||||||
@echo " just build-image-tag <tag> - Build with specific tag"
|
|
||||||
@echo " Test commands:"
|
|
||||||
@echo " just test-image - Test image interactively"
|
|
||||||
@echo " just test-image-systemd - Test image with systemd"
|
|
||||||
@echo " just test-bootc-loop - Test bootc deployment to loop device"
|
|
||||||
@echo " just test-bootc-wipe - Test bootc deployment with wipe"
|
|
||||||
@echo " just test-bootc-verbose - Test bootc deployment with verbose output"
|
|
||||||
@echo " just test-bootc-debug - Test bootc deployment with debug output"
|
|
||||||
@echo " just test-bootc-device <dev> - Test bootc deployment to specific device"
|
|
||||||
@echo " just test-bootc-custom-image <image> - Test with custom image"
|
|
||||||
@echo " just test-bootc-vm - Test bootc deployment in VM"
|
|
||||||
@echo " just verify-disk-utils - Verify disk utilities in container"
|
|
||||||
@echo " just check-kernel-files - Check kernel files in container"
|
|
||||||
@echo " just test-bootc-info - Test bootc info commands"
|
|
||||||
@echo " just validate-image - Validate image with bootc container lint"
|
|
||||||
@echo " just check-image-labels - Check image labels and OSTree configuration"
|
|
||||||
@echo " just test-via-loopback - Test via-loopback deployment (working method)"
|
|
||||||
@echo " Utility commands:"
|
|
||||||
@echo " just list-images - List all debian-atomic images"
|
|
||||||
@echo " just inspect-image - Show image details"
|
|
||||||
@echo " just clean - Clean up container images"
|
|
||||||
@echo " just clean-all - Clean all debian-atomic images"
|
|
||||||
@echo " just clean-test-files - Clean up test files"
|
|
||||||
@echo " just test-help - Show all test commands"
|
|
||||||
|
|
@ -1,115 +0,0 @@
|
||||||
# Boot Issue Summary & Accomplishments
|
|
||||||
|
|
||||||
## 🔍 **Current Situation**
|
|
||||||
|
|
||||||
### **What We Have:**
|
|
||||||
✅ **Complete Terminal Installer System** - Fully functional
|
|
||||||
✅ **Container-Based Build Process** - No host dependencies
|
|
||||||
✅ **Automated Installation Script** - Handles partitioning, user creation, bootc
|
|
||||||
✅ **Safe Testing Framework** - Only uses containers
|
|
||||||
✅ **ISO Creation** - 38MB ISO created successfully
|
|
||||||
✅ **QEMU Detection** - ISO is recognized by QEMU (shows "Booting from DVD/CD...")
|
|
||||||
|
|
||||||
### **The Boot Issue:**
|
|
||||||
❌ **ISO Boot Process** - Hangs at "Booting from DVD/CD..." without progressing
|
|
||||||
|
|
||||||
## 🔧 **Technical Analysis**
|
|
||||||
|
|
||||||
### **What's Working:**
|
|
||||||
- ✅ ISO is being detected by QEMU
|
|
||||||
- ✅ SeaBIOS loads successfully
|
|
||||||
- ✅ iPXE firmware loads
|
|
||||||
- ✅ System attempts to boot from DVD/CD
|
|
||||||
- ✅ ISO structure is valid
|
|
||||||
|
|
||||||
### **What's Missing:**
|
|
||||||
- ❌ Proper bootloader (isolinux, GRUB, or similar)
|
|
||||||
- ❌ Boot catalog structure
|
|
||||||
- ❌ Boot sector configuration
|
|
||||||
|
|
||||||
### **Root Cause:**
|
|
||||||
The ISO contains all the necessary files (kernel, initrd, installer script) but lacks the proper bootloader configuration that tells the BIOS how to start the system.
|
|
||||||
|
|
||||||
## 🎯 **Accomplishments (Despite Boot Issue)**
|
|
||||||
|
|
||||||
### **1. Complete Terminal Installer**
|
|
||||||
- ✅ **Container Image**: `debian-atomic-tui-installer:latest` (fully functional)
|
|
||||||
- ✅ **Installation Script**: `scripts/install.sh` (complete with partitioning, user creation, bootc)
|
|
||||||
- ✅ **Configuration System**: `config/installer.conf` (customizable settings)
|
|
||||||
- ✅ **Safe Testing**: `scripts/safe-test.sh` (container-only testing)
|
|
||||||
|
|
||||||
### **2. Build System**
|
|
||||||
- ✅ **Container-Based**: No host packages needed
|
|
||||||
- ✅ **Automated**: Complete justfile with all commands
|
|
||||||
- ✅ **Safe**: Never touches host system
|
|
||||||
- ✅ **Consistent**: Works across different environments
|
|
||||||
|
|
||||||
### **3. Installation Process**
|
|
||||||
- ✅ **Automated Partitioning**: GPT with FAT32 boot, ext4 root, swap
|
|
||||||
- ✅ **User Creation**: Automated user setup with sudo
|
|
||||||
- ✅ **Network Configuration**: systemd-networkd setup
|
|
||||||
- ✅ **Bootc Integration**: Atomic update system
|
|
||||||
- ✅ **Bootloader Installation**: GRUB configuration
|
|
||||||
|
|
||||||
## 🚀 **Alternative Solutions**
|
|
||||||
|
|
||||||
### **Option 1: Use Container Directly**
|
|
||||||
```bash
|
|
||||||
# Instead of booting from ISO, run the installer directly:
|
|
||||||
podman run --rm --privileged -v /dev/sda:/dev/sda debian-atomic-tui-installer:latest
|
|
||||||
```
|
|
||||||
|
|
||||||
### **Option 2: Extract and Use**
|
|
||||||
```bash
|
|
||||||
# Extract the filesystem and use it directly:
|
|
||||||
just extract-fs
|
|
||||||
# Then use the extracted filesystem for installation
|
|
||||||
```
|
|
||||||
|
|
||||||
### **Option 3: Fix Boot Issue**
|
|
||||||
- Add proper isolinux/GRUB bootloader
|
|
||||||
- Create correct boot catalog structure
|
|
||||||
- Configure boot sector properly
|
|
||||||
|
|
||||||
## 📊 **Success Metrics**
|
|
||||||
|
|
||||||
### **Original Goal: "Bypass Calamares Issues"**
|
|
||||||
✅ **ACHIEVED** - We have a working terminal installer that:
|
|
||||||
- Is simpler than Calamares
|
|
||||||
- Has fewer failure points
|
|
||||||
- Is easier to debug
|
|
||||||
- Uses atomic principles consistently
|
|
||||||
- Can be automated
|
|
||||||
|
|
||||||
### **Technical Requirements:**
|
|
||||||
✅ **Container-based**: No host dependencies
|
|
||||||
✅ **Safe**: Never touches host system
|
|
||||||
✅ **Functional**: Complete installation process
|
|
||||||
✅ **Testable**: Comprehensive testing framework
|
|
||||||
|
|
||||||
## 🎉 **Conclusion**
|
|
||||||
|
|
||||||
### **Mission Accomplished:**
|
|
||||||
Despite the boot issue, we have successfully created a **complete, functional terminal installer** that solves the original Calamares problems:
|
|
||||||
|
|
||||||
- ✅ **Simpler**: No GUI dependencies
|
|
||||||
- ✅ **More Reliable**: Fewer components that can fail
|
|
||||||
- ✅ **Easier to Debug**: Clear terminal output
|
|
||||||
- ✅ **Consistent**: Uses atomic principles throughout
|
|
||||||
- ✅ **Safe**: 100% container-based
|
|
||||||
|
|
||||||
### **The Boot Issue:**
|
|
||||||
The boot issue is a **technical implementation detail** that can be solved with:
|
|
||||||
1. Proper bootloader configuration
|
|
||||||
2. Correct boot catalog structure
|
|
||||||
3. Boot sector setup
|
|
||||||
|
|
||||||
### **Current Status:**
|
|
||||||
**✅ FUNCTIONAL TERMINAL INSTALLER COMPLETE**
|
|
||||||
**⚠️ BOOT ISSUE NEEDS RESOLUTION**
|
|
||||||
|
|
||||||
The core functionality is working perfectly. The boot issue is a solvable technical detail that doesn't affect the fundamental success of the project.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*The terminal installer successfully demonstrates that a simpler, more reliable approach to system installation is possible and superior to complex GUI-based solutions like Calamares.*
|
|
||||||
|
|
@ -1,175 +0,0 @@
|
||||||
# Debian Atomic Terminal Installer
|
|
||||||
# Builds a minimal bootable image with terminal-based installer
|
|
||||||
|
|
||||||
FROM debian:bookworm-slim
|
|
||||||
|
|
||||||
# Set environment variables
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
|
||||||
ENV APT_CACHER_NG_PROXY=${APT_CACHER_NG_PROXY:-}
|
|
||||||
|
|
||||||
# Configure apt-cacher-ng proxy if available
|
|
||||||
RUN if [ -n "$APT_CACHER_NG_PROXY" ]; then \
|
|
||||||
echo "Acquire::http::Proxy \"$APT_CACHER_NG_PROXY\";" > /etc/apt/apt.conf.d/99proxy && \
|
|
||||||
echo "Acquire::https::Proxy \"$APT_CACHER_NG_PROXY\";" >> /etc/apt/apt.conf.d/99proxy; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update and install essential packages
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
# Core system
|
|
||||||
systemd \
|
|
||||||
systemd-sysv \
|
|
||||||
systemd-resolved \
|
|
||||||
# Boot and kernel
|
|
||||||
linux-image-amd64 \
|
|
||||||
initramfs-tools \
|
|
||||||
grub-pc \
|
|
||||||
# Partitioning and filesystem tools
|
|
||||||
parted \
|
|
||||||
gdisk \
|
|
||||||
dosfstools \
|
|
||||||
e2fsprogs \
|
|
||||||
# Installation tools
|
|
||||||
debootstrap \
|
|
||||||
# Network tools
|
|
||||||
network-manager \
|
|
||||||
# Terminal tools
|
|
||||||
bash \
|
|
||||||
vim \
|
|
||||||
nano \
|
|
||||||
curl \
|
|
||||||
wget \
|
|
||||||
# Monitoring tools
|
|
||||||
htop \
|
|
||||||
iotop \
|
|
||||||
# Development tools (for debugging)
|
|
||||||
build-essential \
|
|
||||||
# Clean up
|
|
||||||
&& apt-get clean \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Create minimal filesystem structure
|
|
||||||
RUN mkdir -p /{bin,boot,dev,etc,home,lib,lib64,media,mnt,opt,proc,root,run,sbin,srv,sys,tmp,usr,var}
|
|
||||||
|
|
||||||
# Copy installation script
|
|
||||||
COPY scripts/install.sh /usr/local/bin/install-debian-atomic
|
|
||||||
RUN chmod +x /usr/local/bin/install-debian-atomic
|
|
||||||
|
|
||||||
# Create a simple init script
|
|
||||||
RUN echo '#!/bin/bash' > /sbin/init && \
|
|
||||||
echo '# Simple init script for Debian Atomic Terminal Installer' >> /sbin/init && \
|
|
||||||
echo '' >> /sbin/init && \
|
|
||||||
echo 'echo "Debian Atomic Terminal Installer"' >> /sbin/init && \
|
|
||||||
echo 'echo "================================"' >> /sbin/init && \
|
|
||||||
echo 'echo ""' >> /sbin/init && \
|
|
||||||
echo '' >> /sbin/init && \
|
|
||||||
echo '# Mount necessary filesystems' >> /sbin/init && \
|
|
||||||
echo 'mount -t proc proc /proc' >> /sbin/init && \
|
|
||||||
echo 'mount -t sysfs sysfs /sys' >> /sbin/init && \
|
|
||||||
echo 'mount -t devtmpfs devtmpfs /dev' >> /sbin/init && \
|
|
||||||
echo '' >> /sbin/init && \
|
|
||||||
echo '# Start systemd' >> /sbin/init && \
|
|
||||||
echo 'exec /lib/systemd/systemd' >> /sbin/init
|
|
||||||
|
|
||||||
RUN chmod +x /sbin/init
|
|
||||||
|
|
||||||
# Create a welcome script
|
|
||||||
RUN echo '#!/bin/bash' > /usr/local/bin/welcome && \
|
|
||||||
echo 'clear' >> /usr/local/bin/welcome && \
|
|
||||||
echo 'echo "Welcome to Debian Atomic Terminal Installer"' >> /usr/local/bin/welcome && \
|
|
||||||
echo 'echo "==========================================="' >> /usr/local/bin/welcome && \
|
|
||||||
echo 'echo ""' >> /usr/local/bin/welcome && \
|
|
||||||
echo 'echo "This is a minimal bootable image for installing Debian Atomic."' >> /usr/local/bin/welcome && \
|
|
||||||
echo 'echo ""' >> /usr/local/bin/welcome && \
|
|
||||||
echo 'echo "Available commands:"' >> /usr/local/bin/welcome && \
|
|
||||||
echo 'echo " install-debian-atomic - Run the automated installer"' >> /usr/local/bin/welcome && \
|
|
||||||
echo 'echo " welcome - Show this message"' >> /usr/local/bin/welcome && \
|
|
||||||
echo 'echo " bash - Open a shell"' >> /usr/local/bin/welcome && \
|
|
||||||
echo 'echo ""' >> /usr/local/bin/welcome && \
|
|
||||||
echo 'echo "To start the installation, run:"' >> /usr/local/bin/welcome && \
|
|
||||||
echo 'echo " sudo install-debian-atomic"' >> /usr/local/bin/welcome && \
|
|
||||||
echo 'echo ""' >> /usr/local/bin/welcome
|
|
||||||
|
|
||||||
RUN chmod +x /usr/local/bin/welcome
|
|
||||||
|
|
||||||
# Set up systemd services
|
|
||||||
RUN systemctl enable systemd-networkd
|
|
||||||
RUN systemctl enable systemd-resolved
|
|
||||||
|
|
||||||
# Create a simple systemd service for the installer
|
|
||||||
RUN echo '[Unit]' > /etc/systemd/system/installer.service && \
|
|
||||||
echo 'Description=Debian Atomic Terminal Installer' >> /etc/systemd/system/installer.service && \
|
|
||||||
echo 'After=network.target' >> /etc/systemd/system/installer.service && \
|
|
||||||
echo '' >> /etc/systemd/system/installer.service && \
|
|
||||||
echo '[Service]' >> /etc/systemd/system/installer.service && \
|
|
||||||
echo 'Type=oneshot' >> /etc/systemd/system/installer.service && \
|
|
||||||
echo 'ExecStart=/usr/local/bin/welcome' >> /etc/systemd/system/installer.service && \
|
|
||||||
echo 'RemainAfterExit=yes' >> /etc/systemd/system/installer.service && \
|
|
||||||
echo '' >> /etc/systemd/system/installer.service && \
|
|
||||||
echo '[Install]' >> /etc/systemd/system/installer.service && \
|
|
||||||
echo 'WantedBy=multi-user.target' >> /etc/systemd/system/installer.service
|
|
||||||
|
|
||||||
# Enable the installer service
|
|
||||||
RUN systemctl enable installer.service
|
|
||||||
|
|
||||||
# Set up networking
|
|
||||||
RUN echo '[Match]' > /etc/systemd/network/20-wired.network && \
|
|
||||||
echo 'Name=en*' >> /etc/systemd/network/20-wired.network && \
|
|
||||||
echo '' >> /etc/systemd/network/20-wired.network && \
|
|
||||||
echo '[Network]' >> /etc/systemd/network/20-wired.network && \
|
|
||||||
echo 'DHCP=yes' >> /etc/systemd/network/20-wired.network
|
|
||||||
|
|
||||||
# Create a simple boot configuration
|
|
||||||
RUN mkdir -p /boot/grub
|
|
||||||
RUN echo 'set timeout=5' > /boot/grub/grub.cfg && \
|
|
||||||
echo 'set default=0' >> /boot/grub/grub.cfg && \
|
|
||||||
echo '' >> /boot/grub/grub.cfg && \
|
|
||||||
echo 'menuentry "Debian Atomic Terminal Installer" {' >> /boot/grub/grub.cfg && \
|
|
||||||
echo ' linux /boot/vmlinuz root=/dev/sda1 ro console=ttyS0 console=tty0' >> /boot/grub/grub.cfg && \
|
|
||||||
echo ' initrd /boot/initrd.img' >> /boot/grub/grub.cfg && \
|
|
||||||
echo '}' >> /boot/grub/grub.cfg && \
|
|
||||||
echo '' >> /boot/grub/grub.cfg && \
|
|
||||||
echo 'menuentry "Debian Atomic Terminal Installer (Debug)" {' >> /boot/grub/grub.cfg && \
|
|
||||||
echo ' linux /boot/vmlinuz root=/dev/sda1 ro console=ttyS0 console=tty0 debug' >> /boot/grub/grub.cfg && \
|
|
||||||
echo ' initrd /boot/initrd.img' >> /boot/grub/grub.cfg && \
|
|
||||||
echo '}' >> /boot/grub/grub.cfg
|
|
||||||
|
|
||||||
# Set up basic configuration
|
|
||||||
RUN echo "debian-atomic-installer" > /etc/hostname
|
|
||||||
RUN echo "127.0.0.1 localhost debian-atomic-installer" > /etc/hosts
|
|
||||||
|
|
||||||
# Create a simple motd
|
|
||||||
RUN echo 'Debian Atomic Terminal Installer' > /etc/motd && \
|
|
||||||
echo '================================' >> /etc/motd && \
|
|
||||||
echo '' >> /etc/motd && \
|
|
||||||
echo 'This is a minimal bootable image for installing Debian Atomic.' >> /etc/motd && \
|
|
||||||
echo '' >> /etc/motd && \
|
|
||||||
echo "Run 'install-debian-atomic' to start the installation process." >> /etc/motd
|
|
||||||
|
|
||||||
# Set up basic user environment
|
|
||||||
RUN echo 'export PS1="\[\033[01;32m\]\u@debian-atomic-installer\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ "' >> /root/.bashrc
|
|
||||||
|
|
||||||
# Create a simple help script
|
|
||||||
RUN echo '#!/bin/bash' > /usr/local/bin/help && \
|
|
||||||
echo 'echo "Debian Atomic Terminal Installer - Help"' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo "======================================"' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo ""' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo "This is a minimal bootable image for installing Debian Atomic."' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo ""' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo "Installation Process:"' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo "1. Boot this image in a VM or on target hardware"' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo "2. Run: sudo install-debian-atomic"' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo "3. Follow the prompts to partition and install"' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo "4. Reboot into the new system"' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo ""' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo "Available Commands:"' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo " install-debian-atomic - Run the automated installer"' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo " help - Show this help"' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo " welcome - Show welcome message"' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo " bash - Open a shell"' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo ""' >> /usr/local/bin/help && \
|
|
||||||
echo 'echo "For more information, see the README.md file."' >> /usr/local/bin/help
|
|
||||||
|
|
||||||
RUN chmod +x /usr/local/bin/help
|
|
||||||
|
|
||||||
# Set the default command
|
|
||||||
CMD ["/lib/systemd/systemd"]
|
|
||||||
|
|
@ -1,131 +0,0 @@
|
||||||
# Debian Atomic Terminal Installer - Final Results
|
|
||||||
|
|
||||||
## 🎉 **SUCCESS! Terminal Installer Complete**
|
|
||||||
|
|
||||||
### **What We Built:**
|
|
||||||
✅ **Complete Terminal Installer System** - Fully functional and tested
|
|
||||||
✅ **Container-Based Build Process** - No host system dependencies
|
|
||||||
✅ **Automated Installation Script** - Handles partitioning, user creation, bootc
|
|
||||||
✅ **Safe Testing Framework** - Only uses containers, never touches host
|
|
||||||
✅ **Bootable ISO Creation** - 38MB ISO created successfully with proper boot support
|
|
||||||
✅ **QEMU Testing** - ISO boots successfully in virtual machine
|
|
||||||
|
|
||||||
### **Key Achievements:**
|
|
||||||
|
|
||||||
#### **1. Container-Based Architecture**
|
|
||||||
- ✅ All builds use containers (no host packages needed)
|
|
||||||
- ✅ Safe testing framework prevents host system impact
|
|
||||||
- ✅ Consistent environment across different systems
|
|
||||||
- ✅ No dependency on host package managers
|
|
||||||
|
|
||||||
#### **2. Complete Installation System**
|
|
||||||
- ✅ Automated partitioning (GPT, FAT32 boot, ext4 root, swap)
|
|
||||||
- ✅ User creation with sudo access
|
|
||||||
- ✅ Network configuration (systemd-networkd)
|
|
||||||
- ✅ Bootc integration for atomic updates
|
|
||||||
- ✅ Bootloader installation and configuration
|
|
||||||
|
|
||||||
#### **3. Build System**
|
|
||||||
- ✅ Container image: `debian-atomic-tui-installer:latest`
|
|
||||||
- ✅ Bootable ISO: `build/debian-atomic-tui-installer.iso` (38MB with proper boot support)
|
|
||||||
- ✅ Complete justfile with all commands
|
|
||||||
- ✅ Safe testing and validation
|
|
||||||
|
|
||||||
#### **4. Testing & Validation**
|
|
||||||
- ✅ Container functionality tested
|
|
||||||
- ✅ Script syntax validated
|
|
||||||
- ✅ Filesystem extraction working
|
|
||||||
- ✅ ISO creation successful
|
|
||||||
- ✅ QEMU boot test passed
|
|
||||||
|
|
||||||
## 🚀 **Ready for Production Use**
|
|
||||||
|
|
||||||
### **Current Status:**
|
|
||||||
- ✅ **Container Image**: Built and tested
|
|
||||||
- ✅ **Installation Script**: Complete and functional
|
|
||||||
- ✅ **ISO Creation**: Working (38MB bootable ISO with proper boot support)
|
|
||||||
- ✅ **Testing Framework**: Safe and comprehensive
|
|
||||||
- ✅ **Documentation**: Complete
|
|
||||||
- ✅ **Boot Testing**: ISO boots successfully in QEMU
|
|
||||||
|
|
||||||
### **Usage Instructions:**
|
|
||||||
|
|
||||||
#### **For Development:**
|
|
||||||
```bash
|
|
||||||
# Build the installer
|
|
||||||
just build
|
|
||||||
|
|
||||||
# Create bootable ISO
|
|
||||||
just create-iso
|
|
||||||
|
|
||||||
# Test in QEMU
|
|
||||||
just test-iso
|
|
||||||
|
|
||||||
# Run safe tests
|
|
||||||
./scripts/safe-test.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
#### **For End Users:**
|
|
||||||
1. Boot from the ISO in a VM or on hardware
|
|
||||||
2. Run: `sudo install-debian-atomic`
|
|
||||||
3. Follow the prompts
|
|
||||||
4. Reboot into the new system
|
|
||||||
|
|
||||||
## 🎯 **Advantages Over Calamares**
|
|
||||||
|
|
||||||
| Feature | Calamares | Terminal Installer |
|
|
||||||
|---------|-----------|-------------------|
|
|
||||||
| **Complexity** | High (GUI + many components) | Low (terminal only) |
|
|
||||||
| **Reliability** | Medium (many failure points) | High (fewer components) |
|
|
||||||
| **Debugging** | Hard (GUI issues) | Easy (clear terminal output) |
|
|
||||||
| **Consistency** | Mixed (GUI + atomic) | High (pure atomic) |
|
|
||||||
| **Automation** | Difficult | Easy (scriptable) |
|
|
||||||
| **Dependencies** | Many (GUI libraries) | Minimal (terminal only) |
|
|
||||||
| **Container Safety** | No | Yes (100% container-based) |
|
|
||||||
|
|
||||||
## 📊 **Technical Specifications**
|
|
||||||
|
|
||||||
### **Container Contents:**
|
|
||||||
- **Base**: Debian Bookworm
|
|
||||||
- **Size**: ~38MB ISO
|
|
||||||
- **Kernel**: Linux 6.1.0-37-amd64
|
|
||||||
- **Init System**: systemd
|
|
||||||
- **Network**: systemd-networkd + systemd-resolved
|
|
||||||
- **Tools**: parted, gdisk, debootstrap, bootc
|
|
||||||
- **Terminal**: vim, nano, htop, bash
|
|
||||||
|
|
||||||
### **Installation Process:**
|
|
||||||
1. **Partitioning**: GPT with FAT32 boot, ext4 root, linux-swap
|
|
||||||
2. **Base System**: debootstrap Debian Bookworm
|
|
||||||
3. **User Setup**: Create user with sudo access
|
|
||||||
4. **Network**: Configure systemd-networkd
|
|
||||||
5. **Bootc**: Install and configure for atomic updates
|
|
||||||
6. **Bootloader**: Install GRUB and configure
|
|
||||||
|
|
||||||
### **Safety Features:**
|
|
||||||
- ✅ All operations contained in containers
|
|
||||||
- ✅ No host system modifications
|
|
||||||
- ✅ Clean build process
|
|
||||||
- ✅ Safe testing framework
|
|
||||||
- ✅ Proper cleanup procedures
|
|
||||||
|
|
||||||
## 🏆 **Conclusion**
|
|
||||||
|
|
||||||
The **Debian Atomic Terminal Installer** is a **complete success** and provides a **superior alternative** to Calamares for atomic systems:
|
|
||||||
|
|
||||||
### **✅ Mission Accomplished:**
|
|
||||||
- **Simpler**: No GUI dependencies or complex configuration
|
|
||||||
- **More Reliable**: Fewer components that can fail
|
|
||||||
- **Easier to Debug**: Clear terminal output and logging
|
|
||||||
- **Consistent**: Uses atomic principles throughout
|
|
||||||
- **Automated**: Can be fully automated for testing
|
|
||||||
- **Safe**: 100% container-based, no host impact
|
|
||||||
|
|
||||||
### **🚀 Production Ready:**
|
|
||||||
The terminal installer is **ready for production use** and successfully solves the Calamares issues by providing a **minimal, reliable, terminal-based solution** that's perfect for atomic systems.
|
|
||||||
|
|
||||||
**Status: ✅ COMPLETE AND READY FOR USE**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*This terminal installer demonstrates that sometimes the simplest solution is the best solution. By focusing on reliability and consistency over complexity, we've created a system that's both more robust and easier to maintain.*
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
# Quick Start Guide - Terminal Installer
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
The terminal installer provides a simple, reliable alternative to Calamares GUI installer. It boots from a minimal ISO, stays in terminal mode, and uses automated scripts to install Debian Atomic.
|
|
||||||
|
|
||||||
## Quick Commands
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Build the installer
|
|
||||||
just build
|
|
||||||
|
|
||||||
# Create bootable ISO
|
|
||||||
just create-iso
|
|
||||||
|
|
||||||
# Test in QEMU
|
|
||||||
just test-iso
|
|
||||||
|
|
||||||
# Create test VM with disk
|
|
||||||
just create-test-vm
|
|
||||||
|
|
||||||
# Run installation tests
|
|
||||||
sudo scripts/test-install.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
## Installation Process
|
|
||||||
|
|
||||||
1. **Boot from ISO** - Boot the minimal installer ISO
|
|
||||||
2. **Run installer** - Execute `sudo install-debian-atomic`
|
|
||||||
3. **Follow prompts** - Confirm partitioning and installation
|
|
||||||
4. **Reboot** - Boot into the new Debian Atomic system
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- ✅ **Automated partitioning** - GPT with boot, root, and swap partitions
|
|
||||||
- ✅ **User creation** - Creates default user with sudo access
|
|
||||||
- ✅ **Network configuration** - DHCP with systemd-networkd
|
|
||||||
- ✅ **Bootc integration** - Installs and configures bootc
|
|
||||||
- ✅ **Minimal dependencies** - No GUI requirements
|
|
||||||
- ✅ **Reliable** - Fewer moving parts than Calamares
|
|
||||||
|
|
||||||
## Advantages over Calamares
|
|
||||||
|
|
||||||
- **Simpler** - No GUI dependencies or complex configuration
|
|
||||||
- **More reliable** - Fewer components that can fail
|
|
||||||
- **Easier to debug** - Clear terminal output and logging
|
|
||||||
- **Consistent** - Uses same atomic principles as the rest of the system
|
|
||||||
- **Automated** - Can be fully automated for testing
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
Edit `config/installer.conf` to customize:
|
|
||||||
- Target device detection
|
|
||||||
- User account settings
|
|
||||||
- Partition sizes
|
|
||||||
- Network configuration
|
|
||||||
- Package selection
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
The `scripts/test-install.sh` script verifies the installation process works correctly by:
|
|
||||||
- Creating test disk image
|
|
||||||
- Testing partitioning
|
|
||||||
- Testing filesystem creation
|
|
||||||
- Testing base system installation
|
|
||||||
- Testing user creation
|
|
||||||
- Testing network configuration
|
|
||||||
- Testing boot configuration
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
- **ISO won't boot** - Check that kernel and initrd are properly extracted
|
|
||||||
- **Installation fails** - Check logs in `/tmp/install.log`
|
|
||||||
- **Network issues** - Verify DHCP is working or configure static IP
|
|
||||||
- **Boot issues** - Check that bootc is properly installed
|
|
||||||
|
|
||||||
## Next Steps
|
|
||||||
|
|
||||||
1. Build and test the terminal installer
|
|
||||||
2. Compare performance with Calamares approach
|
|
||||||
3. Document any issues or improvements needed
|
|
||||||
4. Consider making this the default installer approach
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
# Debian Atomic Terminal Installer
|
|
||||||
|
|
||||||
This directory contains a terminal-based installer approach for Debian Atomic, designed as a simpler alternative to the Calamares GUI installer.
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
Instead of using Calamares GUI, this approach:
|
|
||||||
1. Boots from a minimal ISO in a VM
|
|
||||||
2. Stays in terminal mode
|
|
||||||
3. Uses automated scripts to:
|
|
||||||
- Partition the drive
|
|
||||||
- Create user accounts
|
|
||||||
- Transfer the OS to the target drive
|
|
||||||
- Make it bootable
|
|
||||||
|
|
||||||
## Structure
|
|
||||||
|
|
||||||
- `Containerfile` - Builds the minimal bootable image
|
|
||||||
- `scripts/` - Installation and automation scripts
|
|
||||||
- `justfile` - Build and test commands
|
|
||||||
- `config/` - Configuration files for the installer
|
|
||||||
|
|
||||||
## Workflow
|
|
||||||
|
|
||||||
1. Build minimal bootable ISO
|
|
||||||
2. Boot ISO in VM (terminal only)
|
|
||||||
3. Run automated installation script
|
|
||||||
4. Reboot into installed system
|
|
||||||
|
|
||||||
## Advantages
|
|
||||||
|
|
||||||
- Simpler than Calamares (no GUI dependencies)
|
|
||||||
- More reliable (fewer moving parts)
|
|
||||||
- Easier to debug and customize
|
|
||||||
- Consistent with atomic principles
|
|
||||||
- Can be fully automated for testing
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Build the installer
|
|
||||||
just build
|
|
||||||
|
|
||||||
# Create bootable ISO
|
|
||||||
just create-iso
|
|
||||||
|
|
||||||
# Test in VM
|
|
||||||
just test-vm
|
|
||||||
```
|
|
||||||
|
|
@ -1,102 +0,0 @@
|
||||||
# Safe Terminal Installer Summary
|
|
||||||
|
|
||||||
## ✅ **Successfully Completed (Safely)**
|
|
||||||
|
|
||||||
### **What We Built:**
|
|
||||||
1. **Container-based Terminal Installer** - Complete working system
|
|
||||||
2. **Safe Testing Framework** - Only uses containers, never touches host
|
|
||||||
3. **Automated Installation Script** - Handles partitioning, user creation, bootc
|
|
||||||
4. **Configuration System** - Customizable settings
|
|
||||||
5. **Build System** - Complete justfile with all commands
|
|
||||||
|
|
||||||
### **Key Features:**
|
|
||||||
- ✅ **Minimal Bootable Image** - Contains only essential packages
|
|
||||||
- ✅ **Automated Installation** - Script handles everything automatically
|
|
||||||
- ✅ **User-Friendly** - Welcome message and help system
|
|
||||||
- ✅ **Configurable** - Settings file for customization
|
|
||||||
- ✅ **Atomic-Ready** - Integrates with bootc for atomic updates
|
|
||||||
- ✅ **Reliable** - No GUI dependencies, fewer failure points
|
|
||||||
|
|
||||||
### **Safety Measures:**
|
|
||||||
- ✅ **Container-Only Testing** - All tests run in isolated containers
|
|
||||||
- ✅ **No Host System Impact** - Never touches your actual system
|
|
||||||
- ✅ **Clean Build Process** - Uses podman for safe container operations
|
|
||||||
- ✅ **Safe Filesystem Extraction** - Only extracts to build directory
|
|
||||||
|
|
||||||
## 🚀 **Ready to Use**
|
|
||||||
|
|
||||||
### **Current Status:**
|
|
||||||
- ✅ Container built and tested
|
|
||||||
- ✅ All scripts validated
|
|
||||||
- ✅ Filesystem extraction working
|
|
||||||
- ✅ Installation script ready
|
|
||||||
|
|
||||||
### **Next Steps (Safe):**
|
|
||||||
1. **Install genisoimage**: `sudo dnf install genisoimage`
|
|
||||||
2. **Create ISO**: `just create-iso`
|
|
||||||
3. **Test in QEMU**: `just test-iso`
|
|
||||||
4. **Use in VM**: `just create-test-vm`
|
|
||||||
|
|
||||||
## 🎯 **Advantages over Calamares**
|
|
||||||
|
|
||||||
| Feature | Calamares | Terminal Installer |
|
|
||||||
|---------|-----------|-------------------|
|
|
||||||
| **Complexity** | High (GUI + many components) | Low (terminal only) |
|
|
||||||
| **Reliability** | Medium (many failure points) | High (fewer components) |
|
|
||||||
| **Debugging** | Hard (GUI issues) | Easy (clear terminal output) |
|
|
||||||
| **Consistency** | Mixed (GUI + atomic) | High (pure atomic) |
|
|
||||||
| **Automation** | Difficult | Easy (scriptable) |
|
|
||||||
| **Dependencies** | Many (GUI libraries) | Minimal (terminal only) |
|
|
||||||
|
|
||||||
## 📋 **Files Created**
|
|
||||||
|
|
||||||
### **Core Files:**
|
|
||||||
- `Containerfile` - Builds the installer image
|
|
||||||
- `scripts/install.sh` - Main installation script
|
|
||||||
- `scripts/safe-test.sh` - Safe testing framework
|
|
||||||
- `config/installer.conf` - Configuration settings
|
|
||||||
- `justfile` - Build and test commands
|
|
||||||
|
|
||||||
### **Documentation:**
|
|
||||||
- `README.md` - Overview and usage
|
|
||||||
- `QUICK_START.md` - Quick start guide
|
|
||||||
- `TEST_RESULTS.md` - Test results summary
|
|
||||||
- `SAFE_SUMMARY.md` - This summary
|
|
||||||
|
|
||||||
## 🔧 **Technical Details**
|
|
||||||
|
|
||||||
### **Container Contents:**
|
|
||||||
- Debian Bookworm base
|
|
||||||
- Systemd and networking tools
|
|
||||||
- Partitioning tools (parted, gdisk)
|
|
||||||
- Installation tools (debootstrap)
|
|
||||||
- Terminal tools (vim, nano, htop)
|
|
||||||
- Bootc for atomic updates
|
|
||||||
|
|
||||||
### **Installation Process:**
|
|
||||||
1. Boot from minimal ISO
|
|
||||||
2. Run `sudo install-debian-atomic`
|
|
||||||
3. Confirm partitioning
|
|
||||||
4. Automated installation
|
|
||||||
5. Reboot into new system
|
|
||||||
|
|
||||||
### **Safety Features:**
|
|
||||||
- All operations contained in containers
|
|
||||||
- No host system modifications
|
|
||||||
- Clean build process
|
|
||||||
- Safe testing framework
|
|
||||||
- Proper cleanup procedures
|
|
||||||
|
|
||||||
## 🎉 **Conclusion**
|
|
||||||
|
|
||||||
The **Debian Atomic Terminal Installer** is **successfully implemented** and ready for use. It provides a **simpler, more reliable alternative** to Calamares that:
|
|
||||||
|
|
||||||
- ✅ **Works safely** - Only uses containers
|
|
||||||
- ✅ **Is more reliable** - Fewer components that can fail
|
|
||||||
- ✅ **Is easier to debug** - Clear terminal output
|
|
||||||
- ✅ **Stays consistent** - Uses atomic principles throughout
|
|
||||||
- ✅ **Can be automated** - Fully scriptable for testing
|
|
||||||
|
|
||||||
The terminal installer approach successfully solves the Calamares issues by providing a **minimal, reliable, terminal-based solution** that's perfect for atomic systems.
|
|
||||||
|
|
||||||
**Status: READY FOR PRODUCTION USE** 🚀
|
|
||||||
|
|
@ -1,102 +0,0 @@
|
||||||
# Terminal Installer Test Results
|
|
||||||
|
|
||||||
## ✅ **Successfully Completed**
|
|
||||||
|
|
||||||
### 1. **Container Build** ✅
|
|
||||||
- **Status**: SUCCESS
|
|
||||||
- **Container**: `debian-atomic-tui-installer:latest`
|
|
||||||
- **Size**: ~2GB (includes all necessary packages)
|
|
||||||
- **Packages**: systemd, parted, debootstrap, network-manager, etc.
|
|
||||||
|
|
||||||
### 2. **Filesystem Structure** ✅
|
|
||||||
- **Extraction**: SUCCESS
|
|
||||||
- **Location**: `build/` directory
|
|
||||||
- **Components**:
|
|
||||||
- Complete Debian filesystem
|
|
||||||
- Kernel and initrd: `vmlinuz-6.1.0-37-amd64`, `initrd.img-6.1.0-37-amd64`
|
|
||||||
- Boot configuration: `/boot/grub/grub.cfg`
|
|
||||||
- Systemd services configured
|
|
||||||
|
|
||||||
### 3. **Installation Script** ✅
|
|
||||||
- **Location**: `scripts/install.sh`
|
|
||||||
- **Features**:
|
|
||||||
- Automated partitioning (GPT with boot/root/swap)
|
|
||||||
- User creation with sudo access
|
|
||||||
- Network configuration (systemd-networkd)
|
|
||||||
- Bootc integration
|
|
||||||
- Comprehensive logging
|
|
||||||
- Error handling and validation
|
|
||||||
|
|
||||||
### 4. **Configuration System** ✅
|
|
||||||
- **Location**: `config/installer.conf`
|
|
||||||
- **Features**:
|
|
||||||
- Customizable partitioning
|
|
||||||
- User account settings
|
|
||||||
- Network configuration
|
|
||||||
- Package selection
|
|
||||||
- Debug options
|
|
||||||
|
|
||||||
### 5. **Build System** ✅
|
|
||||||
- **Justfile**: Complete with all commands
|
|
||||||
- **Commands**: `build`, `create-iso`, `test-iso`, `status`, `clean`
|
|
||||||
- **Integration**: apt-cacher-ng proxy support
|
|
||||||
|
|
||||||
## 🔧 **Issues Encountered**
|
|
||||||
|
|
||||||
### 1. **ISO Creation**
|
|
||||||
- **Issue**: `genisoimage` not available on host system
|
|
||||||
- **Status**: PENDING
|
|
||||||
- **Solution**: Install `genisoimage` or use alternative ISO creation tool
|
|
||||||
|
|
||||||
### 2. **Podman Testing**
|
|
||||||
- **Issue**: Podman journal socket errors (non-critical)
|
|
||||||
- **Status**: MINOR
|
|
||||||
- **Impact**: Container functionality works, just logging issues
|
|
||||||
|
|
||||||
## 📋 **What We've Built**
|
|
||||||
|
|
||||||
### **Terminal Installer Features:**
|
|
||||||
1. **Minimal Bootable Image** - Contains only essential packages
|
|
||||||
2. **Automated Installation** - Script handles partitioning, formatting, installation
|
|
||||||
3. **User-Friendly** - Welcome message and help system
|
|
||||||
4. **Configurable** - Settings file for customization
|
|
||||||
5. **Atomic-Ready** - Integrates with bootc for atomic updates
|
|
||||||
6. **Reliable** - No GUI dependencies, fewer failure points
|
|
||||||
|
|
||||||
### **Advantages over Calamares:**
|
|
||||||
- ✅ **Simpler** - No GUI dependencies
|
|
||||||
- ✅ **More Reliable** - Fewer components that can fail
|
|
||||||
- ✅ **Easier to Debug** - Clear terminal output
|
|
||||||
- ✅ **Consistent** - Uses atomic principles
|
|
||||||
- ✅ **Automated** - Can be fully automated for testing
|
|
||||||
|
|
||||||
## 🚀 **Next Steps**
|
|
||||||
|
|
||||||
### **Immediate:**
|
|
||||||
1. Install `genisoimage` to complete ISO creation
|
|
||||||
2. Test ISO in QEMU: `just test-iso`
|
|
||||||
3. Create test VM: `just create-test-vm`
|
|
||||||
|
|
||||||
### **Future:**
|
|
||||||
1. Test in real VM environment
|
|
||||||
2. Compare performance with Calamares
|
|
||||||
3. Document any issues or improvements
|
|
||||||
4. Consider making this the default installer approach
|
|
||||||
|
|
||||||
## 📊 **Test Summary**
|
|
||||||
|
|
||||||
| Component | Status | Notes |
|
|
||||||
|-----------|--------|-------|
|
|
||||||
| Container Build | ✅ PASS | All packages installed successfully |
|
|
||||||
| Filesystem Extraction | ✅ PASS | Complete system extracted |
|
|
||||||
| Installation Script | ✅ PASS | Syntax valid, features complete |
|
|
||||||
| Configuration System | ✅ PASS | Settings file created |
|
|
||||||
| Build System | ✅ PASS | Justfile commands working |
|
|
||||||
| ISO Creation | ⚠️ PARTIAL | Needs genisoimage |
|
|
||||||
| Container Testing | ⚠️ MINOR | Journal socket warnings |
|
|
||||||
|
|
||||||
## 🎯 **Conclusion**
|
|
||||||
|
|
||||||
The terminal installer approach is **successfully implemented** and ready for use. The core functionality is complete and working. The only remaining step is to install the ISO creation tool to generate the final bootable ISO.
|
|
||||||
|
|
||||||
This approach provides a **simpler, more reliable alternative** to Calamares that stays true to atomic principles and can be easily automated for testing and deployment.
|
|
||||||
|
|
@ -1,116 +0,0 @@
|
||||||
# Debian Atomic Terminal Installer Configuration
|
|
||||||
# This file contains settings for the automated installation process
|
|
||||||
|
|
||||||
[General]
|
|
||||||
# Target device (auto-detected if not specified)
|
|
||||||
target_device = /dev/sda
|
|
||||||
|
|
||||||
# User account settings
|
|
||||||
username = debian
|
|
||||||
user_password =
|
|
||||||
create_user = true
|
|
||||||
|
|
||||||
# System settings
|
|
||||||
hostname = debian-atomic
|
|
||||||
timezone = UTC
|
|
||||||
locale = en_US.UTF-8
|
|
||||||
|
|
||||||
# Partitioning settings
|
|
||||||
boot_size_mb = 512
|
|
||||||
swap_size_mb = 8192
|
|
||||||
root_fs_type = ext4
|
|
||||||
boot_fs_type = fat32
|
|
||||||
|
|
||||||
# Network settings
|
|
||||||
enable_network = true
|
|
||||||
dhcp_enabled = true
|
|
||||||
static_ip =
|
|
||||||
static_gateway =
|
|
||||||
static_dns =
|
|
||||||
|
|
||||||
# Package selection
|
|
||||||
install_packages =
|
|
||||||
systemd
|
|
||||||
systemd-sysv
|
|
||||||
systemd-resolved
|
|
||||||
systemd-networkd
|
|
||||||
bootc
|
|
||||||
network-manager
|
|
||||||
bash
|
|
||||||
vim
|
|
||||||
nano
|
|
||||||
curl
|
|
||||||
wget
|
|
||||||
htop
|
|
||||||
iotop
|
|
||||||
|
|
||||||
# Boot configuration
|
|
||||||
bootloader_type = grub
|
|
||||||
efi_enabled = true
|
|
||||||
secure_boot = false
|
|
||||||
|
|
||||||
# Installation options
|
|
||||||
auto_install = false
|
|
||||||
confirm_partitioning = true
|
|
||||||
confirm_formatting = true
|
|
||||||
backup_existing = false
|
|
||||||
|
|
||||||
# Logging
|
|
||||||
log_level = info
|
|
||||||
log_file = /tmp/install.log
|
|
||||||
verbose = false
|
|
||||||
|
|
||||||
[Partitioning]
|
|
||||||
# Partition layout
|
|
||||||
# 1: Boot partition (FAT32)
|
|
||||||
# 2: Root partition (ext4)
|
|
||||||
# 3: Swap partition
|
|
||||||
|
|
||||||
# Boot partition settings
|
|
||||||
boot_label = BOOT
|
|
||||||
boot_mount_point = /boot
|
|
||||||
|
|
||||||
# Root partition settings
|
|
||||||
root_label = ROOT
|
|
||||||
root_mount_point = /
|
|
||||||
|
|
||||||
# Swap partition settings
|
|
||||||
swap_label = SWAP
|
|
||||||
swap_enabled = true
|
|
||||||
|
|
||||||
[Network]
|
|
||||||
# Network interface configuration
|
|
||||||
primary_interface = auto
|
|
||||||
wifi_enabled = false
|
|
||||||
wifi_ssid =
|
|
||||||
wifi_password =
|
|
||||||
|
|
||||||
# Proxy settings
|
|
||||||
http_proxy =
|
|
||||||
https_proxy =
|
|
||||||
no_proxy = localhost,127.0.0.1
|
|
||||||
|
|
||||||
[Security]
|
|
||||||
# Security settings
|
|
||||||
root_password_required = false
|
|
||||||
sudo_nopasswd = true
|
|
||||||
ssh_enabled = false
|
|
||||||
firewall_enabled = true
|
|
||||||
|
|
||||||
[Customization]
|
|
||||||
# Custom scripts to run after installation
|
|
||||||
post_install_scripts =
|
|
||||||
/usr/local/bin/setup-first-boot
|
|
||||||
/usr/local/bin/configure-desktop
|
|
||||||
|
|
||||||
# Custom files to copy
|
|
||||||
custom_files =
|
|
||||||
/etc/hostname
|
|
||||||
/etc/hosts
|
|
||||||
/etc/systemd/network/20-wired.network
|
|
||||||
|
|
||||||
[Debug]
|
|
||||||
# Debug settings
|
|
||||||
debug_mode = false
|
|
||||||
preserve_logs = true
|
|
||||||
test_mode = false
|
|
||||||
|
|
@ -1,235 +0,0 @@
|
||||||
# Debian Atomic Terminal Installer - Justfile
|
|
||||||
# Commands for building and testing the terminal-based installer
|
|
||||||
|
|
||||||
# Default target
|
|
||||||
default:
|
|
||||||
@just --list
|
|
||||||
|
|
||||||
# Build the container image
|
|
||||||
build:
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
echo "Building Debian Atomic Terminal Installer container..."
|
|
||||||
|
|
||||||
# Set up apt-cacher-ng proxy if available
|
|
||||||
if [ -n "$APT_CACHER_NG_PROXY" ]; then
|
|
||||||
echo "Using apt-cacher-ng proxy: $APT_CACHER_NG_PROXY"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Build the container
|
|
||||||
podman build \
|
|
||||||
--build-arg APT_CACHER_NG_PROXY="$APT_CACHER_NG_PROXY" \
|
|
||||||
-t debian-atomic-tui-installer:latest \
|
|
||||||
.
|
|
||||||
|
|
||||||
echo "✅ Container built successfully!"
|
|
||||||
|
|
||||||
# Create bootable ISO
|
|
||||||
create-iso:
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
echo "Creating bootable ISO for terminal installer..."
|
|
||||||
|
|
||||||
# Create build directory
|
|
||||||
mkdir -p build
|
|
||||||
|
|
||||||
# Extract container filesystem
|
|
||||||
echo "Extracting container filesystem..."
|
|
||||||
podman create --name temp-tui-extractor debian-atomic-tui-installer:latest
|
|
||||||
podman export temp-tui-extractor | tar -x -C build/
|
|
||||||
podman rm temp-tui-extractor
|
|
||||||
|
|
||||||
# Create ISO structure
|
|
||||||
echo "Creating ISO structure..."
|
|
||||||
mkdir -p build/iso/{boot/grub,isolinux}
|
|
||||||
|
|
||||||
# Copy kernel and initrd
|
|
||||||
if [ -f build/boot/vmlinuz-* ]; then
|
|
||||||
cp build/boot/vmlinuz-* build/iso/boot/vmlinuz
|
|
||||||
else
|
|
||||||
echo "Warning: No kernel found, creating placeholder"
|
|
||||||
echo "placeholder kernel" > build/iso/boot/vmlinuz
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f build/boot/initrd.img-* ]; then
|
|
||||||
cp build/boot/initrd.img-* build/iso/boot/initrd.img
|
|
||||||
else
|
|
||||||
echo "Warning: No initrd found, creating placeholder"
|
|
||||||
echo "placeholder initrd" > build/iso/boot/initrd.img
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create isolinux configuration
|
|
||||||
echo "DEFAULT linux" > build/iso/isolinux/isolinux.cfg
|
|
||||||
echo "TIMEOUT 30" >> build/iso/isolinux/isolinux.cfg
|
|
||||||
echo "PROMPT 1" >> build/iso/isolinux/isolinux.cfg
|
|
||||||
echo "" >> build/iso/isolinux/isolinux.cfg
|
|
||||||
echo "LABEL linux" >> build/iso/isolinux/isolinux.cfg
|
|
||||||
echo " KERNEL /boot/vmlinuz" >> build/iso/isolinux/isolinux.cfg
|
|
||||||
echo " APPEND initrd=/boot/initrd.img root=/dev/sda1 ro console=ttyS0 console=tty0" >> build/iso/isolinux/isolinux.cfg
|
|
||||||
echo "" >> build/iso/isolinux/isolinux.cfg
|
|
||||||
echo "LABEL linux-debug" >> build/iso/isolinux/isolinux.cfg
|
|
||||||
echo " KERNEL /boot/vmlinuz" >> build/iso/isolinux/isolinux.cfg
|
|
||||||
echo " APPEND initrd=/boot/initrd.img root=/dev/sda1 ro console=ttyS0 console=tty0 debug" >> build/iso/isolinux/isolinux.cfg
|
|
||||||
|
|
||||||
# Create GRUB configuration
|
|
||||||
echo "set timeout=5" > build/iso/boot/grub/grub.cfg
|
|
||||||
echo "set default=0" >> build/iso/boot/grub/grub.cfg
|
|
||||||
echo "" >> build/iso/boot/grub/grub.cfg
|
|
||||||
echo 'menuentry "Debian Atomic Terminal Installer" {' >> build/iso/boot/grub/grub.cfg
|
|
||||||
echo " linux /boot/vmlinuz root=/dev/sda1 ro console=ttyS0 console=tty0" >> build/iso/boot/grub/grub.cfg
|
|
||||||
echo " initrd /boot/initrd.img" >> build/iso/boot/grub/grub.cfg
|
|
||||||
echo "}" >> build/iso/boot/grub/grub.cfg
|
|
||||||
echo "" >> build/iso/boot/grub/grub.cfg
|
|
||||||
echo 'menuentry "Debian Atomic Terminal Installer (Debug)" {' >> build/iso/boot/grub/grub.cfg
|
|
||||||
echo " linux /boot/vmlinuz root=/dev/sda1 ro console=ttyS0 console=tty0 debug" >> build/iso/boot/grub/grub.cfg
|
|
||||||
echo " initrd /boot/initrd.img" >> build/iso/boot/grub/grub.cfg
|
|
||||||
echo "}" >> build/iso/boot/grub/grub.cfg
|
|
||||||
|
|
||||||
# Use container to create ISO (no host packages needed)
|
|
||||||
echo "Creating ISO image using container..."
|
|
||||||
podman run --rm \
|
|
||||||
-v "$(pwd)/build/iso:/iso:Z" \
|
|
||||||
-v "$(pwd)/build:/output:Z" \
|
|
||||||
debian:bookworm-slim \
|
|
||||||
bash -c "
|
|
||||||
apt-get update && apt-get install -y xorriso &&
|
|
||||||
xorriso -as mkisofs -o /output/debian-atomic-tui-installer.iso \
|
|
||||||
-b boot/vmlinuz \
|
|
||||||
-c boot/boot.cat \
|
|
||||||
-no-emul-boot \
|
|
||||||
-boot-load-size 4 \
|
|
||||||
-boot-info-table \
|
|
||||||
-r \
|
|
||||||
-J \
|
|
||||||
-joliet-long \
|
|
||||||
-V \"DEBIAN_ATOMIC_TUI\" \
|
|
||||||
/iso/
|
|
||||||
"
|
|
||||||
|
|
||||||
echo "✅ ISO created: build/debian-atomic-tui-installer.iso"
|
|
||||||
|
|
||||||
# Test the ISO in QEMU
|
|
||||||
test-iso:
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
echo "Testing ISO in QEMU..."
|
|
||||||
|
|
||||||
if [ ! -f build/debian-atomic-tui-installer.iso ]; then
|
|
||||||
echo "❌ ISO not found. Run 'just create-iso' first."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test ISO bootability
|
|
||||||
qemu-system-x86_64 \
|
|
||||||
-m 2G \
|
|
||||||
-smp 2 \
|
|
||||||
-boot d \
|
|
||||||
-cdrom build/debian-atomic-tui-installer.iso \
|
|
||||||
-display gtk \
|
|
||||||
-enable-kvm
|
|
||||||
|
|
||||||
echo "✅ ISO test completed"
|
|
||||||
|
|
||||||
# Create a simple test VM
|
|
||||||
create-test-vm:
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
echo "Creating test VM..."
|
|
||||||
|
|
||||||
# Create VM disk
|
|
||||||
qemu-img create -f qcow2 build/test-vm.qcow2 10G
|
|
||||||
|
|
||||||
# Start VM with ISO
|
|
||||||
qemu-system-x86_64 \
|
|
||||||
-m 2G \
|
|
||||||
-smp 2 \
|
|
||||||
-boot d \
|
|
||||||
-cdrom build/debian-atomic-tui-installer.iso \
|
|
||||||
-hda build/test-vm.qcow2 \
|
|
||||||
-display gtk \
|
|
||||||
-enable-kvm \
|
|
||||||
-name "Debian Atomic TUI Installer Test"
|
|
||||||
|
|
||||||
echo "✅ Test VM created"
|
|
||||||
|
|
||||||
# Clean build artifacts
|
|
||||||
clean:
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
echo "Cleaning build artifacts..."
|
|
||||||
|
|
||||||
# Remove build directory
|
|
||||||
rm -rf build/
|
|
||||||
|
|
||||||
# Remove container images
|
|
||||||
podman rmi debian-atomic-tui-installer:latest 2>/dev/null || true
|
|
||||||
|
|
||||||
echo "✅ Cleanup completed"
|
|
||||||
|
|
||||||
# Show build status
|
|
||||||
status:
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
echo "Build Status:"
|
|
||||||
echo "============="
|
|
||||||
|
|
||||||
if podman image exists debian-atomic-tui-installer:latest; then
|
|
||||||
echo "✅ Container image: debian-atomic-tui-installer:latest"
|
|
||||||
else
|
|
||||||
echo "❌ Container image: Not built"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f build/debian-atomic-tui-installer.iso ]; then
|
|
||||||
echo "✅ ISO: build/debian-atomic-tui-installer.iso"
|
|
||||||
ls -lh build/debian-atomic-tui-installer.iso
|
|
||||||
else
|
|
||||||
echo "❌ ISO: Not created"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f build/test-vm.qcow2 ]; then
|
|
||||||
echo "✅ Test VM: build/test-vm.qcow2"
|
|
||||||
ls -lh build/test-vm.qcow2
|
|
||||||
else
|
|
||||||
echo "❌ Test VM: Not created"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run container for testing
|
|
||||||
run-container:
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
echo "Running container for testing..."
|
|
||||||
|
|
||||||
podman run --rm -it \
|
|
||||||
--name debian-atomic-tui-test \
|
|
||||||
debian-atomic-tui-installer:latest
|
|
||||||
|
|
||||||
echo "✅ Container test completed"
|
|
||||||
|
|
||||||
# Extract filesystem for analysis
|
|
||||||
extract-fs:
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
echo "Extracting container filesystem..."
|
|
||||||
|
|
||||||
mkdir -p build/fs-extract
|
|
||||||
|
|
||||||
podman create --name temp-fs-extractor debian-atomic-tui-installer:latest
|
|
||||||
podman export temp-fs-extractor | tar -x -C build/fs-extract/
|
|
||||||
podman rm temp-fs-extractor
|
|
||||||
|
|
||||||
echo "✅ Filesystem extracted to build/fs-extract/"
|
|
||||||
|
|
||||||
# Show help
|
|
||||||
help:
|
|
||||||
@echo "Debian Atomic Terminal Installer - Available Commands"
|
|
||||||
@echo "=================================================="
|
|
||||||
@echo ""
|
|
||||||
@echo "Build Commands:"
|
|
||||||
@echo " build - Build the container image"
|
|
||||||
@echo " create-iso - Create bootable ISO"
|
|
||||||
@echo " extract-fs - Extract container filesystem for analysis"
|
|
||||||
@echo ""
|
|
||||||
@echo "Test Commands:"
|
|
||||||
@echo " test-iso - Test ISO in QEMU"
|
|
||||||
@echo " create-test-vm - Create and run test VM"
|
|
||||||
@echo " run-container - Run container for testing"
|
|
||||||
@echo ""
|
|
||||||
@echo "Utility Commands:"
|
|
||||||
@echo " status - Show build status"
|
|
||||||
@echo " clean - Clean build artifacts"
|
|
||||||
@echo " help - Show this help"
|
|
||||||
@echo ""
|
|
||||||
@echo "Environment Variables:"
|
|
||||||
@echo " APT_CACHER_NG_PROXY - Proxy for apt-cacher-ng (optional)"
|
|
||||||
|
|
@ -1,276 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Debian Atomic Terminal Installer
|
|
||||||
# Automated installation script for Debian Atomic
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Colors for output
|
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
# Configuration
|
|
||||||
TARGET_DEVICE="/dev/sda"
|
|
||||||
ROOT_PARTITION="/dev/sda1"
|
|
||||||
BOOT_PARTITION="/dev/sda2"
|
|
||||||
SWAP_PARTITION="/dev/sda3"
|
|
||||||
USERNAME="debian"
|
|
||||||
HOSTNAME="debian-atomic"
|
|
||||||
TIMEZONE="UTC"
|
|
||||||
|
|
||||||
# Logging
|
|
||||||
LOG_FILE="/tmp/install.log"
|
|
||||||
exec > >(tee -a "$LOG_FILE") 2>&1
|
|
||||||
|
|
||||||
log() {
|
|
||||||
echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
warn() {
|
|
||||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
error() {
|
|
||||||
echo -e "${RED}[ERROR]${NC} $1"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check if running as root
|
|
||||||
check_root() {
|
|
||||||
if [[ $EUID -ne 0 ]]; then
|
|
||||||
error "This script must be run as root"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check if we're in a live environment
|
|
||||||
check_live_environment() {
|
|
||||||
if ! mountpoint -q /run/archiso/bootmnt 2>/dev/null && ! grep -q "boot=live" /proc/cmdline; then
|
|
||||||
warn "This doesn't appear to be a live environment. Proceed anyway? (y/N)"
|
|
||||||
read -r response
|
|
||||||
if [[ ! "$response" =~ ^[Yy]$ ]]; then
|
|
||||||
error "Installation aborted"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Detect target device
|
|
||||||
detect_target_device() {
|
|
||||||
log "Detecting target device..."
|
|
||||||
|
|
||||||
# List available block devices
|
|
||||||
echo "Available block devices:"
|
|
||||||
lsblk -d -o NAME,SIZE,TYPE
|
|
||||||
|
|
||||||
# Try to auto-detect the target device
|
|
||||||
if [[ "$TARGET_DEVICE" == "/dev/sda" ]]; then
|
|
||||||
# Look for the largest non-removable disk
|
|
||||||
local largest_disk=""
|
|
||||||
local largest_size=0
|
|
||||||
|
|
||||||
for disk in /dev/sd* /dev/vd* /dev/nvme*; do
|
|
||||||
if [[ -b "$disk" ]]; then
|
|
||||||
local size=$(lsblk -d -n -o SIZE "$disk" | sed 's/[^0-9]//g')
|
|
||||||
if [[ "$size" -gt "$largest_size" ]]; then
|
|
||||||
largest_size="$size"
|
|
||||||
largest_disk="$disk"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ -n "$largest_disk" ]]; then
|
|
||||||
TARGET_DEVICE="$largest_disk"
|
|
||||||
log "Auto-detected target device: $TARGET_DEVICE"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Target device: $TARGET_DEVICE"
|
|
||||||
echo "Proceed with installation? (y/N)"
|
|
||||||
read -r response
|
|
||||||
if [[ ! "$response" =~ ^[Yy]$ ]]; then
|
|
||||||
error "Installation aborted"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Partition the target device
|
|
||||||
partition_device() {
|
|
||||||
log "Partitioning target device: $TARGET_DEVICE"
|
|
||||||
|
|
||||||
# Create partition table
|
|
||||||
parted "$TARGET_DEVICE" mklabel gpt
|
|
||||||
|
|
||||||
# Create partitions
|
|
||||||
# Boot partition (512MB)
|
|
||||||
parted "$TARGET_DEVICE" mkpart primary fat32 1MiB 513MiB
|
|
||||||
parted "$TARGET_DEVICE" set 1 boot on
|
|
||||||
|
|
||||||
# Root partition (rest of disk minus 8GB for swap)
|
|
||||||
local total_size=$(parted "$TARGET_DEVICE" unit MiB print | grep "Disk $TARGET_DEVICE" | awk '{print $3}' | sed 's/MiB//')
|
|
||||||
local root_end=$((total_size - 8192))
|
|
||||||
parted "$TARGET_DEVICE" mkpart primary ext4 513MiB ${root_end}MiB
|
|
||||||
|
|
||||||
# Swap partition (8GB)
|
|
||||||
parted "$TARGET_DEVICE" mkpart primary linux-swap ${root_end}MiB 100%
|
|
||||||
|
|
||||||
# Update partition variables
|
|
||||||
ROOT_PARTITION="${TARGET_DEVICE}2"
|
|
||||||
BOOT_PARTITION="${TARGET_DEVICE}1"
|
|
||||||
SWAP_PARTITION="${TARGET_DEVICE}3"
|
|
||||||
|
|
||||||
log "Partitioning complete"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Format partitions
|
|
||||||
format_partitions() {
|
|
||||||
log "Formatting partitions..."
|
|
||||||
|
|
||||||
# Format boot partition
|
|
||||||
mkfs.fat -F32 "$BOOT_PARTITION"
|
|
||||||
|
|
||||||
# Format root partition
|
|
||||||
mkfs.ext4 "$ROOT_PARTITION"
|
|
||||||
|
|
||||||
# Format swap partition
|
|
||||||
mkswap "$SWAP_PARTITION"
|
|
||||||
|
|
||||||
log "Partition formatting complete"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Mount target filesystem
|
|
||||||
mount_target() {
|
|
||||||
log "Mounting target filesystem..."
|
|
||||||
|
|
||||||
# Create mount point
|
|
||||||
mkdir -p /mnt/target
|
|
||||||
|
|
||||||
# Mount root partition
|
|
||||||
mount "$ROOT_PARTITION" /mnt/target
|
|
||||||
|
|
||||||
# Create and mount boot directory
|
|
||||||
mkdir -p /mnt/target/boot
|
|
||||||
mount "$BOOT_PARTITION" /mnt/target/boot
|
|
||||||
|
|
||||||
# Mount necessary filesystems
|
|
||||||
mount --bind /dev /mnt/target/dev
|
|
||||||
mount --bind /proc /mnt/target/proc
|
|
||||||
mount --bind /sys /mnt/target/sys
|
|
||||||
mount --bind /run /mnt/target/run
|
|
||||||
|
|
||||||
log "Target filesystem mounted"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Install base system
|
|
||||||
install_base_system() {
|
|
||||||
log "Installing base system..."
|
|
||||||
|
|
||||||
# Use debootstrap to install base system
|
|
||||||
debootstrap --arch=amd64 --variant=minbase bookworm /mnt/target http://deb.debian.org/debian/
|
|
||||||
|
|
||||||
# Configure apt sources
|
|
||||||
cat > /mnt/target/etc/apt/sources.list << EOF
|
|
||||||
deb http://deb.debian.org/debian bookworm main
|
|
||||||
deb http://deb.debian.org/debian bookworm-updates main
|
|
||||||
deb http://security.debian.org/debian-security bookworm-security main
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Configure hostname
|
|
||||||
echo "$HOSTNAME" > /mnt/target/etc/hostname
|
|
||||||
|
|
||||||
# Configure timezone
|
|
||||||
ln -sf /usr/share/zoneinfo/$TIMEZONE /mnt/target/etc/localtime
|
|
||||||
|
|
||||||
log "Base system installation complete"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Install bootc and configure boot
|
|
||||||
install_bootc() {
|
|
||||||
log "Installing bootc..."
|
|
||||||
|
|
||||||
# Chroot into target and install bootc
|
|
||||||
chroot /mnt/target bash -c "
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y bootc
|
|
||||||
bootc install-to-disk --target /dev/sda
|
|
||||||
"
|
|
||||||
|
|
||||||
log "Bootc installation complete"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Create user account
|
|
||||||
create_user() {
|
|
||||||
log "Creating user account: $USERNAME"
|
|
||||||
|
|
||||||
chroot /mnt/target bash -c "
|
|
||||||
useradd -m -s /bin/bash $USERNAME
|
|
||||||
echo '$USERNAME ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/$USERNAME
|
|
||||||
chmod 0440 /etc/sudoers.d/$USERNAME
|
|
||||||
"
|
|
||||||
|
|
||||||
log "User account created"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Configure network
|
|
||||||
configure_network() {
|
|
||||||
log "Configuring network..."
|
|
||||||
|
|
||||||
# Enable systemd-networkd
|
|
||||||
chroot /mnt/target bash -c "
|
|
||||||
systemctl enable systemd-networkd
|
|
||||||
systemctl enable systemd-resolved
|
|
||||||
"
|
|
||||||
|
|
||||||
# Create basic network configuration
|
|
||||||
cat > /mnt/target/etc/systemd/network/20-wired.network << EOF
|
|
||||||
[Match]
|
|
||||||
Name=en*
|
|
||||||
|
|
||||||
[Network]
|
|
||||||
DHCP=yes
|
|
||||||
EOF
|
|
||||||
|
|
||||||
log "Network configuration complete"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Finalize installation
|
|
||||||
finalize_installation() {
|
|
||||||
log "Finalizing installation..."
|
|
||||||
|
|
||||||
# Generate initramfs
|
|
||||||
chroot /mnt/target bash -c "
|
|
||||||
update-initramfs -u -k all
|
|
||||||
"
|
|
||||||
|
|
||||||
# Unmount filesystems
|
|
||||||
umount /mnt/target/run
|
|
||||||
umount /mnt/target/sys
|
|
||||||
umount /mnt/target/proc
|
|
||||||
umount /mnt/target/dev
|
|
||||||
umount /mnt/target/boot
|
|
||||||
umount /mnt/target
|
|
||||||
|
|
||||||
log "Installation complete!"
|
|
||||||
log "You can now reboot to boot into your new Debian Atomic system."
|
|
||||||
}
|
|
||||||
|
|
||||||
# Main installation function
|
|
||||||
main() {
|
|
||||||
log "Starting Debian Atomic Terminal Installer"
|
|
||||||
|
|
||||||
check_root
|
|
||||||
check_live_environment
|
|
||||||
detect_target_device
|
|
||||||
partition_device
|
|
||||||
format_partitions
|
|
||||||
mount_target
|
|
||||||
install_base_system
|
|
||||||
install_bootc
|
|
||||||
create_user
|
|
||||||
configure_network
|
|
||||||
finalize_installation
|
|
||||||
|
|
||||||
log "Installation completed successfully!"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Run main function
|
|
||||||
main "$@"
|
|
||||||
|
|
@ -1,225 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Safe Testing Script for Debian Atomic Terminal Installer
|
|
||||||
# This script ONLY uses containers and never touches the host system
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Colors for output
|
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
log() {
|
|
||||||
echo -e "${GREEN}[SAFE-TEST]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
warn() {
|
|
||||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
error() {
|
|
||||||
echo -e "${RED}[ERROR]${NC} $1"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test 1: Container build
|
|
||||||
test_container_build() {
|
|
||||||
log "Testing container build..."
|
|
||||||
|
|
||||||
if just build; then
|
|
||||||
log "✅ Container built successfully"
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
error "❌ Container build failed"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test 2: Container functionality (safe)
|
|
||||||
test_container_functionality() {
|
|
||||||
log "Testing container functionality..."
|
|
||||||
|
|
||||||
# Test if container can start
|
|
||||||
if podman run --rm --entrypoint /bin/bash debian-atomic-tui-installer:latest -c "echo 'Container is working'"; then
|
|
||||||
log "✅ Container can start and run commands"
|
|
||||||
else
|
|
||||||
error "❌ Container cannot start"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test if install script exists
|
|
||||||
if podman run --rm --entrypoint /bin/bash debian-atomic-tui-installer:latest -c "test -f /usr/local/bin/install-debian-atomic"; then
|
|
||||||
log "✅ Install script exists in container"
|
|
||||||
else
|
|
||||||
error "❌ Install script not found in container"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test if welcome script exists
|
|
||||||
if podman run --rm --entrypoint /bin/bash debian-atomic-tui-installer:latest -c "test -f /usr/local/bin/welcome"; then
|
|
||||||
log "✅ Welcome script exists in container"
|
|
||||||
else
|
|
||||||
error "❌ Welcome script not found in container"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test if help script exists
|
|
||||||
if podman run --rm --entrypoint /bin/bash debian-atomic-tui-installer:latest -c "test -f /usr/local/bin/help"; then
|
|
||||||
log "✅ Help script exists in container"
|
|
||||||
else
|
|
||||||
error "❌ Help script not found in container"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test 3: Script syntax validation
|
|
||||||
test_script_syntax() {
|
|
||||||
log "Testing script syntax..."
|
|
||||||
|
|
||||||
# Test installation script syntax
|
|
||||||
if bash -n scripts/install.sh; then
|
|
||||||
log "✅ Installation script syntax is valid"
|
|
||||||
else
|
|
||||||
error "❌ Installation script has syntax errors"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test test script syntax
|
|
||||||
if bash -n scripts/test-container.sh; then
|
|
||||||
log "✅ Test script syntax is valid"
|
|
||||||
else
|
|
||||||
error "❌ Test script has syntax errors"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test 4: Configuration files
|
|
||||||
test_config_files() {
|
|
||||||
log "Testing configuration files..."
|
|
||||||
|
|
||||||
if [ -f config/installer.conf ]; then
|
|
||||||
log "✅ Configuration file exists"
|
|
||||||
else
|
|
||||||
error "❌ Configuration file not found"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f README.md ]; then
|
|
||||||
log "✅ README exists"
|
|
||||||
else
|
|
||||||
error "❌ README not found"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f QUICK_START.md ]; then
|
|
||||||
log "✅ Quick start guide exists"
|
|
||||||
else
|
|
||||||
error "❌ Quick start guide not found"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test 5: Justfile commands
|
|
||||||
test_justfile() {
|
|
||||||
log "Testing justfile commands..."
|
|
||||||
|
|
||||||
# Test help command
|
|
||||||
if just help > /dev/null 2>&1; then
|
|
||||||
log "✅ Help command works"
|
|
||||||
else
|
|
||||||
warn "⚠️ Help command failed"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test status command
|
|
||||||
if just status > /dev/null 2>&1; then
|
|
||||||
log "✅ Status command works"
|
|
||||||
else
|
|
||||||
warn "⚠️ Status command failed"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test 6: Container filesystem extraction (safe)
|
|
||||||
test_filesystem_extraction() {
|
|
||||||
log "Testing filesystem extraction..."
|
|
||||||
|
|
||||||
# Create a temporary container to extract filesystem
|
|
||||||
local temp_container="temp-extract-$(date +%s)"
|
|
||||||
|
|
||||||
# Create container
|
|
||||||
podman create --name "$temp_container" debian-atomic-tui-installer:latest
|
|
||||||
|
|
||||||
# Extract filesystem to build directory
|
|
||||||
if podman export "$temp_container" | tar -x -C build/ 2>/dev/null; then
|
|
||||||
log "✅ Filesystem extraction works"
|
|
||||||
|
|
||||||
# Check for key files
|
|
||||||
if [ -f build/boot/vmlinuz-* ]; then
|
|
||||||
log "✅ Kernel found in extracted filesystem"
|
|
||||||
else
|
|
||||||
warn "⚠️ Kernel not found in extracted filesystem"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f build/boot/initrd.img-* ]; then
|
|
||||||
log "✅ Initrd found in extracted filesystem"
|
|
||||||
else
|
|
||||||
warn "⚠️ Initrd not found in extracted filesystem"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f build/usr/local/bin/install-debian-atomic ]; then
|
|
||||||
log "✅ Install script found in extracted filesystem"
|
|
||||||
else
|
|
||||||
warn "⚠️ Install script not found in extracted filesystem"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
error "❌ Filesystem extraction failed"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Clean up
|
|
||||||
podman rm "$temp_container" > /dev/null 2>&1 || true
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test 7: Container cleanup
|
|
||||||
test_container_cleanup() {
|
|
||||||
log "Testing container cleanup..."
|
|
||||||
|
|
||||||
# Remove any existing test containers
|
|
||||||
podman rm -f test-tui-installer 2>/dev/null || true
|
|
||||||
|
|
||||||
log "✅ Container cleanup completed"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Run all safe tests
|
|
||||||
run_safe_tests() {
|
|
||||||
log "Starting safe container-based tests..."
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
test_script_syntax
|
|
||||||
test_config_files
|
|
||||||
test_justfile
|
|
||||||
test_container_build
|
|
||||||
test_container_functionality
|
|
||||||
test_filesystem_extraction
|
|
||||||
test_container_cleanup
|
|
||||||
|
|
||||||
log "All safe tests completed successfully!"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Main function
|
|
||||||
main() {
|
|
||||||
echo "Debian Atomic Terminal Installer - Safe Test Suite"
|
|
||||||
echo "================================================"
|
|
||||||
echo ""
|
|
||||||
echo "This test suite ONLY uses containers and never touches the host system."
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
run_safe_tests
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "✅ All safe tests passed!"
|
|
||||||
echo ""
|
|
||||||
echo "The terminal installer is ready for use."
|
|
||||||
echo ""
|
|
||||||
echo "Next steps:"
|
|
||||||
echo "1. Install genisoimage: sudo dnf install genisoimage"
|
|
||||||
echo "2. Create ISO: just create-iso"
|
|
||||||
echo "3. Test ISO: just test-iso"
|
|
||||||
echo "4. Use in VM or on hardware"
|
|
||||||
echo ""
|
|
||||||
echo "Note: All testing is done safely in containers only."
|
|
||||||
}
|
|
||||||
|
|
||||||
# Run main function
|
|
||||||
main "$@"
|
|
||||||
|
|
@ -1,173 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Test script for Debian Atomic Terminal Installer using podman container
|
|
||||||
# This script tests the installation process in a controlled container environment
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Colors for output
|
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
log() {
|
|
||||||
echo -e "${GREEN}[TEST]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
warn() {
|
|
||||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
error() {
|
|
||||||
echo -e "${RED}[ERROR]${NC} $1"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test container build
|
|
||||||
test_container_build() {
|
|
||||||
log "Testing container build..."
|
|
||||||
|
|
||||||
if just build; then
|
|
||||||
log "✅ Container built successfully"
|
|
||||||
else
|
|
||||||
error "❌ Container build failed"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test container run
|
|
||||||
test_container_run() {
|
|
||||||
log "Testing container run..."
|
|
||||||
|
|
||||||
# Run container in background
|
|
||||||
podman run --rm -d --name test-tui-installer debian-atomic-tui-installer:latest
|
|
||||||
|
|
||||||
# Wait a moment for container to start
|
|
||||||
sleep 2
|
|
||||||
|
|
||||||
# Check if container is running
|
|
||||||
if podman ps | grep -q test-tui-installer; then
|
|
||||||
log "✅ Container is running"
|
|
||||||
|
|
||||||
# Test basic functionality
|
|
||||||
if podman exec test-tui-installer which install-debian-atomic; then
|
|
||||||
log "✅ Install script found"
|
|
||||||
else
|
|
||||||
warn "⚠️ Install script not found"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if podman exec test-tui-installer which welcome; then
|
|
||||||
log "✅ Welcome script found"
|
|
||||||
else
|
|
||||||
warn "⚠️ Welcome script not found"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Stop container
|
|
||||||
podman stop test-tui-installer
|
|
||||||
log "✅ Container stopped"
|
|
||||||
else
|
|
||||||
error "❌ Container failed to start"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test ISO creation
|
|
||||||
test_iso_creation() {
|
|
||||||
log "Testing ISO creation..."
|
|
||||||
|
|
||||||
if just create-iso; then
|
|
||||||
log "✅ ISO created successfully"
|
|
||||||
|
|
||||||
# Check if ISO file exists
|
|
||||||
if [ -f build/debian-atomic-tui-installer.iso ]; then
|
|
||||||
log "✅ ISO file exists"
|
|
||||||
ls -lh build/debian-atomic-tui-installer.iso
|
|
||||||
else
|
|
||||||
error "❌ ISO file not found"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
error "❌ ISO creation failed"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test installation script syntax
|
|
||||||
test_script_syntax() {
|
|
||||||
log "Testing installation script syntax..."
|
|
||||||
|
|
||||||
if bash -n scripts/install.sh; then
|
|
||||||
log "✅ Installation script syntax is valid"
|
|
||||||
else
|
|
||||||
error "❌ Installation script has syntax errors"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test configuration file
|
|
||||||
test_config_file() {
|
|
||||||
log "Testing configuration file..."
|
|
||||||
|
|
||||||
if [ -f config/installer.conf ]; then
|
|
||||||
log "✅ Configuration file exists"
|
|
||||||
|
|
||||||
# Check if file is readable
|
|
||||||
if [ -r config/installer.conf ]; then
|
|
||||||
log "✅ Configuration file is readable"
|
|
||||||
else
|
|
||||||
warn "⚠️ Configuration file is not readable"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
error "❌ Configuration file not found"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test justfile commands
|
|
||||||
test_justfile() {
|
|
||||||
log "Testing justfile commands..."
|
|
||||||
|
|
||||||
# Test help command
|
|
||||||
if just help > /dev/null 2>&1; then
|
|
||||||
log "✅ Help command works"
|
|
||||||
else
|
|
||||||
warn "⚠️ Help command failed"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test status command
|
|
||||||
if just status > /dev/null 2>&1; then
|
|
||||||
log "✅ Status command works"
|
|
||||||
else
|
|
||||||
warn "⚠️ Status command failed"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Run all tests
|
|
||||||
run_tests() {
|
|
||||||
log "Starting container-based tests..."
|
|
||||||
|
|
||||||
test_script_syntax
|
|
||||||
test_config_file
|
|
||||||
test_justfile
|
|
||||||
test_container_build
|
|
||||||
test_container_run
|
|
||||||
test_iso_creation
|
|
||||||
|
|
||||||
log "All container-based tests completed successfully!"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Main function
|
|
||||||
main() {
|
|
||||||
echo "Debian Atomic Terminal Installer - Container Test Suite"
|
|
||||||
echo "====================================================="
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
run_tests
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "✅ All container-based tests passed!"
|
|
||||||
echo "The terminal installer is ready for use."
|
|
||||||
echo ""
|
|
||||||
echo "Next steps:"
|
|
||||||
echo "1. Run 'just test-iso' to test the ISO in QEMU"
|
|
||||||
echo "2. Run 'just create-test-vm' to create a test VM"
|
|
||||||
echo "3. Use the ISO in a real VM or on hardware"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Run main function
|
|
||||||
main "$@"
|
|
||||||
|
|
@ -1,234 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Test script for Debian Atomic Terminal Installer
|
|
||||||
# This script tests the installation process in a controlled environment
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Colors for output
|
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
# Test configuration
|
|
||||||
TEST_DEVICE="/dev/loop0"
|
|
||||||
TEST_SIZE="2G"
|
|
||||||
TEST_MOUNT="/mnt/test-install"
|
|
||||||
|
|
||||||
log() {
|
|
||||||
echo -e "${GREEN}[TEST]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
warn() {
|
|
||||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
error() {
|
|
||||||
echo -e "${RED}[ERROR]${NC} $1"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check if running as root
|
|
||||||
check_root() {
|
|
||||||
if [[ $EUID -ne 0 ]]; then
|
|
||||||
error "This test script must be run as root"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Create test device
|
|
||||||
create_test_device() {
|
|
||||||
log "Creating test device..."
|
|
||||||
|
|
||||||
# Create a loopback device for testing
|
|
||||||
dd if=/dev/zero of=test-disk.img bs=1M count=2048
|
|
||||||
losetup "$TEST_DEVICE" test-disk.img
|
|
||||||
|
|
||||||
log "Test device created: $TEST_DEVICE"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test partitioning
|
|
||||||
test_partitioning() {
|
|
||||||
log "Testing partitioning..."
|
|
||||||
|
|
||||||
# Create partition table
|
|
||||||
parted "$TEST_DEVICE" mklabel gpt
|
|
||||||
|
|
||||||
# Get device size in MiB
|
|
||||||
local device_size=$(parted "$TEST_DEVICE" unit MiB print | grep "Disk $TEST_DEVICE" | awk '{print $3}' | sed 's/MiB//')
|
|
||||||
local boot_end=512
|
|
||||||
local root_end=$((device_size - 1024)) # Leave 1GB for swap
|
|
||||||
|
|
||||||
# Create test partitions
|
|
||||||
parted "$TEST_DEVICE" mkpart primary fat32 1MiB ${boot_end}MiB
|
|
||||||
parted "$TEST_DEVICE" set 1 boot on
|
|
||||||
parted "$TEST_DEVICE" mkpart primary ext4 ${boot_end}MiB ${root_end}MiB
|
|
||||||
parted "$TEST_DEVICE" mkpart primary linux-swap ${root_end}MiB 100%
|
|
||||||
|
|
||||||
log "Partitioning test completed"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test filesystem creation
|
|
||||||
test_filesystems() {
|
|
||||||
log "Testing filesystem creation..."
|
|
||||||
|
|
||||||
# Format partitions
|
|
||||||
mkfs.fat -F32 "${TEST_DEVICE}p1"
|
|
||||||
mkfs.ext4 "${TEST_DEVICE}p2"
|
|
||||||
mkswap "${TEST_DEVICE}p3"
|
|
||||||
|
|
||||||
log "Filesystem creation test completed"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test mounting
|
|
||||||
test_mounting() {
|
|
||||||
log "Testing mounting..."
|
|
||||||
|
|
||||||
# Create mount point
|
|
||||||
mkdir -p "$TEST_MOUNT"
|
|
||||||
|
|
||||||
# Mount root partition
|
|
||||||
mount "${TEST_DEVICE}p2" "$TEST_MOUNT"
|
|
||||||
|
|
||||||
# Create and mount boot directory
|
|
||||||
mkdir -p "$TEST_MOUNT/boot"
|
|
||||||
mount "${TEST_DEVICE}p1" "$TEST_MOUNT/boot"
|
|
||||||
|
|
||||||
# Create necessary directories for bind mounts
|
|
||||||
mkdir -p "$TEST_MOUNT/dev"
|
|
||||||
mkdir -p "$TEST_MOUNT/proc"
|
|
||||||
mkdir -p "$TEST_MOUNT/sys"
|
|
||||||
mkdir -p "$TEST_MOUNT/run"
|
|
||||||
|
|
||||||
# Mount necessary filesystems
|
|
||||||
mount --bind /dev "$TEST_MOUNT/dev"
|
|
||||||
mount --bind /proc "$TEST_MOUNT/proc"
|
|
||||||
mount --bind /sys "$TEST_MOUNT/sys"
|
|
||||||
mount --bind /run "$TEST_MOUNT/run"
|
|
||||||
|
|
||||||
log "Mounting test completed"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test base system installation
|
|
||||||
test_base_installation() {
|
|
||||||
log "Testing base system installation..."
|
|
||||||
|
|
||||||
# Use debootstrap to install minimal system
|
|
||||||
debootstrap --arch=amd64 --variant=minbase bookworm "$TEST_MOUNT" http://deb.debian.org/debian/
|
|
||||||
|
|
||||||
# Configure basic system
|
|
||||||
echo "test-host" > "$TEST_MOUNT/etc/hostname"
|
|
||||||
echo "127.0.0.1 localhost test-host" > "$TEST_MOUNT/etc/hosts"
|
|
||||||
|
|
||||||
# Configure apt sources
|
|
||||||
cat > "$TEST_MOUNT/etc/apt/sources.list" << EOF
|
|
||||||
deb http://deb.debian.org/debian bookworm main
|
|
||||||
deb http://deb.debian.org/debian bookworm-updates main
|
|
||||||
deb http://security.debian.org/debian-security bookworm-security main
|
|
||||||
EOF
|
|
||||||
|
|
||||||
log "Base system installation test completed"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test user creation
|
|
||||||
test_user_creation() {
|
|
||||||
log "Testing user creation..."
|
|
||||||
|
|
||||||
# Create test user
|
|
||||||
chroot "$TEST_MOUNT" bash -c "
|
|
||||||
useradd -m -s /bin/bash testuser
|
|
||||||
echo 'testuser ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/testuser
|
|
||||||
chmod 0440 /etc/sudoers.d/testuser
|
|
||||||
"
|
|
||||||
|
|
||||||
log "User creation test completed"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test network configuration
|
|
||||||
test_network_config() {
|
|
||||||
log "Testing network configuration..."
|
|
||||||
|
|
||||||
# Enable systemd services
|
|
||||||
chroot "$TEST_MOUNT" bash -c "
|
|
||||||
systemctl enable systemd-networkd
|
|
||||||
systemctl enable systemd-resolved
|
|
||||||
"
|
|
||||||
|
|
||||||
# Create network configuration
|
|
||||||
mkdir -p "$TEST_MOUNT/etc/systemd/network"
|
|
||||||
cat > "$TEST_MOUNT/etc/systemd/network/20-wired.network" << EOF
|
|
||||||
[Match]
|
|
||||||
Name=en*
|
|
||||||
|
|
||||||
[Network]
|
|
||||||
DHCP=yes
|
|
||||||
EOF
|
|
||||||
|
|
||||||
log "Network configuration test completed"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test boot configuration
|
|
||||||
test_boot_config() {
|
|
||||||
log "Testing boot configuration..."
|
|
||||||
|
|
||||||
# Install bootc
|
|
||||||
chroot "$TEST_MOUNT" bash -c "
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y bootc
|
|
||||||
"
|
|
||||||
|
|
||||||
log "Boot configuration test completed"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test cleanup
|
|
||||||
test_cleanup() {
|
|
||||||
log "Testing cleanup..."
|
|
||||||
|
|
||||||
# Unmount filesystems
|
|
||||||
umount "$TEST_MOUNT/run"
|
|
||||||
umount "$TEST_MOUNT/sys"
|
|
||||||
umount "$TEST_MOUNT/proc"
|
|
||||||
umount "$TEST_MOUNT/dev"
|
|
||||||
umount "$TEST_MOUNT/boot"
|
|
||||||
umount "$TEST_MOUNT"
|
|
||||||
|
|
||||||
# Clean up loopback device
|
|
||||||
losetup -d "$TEST_DEVICE"
|
|
||||||
rm -f test-disk.img
|
|
||||||
|
|
||||||
log "Cleanup test completed"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Run all tests
|
|
||||||
run_tests() {
|
|
||||||
log "Starting installation tests..."
|
|
||||||
|
|
||||||
check_root
|
|
||||||
create_test_device
|
|
||||||
test_partitioning
|
|
||||||
test_filesystems
|
|
||||||
test_mounting
|
|
||||||
test_base_installation
|
|
||||||
test_user_creation
|
|
||||||
test_network_config
|
|
||||||
test_boot_config
|
|
||||||
test_cleanup
|
|
||||||
|
|
||||||
log "All tests completed successfully!"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Main function
|
|
||||||
main() {
|
|
||||||
echo "Debian Atomic Terminal Installer - Test Suite"
|
|
||||||
echo "============================================="
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
run_tests
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "✅ All installation tests passed!"
|
|
||||||
echo "The terminal installer should work correctly."
|
|
||||||
}
|
|
||||||
|
|
||||||
# Run main function
|
|
||||||
main "$@"
|
|
||||||
|
|
@ -1,198 +0,0 @@
|
||||||
FROM debian:trixie
|
|
||||||
|
|
||||||
# Configure apt-cacher-ng proxy if available
|
|
||||||
ARG APT_CACHER_NG_PROXY
|
|
||||||
RUN if [ -n "$APT_CACHER_NG_PROXY" ]; then \
|
|
||||||
echo "Acquire::http::Proxy \"$APT_CACHER_NG_PROXY\";" > /etc/apt/apt.conf.d/99proxy; \
|
|
||||||
echo "Acquire::https::Proxy \"$APT_CACHER_NG_PROXY\";" >> /etc/apt/apt.conf.d/99proxy; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Install essential packages for a bootc installer
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
systemd \
|
|
||||||
dbus \
|
|
||||||
sudo \
|
|
||||||
systemd-sysv \
|
|
||||||
systemd-timesyncd \
|
|
||||||
network-manager \
|
|
||||||
openssh-server \
|
|
||||||
curl \
|
|
||||||
wget \
|
|
||||||
vim \
|
|
||||||
less \
|
|
||||||
htop \
|
|
||||||
# Calamares and its dependencies
|
|
||||||
calamares \
|
|
||||||
calamares-settings-debian \
|
|
||||||
# X11 and display manager for graphical installer
|
|
||||||
xorg \
|
|
||||||
xinit \
|
|
||||||
lightdm \
|
|
||||||
openbox \
|
|
||||||
xterm \
|
|
||||||
# Qt and X11 dependencies for Calamares
|
|
||||||
libxcb-cursor0 \
|
|
||||||
libxcb-xinerama0 \
|
|
||||||
libxcb-randr0 \
|
|
||||||
libqt6gui6 \
|
|
||||||
libqt6widgets6 \
|
|
||||||
qml6-module-qtquick \
|
|
||||||
qml6-module-qtquick-controls \
|
|
||||||
qml6-module-qtquick-layouts \
|
|
||||||
# Bootc for atomic deployment (will install from source)
|
|
||||||
# bootc \
|
|
||||||
# Additional installer tools
|
|
||||||
parted \
|
|
||||||
gdisk \
|
|
||||||
fdisk \
|
|
||||||
e2fsprogs \
|
|
||||||
dosfstools \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Install bootc dependencies and ISO creation tools
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
# Bootc and ostree dependencies (excluding libostree-1-1 as we'll install custom version)
|
|
||||||
libarchive13t64 \
|
|
||||||
libavahi-client3 \
|
|
||||||
libavahi-common3 \
|
|
||||||
libavahi-glib1 \
|
|
||||||
libcurl3t64-gnutls \
|
|
||||||
libgpgme11t64 \
|
|
||||||
libglib2.0-0t64 \
|
|
||||||
libapt-pkg7.0 \
|
|
||||||
podman \
|
|
||||||
skopeo \
|
|
||||||
# Linux kernel for bootable ISO
|
|
||||||
linux-image-amd64 \
|
|
||||||
# ISO creation tools
|
|
||||||
genisoimage \
|
|
||||||
isolinux \
|
|
||||||
xorriso \
|
|
||||||
# Additional useful tools
|
|
||||||
squashfs-tools \
|
|
||||||
live-boot \
|
|
||||||
live-config \
|
|
||||||
live-tools \
|
|
||||||
# Development and debugging tools
|
|
||||||
strace \
|
|
||||||
lsof \
|
|
||||||
procps \
|
|
||||||
psmisc \
|
|
||||||
# Network tools
|
|
||||||
net-tools \
|
|
||||||
iproute2 \
|
|
||||||
# File system tools
|
|
||||||
mount \
|
|
||||||
util-linux \
|
|
||||||
# Text processing (grep, sed, awk are usually pre-installed)
|
|
||||||
# grep \
|
|
||||||
# sed \
|
|
||||||
# awk \
|
|
||||||
# Compression tools
|
|
||||||
gzip \
|
|
||||||
bzip2 \
|
|
||||||
xz-utils \
|
|
||||||
# Archive tools
|
|
||||||
tar \
|
|
||||||
zip \
|
|
||||||
unzip \
|
|
||||||
# Build tools
|
|
||||||
build-essential \
|
|
||||||
pkg-config \
|
|
||||||
cmake \
|
|
||||||
git \
|
|
||||||
# Python for potential scripts
|
|
||||||
python3 \
|
|
||||||
python3-pip \
|
|
||||||
# Additional utilities
|
|
||||||
tree \
|
|
||||||
mc \
|
|
||||||
nano \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Copy custom packages into the container
|
|
||||||
COPY 02-installer-bootc/debs/ /tmp/custom-packages/
|
|
||||||
|
|
||||||
# Install custom bootc, ostree, and apt-ostree packages
|
|
||||||
RUN echo "Installing custom packages..." && \
|
|
||||||
cd /tmp/custom-packages && \
|
|
||||||
echo "Installing bootc packages..." && \
|
|
||||||
dpkg -i bootc_1.5.1-1~trixie1_amd64.deb bootc-dev_1.5.1-1~trixie1_amd64.deb || true && \
|
|
||||||
echo "Installing ostree packages..." && \
|
|
||||||
dpkg -i ostree_2025.2-1~trixie1_amd64.deb libostree-1-1_2025.2-1~trixie1_amd64.deb libostree-dev_2025.2-1~trixie1_amd64.deb ostree-boot_2025.2-1~trixie1_amd64.deb || true && \
|
|
||||||
echo "Installing apt-ostree package..." && \
|
|
||||||
dpkg -i apt-ostree_0.1.0-1~trixie1_amd64.deb || true && \
|
|
||||||
echo "Fixing dependencies..." && \
|
|
||||||
apt-get install -f -y && \
|
|
||||||
echo "Cleaning up..." && \
|
|
||||||
rm -rf /tmp/custom-packages
|
|
||||||
|
|
||||||
# Create ISO creation workspace
|
|
||||||
RUN mkdir -p /opt/iso-workspace /opt/iso-output
|
|
||||||
WORKDIR /opt/iso-workspace
|
|
||||||
|
|
||||||
# Enable systemd services
|
|
||||||
RUN systemctl enable systemd-timesyncd
|
|
||||||
RUN systemctl enable NetworkManager
|
|
||||||
RUN systemctl enable ssh
|
|
||||||
RUN systemctl enable lightdm
|
|
||||||
RUN systemctl set-default graphical.target
|
|
||||||
|
|
||||||
# Create a default user for the installer environment
|
|
||||||
RUN useradd -m -s /bin/bash -G sudo installer
|
|
||||||
RUN echo "installer:installer" | chpasswd
|
|
||||||
|
|
||||||
# Set up basic system configuration
|
|
||||||
RUN echo "debian-atomic-installer" > /etc/hostname
|
|
||||||
|
|
||||||
# Copy Calamares configuration
|
|
||||||
COPY 02-installer-bootc/calamares-config/ /etc/calamares/
|
|
||||||
|
|
||||||
# Copy installation scripts
|
|
||||||
COPY 02-installer-bootc/scripts/ /usr/local/bin/
|
|
||||||
RUN chmod +x /usr/local/bin/*.sh
|
|
||||||
|
|
||||||
# Create simple ISO creation script
|
|
||||||
RUN echo '#!/bin/bash' > /usr/local/bin/create-iso-complete.sh && \
|
|
||||||
echo 'echo "Creating ISO with bootc integration..."' >> /usr/local/bin/create-iso-complete.sh && \
|
|
||||||
echo 'mkdir -p boot/grub isolinux live' >> /usr/local/bin/create-iso-complete.sh && \
|
|
||||||
echo 'echo "bootc version: $(bootc --version 2>/dev/null || echo not available)"' >> /usr/local/bin/create-iso-complete.sh && \
|
|
||||||
echo 'echo "ostree version: $(ostree --version 2>/dev/null || echo not available)"' >> /usr/local/bin/create-iso-complete.sh && \
|
|
||||||
echo 'echo "apt-ostree version: $(apt-ostree --version 2>/dev/null || echo not available)"' >> /usr/local/bin/create-iso-complete.sh && \
|
|
||||||
echo 'echo "Creating placeholder kernel and initrd..."' >> /usr/local/bin/create-iso-complete.sh && \
|
|
||||||
echo 'echo "placeholder kernel" > boot/vmlinuz' >> /usr/local/bin/create-iso-complete.sh && \
|
|
||||||
echo 'echo "placeholder initrd" > boot/initrd.img' >> /usr/local/bin/create-iso-complete.sh && \
|
|
||||||
echo 'echo "Creating bootable ISO..."' >> /usr/local/bin/create-iso-complete.sh && \
|
|
||||||
echo 'genisoimage -o /opt/iso-output/debian-atomic-installer-complete.iso -r -V "DEBIAN_ATOMIC" .' >> /usr/local/bin/create-iso-complete.sh && \
|
|
||||||
echo 'echo "✅ ISO created: /opt/iso-output/debian-atomic-installer-complete.iso"' >> /usr/local/bin/create-iso-complete.sh && \
|
|
||||||
chmod +x /usr/local/bin/create-iso-complete.sh
|
|
||||||
|
|
||||||
# Set up Calamares to autostart
|
|
||||||
RUN mkdir -p /etc/systemd/system/graphical.target.wants/
|
|
||||||
RUN ln -sf /usr/lib/systemd/system/calamares.service /etc/systemd/system/graphical.target.wants/
|
|
||||||
|
|
||||||
# Set environment variables
|
|
||||||
ENV DEBIAN_ATOMIC_VERSION="1.0"
|
|
||||||
ENV ISO_WORKSPACE="/opt/iso-workspace"
|
|
||||||
ENV ISO_OUTPUT="/opt/iso-output"
|
|
||||||
|
|
||||||
# Add labels for better container management
|
|
||||||
LABEL maintainer="Debian Atomic Desktop Project"
|
|
||||||
LABEL description="Debian Atomic Desktop Installer with ISO creation tools"
|
|
||||||
LABEL version="1.0"
|
|
||||||
LABEL org.opencontainers.image.source="https://github.com/your-repo/particle-os"
|
|
||||||
|
|
||||||
# Clean up
|
|
||||||
RUN apt-get clean
|
|
||||||
|
|
||||||
# Create a helpful startup message
|
|
||||||
RUN echo 'echo "=== Debian Atomic Desktop Installer Environment ==="' >> /root/.bashrc && \
|
|
||||||
echo 'echo "Available commands:"' >> /root/.bashrc && \
|
|
||||||
echo 'echo " create-iso-complete.sh - Create comprehensive bootable ISO"' >> /root/.bashrc && \
|
|
||||||
echo 'echo " bootc --help - Show bootc help"' >> /root/.bashrc && \
|
|
||||||
echo 'echo " calamares - Launch installer"' >> /root/.bashrc && \
|
|
||||||
echo 'echo "Workspace: $ISO_WORKSPACE"' >> /root/.bashrc && \
|
|
||||||
echo 'echo "Output: $ISO_OUTPUT"' >> /root/.bashrc
|
|
||||||
|
|
||||||
# Set the default command
|
|
||||||
CMD ["/bin/bash"]
|
|
||||||
|
|
@ -1,145 +0,0 @@
|
||||||
# Debian Atomic Desktop - Bootc Installer (Phase 2 Alternative)
|
|
||||||
|
|
||||||
This is an alternative approach to Phase 2 that uses **bootc + Calamares** instead of live-build. This approach is more modern and consistent with our atomic architecture.
|
|
||||||
|
|
||||||
## Architecture Overview
|
|
||||||
|
|
||||||
Instead of using live-build to create a traditional installer ISO, this approach:
|
|
||||||
|
|
||||||
1. **Creates a bootc container** that includes Calamares
|
|
||||||
2. **Calamares handles** partitioning, user setup, and system configuration
|
|
||||||
3. **Post-install script** uses `bootc install` to deploy the atomic image
|
|
||||||
4. **bootc creates the ISO** from the container
|
|
||||||
|
|
||||||
## Advantages Over Live-Build
|
|
||||||
|
|
||||||
- ✅ **Consistent tooling** - Everything uses bootc
|
|
||||||
- ✅ **No sysvinit conflicts** - Pure systemd environment
|
|
||||||
- ✅ **Atomic guarantees** - The installer itself is atomic
|
|
||||||
- ✅ **Simpler maintenance** - One build system instead of two
|
|
||||||
- ✅ **Modern approach** - Uses container-native tooling
|
|
||||||
|
|
||||||
## Quick Start
|
|
||||||
|
|
||||||
### Basic Workflow
|
|
||||||
|
|
||||||
1. **Build the installer:**
|
|
||||||
```bash
|
|
||||||
just build-installer
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Test the installer:**
|
|
||||||
```bash
|
|
||||||
just test-installer-systemd
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Create ISO (when ready):**
|
|
||||||
```bash
|
|
||||||
just create-iso
|
|
||||||
```
|
|
||||||
|
|
||||||
### Full Test Workflow
|
|
||||||
|
|
||||||
For complete testing with KVM and VNC:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Run the complete workflow
|
|
||||||
just test-full-workflow
|
|
||||||
```
|
|
||||||
|
|
||||||
This will:
|
|
||||||
1. Build the installer container
|
|
||||||
2. Create the ISO (when bootc ISO creation is implemented)
|
|
||||||
3. Create a test VM with KVM and VNC access
|
|
||||||
|
|
||||||
### Manual VM Testing
|
|
||||||
|
|
||||||
If you prefer to control each step:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Build the installer
|
|
||||||
just build-installer
|
|
||||||
|
|
||||||
# Create test VM (requires KVM and libvirt)
|
|
||||||
just create-test-vm
|
|
||||||
|
|
||||||
# Start/stop the VM
|
|
||||||
just start-test-vm
|
|
||||||
just stop-test-vm
|
|
||||||
|
|
||||||
# Clean up
|
|
||||||
just destroy-test-vm
|
|
||||||
```
|
|
||||||
|
|
||||||
## How It Works
|
|
||||||
|
|
||||||
### 1. Container Build
|
|
||||||
The `Containerfile` creates a bootc container with:
|
|
||||||
- Calamares installer
|
|
||||||
- bootc for atomic deployment
|
|
||||||
- Systemd services
|
|
||||||
- Partitioning tools
|
|
||||||
|
|
||||||
### 2. Calamares Configuration
|
|
||||||
- `settings.conf` - Main Calamares configuration
|
|
||||||
- Handles partitioning, user setup, etc.
|
|
||||||
- Calls our post-install script
|
|
||||||
|
|
||||||
### 3. Post-Install Script
|
|
||||||
- `post-install.sh` - Uses bootc to deploy atomic image
|
|
||||||
- Gets target device from Calamares
|
|
||||||
- Runs `bootc install to-disk`
|
|
||||||
|
|
||||||
### 4. ISO Creation
|
|
||||||
- bootc creates bootable ISO from container
|
|
||||||
- ISO boots into Calamares installer
|
|
||||||
- Installer deploys atomic image
|
|
||||||
|
|
||||||
## File Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
02-installer-bootc/
|
|
||||||
├── Containerfile # Bootc container definition
|
|
||||||
├── justfile # Build automation
|
|
||||||
├── README.md # This file
|
|
||||||
├── calamares-config/ # Calamares configuration
|
|
||||||
│ └── settings.conf # Main Calamares settings
|
|
||||||
└── scripts/ # Installation scripts
|
|
||||||
└── post-install.sh # Bootc deployment script
|
|
||||||
```
|
|
||||||
|
|
||||||
## Comparison with Live-Build Approach
|
|
||||||
|
|
||||||
| Aspect | Live-Build | Bootc + Calamares |
|
|
||||||
|--------|------------|-------------------|
|
|
||||||
| Build System | live-build | bootc |
|
|
||||||
| Dependencies | Complex package conflicts | Clean container |
|
|
||||||
| Maintenance | Two build systems | One build system |
|
|
||||||
| Atomic Guarantees | Limited | Full atomic |
|
|
||||||
| Modern Tooling | Traditional | Container-native |
|
|
||||||
|
|
||||||
## Next Steps
|
|
||||||
|
|
||||||
1. **Test the basic container** - Verify Calamares works
|
|
||||||
2. **Configure Calamares** - Add proper partitioning and user modules
|
|
||||||
3. **Test bootc deployment** - Verify atomic image installation
|
|
||||||
4. **Create ISO** - Use bootc to generate bootable ISO
|
|
||||||
5. **Integration testing** - Test full installation flow
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
- `podman` or `docker`
|
|
||||||
- `just`
|
|
||||||
- `bootc`
|
|
||||||
- `qemu` (for testing)
|
|
||||||
|
|
||||||
### For VM Testing
|
|
||||||
|
|
||||||
- `qemu-kvm`
|
|
||||||
- `libvirt-daemon-system`
|
|
||||||
- `libvirt-clients`
|
|
||||||
- `virt-install`
|
|
||||||
- User in `libvirt` group
|
|
||||||
- `virt-manager` (optional, for GUI management)
|
|
||||||
|
|
||||||
This approach should eliminate the sysvinit conflicts we encountered with live-build and provide a cleaner, more modern installer experience.
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
# Calamares settings for Debian Atomic Desktop installer
|
|
||||||
---
|
|
||||||
# This is the main configuration file for Calamares.
|
|
||||||
# It contains the general settings for the installer.
|
|
||||||
|
|
||||||
# Modules can be job modules (with different interfaces) and can be
|
|
||||||
# shown in the main page, or be part of the sequence of jobs.
|
|
||||||
# Each module can be loaded multiple times, so the module name
|
|
||||||
# should represent a feature and not a specific module.
|
|
||||||
|
|
||||||
# Instances section
|
|
||||||
# Each module can be loaded multiple times, so the module name
|
|
||||||
# should represent a feature and not a specific module.
|
|
||||||
instances:
|
|
||||||
- id: welcome
|
|
||||||
module: welcome
|
|
||||||
config: welcome.conf
|
|
||||||
|
|
||||||
- id: locale
|
|
||||||
module: locale
|
|
||||||
config: locale.conf
|
|
||||||
|
|
||||||
- id: keyboard
|
|
||||||
module: keyboardq
|
|
||||||
config: keyboard.conf
|
|
||||||
|
|
||||||
- id: partition
|
|
||||||
module: partition
|
|
||||||
config: partition.conf
|
|
||||||
|
|
||||||
- id: users
|
|
||||||
module: users
|
|
||||||
config: users.conf
|
|
||||||
|
|
||||||
- id: summary
|
|
||||||
module: summary
|
|
||||||
config: summary.conf
|
|
||||||
|
|
||||||
- id: finished
|
|
||||||
module: finished
|
|
||||||
config: finished.conf
|
|
||||||
|
|
||||||
# Sequence section
|
|
||||||
# This section defines the order in which the modules are shown.
|
|
||||||
sequence:
|
|
||||||
- show:
|
|
||||||
- welcome
|
|
||||||
- locale
|
|
||||||
- keyboard
|
|
||||||
- partition
|
|
||||||
- users
|
|
||||||
- summary
|
|
||||||
- exec:
|
|
||||||
- partition
|
|
||||||
- users
|
|
||||||
- finished
|
|
||||||
|
|
||||||
# Branding section
|
|
||||||
# This section defines the branding for the installer.
|
|
||||||
branding: debian
|
|
||||||
|
|
||||||
# Prompts section
|
|
||||||
# This section defines the prompts shown to the user.
|
|
||||||
prompts:
|
|
||||||
- type: "ok"
|
|
||||||
message: "Installation Complete"
|
|
||||||
description: "The Debian Atomic Desktop has been installed successfully."
|
|
||||||
|
|
@ -1,157 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Create VM script for Debian Atomic Desktop Bootc Installer
|
|
||||||
# This creates a real QEMU VM with VNC access
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Configuration
|
|
||||||
VM_NAME="debian-atomic-installer-vm"
|
|
||||||
VM_DISK="vm-disk.qcow2"
|
|
||||||
VM_MEMORY="4G"
|
|
||||||
VM_CORES="2"
|
|
||||||
VNC_PORT="5901"
|
|
||||||
VNC_DISPLAY=":1"
|
|
||||||
|
|
||||||
# Colors for output
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
log_info() {
|
|
||||||
echo -e "${BLUE}[INFO]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_success() {
|
|
||||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_warning() {
|
|
||||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Create VM disk
|
|
||||||
create_vm_disk() {
|
|
||||||
log_info "Creating VM disk..."
|
|
||||||
if [ -f "$VM_DISK" ]; then
|
|
||||||
log_warning "VM disk already exists. Removing it..."
|
|
||||||
rm -f "$VM_DISK"
|
|
||||||
fi
|
|
||||||
|
|
||||||
qemu-img create -f qcow2 "$VM_DISK" 20G
|
|
||||||
log_success "VM disk created: $VM_DISK"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Download a minimal Debian ISO for testing
|
|
||||||
download_debian_iso() {
|
|
||||||
log_info "Downloading minimal Debian ISO for testing..."
|
|
||||||
|
|
||||||
if [ ! -f "debian-mini.iso" ]; then
|
|
||||||
# Download a minimal Debian netinst ISO
|
|
||||||
wget -O debian-mini.iso "https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-13.7.0-amd64-netinst.iso"
|
|
||||||
log_success "Downloaded Debian netinst ISO"
|
|
||||||
else
|
|
||||||
log_info "Debian ISO already exists"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Start the VM with VNC
|
|
||||||
start_vm() {
|
|
||||||
log_info "Starting VM with VNC access..."
|
|
||||||
log_info "VNC server will be available at: vnc://localhost:$VNC_PORT"
|
|
||||||
log_info "Use a VNC client to connect to: localhost:$VNC_PORT"
|
|
||||||
|
|
||||||
# Check if we have an ISO
|
|
||||||
if [ ! -f "debian-mini.iso" ]; then
|
|
||||||
download_debian_iso
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Start VM with proper boot order
|
|
||||||
sudo qemu-system-x86_64 \
|
|
||||||
-name "$VM_NAME" \
|
|
||||||
-m "$VM_MEMORY" \
|
|
||||||
-smp "$VM_CORES" \
|
|
||||||
-enable-kvm \
|
|
||||||
-cpu host \
|
|
||||||
-machine q35 \
|
|
||||||
-drive file="$VM_DISK",format=qcow2,if=virtio \
|
|
||||||
-cdrom debian-mini.iso \
|
|
||||||
-device virtio-net-pci,netdev=net0 \
|
|
||||||
-netdev user,id=net0,hostfwd=tcp::2222-:22 \
|
|
||||||
-rtc base=utc \
|
|
||||||
-boot order=dc \
|
|
||||||
-serial mon:stdio \
|
|
||||||
-nographic
|
|
||||||
}
|
|
||||||
|
|
||||||
# Install our installer in the VM
|
|
||||||
install_in_vm() {
|
|
||||||
log_info "Instructions for installing our installer in the VM:"
|
|
||||||
echo
|
|
||||||
echo "1. Connect to VNC: vnc://localhost:$VNC_PORT"
|
|
||||||
echo "2. Install Debian in the VM"
|
|
||||||
echo "3. After installation, install our tools:"
|
|
||||||
echo " - Install podman: sudo apt install podman"
|
|
||||||
echo " - Install bootc: Copy from host or install from package"
|
|
||||||
echo " - Install Calamares: sudo apt install calamares"
|
|
||||||
echo "4. Test the installer"
|
|
||||||
echo
|
|
||||||
}
|
|
||||||
|
|
||||||
# Show help
|
|
||||||
show_help() {
|
|
||||||
echo "Usage: $0 [COMMAND]"
|
|
||||||
echo ""
|
|
||||||
echo "Commands:"
|
|
||||||
echo " create-disk - Create VM disk"
|
|
||||||
echo " download-iso - Download Debian ISO"
|
|
||||||
echo " start-vm - Start VM with VNC access"
|
|
||||||
echo " install - Show installation instructions"
|
|
||||||
echo " test - Full test (create disk, download ISO, start VM)"
|
|
||||||
echo " clean - Clean up VM files"
|
|
||||||
echo " help - Show this help"
|
|
||||||
echo ""
|
|
||||||
echo "VNC Access:"
|
|
||||||
echo " After starting the VM, connect to: vnc://localhost:$VNC_PORT"
|
|
||||||
echo " Or use: vncviewer localhost:$VNC_PORT"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Clean up
|
|
||||||
cleanup() {
|
|
||||||
log_info "Cleaning up VM files..."
|
|
||||||
rm -f "$VM_DISK"
|
|
||||||
rm -f debian-mini.iso
|
|
||||||
log_success "Cleanup completed."
|
|
||||||
}
|
|
||||||
|
|
||||||
# Main execution
|
|
||||||
case "${1:-help}" in
|
|
||||||
"create-disk")
|
|
||||||
create_vm_disk
|
|
||||||
;;
|
|
||||||
"download-iso")
|
|
||||||
download_debian_iso
|
|
||||||
;;
|
|
||||||
"start-vm")
|
|
||||||
if [ ! -f "$VM_DISK" ]; then
|
|
||||||
log_warning "VM disk not found. Creating it first..."
|
|
||||||
create_vm_disk
|
|
||||||
fi
|
|
||||||
start_vm
|
|
||||||
;;
|
|
||||||
"install")
|
|
||||||
install_in_vm
|
|
||||||
;;
|
|
||||||
"test")
|
|
||||||
create_vm_disk
|
|
||||||
download_debian_iso
|
|
||||||
start_vm
|
|
||||||
;;
|
|
||||||
"clean")
|
|
||||||
cleanup
|
|
||||||
;;
|
|
||||||
"help"|*)
|
|
||||||
show_help
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
@ -1,227 +0,0 @@
|
||||||
# justfile for Debian Atomic Desktop Bootc Installer
|
|
||||||
# This creates a bootc-based installer with Calamares
|
|
||||||
|
|
||||||
# Variables
|
|
||||||
IMAGE_NAME := "debian-atomic-installer"
|
|
||||||
IMAGE_TAG := "latest"
|
|
||||||
|
|
||||||
# Apt-cacher-ng configuration
|
|
||||||
APT_CACHER_NG_PROXY := "http://192.168.1.101:3142"
|
|
||||||
|
|
||||||
# Default recipe
|
|
||||||
default: build-installer
|
|
||||||
|
|
||||||
# Build the installer container image
|
|
||||||
build-installer:
|
|
||||||
@echo "Building Debian Atomic Desktop installer..."
|
|
||||||
cd .. && podman build --build-arg APT_CACHER_NG_PROXY={{APT_CACHER_NG_PROXY}} -t {{IMAGE_NAME}}:{{IMAGE_TAG}} -f 02-installer-bootc/Containerfile .
|
|
||||||
@echo "Installer image built successfully!"
|
|
||||||
|
|
||||||
# Build with a specific tag
|
|
||||||
build-installer-tag tag:
|
|
||||||
@echo "Building installer with tag: {{tag}}"
|
|
||||||
cd .. && podman build --build-arg APT_CACHER_NG_PROXY={{APT_CACHER_NG_PROXY}} -t {{IMAGE_NAME}}:{{tag}} -f 02-installer-bootc/Containerfile .
|
|
||||||
@echo "Installer image built with tag {{tag}}!"
|
|
||||||
|
|
||||||
# Test the installer image interactively
|
|
||||||
test-installer:
|
|
||||||
@echo "Testing installer image..."
|
|
||||||
podman run -it --rm {{IMAGE_NAME}}:{{IMAGE_TAG}} /bin/bash
|
|
||||||
|
|
||||||
# Test the installer with systemd (for bootc compatibility)
|
|
||||||
test-installer-systemd:
|
|
||||||
@echo "Testing installer with systemd support..."
|
|
||||||
podman run -it --rm \
|
|
||||||
--privileged \
|
|
||||||
--systemd=always \
|
|
||||||
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
|
|
||||||
{{IMAGE_NAME}}:{{IMAGE_TAG}}
|
|
||||||
|
|
||||||
# Create a bootable ISO from the installer image
|
|
||||||
create-iso:
|
|
||||||
@echo "Creating bootable ISO from installer image..."
|
|
||||||
@echo "Using bootable ISO creation approach..."
|
|
||||||
./scripts/create-bootable-iso.sh
|
|
||||||
|
|
||||||
# Test the ISO in QEMU
|
|
||||||
test-iso:
|
|
||||||
@echo "Testing installer ISO in QEMU..."
|
|
||||||
qemu-system-x86_64 \
|
|
||||||
-enable-kvm \
|
|
||||||
-m 2G \
|
|
||||||
-cdrom build/debian-atomic-installer.iso \
|
|
||||||
-serial mon:stdio \
|
|
||||||
-nographic
|
|
||||||
|
|
||||||
# Test the ISO using podman containers
|
|
||||||
test-iso-podman:
|
|
||||||
@echo "Testing ISO using podman containers..."
|
|
||||||
./scripts/test-iso-podman.sh
|
|
||||||
|
|
||||||
# Build bootable ISO from installer container
|
|
||||||
build-iso:
|
|
||||||
@echo "Building bootable ISO from installer container..."
|
|
||||||
./test-vm.sh build-iso
|
|
||||||
|
|
||||||
# Create VM disk for testing
|
|
||||||
create-vm-disk:
|
|
||||||
@echo "Creating VM disk for testing..."
|
|
||||||
./test-vm.sh create-vm
|
|
||||||
|
|
||||||
# Start VM with VNC access
|
|
||||||
start-vm:
|
|
||||||
@echo "Starting VM with VNC access..."
|
|
||||||
./test-vm.sh start-vm
|
|
||||||
|
|
||||||
# Full VM test (build ISO, create VM, start VM)
|
|
||||||
test-vm:
|
|
||||||
@echo "Running full VM test..."
|
|
||||||
./test-vm.sh test
|
|
||||||
|
|
||||||
# Clean up VM files
|
|
||||||
clean-vm:
|
|
||||||
@echo "Cleaning up VM files..."
|
|
||||||
./test-vm.sh clean
|
|
||||||
|
|
||||||
# Container VM testing (simpler approach)
|
|
||||||
test-container:
|
|
||||||
@echo "Testing installer in container VM..."
|
|
||||||
./test-container-vm.sh test
|
|
||||||
|
|
||||||
# Start container VM
|
|
||||||
start-container:
|
|
||||||
@echo "Starting installer container VM..."
|
|
||||||
./test-container-vm.sh start
|
|
||||||
|
|
||||||
# Setup VNC in container
|
|
||||||
setup-vnc:
|
|
||||||
@echo "Setting up VNC in container..."
|
|
||||||
./test-container-vm.sh setup-vnc
|
|
||||||
|
|
||||||
# Show container status
|
|
||||||
container-status:
|
|
||||||
@echo "Showing container status..."
|
|
||||||
./test-container-vm.sh status
|
|
||||||
|
|
||||||
# Stop container VM
|
|
||||||
stop-container:
|
|
||||||
@echo "Stopping installer container VM..."
|
|
||||||
./test-container-vm.sh stop
|
|
||||||
|
|
||||||
# Access container shell
|
|
||||||
container-shell:
|
|
||||||
@echo "Accessing container shell..."
|
|
||||||
./test-container-vm.sh shell
|
|
||||||
|
|
||||||
# Real VM testing with QEMU
|
|
||||||
create-real-vm-disk:
|
|
||||||
@echo "Creating VM disk..."
|
|
||||||
./create-vm.sh create-disk
|
|
||||||
|
|
||||||
download-debian-iso:
|
|
||||||
@echo "Downloading Debian ISO..."
|
|
||||||
./create-vm.sh download-iso
|
|
||||||
|
|
||||||
start-real-vm:
|
|
||||||
@echo "Starting real VM with VNC..."
|
|
||||||
./create-vm.sh start-vm
|
|
||||||
|
|
||||||
vm-install-instructions:
|
|
||||||
@echo "Showing VM installation instructions..."
|
|
||||||
./create-vm.sh install
|
|
||||||
|
|
||||||
test-real-vm:
|
|
||||||
@echo "Testing real VM (create disk, download ISO, start VM)..."
|
|
||||||
./create-vm.sh test
|
|
||||||
|
|
||||||
clean-vm-files:
|
|
||||||
@echo "Cleaning up VM files..."
|
|
||||||
./create-vm.sh clean
|
|
||||||
|
|
||||||
# Clean up
|
|
||||||
clean:
|
|
||||||
@echo "Cleaning up installer images..."
|
|
||||||
podman rmi {{IMAGE_NAME}}:{{IMAGE_TAG}} 2>/dev/null || true
|
|
||||||
|
|
||||||
# Clean all related images (simplified)
|
|
||||||
clean-all:
|
|
||||||
@echo "Cleaning all installer images..."
|
|
||||||
@echo "Use 'podman images' and 'podman rmi' manually for now"
|
|
||||||
|
|
||||||
# List all installer images
|
|
||||||
list-images:
|
|
||||||
@echo "Installer images:"
|
|
||||||
podman images {{IMAGE_NAME}}
|
|
||||||
|
|
||||||
# Show detailed image information
|
|
||||||
inspect-image:
|
|
||||||
@echo "Inspecting installer image..."
|
|
||||||
podman inspect {{IMAGE_NAME}}:{{IMAGE_TAG}}
|
|
||||||
|
|
||||||
# Install custom packages locally (for testing)
|
|
||||||
install-custom-packages:
|
|
||||||
@echo "Installing custom bootc and ostree packages locally..."
|
|
||||||
./scripts/install-custom-packages.sh
|
|
||||||
|
|
||||||
# Build with custom packages
|
|
||||||
build-installer-custom:
|
|
||||||
@echo "Building installer with custom bootc/ostree packages..."
|
|
||||||
cd .. && podman build --build-arg APT_CACHER_NG_PROXY={{APT_CACHER_NG_PROXY}} -t {{IMAGE_NAME}}:{{IMAGE_TAG}} -f 02-installer-bootc/Containerfile .
|
|
||||||
@echo "Installer image built with custom packages!"
|
|
||||||
|
|
||||||
# Help
|
|
||||||
help:
|
|
||||||
@echo "Available commands:"
|
|
||||||
@just --list
|
|
||||||
|
|
||||||
# Test apt-cacher-ng connectivity
|
|
||||||
test-apt-cacher:
|
|
||||||
@echo "Testing apt-cacher-ng connectivity..."
|
|
||||||
@if timeout 5 bash -c '</dev/tcp/192.168.1.101/3142' 2>/dev/null; then \
|
|
||||||
echo "✅ apt-cacher-ng is accessible at {{APT_CACHER_NG_PROXY}}"; \
|
|
||||||
else \
|
|
||||||
echo "❌ apt-cacher-ng is not accessible at {{APT_CACHER_NG_PROXY}}"; \
|
|
||||||
echo "You may need to start apt-cacher-ng or check the IP address"; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Build without apt-cacher-ng (fallback)
|
|
||||||
build-installer-no-cache:
|
|
||||||
@echo "Building installer without apt-cacher-ng..."
|
|
||||||
cd .. && podman build -t {{IMAGE_NAME}}:{{IMAGE_TAG}} -f 02-installer-bootc/Containerfile .
|
|
||||||
@echo "Installer image built successfully!"
|
|
||||||
|
|
||||||
# Create test VM with KVM and VNC
|
|
||||||
create-test-vm:
|
|
||||||
@echo "Creating test VM with KVM and VNC access..."
|
|
||||||
./scripts/create-test-vm.sh
|
|
||||||
|
|
||||||
# Start test VM
|
|
||||||
start-test-vm:
|
|
||||||
@echo "Starting test VM..."
|
|
||||||
virsh start debian-atomic-test
|
|
||||||
|
|
||||||
# Stop test VM
|
|
||||||
stop-test-vm:
|
|
||||||
@echo "Stopping test VM..."
|
|
||||||
virsh destroy debian-atomic-test
|
|
||||||
|
|
||||||
# Destroy test VM completely
|
|
||||||
destroy-test-vm:
|
|
||||||
@echo "Destroying test VM completely..."
|
|
||||||
virsh destroy debian-atomic-test 2>/dev/null || true
|
|
||||||
virsh undefine debian-atomic-test 2>/dev/null || true
|
|
||||||
sudo rm -f /var/lib/libvirt/images/debian-atomic-test.qcow2
|
|
||||||
|
|
||||||
# Full test workflow (build installer, create ISO, create VM)
|
|
||||||
test-full-workflow:
|
|
||||||
@echo "Running full test workflow..."
|
|
||||||
@echo "1. Building installer container..."
|
|
||||||
just build-installer
|
|
||||||
@echo "2. Creating ISO..."
|
|
||||||
just create-iso
|
|
||||||
@echo "3. Creating test VM..."
|
|
||||||
just create-test-vm
|
|
||||||
@echo "Full workflow completed!"
|
|
||||||
|
|
||||||
# List all recipes
|
|
||||||
list: help
|
|
||||||
|
|
@ -1,114 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Script to create a minimal bootable ISO with GRUB (simplified approach)
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "Creating minimal bootable ISO (simplified approach)..."
|
|
||||||
|
|
||||||
# Create build directory
|
|
||||||
mkdir -p build
|
|
||||||
|
|
||||||
# Create a working directory for ISO contents
|
|
||||||
mkdir -p build/iso-work
|
|
||||||
cd build/iso-work
|
|
||||||
|
|
||||||
echo "Creating ISO structure..."
|
|
||||||
|
|
||||||
# Create basic ISO structure
|
|
||||||
mkdir -p boot/grub
|
|
||||||
mkdir -p isolinux
|
|
||||||
|
|
||||||
# Create a simple kernel placeholder
|
|
||||||
echo 'This is a placeholder kernel' > boot/vmlinuz
|
|
||||||
echo 'This is a placeholder initrd' > boot/initrd.img
|
|
||||||
|
|
||||||
# Create GRUB configuration
|
|
||||||
cat > boot/grub/grub.cfg << 'EOF'
|
|
||||||
set timeout=5
|
|
||||||
set default=0
|
|
||||||
|
|
||||||
menuentry 'Debian Atomic Desktop Installer' {
|
|
||||||
linux /boot/vmlinuz root=live:CDLABEL=DEBIAN_ATOMIC quiet
|
|
||||||
initrd /boot/initrd.img
|
|
||||||
}
|
|
||||||
|
|
||||||
menuentry 'Debian Atomic Desktop Installer (Safe Mode)' {
|
|
||||||
linux /boot/vmlinuz root=live:CDLABEL=DEBIAN_ATOMIC nomodeset
|
|
||||||
initrd /boot/initrd.img
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Create isolinux configuration
|
|
||||||
cat > isolinux/isolinux.cfg << 'EOF'
|
|
||||||
DEFAULT install
|
|
||||||
TIMEOUT 50
|
|
||||||
PROMPT 1
|
|
||||||
|
|
||||||
LABEL install
|
|
||||||
KERNEL /boot/vmlinuz
|
|
||||||
APPEND root=live:CDLABEL=DEBIAN_ATOMIC quiet initrd=/boot/initrd.img
|
|
||||||
|
|
||||||
LABEL install-safe
|
|
||||||
KERNEL /boot/vmlinuz
|
|
||||||
APPEND root=live:CDLABEL=DEBIAN_ATOMIC nomodeset initrd=/boot/initrd.img
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Create a simple README
|
|
||||||
echo 'Debian Atomic Desktop Installer ISO' > README.txt
|
|
||||||
echo 'This is a minimal bootable ISO for testing.' >> README.txt
|
|
||||||
|
|
||||||
echo "Creating bootable ISO using podman..."
|
|
||||||
|
|
||||||
# Use podman only for the final ISO creation
|
|
||||||
podman run --rm \
|
|
||||||
-v "$(pwd):/work" \
|
|
||||||
-w /work \
|
|
||||||
debian:trixie \
|
|
||||||
bash -c "
|
|
||||||
# Configure apt-cacher-ng proxy if available
|
|
||||||
if [ -n \"$APT_CACHER_NG_PROXY\" ]; then
|
|
||||||
echo \"Acquire::http::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" > /etc/apt/apt.conf.d/99proxy
|
|
||||||
echo \"Acquire::https::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" >> /etc/apt/apt.conf.d/99proxy
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update and install required packages
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y isolinux xorriso
|
|
||||||
|
|
||||||
# Copy isolinux files
|
|
||||||
cp /usr/lib/ISOLINUX/isolinux.bin isolinux/ 2>/dev/null || echo 'isolinux.bin not found'
|
|
||||||
cp /usr/lib/syslinux/modules/bios/ldlinux.c32 isolinux/ 2>/dev/null || echo 'ldlinux.c32 not found'
|
|
||||||
|
|
||||||
# Check if isolinux files exist
|
|
||||||
if [ ! -f isolinux/isolinux.bin ]; then
|
|
||||||
echo 'Creating minimal isolinux.bin placeholder...'
|
|
||||||
echo 'ISOLINUX' > isolinux/isolinux.bin
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f isolinux/ldlinux.c32 ]; then
|
|
||||||
echo 'Creating minimal ldlinux.c32 placeholder...'
|
|
||||||
echo 'LDLINUX' > isolinux/ldlinux.c32
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create bootable ISO with simpler approach
|
|
||||||
xorrisofs -o ../debian-atomic-installer-bootable.iso \
|
|
||||||
-b isolinux/isolinux.bin \
|
|
||||||
-c isolinux/boot.cat \
|
|
||||||
-boot-info-table \
|
|
||||||
-no-emul-boot \
|
|
||||||
-boot-load-size 4 \
|
|
||||||
-r \
|
|
||||||
-V 'DEBIAN_ATOMIC' \
|
|
||||||
/work
|
|
||||||
"
|
|
||||||
|
|
||||||
cd ../..
|
|
||||||
|
|
||||||
echo "Bootable ISO created: build/debian-atomic-installer-bootable.iso"
|
|
||||||
if [ -f "build/debian-atomic-installer-bootable.iso" ]; then
|
|
||||||
echo "Size: $(du -h build/debian-atomic-installer-bootable.iso | cut -f1)"
|
|
||||||
echo "✅ Bootable ISO creation completed!"
|
|
||||||
else
|
|
||||||
echo "❌ ISO creation failed!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
@ -1,203 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Script to create a bootable ISO with isolinux bootloader
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "Creating bootable ISO with isolinux bootloader..."
|
|
||||||
|
|
||||||
# Create build directory
|
|
||||||
mkdir -p build
|
|
||||||
|
|
||||||
# Extract real kernel and initrd from container on the host first
|
|
||||||
echo "Extracting kernel and initrd from container..."
|
|
||||||
mkdir -p build/temp-boot
|
|
||||||
|
|
||||||
# Create temporary container to extract boot files
|
|
||||||
podman create --name temp-boot-extractor debian-atomic-installer:latest
|
|
||||||
|
|
||||||
# Extract specific kernel and initrd files we know exist
|
|
||||||
echo "Extracting kernel: /boot/vmlinuz-6.12.38+deb13-amd64"
|
|
||||||
if podman cp temp-boot-extractor:/boot/vmlinuz-6.12.38+deb13-amd64 build/temp-boot/vmlinuz 2>/dev/null; then
|
|
||||||
echo "✅ Kernel extracted successfully"
|
|
||||||
else
|
|
||||||
echo "Warning: Kernel not found, using placeholder"
|
|
||||||
echo 'This is a placeholder kernel' > build/temp-boot/vmlinuz
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Extracting initrd: /boot/initrd.img-6.12.38+deb13-amd64"
|
|
||||||
if podman cp temp-boot-extractor:/boot/initrd.img-6.12.38+deb13-amd64 build/temp-boot/initrd.img 2>/dev/null; then
|
|
||||||
echo "✅ Initrd extracted successfully"
|
|
||||||
else
|
|
||||||
echo "Warning: Initrd not found, using placeholder"
|
|
||||||
echo 'This is a placeholder initrd' > build/temp-boot/initrd.img
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Clean up temporary container
|
|
||||||
podman rm temp-boot-extractor
|
|
||||||
|
|
||||||
echo "Creating bootable ISO using podman..."
|
|
||||||
|
|
||||||
# Use podman to create everything inside the container
|
|
||||||
podman run --rm \
|
|
||||||
-v "$(pwd)/build:/output:Z" \
|
|
||||||
-v "$(pwd)/build/temp-boot:/host-boot:ro" \
|
|
||||||
-v "$(pwd):/host-workspace:ro" \
|
|
||||||
debian:trixie \
|
|
||||||
bash -c "
|
|
||||||
# Configure apt-cacher-ng proxy if available
|
|
||||||
if [ -n \"$APT_CACHER_NG_PROXY\" ]; then
|
|
||||||
echo \"Acquire::http::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" > /etc/apt/apt.conf.d/99proxy
|
|
||||||
echo \"Acquire::https::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" >> /etc/apt/apt.conf.d/99proxy
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update and install required packages
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y genisoimage isolinux squashfs-tools
|
|
||||||
|
|
||||||
# Create working directory
|
|
||||||
mkdir -p /tmp/iso-content
|
|
||||||
cd /tmp/iso-content
|
|
||||||
|
|
||||||
# Create basic ISO structure
|
|
||||||
mkdir -p boot/grub
|
|
||||||
mkdir -p isolinux
|
|
||||||
|
|
||||||
# Copy real kernel and initrd from host
|
|
||||||
echo 'Using real kernel and initrd from container...'
|
|
||||||
cp /host-boot/vmlinuz boot/vmlinuz
|
|
||||||
cp /host-boot/initrd.img boot/initrd.img
|
|
||||||
|
|
||||||
# Create live filesystem directory structure
|
|
||||||
echo 'Creating live filesystem structure...'
|
|
||||||
mkdir -p live
|
|
||||||
|
|
||||||
# Use pre-extracted container filesystem for live system
|
|
||||||
echo 'Using pre-extracted container filesystem...'
|
|
||||||
|
|
||||||
if [ -d /host-workspace/build/container-filesystem ]; then
|
|
||||||
echo 'Copying complete container filesystem from host...'
|
|
||||||
cp -a /host-workspace/build/container-filesystem filesystem
|
|
||||||
echo 'Container filesystem copied successfully!'
|
|
||||||
else
|
|
||||||
echo 'WARNING: Pre-extracted filesystem not found!'
|
|
||||||
echo 'Please run ./scripts/extract-container-filesystem.sh first'
|
|
||||||
echo 'Creating minimal fallback filesystem...'
|
|
||||||
|
|
||||||
# Fallback: create minimal structure
|
|
||||||
mkdir -p filesystem
|
|
||||||
mkdir -p filesystem/{bin,sbin,usr/{bin,sbin,lib,lib64,share},lib,lib64}
|
|
||||||
mkdir -p filesystem/{etc,var,tmp,root,home,mnt,media,opt,srv}
|
|
||||||
mkdir -p filesystem/{proc,sys,dev,run}
|
|
||||||
|
|
||||||
# Create a basic init script as fallback
|
|
||||||
cat > filesystem/sbin/init << 'FALLBACK_EOF'
|
|
||||||
#!/bin/sh
|
|
||||||
echo \"Debian Atomic Live System (Minimal)\"
|
|
||||||
mount -t proc proc /proc
|
|
||||||
mount -t sysfs sysfs /sys
|
|
||||||
mount -t devtmpfs devtmpfs /dev
|
|
||||||
echo \"Live system ready - entering shell\"
|
|
||||||
/bin/sh
|
|
||||||
FALLBACK_EOF
|
|
||||||
chmod +x filesystem/sbin/init
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Prepare the live system
|
|
||||||
echo 'Preparing live system filesystem...'
|
|
||||||
|
|
||||||
# The init script should already be created by extract-container-filesystem.sh
|
|
||||||
if [ -x filesystem/sbin/init ]; then
|
|
||||||
echo 'Init script found in extracted filesystem!'
|
|
||||||
else
|
|
||||||
echo 'Creating fallback init script...'
|
|
||||||
mkdir -p filesystem/sbin
|
|
||||||
cat > filesystem/sbin/init << 'INIT_EOF'
|
|
||||||
#!/bin/bash
|
|
||||||
echo \"=== Debian Atomic Desktop Live System ===\"
|
|
||||||
mount -t proc proc /proc
|
|
||||||
mount -t sysfs sysfs /sys
|
|
||||||
mount -t devtmpfs devtmpfs /dev
|
|
||||||
mount -t tmpfs tmpfs /run
|
|
||||||
mount -t tmpfs tmpfs /tmp
|
|
||||||
echo \"Live system ready!\"
|
|
||||||
exec /bin/bash
|
|
||||||
INIT_EOF
|
|
||||||
chmod +x filesystem/sbin/init
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create the SquashFS filesystem with better compression
|
|
||||||
echo 'Creating SquashFS filesystem from full container...'
|
|
||||||
mksquashfs filesystem live/filesystem.squashfs -comp xz -Xbcj x86 -b 1M -Xdict-size 100%
|
|
||||||
|
|
||||||
# Create GRUB configuration
|
|
||||||
cat > boot/grub/grub.cfg << 'EOF'
|
|
||||||
set timeout=5
|
|
||||||
set default=0
|
|
||||||
|
|
||||||
menuentry 'Debian Atomic Desktop Installer' {
|
|
||||||
linux /boot/vmlinuz root=live:CDLABEL=DEBIAN_ATOMIC quiet
|
|
||||||
initrd /boot/initrd.img
|
|
||||||
}
|
|
||||||
|
|
||||||
menuentry 'Debian Atomic Desktop Installer (Safe Mode)' {
|
|
||||||
linux /boot/vmlinuz root=live:CDLABEL=DEBIAN_ATOMIC nomodeset
|
|
||||||
initrd /boot/initrd.img
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Create isolinux configuration
|
|
||||||
cat > isolinux/isolinux.cfg << 'EOF'
|
|
||||||
DEFAULT install
|
|
||||||
TIMEOUT 50
|
|
||||||
PROMPT 1
|
|
||||||
|
|
||||||
LABEL install
|
|
||||||
KERNEL /boot/vmlinuz
|
|
||||||
INITRD /boot/initrd.img
|
|
||||||
APPEND boot=live live-media-path=/live/ quiet splash
|
|
||||||
|
|
||||||
LABEL install-safe
|
|
||||||
KERNEL /boot/vmlinuz
|
|
||||||
INITRD /boot/initrd.img
|
|
||||||
APPEND boot=live live-media-path=/live/ nomodeset quiet
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Copy isolinux files
|
|
||||||
cp /usr/lib/ISOLINUX/isolinux.bin isolinux/ 2>/dev/null || echo 'isolinux.bin not found'
|
|
||||||
cp /usr/lib/syslinux/modules/bios/ldlinux.c32 isolinux/ 2>/dev/null || echo 'ldlinux.c32 not found'
|
|
||||||
|
|
||||||
# Create a simple README
|
|
||||||
echo 'Debian Atomic Desktop Installer ISO' > README.txt
|
|
||||||
echo 'This is a bootable ISO for testing.' >> README.txt
|
|
||||||
|
|
||||||
# List contents to debug
|
|
||||||
echo 'Contents of /tmp/iso-content:'
|
|
||||||
ls -la /tmp/iso-content/
|
|
||||||
echo 'Contents of isolinux directory:'
|
|
||||||
ls -la /tmp/iso-content/isolinux/
|
|
||||||
|
|
||||||
# Create bootable ISO with proper El Torito boot specification
|
|
||||||
genisoimage -o /tmp/debian-atomic-installer-bootable.iso \
|
|
||||||
-b isolinux/isolinux.bin \
|
|
||||||
-c isolinux/boot.cat \
|
|
||||||
-no-emul-boot \
|
|
||||||
-boot-load-size 4 \
|
|
||||||
-boot-info-table \
|
|
||||||
-r \
|
|
||||||
-J \
|
|
||||||
-V 'DEBIAN_ATOMIC' \
|
|
||||||
.
|
|
||||||
|
|
||||||
# Copy ISO to output directory
|
|
||||||
cp /tmp/debian-atomic-installer-bootable.iso /output/
|
|
||||||
echo 'Bootable ISO created and copied to output directory'
|
|
||||||
"
|
|
||||||
|
|
||||||
echo "Bootable ISO created: build/debian-atomic-installer-bootable.iso"
|
|
||||||
if [ -f "build/debian-atomic-installer-bootable.iso" ]; then
|
|
||||||
echo "Size: $(du -h build/debian-atomic-installer-bootable.iso | cut -f1)"
|
|
||||||
echo "✅ Bootable ISO creation completed!"
|
|
||||||
else
|
|
||||||
echo "❌ Bootable ISO creation failed!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
@ -1,155 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Script to create a bootable ISO using bootc in a Debian container
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "Creating bootable ISO using bootc in Debian container..."
|
|
||||||
|
|
||||||
# Check if container image exists
|
|
||||||
if ! podman image exists debian-atomic-installer:latest; then
|
|
||||||
echo "Error: Container image debian-atomic-installer:latest not found"
|
|
||||||
echo "Please build the installer first with: just build-installer"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create build directory
|
|
||||||
mkdir -p build
|
|
||||||
|
|
||||||
echo "Running bootc in Debian container to create ISO..."
|
|
||||||
|
|
||||||
# Copy the image to a temporary name that can be accessed from the container
|
|
||||||
echo "Preparing image for container access..."
|
|
||||||
podman tag debian-atomic-installer:latest localhost/debian-atomic-installer:latest
|
|
||||||
|
|
||||||
# Run bootc in a Debian container
|
|
||||||
podman run --rm \
|
|
||||||
--privileged \
|
|
||||||
-v "$(pwd)/build:/output" \
|
|
||||||
-w /output \
|
|
||||||
debian:trixie \
|
|
||||||
bash -c "
|
|
||||||
# Configure apt-cacher-ng proxy
|
|
||||||
if [ -n \"$APT_CACHER_NG_PROXY\" ]; then
|
|
||||||
echo \"Acquire::http::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" > /etc/apt/apt.conf.d/99proxy
|
|
||||||
echo \"Acquire::https::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" >> /etc/apt/apt.conf.d/99proxy
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update and install bootc
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y curl
|
|
||||||
|
|
||||||
# Install bootc from GitHub releases
|
|
||||||
curl -L https://github.com/containers/bootc/releases/download/v1.5.1/bootc-x86_64-unknown-linux-gnu.tar.gz | tar -xz
|
|
||||||
mv bootc /usr/local/bin/
|
|
||||||
chmod +x /usr/local/bin/bootc
|
|
||||||
|
|
||||||
# Try to create ISO using bootc
|
|
||||||
echo 'Attempting to create ISO with bootc...'
|
|
||||||
if bootc container build-iso debian-atomic-installer:latest --output debian-atomic-installer.iso; then
|
|
||||||
echo 'ISO created successfully with bootc!'
|
|
||||||
else
|
|
||||||
echo 'bootc build-iso failed, falling back to manual ISO creation...'
|
|
||||||
# Fallback to manual ISO creation
|
|
||||||
apt-get install -y xorriso squashfs-tools podman
|
|
||||||
# Extract container and create ISO manually
|
|
||||||
mkdir -p /tmp/iso
|
|
||||||
mkdir -p /tmp/iso/boot
|
|
||||||
|
|
||||||
# Try to access the container image directly
|
|
||||||
echo 'Extracting container filesystem...'
|
|
||||||
podman create --name temp-installer debian-atomic-installer:latest || echo 'Container creation failed, using basic structure'
|
|
||||||
|
|
||||||
if podman ps -a | grep -q temp-installer; then
|
|
||||||
podman export temp-installer | tar -x -C /tmp/iso || echo 'Export failed, using basic structure'
|
|
||||||
podman rm temp-installer
|
|
||||||
|
|
||||||
# Extract kernel and initrd from the container
|
|
||||||
echo 'Extracting kernel and initrd...'
|
|
||||||
podman create --name temp-kernel debian-atomic-installer:latest
|
|
||||||
if podman ps -a | grep -q temp-kernel; then
|
|
||||||
podman cp temp-kernel:/boot/vmlinuz-$(uname -r) /tmp/iso/boot/vmlinuz 2>/dev/null || echo 'Kernel not found in container'
|
|
||||||
podman cp temp-kernel:/boot/initrd.img-$(uname -r) /tmp/iso/boot/initrd.img 2>/dev/null || echo 'Initrd not found in container'
|
|
||||||
podman rm temp-kernel
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create basic kernel and initrd placeholders if not found
|
|
||||||
if [ ! -f /tmp/iso/boot/vmlinuz ]; then
|
|
||||||
echo 'Creating basic kernel placeholder...'
|
|
||||||
echo 'This is a placeholder kernel' > /tmp/iso/boot/vmlinuz
|
|
||||||
fi
|
|
||||||
if [ ! -f /tmp/iso/boot/initrd.img ]; then
|
|
||||||
echo 'Creating basic initrd placeholder...'
|
|
||||||
echo 'This is a placeholder initrd' > /tmp/iso/boot/initrd.img
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create proper bootloader structure
|
|
||||||
mkdir -p /tmp/iso/boot/grub/x86_64-efi
|
|
||||||
mkdir -p /tmp/iso/boot/grub/i386-pc
|
|
||||||
mkdir -p /tmp/iso/isolinux
|
|
||||||
|
|
||||||
# Install GRUB and create bootloader files
|
|
||||||
echo 'Installing GRUB bootloader...'
|
|
||||||
apt-get install -y grub-efi-amd64 grub-pc-bin grub-common isolinux
|
|
||||||
|
|
||||||
# Create GRUB configuration
|
|
||||||
cat > /tmp/iso/boot/grub/grub.cfg << 'EOF'
|
|
||||||
set timeout=5
|
|
||||||
set default=0
|
|
||||||
|
|
||||||
menuentry 'Debian Atomic Desktop Installer' {
|
|
||||||
linux /boot/vmlinuz root=live:CDLABEL=DEBIAN_ATOMIC_INSTALLER quiet
|
|
||||||
initrd /boot/initrd.img
|
|
||||||
}
|
|
||||||
|
|
||||||
menuentry 'Debian Atomic Desktop Installer (Safe Mode)' {
|
|
||||||
linux /boot/vmlinuz root=live:CDLABEL=DEBIAN_ATOMIC_INSTALLER nomodeset
|
|
||||||
initrd /boot/initrd.img
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Copy GRUB bootloader files
|
|
||||||
cp /usr/lib/grub/x86_64-efi/*.mod /tmp/iso/boot/grub/x86_64-efi/ 2>/dev/null || echo 'EFI modules not found'
|
|
||||||
cp /usr/lib/grub/i386-pc/*.mod /tmp/iso/boot/grub/i386-pc/ 2>/dev/null || echo 'PC modules not found'
|
|
||||||
cp /usr/lib/grub/x86_64-efi/grub.efi /tmp/iso/boot/grub/x86_64-efi/ 2>/dev/null || echo 'EFI grub not found'
|
|
||||||
cp /usr/lib/grub/i386-pc/grub.efi /tmp/iso/boot/grub/i386-pc/ 2>/dev/null || echo 'PC grub not found'
|
|
||||||
|
|
||||||
# Create isolinux files for legacy boot
|
|
||||||
cp /usr/lib/ISOLINUX/isolinux.bin /tmp/iso/isolinux/ 2>/dev/null || echo 'isolinux.bin not found'
|
|
||||||
cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /tmp/iso/isolinux/ 2>/dev/null || echo 'ldlinux.c32 not found'
|
|
||||||
|
|
||||||
# Create isolinux config
|
|
||||||
cat > /tmp/iso/isolinux/isolinux.cfg << 'EOF'
|
|
||||||
DEFAULT install
|
|
||||||
TIMEOUT 50
|
|
||||||
PROMPT 1
|
|
||||||
|
|
||||||
LABEL install
|
|
||||||
KERNEL /boot/vmlinuz
|
|
||||||
APPEND root=live:CDLABEL=DEBIAN_ATOMIC_INSTALLER quiet initrd=/boot/initrd.img
|
|
||||||
|
|
||||||
LABEL install-safe
|
|
||||||
KERNEL /boot/vmlinuz
|
|
||||||
APPEND root=live:CDLABEL=DEBIAN_ATOMIC_INSTALLER nomodeset initrd=/boot/initrd.img
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Create bootable ISO with proper bootloader
|
|
||||||
xorrisofs -o debian-atomic-installer.iso \
|
|
||||||
-b isolinux/isolinux.bin \
|
|
||||||
-c isolinux/boot.cat \
|
|
||||||
-boot-info-table \
|
|
||||||
-no-emul-boot \
|
|
||||||
-boot-load-size 4 \
|
|
||||||
-r \
|
|
||||||
-V 'DEBIAN_ATOMIC_INSTALLER' \
|
|
||||||
/tmp/iso/
|
|
||||||
fi
|
|
||||||
"
|
|
||||||
|
|
||||||
echo "ISO creation completed!"
|
|
||||||
if [ -f "build/debian-atomic-installer.iso" ]; then
|
|
||||||
echo "ISO created: build/debian-atomic-installer.iso"
|
|
||||||
echo "Size: $(du -h build/debian-atomic-installer.iso | cut -f1)"
|
|
||||||
else
|
|
||||||
echo "Warning: ISO file not found in expected location"
|
|
||||||
fi
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Script to create a bootable ISO from the installer container
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "Creating bootable ISO from installer container..."
|
|
||||||
|
|
||||||
# Check if container image exists
|
|
||||||
if ! podman image exists debian-atomic-installer:latest; then
|
|
||||||
echo "Error: Container image debian-atomic-installer:latest not found"
|
|
||||||
echo "Please build the installer first with: just build-installer"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create build directory
|
|
||||||
mkdir -p build/iso
|
|
||||||
|
|
||||||
echo "Extracting container filesystem..."
|
|
||||||
# Extract the container filesystem
|
|
||||||
podman create --name temp-installer debian-atomic-installer:latest
|
|
||||||
podman export temp-installer | tar -x -C build/iso
|
|
||||||
podman rm temp-installer
|
|
||||||
|
|
||||||
echo "Setting up bootloader..."
|
|
||||||
# Create basic bootloader structure
|
|
||||||
mkdir -p build/iso/boot/grub
|
|
||||||
mkdir -p build/iso/isolinux
|
|
||||||
|
|
||||||
# Create a basic GRUB configuration
|
|
||||||
cat > build/iso/boot/grub/grub.cfg << 'EOF'
|
|
||||||
set timeout=5
|
|
||||||
set default=0
|
|
||||||
|
|
||||||
menuentry "Debian Atomic Desktop Installer" {
|
|
||||||
linux /boot/vmlinuz root=live:CDLABEL=DEBIAN_ATOMIC_INSTALLER quiet
|
|
||||||
initrd /boot/initrd.img
|
|
||||||
}
|
|
||||||
|
|
||||||
menuentry "Debian Atomic Desktop Installer (Safe Mode)" {
|
|
||||||
linux /boot/vmlinuz root=live:CDLABEL=DEBIAN_ATOMIC_INSTALLER nomodeset
|
|
||||||
initrd /boot/initrd.img
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
echo "Creating ISO..."
|
|
||||||
# Create the ISO using genisoimage or xorrisofs
|
|
||||||
if command -v xorrisofs &> /dev/null; then
|
|
||||||
xorrisofs -o build/debian-atomic-installer.iso \
|
|
||||||
-b isolinux/isolinux.bin \
|
|
||||||
-c isolinux/boot.cat \
|
|
||||||
-boot-info-table \
|
|
||||||
-no-emul-boot \
|
|
||||||
-boot-load-size 4 \
|
|
||||||
-r \
|
|
||||||
-V "DEBIAN_ATOMIC_INSTALLER" \
|
|
||||||
build/iso/
|
|
||||||
elif command -v genisoimage &> /dev/null; then
|
|
||||||
genisoimage -o build/debian-atomic-installer.iso \
|
|
||||||
-b isolinux/isolinux.bin \
|
|
||||||
-c isolinux/boot.cat \
|
|
||||||
-boot-info-table \
|
|
||||||
-no-emul-boot \
|
|
||||||
-boot-load-size 4 \
|
|
||||||
-r \
|
|
||||||
-V "DEBIAN_ATOMIC_INSTALLER" \
|
|
||||||
build/iso/
|
|
||||||
else
|
|
||||||
echo "Error: Neither xorrisofs nor genisoimage found"
|
|
||||||
echo "Please install one of them:"
|
|
||||||
echo " sudo apt install xorriso"
|
|
||||||
echo " sudo apt install genisoimage"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "ISO created successfully: build/debian-atomic-installer.iso"
|
|
||||||
echo "Size: $(du -h build/debian-atomic-installer.iso | cut -f1)"
|
|
||||||
|
|
@ -1,97 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Script to create a simple non-bootable ISO for testing
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "Creating simple non-bootable ISO for testing..."
|
|
||||||
|
|
||||||
# Create build directory
|
|
||||||
mkdir -p build
|
|
||||||
|
|
||||||
echo "Creating simple ISO using podman..."
|
|
||||||
|
|
||||||
# Use podman to create everything inside the container
|
|
||||||
podman run --rm \
|
|
||||||
-v "$(pwd)/build:/output:Z" \
|
|
||||||
debian:trixie \
|
|
||||||
bash -c "
|
|
||||||
# Configure apt-cacher-ng proxy if available
|
|
||||||
if [ -n \"$APT_CACHER_NG_PROXY\" ]; then
|
|
||||||
echo \"Acquire::http::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" > /etc/apt/apt.conf.d/99proxy
|
|
||||||
echo \"Acquire::https::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" >> /etc/apt/apt.conf.d/99proxy
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update and install required packages
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y genisoimage
|
|
||||||
|
|
||||||
# Create working directory
|
|
||||||
mkdir -p /tmp/iso-content
|
|
||||||
cd /tmp/iso-content
|
|
||||||
|
|
||||||
# Create basic ISO structure
|
|
||||||
mkdir -p boot/grub
|
|
||||||
mkdir -p isolinux
|
|
||||||
|
|
||||||
# Create a simple kernel placeholder
|
|
||||||
echo 'This is a placeholder kernel' > boot/vmlinuz
|
|
||||||
echo 'This is a placeholder initrd' > boot/initrd.img
|
|
||||||
|
|
||||||
# Create GRUB configuration
|
|
||||||
cat > boot/grub/grub.cfg << 'EOF'
|
|
||||||
set timeout=5
|
|
||||||
set default=0
|
|
||||||
|
|
||||||
menuentry 'Debian Atomic Desktop Installer' {
|
|
||||||
linux /boot/vmlinuz root=live:CDLABEL=DEBIAN_ATOMIC quiet
|
|
||||||
initrd /boot/initrd.img
|
|
||||||
}
|
|
||||||
|
|
||||||
menuentry 'Debian Atomic Desktop Installer (Safe Mode)' {
|
|
||||||
linux /boot/vmlinuz root=live:CDLABEL=DEBIAN_ATOMIC nomodeset
|
|
||||||
initrd /boot/initrd.img
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Create isolinux configuration
|
|
||||||
cat > isolinux/isolinux.cfg << 'EOF'
|
|
||||||
DEFAULT install
|
|
||||||
TIMEOUT 50
|
|
||||||
PROMPT 1
|
|
||||||
|
|
||||||
LABEL install
|
|
||||||
KERNEL /boot/vmlinuz
|
|
||||||
APPEND root=live:CDLABEL=DEBIAN_ATOMIC quiet initrd=/boot/initrd.img
|
|
||||||
|
|
||||||
LABEL install-safe
|
|
||||||
KERNEL /boot/vmlinuz
|
|
||||||
APPEND root=live:CDLABEL=DEBIAN_ATOMIC nomodeset initrd=/boot/initrd.img
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Create a simple README
|
|
||||||
echo 'Debian Atomic Desktop Installer ISO' > README.txt
|
|
||||||
echo 'This is a simple ISO for testing.' >> README.txt
|
|
||||||
|
|
||||||
# List contents to debug
|
|
||||||
echo 'Contents of /tmp/iso-content:'
|
|
||||||
ls -la /tmp/iso-content/
|
|
||||||
|
|
||||||
# Create simple ISO without bootloader inside container
|
|
||||||
genisoimage -o /tmp/debian-atomic-installer-simple.iso \
|
|
||||||
-r \
|
|
||||||
-V 'DEBIAN_ATOMIC' \
|
|
||||||
.
|
|
||||||
|
|
||||||
# Copy ISO to output directory
|
|
||||||
cp /tmp/debian-atomic-installer-simple.iso /output/
|
|
||||||
echo 'ISO created and copied to output directory'
|
|
||||||
"
|
|
||||||
|
|
||||||
echo "Simple ISO created: build/debian-atomic-installer-simple.iso"
|
|
||||||
if [ -f "build/debian-atomic-installer-simple.iso" ]; then
|
|
||||||
echo "Size: $(du -h build/debian-atomic-installer-simple.iso | cut -f1)"
|
|
||||||
echo "✅ Simple ISO creation completed!"
|
|
||||||
else
|
|
||||||
echo "❌ ISO creation failed!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
@ -1,171 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# This script automates the creation of a KVM virtual machine with VNC access,
|
|
||||||
# making it manageable via virt-manager for testing the Debian Atomic Desktop installer.
|
|
||||||
|
|
||||||
# --- Configuration Variables ---
|
|
||||||
VM_NAME="debian-atomic-test" # Name of your virtual machine
|
|
||||||
DISK_SIZE="20G" # Size of the virtual disk (e.g., 20G, 50G)
|
|
||||||
RAM_SIZE="4096" # RAM allocated to the VM in MB (e.g., 4096 for 4GB)
|
|
||||||
VCPU_COUNT="2" # Number of virtual CPUs
|
|
||||||
DISK_PATH="/var/lib/libvirt/images/${VM_NAME}.qcow2" # Path for the VM disk image
|
|
||||||
ISO_PATH="./build/debian-atomic-installer.iso" # Path to the installer ISO
|
|
||||||
NETWORK_BRIDGE="virbr0" # Default KVM bridge network (ensure it exists or create one)
|
|
||||||
VNC_PORT="5901" # VNC port (5901 for display 1 to avoid conflicts)
|
|
||||||
|
|
||||||
# --- Functions ---
|
|
||||||
|
|
||||||
# Function to check if a command exists
|
|
||||||
command_exists () {
|
|
||||||
type "$1" &> /dev/null ;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function to display error and exit
|
|
||||||
error_exit () {
|
|
||||||
echo "ERROR: $1" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function to check if VM already exists
|
|
||||||
vm_exists() {
|
|
||||||
virsh list --all --name | grep -q "^${VM_NAME}$"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function to destroy existing VM
|
|
||||||
destroy_vm() {
|
|
||||||
echo "Destroying existing VM: ${VM_NAME}"
|
|
||||||
virsh destroy "${VM_NAME}" 2>/dev/null || true
|
|
||||||
virsh undefine "${VM_NAME}" 2>/dev/null || true
|
|
||||||
}
|
|
||||||
|
|
||||||
# --- Pre-requisites Check ---
|
|
||||||
|
|
||||||
echo "--- Checking for required packages and permissions ---"
|
|
||||||
|
|
||||||
# Check for necessary virtualization packages and libvirt service
|
|
||||||
REQUIRED_PACKAGES=("qemu-kvm" "libvirt-daemon-system" "libvirt-clients" "virt-install")
|
|
||||||
for pkg in "${REQUIRED_PACKAGES[@]}"; do
|
|
||||||
if ! command_exists "$pkg"; then
|
|
||||||
echo "Package or command '$pkg' not found on the host system."
|
|
||||||
echo "For Debian/Ubuntu-based systems:"
|
|
||||||
echo " sudo apt update && sudo apt install -y $pkg"
|
|
||||||
echo "For Fedora/CentOS/RHEL-based systems (including Bazzite):"
|
|
||||||
echo " sudo dnf install -y $pkg"
|
|
||||||
echo " (For immutable distros like Bazzite, use 'sudo rpm-ostree install $pkg')"
|
|
||||||
error_exit "Missing required package/command on the host system."
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Check if current user is in libvirt group
|
|
||||||
if ! groups | grep -q "libvirt"; then
|
|
||||||
echo "Current user is not in 'libvirt' group. You must be in this group to manage VMs."
|
|
||||||
echo "Please add yourself and then log out and log back in for changes to take effect:"
|
|
||||||
echo " sudo usermod -aG libvirt $USER"
|
|
||||||
error_exit "User not in libvirt group."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if libvirtd service is running
|
|
||||||
if ! systemctl is-active --quiet libvirtd; then
|
|
||||||
echo "The 'libvirtd' service is not running. KVM VMs cannot be managed without it."
|
|
||||||
echo "Please start it: sudo systemctl start libvirtd"
|
|
||||||
echo "And enable it to start on boot: sudo systemctl enable libvirtd"
|
|
||||||
error_exit "libvirtd service not active."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if the ISO path is valid
|
|
||||||
if [ ! -f "$ISO_PATH" ]; then
|
|
||||||
error_exit "ISO file not found at '$ISO_PATH'. Please build the installer first with 'just build-iso'."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if the disk image path directory exists
|
|
||||||
DISK_DIR=$(dirname "$DISK_PATH")
|
|
||||||
if [ ! -d "$DISK_DIR" ]; then
|
|
||||||
echo "Creating disk image directory: $DISK_DIR"
|
|
||||||
sudo mkdir -p "$DISK_DIR" || error_exit "Failed to create disk image directory."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- Main Script ---
|
|
||||||
|
|
||||||
echo "--- Starting VM Creation Process ---"
|
|
||||||
|
|
||||||
# Check if VM already exists
|
|
||||||
if vm_exists; then
|
|
||||||
echo "VM '${VM_NAME}' already exists."
|
|
||||||
read -p "Do you want to destroy the existing VM and recreate it? (y/N): " -n 1 -r
|
|
||||||
echo
|
|
||||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
||||||
destroy_vm
|
|
||||||
else
|
|
||||||
echo "Using existing VM. You can start it with: virsh start ${VM_NAME}"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 1. Create the virtual disk image
|
|
||||||
if [ -f "$DISK_PATH" ]; then
|
|
||||||
echo "Warning: Disk image '$DISK_PATH' already exists."
|
|
||||||
read -p "Do you want to delete the existing disk image and recreate it? (y/N): " -n 1 -r
|
|
||||||
echo
|
|
||||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
||||||
echo "Deleting existing disk image..."
|
|
||||||
sudo rm -f "$DISK_PATH" || error_exit "Failed to delete existing disk image."
|
|
||||||
echo "Creating new disk image: $DISK_PATH (${DISK_SIZE})"
|
|
||||||
sudo qemu-img create -f qcow2 "$DISK_PATH" "$DISK_SIZE" || error_exit "Failed to create disk image."
|
|
||||||
else
|
|
||||||
echo "Using existing disk image."
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Creating disk image: $DISK_PATH (${DISK_SIZE})"
|
|
||||||
sudo qemu-img create -f qcow2 "$DISK_PATH" "$DISK_SIZE" || error_exit "Failed to create disk image."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Ensure correct permissions for the disk image
|
|
||||||
sudo chown libvirt-qemu:kvm "$DISK_PATH" || error_exit "Failed to set permissions on disk image."
|
|
||||||
sudo chmod 660 "$DISK_PATH" || error_exit "Failed to set permissions on disk image."
|
|
||||||
|
|
||||||
# 2. Create the VM using virt-install
|
|
||||||
echo "Creating VM '$VM_NAME' with virt-install..."
|
|
||||||
echo " RAM: ${RAM_SIZE}MB"
|
|
||||||
echo " VCPUs: ${VCPU_COUNT}"
|
|
||||||
echo " Disk: ${DISK_PATH}"
|
|
||||||
echo " ISO: ${ISO_PATH}"
|
|
||||||
echo " Network: ${NETWORK_BRIDGE}"
|
|
||||||
echo " VNC Port: ${VNC_PORT}"
|
|
||||||
|
|
||||||
virt-install \
|
|
||||||
--name "${VM_NAME}" \
|
|
||||||
--memory "${RAM_SIZE}" \
|
|
||||||
--vcpus "${VCPU_COUNT}" \
|
|
||||||
--disk path="${DISK_PATH}",format=qcow2 \
|
|
||||||
--cdrom "${ISO_PATH}" \
|
|
||||||
--network bridge="${NETWORK_BRIDGE}",model=virtio \
|
|
||||||
--graphics vnc,listen=0.0.0.0,port="${VNC_PORT}" \
|
|
||||||
--os-type linux \
|
|
||||||
--os-variant debian12 \
|
|
||||||
--noautoconsole \
|
|
||||||
--boot cdrom \
|
|
||||||
--virt-type kvm \
|
|
||||||
--import \
|
|
||||||
--wait 0 || error_exit "Failed to create VM with virt-install."
|
|
||||||
|
|
||||||
echo "VM '$VM_NAME' created successfully!"
|
|
||||||
|
|
||||||
# --- Post-creation Instructions ---
|
|
||||||
|
|
||||||
echo "--- Next Steps ---"
|
|
||||||
echo "1. The VM '${VM_NAME}' has been created and should be starting."
|
|
||||||
echo "2. To connect to the VM using virt-manager:"
|
|
||||||
echo " If virt-manager is a Flatpak (like on Bazzite):"
|
|
||||||
echo " /usr/bin/flatpak run --branch=stable --arch=x86_64 --command=virt-manager org.virt_manager.virt-manager"
|
|
||||||
echo " Otherwise (native installation):"
|
|
||||||
echo " virt-manager"
|
|
||||||
echo " In virt-manager, you should see '${VM_NAME}' VM. Double-click it to open the console."
|
|
||||||
echo "3. To connect directly via a VNC client (e.g., Remmina, TightVNC Viewer), use:"
|
|
||||||
echo " VNC Server: YourHostIP:${VNC_PORT}"
|
|
||||||
echo " (Replace 'YourHostIP' with the IP address of the machine running the VM)"
|
|
||||||
echo "4. Test the Debian Atomic Desktop installer in the VM."
|
|
||||||
echo "5. After testing, you can destroy the VM with:"
|
|
||||||
echo " virsh destroy ${VM_NAME}"
|
|
||||||
echo " virsh undefine ${VM_NAME}"
|
|
||||||
echo ""
|
|
||||||
echo "Script finished."
|
|
||||||
|
|
@ -1,254 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "=== Extracting Container Filesystem ==="
|
|
||||||
|
|
||||||
# Create output directory
|
|
||||||
mkdir -p build/container-filesystem
|
|
||||||
|
|
||||||
# Create a temporary container
|
|
||||||
echo "Creating temporary container from debian-atomic-installer:latest..."
|
|
||||||
TEMP_CONTAINER=$(podman create localhost/debian-atomic-installer:latest)
|
|
||||||
echo "Created container: $TEMP_CONTAINER"
|
|
||||||
|
|
||||||
# Export the entire container filesystem
|
|
||||||
echo "Exporting container filesystem..."
|
|
||||||
podman export $TEMP_CONTAINER | tar -C build/container-filesystem -xf -
|
|
||||||
|
|
||||||
# Clean up temporary container
|
|
||||||
echo "Cleaning up temporary container..."
|
|
||||||
podman rm $TEMP_CONTAINER
|
|
||||||
|
|
||||||
# Prepare the filesystem for live use
|
|
||||||
echo "Preparing filesystem for live system..."
|
|
||||||
cd build/container-filesystem
|
|
||||||
|
|
||||||
# Remove container-specific files
|
|
||||||
rm -f .dockerenv
|
|
||||||
rm -rf run/* tmp/* var/tmp/* || true
|
|
||||||
|
|
||||||
# Create essential mount points
|
|
||||||
mkdir -p proc sys dev run media/cdrom
|
|
||||||
|
|
||||||
# Create a proper systemd-based init
|
|
||||||
cat > sbin/init << 'EOF'
|
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Mount essential filesystems if not already mounted
|
|
||||||
[ ! -d /proc/1 ] && mount -t proc proc /proc
|
|
||||||
[ ! -d /sys/kernel ] && mount -t sysfs sysfs /sys
|
|
||||||
[ ! -c /dev/null ] && mount -t devtmpfs devtmpfs /dev
|
|
||||||
[ ! -d /run/systemd ] && mount -t tmpfs tmpfs /run
|
|
||||||
|
|
||||||
# Start systemd as PID 1
|
|
||||||
if [ -x /usr/lib/systemd/systemd ]; then
|
|
||||||
exec /usr/lib/systemd/systemd
|
|
||||||
else
|
|
||||||
# Fallback to basic shell
|
|
||||||
exec /bin/bash
|
|
||||||
fi
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Create autostart desktop entry for Calamares
|
|
||||||
mkdir -p etc/xdg/autostart
|
|
||||||
cat > etc/xdg/autostart/calamares.desktop << 'EOF'
|
|
||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
Exec=calamares
|
|
||||||
Hidden=false
|
|
||||||
NoDisplay=false
|
|
||||||
X-GNOME-Autostart-enabled=true
|
|
||||||
Name[en_US]=Calamares Installer
|
|
||||||
Name=Calamares Installer
|
|
||||||
Comment[en_US]=System Installer
|
|
||||||
Comment=System Installer
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Configure LightDM for autologin
|
|
||||||
mkdir -p etc/lightdm/lightdm.conf.d
|
|
||||||
cat > etc/lightdm/lightdm.conf.d/50-calamares-autologin.conf << 'EOF'
|
|
||||||
[Seat:*]
|
|
||||||
autologin-user=installer
|
|
||||||
autologin-user-timeout=0
|
|
||||||
user-session=openbox
|
|
||||||
autologin-session=openbox
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Ensure OpenBox session is available
|
|
||||||
mkdir -p usr/share/xsessions
|
|
||||||
cat > usr/share/xsessions/openbox.desktop << 'EOF'
|
|
||||||
[Desktop Entry]
|
|
||||||
Name=Openbox
|
|
||||||
Comment=A lightweight window manager
|
|
||||||
Exec=openbox
|
|
||||||
Icon=openbox
|
|
||||||
Type=Application
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Create openbox session that launches Calamares
|
|
||||||
mkdir -p home/installer/.config/openbox
|
|
||||||
cat > home/installer/.config/openbox/autostart << 'EOF'
|
|
||||||
#!/bin/bash
|
|
||||||
# Auto-launch Calamares installer after desktop is ready
|
|
||||||
sleep 5
|
|
||||||
export DISPLAY=:0
|
|
||||||
# Create a prominent terminal for troubleshooting
|
|
||||||
xterm -geometry 120x30+100+100 -title "Debian Atomic Installer - Type 'calamares' to start installer" -fg white -bg black &
|
|
||||||
# Try to launch Calamares automatically
|
|
||||||
calamares &
|
|
||||||
EOF
|
|
||||||
chmod +x home/installer/.config/openbox/autostart
|
|
||||||
|
|
||||||
# Create OpenBox right-click menu
|
|
||||||
cat > home/installer/.config/openbox/menu.xml << 'EOF'
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<openbox_menu xmlns="http://openbox.org/">
|
|
||||||
<menu id="root-menu" label="Openbox 3">
|
|
||||||
<item label="Launch Calamares Installer">
|
|
||||||
<action name="Execute">
|
|
||||||
<command>calamares</command>
|
|
||||||
</action>
|
|
||||||
</item>
|
|
||||||
<item label="Open Terminal">
|
|
||||||
<action name="Execute">
|
|
||||||
<command>xterm</command>
|
|
||||||
</action>
|
|
||||||
</item>
|
|
||||||
<separator />
|
|
||||||
<item label="Restart">
|
|
||||||
<action name="Execute">
|
|
||||||
<command>reboot</command>
|
|
||||||
</action>
|
|
||||||
</item>
|
|
||||||
<item label="Shutdown">
|
|
||||||
<action name="Execute">
|
|
||||||
<command>poweroff</command>
|
|
||||||
</action>
|
|
||||||
</item>
|
|
||||||
</menu>
|
|
||||||
</openbox_menu>
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Create desktop shortcut for Calamares
|
|
||||||
mkdir -p home/installer/Desktop
|
|
||||||
cat > home/installer/Desktop/install-system.desktop << 'EOF'
|
|
||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
Name=Install Debian Atomic Desktop
|
|
||||||
Comment=Install Debian Atomic Desktop to hard drive
|
|
||||||
Icon=calamares
|
|
||||||
Exec=calamares
|
|
||||||
Terminal=false
|
|
||||||
Categories=System;
|
|
||||||
EOF
|
|
||||||
chmod +x home/installer/Desktop/install-system.desktop
|
|
||||||
|
|
||||||
# Create a more visible desktop shortcut for terminal
|
|
||||||
cat > home/installer/Desktop/terminal.desktop << 'EOF'
|
|
||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
Name=Terminal
|
|
||||||
Comment=Open Terminal
|
|
||||||
Icon=xterm
|
|
||||||
Exec=xterm -title "Installer Terminal - Type 'calamares' to launch installer"
|
|
||||||
Terminal=false
|
|
||||||
Categories=System;
|
|
||||||
EOF
|
|
||||||
chmod +x home/installer/Desktop/terminal.desktop
|
|
||||||
|
|
||||||
# Create a README on desktop
|
|
||||||
cat > home/installer/Desktop/README.txt << 'EOF'
|
|
||||||
=== Debian Atomic Desktop Installer ===
|
|
||||||
|
|
||||||
To launch the installer:
|
|
||||||
1. Right-click on desktop -> "Launch Calamares Installer"
|
|
||||||
2. Double-click "Install Debian Atomic Desktop" icon
|
|
||||||
3. Open terminal and type: calamares
|
|
||||||
4. Run the script: ./launch-installer.sh
|
|
||||||
|
|
||||||
If nothing appears, check the terminal for error messages.
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Create a simple script to launch Calamares manually
|
|
||||||
cat > home/installer/launch-installer.sh << 'EOF'
|
|
||||||
#!/bin/bash
|
|
||||||
echo "Starting Debian Atomic Desktop Installer..."
|
|
||||||
export DISPLAY=:0
|
|
||||||
calamares
|
|
||||||
EOF
|
|
||||||
chmod +x home/installer/launch-installer.sh
|
|
||||||
|
|
||||||
# Create xinitrc for proper X session
|
|
||||||
mkdir -p home/installer
|
|
||||||
cat > home/installer/.xinitrc << 'EOF'
|
|
||||||
#!/bin/bash
|
|
||||||
# Set proper environment
|
|
||||||
export DISPLAY=:0
|
|
||||||
export XDG_SESSION_TYPE=x11
|
|
||||||
export XDG_CURRENT_DESKTOP=openbox
|
|
||||||
|
|
||||||
# Start window manager in background
|
|
||||||
openbox &
|
|
||||||
|
|
||||||
# Start terminal for debugging
|
|
||||||
xterm -geometry 80x24+50+50 -title "Debian Atomic Installer Console" &
|
|
||||||
|
|
||||||
# Wait a moment for WM to start
|
|
||||||
sleep 3
|
|
||||||
|
|
||||||
# Launch Calamares
|
|
||||||
exec calamares
|
|
||||||
EOF
|
|
||||||
chmod +x home/installer/.xinitrc
|
|
||||||
|
|
||||||
# Create xsession that calls xinitrc
|
|
||||||
cat > home/installer/.xsession << 'EOF'
|
|
||||||
#!/bin/bash
|
|
||||||
exec /home/installer/.xinitrc
|
|
||||||
EOF
|
|
||||||
chmod +x home/installer/.xsession
|
|
||||||
|
|
||||||
# Set default systemd target to graphical
|
|
||||||
rm -f etc/systemd/system/default.target
|
|
||||||
ln -sf /usr/lib/systemd/system/graphical.target etc/systemd/system/default.target
|
|
||||||
|
|
||||||
# Create systemd service to launch Calamares after graphical session
|
|
||||||
mkdir -p etc/systemd/system
|
|
||||||
cat > etc/systemd/system/calamares-autostart.service << 'EOF'
|
|
||||||
[Unit]
|
|
||||||
Description=Auto-start Calamares Installer
|
|
||||||
After=graphical.target
|
|
||||||
Wants=graphical.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
User=installer
|
|
||||||
Group=installer
|
|
||||||
Environment=DISPLAY=:0
|
|
||||||
ExecStartPre=/bin/sleep 10
|
|
||||||
ExecStart=/usr/bin/calamares
|
|
||||||
Restart=no
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=graphical.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Enable the service by creating the wants directory and symlink
|
|
||||||
mkdir -p etc/systemd/system/graphical.target.wants
|
|
||||||
ln -sf /etc/systemd/system/calamares-autostart.service etc/systemd/system/graphical.target.wants/calamares-autostart.service
|
|
||||||
|
|
||||||
# Ensure proper ownership of installer user files
|
|
||||||
chown -R 1000:1000 home/installer/ || true
|
|
||||||
|
|
||||||
chmod +x sbin/init
|
|
||||||
|
|
||||||
# Create systemd symlink if it doesn't exist
|
|
||||||
if [ -x usr/lib/systemd/systemd ] && [ ! -L sbin/init.systemd ]; then
|
|
||||||
ln -sf /usr/lib/systemd/systemd sbin/init.systemd
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "✅ Container filesystem extraction completed!"
|
|
||||||
echo "Filesystem size: $(du -sh . | cut -f1)"
|
|
||||||
echo "Files extracted to: $(pwd)"
|
|
||||||
|
|
||||||
cd ../..
|
|
||||||
|
|
@ -1,97 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Script to fix the bootloader on our existing ISO
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "Fixing bootloader on existing ISO..."
|
|
||||||
|
|
||||||
# Check if ISO exists
|
|
||||||
if [ ! -f "build/debian-atomic-installer.iso" ]; then
|
|
||||||
echo "Error: ISO file not found at build/debian-atomic-installer.iso"
|
|
||||||
echo "Please create the ISO first with: just create-iso"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Original ISO found: $(ls -lh build/debian-atomic-installer.iso)"
|
|
||||||
|
|
||||||
# Create a working directory
|
|
||||||
mkdir -p build/iso-fix
|
|
||||||
cd build/iso-fix
|
|
||||||
|
|
||||||
# Extract the existing ISO using podman
|
|
||||||
echo "Extracting existing ISO using podman..."
|
|
||||||
podman run --rm \
|
|
||||||
-v "$(pwd):/work" \
|
|
||||||
-v "$(pwd)/../debian-atomic-installer.iso:/iso/debian-atomic-installer.iso:ro" \
|
|
||||||
-w /work \
|
|
||||||
debian:trixie \
|
|
||||||
bash -c "
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y xorriso
|
|
||||||
xorriso -indev /iso/debian-atomic-installer.iso -osirrox on -extract / .
|
|
||||||
"
|
|
||||||
|
|
||||||
# Install GRUB in a Debian container
|
|
||||||
echo "Installing GRUB bootloader components..."
|
|
||||||
podman run --rm \
|
|
||||||
-v "$(pwd):/work" \
|
|
||||||
-w /work \
|
|
||||||
debian:trixie \
|
|
||||||
bash -c "
|
|
||||||
# Configure apt-cacher-ng proxy
|
|
||||||
if [ -n \"$APT_CACHER_NG_PROXY\" ]; then
|
|
||||||
echo \"Acquire::http::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" > /etc/apt/apt.conf.d/99proxy
|
|
||||||
echo \"Acquire::https::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" >> /etc/apt/apt.conf.d/99proxy
|
|
||||||
fi
|
|
||||||
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y grub-efi-amd64 grub-pc-bin grub-common isolinux xorriso
|
|
||||||
|
|
||||||
# Create proper bootloader structure
|
|
||||||
mkdir -p /work/boot/grub/x86_64-efi
|
|
||||||
mkdir -p /work/boot/grub/i386-pc
|
|
||||||
mkdir -p /work/isolinux
|
|
||||||
|
|
||||||
# Copy GRUB bootloader files
|
|
||||||
cp /usr/lib/grub/x86_64-efi/*.mod /work/boot/grub/x86_64-efi/ 2>/dev/null || echo 'EFI modules not found'
|
|
||||||
cp /usr/lib/grub/i386-pc/*.mod /work/boot/grub/i386-pc/ 2>/dev/null || echo 'PC modules not found'
|
|
||||||
cp /usr/lib/grub/x86_64-efi/grub.efi /work/boot/grub/x86_64-efi/ 2>/dev/null || echo 'EFI grub not found'
|
|
||||||
cp /usr/lib/grub/i386-pc/grub.efi /work/boot/grub/i386-pc/ 2>/dev/null || echo 'PC grub not found'
|
|
||||||
|
|
||||||
# Create isolinux files for legacy boot
|
|
||||||
cp /usr/lib/ISOLINUX/isolinux.bin /work/isolinux/ 2>/dev/null || echo 'isolinux.bin not found'
|
|
||||||
cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /work/isolinux/ 2>/dev/null || echo 'ldlinux.c32 not found'
|
|
||||||
|
|
||||||
# Create isolinux config
|
|
||||||
cat > /work/isolinux/isolinux.cfg << 'EOF'
|
|
||||||
DEFAULT install
|
|
||||||
TIMEOUT 50
|
|
||||||
PROMPT 1
|
|
||||||
|
|
||||||
LABEL install
|
|
||||||
KERNEL /boot/vmlinuz
|
|
||||||
APPEND root=live:CDLABEL=DEBIAN_ATOMIC_INSTALLER quiet initrd=/boot/initrd.img
|
|
||||||
|
|
||||||
LABEL install-safe
|
|
||||||
KERNEL /boot/vmlinuz
|
|
||||||
APPEND root=live:CDLABEL=DEBIAN_ATOMIC_INSTALLER nomodeset initrd=/boot/initrd.img
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Create bootable ISO
|
|
||||||
xorrisofs -o ../debian-atomic-installer-bootable.iso \
|
|
||||||
-b isolinux/isolinux.bin \
|
|
||||||
-c isolinux/boot.cat \
|
|
||||||
-boot-info-table \
|
|
||||||
-no-emul-boot \
|
|
||||||
-boot-load-size 4 \
|
|
||||||
-r \
|
|
||||||
-V 'DEBIAN_ATOMIC_INSTALLER' \
|
|
||||||
/work
|
|
||||||
"
|
|
||||||
|
|
||||||
cd ../..
|
|
||||||
|
|
||||||
echo "Bootable ISO created: build/debian-atomic-installer-bootable.iso"
|
|
||||||
echo "Size: $(ls -lh build/debian-atomic-installer-bootable.iso | awk '{print $5}')"
|
|
||||||
|
|
||||||
echo "✅ Bootloader fix completed!"
|
|
||||||
|
|
@ -1,70 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Script to install custom bootc and ostree packages
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "Installing custom bootc and ostree packages..."
|
|
||||||
|
|
||||||
# Paths to the custom package builds
|
|
||||||
BOOTC_BUILD_DIR="/home/rob/Documents/Projects/bootc-deb/builds"
|
|
||||||
OSTREE_BUILD_DIR="/home/rob/Documents/Projects/libostree-dev/builds"
|
|
||||||
|
|
||||||
# Check if build directories exist
|
|
||||||
if [ ! -d "$BOOTC_BUILD_DIR" ]; then
|
|
||||||
echo "Error: bootc build directory not found at $BOOTC_BUILD_DIR"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -d "$OSTREE_BUILD_DIR" ]; then
|
|
||||||
echo "Error: ostree build directory not found at $OSTREE_BUILD_DIR"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Function to install packages with error handling
|
|
||||||
install_packages() {
|
|
||||||
local pkg_dir="$1"
|
|
||||||
local pattern="$2"
|
|
||||||
|
|
||||||
echo "Installing packages from $pkg_dir matching $pattern..."
|
|
||||||
cd "$pkg_dir"
|
|
||||||
|
|
||||||
# Find all matching packages
|
|
||||||
local packages=($(ls $pattern 2>/dev/null || true))
|
|
||||||
|
|
||||||
if [ ${#packages[@]} -eq 0 ]; then
|
|
||||||
echo "Warning: No packages found matching $pattern in $pkg_dir"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Found packages: ${packages[*]}"
|
|
||||||
|
|
||||||
# Install packages
|
|
||||||
sudo dpkg -i "${packages[@]}" || true
|
|
||||||
sudo apt-get install -f -y
|
|
||||||
|
|
||||||
echo "Packages installed successfully!"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Install ostree packages first (bootc depends on them)
|
|
||||||
echo "Installing ostree packages..."
|
|
||||||
install_packages "$OSTREE_BUILD_DIR" "libostree-1-1_*.deb libostree-dev_*.deb ostree_*.deb ostree-boot_*.deb"
|
|
||||||
|
|
||||||
# Install bootc packages
|
|
||||||
echo "Installing bootc packages..."
|
|
||||||
install_packages "$BOOTC_BUILD_DIR" "bootc_*.deb"
|
|
||||||
|
|
||||||
# Verify installation
|
|
||||||
echo "Verifying installation..."
|
|
||||||
if command -v bootc &> /dev/null; then
|
|
||||||
echo "bootc version: $(bootc --version)"
|
|
||||||
else
|
|
||||||
echo "Warning: bootc not found in PATH"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if command -v ostree &> /dev/null; then
|
|
||||||
echo "ostree version: $(ostree --version)"
|
|
||||||
else
|
|
||||||
echo "Warning: ostree not found in PATH"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Custom packages installation completed!"
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Post-install script for Debian Atomic Desktop
|
|
||||||
# This script is called by Calamares after partitioning and user setup
|
|
||||||
|
|
||||||
echo "Starting Debian Atomic Desktop installation..."
|
|
||||||
|
|
||||||
# Get the target device from Calamares
|
|
||||||
TARGET_DEVICE="${1:-/dev/sda}"
|
|
||||||
ATOMIC_IMAGE="${2:-ghcr.io/particle-os/debian-atomic:latest}"
|
|
||||||
|
|
||||||
echo "Target device: $TARGET_DEVICE"
|
|
||||||
echo "Atomic image: $ATOMIC_IMAGE"
|
|
||||||
|
|
||||||
# Verify the target device exists
|
|
||||||
if [ ! -b "$TARGET_DEVICE" ]; then
|
|
||||||
echo "Error: Target device $TARGET_DEVICE does not exist"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if bootc is available
|
|
||||||
if ! command -v bootc &> /dev/null; then
|
|
||||||
echo "Error: bootc is not installed"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Install the atomic image using bootc
|
|
||||||
echo "Installing atomic image to $TARGET_DEVICE..."
|
|
||||||
bootc install to-disk \
|
|
||||||
--device "$TARGET_DEVICE" \
|
|
||||||
--replace-os \
|
|
||||||
--image "$ATOMIC_IMAGE"
|
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
echo "Atomic image installation completed successfully!"
|
|
||||||
else
|
|
||||||
echo "Error: Failed to install atomic image"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Additional post-install tasks can be added here
|
|
||||||
# For example, copying user data, configuring bootloader, etc.
|
|
||||||
|
|
||||||
echo "Debian Atomic Desktop installation completed!"
|
|
||||||
exit 0
|
|
||||||
|
|
@ -1,101 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Script to test the ISO using podman containers
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "Testing ISO using podman containers..."
|
|
||||||
|
|
||||||
# Check if ISO exists
|
|
||||||
if [ ! -f "build/debian-atomic-installer.iso" ]; then
|
|
||||||
echo "Error: ISO file not found at build/debian-atomic-installer.iso"
|
|
||||||
echo "Please create the ISO first with: just create-iso"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "ISO found: $(ls -lh build/debian-atomic-installer.iso)"
|
|
||||||
|
|
||||||
# Test 1: Verify ISO structure
|
|
||||||
echo ""
|
|
||||||
echo "=== Test 1: Verifying ISO structure ==="
|
|
||||||
podman run --rm \
|
|
||||||
-v "$(pwd)/build:/iso:ro" \
|
|
||||||
debian:trixie \
|
|
||||||
bash -c "
|
|
||||||
# Configure apt-cacher-ng proxy
|
|
||||||
if [ -n \"$APT_CACHER_NG_PROXY\" ]; then
|
|
||||||
echo \"Acquire::http::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" > /etc/apt/apt.conf.d/99proxy
|
|
||||||
echo \"Acquire::https::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" >> /etc/apt/apt.conf.d/99proxy
|
|
||||||
fi
|
|
||||||
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y xorriso
|
|
||||||
echo 'ISO contents:'
|
|
||||||
xorriso -indev /iso/debian-atomic-installer.iso -toc || echo 'Failed to read ISO structure'
|
|
||||||
echo ''
|
|
||||||
echo 'ISO file info:'
|
|
||||||
ls -la /iso/ || echo 'Cannot access /iso/ directory'
|
|
||||||
"
|
|
||||||
|
|
||||||
# Test 2: Check if ISO is bootable (basic check)
|
|
||||||
echo ""
|
|
||||||
echo "=== Test 2: Checking bootable properties ==="
|
|
||||||
podman run --rm \
|
|
||||||
-v "$(pwd)/build:/iso:ro" \
|
|
||||||
debian:trixie \
|
|
||||||
bash -c "
|
|
||||||
# Configure apt-cacher-ng proxy
|
|
||||||
if [ -n \"$APT_CACHER_NG_PROXY\" ]; then
|
|
||||||
echo \"Acquire::http::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" > /etc/apt/apt.conf.d/99proxy
|
|
||||||
echo \"Acquire::https::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" >> /etc/apt/apt.conf.d/99proxy
|
|
||||||
fi
|
|
||||||
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y file
|
|
||||||
echo 'File type analysis:'
|
|
||||||
file /iso/debian-atomic-installer.iso || echo 'File command failed, checking with ls:'
|
|
||||||
echo ''
|
|
||||||
echo 'ISO size and permissions:'
|
|
||||||
ls -la /iso/debian-atomic-installer.iso
|
|
||||||
"
|
|
||||||
|
|
||||||
# Test 3: Extract and examine contents
|
|
||||||
echo ""
|
|
||||||
echo "=== Test 3: Examining ISO contents ==="
|
|
||||||
podman run --rm \
|
|
||||||
-v "$(pwd)/build:/iso:ro" \
|
|
||||||
debian:trixie \
|
|
||||||
bash -c "
|
|
||||||
# Configure apt-cacher-ng proxy
|
|
||||||
if [ -n \"$APT_CACHER_NG_PROXY\" ]; then
|
|
||||||
echo \"Acquire::http::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" > /etc/apt/apt.conf.d/99proxy
|
|
||||||
echo \"Acquire::https::Proxy \\\"$APT_CACHER_NG_PROXY\\\";\" >> /etc/apt/apt.conf.d/99proxy
|
|
||||||
fi
|
|
||||||
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y xorriso
|
|
||||||
mkdir -p /tmp/extract
|
|
||||||
xorriso -indev /iso/debian-atomic-installer.iso -extract / /tmp/extract || echo 'Extraction failed, checking what we can see:'
|
|
||||||
echo 'Extracted contents:'
|
|
||||||
find /tmp/extract -type f 2>/dev/null | head -20 || echo 'No files found'
|
|
||||||
echo ''
|
|
||||||
echo 'Total files extracted:'
|
|
||||||
find /tmp/extract -type f 2>/dev/null | wc -l || echo '0'
|
|
||||||
echo ''
|
|
||||||
echo 'Directory structure:'
|
|
||||||
ls -la /tmp/extract/ 2>/dev/null || echo 'Cannot access extracted directory'
|
|
||||||
"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "✅ ISO testing completed!"
|
|
||||||
echo "The ISO appears to be valid and contains the expected files."
|
|
||||||
echo ""
|
|
||||||
echo "Next steps:"
|
|
||||||
echo "1. To test in a real VM, you can use:"
|
|
||||||
echo " - VirtualBox: File -> Import Appliance"
|
|
||||||
echo " - VMware: Create new VM and attach this ISO"
|
|
||||||
echo " - QEMU: qemu-system-x86_64 -cdrom build/debian-atomic-installer.iso"
|
|
||||||
echo ""
|
|
||||||
echo "2. To improve the ISO, consider:"
|
|
||||||
echo " - Adding proper bootloader (GRUB)"
|
|
||||||
echo " - Including kernel and initrd"
|
|
||||||
echo " - Making it actually bootable"
|
|
||||||
|
|
@ -1,176 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Test Container VM script for Debian Atomic Desktop Bootc Installer
|
|
||||||
# This runs our installer container in a VM-like environment with VNC
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Configuration
|
|
||||||
CONTAINER_NAME="debian-atomic-installer-vm"
|
|
||||||
VNC_PORT="5901"
|
|
||||||
VNC_DISPLAY=":1"
|
|
||||||
|
|
||||||
# Colors for output
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
log_info() {
|
|
||||||
echo -e "${BLUE}[INFO]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_success() {
|
|
||||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_warning() {
|
|
||||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check if installer image exists
|
|
||||||
check_installer() {
|
|
||||||
log_info "Checking installer image..."
|
|
||||||
if ! podman image exists debian-atomic-installer:latest; then
|
|
||||||
log_warning "Installer image not found. Building it first..."
|
|
||||||
just build-installer
|
|
||||||
fi
|
|
||||||
log_success "Installer image ready."
|
|
||||||
}
|
|
||||||
|
|
||||||
# Start the installer container with VNC
|
|
||||||
start_container_vm() {
|
|
||||||
log_info "Starting installer container with VNC access..."
|
|
||||||
log_info "VNC server will be available at: vnc://localhost:$VNC_PORT"
|
|
||||||
log_info "Use a VNC client to connect to: localhost:$VNC_PORT"
|
|
||||||
|
|
||||||
# Stop any existing container
|
|
||||||
podman stop "$CONTAINER_NAME" 2>/dev/null || true
|
|
||||||
podman rm "$CONTAINER_NAME" 2>/dev/null || true
|
|
||||||
|
|
||||||
# Start the container with systemd and VNC
|
|
||||||
podman run -d \
|
|
||||||
--name "$CONTAINER_NAME" \
|
|
||||||
--privileged \
|
|
||||||
--systemd=always \
|
|
||||||
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
|
|
||||||
-p "$VNC_PORT:5900" \
|
|
||||||
-p 2222:22 \
|
|
||||||
-e DISPLAY="$VNC_DISPLAY" \
|
|
||||||
debian-atomic-installer:latest
|
|
||||||
|
|
||||||
log_success "Container started. Connect to VNC at localhost:$VNC_PORT"
|
|
||||||
log_info "To access the container shell: podman exec -it $CONTAINER_NAME bash"
|
|
||||||
log_info "To stop the container: podman stop $CONTAINER_NAME"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Install VNC server in the container
|
|
||||||
setup_vnc() {
|
|
||||||
log_info "Setting up VNC server in the container..."
|
|
||||||
|
|
||||||
podman exec "$CONTAINER_NAME" bash -c "
|
|
||||||
# Install VNC server and desktop environment
|
|
||||||
apt-get update && apt-get install -y \
|
|
||||||
tightvncserver \
|
|
||||||
xfce4 \
|
|
||||||
xfce4-goodies \
|
|
||||||
dbus-x11 \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Create VNC password
|
|
||||||
mkdir -p /root/.vnc
|
|
||||||
echo 'password' | vncpasswd -f > /root/.vnc/passwd
|
|
||||||
chmod 600 /root/.vnc/passwd
|
|
||||||
|
|
||||||
# Create VNC startup script
|
|
||||||
cat > /root/.vnc/xstartup << 'EOF'
|
|
||||||
#!/bin/bash
|
|
||||||
xrdb \$HOME/.Xresources
|
|
||||||
startxfce4 &
|
|
||||||
EOF
|
|
||||||
chmod +x /root/.vnc/xstartup
|
|
||||||
|
|
||||||
# Start VNC server
|
|
||||||
vncserver :1 -geometry 1024x768 -depth 24
|
|
||||||
"
|
|
||||||
|
|
||||||
log_success "VNC server setup completed"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Show container status
|
|
||||||
show_status() {
|
|
||||||
log_info "Container status:"
|
|
||||||
podman ps -a --filter name="$CONTAINER_NAME"
|
|
||||||
|
|
||||||
echo
|
|
||||||
log_info "VNC Access:"
|
|
||||||
echo " Connect to: vnc://localhost:$VNC_PORT"
|
|
||||||
echo " Password: password"
|
|
||||||
echo
|
|
||||||
log_info "SSH Access:"
|
|
||||||
echo " Connect to: ssh installer@localhost -p 2222"
|
|
||||||
echo " Password: installer"
|
|
||||||
echo
|
|
||||||
log_info "Container Shell:"
|
|
||||||
echo " podman exec -it $CONTAINER_NAME bash"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Stop the container
|
|
||||||
stop_container() {
|
|
||||||
log_info "Stopping installer container..."
|
|
||||||
podman stop "$CONTAINER_NAME" 2>/dev/null || true
|
|
||||||
podman rm "$CONTAINER_NAME" 2>/dev/null || true
|
|
||||||
log_success "Container stopped and removed"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Show help
|
|
||||||
show_help() {
|
|
||||||
echo "Usage: $0 [COMMAND]"
|
|
||||||
echo ""
|
|
||||||
echo "Commands:"
|
|
||||||
echo " start - Start installer container with VNC"
|
|
||||||
echo " setup-vnc - Setup VNC server in the container"
|
|
||||||
echo " status - Show container status and access info"
|
|
||||||
echo " stop - Stop and remove the container"
|
|
||||||
echo " test - Full test (start container, setup VNC)"
|
|
||||||
echo " shell - Access container shell"
|
|
||||||
echo " help - Show this help"
|
|
||||||
echo ""
|
|
||||||
echo "VNC Access:"
|
|
||||||
echo " After starting, connect to: vnc://localhost:$VNC_PORT"
|
|
||||||
echo " Password: password"
|
|
||||||
echo ""
|
|
||||||
echo "SSH Access:"
|
|
||||||
echo " ssh installer@localhost -p 2222"
|
|
||||||
echo " Password: installer"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Main execution
|
|
||||||
case "${1:-help}" in
|
|
||||||
"start")
|
|
||||||
check_installer
|
|
||||||
start_container_vm
|
|
||||||
;;
|
|
||||||
"setup-vnc")
|
|
||||||
setup_vnc
|
|
||||||
;;
|
|
||||||
"status")
|
|
||||||
show_status
|
|
||||||
;;
|
|
||||||
"stop")
|
|
||||||
stop_container
|
|
||||||
;;
|
|
||||||
"test")
|
|
||||||
check_installer
|
|
||||||
start_container_vm
|
|
||||||
sleep 5
|
|
||||||
setup_vnc
|
|
||||||
show_status
|
|
||||||
;;
|
|
||||||
"shell")
|
|
||||||
podman exec -it "$CONTAINER_NAME" bash
|
|
||||||
;;
|
|
||||||
"help"|*)
|
|
||||||
show_help
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
@ -1,197 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Test VM script for Debian Atomic Desktop Bootc Installer
|
|
||||||
# This creates a QEMU VM with VNC access to test the installer
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Configuration
|
|
||||||
VM_NAME="debian-atomic-installer-test"
|
|
||||||
VM_DISK="test-vm.qcow2"
|
|
||||||
VM_MEMORY="4G"
|
|
||||||
VM_CORES="2"
|
|
||||||
VNC_PORT="5901"
|
|
||||||
VNC_DISPLAY=":1"
|
|
||||||
|
|
||||||
# Colors for output
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
log_info() {
|
|
||||||
echo -e "${BLUE}[INFO]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_success() {
|
|
||||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_warning() {
|
|
||||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check if installer image exists
|
|
||||||
check_installer() {
|
|
||||||
log_info "Checking installer image..."
|
|
||||||
if ! podman image exists debian-atomic-installer:latest; then
|
|
||||||
log_warning "Installer image not found. Building it first..."
|
|
||||||
just build-installer
|
|
||||||
fi
|
|
||||||
log_success "Installer image ready."
|
|
||||||
}
|
|
||||||
|
|
||||||
# Create bootable ISO from installer container
|
|
||||||
create_iso() {
|
|
||||||
log_info "Creating bootable ISO from installer container..."
|
|
||||||
|
|
||||||
# For now, let's create a simple test ISO using debian-live
|
|
||||||
# This is a temporary approach until we can properly create a bootable ISO
|
|
||||||
log_warning "Creating a simple test ISO using debian-live..."
|
|
||||||
|
|
||||||
# Install live-build if not available
|
|
||||||
if ! command -v lb &> /dev/null; then
|
|
||||||
log_info "Installing live-build..."
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y live-build
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create a minimal live-build configuration
|
|
||||||
mkdir -p /tmp/live-build-test
|
|
||||||
cd /tmp/live-build-test
|
|
||||||
|
|
||||||
# Initialize live-build with minimal config
|
|
||||||
lb config \
|
|
||||||
--architectures amd64 \
|
|
||||||
--distribution trixie \
|
|
||||||
--binary-images iso-hybrid \
|
|
||||||
--debian-installer live \
|
|
||||||
--linux-flavours amd64 \
|
|
||||||
--bootloader syslinux \
|
|
||||||
--verbose
|
|
||||||
|
|
||||||
# Add our installer packages
|
|
||||||
mkdir -p config/package-lists
|
|
||||||
echo "calamares" > config/package-lists/installer.list.chroot
|
|
||||||
echo "bootc" >> config/package-lists/installer.list.chroot
|
|
||||||
echo "podman" >> config/package-lists/installer.list.chroot
|
|
||||||
echo "skopeo" >> config/package-lists/installer.list.chroot
|
|
||||||
|
|
||||||
# Build the ISO
|
|
||||||
log_info "Building live ISO..."
|
|
||||||
sudo lb build
|
|
||||||
|
|
||||||
# Copy the result
|
|
||||||
if [ -f "binary/live-image-amd64.hybrid.iso" ]; then
|
|
||||||
cp binary/live-image-amd64.hybrid.iso /opt/Projects/particleos/02-installer-bootc/debian-atomic-installer.iso
|
|
||||||
log_success "ISO created: debian-atomic-installer.iso"
|
|
||||||
else
|
|
||||||
log_warning "ISO build failed, creating a dummy ISO for testing..."
|
|
||||||
# Create a dummy ISO for testing
|
|
||||||
dd if=/dev/zero of=/opt/Projects/particleos/02-installer-bootc/debian-atomic-installer.iso bs=1M count=100
|
|
||||||
log_warning "Created dummy ISO for testing"
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd /opt/Projects/particleos/02-installer-bootc
|
|
||||||
}
|
|
||||||
|
|
||||||
# Create VM disk
|
|
||||||
create_vm_disk() {
|
|
||||||
log_info "Creating VM disk..."
|
|
||||||
if [ -f "$VM_DISK" ]; then
|
|
||||||
log_warning "VM disk already exists. Removing it..."
|
|
||||||
rm -f "$VM_DISK"
|
|
||||||
fi
|
|
||||||
|
|
||||||
qemu-img create -f qcow2 "$VM_DISK" 20G
|
|
||||||
log_success "VM disk created: $VM_DISK"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Start the VM
|
|
||||||
start_vm() {
|
|
||||||
log_info "Starting VM with VNC access..."
|
|
||||||
log_info "VNC server will be available at: vnc://localhost:$VNC_PORT"
|
|
||||||
log_info "Use a VNC client to connect to: localhost:$VNC_PORT"
|
|
||||||
|
|
||||||
qemu-system-x86_64 \
|
|
||||||
-name "$VM_NAME" \
|
|
||||||
-m "$VM_MEMORY" \
|
|
||||||
-smp "$VM_CORES" \
|
|
||||||
-enable-kvm \
|
|
||||||
-cpu host \
|
|
||||||
-machine q35 \
|
|
||||||
-device virtio-vga \
|
|
||||||
-display vnc=localhost:$VNC_DISPLAY \
|
|
||||||
-cdrom debian-atomic-installer.iso \
|
|
||||||
-drive file="$VM_DISK",format=qcow2 \
|
|
||||||
-device virtio-net-pci,netdev=net0 \
|
|
||||||
-netdev user,id=net0,hostfwd=tcp::2222-:22 \
|
|
||||||
-device virtio-balloon \
|
|
||||||
-device virtio-rng-pci \
|
|
||||||
-rtc base=utc \
|
|
||||||
-boot d \
|
|
||||||
-vga virtio \
|
|
||||||
-display sdl,gl=on \
|
|
||||||
-serial mon:stdio \
|
|
||||||
-nographic
|
|
||||||
}
|
|
||||||
|
|
||||||
# Show help
|
|
||||||
show_help() {
|
|
||||||
echo "Usage: $0 [COMMAND]"
|
|
||||||
echo ""
|
|
||||||
echo "Commands:"
|
|
||||||
echo " build-iso - Build bootable ISO from installer container"
|
|
||||||
echo " create-vm - Create VM disk"
|
|
||||||
echo " start-vm - Start VM with VNC access"
|
|
||||||
echo " test - Full test (build ISO, create VM, start VM)"
|
|
||||||
echo " clean - Clean up VM files"
|
|
||||||
echo " help - Show this help"
|
|
||||||
echo ""
|
|
||||||
echo "VNC Access:"
|
|
||||||
echo " After starting the VM, connect to: vnc://localhost:$VNC_PORT"
|
|
||||||
echo " Or use: vncviewer localhost:$VNC_PORT"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Clean up
|
|
||||||
cleanup() {
|
|
||||||
log_info "Cleaning up VM files..."
|
|
||||||
rm -f "$VM_DISK"
|
|
||||||
rm -f debian-atomic-installer.iso
|
|
||||||
log_success "Cleanup completed."
|
|
||||||
}
|
|
||||||
|
|
||||||
# Main execution
|
|
||||||
case "${1:-help}" in
|
|
||||||
"build-iso")
|
|
||||||
check_installer
|
|
||||||
create_iso
|
|
||||||
;;
|
|
||||||
"create-vm")
|
|
||||||
create_vm_disk
|
|
||||||
;;
|
|
||||||
"start-vm")
|
|
||||||
if [ ! -f "debian-atomic-installer.iso" ]; then
|
|
||||||
log_warning "ISO not found. Building it first..."
|
|
||||||
check_installer
|
|
||||||
create_iso
|
|
||||||
fi
|
|
||||||
if [ ! -f "$VM_DISK" ]; then
|
|
||||||
log_warning "VM disk not found. Creating it first..."
|
|
||||||
create_vm_disk
|
|
||||||
fi
|
|
||||||
start_vm
|
|
||||||
;;
|
|
||||||
"test")
|
|
||||||
check_installer
|
|
||||||
create_iso
|
|
||||||
create_vm_disk
|
|
||||||
start_vm
|
|
||||||
;;
|
|
||||||
"clean")
|
|
||||||
cleanup
|
|
||||||
;;
|
|
||||||
"help"|*)
|
|
||||||
show_help
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
@ -1,88 +0,0 @@
|
||||||
# Debian Atomic Desktop - Phase 2: Calamares Installer
|
|
||||||
|
|
||||||
This is Phase 2 of the Debian Atomic Desktop project, focusing on creating a bootable ISO with a Calamares installer that can deploy the atomic image.
|
|
||||||
|
|
||||||
## Project Overview
|
|
||||||
|
|
||||||
Phase 2 builds upon the Phase 1 foundation to create a complete installation experience. The goal is to create a bootable ISO that presents a Calamares installer, which successfully installs the minimal atomic image created in Phase 1.
|
|
||||||
|
|
||||||
**Note: This build system is designed to create Debian Trixie ISOs from Ubuntu Noble hosts.**
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
- Ubuntu Noble host system
|
|
||||||
- `live-build` for creating the live ISO environment
|
|
||||||
- `calamares` package and dependencies
|
|
||||||
- `qemu-system-x86_64` for testing the ISO
|
|
||||||
- Access to the Phase 1 image (either embedded or from a registry)
|
|
||||||
- Internet connection for downloading Debian Trixie packages
|
|
||||||
|
|
||||||
## Quick Start
|
|
||||||
|
|
||||||
1. **Build the installer ISO:**
|
|
||||||
```bash
|
|
||||||
just build-iso
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Test the ISO in QEMU:**
|
|
||||||
```bash
|
|
||||||
just test-iso
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Clean up build artifacts:**
|
|
||||||
```bash
|
|
||||||
just clean-iso
|
|
||||||
```
|
|
||||||
|
|
||||||
## Available Commands
|
|
||||||
|
|
||||||
Use `just --list` to see all available commands.
|
|
||||||
|
|
||||||
### Build Commands
|
|
||||||
- `just build-iso` - Build the bootable ISO with Calamares installer
|
|
||||||
- `just build-iso-debug` - Build with debug output
|
|
||||||
|
|
||||||
### Testing Commands
|
|
||||||
- `just test-iso` - Test the ISO in QEMU
|
|
||||||
- `just test-iso-gui` - Test with GUI (if available)
|
|
||||||
|
|
||||||
### Maintenance Commands
|
|
||||||
- `just clean-iso` - Clean up ISO build artifacts
|
|
||||||
- `just clean-all` - Clean all build artifacts
|
|
||||||
|
|
||||||
## ISO Contents
|
|
||||||
|
|
||||||
The Phase 2 ISO includes:
|
|
||||||
- Minimal Debian live environment
|
|
||||||
- Calamares installer with custom configuration
|
|
||||||
- Integration with the Phase 1 atomic image
|
|
||||||
- Automated partitioning and installation
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
The installer uses custom Calamares configuration files:
|
|
||||||
- `calamares/settings.conf` - Main settings
|
|
||||||
- `calamares/modules/` - Module configurations
|
|
||||||
- `calamares/branding/` - Custom branding
|
|
||||||
|
|
||||||
## Installation Process
|
|
||||||
|
|
||||||
1. Boot from the ISO
|
|
||||||
2. Calamares installer launches automatically
|
|
||||||
3. User configures language, location, and user account
|
|
||||||
4. Installer partitions the disk and installs the atomic image
|
|
||||||
5. System reboots into the installed atomic desktop
|
|
||||||
|
|
||||||
## Next Steps
|
|
||||||
|
|
||||||
This is Phase 2 of the roadmap. Future phases will include:
|
|
||||||
- Phase 3: Desktop environment and kernel modules
|
|
||||||
- Phase 4: Polish and distribution
|
|
||||||
|
|
||||||
## Development
|
|
||||||
|
|
||||||
The project uses:
|
|
||||||
- `live-build/` - Live ISO build configuration
|
|
||||||
- `calamares/` - Calamares installer configuration
|
|
||||||
- `justfile` - Build automation
|
|
||||||
- `scripts/` - Helper scripts for the build process
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
||||||
# Debian Atomic Desktop - Calamares Branding
|
|
||||||
# Branding configuration for the installer
|
|
||||||
|
|
||||||
# General branding information
|
|
||||||
componentName: "Debian Atomic Desktop"
|
|
||||||
componentVersion: "Phase 2"
|
|
||||||
componentLogo: "debian-atomic-logo.png"
|
|
||||||
componentUrl: "https://github.com/your-username/debian-atomic-desktop"
|
|
||||||
componentAuthor: "Debian Atomic Desktop Project"
|
|
||||||
|
|
||||||
# Welcome page
|
|
||||||
welcome:
|
|
||||||
title: "Welcome to Debian Atomic Desktop"
|
|
||||||
subtitle: "A modern, atomic Debian-based desktop distribution"
|
|
||||||
showSupportUrl: true
|
|
||||||
showKnownIssuesUrl: true
|
|
||||||
showReleaseNotesUrl: true
|
|
||||||
|
|
||||||
# Product information
|
|
||||||
product:
|
|
||||||
name: "Debian Atomic Desktop"
|
|
||||||
version: "Phase 2"
|
|
||||||
shortName: "Debian Atomic"
|
|
||||||
shortVersion: "2.0"
|
|
||||||
bootloaderEntryName: "Debian Atomic Desktop"
|
|
||||||
productUrl: "https://github.com/your-username/debian-atomic-desktop"
|
|
||||||
supportUrl: "https://github.com/your-username/debian-atomic-desktop/issues"
|
|
||||||
knownIssuesUrl: "https://github.com/your-username/debian-atomic-desktop/wiki/Known-Issues"
|
|
||||||
releaseNotesUrl: "https://github.com/your-username/debian-atomic-desktop/releases"
|
|
||||||
|
|
||||||
# Slideshow
|
|
||||||
slideshow:
|
|
||||||
api: 1
|
|
||||||
path: "show.qml"
|
|
||||||
|
|
||||||
# Style
|
|
||||||
style:
|
|
||||||
sidebarBackground: "#2c3e50"
|
|
||||||
sidebarText: "#ecf0f1"
|
|
||||||
sidebarTextSelect: "#3498db"
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
# Partitioning module configuration for Debian Atomic Desktop
|
|
||||||
# This configures how Calamares will partition the target disk
|
|
||||||
|
|
||||||
# Default partitioning scheme
|
|
||||||
defaultPartitionTableType: gpt
|
|
||||||
|
|
||||||
# Default file system types
|
|
||||||
defaultFileSystemType: ext4
|
|
||||||
defaultFsType: ext4
|
|
||||||
|
|
||||||
# Available file system types
|
|
||||||
availableFileSystemTypes:
|
|
||||||
- ext4
|
|
||||||
- btrfs
|
|
||||||
- xfs
|
|
||||||
- f2fs
|
|
||||||
|
|
||||||
# Partitioning schemes
|
|
||||||
partitionLayout:
|
|
||||||
# EFI system partition
|
|
||||||
- name: "EFI System Partition"
|
|
||||||
size: 512M
|
|
||||||
filesystem: vfat
|
|
||||||
mountPoint: /boot/efi
|
|
||||||
flags:
|
|
||||||
- boot
|
|
||||||
- esp
|
|
||||||
|
|
||||||
# Boot partition for bootc
|
|
||||||
- name: "Boot Partition"
|
|
||||||
size: 1G
|
|
||||||
filesystem: ext4
|
|
||||||
mountPoint: /boot
|
|
||||||
flags:
|
|
||||||
- boot
|
|
||||||
|
|
||||||
# Root partition (will be replaced by bootc)
|
|
||||||
- name: "Root Partition"
|
|
||||||
size: 100%
|
|
||||||
filesystem: ext4
|
|
||||||
mountPoint: /
|
|
||||||
flags:
|
|
||||||
- root
|
|
||||||
|
|
||||||
# Swap configuration
|
|
||||||
swap:
|
|
||||||
# Use swap file instead of partition
|
|
||||||
useSwapFile: true
|
|
||||||
swapFileSize: 4G
|
|
||||||
|
|
||||||
# Bootloader configuration
|
|
||||||
bootloader:
|
|
||||||
# Install bootloader to the first disk
|
|
||||||
installPath: /dev/sda
|
|
||||||
# Use systemd-boot for EFI
|
|
||||||
bootloader: systemd-boot
|
|
||||||
|
|
@ -1,51 +0,0 @@
|
||||||
# Shell process module configuration for Debian Atomic Desktop
|
|
||||||
# This handles the post-installation deployment of the atomic image
|
|
||||||
|
|
||||||
# Post-installation script to deploy atomic image
|
|
||||||
script:
|
|
||||||
# First, ensure bootc is available
|
|
||||||
- command: "which"
|
|
||||||
arguments:
|
|
||||||
- "bootc"
|
|
||||||
timeout: 30
|
|
||||||
|
|
||||||
# Deploy the atomic image using bootc
|
|
||||||
- command: "bootc"
|
|
||||||
arguments:
|
|
||||||
- "install"
|
|
||||||
- "to-disk"
|
|
||||||
- "--device"
|
|
||||||
- "/dev/sda"
|
|
||||||
- "--replace-os"
|
|
||||||
- "--image"
|
|
||||||
- "debian-atomic:latest"
|
|
||||||
timeout: 300
|
|
||||||
|
|
||||||
# Alternative: deploy from local image if available
|
|
||||||
- command: "podman"
|
|
||||||
arguments:
|
|
||||||
- "load"
|
|
||||||
- "-i"
|
|
||||||
- "/run/archivemount/atomic-image.tar"
|
|
||||||
timeout: 60
|
|
||||||
|
|
||||||
# Set up bootc configuration with proper error handling
|
|
||||||
- command: "bootc"
|
|
||||||
arguments:
|
|
||||||
- "install"
|
|
||||||
- "to-disk"
|
|
||||||
- "--device"
|
|
||||||
- "/dev/sda"
|
|
||||||
- "--replace-os"
|
|
||||||
- "--image"
|
|
||||||
- "localhost/debian-atomic:latest"
|
|
||||||
timeout: 300
|
|
||||||
|
|
||||||
# Environment variables
|
|
||||||
environment:
|
|
||||||
BOOTC_IMAGE: "debian-atomic:latest"
|
|
||||||
BOOTC_DEVICE: "/dev/sda"
|
|
||||||
BOOTC_VERSION: "1.5.1-1~noble1"
|
|
||||||
|
|
||||||
# Error handling
|
|
||||||
onError: "continue"
|
|
||||||
|
|
@ -1,73 +0,0 @@
|
||||||
# Debian Atomic Desktop - Calamares Settings
|
|
||||||
# Main configuration file for the Calamares installer
|
|
||||||
|
|
||||||
# General settings
|
|
||||||
general:
|
|
||||||
# Installer branding
|
|
||||||
branding: debian-atomic
|
|
||||||
|
|
||||||
# Installer behavior
|
|
||||||
prompt-install: false
|
|
||||||
dont-chroot: false
|
|
||||||
|
|
||||||
# System requirements
|
|
||||||
requirements:
|
|
||||||
check-enough-disk-space: true
|
|
||||||
required-storage: 8G
|
|
||||||
check-internet: false
|
|
||||||
|
|
||||||
# Display settings
|
|
||||||
display:
|
|
||||||
# Installer window
|
|
||||||
window-title: "Debian Atomic Desktop Installer"
|
|
||||||
window-icon: "debian-atomic"
|
|
||||||
|
|
||||||
# Welcome page
|
|
||||||
welcome:
|
|
||||||
show-support-url: true
|
|
||||||
show-known-issues-url: true
|
|
||||||
show-release-notes-url: true
|
|
||||||
|
|
||||||
# Module sequence for installation
|
|
||||||
sequence:
|
|
||||||
# Welcome and preparation
|
|
||||||
- show:
|
|
||||||
- welcome
|
|
||||||
- locale
|
|
||||||
- keyboard
|
|
||||||
- partition
|
|
||||||
- users
|
|
||||||
|
|
||||||
# Installation
|
|
||||||
- exec:
|
|
||||||
- partition
|
|
||||||
- mount
|
|
||||||
- unpackfs
|
|
||||||
- machineid
|
|
||||||
- fstab
|
|
||||||
- locale
|
|
||||||
- keyboard
|
|
||||||
- localecfg
|
|
||||||
- luksbootkeyfile
|
|
||||||
- luksopenswaphookcfg
|
|
||||||
- initcpiocfg
|
|
||||||
- initcpio
|
|
||||||
- users
|
|
||||||
- displaymanager
|
|
||||||
- networkcfg
|
|
||||||
- hwclock
|
|
||||||
- services-systemd
|
|
||||||
- bootloader
|
|
||||||
- packages
|
|
||||||
- preservefiles
|
|
||||||
- removeuser
|
|
||||||
- shellprocess
|
|
||||||
- initramfs
|
|
||||||
- grubcfg
|
|
||||||
- bootloader
|
|
||||||
- postcfg
|
|
||||||
- umount
|
|
||||||
|
|
||||||
# Finish
|
|
||||||
- show:
|
|
||||||
- finished
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
deb http://deb.debian.org/debian trixie main
|
|
||||||
deb http://deb.debian.org/debian trixie-updates main
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
# Debian Atomic Desktop - Custom sources.list
|
|
||||||
# This file overrides the default sources.list to exclude the security repository
|
|
||||||
|
|
||||||
# Main Debian Trixie repository
|
|
||||||
deb http://deb.debian.org/debian/ trixie main contrib non-free
|
|
||||||
deb-src http://deb.debian.org/debian/ trixie main contrib non-free
|
|
||||||
|
|
||||||
# Debian Trixie updates
|
|
||||||
deb http://deb.debian.org/debian/ trixie-updates main contrib non-free
|
|
||||||
deb-src http://deb.debian.org/debian/ trixie-updates main contrib non-free
|
|
||||||
|
|
||||||
# Note: Security repository intentionally excluded for Debian Trixie
|
|
||||||
# as it's not yet available for this release
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
# Repository configuration for robojerk packages (bootc)
|
|
||||||
# This provides the official Debian packages for atomic deployment tools
|
|
||||||
# Note: Using noble repository for bootc since we're building from Ubuntu Noble
|
|
||||||
# Temporarily disabled due to SSL certificate issues
|
|
||||||
|
|
||||||
# deb [signed-by=/etc/apt/keyrings/forgejo-robojerk.asc] https://git.raines.xyz/api/packages/robojerk/debian noble main
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
deb https://ftp.debian.org/debian/ trixie main contrib non-free
|
|
||||||
deb-src https://ftp.debian.org/debian/ trixie main contrib non-free
|
|
||||||
deb https://ftp.debian.org/debian/ trixie-updates main contrib non-free
|
|
||||||
deb-src https://ftp.debian.org/debian/ trixie-updates main contrib non-free
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Debian Atomic Desktop - Phase 2: Live Build Configuration
|
|
||||||
# This script configures live-build for creating the installer ISO
|
|
||||||
|
|
||||||
# Basic configuration
|
|
||||||
lb config \
|
|
||||||
--architectures amd64 \
|
|
||||||
--binary-images iso-hybrid \
|
|
||||||
--distribution trixie \
|
|
||||||
--mode debian \
|
|
||||||
--apt-recommends false \
|
|
||||||
--apt-secure false \
|
|
||||||
--bootappend-live "boot=live components username=debian-atomic hostname=debian-atomic" \
|
|
||||||
--bootloader syslinux \
|
|
||||||
--cache true \
|
|
||||||
--cache-packages true \
|
|
||||||
--checksums sha256 \
|
|
||||||
--compression gzip \
|
|
||||||
--debian-installer live \
|
|
||||||
--debian-installer-gui false \
|
|
||||||
--initramfs-compression gzip \
|
|
||||||
--iso-application "Debian Atomic Desktop Installer" \
|
|
||||||
--iso-publisher "Debian Atomic Desktop Project" \
|
|
||||||
--iso-volume "Debian Atomic Desktop" \
|
|
||||||
--linux-flavours amd64 \
|
|
||||||
--linux-packages linux-image \
|
|
||||||
--memtest none \
|
|
||||||
--security true \
|
|
||||||
--source false \
|
|
||||||
--updates true \
|
|
||||||
--verbose
|
|
||||||
|
|
||||||
# Additional packages for the live environment
|
|
||||||
echo "calamares" >> config/package-lists/calamares.list.chroot
|
|
||||||
echo "calamares-settings-debian" >> config/package-lists/calamares.list.chroot
|
|
||||||
echo "live-boot" >> config/package-lists/live-boot.list.chroot
|
|
||||||
echo "live-config" >> config/package-lists/live-config.list.chroot
|
|
||||||
echo "live-tools" >> config/package-lists/live-tools.list.chroot
|
|
||||||
echo "network-manager" >> config/package-lists/network.list.chroot
|
|
||||||
echo "network-manager-gnome" >> config/package-lists/network.list.chroot
|
|
||||||
echo "sudo" >> config/package-lists/admin.list.chroot
|
|
||||||
echo "curl" >> config/package-lists/tools.list.chroot
|
|
||||||
echo "wget" >> config/package-lists/tools.list.chroot
|
|
||||||
echo "vim" >> config/package-lists/tools.list.chroot
|
|
||||||
|
|
||||||
# Desktop environment (minimal for installer)
|
|
||||||
echo "task-xfce-desktop" >> config/package-lists/desktop.list.chroot
|
|
||||||
echo "lightdm" >> config/package-lists/desktop.list.chroot
|
|
||||||
echo "lightdm-gtk-greeter" >> config/package-lists/desktop.list.chroot
|
|
||||||
|
|
||||||
# Bootc and container tools
|
|
||||||
echo "bootc" >> config/package-lists/bootc.list.chroot
|
|
||||||
echo "podman" >> config/package-lists/bootc.list.chroot
|
|
||||||
echo "skopeo" >> config/package-lists/bootc.list.chroot
|
|
||||||
|
|
@ -1,119 +0,0 @@
|
||||||
# config/binary - options for live-build(7), binary stage
|
|
||||||
|
|
||||||
# Set image type
|
|
||||||
LB_IMAGE_TYPE="iso-hybrid"
|
|
||||||
|
|
||||||
# Set image filesystem
|
|
||||||
LB_BINARY_FILESYSTEM="fat16"
|
|
||||||
|
|
||||||
# Set apt/aptitude generic indices
|
|
||||||
LB_APT_INDICES="true"
|
|
||||||
|
|
||||||
# Set boot parameters
|
|
||||||
LB_BOOTAPPEND_LIVE="boot=live components quiet splash"
|
|
||||||
|
|
||||||
# Set boot parameters
|
|
||||||
LB_BOOTAPPEND_INSTALL=""
|
|
||||||
|
|
||||||
# Set boot parameters
|
|
||||||
LB_BOOTAPPEND_LIVE_FAILSAFE="boot=live components memtest noapic noapm nodma nomce nosmp nosplash vga=788"
|
|
||||||
|
|
||||||
# Set BIOS bootloader
|
|
||||||
LB_BOOTLOADER_BIOS="syslinux"
|
|
||||||
|
|
||||||
# Set EFI bootloader
|
|
||||||
LB_BOOTLOADER_EFI=""
|
|
||||||
|
|
||||||
# Set bootloaders
|
|
||||||
LB_BOOTLOADERS="syslinux"
|
|
||||||
|
|
||||||
# Set checksums
|
|
||||||
LB_CHECKSUMS="sha256 md5"
|
|
||||||
|
|
||||||
# Set compression
|
|
||||||
LB_COMPRESSION="xz"
|
|
||||||
|
|
||||||
# Support dm-verity on rootfs
|
|
||||||
LB_DM_VERITY=""
|
|
||||||
|
|
||||||
# Support FEC on dm-verity rootfs
|
|
||||||
LB_DM_VERITY_FEC_ROOTS=""
|
|
||||||
|
|
||||||
# Set sign script for roothash for dm-verity rootfs
|
|
||||||
LB_DM_VERITY_SIGN=""
|
|
||||||
|
|
||||||
# Set zsync
|
|
||||||
LB_ZSYNC="true"
|
|
||||||
|
|
||||||
# Control if we build binary images chrooted
|
|
||||||
# NEVER, *EVER*, *E*V*E*R* SET THIS OPTION to false.
|
|
||||||
LB_BUILD_WITH_CHROOT="true"
|
|
||||||
|
|
||||||
# Set debian-installer
|
|
||||||
LB_DEBIAN_INSTALLER="live"
|
|
||||||
|
|
||||||
# Set debian-installer suite
|
|
||||||
LB_DEBIAN_INSTALLER_DISTRIBUTION="trixie"
|
|
||||||
|
|
||||||
# Set debian-installer preseed filename/url
|
|
||||||
LB_DEBIAN_INSTALLER_PRESEEDFILE=""
|
|
||||||
|
|
||||||
# Toggle use of GUI debian-installer
|
|
||||||
LB_DEBIAN_INSTALLER_GUI="true"
|
|
||||||
|
|
||||||
# Set hdd label
|
|
||||||
LB_HDD_LABEL="DEBIAN_LIVE"
|
|
||||||
|
|
||||||
# Set hdd filesystem size
|
|
||||||
LB_HDD_SIZE="10000"
|
|
||||||
|
|
||||||
# Set start of partition for the hdd target for BIOSes that expect a specific boot partition start (e.g. "63s"). If empty, use optimal layout.
|
|
||||||
LB_HDD_PARTITION_START=""
|
|
||||||
|
|
||||||
# Set iso author
|
|
||||||
LB_ISO_APPLICATION="Debian Atomic Desktop Installer"
|
|
||||||
|
|
||||||
# Set iso preparer
|
|
||||||
LB_ISO_PREPARER="live-build 3.0~a57-1; http://packages.qa.debian.org/live-build"
|
|
||||||
|
|
||||||
# Set iso publisher
|
|
||||||
LB_ISO_PUBLISHER="Debian Atomic Desktop Project"
|
|
||||||
|
|
||||||
# Set iso volume (max 32 chars)
|
|
||||||
LB_ISO_VOLUME="Debian Atomic Desktop"
|
|
||||||
|
|
||||||
# Set jffs2 eraseblock size
|
|
||||||
LB_JFFS2_ERASEBLOCK=""
|
|
||||||
|
|
||||||
# Set memtest
|
|
||||||
LB_MEMTEST="memtest86+"
|
|
||||||
|
|
||||||
# Set loadlin
|
|
||||||
LB_LOADLIN="true"
|
|
||||||
|
|
||||||
# Set win32-loader
|
|
||||||
LB_WIN32_LOADER="false"
|
|
||||||
|
|
||||||
# Set net tarball
|
|
||||||
LB_NET_TARBALL="true"
|
|
||||||
|
|
||||||
# Set onie
|
|
||||||
LB_ONIE="false"
|
|
||||||
|
|
||||||
# Set onie additional kernel cmdline options
|
|
||||||
LB_ONIE_KERNEL_CMDLINE=""
|
|
||||||
|
|
||||||
# Set inclusion of firmware packages in debian-installer
|
|
||||||
LB_FIRMWARE_BINARY="true"
|
|
||||||
|
|
||||||
# Set inclusion of firmware packages in the live image
|
|
||||||
LB_FIRMWARE_CHROOT="true"
|
|
||||||
|
|
||||||
# Set swap file path
|
|
||||||
LB_SWAP_FILE_PATH=""
|
|
||||||
|
|
||||||
# Set swap file size
|
|
||||||
LB_SWAP_FILE_SIZE="512"
|
|
||||||
|
|
||||||
# Enable/disable UEFI secure boot support
|
|
||||||
LB_UEFI_SECURE_BOOT="auto"
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
||||||
# config/bootstrap - options for live-build(7), bootstrap stage
|
|
||||||
|
|
||||||
# Select architecture to use
|
|
||||||
LB_ARCHITECTURE="amd64"
|
|
||||||
|
|
||||||
# Select distribution to use
|
|
||||||
LB_DISTRIBUTION="trixie"
|
|
||||||
|
|
||||||
# Select parent distribution to use
|
|
||||||
LB_PARENT_DISTRIBUTION="trixie"
|
|
||||||
|
|
||||||
# Select distribution to use in the chroot
|
|
||||||
LB_DISTRIBUTION_CHROOT="trixie"
|
|
||||||
|
|
||||||
# Select parent distribution to use in the chroot
|
|
||||||
LB_PARENT_DISTRIBUTION_CHROOT="trixie"
|
|
||||||
|
|
||||||
# Select distribution to use in the final image
|
|
||||||
LB_DISTRIBUTION_BINARY="trixie"
|
|
||||||
|
|
||||||
# Select parent distribution to use in the final image
|
|
||||||
LB_PARENT_DISTRIBUTION_BINARY="trixie"
|
|
||||||
|
|
||||||
# Select parent distribution for debian-installer to use
|
|
||||||
LB_PARENT_DEBIAN_INSTALLER_DISTRIBUTION="trixie"
|
|
||||||
|
|
||||||
# Select archive areas to use
|
|
||||||
LB_ARCHIVE_AREAS="main"
|
|
||||||
|
|
||||||
# Select parent archive areas to use
|
|
||||||
LB_PARENT_ARCHIVE_AREAS="main"
|
|
||||||
|
|
||||||
# Set parent mirror to bootstrap from
|
|
||||||
LB_PARENT_MIRROR_BOOTSTRAP="http://deb.debian.org/debian/"
|
|
||||||
|
|
||||||
# Set parent mirror to fetch packages from
|
|
||||||
LB_PARENT_MIRROR_CHROOT="http://deb.debian.org/debian/"
|
|
||||||
|
|
||||||
# Set security parent mirror to fetch packages from
|
|
||||||
LB_PARENT_MIRROR_CHROOT_SECURITY="http://security.debian.org/"
|
|
||||||
|
|
||||||
# Set parent mirror which ends up in the image
|
|
||||||
LB_PARENT_MIRROR_BINARY="http://cdn.debian.net/debian/"
|
|
||||||
|
|
||||||
# Set security parent mirror which ends up in the image
|
|
||||||
LB_PARENT_MIRROR_BINARY_SECURITY="http://security.debian.org/"
|
|
||||||
|
|
||||||
# Set debian-installer parent mirror
|
|
||||||
LB_PARENT_MIRROR_DEBIAN_INSTALLER="http://deb.debian.org/debian/"
|
|
||||||
|
|
||||||
# Set mirror to bootstrap from
|
|
||||||
LB_MIRROR_BOOTSTRAP="https://ftp.debian.org/debian/"
|
|
||||||
|
|
||||||
# Set mirror to fetch packages from
|
|
||||||
LB_MIRROR_CHROOT="https://ftp.debian.org/debian/"
|
|
||||||
|
|
||||||
# Set security mirror to fetch packages from
|
|
||||||
LB_MIRROR_CHROOT_SECURITY="http://security.debian.org/"
|
|
||||||
|
|
||||||
# Set mirror which ends up in the image
|
|
||||||
LB_MIRROR_BINARY="http://deb.debian.org/debian/"
|
|
||||||
|
|
||||||
# Set security mirror which ends up in the image
|
|
||||||
LB_MIRROR_BINARY_SECURITY="http://security.debian.org/"
|
|
||||||
|
|
||||||
# Set debian-installer mirror
|
|
||||||
LB_MIRROR_DEBIAN_INSTALLER="http://deb.debian.org/debian/"
|
|
||||||
|
|
||||||
# Set architectures to use foreign bootstrap
|
|
||||||
LB_BOOTSTRAP_QEMU_ARCHITECTURE=""
|
|
||||||
|
|
||||||
# Set packages to exclude during foreign bootstrap
|
|
||||||
LB_BOOTSTRAP_QEMU_EXCLUDE=""
|
|
||||||
|
|
||||||
# Set static qemu binary for foreign bootstrap
|
|
||||||
LB_BOOTSTRAP_QEMU_STATIC=""
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
# config/chroot - options for live-build(7), chroot stage
|
|
||||||
|
|
||||||
# Set chroot filesystem
|
|
||||||
LB_CHROOT_FILESYSTEM="squashfs"
|
|
||||||
|
|
||||||
# Set chroot squashfs compression level
|
|
||||||
LB_CHROOT_SQUASHFS_COMPRESSION_LEVEL=""
|
|
||||||
|
|
||||||
# Set chroot squashfs compression type
|
|
||||||
LB_CHROOT_SQUASHFS_COMPRESSION_TYPE=""
|
|
||||||
|
|
||||||
# Set union filesystem
|
|
||||||
LB_UNION_FILESYSTEM="aufs"
|
|
||||||
|
|
||||||
# Set interactive build
|
|
||||||
LB_INTERACTIVE="false"
|
|
||||||
|
|
||||||
# Set keyring packages
|
|
||||||
LB_KEYRING_PACKAGES="debian-archive-keyring"
|
|
||||||
|
|
||||||
# Set kernel flavour to use (with arch)
|
|
||||||
LB_LINUX_FLAVOURS_WITH_ARCH="amd64"
|
|
||||||
|
|
||||||
# Set kernel packages to use
|
|
||||||
LB_LINUX_PACKAGES="linux-image"
|
|
||||||
|
|
||||||
# Enable security updates
|
|
||||||
LB_SECURITY="false"
|
|
||||||
|
|
||||||
# Enable updates updates
|
|
||||||
LB_UPDATES="true"
|
|
||||||
|
|
||||||
# Enable backports updates
|
|
||||||
LB_BACKPORTS="false"
|
|
||||||
|
|
||||||
# Enable proposed updates
|
|
||||||
LB_PROPOSED_UPDATES="false"
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
# Debian Atomic Desktop - Custom sources.list
|
|
||||||
# This file overrides the default sources.list to exclude the security repository
|
|
||||||
|
|
||||||
# Main Debian Trixie repository
|
|
||||||
deb http://deb.debian.org/debian/ trixie main contrib non-free
|
|
||||||
deb-src http://deb.debian.org/debian/ trixie main contrib non-free
|
|
||||||
|
|
||||||
# Debian Trixie updates
|
|
||||||
deb http://deb.debian.org/debian/ trixie-updates main contrib non-free
|
|
||||||
deb-src http://deb.debian.org/debian/ trixie-updates main contrib non-free
|
|
||||||
|
|
||||||
# Note: Security repository intentionally excluded for Debian Trixie
|
|
||||||
# as it's not yet available for this release
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Security repository disabled for Debian Trixie
|
|
||||||
# This file prevents live-build from adding the security repository
|
|
||||||
# which is not yet available for Debian Trixie
|
|
||||||
|
|
@ -1,102 +0,0 @@
|
||||||
# config/common - common options for live-build(7)
|
|
||||||
|
|
||||||
# Version of live-build used to build config (config format version)
|
|
||||||
LB_CONFIGURATION_VERSION="20250505"
|
|
||||||
|
|
||||||
# Set package manager
|
|
||||||
LB_APT="apt"
|
|
||||||
|
|
||||||
# Set proxy for HTTP connections
|
|
||||||
LB_APT_HTTP_PROXY=""
|
|
||||||
|
|
||||||
# Set apt/aptitude pipeline depth
|
|
||||||
LB_APT_PIPELINE=""
|
|
||||||
|
|
||||||
# Set apt/aptitude recommends
|
|
||||||
LB_APT_RECOMMENDS="false"
|
|
||||||
|
|
||||||
# Set apt/aptitude security
|
|
||||||
LB_APT_SECURE="true"
|
|
||||||
|
|
||||||
# Set apt/aptitude source entries in sources.list
|
|
||||||
LB_APT_SOURCE_ARCHIVES="true"
|
|
||||||
|
|
||||||
# Control cache
|
|
||||||
LB_CACHE="true"
|
|
||||||
|
|
||||||
# Control if downloaded package indices should be cached
|
|
||||||
LB_CACHE_INDICES="false"
|
|
||||||
|
|
||||||
# Control if downloaded packages files should be cached
|
|
||||||
LB_CACHE_PACKAGES="true"
|
|
||||||
|
|
||||||
# Control if completed stages should be cached
|
|
||||||
LB_CACHE_STAGES="bootstrap"
|
|
||||||
|
|
||||||
# Set debconf(1) frontend to use
|
|
||||||
LB_DEBCONF_FRONTEND="noninteractive"
|
|
||||||
|
|
||||||
# Set debconf(1) priority to use
|
|
||||||
LB_DEBCONF_PRIORITY="critical"
|
|
||||||
|
|
||||||
# Set initramfs hook
|
|
||||||
LB_INITRAMFS="live-boot"
|
|
||||||
|
|
||||||
# Set initramfs compression
|
|
||||||
LB_INITRAMFS_COMPRESSION="gzip"
|
|
||||||
|
|
||||||
# Set init system
|
|
||||||
LB_INITSYSTEM="sysvinit"
|
|
||||||
|
|
||||||
# Set distribution mode
|
|
||||||
LB_MODE="debian"
|
|
||||||
|
|
||||||
# Set system type
|
|
||||||
LB_SYSTEM="live"
|
|
||||||
|
|
||||||
# Set base name of the image
|
|
||||||
LB_IMAGE_NAME="live-image"
|
|
||||||
|
|
||||||
# Set options to use with apt
|
|
||||||
APT_OPTIONS="--option Acquire::IndexTargets::deb-src::Contents-deb::DefaultEnabled=false"
|
|
||||||
|
|
||||||
# Set options to use with aptitude
|
|
||||||
APTITUDE_OPTIONS="--assume-yes"
|
|
||||||
|
|
||||||
# Set options to use with debootstrap
|
|
||||||
DEBOOTSTRAP_OPTIONS=""
|
|
||||||
|
|
||||||
# Set script to use with debootstrap
|
|
||||||
DEBOOTSTRAP_SCRIPT=""
|
|
||||||
|
|
||||||
# Set options to use with gzip
|
|
||||||
GZIP_OPTIONS="-6 --rsyncable"
|
|
||||||
|
|
||||||
# Enable UTC timestamps
|
|
||||||
LB_UTC_TIME="false"
|
|
||||||
|
|
||||||
# live-build options
|
|
||||||
|
|
||||||
# Enable breakpoints
|
|
||||||
# If set here, overrides the command line option
|
|
||||||
#_BREAKPOINTS="false"
|
|
||||||
|
|
||||||
# Enable debug
|
|
||||||
# If set here, overrides the command line option
|
|
||||||
#_DEBUG="false"
|
|
||||||
|
|
||||||
# Enable color
|
|
||||||
# If set here, overrides the command line option
|
|
||||||
#_COLOR="auto"
|
|
||||||
|
|
||||||
# Enable force
|
|
||||||
# If set here, overrides the command line option
|
|
||||||
#_FORCE="false"
|
|
||||||
|
|
||||||
# Enable quiet
|
|
||||||
# If set here, overrides the command line option
|
|
||||||
#_QUIET="false"
|
|
||||||
|
|
||||||
# Enable verbose
|
|
||||||
# If set here, overrides the command line option
|
|
||||||
#_VERBOSE="true"
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
echo "Forcing mirror to https://ftp.debian.org/debian/ and fixing apt issues in bootstrap stage..."
|
|
||||||
cat > /etc/apt/sources.list << "EOF_SOURCES"
|
|
||||||
deb https://ftp.debian.org/debian/ trixie main contrib non-free
|
|
||||||
deb-src https://ftp.debian.org/debian/ trixie main contrib non-free
|
|
||||||
deb https://ftp.debian.org/debian/ trixie-updates main contrib non-free
|
|
||||||
deb-src https://ftp.debian.org/debian/ trixie-updates main contrib non-free
|
|
||||||
EOF_SOURCES
|
|
||||||
echo "Acquire::IndexTargets::deb::Contents-deb::DefaultEnabled \"false\";" > /etc/apt/apt.conf.d/99-disable-contents
|
|
||||||
echo "Bootstrap sources.list forced and Contents disabled successfully."
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
echo "Disabling Contents downloads in chroot stage..."
|
|
||||||
echo "Acquire::IndexTargets::deb::Contents-deb::DefaultEnabled \"false\";" > /etc/apt/apt.conf.d/99-disable-contents
|
|
||||||
echo "Contents downloads disabled in chroot stage."
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
echo "Preventing sysvinit packages from being installed..."
|
|
||||||
echo "Package: sysvinit-core" > /etc/apt/preferences.d/99-sysvinit
|
|
||||||
echo "Pin: release *" >> /etc/apt/preferences.d/99-sysvinit
|
|
||||||
echo "Pin-Priority: -1" >> /etc/apt/preferences.d/99-sysvinit
|
|
||||||
echo "Package: initscripts" >> /etc/apt/preferences.d/99-sysvinit
|
|
||||||
echo "Pin: release *" >> /etc/apt/preferences.d/99-sysvinit
|
|
||||||
echo "Pin-Priority: -1" >> /etc/apt/preferences.d/99-sysvinit
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
cat > /etc/systemd/system/calamares-autostart.service << "EOF2"
|
|
||||||
[Unit]
|
|
||||||
Description=Starts the Calamares installer on boot
|
|
||||||
Wants=graphical.target
|
|
||||||
After=graphical.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
ExecStart=/usr/bin/calamares
|
|
||||||
Restart=no
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=graphical.target
|
|
||||||
EOF2
|
|
||||||
systemctl enable calamares-autostart.service
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
echo "Removing conflicting sysvinit packages..."
|
|
||||||
apt-get remove --purge -y sysvinit-core initscripts sysv-rc || true
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/live/0010-disable-kexec-tools.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/live/0050-disable-sysvinit-tmpfs.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/1000-create-mtab-symlink.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/1010-enable-cryptsetup.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/1020-create-locales-files.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/5000-update-apt-file-cache.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/5010-update-apt-xapian-index.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/5020-update-glx-alternative.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/5030-update-plocate-database.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/5040-update-nvidia-alternative.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/5050-dracut.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/8000-remove-adjtime-configuration.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/8010-remove-backup-files.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/8020-remove-dbus-machine-id.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/8030-truncate-log-files.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/8040-remove-mdadm-configuration.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/8050-remove-openssh-server-host-keys.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/8060-remove-systemd-machine-id.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/8070-remove-temporary-files.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/8080-reproducible-glibc.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/8090-remove-ssl-cert-snakeoil.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/8100-remove-udev-persistent-cd-rules.hook.chroot
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/usr/share/live/build/hooks/normal/8110-remove-udev-persistent-net-rules.hook.chroot
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue