Tener un directorio $LFS=/mnt con la estructura base y el cross-compiler
semilla (musl-cross) listo para empezar a compilar.
musl-cross es un compilador que corre con glibc (el idioma de tu PC) pero produce binarios musl. Lo usamos desde el host para compilar los primeros componentes de la toolchain. Cuando tengamos un compilador nativo musl, haremos chroot y seguiremos desde ahí.
- Tu sistema normal (el que tiene
/opt/cross-x86_64-linux-musl/) - Un disco extra (10 GB mínimo)
- Conexión a internet (para descargar tarballs)
gcc,make,wget,tar— herramientas básicas del host
Identificar el disco (lsblk) y particionar:
# fdisk /dev/sdXCrear una partición primaria tipo Linux.
Formatear como ext4:
# mkfs.ext4 /dev/sdX1Montar:
# mount /dev/sdX1 /mntEstructura completa del sistema (NeonatoX / LFS). Usamos la misma que
01-base-neonatox.sh del proyecto neonatox-bootstrap.
export LFS=/mnt
# Directorios de toolchain (temporales)
mkdir -pv $LFS/{tools,sources}
# usr merge
mkdir -pv $LFS/usr/{bin,lib,lib32}
ln -sfv usr/bin $LFS/bin
ln -sfv usr/bin $LFS/sbin
ln -sfv usr/lib $LFS/lib
ln -sfv usr/lib $LFS/lib64
ln -sfv usr/lib32 $LFS/lib32
ln -sfv bin $LFS/usr/sbin
ln -sfv lib $LFS/usr/lib64
# Sistemas de archivos virtuales
mkdir -pv $LFS/{dev,proc,sys,run}
# Directorios del sistema
mkdir -pv $LFS/{boot,home,mnt,opt,srv}
# Configuración
mkdir -pv $LFS/etc/{opt,sysconfig,skel,profile.d}
mkdir -pv $LFS/etc/polkit-1/rules.d
# Librerías de kernel
mkdir -pv $LFS/lib/firmware
# Media
mkdir -pv $LFS/media/{floppy,cdrom}
# usr/share completo
mkdir -pv $LFS/usr/{,local/}{include,src}
mkdir -pv $LFS/usr/lib/locale
mkdir -pv $LFS/usr/local/{bin,lib,sbin}
mkdir -pv $LFS/usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -pv $LFS/usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv $LFS/usr/{,local/}share/man/man{1..8}
# var
mkdir -pv $LFS/var/{cache,local,log,mail,opt,spool}
mkdir -pv $LFS/var/lib/{color,misc,locate}
ln -sfv /run $LFS/var/run
ln -sfv /run/lock $LFS/var/lock
# root y tmp
install -dv -m 0750 $LFS/root
install -dv -m 1777 $LFS/tmp $LFS/var/tmpNota: para la toolchain stage 1 (capítulos 2-5) solo se necesita la estructura mínima. Pero tener todo desde el principio no molesta y deja el sistema listo cuando completemos la instalación.
Importante — musl y el directorio lib64: musl no busca bibliotecas en
/usr/lib64. A diferencia de glibc, el loader de musl solo examina
/lib, /usr/lib y las rutas listadas en /etc/ld-musl-x86_64.path.
GCC por defecto instala bibliotecas de 64 bits en /usr/lib64, lo que
rompe todos los binarios C++ dinámicos dentro del chroot. Por eso:
- NO se crea
/usr/lib64en la estructura (solo/lib64 -> usr/libpara mantener compatibilidad con binarios que usan ruta absoluta/lib64). - Toda compilación de GCC debe incluir
--libdir=/usr/lib. - Si ya compilaste GCC sin esa opción, migra las bibliotecas de
/usr/lib64a/usr/libcon:O creacd /usr/lib64 for f in *; do [ ! -e "/usr/lib/$f" ] && mv "$f" "/usr/lib/$f"; done cd /usr && rmdir lib64 && ln -sf lib lib64/etc/ld-musl-x86_64.pathcon el contenido/usr/lib64.Cuidado: ese archivo reemplaza las rutas por defecto de musl, no las extiende. Si solo pones
/usr/lib64, musl deja de buscar en/liby/usr/lib, rompiendo todo el sistema.
cp -a /opt/cross-x86_64-linux-musl/* $LFS/cross/Verificar:
$LFS/cross/bin/x86_64-linux-musl-gcc --version
$LFS/cross/bin/x86_64-linux-musl-gcc -dumpmachine
# → x86_64-linux-musl
Este compilador depende del glibc del host para funcionar. Eso es normal.
Lo usamos solo para la etapa inicial (compilar musl dinámico y GCC nativo).
---
## 1.7 — Variables de entorno
export PATH="$LFS/cross/bin:$PATH"
export MAKEFLAGS="-j$(nproc)"
export LC_ALL=POSIX
Agregar opcionalmente a `~/.bashrc` para no tener que escribirlas cada vez.
---
Verificar integridad (sha256):
```bash
sha256sum musl-1.2.5.tar.gz/mnt/
├── cross/ # musl-cross semilla (glibc-host dependiente)
│ ├── bin/
│ ├── lib/
│ ├── libexec/
│ └── ...
├── tools/ # Toolchain temporal (stage 1) — vacío por ahora
├── sources/ # Tarballs descargados
├── build/ # Directorios de compilación
└── usr/ # Sistema final (stage 2)echo $LFS # → /mnt
echo $PATH # → .../cross/bin:...
x86_64-linux-musl-gcc --version
ls $LFS/sources/*.tar.* # tarballs listosNota: musl-cross se compila en el host (con glibc). El binario resultante
se copia a $LFS/cross/. No es un paquete que se instale con nhopkg dentro
del sistema musl, sino una herramienta externa de bootstrap.