Este proyecto crea una ISO autoinstall de Ubuntu Server que:
- instala usuario
lerixcon password1234 - habilita SSH con login por password
- instala y habilita Docker
- detecta NVIDIA en post-install e intenta instalar drivers con
ubuntu-drivers - muestra en cada login un mensaje con estado de NVIDIA y Docker
- si existe
os/scripts/motd.py, lo instala y lo usa como MOTD en login - anuncia
lerix-llm.localpor mDNS (Avahi) - levanta un contenedor
nginxal arranque que expone specs del host enhttps://lerix-llm.local/ - fuerza en post-install: hostname
lerix-llm+ instalación/habilitación deavahi-daemon - ejecuta self-test con
testinfrausandospecs.yaml; si falla, no arrancadocker compose
La lógica de post-instalación ya no está embebida en user-data.yaml; ahora vive en archivos:
/Users/lerix/Projects/sandbox/custom-os/os/install/post-install.sh/Users/lerix/Projects/sandbox/custom-os/os/install/generate-specs-json.sh/Users/lerix/Projects/sandbox/custom-os/os/install/nginx-default.conf/Users/lerix/Projects/sandbox/custom-os/os/install/llm-https.service/Users/lerix/Projects/sandbox/custom-os/os/install/avahi-daemon.conf/Users/lerix/Projects/sandbox/custom-os/os/install/gpu-docker-info.sh/Users/lerix/Projects/sandbox/custom-os/os/selftest/specs.yaml/Users/lerix/Projects/sandbox/custom-os/os/selftest/test_selftest.py/Users/lerix/Projects/sandbox/custom-os/os/selftest/run_selftest.sh/Users/lerix/Projects/sandbox/custom-os/os/systemd/abacus-selftest.service/Users/lerix/Projects/sandbox/custom-os/os/systemd/abacus-stack.service/Users/lerix/Projects/sandbox/custom-os/os/compose/docker-compose.prod.yml
autoinstall/user-data.yaml solo copia os/ desde NoCloud y ejecuta post-install.sh.
El post-install también aplica /etc/avahi/avahi-daemon.conf para que lerix-llm.local salga anunciando mDNS desde el primer boot.
La instalación usa storage.layout.name: direct para que Subiquity cree automáticamente la partición de boot correcta según el modo real (UEFI/BIOS) del equipo.
xorrisomd5sum- ISO oficial Ubuntu Server live (
ubuntu-24.04-live-server-amd64.isoo similar) - (Opcional)
packer
macOS:
brew install xorriso packerUbuntu:
sudo apt-get update
sudo apt-get install -y xorriso packercd /Users/lerix/Projects/sandbox/custom-os
bash scripts/build-autoinstall-iso.sh /ruta/a/ubuntu-live-server.iso ubuntu-lerix-autoinstall.isocd /Users/lerix/Projects/sandbox/custom-os/packer
packer build -var 'source_iso=/ruta/a/ubuntu-live-server.iso' .- Flashea la ISO a USB.
- Arranca el PC en modo UEFI desde ese USB.
- El autoinstall corre solo y reinicia.
- Login con
lerix / 1234.
systemctl status docker --no-pager
systemctl status abacus-selftest --no-pager
systemctl status abacus-stack --no-pager
nvidia-smi
systemctl status avahi-daemon --no-pager
curl -sk https://127.0.0.1/
curl -sk https://lerix-llm.local/
sudo cat /etc/abacus-appliance/specs.yamlNota: el certificado TLS es autofirmado para uso local, así que el navegador mostrará advertencia a menos que confíes ese cert.
En cada login interactivo verás:
NVIDIA GPU detectedoNVIDIA GPU not detectedDocker service: activeoinactive
Si luego quieres usar MAAS, reutiliza el mismo autoinstall/user-data.yaml como base de cloud-init/autoinstall y mantén el mismo bloque storage para evitar el problema de matched no disk.
Si tienes un template packer con builder qemu + communicator SSH, usa rutas con ${path.root}:
provisioner "file" {
source = "${path.root}/../os/"
destination = "/tmp/os"
}
provisioner "shell" {
inline = [
"sudo mkdir -p /opt/abacus-appliance/scripts",
"sudo cp /tmp/os/scripts/motd.py /opt/abacus-appliance/scripts/motd.py",
"sudo chmod 0755 /opt/abacus-appliance/scripts/motd.py",
"printf '%s\\n' '#!/usr/bin/env bash' 'test -t 1 || exit 0' '/usr/bin/python3 /opt/abacus-appliance/scripts/motd.py || true' | sudo tee /etc/profile.d/00-abacus-motd.sh >/dev/null",
"sudo chmod 0755 /etc/profile.d/00-abacus-motd.sh"
]
}Nota: esto no aplica a source \"null\" con communicator = \"none\"; ahí solo corre shell-local.