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) |
| Modo de instalación | Wipe the disk (delete everything) / Dualboot (use free space, keep existing OS) | mode (wipe/dualboot) |
| 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) |
| Instalar los agentes IA de Xscriptor | sí/no (requiere red) | agents (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 acorde al modo: en wipe avisa que se borrará todo el disco; en
dualboot aclara que solo se usará el espacio libre y que las particiones
existentes y la ESP se preservan. El JSON resultante tiene este aspecto:
{"disk":"/dev/sda","mode":"wipe","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","agents":"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; en mododualbootnunca se toca la tabla existente):grub: particiónbios_grubde 1 MiB, partición EFI de 1 GiB, resto = raíz.systemd-boot: partición EFI de 1 GiB, resto = raíz.
1 GiB deja lugar para varias generaciones de entries de arranque en el ESP.
-
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 con los subvolúmenes@,@home,@snapshotsy@xstatemontados en/,/home,/.snapshotsy/var/lib/x./tmpse agrega al fstab como tmpfs. -
Conjunto de paquetes:
- Conjunto base:
base base-devel linux linux-firmware sudo networkmanager openssh git jq x-release btrfs-progs xfetch-bin xtop-git kitty pipewire pipewire-pulse pipewire-alsa wireplumber alsa-utils sddm, másgrub efibootmgrpara GRUB ycryptsetuppara LUKS.btrfs-progslo requiere el motor de generaciones y se instala en todos los perfiles. - 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. - El perfil
fullcon el escritorio Hyprland compila paquetes de AUR (quickshell-git,swayosd-git, ...): dale al instalador ≥6 GB de RAM; en máquinas con poca memoria limita los jobs de build.
- Conjunto base:
-
Esperar a la red (comprobación de DNS contra
geo.mirror.pkgbuild.com, hasta ~120 s) y ejecutarpacstrap /mnt <pkgs>desde los mirrors oficiales más el repositorio[x]firmado (Required). Antes, el instalador prepara el keyring del destino (pacman-key --gpgdir /mnt/etc/pacman.d/gnupg --init,--populate archlinux, agrega y firma localmente/etc/pacman.d/x-repo.pub). -
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). - agentes de IA opcionales (
agents=yes): se instalaopencode-bindesde[x]y despuésx agent install --bundle xcorre como el usuario destino conHOME=/home/<user>(bundle de Xscriptor: agentes, skills y comandos para OpenCode).
- 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 offline del stack equisdots incluida en el paquete (/usr/share/x/config/equisdots); solo clona el instalador oficialequisdots/dotscomo fallback online. NVIDIA lo gestiona la fase de hardware del sistema; la herramienta recurre al setup NVIDIA de equisdots únicamente si hay GPU y ningún driver instalado. -
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.GRUB_CMDLINE_LINUXsiempre lleva el cmdline de la raíz conrootflags=subvol=@(máscryptdevice=UUID=<luks-uuid>:xroot root=/dev/mapper/xrootcon LUKS).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.
-
Primera generación: dentro del chroot,
X_GEN_CMDLINE="$CMDROOT" X_GEN_LIVE_SUBVOL=/@ X_GEN_SUBVOL_PREFIX=/@snapshots x gen new --reason install --label firstcrea/.snapshots/0001, el manifiesto en/var/lib/x/generations/0001y las entries de arranque (systemd-bootloader/entries/x-gen-0001.conf, GRUBcustom.cfg). Es la base para rollbacks y restores granulares; el contrato completo vive en la documentación dex-scripts. -
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
Instalación desatendida desde el ISO en vivo: arrancá la entrada autoinstall
(hotkey a, xauto=1) con un dispositivo etiquetado cidata que contenga
x-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","kernel_params":"console=ttyS0"}
kernel_params es opcional: parámetros extra que se añaden al cmdline del
sistema instalado (validados contra un conjunto de caracteres seguro), por
ejemplo console=ttyS0 para validación headless.
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.
Live vs sistema instalado (credenciales)
El medio live es deliberadamente permisivo para poder usarse sin contraseña:
autologin de root en tty1, password de root vacío y sshd con
PermitRootLogin yes + autenticación por password. Todo eso vive solo en
airootfs (el squashfs del live).
El instalador nunca copia esos archivos al destino: el sistema instalado toma
/etc/shadow del paquete shadow (root bloqueado), crea el usuario wheel
desde el seed y no habilita sshd. Mantené esa regla al agregar
automatización post-install: nunca copies /etc del live al destino.
Modo dualboot
install.sh soporta dos modos ("mode" en el JSON): wipe (default) borra
el disco y crea un GPT nuevo; dualboot instala en la región libre más
grande, preservando todas las particiones existentes y el bootloader de
Windows. El configurador pregunta el modo.
dualboot es UEFI-only en esta iteración y requiere GPT con una ESP
existente:
| Campo | Valores | Significado |
|---|---|---|
mode | wipe / dualboot | estrategia de instalación |
esp | partición (opcional) | reusar esta ESP en vez de autodetectar la ef00 |
min_size | GiB (default 20) | región libre mínima aceptada |
Qué hace:
- Valida UEFI + GPT + ESP existente; nunca corre
sgdisk --zap-all. - Toma el bloque libre más grande (
sgdisk -F/-E), verificamin_sizey crea solo la partición raíz ahí (sgdisk -n 0:start:end -t 0:8300). Las entradas existentes no se tocan. - Monta la ESP existente en
/mnt/booty nunca la formatea; btrfs +@/@home/@snapshots/@xstateigual que en modo wipe. - Bootloader sin tocar
EFI/Microsoft/**:- systemd-boot:
bootctl installsobre la ESP compartida; sd-boot autodetecta el Windows Boot Manager y lo lista en el menú. El fallback preexistenteEFI/BOOT/BOOTX64.EFI(posiblemente de Windows) se guarda y restaura alrededor debootctl. - GRUB:
grub-install --target=x86_64-efi --bootloader-id=xmásos-prober(GRUB_DISABLE_OS_PROBER=false) para agregar Windows.
- systemd-boot:
- Mantiene el Windows Boot Manager primero en el orden del firmware (best
effort vía
efibootmgr), crea la entry NVRAM de X conefibootmgrsi el instalador del bootloader no la escribió (habitual dentro del chroot), y las generaciones de X nunca pisan archivos de Microsoft.
Salvedades: no hay dualboot BIOS/MBR, y encoger una partición existente para hacer lugar queda fuera de alcance (el espacio libre ya tiene que existir).
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). - En modo
wipe, el disco de destino se borra por completo; el mododualbootsolo usa la región libre y preserva el resto. 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. - La matriz del instalador está validada en VM: BIOS/GRUB,
UEFI/systemd-boot, perfil
full, LUKS y dualboot; el multi-kernel (una entry porpkgbase) está cubierto a nivel de motor.