Resumen/X Linux (distro)
Instalador de texto
X se instala desde el ISO en vivo con un instalador de texto. No hay
instalador gráfico (Calamares fue eliminado). Todo lo que se describe vive bajo
airootfs/root/x-installer/ en este repositorio y viaja en el entorno en vivo
hasta /root/x-installer/.
Puntos de entrada y cuándo se ejecuta el instalador
-
El entorno en vivo hace autologin como
rooten TTY1 (autologin de agetty) con zsh. -
/root/.zloginejecuta primero/root/.automated_script.sh(el mecanismo oficialscript=de archiso) si existe, y después lanza el instalador en TTY1, salvo que la línea de comandos del kernel contengascript=oxauto=1. -
El punto de entrada es
installer.sh(/root/x-installer/installer.sh). -
Hay un atajo disponible en el shell en vivo:
xinstallxinstall(/usr/local/bin/xinstall) simplemente ejecutainstaller.sh. Si caes a un shell normal en lugar del instalador, ejecutaxinstallobash /root/x-installer/installer.sh.
Estructura del instalador
/root/x-installer/
|-- installer.sh # punto de entrada (configurador + instalador)
|-- configurator.sh # configuración interactiva, escribe un plan JSON
|-- install.sh # realiza la instalación real
|-- autoinstall.sh # entrada desatendida (xauto=1 + disco cidata)
|-- ui.sh # ayudas de interfaz: gum con fallback a prompts
|-- packages.x86_64 # manifiesto por defecto del perfil "full"
`-- packages/ # payload offline de x-scripts (*.pkg.tar.zst)
Una unidad de systemd, x-autoinstall.service, está habilitada en la imagen
en vivo (airootfs/etc/systemd/system/) y gestiona la ruta desatendida.
Consulta Autoinstalación más abajo.
Flujo interactivo
installer.sh ejecuta el configurador y, si tiene éxito, el instalador.
configurator.shrecoge las opciones siguientes y escribe/tmp/x-install.json(permisos 600).install.shlee ese JSON, lo valida y realiza la instalación.
Con X_DRY=1 solo se muestra el plan, sin tocar el disco (consulta
Variables de entorno).
Opciones del configurador (configurator.sh)
La interfaz usa gum (choose, input, confirm) cuando está disponible y
cae a prompts de texto plano en caso contrario (ui.sh).
| Paso | Opciones | Valor almacenado |
|---|---|---|
| Disco | cualquier dispositivo de bloque de tipo disk (de lsblk) | disk (p. ej. /dev/sda) |
| Idioma del sistema | English, Español, Deutsch, Français | language + locale |
| Distribución de teclado | us, es, de, fr, uk, latam, br-abnt2 | keyboard |
| Zona horaria | UTC, Europe/Madrid, Europe/London, Europe/Berlin, America/Mexico_City, America/Argentina/Buenos_Aires, America/Los_Angeles, Asia/Tokyo | timezone |
| Hostname | texto libre (por defecto x) | hostname |
| Nombre de usuario | texto libre | username |
| Password del usuario | texto libre (repetido) | password |
| Perfil de paquetes | Full (all packages) / Core (minimal system) | profile (full/core) |
| Gestor de arranque | GRUB (BIOS + UEFI) / systemd-boot (UEFI only) | bootloader (grub/systemd-boot) |
| Cifrado de raíz (LUKS) | sí/no | encryption (yes/no) |
| Passphrase LUKS | reutilizar la del usuario o una dedicada | luks_password |
| Instalar el setup de Hyprland | sí/no (requiere red) | hyprland (yes/no) |
Mapeo idioma a locale que usa el configurador:
| Idioma | language | locale |
|---|---|---|
| English | en | en_US.UTF-8 |
| Español | es | es_ES.UTF-8 |
| Deutsch | de | de_DE.UTF-8 |
| Français | fr | fr_FR.UTF-8 |
Reglas de validación: el hostname debe cumplir
^[a-zA-Z0-9][a-zA-Z0-9-]{0,62}$; el nombre de usuario
^[a-z_][a-z0-9_-]{0,31}$; las passwords/passphrases no pueden contener "
ni \.
Antes de escribir la configuración, el configurador pide una confirmación final de que todo lo que haya en el disco seleccionado será borrado. El JSON resultante tiene este aspecto:
{"disk":"/dev/sda","hostname":"x","username":"x","password":"secret","language":"en","locale":"en_US.UTF-8","keyboard":"us","timezone":"UTC","profile":"full","bootloader":"grub","encryption":"no","luks_password":"","hyprland":"no"}
El JSON se escribe en la ruta de X_CONFIG_OUT (por defecto
/tmp/x-install.json). Solo se requieren disk, hostname, username y
password; el resto de claves tienen valores por defecto sensatos si no
están.
Pasos de la instalación (install.sh)
- Analizar y validar el JSON (
disk,hostname,username); requiere root y un dispositivo de bloque real. - Particionar con GPT (
sgdisk --zap-allprimero):grub: particiónbios_grubde 1 MiB, partición EFI de 512 MiB, resto = raíz.systemd-boot: partición EFI de 512 MiB, resto = raíz.
- LUKS (si
encryption=yes):cryptsetup luksFormat --type luks2sobre la partición raíz (passphrase deluks_password, con fallback a la password del usuario) y apertura como/dev/mapper/xroot. - Formatear y montar: la partición EFI como FAT32 (
mkfs.vfat -F32) montada en/mnt/boot; la raíz (o el mapeo LUKS) como btrfs montada en/mnt. - Conjunto de paquetes:
- Conjunto base:
base base-devel linux linux-firmware sudo networkmanager openssh git jq x-release kitty pipewire pipewire-pulse pipewire-alsa wireplumber alsa-utils sddm, másgrub efibootmgrpara GRUB ycryptsetuppara LUKS. - Perfil
full: añade todos los paquetes del manifiesto apuntado porX_PKGLIST(por defecto/root/x-installer/packages.x86_64). - Perfil
core: añade solovim zsh.
- Conjunto base:
- Esperar a la red (comprobación de DNS contra
geo.mirror.pkgbuild.com, hasta ~120 s) y ejecutarpacstrap -K /mnt <pkgs>desde los mirrors oficiales más el repositorio[x]. - Instalar
x-scriptsoffline: el payloadpackages/x-scripts-*.pkg.tar.zstpresente en el entorno en vivo se copia al destino y se instala conpacman -Udentro del chroot. - Configuración base:
genfstab, enlace simbólico de la zona horaria,locale.gen+/etc/locale.conf,KEYMAPen/etc/vconsole.conf, hostname, copia del mirrorlist funcional y anexado del repositorio[x]alpacman.confdel destino si no existe. - Usuario: crear el usuario (miembro de
wheel, shell de loginbash), fijar la password conchpasswdy habilitar%wheelensudoers. - Aprovisionamiento con la CLI
xdel paquetex-scripts:- fases de sistema como root:
X_HW_AUTO=0 x setup; - fases de usuario como el usuario nuevo:
X_HYPRLAND=0 X_HW_AUTO=0 x setup --user. - PipeWire/Pulse/WirePlumber se habilitan para todos los usuarios; el
setup de Hyprland queda diferido a un paso/punto posterior (no se
ejecuta aquí cuando
hyprland=no).
- fases de sistema como root:
- Setup de Hyprland (solo si
hyprland=yes): se crea un drop-in temporal de sudo sin password y se ejecuta/usr/share/x/tools/hyprland-install.shcomo el usuario destino. El drop-in se elimina después. La herramienta prefiere la instantánea de configuración offline incluida en el paquete (/usr/share/x/config); solo clona el repositorio externoxscriptor-colors/hyprland(ramamain) como fallback y nunca configura NVIDIA (eso lo gestiona la fase de hardware del sistema). - Initramfs (solo LUKS): sustituir
HOOKSenmkinitcpio.confpara incluir el hookencrypty reconstruir conmkinitcpio -P. - Branding:
x-release-apply(del paquetex-release) se ejecuta antes del paso del gestor de arranque para que la línea de comandos del kernel de LUKS escrita después no se sobrescriba. - Gestor de arranque:
grub:grub-installparax86_64-efi(removable) yi386-pc(arranque desde el disco completo) y despuésgrub-mkconfig. Con LUKS,GRUB_CMDLINE_LINUXse fija acryptdevice=UUID=<luks-uuid>:xroot root=/dev/mapper/xroot rw.systemd-boot:bootctl --esp-path=/boot install, un fallback removableBOOTX64.EFIsi hiciera falta y una entrada de arranqueX Linux(solo UEFI) con la línearoot=ocryptdevice=adecuada.
- Limpieza: al salir se desmontan los sistemas de archivos, se cierra el mapeo LUKS si está abierto y se elimina el JSON de instalación.
Un mensaje indica que la instalación ha terminado; reinicia y retira el medio de instalación.
Autoinstalación
El instalador soporta la instalación desatendida desde el ISO en vivo:
- La línea de comandos del kernel debe contener
xauto=1. - Debe existir un dispositivo de almacenamiento etiquetado como
cidatacon un archivox-install.json(por ejemplo, un disco virtual extra en QEMU).
x-autoinstall.service (habilitada en la imagen en vivo) ejecuta
autoinstall.sh, que:
- Se omite inmediatamente si
xauto=1no está en la línea de comandos. - Busca el dispositivo por etiqueta (
blkid -L cidata); se omite si no existe. - Lo monta en solo lectura en
/run/cidata. - Ejecuta
install.shconX_INSTALL_JSONapuntando a/run/cidata/x-install.json. - Escribe el log en
/tmp/x-install.logy lo reenvía a la consola serie / consola, y después desmonta.
El JSON de una ejecución desatendida solo requiere las claves base, por ejemplo:
{"disk":"/dev/vda","hostname":"x-vm","username":"x","password":"secret","profile":"core","bootloader":"grub","encryption":"no","hyprland":"no"}
Consulta Pruebas en una máquina virtual para un ejemplo de disco cidata.
El otro mecanismo de automatización es el parámetro oficial script= de
archiso (/root/.automated_script.sh descarga o copia un script y lo
ejecuta). Cuando hay script= o xauto=1, el instalador interactivo no se
lanza.
Referencia de la línea de comandos del kernel
| Parámetro | Efecto |
|---|---|
script=<url or path> | Ejecuta el script de automatización oficial de archiso; el instalador interactivo se omite. |
xauto=1 | Activa la autoinstalación desatendida (necesita un disco cidata con x-install.json). |
accessibility= | Activa zle de una línea (TTY amigable con lectores de pantalla). |
Variables de entorno
| Variable | Valor por defecto | Ámbito | Efecto |
|---|---|---|---|
X_SKIP_INSTALLER | sin definir | en vivo | 1 hace que installer.sh imprima "skipped" y salga. |
X_DRY | 0 | en vivo | 1 muestra solo el plan; no escribe ni borra nada. |
X_CONFIG_OUT | /tmp/x-install.json | configurador | Dónde se escribe el JSON de configuración. |
X_INSTALL_JSON | /tmp/x-install.json | instalador | JSON que consume install.sh. |
X_PKGLIST | /root/x-installer/packages.x86_64 | instalador | Manifiesto del perfil full. |
X_HYPRLAND | payload por defecto 1 | payload (x setup) | El instalador lo fija a 0 para diferir el setup de Hyprland. |
X_HW_AUTO | payload por defecto 1 | payload (x setup) | Se fija a 0 durante la instalación para desactivar la autodetección de hardware. |
Notas:
- Con
X_DRY=1,installer.shse asegura de que exista un JSON (con un valor provisional si hace falta) y ejecutainstall.sh, que imprime el plan de instalación y sale sin tocar el disco. El configurador, ejecutado conX_DRY=1, escribe el JSON sin la password y se detiene antes de la confirmación de borrado. X_HYPRLAND/X_HW_AUTOpertenecen al payloadx-scripts; el instalador las fija al llamar ax setup.
Requisitos y advertencias
- La instalación requiere acceso a red:
pacstrapdescarga desde los mirrors oficiales de Arch y el repositorio[x]. Un mirror offline incluido en el ISO está pendiente (consulta la ROADMAP del workspace). - El disco de destino se borra por completo.
systemd-bootes solo UEFI; GRUB escribe tanto la ruta BIOS (con la particiónbios_grub) como la UEFI (removable), de modo que cualquiera de los dos modos de arranque funciona.- LUKS usa LUKS2 con el hook
encryptclásico del initramfs.