Resumen/X Linux (distro)
Instalador de texto
Otros idiomas: English
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) |
| Kernel | linux (stable) / linux-lts (longterm) / linux-zen (desktop) | kernel (linux/linux-lts/linux-zen; linux-hardened, linux-rt, linux-rt-lts aceptados vía JSON) |
| Cifrado de raíz (LUKS) | sí/no | encryption (yes/no) |
| Passphrase LUKS | reutilizar la del usuario o una dedicada | luks_password |
| Entorno de escritorio | Hyprland (online) / Niri (online) / KDE Plasma (online) / Ninguno | desktop (hyprland/niri/kde/none); hyprland (yes/online/no) es la clave legacy |
| Instalar los agentes IA de Xscriptor | sí/no (requiere red) | agents (yes/no) |
| Instalar virtualización | sí/no (QEMU/KVM + libvirt + GUI virt-manager) | virtualization (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","kernel":"linux","encryption":"no","luks_password":"","hyprland":"no","desktop":"none","agents":"no","virtualization":"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 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.)
- 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 x-wallpapers btrfs-progs xfetch-bin xtop-git kitty pipewire pipewire-pulse pipewire-alsa wireplumber alsa-utils sddm zsh rsync curl python, másgrub efibootmgrpara GRUB ycryptsetuppara LUKS.btrfs-progslo requiere el motor de generaciones; las herramientas de X (xfetch,xtop),x-wallpapersyzshse instalan 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. - El setup de Hyprland de equisdots puede compilar paquetes de AUR
(
quickshell-git,swayosd-git, ...) según upstream; dale al instalador ≥6 GB de RAM. niri y KDE Plasma usan paquetes binarios.
- Conjunto base:
- Preparar los keyrings y esperar a la red (DNS contra
geo.mirror.pkgbuild.com, hasta ~120 s). Despuéspacstrap /mnt <pkgs>desde los mirrors oficiales más el repositorio[x]firmado (Required).- Live: se agrega y firma localmente
/etc/pacman.d/x-repo.pub(pacman-key --init/--populate archlinux/--add/--lsign-key). Lo re-aplica al bootx-keyring.serviceporquepacman-init.servicerecrea/etc/pacman.d/gnupgen tmpfs;install.shlo repite de forma idempotente antes depacstrap(que verifica contra el keyring live). - Destino:
pacman-key --gpgdir /mnt/etc/pacman.d/gnupg --init,--populate archlinux, agregar y firmar localmente la misma clave.
- Live: se agrega y firma localmente
- 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. Si se elige el escritoriokde, el paquete de brandingx-kde-settings-*.pkg.tar.zstincluido se instala de la misma forma. - 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 loginzsh), 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 (si
desktop=hyprland; legacyhyprland=yesuonline): se crea un drop-in temporal de sudo sin contraseña y se ejecuta/usr/share/x/tools/hyprland-install.shcomo el usuario destino. El drop-in se elimina después.hyprland=yesdespliega la instantánea offline de equisdots incluida en el paquete (/usr/share/x/config/equisdots).hyprland=onlineignora la instantánea: clonaequisdots/dots(opcionalmente fijado conhyprland_ref), ejecuta sudots installoficial (repos, plugins y merge de settings) y descarga las configs de apps desdexscriptor-colors; si falla, el instalador cae al snapshot. 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.
- Setup de niri (si
desktop=niri): se crea un drop-in temporal de sudo sin contraseña y/usr/share/x/tools/niri-install.shcorre como el usuario destino. La herramienta clonaequisdots/niri-metaonline y ejecutadotsniri setup -y; después se elimina el drop-in. niri necesita una GPU con aceleración EGL/GBM real (ver la sección de escritorios). - Setup de KDE Plasma (si
desktop=kde): Plasma ya se instaló desde los repos oficiales; el instalador desactivaplasmalogin.service, activasddm.servicee instala el paquetex-kde-settingsincluido para que el look-and-feel X Dark, el wallpaper y el tema SDDM se apliquen en el primer login. - 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 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; vergenerations.md. - 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.
Entornos de escritorio
El configurador ofrece cuatro opciones, todas instaladas online durante la instalación:
desktop | Qué se instala |
|---|---|
hyprland | El stack oficial equisdots Hyprland vía equisdots/dots (dots install, último main), más la integración de paquetes/login de X. |
niri | El stack oficial equisdots niri vía equisdots/niri-meta (dotsniri setup -y): niri, shell Quickshell, overlays de niri, plugins, configs de apps y la entrada de sesión niri. |
kde | plasma-meta + el grupo kde-applications de los repos oficiales y el paquete de branding x-kde-settings (incluido en el ISO; fuente en [x]): colores X Dark, look-and-feel, wallpaper y tema SDDM. |
none | Sin escritorio; solo consola. |
Comportamiento común:
- SDDM es el gestor de sesiones. Hyprland/niri usan el tema SDDM estático de
equisdots; KDE usa el mismo tema X de
x-kde-settings. - niri necesita una GPU con aceleración EGL/GBM real; niri descarta los
renderizadores EGL software. En una VM, activa la aceleración 3D (por
ejemplo
virtio-vga-gl/VirGL) o usa Hyprland. - El escritorio se instala durante la instalación de texto (requiere red), no
en el primer arranque. Primero corre el aprovisionamiento de usuario
(
x setup --user); después el tool del escritorio despliega el payload. - El branding X se aplica en todas las superficies visibles (
os-release, GRUB, SDDM, wallpaper, colores de Plasma).ID_LIKE=archsigue siendo un identificador técnico. hyprlandse mantiene en el JSON por compatibilidad con seeds de autoinstalación antiguos; sidesktopestá presente, mandadesktop.- El
hyprland=yeslegacy (snapshot offline incluido) sigue funcionando cuando no haydesktop; los seeds nuevos deben usardesktop.
Virtualización (opcional)
El configurador puede instalar un stack de virtualización listo para usar en el
destino ("virtualization":"yes"). Se instala con pacman durante la
instalación, así que necesita red como el resto de paquetes del destino.
- Paquetes:
qemu-desktop,qemu-img,qemu-system-aarch64,libvirt,virt-manager,virt-install,libosinfo,virt-viewer,dnsmasq,iptables,edk2-ovmf,edk2-aarch64,swtpm,dmidecode. - Acceso: el usuario creado se añade a los grupos
libvirtykvm(groupadd -f+usermod -aG), para quevirt-manageruse la conexión de sistema y/dev/kvm. - Servicios: se habilitan
libvirtd.socketyvirtlogd.socket(activación por socket). - Red: la red NAT
defaultde libvirt (virbr0) queda marcada para autostart y arranca con libvirtd. Usadnsmasqy la interfaz nft deiptables. - Invitados:
virt-manager/virt-install/virsh; UEFI conedk2-ovmf, TPM conswtpm; invitados ARM conqemu-system-aarch64+edk2-aarch64. - Aviso GUI:
virt-managernecesita sesión gráfica. Con el perfilcorey sin escritorio no arrancará;virsh/virt-installsiguen disponibles por CLI. - Aviso VM anidada: si no hay
/dev/kvm(X dentro de una VM sin virtualización anidada), el stack se instala pero los invitados van sin aceleración KVM; el instalador avisa. - El stack es opcional: sin
"virtualization":"yes"el destino no cambia.
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","kernel":"linux","encryption":"no","hyprland":"no","kernel_params":"console=ttyS0"}
kernel_params es opcional: parámetros extra que se añaden al cmdline del
kernel del sistema instalado (restringidos a un conjunto de caracteres seguro
y validados antes de particionar). Es útil para validación headless, por
ejemplo "kernel_params":"console=ttyS0" para conservar la consola serie tras
la instalación.
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), 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). - 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.