GuidesAndNotes/custom-ubuntu-guide.md

3.2 KiB

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:

sudo apt install xorriso

Step 1: Extract the Original ISO Contents

# 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

# 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:

# 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

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:

# 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