diff --git a/custom-ubuntu-guide.md b/custom-ubuntu-guide.md new file mode 100644 index 0000000..14abe40 --- /dev/null +++ b/custom-ubuntu-guide.md @@ -0,0 +1,142 @@ +# Creating a Custom Ubuntu Server Installation Image + +This guide walks through the process of creating a customized Ubuntu Server installation image with automated setup. + +## Prerequisites + +Install the required tools: + +```bash +sudo apt install xorriso +``` + +## Step 1: Extract the Original ISO Contents + +```bash +# Create working directory +mkdir -p ubuntu-custom/{extract,iso} + +# Enter the working directory +cd ubuntu-custom + +# Download the iso file if we don't have it already +test -e ubuntu-24.04.2-live-server-amd64.iso || curl -O https://releases.ubuntu.com/24.04.2/ubuntu-24.04.2-live-server-amd64.iso + +# Mount the original ISO +sudo mount -o loop ubuntu-24.04.2-live-server-amd64.iso iso + +# Copy all contents +rsync -av iso/ extract/ + +# Unmount when done +sudo umount iso/ +``` + +## Step 2: Create Autoinstall Configuration + +```bash +# Create directory for autoinstall files +chmod u+w extract/casper/ +mkdir -p extract/casper/autoinstall/ + +# Create user-data file with your configuration +cat > extract/casper/autoinstall/user-data << 'EOF' +#cloud-config +autoinstall: + version: 1 + locale: en_US + keyboard: + layout: us + storage: + layout: + name: direct + identity: + hostname: myserver + username: user + # Generate with: mkpasswd --method=SHA-512 + password: $6$rounds=4096$.... + ssh: + install-server: yes + authorized-keys: + - ssh-rsa AAAAB3N.... + packages: + - openssh-server + - fail2ban + - ufw + user-data: + disable_root: true + late-commands: + - echo 'user ALL=(ALL) NOPASSWD:ALL' > /target/etc/sudoers.d/user + - curtin in-target -- ufw allow OpenSSH + - curtin in-target -- ufw --force enable +EOF + +# Create empty meta-data file (required) +touch extract/casper/autoinstall/meta-data +``` + +## Step 3: Modify Boot Configuration + +Edit the GRUB configuration to enable autoinstall: + +```bash +# Backup original config +chmod u+w extract/boot/grub/ +cp extract/boot/grub/grub.cfg extract/boot/grub/grub.cfg.backup + +# Edit the grub.cfg file +nano extract/boot/grub/grub.cfg +``` + +Replace or modify the first menuentry to: + +``` +menuentry "Automated Ubuntu Server Install" { + set gfxpayload=keep + linux /casper/vmlinuz autoinstall ds=nocloud\;s=/cdrom/casper/autoinstall/ quiet --- + initrd /casper/initrd +} +``` + +## Step 4: Create the Custom ISO + +```bash +xorriso -as mkisofs -r \ + -V "Ubuntu Custom" \ + -o custom-ubuntu.iso \ + -J -joliet-long \ + -b boot/grub/i386-pc/eltorito.img \ + -no-emul-boot -boot-load-size 4 -boot-info-table \ + -eltorito-alt-boot -e EFI/boot/bootx64.efi \ + -no-emul-boot \ + extract/ +``` + +## Step 5: Test the ISO + +Test the ISO using a virtual machine: + +```bash +# With QEMU +qemu-img create -f qcow2 test-disk.qcow2 20G +qemu-system-x86_64 -cdrom custom-ubuntu.iso \ + -drive file=test-disk.qcow2,format=qcow2,if=virtio \ + -m 2048 +``` + +## Additional Customization Options + +You can expand the `user-data` file to include: + +1. Additional packages +2. Custom scripts to run during installation +3. Network configuration +4. More complex storage layouts with custom partitioning +5. Time zone and locale settings + +## Troubleshooting + +If the installer doesn't automate: +- Check that the paths in the kernel parameters match where you placed the autoinstall files +- Verify the syntax of your user-data file +- Ensure both user-data and meta-data files exist