Linux From Scratch

Versión 4.1

Gerard Beekmans

Traducido por el proyecto LFS-ES http://www.escomposlinux.org/lfs-es

Versión de la traducción: FINAL del 28 de abril de 2003

Copyright (c) 2002-2003, Proyecto LFS-ES

El presente texto se distribuye bajo la Licencia GNU de documentación libre (GFDL). Para todo aquello no especificado en dicha licencia es de aplicación las condiciones de uso del documento original en el que se basa esta traducción, y que se citan a continuación.

Copyright (c) 1999-2003, Gerard Beekmans

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions in any form must retain the above copyright notice, this list of conditions and the following disclaimer.

  • Neither the name of "Linux From Scratch" nor the names of its contributors may be used to endorse or promote products derived from this material without specific prior written permission.

  • Any material derived from Linux From Scratch must contain a reference to the "Linux From Scratch" project.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.



Dedicatoria

Este libro está dedicado a la querida esposa de Gerard Beekmans, Beverly Beekmans.

Índice
Prólogo
Prefacio
Quién puede querer leer este libro
A quién puede que no le interese leer el libro
Prerrequisitos
Organización
Parte I - Introducción
Parte II - Preparativos para la construcción
Parte III - Construcción del sistema LFS
Parte IV - Apéndice
I. Parte I - Introducción
1. Introducción
Agradecimientos
Lo que vamos a hacer
Convenciones utilizadas en este libro
Versión del libro
Servidores alternativos
Historial de modificaciones
Listas de correo y archivos
Servidores de noticias
FAQ
Información de contacto
2. Información importante
Sobre $LFS
Sobre los SBUs
Cómo buscar ayuda
II. Parte II - Preparativos para la construcción
3. Preparación de una nueva partición
Introducción
Crear una nueva partición
Crear un sistema de ficheros en la nueva partición
Montar la nueva partición
4. Paquetes que hay que descargar
Introducción
Paquetes que hay que descargar
5. Preparación del sistema LFS
Introducción
¿Por qué usamos enlazado estático?
Creación del directorio $LFS/static
Añadir el usuario lfs
Configuración del entorno
Instalación de Bash-2.05a
Instalación de Binutils-2.13.2
Instalación de Bzip2-1.0.2
Instalación de Diffutils-2.8.1
Instalación de Fileutils-4.1
Instalación de Findutils-4.1
Instalación de Gawk-3.1.1
Instalación de GCC-3.2.1
Instalación de Grep-2.5
Instalación de Gzip-1.2.4a
Instalación de Make-3.80
Instalación de Patch-2.5.4
Instalación de Sed-4.0.5
Instalación de Sh-utils-2.0
Instalación de Tar-1.13
Instalación de Texinfo-4.3
Instalación de Textutils-2.1
Instalación de Util-linux-2.11y
III. Parte III - Construcción del sistema LFS
6. Instalación de los programas del sistema base
Introducción
Sobre los símbolos de depuración
Entrando al entorno chroot
Cambio del propietario
Creación de los directorios
Montando el sistema de ficheros /proc
Creación del fichero mtab
Creación de los enlaces simbólicos bash y sh
Creación de los ficheros de contraseñas y grupos
Creación de los dispositivos (Makedev-1.7)
Instalación de las cabeceras de Linux-2.4.20
Instalación de Man-pages-1.54
Instalación de Glibc-2.3.1
Instalación de GCC-3.2.1
Instalación de Zlib-1.1.4
Instalación de Findutils-4.1
Instalación de Gawk-3.1.1
Instalación de Ncurses-5.3
Instalación de Vim-6.1
Instalación de M4-1.4
Instalación de Bison-1.875
Instalación de Less-378
Instalación de Groff-1.18.1
Instalación de Textutils-2.1
Instalación de Sed-4.0.5
Instalación de Flex-2.5.4a
Instalación de Binutils-2.13.2
Instalación de Fileutils-4.1
Instalación de Sh-utils-2.0
Instalación de Gettext-0.11.5
Instalación de Net-tools-1.60
Instalación de Perl-5.8.0
Instalación de Texinfo-4.3
Instalación de Autoconf-2.57
Instalación de Automake-1.7.2
Instalación de Bash-2.05a
Instalación de File-3.39
Instalación de Libtool-1.4.3
Instalación de Bin86-0.16.3
Instalación de Bzip2-1.0.2
Instalación de Ed-0.2
Instalación de Kbd-1.08
Instalación de Diffutils-2.8.1
Instalación de E2fsprogs-1.32
Instalación de Grep-2.5
Instalación de Gzip-1.2.4a
Instalación de Man-1.5k
Instalación de Lilo-22.2
Instalación de Make-3.80
Instalación de Modutils-2.4.22
Instalación de Netkit-base-0.17
Instalación de Patch-2.5.4
Instalación de Procinfo-18
Instalación de Procps-3.1.5
Instalación de Psmisc-21.2
Instalación de Shadow-4.0.3
Instalación de Sysklogd-1.4.1
Instalación de Sysvinit-2.84
Instalación de Tar-1.13
Instalación de Util-linux-2.11y
Instalación de las páginas de manual de Linux-2.4.20
Instalación de Glibc-2.3.1
Comando chroot revisado
Instalación de LFS-Bootscripts-1.11
Configuración de los componentes del sistema
7. Preparando los guiones de arranque
Introducción
¿Cómo hacen estos guiones que funcione el proceso de arranque?
Configuración del guión setclock
¿Necesito el guión loadkeys?
Configuración del guión sysklogd
Configuración del guión localnet
Creación del fichero /etc/hosts
Configuración del guión network
8. Hacer el sistema LFS arrancable
Introducción
Creación del fichero /etc/fstab
Instalación de Linux-2.4.20
Hacer el sistema LFS arrancable
9. El final
El final
Registrarse
Arranque del sistema
Y ahora, ¿qué?
IV. Parte IV - Apéndices
A. Descripción de paquetes y dependencias
Introducción
Autoconf
Automake
Bash
Bin86
Binutils
Bison
Bzip2
Diffutils
E2fsprogs
Ed
File
Fileutils
Findutils
Flex
Gawk
GCC
Gettext
Glibc
Grep
Groff
Gzip
Kbd
Less
LFS-Bootscripts
Libtool
Lilo
Linux (el núcleo)
M4
Make
MAKEDEV
Man
Man-pages
Modutils
Ncurses
Netkit-base
Net-tools
Patch
Perl
Procinfo
Procps
Psmisc
Sed
Shadow
Sh-utils
Sysklogd
Sysvinit
Tar
Texinfo
Textutils
Util-linux
Vim
Zlib

Prólogo


Quién puede querer leer este libro

Existen muchas razones por las que alguien podría querer leer este libro. La principal razón es instalar un sistema LFS. La pregunta que mucha gente podría hacer es "¿Por qué pasar por todo el embrollo de instalar manualmente un sistema desde cero cuando te puedes limitar a descargar una distribución ya existente?". Es una buena pregunta.

Una importante razón para la existencia de LFS es enseñar a la gente cómo trabaja internamente un sistema Linux. Construir un sistema LFS ayuda a demostrar lo que hace que Linux funcione, cómo trabajan juntas las distintas partes, y cómo unas dependen de otras. Y quizás lo más importante, cómo adaptarlo a tus propios gustos y necesidades.

Uno de los beneficios claves de LFS es que tienes el control de tu sistema sin tener que confiar en la implementación de Linux de nadie. Con LFS estás en el asiento del conductor y puedes dictar cada aspecto de tu sistema, como la estructura de directorios y la configuración de los guiones de arranque. También podrás decidir dónde, por qué y cómo se instalan los programas.

Otro beneficio de LFS es que puedes crear un sistema Linux verdaderamente compacto. Cuando instalas una distribución normal, acabas instalando muchos programas que, probablemente, nunca usarás. Sólo están ahí gastando (precioso) espacio de disco. No es muy difícil conseguir un sistema LFS instalado en menos de 100 MB. ¿Todavía te parece demasiado? Algunos de nosotros hemos estado trabajando para crear un sistema LFS embebido realmente pequeño. Hemos instalado un sistema que contiene lo suficiente para ejecutar un servidor web Apache; el espacio total de disco usado fue, aproximadamente, 8 MB. Con un repaso adicional para reducirlo, se podría llegar a 5 MB o menos. Intenta eso con una distribución normal.

Podríamos comparar una distribución de Linux con una hamburguesa que compras en un restaurante de comida rápida. No tienes idea de lo que te estás comiendo. En cambio, LFS no te da una hamburguesa, sino la receta para hacer la hamburguesa. Te permite revisarla, eliminar los ingredientes no deseados, y añadir tus propios ingredientes para mejorar el sabor de tu hamburguesa. Cuando estés satisfecho con la receta entonces empiezas a prepararla. Ahora tienes la oportunidad de cocinarla a tu gusto: asarla, cocerla, freírla, hacerla a la barbacoa, o comerla cruda.

Otra analogía que podemos usar es comparar a LFS con una casa terminada. LFS te dará los planos de la casa, pero tú debes construirla. Tienes libertad para adaptar los planos como quieras.

Otra ventaja de un sistema Linux hecho a la medida es la seguridad. Compilando el sistema entero a partir del código fuente tienes la posibilidad de supervisar todo y aplicar todos los parches de seguridad que creas que son necesarios. No tienes que esperar a que alguien te proporcione un nuevo paquete binario que tape ese agujero de seguridad. Hasta que examines el nuevo parche y lo construyas no tienes garantía de que ese nuevo paquete se haya construido correctamente y realmente solucione el problema (de forma adecuada). Nunca podrás saber realmente si un agujero de seguridad está solucionado a no ser que lo hagas por ti mismo.


Capítulo 1. Introducción


Agradecimientos

Agradecemos a las siguientes personas y organizaciones su contribución al proyecto LFS-ES:

  • Gerard Beekmans, por crear el apasionante proyecto Linux From Scratch.

  • Red ECOLNET, por prestarnos su apoyo incondicional desde el primer momento y facilitarnos los servicios de CVS, listas de correo y espacio web, que tan vitales son para realizar nuestro trabajo.

  • A todos aquellos que leen nuestros textos con interes, pues es para ellos para quien los escribimos.

Agradecemos a las siguientes personas y organizaciones su contribución al proyecto LFS:

  • Mark Stone <mstone@linux.com> por donar el servidor linuxfromscratch.org.

  • VA Linux Systems por proveer espacio de rack y ancho de banda al servidor linuxfromscratch.org.

  • Fredrik Danerklint por mantener el servidor alternativo se.linuxfromscratch.org.

  • Tim Jackson <tim@idge.net> por mantener el servidor alternativo linuxfromscratch.idge.net.

  • Hagen Herrschaft <hrx@hrxnet.de> por mantener los servidores alternativos de.linuxfromscratch.org y por donar un sistema P4-2.2Ghz al proyecto LFS.

  • UK Mirror Service por mantener el servidor alternativo linuxfromscratch.mirror.ac.uk.

  • Guido Passet <guido@primerelay.net> por mantener los servidores alternativos www.nl.linuxfromscratch.org y ftp.snt.utwente.nl.

  • Timothy Bauscher <timothy@linuxfromscratch.org> por ser de gran ayuda en la edición de este libro.

  • Mark Hymers <markh@linuxfromscratch.org> por su enorme ayuda en la edición de este libro.

  • Marc Heerdink <marc_heerdink@softhome.net> también por su gran ayuda en la edición de este libro.

  • DREAMWVR.COM por su continuado respaldo donando varios recursos al proyecto LFS y a subproyectos relacionados.

  • Jan Niemann <jan.niemann@tu.bs.de> por mantener el servidor alternativo www.de.linuxfromscratch.org.

  • Torsten Westermann <westermann@linux-provider.net> por mantener el servidor alternativo lfs.linux-provider.net.

  • Ian Chilton <ian@ichilton.co.uk> por mantener los servidores alternativos www.us.linuxfromscratch.org y www.linuxfromscratch.co.uk.

  • Dag Stenstad <dag@stenstad.net> por proveer el servidor alternativo www.no.linuxfromscratch.org, y Ian Chilton <ian@ichilton.co.uk> por mantenerlo.

  • Antonin Sprinzl <Antonin.Sprinzl@tuwien.ac.at> por mantener el servidor alternativo www.at.linuxfromscratch.org.

  • Jason Andrade <jason@dstc.edu.au> por mantener el servidor alternativo www.au.linuxfromscratch.org.

  • Ian Cooper <ian@wpi.edu> por mantener el servidor alternativo www.us2.linuxfromscratch.org.

  • VA Linux Systems que, en nombre de Linux.com, donó al proyecto una estación de trabajo VA Linux 420 (anteriormente StartX SP2).

  • Johan Lenglet <johan@linuxfromscratch.org> por gestionar el proyecto de traducción de LFS al francés.

  • Jesse Tie-Ten-Quee <highos@linuxfromscratch.org> por donar una grabadora de CD Yamaha CDRW 8824E.

  • O'Reilly por donar libros sobre SQL y PHP.

  • Robert Briggs por donar los nombres de dominio linuxfromscratch.org y linuxfromscratch.com.

  • Frank Skettino <bkenoah@oswd.org> de OSWD por crear el diseño inicial del sitio web LFS.

  • Garrett LeSage <garrett@linux.com> por crear el logotipo de LFS.

  • Dean Benson <dean@vipersoft.co.uk> por su ayuda financiera al establecer la organización sin ánimo de lucro LFS.

  • Innumerables otros en varias listas de correo LFS que están haciendo posible este libro aportando sugerencias, leyendo el libro e informando de los errores.


Lo que vamos a hacer

Vamos a construir el sistema LFS utilizando una distribución ya instalada, como Debian, SuSE, Slackware, Mandrake, RedHat, etc. Utilizaremos un sistema Linux existente como plataforma de desarrollo porque necesitamos un compilador, enlazador (linker), editor de texto y otras herramientas para construir nuestro sistema. Por regla general, las herramientas que vamos a necesitar se instalan por defecto si durante la instalación de nuestra distribución Linux seleccionamos la opción de "desarrollo".

En cuando hayas descargado los paquetes que componen un sistema LFS, crearemos una nueva partición Linux nativa sobre la que se instalará el sistema LFS.

En el siguiente paso, Capítulo 5, discutiremos la instalación de una serie de paquetes que constituyen un juego básico de herramientas de desarrollo, que se usarán para instalar el sistema propiamente dicho, y que también son necesarios para resolver dependencias circulares (por ejemplo, necesitas un compilador para instalar un compilador y necesitas un intérprete de comandos para instalar un intérprete de comandos). En este capítulo los paquetes serán enlazados estáticamente.

El enlazado estático define un método de compilación que hace innecesaria la presencia de librerías tras la construcción del software. El programa resultante es capaz de funcionar por si mismo porque las porciones de código de las librerías que necesita el programa se meten dentro de él. Normalmente el software se enlaza dinámicamente. De esta manera se conserva más espacio en el disco y se mejora la eficiencia de varios programas. Nosotros enlazamos estáticamente los programas en el Capítulo 5 porque en teoría estaremos moviendo nuestro sistema de desarrollo a un entorno virtual donde no existirán las librerías mencionadas anteriormente. Si los programas se enlazan dinámicamente, nuestro entorno de desarrollo no funcionará. Ya que las librerías de las que estamos hablando están en nuestra distribución Linux, el objetivo del Capítulo 5 es construir un entorno de desarrollo en el que esas librerías no sean necesarias y que, por tanto, sea independiente de la distribución.

En el Capítulo 6 construiremos e instalaremos nuestro sistema final. Usaremos el programa chroot para entrar en un entorno virtual y ejecutar un nuevo intérprete de comandos cuyo directorio raíz será la partición donde construimos todos los programas del Capítulo 5. Esto es equivalente a reiniciar el sistema haciendo que el núcleo monte nuestra partición LFS como partición raíz. La razón de que utilicemos chroot en lugar de reiniciar es que crear un sistema estático arrancable requiere un trabajo adicional que no es necesario. Así, podemos seguir usando nuestro sistema anfitrión mientras construimos LFS. Mientras se está instalando el software, puedes simplemente cambiar a otra VC (consola virtual) o escritorio X y continuar usando tu ordenador como lo harías normalmente.

Cuando esté instalado todo el software del Capítulo 6, los Capítulos 7, 8 y 9 nos ayudarán a terminar la instalación. En el Capítulo 7 configuraremos los guiones de arranque. En el Capítulo 8 construiremos nuestro núcleo (kernel) final y configuraremos el gestor de arranque. Y en el Capítulo 9 hay algunas sugerencias sobre lo que puedes hacer cuando acabes el libro. En ese momento puedes por fin reiniciar tu nuevo sistema LFS, y empezar a usarlo realmente.

En pocas palabras, este es el proceso. Encontrarás información detallada sobre los pasos que has de seguir en cada capítulo, a medida que avances. Si ahora hay algo que no veas muy claro, no te preocupes. Debería aclararse perfectamente un poco más adelante.

Por favor, lee con atención el Capítulo 2, ya que explica algunas cosas importantes que debes saber antes de comenzar a trabajar en el Capítulo 5 y posteriores.


Servidores alternativos

El proyecto LFS tiene por todo el mundo un número de servidores alternativos para facilitar el acceso y hacer más conveniente para ti el acceso a las páginas web y la descarga de los paquetes requeridos. Por favor, visita el sitio web http://www.linuxfromscratch.org para consultar la lísta de los servidores alternativos actuales.

El proyecto LFS-ES, que se ocupa de la traducción al castellano de los textos del LFS, dispone de los siguientes servidores:


Historial de modificaciones

4.1 - 28 de abril de 2003

4.0 - 5 de octubre de 2002

4.0-RC1 - 28 de septiembre de 2002


Listas de correo y archivos

El servidor linuxfromscratch.org hospeda las siguientes listas de correo de acceso público:


Otros modos de las listas

Para que el usuario active los distintos modos de uso debe enviar un mensaje a listar@linuxfromscratch.org. Los modos de uso se establecen poniendo el comando apropiado como asunto del mensaje.

Como su nombre implica, el comando Set indica que se activa un modo de uso. El comando Unset indica que se desactiva un modo de uso.

La palabra "nombre_de_la_lista" en los asuntos de ejemplo mostrados a continuación debe reemplazarse con el nombre de la lista a la que se desea aplicar ese modo de uso. Si se necesita activar en un sólo mensaje más de un modo de uso (en la misma lista o en varias listas) puede hacerse dejando el asunto en blanco y escribiendo los comandos en el cuerpo del mensaje.


Información de contacto

Por favor, envía tus mensajes a las listas de correo. En el Capítulo 1 - Listas de correo y archivos tienes información sobre las listas de correo disponibles.

Si necesitas contactar directamente con Gerard Beekmans, manda un mensaje a gerard@linuxfromscratch.org


Capítulo 2. Información importante


Cómo buscar ayuda

Si tienes algún problema usando este libro, y tu problema no aparece en las FAQ (en castellano en http://www.escomposlinux.org/lfs-es/faq, y en inglés en http://www.linuxfromscratch.org/faq), encontrarás que la mayoría de la gente en el Internet Relay Chat (IRC) y en las listas de correo estará dispuesta a ayudarte. Puedes encontrar una relación de las listas de correo de LFS en Capítulo 1 - Listas de correo y archivos. Para facilitarnos la tarea de identificar y resolver tu problema, incluye toda la información relevante que sea posible en tu petición de ayuda.


Problemas de Compilación

Para ayudarnos a determinar la causa del problema, nos va a ser útil tanto la salida del terminal como el contenido de varios ficheros. Las salidas al terminal del guión configure y del comando make pueden ser útiles. No incluyas ciegamente todo el contenido pero, por otro lado, no incluyas demasiado poco. Por ejemplo, aquí hay una salida a terminal de make:

gcc -DALIASPATH=\"/mnt/lfs/usr/share/locale:.\"
-DLOCALEDIR=\"/mnt/lfs/usr/share/locale\" -DLIBDIR=\"/mnt/lfs/usr/lib\"
-DINCLUDEDIR=\"/mnt/lfs/usr/include\" -DHAVE_CONFIG_H -I. -I.
-g -O2 -c getopt1.c
gcc  -g -O2 -static -o make  ar.o arscan.o commands.o dir.o expand.o
file.o
function.o getopt.o implicit.o job.o main.o misc.o read.o remake.o
rule.o
signame.o variable.o vpath.o default.o remote-stub.o version.o opt1.o
-lutil job.o: In function `load_too_high':
/lfs/tmp/make-3.79.1/job.c:1565: undefined reference to `getloadavg'
collect2: ld returned 1 exit status
make[2]: *** [make] Error 1
make[2]: Leaving directory `/lfs/tmp/make-3.79.1'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/lfs/tmp/make-3.79.1'
make: *** [all-recursive-am] Error 2

En este caso, mucha gente simplemente incluye de la sección anterior desde donde pone
make [2]: *** [make] Error 1
hasta el final. Esto no nos basta para diagnosticar el problema porque sólo nos dice que algo fue mal, no qué fue mal. Lo que se debería incluir para resultar útil es la sección completa tal y como aparece en el ejemplo anterior, ya que incluye el comando que se estaba ejecutando y sus mensajes de error.

Hay un artículo excelente sobre cómo buscar ayuda en Internet, escrito por Eric S. Raymond. Está disponible en http://www.tuxedo.org/~esr/faqs/smart-questions.html. Lee y sigue los consejos de este documento y tendrás muchas más posibilidades de obtener una respuesta, y también de que obtengas la ayuda que necesitas.


Capítulo 3. Preparación de una nueva partición


Crear una nueva partición

Para construir nuestro nuevo sistema Linux necesitaremos algún espacio: una partición de disco vacía. Si no tienes una partición libre, y no tienes sitio en ninguno de tus discos duros para crear una, entonces puedes construir LFS en la misma partición en la que tienes instalada tu distribución actual. Este proceso no es recomendable para tu primera instalación del LFS, pero si andas escaso de espacio en el disco y te sientes valiente, hecha un vistazo a la receta http://www.escomposlinux.org/lfs-es/recetas/lfs_next_to_existing_systems.html (la versión original en inglés se encuentra en http://hints.linuxfromscratch.org/hints/lfs_next_to_existing_systems.txt).

Para un sistema mínimo necesitas una partición de 1 GB más o menos. Esto es suficiente para almacenar todos los archivos de código fuente y compilar todos los paquetes. Pero, si piensas usar tu sistema LFS como tu sistema Linux primario, seguramente querrás instalar software adicional y necesitarás más espacio, posiblemente sobre 2 o 3 GB.

Como casi nunca tenemos suficiente memoria RAM en nuestra máquina, es buena idea utilizar una paqueña partición como espacio de intercambo (swap) -- este espacio lo usa el núcleo para almacenar los datos menos usados y hacer sitio en memoria para las cosas urgentes. La partición de intercambio para tu sistema LFS puede ser la misma que la de tu sistema anfitrión, por lo que no tienes que crear otra si tu sistema anfitrión ya utiliza una partición de intercambio.

Inicia el programa cfdisk pasándole como argumento el nombre del disco duro en el que debe crearse la nueva partición -- por ejemplo /dev/hda para el disco IDE primario. Crea una partición Linux nativa y, si hace falta, una partición de intercambio. Por favor, consulta la página de manual de cfdisk si todavía no sabes cómo usar el programa.

Recuerda la denominación de tu nueva partición -- será algo como hda5. En este libro nos referiremos a ella como la partición LFS. Si (ahora) tienes además una partición de intercambio, recuerda también su denominación. Estos nombres se necesitarán posteriormente para el fichero /etc/fstab.


Capítulo 4. Paquetes que hay que descargar


Introducción

A continuación sigue una lista con los paquetes que necesitas descargar para construir un sistema Linux básico. Los números de versión listados corresponden a versiones del software que se sabe que funcionan, y este libro se basa en ellos. Eres libre de probar nuevas versiones, pero si tienes problemas con esas versiones, por favor, prueba con la versión recomendada antes de enviar informes de error.

Todas las URLs, cuando es posible, apuntan a la página del proyecto en Freshmeat.net. Las páginas de Freshmeat proporcionan un acceso fácil a los sitios oficiales de descarga, así como a los sitios web del proyecto, listas de correo, FAQs, Historiales de modificaciones y más cosas.

Para facilitarte la tarea, al principio de la lista tienes un enlace a un fichero que puedes usar con el programa wget. Con este fichero y el programa wget te será fácil descargar todos los ficheros de una vez, en lugar de descargar individualmente todos y cada uno de ellos de forma manual.


Paquetes que hay que descargar

Puedes descargar el guión para wget y descargar todos los paquetes automáticamente:

[Crear el guión de wget y subirlo al servidor]

O descargar los paquetes individualmente:


Autoconf (2.57) - 792 KB:
http://freshmeat.net/projects/autoconf/

Automake (1.7.2) - 518 KB:
http://freshmeat.net/projects/automake/

Bash (2.05a) - 1,766 KB:
http://freshmeat.net/projects/gnubash/


Bin86 (0.16.3) - 142 KB:
http://freshmeat.net/projects/bin86/

Binutils (2.13.2) - 9,534 KB:
http://freshmeat.net/projects/binutils/

Bison (1.875) - 796 KB:
http://freshmeat.net/projects/bison/

Bzip2 (1.0.2) - 650 KB:
http://freshmeat.net/projects/bzip2/

Diffutils (2.8.1) - 762 KB:
http://freshmeat.net/projects/diffutils/

E2fsprogs (1.32) - 2,827 KB:
http://freshmeat.net/projects/e2fsprogs/

Ed (0.2) - 182 KB:
http://freshmeat.net/projects/ed/

Parche para Ed (0.2) - 1 KB:
ftp://ftp.linuxfromscratch.org/lfs-packages/cvs/ed-0.2.patch
http://downloads.linuxfromscratch.org/ed-0.2.patch

File (3.39) - 177 KB:
http://freshmeat.net/projects/file/

Fileutils (4.1) - 1,770 KB:
http://freshmeat.net/projects/gnufileutils/


Parche para Fileutils (4.1) - 1 KB:
ftp://ftp.linuxfromscratch.org/lfs-packages/cvs/fileutils-4.1.patch
http://downloads.linuxfromscratch.org/fileutils-4.1.patch

Findutils (4.1) - 288 KB:
http://freshmeat.net/projects/findutils/

Parche para Findutils (4.1) - 1 KB:
ftp://ftp.linuxfromscratch.org/lfs-packages/cvs/findutils-4.1.patch
http://downloads.linuxfromscratch.org/findutils-4.1.patch

Parche para la violación de segmento en Findutils(4.1) - 1 KB:
ftp://ftp.linuxfromscratch.org/lfs-packages/cvs/findutils-4.1-segfault.patch
http://downloads.linuxfromscratch.org/findutils-4.1-segfault.patch

Flex (2.5.4a) - 372 KB:
http://freshmeat.net/projects/flex/

Gawk (3.1.1) - 1,831 KB:
http://freshmeat.net/projects/gnuawk/

Parche para Gawk (3.1.1-3) - 1 KB:
http://downloads.linuxfromscratch.org/gawk-3.1.1-3.patch

GCC-core (3.2.1) - 13,140 KB:
http://freshmeat.net/projects/gcc/

GCC-g++ (3.2.1) - 2520 KB:
http://freshmeat.net/projects/gcc/

Gettext (0.11.5) - 3,637 KB:
http://freshmeat.net/projects/gettext/

Glibc (2.3.1) - 17,463 KB:
http://freshmeat.net/projects/glibc/

Parche Root/Perl para Glibc: (2.3.1) - 1 KB:
http://downloads.linuxfromscratch.org/glibc-2.3.1-root-perl.patch

Parche Libnss para Glibc: (2.3.1) - 1 KB:
http://downloads.linuxfromscratch.org/glibc-2.3.1-libnss.patch


Glibc-linuxthreads (2.3.1) - 238 KB:
http://freshmeat.net/projects/glibc/

Grep (2.5) - 545 KB:
http://freshmeat.net/projects/grep/

Groff (1.18.1) - 2,198 KB:
http://freshmeat.net/projects/groff/

Gzip (1.2.4a) - 216 KB:
http://freshmeat.net/projects/gzip/

Parche para Gzip (1.2.4b) - 1 KB:
ftp://ftp.linuxfromscratch.org/lfs-packages/cvs/gzip-1.2.4b.patch
http://downloads.linuxfromscratch.org/gzip-1.2.4b.patch

Kbd (1.08) - 801 KB:
http://freshmeat.net/projects/kbd/

Parche para Kbd (1.08) - 1 KB:
ftp://ftp.linuxfromscratch.org/lfs-packages/cvs/kbd-1.08.patch
http://downloads.linuxfromscratch.org/kbd-1.08.patch

Less (378) - 239 KB:
http://freshmeat.net/projects/less/

LFS-Bootscripts (1.11) - 25 KB:
http://downloads.linuxfromscratch.org/lfs-bootscripts-1.11.tar.bz2

Libtool (1.4.3) - 1137 KB:
http://freshmeat.net/projects/libtool/

Lilo (22.2) - 343 KB:
http://freshmeat.net/projects/lilo/

Linux (2.4.20) - 26,778 KB:
http://freshmeat.net/projects/linux/

M4 (1.4) - 310 KB:
http://freshmeat.net/projects/gnum4/

Make (3.80) - 899 KB:
http://freshmeat.net/projects/gnumake

MAKEDEV (1.7) - 8 KB:
ftp://ftp.linuxfromscratch.org/lfs-packages/cvs/MAKEDEV-1.7.bz2
http://downloads.linuxfromscratch.org/MAKEDEV-1.7.bz2

Man (1.5k) - 189 KB:
http://freshmeat.net/projects/man/

Parche 80Cols para Man (1.5k) - 1 KB:
http://downloads.linuxfromscratch.org/man-1.5k-80cols.patch

Parche Manpath para Man (1.5k) - 1 KB:
http://downloads.linuxfromscratch.org/man-1.5k-manpath.patch

Parche Pager para Man (1.5k) - 1 KB:
http://downloads.linuxfromscratch.org/man-1.5k-pager.patch

Man-pages (1.54) - 583 KB:
http://freshmeat.net/projects/man-pages/

Modutils (2.4.22) - 214 KB:
http://freshmeat.net/projects/modutils/

Ncurses (5.3) - 2,019 KB:
http://freshmeat.net/projects/ncurses/

Netkit-base (0.17) - 55 KB:
http://freshmeat.net/projects/netkit/

Net-tools (1.60) - 194 KB:
http://freshmeat.net/projects/net-tools/

Patch (2.5.4) - 183 KB:
http://freshmeat.net/projects/patch/

Perl (5.8.0) - 10,765 KB:
http://freshmeat.net/projects/perl/

Procinfo (18) - 24 KB:
http://freshmeat.net/projects/procinfo/

Procps (3.1.5) - 233 KB:
http://freshmeat.net/projects/procps/

Parche para Procps (3.1.5) - 1 KB:
http://downloads.linuxfromscratch.org/procps-3.1.5.patch

Psmisc (21.2) - 253 KB:
http://freshmeat.net/projects/psmisc/

Sed (4.0.5) - 665 KB:
http://freshmeat.net/projects/sed/

Shadow (4.0.3) - 1030 KB:
http://freshmeat.net/projects/shadow/

Sh-utils (2.0) - 1214 KB:
http://freshmeat.net/projects/sh-utils/

Parche Hostname para Sh-utils (2.0-hostname) - 1 KB:
ftp://ftp.linuxfromscratch.org/lfs-packages/cvs/sh-utils-2.0-hostname.patch
http://downloads.linuxfromscratch.org/sh-utils-2.0-hostname.patch

Parche para Sh-utils (2.0) - 1 KB:
ftp://ftp.linuxfromscratch.org/lfs-packages/cvs/sh-utils-2.0.patch
http://downloads.linuxfromscratch.org/sh-utils-2.0.patch

Sysklogd (1.4.1) - 80 KB:
http://freshmeat.net/projects/sysklogd/

Sysvinit (2.84) - 89 KB:
http://freshmeat.net/projects/sysvinit/

Tar (1.13) - 1028 KB:
http://freshmeat.net/projects/tar/

Parche para Tar (1.13) - 1 KB:
ftp://ftp.linuxfromscratch.org/lfs-packages/cvs/tar-1.13.patch
http://downloads.linuxfromscratch.org/tar-1.13.patch

Texinfo (4.3) - 1,254 KB:
http://freshmeat.net/projects/texinfo/

Textutils (2.1) - 1,847 KB:
http://freshmeat.net/projects/textutils/

Util-linux (2.11y) - 1,777 KB:
http://freshmeat.net/projects/util-linux/

Vim (6.1) - 2,822 KB:
http://freshmeat.net/projects/vim/

Parche para Vim (6.1) - 1 KB:
ftp://ftp.linuxfromscratch.org/lfs-packages/cvs/vim-6.1.patch
http://downloads.linuxfromscratch.org/vim-6.1.patch

Zlib (1.1.4) - 144 KB:
http://freshmeat.net/projects/zlib/


Tamaño total de todos los paquetes: 99,270 KB (96.96 MB)


Capítulo 5. Preparación del sistema LFS


Introducción

En este capítulo compilaremos e instalaremos un sistema Linux mínimo. Este sistema contendrá sólo las herramientas necesarias para poder iniciar la construcción del sistema LFS definitivo en el siguiente capítulo.

Los ficheros que se compilen en este capítulo se instalarán bajo el directorio $LFS/static, para mantenerlos separados de los ficheros que se instalen en el siguiente capítulo. Como todo lo hecho aquí es solamente temporal, no queremos que estos ficheros contaminen el futuro sistema LFS.

La clave para aprender qué es lo que hace funcionar un sistema Linux es saber exactamente para qué se usa cada paquete, y por qué el usuario o el sistema lo necesita. Por esta razón se facilita una descripción corta del contenido de cada paquete a continuación de las instrucciones de instalación.

Varios de los paquetes deben parchearse antes de compilarlos, pero sólo cuando el parche es necesario para solucionar un problema. Con frecuencia el parche es necesario tanto en este como en el siguiente capítulo, pero a veces sólo es necesario en uno de ellos. Por tanto, no te preocupes cuando parezca que hemos olvidado las instrucciones para uno de los parches descargados.

Durante la instalación de bastantes paquetes verás aparecer en pantalla todo tipo de avisos (warnings). Esto es normal y puedes ignorarlos tranquilamente. No son más que eso, avisos; la mayoría debidos a un uso inapropiado, pero no ilegal, de la sintaxis de C o C++. Se debe a que el estándar C cambia con frecuencia y algunos paquetes todavía usan el estándar antiguo, lo que no es realmente un problema.

Antes de continuar, asegúrate de que la variable de entorno LFS tiene el valor correcto (si es que has decidido utilizarla) ejecutando el siguiente comando:

echo $LFS

Asegúrate de que muestra la ruta al punto de montaje de tu partición LFS, que es /mnt/lfs si has seguido nuestro ejemplo.


¿Por qué usamos enlazado estático?

La mayoría de los pogramas deben de realizar, dentro de sus tareas específicas, muchas otras operaciones comúnes y triviales, como escribir en memoria, buscar directorios, abrir y cerrar ficheros, leerlos y escribirlos, manejo de cadenas, reconocimiento de patrones, aritmética y más. En lugar de obligar a todos los programas a reinventar la rueda, el sistema GNU proporciona todas estas funciones básicas preparadas para su uso en librerías. La mayor librería de cualquier sistema Linux es glibc. Para tener una idea de lo que contiene, mira el fichero glibc/index.html que se encuentra en algún lugar de tu sistema anfitrión.

Hay dos formas de enlazar las funciones de una librería en un programa que las utilice: estáticamente o dinámicamente. Cuando un programa se enlaza estáticamente el código de las funciones utilizadas se incluye en el ejecutable, resultando un programa algo abultado. Cuando un programa se enlaza dinámicamente, lo que se incluye es una referencia al enlazador, el nombre de la librería y el nombre de la función, resultando un ejecutable mucho más pequeño. Este ejecutable tiene la desventaja de ser algo más lento que uno enlazado estáticamente, pues al enlazarse en tiempo de ejecución se consume algo de tiempo.

Aparte de esta pequeña desventaja, el enlazado dinámico tiene dos ventajas mayores sobre el enlazado estático. Primero, sólo necesitas una copia del código ejecutable de la librería en tu disco duro, en vez de tener muchas copias del mismo código en un montón de programas, salvando espacio en el disco. En segundo lugar, cuando varios programas usan las mismas funciones de las librerías al mismo tiempo, sólo se requiere la carga de una copia del código de las funciones, salvando espacio en memoria.

Hoy en día salvar algunos megabytes de espacio puede que no parezca mucho, pero hace muchas lunas, cuando los discos se median en megabytes y la memoria en kilobytes, este ahorro era sustancial. Significaba ser capaz de tener varios programas en memoria al mísmo tiempo y contener un sistema Unix completo en unos pocos volúmenes de discos.

Una tercera ventaja, aunque menor, del enlazado dinámico es que cuando una función de una librería tiene una correción de un error, o es mejorada, sólo necesitas recompilar esta librería, en lugar de tener que recompilar todos los programas que usan esta función mejorada.

En resumen, podemos decir que el enlazado dinámico consume tiempo de ejecución en vez de espacio en memoria, espacio en disco y tiempo de recompilación.

Pero si el enlazado dinámico salva tanto espacio, ¿por qué entonces vamos a enlazar todos los programas de este capítulo estáticamente?. La razón es que no vamos a compilar aquí una glibc temporal. Y evitamos hacer esto simplemente para ahorrar algo de tiempo, sobre unos 14 SBUs. Otra razón es que la versión de Glibc del sistema LFS puede que no sea compatible con la Glibc del sistema anfitrión. Las aplicaciones compiladas con la Glibc de tu sistema anfitrión puede que no se ejecuten adecuadamente (o en absoluto) en el sistema LFS.

Esto significa que las herramientas compiladas en este capítulo deberán ser auto-contenidas, debido a que cuando posteriormente hagamos chroot a la partición LFS la librería GNU no estará disponible. Esto es por lo que usamos los modificadores -static, --enable-static-link, y --disable-shared a lo largo de este capítulo, para asegurarnos de que todos los ejecutables están enlazados estáticamente. Cuando vayamos al siguiente capítulo, casi la primera cosa que haremos es construir glibc, el conjunto principal de librerías del sistema. Una vez hecho, podemos enlazar todos los demás programas dinámicamente (incluidos los instalados estáticamente en este capítulo) y sacaremos provecho de las oportunidades de ahorro de espacio.


Configuración del entorno

Ahora que has entrado al sistema como usuario lfs, ejecuta el siguiente comando para establecer un buen entorno de trabajo:

cat > ~/.bash_profile << "EOF"
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
CC="gcc -s"
export LFS LC_ALL CC
EOF
source ~/.bash_profile

Este perfil establece la máscara a 022, así los ficheros y directorios recién creados tendrán los permisos apropiados. Para ser más especificos, sólo el propietario del fichero tendrá permisos de escritura en los nuevos ficheros y directorios. Otros usuarios del sistema tendrán permisos de lectura, y permisos para entrar a los directorios. Es recomendable mantener este ajuste a lo largo de tu instalación del LFS.

La variable LFS deberas establecerla con el punto de montaje que hayas elegido.

La variable LC_ALL controla la localización de ciertos programas, haciendo que sus mensajes sigan las convenciones para un determinado país. Si tu sistema anfitrión utiliza una versión de glibc más antigua que 2.2.4, tener LC_ALL establecida a algo diferente a "C" o "POSIX" durante este capítulo puede causar problemas si sales del entorno chroot e intentas regresar más tarde. Estableciendo LC_ALL a "POSIX" ("C" es un alias para "POSIX") nos aseguramos de que todo funcionará como se espera en el entorno chroot.

CC es una variable que establecemos para evitar que los símbolos de depuración sean compilados dentro de nuestros paquetes estáticos. Al omitir estos símbolos durante la fase de compilación salvamos espacio en el disco duro y reducimos el tiempo de construcción.

Ahora estamos preparados para comenzar la construcción de las herramientas temporales que nos ayudarán en capítulos posteriores.


Instalación de Bash-2.05a

Estimación del tiempo de construcción:       1 SBU
Estimación del espacio necesario en disco:  24 MB

Instalación de Bash

Antes de intentar instalar Bash tienes que asegurarte de que tu distribución tiene los archivos /usr/lib/libcurses.a y /usr/lib/libncurses.a. Si tu distribución original es otro sistema LFS y seguiste las instrucciones del libro al pie de la letra, todos estos ficheros existirán.

Si no existe ninguno de los dos ficheros, debes instalar el paquete de desarrollo de la librería Ncurses. Este paquete suele tener un nombre parecido a ncurses-dev o ncurses-static. Si este paquete ya está instalado o acabas de instalarlo, comprueba los dos ficheros de nuevo. A menudo el fichero libcurses.a puede faltar (todavía). Si es ese el caso, entonces crea un enlace simbólico libcurses.a, ejecutando como usuario root el siguiente comando:

ln -s libncurses.a 
/usr/lib/libcurses.a

Ahora podemos comenzar de verdad. Prepara Bash para su compilación ejecutando el siguiente comando:

./configure --enable-static-link \
    --prefix=$LFS/static 
--with-curses

El significado de las opciones de configuración es:

Ahora podemos continuar compilando Bash:

make

Y terminar la instalación instalando Bash:

make install

Si al terminar la etapa make install aparecen unas líneas como estas:

install-info: unknown option
`--dir-file=/mnt/lfs/usr/info/dir'
usage: install-info [--version] [--help] [--debug] [--maxwidth=nnn]
	[--section regexp title] [--infodir=xxx] [--align=nnn]
	[--calign=nnn] [--quiet] [--menuentry=xxx]
	[--info-dir=xxx]
	[--keep-old] [--description=xxx] [--test]
	[--remove] [--] filename
make[1]: *** [install] Error 1
make[1]: Leaving directory `/mnt/lfs/usr/src/bash-2.05a/doc'
make: [install] Error 2 (ignored)

entonces, probablemente, estás utilizando Debian-2.2 (potato) y tienes una versión antigua del paquete texinfo, por lo que no podrás instalar las páginas info por el momento. Este error no es grave en absoluto: las páginas info se instalarán cuando volvamos a compilar bash dinámicamente en el Capítulo 6, así que puedes ignorarlo. Se ha informado de que la versión actual de Debian (3.0, también conocida como Woody) no tiene este problema.


Instalación de Binutils-2.13.2

Estimación del tiempo de construcción:       2.05 SBU
Estimación del espacio necesario en disco:  160 MB

Instalación de Bzip2-1.0.2

Estimación del tiempo de construcción:       0.07 SBU
Estimación del espacio necesario en disco:  6 MB

Instalación de Diffutils-2.8.1

Estimación del tiempo de construcción:       0.39 SBU
Estimación del espacio rquerido en disco:  10 MB

Instalación de Fileutils-4.1

Estimación del tiempo de construcción:       0.94 SBU
Estimación del espacio necesario en disco:  40 MB

Instalación de Fileutils

Hay un error documentado en la función atexit() de glibc-2.2.3 cuando ésta fue compilada con gcc-2.95.3. Este error sólo se da en algunos sistemas (más que nada en AMD, pero no exclusivamente). Dicho error causa violaciones de segmento en fileutils-1.4 compilado estáticamente. Este parche hace que se llame a la función on_exit() en lugar de a atexit()

Ten en cuenta que, en algunos casos, utilizar este parche provocará que no se pueda compilar el paquete, incluso cuando tu sistema tenga un procesador AMD y una librería Glibc-2.2.3 (o superior) instalada. Si ese es tu caso, necesitarás borrar el directorio fileutils-4.1 y desempaquetarlo de nuevo antes de continuar. Creemos que esto puede pasar cuando tu distribución ha alterado de alguna forma la librería Glibc-2.2.3, pero desconocemos los detalles exactos.

Para reparar este paquete de forma que compile adecuadamente en máquinas AMD/Glibc-2.2.3, ejecuta el siguiente comando. NO intentes utilizar este arreglo si no tienes la librería Glibc-2.2.3 instalada. Es más que probable que provoque todo tipo de problemas de compilación.

patch -Np1 -i
../fileutils-4.1.patch

Prepara el paquete para su compilación:

LDFLAGS="-static" \
    ./configure --disable-nls
--prefix=$LFS/static

Continúa compilando el paquete:

make

Y termina instalando el paquete:

make install

Una vez hayas instalado Fileutils, puedes comprobar si se ha evitado el problema de la violación de segmento ejecutando $LFS/static/bin/ls. Si esto funciona, entonces está solucionado. Si no, deberás rehacer la instalación aplicando el parche si no lo usaste, o sin él, si en efecto lo utilizaste.


Instalación de Findutils-4.1

Estimación del tiempo de construcción:       0.12 SBU
Estimación del espacio necesario en disco:  8 MB

Instalación de GCC-3.2.1

Estimación del tiempo de construcción:       9.48 SBU
Estimación del espacio necesario en disco:  326 MB

Instalación de GCC

No necesitamos un compilador C++ hasta el Capítulo 6. Así que, en este momento, sólo es necesario desempaquetar el paquete gcc-core.

Se sabe que este programa se comporta mal si cambias sus parámetros de optimización (incluyendo las opciones -march y -mcpu). Por esta razón, si tienes definida cualquier variable de entorno que pueda sobreescribir las optimizaciones por defecto, como CFLAGS o CXXFLAGS, recomendamos quitarlas o modificarlas cuando construyas GCC.

La documentación sobre la instalación de GCG recomienda construir GCC en un directorio dedicado fuera del árbol de las fuentes:

mkdir ../gcc-build
cd ../gcc-build

Prepara GCC para su compilación:

../gcc-3.2.1/configure --prefix=/static \
   --disable-nls --disable-shared \
   --with-as=$LFS/static/bin/as \
   --with-ld=$LFS/static/bin/ld

El significado de las opciones de configure es:

Continúa compilando el paquete:

make BOOT_LDFLAGS="-static"
bootstrap

El significado de las opciones de make es:

Y termina instalando el paquete:

make prefix=$LFS/static 
install-no-fixedincludes

El significado de la opción de make es:

Como toque final crearemos el enlace simbólico $LFS/static/bin/cc. Muchos programas y guiones intentan ejecutar cc en lugar de gcc. Esto es así para hacer que los programas sean genéricos y utilizables en todo tipo de sistemas Unix. No todo el mundo tiene GNU CC instalado. La simple ejecución de cc (Compilador de C) deja al usuario libre para decidir el compilador de C a instalar. El enlace simbólico apuntará al compilador por defecto del sistema.

ln -s gcc
$LFS/static/bin/cc


Instalación de Make-3.80

Estimación del tiempo de construcción:       0.26 SBU
Estimación del espacio necesario en disco:  8 MB

Instalación de Sh-utils-2.0

Estimación del tiempo de construcción:       0.47 SBU
Estimación del espacio necesario en disco:  42 MB

Instalación de Util-linux-2.11y

Estimación del tiempo de construcción:       0.09 SBU
Estimación del espacio necesario en disco:  9 MB

Capítulo 6. Instalación de los programas del sistema base


Introducción

En este capítulo entramos en la zona de edificación y comenzamos a construir de verdad nuestro sistema LFS. Es decir, cambiamos la raíz a nuestro mini sistema Linux, creamos algunas cosas auxiliares y, después, comenzamos a instalar todos los paquetes uno por uno.

La instalación de todos estos paquetes es algo bastante sencillo, por lo que puedes pensar que, probablemente, sea más corto dar aquí las instrucciones genéricas de instalación y sólo explicar en profundidad la instalación de los paquetes que necesiten un método alternativo. Aunque estemos de acuerdo en eso, hemos elegido dar las instrucciones completas para todos y cada uno de los paquetes, simplemente para minimizar la posibilidad de errores.

Si piensas usar optimizaciones para la compilación durante este capítulo, mírate la receta de optimización en http://www.escomposlinux.org/lfs-es/recetas/optimization.html (el original se encuentra en http://hints.linuxfromscratch.org/hints/optimization.txt). Optimizar la compilación puede hacer que un programa funcione rápido, pero también puede causar problemas de compilación. Si un paquete rehúsa compilar usando optimización, inténtalo sin optimización para ver si el problema persiste.

El orden en el que se instalan los paquetes en este capítulo debe respetarse estrictamente para asegurar que ningún programa inserte en su código una ruta referente a /static. Por la misma razón, no compiles paquetes en paralelo. La compilación en paralelo puede ahorrarte algo de tiempo (sobre todo en máquinas con CPUs duales), pero puede generar un programa que contenga referencias a /static, lo que provocaría que el programa dejase de funcionar cuando se elimine dicho directorio.


Sobre los símbolos de depuración

La mayoría de los programas y librerías se compilan por defecto incluyendo los símbolos de depuración (con la opción -g de gcc).

Cuando se depura un programa o librería que fue compilado incluyendo la información de depuración, el depurador no nos da sólo las direcciones de memoria, sino también los nombres de las rutinas y variables.

Pero la inclusión de estos símbolos de depuración agranda sustancialmente un programa o librería. Para tener una idea del espacio que ocupan estos símbolos, echa un vistazo a lo siguiente:

Los tamaños pueden variar algo, dependiendo de qué compilador se usó y con qué librería C. Pero cuando comparamos programas con y sin símbolos de depuración, la diferencia generalmente está en una relación de entre 2 y 5.

Como muchas personas probablemente nunca usen un depurador en su sistema, eliminando estos símbolos se puede liberar una gran cantidad de espacio del disco.

Para eliminar los símbolos de depuración de un binario (que debe ser un binario a.out o ELF) ejecuta strip --strip-debug fichero. Pueden usarse comodines para procesar múltiples ficheros (utilizando algo como: strip --strip-debug $LFS/usr/bin/*).

Para tu comodidad, en el Capítulo 9 se incluye un comando simple para eliminar todos los símbolos de depuración de los programas y librerías del sistema. Puedes encontrar información adicional en la receta de optimización que hay en http://www.escomposlinux.org/lfs-es/recetas/optimization.html (el original se encuentra en http://hints.linuxfromscratch.org/hints/optimization.txt).


Entrando al entorno chroot

Es la hora de entrar en el entorno chroot para instalar los paquetes que necesitamos. Antes de que puedas hacer chroot, sin embargo, necesitas cambiar al usuario root, pues sólo el usuario root puede usar el comando chroot.

Hazte root y ejecuta el siguiente comando para entrar al entorno chroot:

chroot $LFS /static/bin/env -i \
    HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin:/static/bin \
    /static/bin/bash --login

La opción -i pasada al comando env limpiará todas las variables del chroot. Después de esto, solamente se establecen de nuevo las variables HOME, TERM, PS1 y PATH. La construcción TERM=$TERM fijará la variable TERM dentro del chroot al mismo valor que fuera del chroot, pues programas como vim y less la necesitan para funcionar correctamente. Si necesitas tener presentes otras variables, como CFLAGS o CXXFLAGS, éste es un buen sitio para establecerlas.

Desde este punto ya no es necesario utilizar la variable LFS porque todo lo que hagas estará restringido al sistema de ficheros LFS -- ya que lo que el intérprete de comandos piensa que es / en realidad es el valor de $LFS, que se le pasó al comando chroot.

Debes asegurarte de que todos los comandos que aparecen en el resto de este y los siguientes capítulos son ejecutados dentro del entorno chroot. Si por alguna razón abandonas este entorno (tras un reinicio, por ejemplo), debes recordar entrar en el chroot y montar proc (como explicaremos más tarde) antes de seguir con las instalaciones.

Ten en cuenta que en la línea de entrada de comandos de bash pondrá: "I have no name!". Esto es normal porque Glibc no ha sido instalada todavía.


Creación de los directorios

Ahora vamos a crear una estructura en nuestro sistema de ficheros LFS. Crearemos un árbol de directorios. Usando los siguientes comandos se creará un árbol más o menos estándar:

mkdir -p /{bin,boot,dev/pts,etc/opt,home,lib,mnt,proc} &&
mkdir -p /{root,sbin,tmp,usr/local,var,opt} &&
for dirname in /usr /usr/local
    do
    mkdir $dirname/{bin,etc,include,lib,sbin,share,src}
    ln -s share/{man,doc,info} $dirname
    mkdir $dirname/share/{dict,doc,info,locale,man}
    mkdir $dirname/share/{nls,misc,terminfo,zoneinfo}
    mkdir $dirname/share/man/man{1,2,3,4,5,6,7,8}
done &&
mkdir /usr/lib/locale &&
mkdir /var/{lock,log,mail,run,spool} &&
mkdir -p /var/{tmp,opt,cache,lib/misc,local} &&
mkdir /opt/{bin,doc,include,info} &&
mkdir -p /opt/{lib,man/man{1,2,3,4,5,6,7,8}} &&
ln -s ../var/tmp /usr

Los directorios se crean, por defecto, con los permisos 755, pero esto no es deseable para todos los directorios. Haremos dos cambios: uno para el directorio personal de root, y otro en los directorios de los ficheros temporales.

chmod 0750 /root &&
chmod 1777 /tmp /var/tmp

El primer cambio nos asegura que no todo el mundo pueda entrar en el directorio /root -- lo mismo que debería hacer un usuario normal con su directorio personal. El segundo cambio nos asegura que cualquier usuario pueda escribir en los directorios /tmp y /var/tmp, pero no pueda borrar los ficheros de otros usuarios. Esto último lo prohíbe el llamado "bit pegajoso" (sticky bit) - el bit más alto de la máscara de permisos 1777.


Nota de conformidad con FHS

Basamos nuestro árbol de directorios en el estándar FHS (disponible en http://www.pathname.com/fhs/). Además del árbol arriba creado, este estándar estipula la existencia de /usr/local/games y /usr/share/games, pero no nos gustan para un sistema base. Sin embargo, eres libre de hacer que tu sistema cumpla el FHS. Como sobre la estructura del subdirectorio /usr/local/share el FHS no hace precisiones, creamos aquí los directorios que pensamos que son necesarios.


Creación de los ficheros de contraseñas y grupos

Para que root pueda entrar al sistema y para que el nombre "root" sea reconocido, es necesario tener las entradas apropiadas en los ficheros /etc/passwd y /etc/group.

Crea el fichero /etc/passwd ejecutando el siguiente comando:

echo "root:x:0:0:root:/root:/bin/bash" > 
/etc/passwd

La contraseña real para root (la "x" es sólo un sustituto) se establecerá más adelante.

Crea el fichero /etc/group ejecutando el siguiente comando:

cat > /etc/group << "EOF"
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tty:x:4:
tape:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
EOF

Los grupos creados no son parte de ningún estándar -- son los grupos que el guión MAKEDEV utiliza en la siguiente sección. Aparte del grupo "root", el LSB (http://www.linuxbase.org) solamente recomienda que esté presente un grupo "bin" con GID 1. Todos los demás nombres de grupos y sus GID pueden ser elegidos libremente por el usuario, pues los paquetes correctamente escritos no dependen del número GID, sino que utilizan el nombre del grupo.


Creación de los dispositivos (Makedev-1.7)

Estimación del tiempo de construcción:       0.07 SBU
Estimación del espacio necesario en disco:  50 KB

Instalación de las cabeceras de Linux-2.4.20

Estimación del tiempo de construcción:       0.02 SBU
Estimación del espacio necesario en disco:  142 MB

Instalación de las cabeceras del núcleo

No compilaremos todavía un nuevo núcleo (kernel) -- lo haremos cuando terminemos la instalación de todos los paquetes. Pero como ciertos paquetes necesitan los ficheros de cabecera (headers) del núcleo, vamos a desempaquetar el archivo del núcleo ahora, ajustarlo, y copiar los ficheros de cabecera a un lugar donde puedan encontrarlos esos paquetes.

Es importante notar que los ficheros del directorio de las fuentes del núcleo no pertenecen a root. Aunque desempaquetes un paquete como usuario root (como hacemos dentro del chroot), los ficheros acaban teniendo los identificadores de usuario y grupo que tenían en la computadora en la que se empaquetó. Esto usualmente no es un problema para otros paquetes que instales debido a que eliminas el árbol de las fuentes despues de la instalación. Pero el árbol de las fuentes del núcleo Linux se guarda con frecuencia durante mucho tiempo, por lo que si en alguna ocasión ese identificador es asignado a alguien en tu máquina, esa persona obtendrá permisos de escritura sobre las fuentes del núcleo.

A la vista de esto, puede que quieras ejecutar chown -R 0:0 en el directorio linux-2.4.20 para asegurarte de que todos los ficheros son propiedad del usuario root.

La instalación de las cabeceras del núcleo requiere del programa pwd. En las fuentes del núcleo, la ruta al programa pwd está fijada como /bin/pwd. Crea un enlace simbólico para solventar esto:

ln -s /static/bin/pwd 
/bin/pwd

Prepara la instalación de las cabeceras:

make mrproper

Esto asegurará que el árbol del núcleo está absolutamente limpio. El equipo de desarrollo del núcleo recomienda usar este comando antes de cada compilación del núcleo, y en realidad no debes confiar en que el árbol de las fuentes esté limpio tras desempaquetarlo.

Crea el fichero include/linux/version.h:

make 
include/linux/version.h

Crea el enlace simbólico include/asm específico de la plataforma:

make symlinks

Instala los ficheros de cabecera específicos de la plataforma:

cp -HR include/asm /usr/include &&
cp -R include/asm-generic /usr/include

Instala los ficheros de cabecera del núcleo independientes de la plataforma:

cp -R include/linux 
/usr/include

Hay ciertos fichero de cabecera del núcleo que hacen uso del fichero de cabecera autoconf.h. Puesto que todavía no hemos configurado el núcleo, necesitamos crear este fichero por nuestra cuenta para evitar fallos de compilación. Crea un fichero autoconf.h vacio:

touch 
/usr/include/linux/autoconf.h

Como el enlace simbólico /bin/pwd que creamos anteriormente era sólo temporal, podemos eliminarlo ahora:

rm /bin/pwd


Por qué copiamos las cabeceras del núcleo y no las enlazamos simbólicamente.

En el pasado, era una práctica común enlazar simbólicamente los directorios /usr/include/{linux,asm} a /usr/src/linux/include/{linux,asm}. Esta fue una mala práctica, como señala este extracto de un mensaje de Linus Torvalds a la Lista de Correo del Núcleo Linux:

Sugeriría que la gente que compile núcleos nuevos debe:

 - no tener un sólo enlace simbólico a la vista (excepto el que crea la
   misma construcción del núcleo, el enlace simbólico llamado
   "linux/include/asm", que sólo se usa para la compilación interna del
   mismo núcleo).

Y sí, esto es lo que yo hago. Mi /usr/src/linux todavía contiene los
ficheros de cabecera del antiguo 2.2.13, aunque no he ejecutado un
núcleo 2.2.13 desde hace _muucho_ tiempo. Pero esas fueron las cabeceras
con las que fue compilada glibc, por lo que esas cabeceras son las que
coinciden con los ficheros objeto de la librería.

Y este es, de hecho, el entorno que se ha sugerido en, al menos, los
últimos cinco años. No sé por qué el asunto del enlace simbólico sigue
coleando, como un mal zombi. Casi cada distribución todavía tiene ese
enlace simbólico roto,  y la gente todavía recuerda que el código fuente
de linux debe ir en "/usr/src/linux" aunque no ha sido cierto desde hace
_muucho_ tiempo.

La parte relevante es donde Linus afirma que las cabeceras deberían ser con las que fue compilada glibc. Estas son las cabeceras que deberías usar cuando más adelante compiles otros paquetes, pues son las que coinciden con los códigos-objeto de las librerías. Al copiar las cabeceras nos aseguramos de que permanecen disponibles si posteriormente actualizas el núcleo.

Advierte, de paso, que es perfectamente correcto tener las fuentes del núcleo en /usr/src/linux, mientras no tengas los enlaces simbólicos /usr/include/{linux,asm}.


Instalación de Glibc-2.3.1

Estimación del tiempo de construcción:       14.71 SBU
Estimación del espacio necesario en disco:  369 MB

Instalación de Glibc

Antes de instalar glibc, debes entrar al directorio glibc-2.3.1 usando el comando cd y desempaquetar Glibc-linuxthreads dentro de este directorio, no en /usr/src como normalmente harías.

Se sabe que este programa se comporta mal si cambias sus parámetros de optimización (incluyendo las opciones -march y -mcpu). Por tanto, si tienes definida cualquier variable de entorno que pueda sobreescribir las optimizaciones por defecto, como CFLAGS y CXXFLAGS, te recomendamos que las desactives antes de construir Glibc.

Básicamente, compilar Glibc de forma diferente a como el libro sugiere pone tu sistema en grave riesgo.

Comenzaremos aplicando un parche que hace lo siguiente:

patch -Np1 -i ../glibc-2.3.1-root-perl.patch

Hay un problema potencial que causa que fallen los binarios enlazados estáticamente contra una librería Glibc-2.2 o anterior. Aunque los binarios estáticos tienen incorporadas todas las partes necesarias de Glibc, todavía se apoyan en un conjunto de librerías externas: las librerías NSS de Glibc. Estas librerías, entre otras cosas, indican a los programas dónde se encuentra la base de datos con las contraseñas del sistema (en /etc/password, NIS, o cualquier otro sistema que se haya configurado).

Glibc ha sufrido algunos cambios desde la versión 2.2.x y el nuevo código NSS es incompatible con el antiguo. Así que cuando se instale Glibc se instalarán las nuevas librerías NSS, los programas estáticos cargarán estas nuevas librerías NSS y abortarán con segmentation fault (violación de segmento). Este parche deshace algunos de los cambios para evitar el problema.

Si construiste los programas del capítulo 5 en un sistema anfitrión que utilizase Glibc-2.2.x o anterior, debes aplicar el siguiente parche. Instalaremos Glibc otra vez al final de este capítulo para eliminar este parche, con lo que tendrás una Glibc púra tal y como sugieren los desarrolladores.

patch -Np1 -i ../glibc-2.3.1-libnss.patch

Glibc comprobará el fichero /etc/ld.so.conf y abortará con un error si no lo encuentra, así que debemos crearlo:

touch /etc/ld.so.conf

La documentación de instalación de Glibc recomienda construir Glibc en un directorio aparte, y no en el directorio de las fuentes:

mkdir ../glibc-build &&
cd ../glibc-build

A continuación, prepara Glibc para su compilación:

../glibc-2.3.1/configure --prefix=/usr \
    --disable-profile --enable-add-ons \
    --libexecdir=/usr/bin

El significado de las opciones de configure es:

Durante la fase de configuración verás los siguientes mensajes de aviso:

configure: warning:
*** These auxiliary programs are missing or too old: msgfmt
*** some features will be disabled.
*** Check the INSTALL file for required versions.

configure: aviso:
*** Este programa auxiliar no se ha encontrado o es demasiado antiguo: msgfmt
*** algunas características serán desactivadas.
*** Compruebe en el fichero INSTALL la versión requerida.

Que no se encuentre msgfmt (incluido en el paquete Gettext que será instalado más adelante en este capítulo) no causa ningún problema. Se usa msgfmt para generar los ficheros binarios traducidos que se usan para hacer que el sistema "hable" en un idioma diferente. Como estos ficheros de traducción ya han sido generados para ti, no es necesario msgfmt. Solamente necesitas msgfmt si cambias los ficheros fuente de traducción (los ficheros *.po del subdirectorio po) lo cual requerirá regenerar los ficheros binarios.

Debido a que Glibc aún no ha sido instalada, una de las pruebas lanzadas por el guión configure fallará. Esta prueba se supone que comprueba gcc para determinar si hay o no instalado un compilador para plataforma cruzada. Sin embargo, hace falte tener instalada Glibc para lanzar esta prueba. Puesto que la prueba falla, el guión configure asume automáticamente que hacemos compilación cruzada. Tenemos que evitar esta asunción indicandole explícitamente a Glibc que no queremos una compilación cruzada. No hacer esto prococa efectos indeseables, como que no se instalen los ficheros de las zonas horarias.

echo "cross-compiling = no" > configparms

Continúa compilando el paquete:

make

Continuaremos instalando el paquete. Las páginas de manual de Linuxthreads no van a instalarse en este punto debido a que necesitan una instalación funcional de Perl. Instalaremos Perl más tarde en este capítulo, y las páginas de manual serán instaladas cuando se instale Glibc por segunda vez, al final de este capítulo.

make install

Las locales (utilizadas por la Glibc para hacer que el sistema "hable" en un idioma diferente) no se instalan cuando lanzas make install, por lo que tendremos que hacerlo nosotros ahora:

make localedata/install-locales

Una alternativa al comando anterior es instalar solamente aquellas locales que necesites o desees. Esto puede hacerse usando el comando localedef. Se puede encontrar más información sobre esto en el fichero INSTALL del árbol de glibc-2.3.1.

Para finalizar la instalación recargaremos Bash para que utilice los nuevos ficheros libnss_*. Esto también nos librará del mensaje I have no name! de la línea de comandos:

exec /static/bin/bash 
--login


Instalación de GCC-3.2.1

Estimación del tiempo de construcción:       13.26 SBU
Estimación del espacio necesario en disco:  221 MB

Instalación de GCC

Se sabe que este programa se comporta mal si cambias sus parámetros de optimización (incluyendo las opciones -march y -mcpu). Por esta razón, si tienes definida cualquier variable de entorno que pueda sobreescribir las optimizaciones por defecto, como CFLAGS o CXXFLAGS, recomendamos quitarlas o modificarlas cuando construyas GCC.

En este momento construiremos los compiladores C y C++, por lo que necesitarás desempaquetar tanto el paquete gcc-core como el gcc-g++. Hay otros compiladores disponibles dentro del paquete gcc completo, cuyas instrucciones de construcción puedes encontrar en http://www.escomposlinux.org/lfs-es/blfs-es-CVS/general/gcc.html (el original en inglés está en http://beyond.linuxfromscratch.org/view/cvs/general/gcc.html).

La documentación para la instalación de GCC recomienda construir GCC en un directorio fuera del árbol de las fuentes. Crea el directorio de construcción:

mkdir ../gcc-build &&
cd ../gcc-build

Prepara GCC para su compilación:

../gcc-3.2.1/configure --prefix=/usr 
--enable-shared \
    --enable-threads=posix --with-slibdir=/lib \
    --enable-__cxa_atexit 
--enable-clocale=gnu

El significado de los opciones de configure es:

  • --enable-threads=posix: Esto activa las excepciones C++ para el manejo de código multihilo.

  • --enable-__cxa_atexit: Esta opción dará como resultado librerías compartidas C++ y programas C++ interoperables con otras distribuciones linux.

  • --enable-clocale=gnu: Hay un riesgo de que ciertas personas construyan librerías C++ incompatibles con ABI si no instalan todas las localedata de glibc. Utilizando --enable-clocale=gnu nos aseguramos de que se hace "lo correcto" en todos los casos. Si no deseas usar esta opción, entonces al menos contruye la locale de_DE. Cuando GCC encuentra esta locale específica, entonces se implementa el modo locale correcto (gnu).

Continúa compilando el paquete:

make bootstrap

El objetivo bootstrap no sólo compila GCC, si no que compila GCC varias veces. Utiliza el primer programa compilado para compilarse a si mismo una segunda y tercera vez, asegurandose de que el compilador se compiló correctamente.

Termina instalando el paquete:

make 
install-no-fixedincludes

Algunos paquetes esperan que el Pre-Procesador de C esté instalado en los directorios /lib y /usr/lib. Para satisfacer a estos paquetes, crea dos enlaces simbólicos:

ln -s ../usr/bin/cpp /lib &&
ln -s ../bin/cpp /usr/lib

Muchos paquetes compilan usando cc como nombre del compilador C. Para satisfacer a estos paquetes, crea el enlace simbólico cc:

ln -s gcc /usr/bin/cc


Instalación de Findutils-4.1

Estimación del tiempo de construcción:       0.10 SBU
Estimación del espacio necesario en disco:  3 MB

Instalación de Findutils

El paquete Findutils es bastante antiguo y tiene problemas al compilarlo con versiones recientes de Glibc (Glibc-2.0.x y superiores). Necesitas aplicar el parche que soluciona estos conflictos:

patch -Np1 -i 
../findutils-4.1.patch

Hay un error en el fichero locate.c de Findutils que provoca una violación de segmento al encontrarse con rutas demasiado largas. El problema lo causa la función get_short() al calcular números negativos de forma incorrecta. Este parche soluciona dicho error.

patch -Np1 -i 
../findutils-4.1-segfault.patch

Prepara Findutils para su compilación:

./configure --prefix=/usr

Por defecto, la base de datos de updatedb se encuentra en /usr/var. Para hacer que la localización del fichero locatedb cumpla con el FHS, pásale la opción localstatedir=/var/lib/misc a los dos comandos make que vienen a continuación.

Continúa compilando el paquete:

make libexecdir=/usr/bin

Y termina instalando el paquete:

make libexecdir=/usr/bin 
install


Instalación de Gawk-3.1.1

Estimación del tiempo de construcción:       0.39 SBU
Estimación del espacio necesario en disco:  15 MB

Instalación de Ncurses-5.3

Estimación del tiempo de construcción:       1.88 SBU
Estimación del espacio necesario en disco:  22 MB

Instalación de Ncurses

Prepara Ncurses para su compilación:

./configure --prefix=/usr --with-shared

Continúa compilando el paquete:

make

Instala el paquete:

make install

Otorga permisos de ejecución a las librerías ncurses:

chmod 755 /usr/lib/*.5.3

Mueve las librerías al directorio /lib, donde se espera encontrarlas:

mv /usr/lib/libncurses.so.5* /lib

Puesto que las librerías se han movido a /lib, algunos enlaces simbólicos apuntan ahora a ficheros que no existen. Regenera esos enlaces simbólicos:

ln -sf libncurses.a /usr/lib/libcurses.a &&
ln -sf ../../lib/libncurses.so.5 /usr/lib/libncurses.so &&
ln -sf ../../lib/libncurses.so.5 /usr/lib/libcurses.so


Instalación de Vim-6.1

Estimación del tiempo de construcción:       0.81 SBU
Estimación del espacio necesario en disco:  24 MB

Instalación de Binutils-2.13.2

Estimación del tiempo de construcción:       2.48 SBU
Estimación del espacio necesario en disco:  94 MB

Instalación de Binutils

Se sabe que este programa se comporta mal si cambias sus parámetros de optimización (incluyendo las opciones -march y -mcpu). Por tanto, si tienes definida cualquier variable de entorno que pueda sobreescribir las optimizaciones por defecto, como CFLAGS y CXXFLAGS, te recomendamos que las desactives o modifiques antes de construir Binutils.

La documentación sobre la instalación de Binutils recomienda construir Binutils fuera del directorio de las fuentes:

mkdir ../binutils-build &&
cd ../binutils-build

A continuación, prepara Binutils para su compilación:

../binutils-2.13.2/configure --prefix=/usr --enable-shared

Continúa compilando el paquete:

make tooldir=/usr

Normalmente, el directorio tooldir (donde se instalarán los ejecutables de Binutils) se establece como $(exec_prefix)/$(target_alias), lo que se convierte en, por ejemplo, /usr/i686-pc-linux-gnu. Como sólo construimos programas para nuestro propio sistema, no necesitamos en /usr este directorio específico de cada objetivo. Esa configuración se utilizaría si el sistema fuese usado para compilación cruzada (por ejemplo, compilando un paquete en una máquina Intel, pero generando código que se ejecutará en máquinas Apple PowerPC).

Instala el paquete:

make tooldir=/usr install

Instala las páginas info:

make tooldir=/usr install-info

Algunos paquetes necesitan la cabecera libiberty para poder construirse. Para satisfacer a estos programas, instala el fichero:

cp ../binutils-2.13.2/include/libiberty.h /usr/include


Instalación de Sh-utils-2.0

Estimación del tiempo de construcción:       0.42 SBU
Estimación del espacio necesario en disco:  12 MB

Instalación de Net-tools-1.60

Estimación del tiempo de construcción:       0.16 SBU
Estimación del espacio necesario en disco:  5 MB

Instalación de Perl-5.8.0

Estimación del tiempo de construcción:       3.81 SBU
Estimación del espacio necesario en disco:  52 MB

Instalación de E2fsprogs-1.32

Estimación del tiempo de construcción:       0.80 SBU
Estimación del espacio necesario en disco:  13 MB

Instalación de Gzip-1.2.4a

Estimación del tiempo de construcción:       0.03 SBU
Estimación del espacio necesario en disco:  2 MB

Instalación de Man-1.5k

Estimación del tiempo de construcción:       0.05 SBU
Estimación del espacio necesario en disco:  2 MB

Instalación de Man

Hay tres parches para Man. El primer parche comenta una de las líneas del fichero man.conf (MANPATH /usr/man) para evitar resultados redundantes cuando utilicemos programas como whatis:

patch -Np1 -i ../man-1.5k-manpath.patch

El segundo parche añade la opción -R a la variable PAGER para que las secuencias de escape se manejen correctamente:

patch -Np1 -i ../man-1.5k-pager.patch

El último parche evita problemas cuando las páginas de manual que no están formateadas para más de 80 columnas se usan en conjunto con las versiones recientes de groff:

patch -Np1 -i ../man-1.5k-80cols.patch

Las rutas a algunos programas se escriben dentro de los ficheros de man. Desafortunadamente, el guión configure asigna la última localización en el PATH en la que se encuentra un programa, en lugar de la primera. Añadiendo /usr/bin:/bin a la variable PATH para el comando ./configure nos aseguramos de que man no utilice los programas del directorio /static.

Prepara Man para su compilación:

PATH=$PATH:/usr/bin:/bin \
    ./configure -default -confdir=/etc

Continúa compilando el paquete:

make

Y termina instalando el paquete:

make install

Puede que quieras mirar la receta sobre man en http://www.escomposlinux.org/lfs-es/recetas/man.html (el original se encuentra en http://hints.linuxfromscratch.org/hints/man.txt) que se ocupa de las cuestiones de formateado y compresión de las páginas de manual.


Instalación de Lilo-22.2

Estimación del tiempo de construcción:       0.08 SBU
Estimación del espacio necesario en disco:  3 MB

Instalación de Lilo

Hemos elegido Lilo como gestor de arranque porque nos sentimos cómodos con él, pero puede que desees elegir otro. Fabio Fracassi ha escrito una receta sobre GRUB, que está disponible en http://www.escomposlinux.org/lfs-es/recetas/grub-howto.html (la versión original se encuentra en http://hints.linuxfromscratch.org/hints/grub-howto.txt).

Compila Lilo:

make

Y termina instalando el paquete:

make install

Al final de la instalación, aparecerá un mensaje afirmando que se debe ejecutar /sbin/lilo. Esto es inutil porque el fichero /etc/lilo.conf no está presente todavía. Completaremos la instalación de lilo en el Capítulo 8.

El símbolo estándar de LILO, o el menú, pueden sustituirse por el logo de LFS, o cualquier logo que desees. Martin Imobersteg ha escrito una receta sobre esto, que se encuentra en http://www.escomposlinux.org/lfs-es/recetas/bootlogo.html (la versión original se encuentra en http://hints.linuxfromscratch.org/hints/bootlogo.txt).


Instalación de Psmisc-21.2

Estimación del tiempo de construcción:       0.11 SBU
Estimación del espacio necesario en disco:  2 MB

Instalación de Shadow-4.0.3

Estimación del tiempo de construcción:       0.88 SBU
Estimación del espacio necesario en disco:  7 MB

Instalación del Entorno de Contraseñas Ocultas (Shadow Password Suite)

Antes de instalar este paquete, puede que quieras echar un vistazo a la receta de Shadow. En ella se discute cómo puedes hacer más seguro tu sistema en lo relativo al uso de contraseñas, por ejemplo activando el uso de las contraseñas MD5, que son más seguras, o cómo conseguir exprimir hasta el máximo este paquete. Puedes encontrar la receta de Shadow en http://www.escomposlinux.org/lfs-es/recetas/shadowpasswd_plus.html (la versión original se encuentra en http://hints.linuxfromscratch.org/hints/shadowpasswd_plus.txt).

Prepara Shadow para su compilación:

./configure --prefix=/usr --libdir=/usr/lib \
    --enable-shared

Continúa compilando el paquete:

make

Instala el paquete:

make install

Shadow utiliza dos ficheros para configurar los ajustes de autenticación para el sistema. Instala estos ficheros de configuración:

cp etc/{limits,login.access} /etc

/var/spool/mail es la antigua localización de los buzones de los usuarios. El lugar que se usa hoy en día es /var/mail. Ejecuta el siguiente comando para cambiar la localización del buzón de correo:

sed 's%/var/spool/mail%/var/mail%' \
    etc/login.defs.linux > /etc/login.defs

De acuerdo a la página de manual de vipw, debería existir un enlace simbólico vigr. Como el procedimiento de instalación de shadow no crea este enlace simbólico, lo hacemos manualmente:

ln -s vipw /usr/sbin/vigr

El enlace vipw apunta actualmente a un fichero que no existe. Puesto que no necesitamos este fichero aquí, lo eliminamos

rm /bin/vipw

Mueve el programa sg al directorio /usr/bin:

mv /bin/sg /usr/bin

Nueve las librerías dinámicas de Shadow a un lugar más apropiado:

mv /usr/lib/lib{shadow,misc}.so.0* /lib

Las librerías has sido movidas, pero algunos paquetes espera encontrarlas en el directorio /usr/lib. Para solventar esto, crea los siguientes enlaces simbólicos:

ln -sf ../../lib/libshadow.so.0 /usr/lib/libshadow.so &&
ln -sf ../../lib/libmisc.so.0 /usr/lib/libmisc.so

Tanto Sh-utils como Shadow instalan un programa groups que es casi identico. Si lo deseas, puedes eliminar el programa groups instalado por Shadow ejecutando el siguiente comando:

rm /bin/groups


Instalación de Sysklogd-1.4.1

Estimación del tiempo de construcción:       0.03 SBU
Estimación del espacio necesario en disco:  472 KB

Configuración de Sysklogd

Crea un nuevo fichero /etc/syslog.conf ejecutando lo siguiente:

cat > /etc/syslog.conf << "EOF"
# Inicio de /etc/syslog.conf

auth,authpriv.* -/var/log/auth.log
*.*;auth,authpriv.none -/var/log/sys.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
*.emerg *

# Fin de /etc/syslog.conf
EOF


Instalación de Sysvinit-2.84

Estimación del tiempo de construcción:       0.06 SBU
Estimación del espacio necesario en disco:  1 MB

Configuración de Sysvinit

Crea un nuevo fichero /etc/inittab ejecutando lo siguiente:

cat > /etc/inittab << "EOF"
# Inicio de /etc/inittab

id:3:initdefault:

si::sysinit:/etc/rc.d/init.d/rc sysinit

l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

su:S016:once:/sbin/sulogin

1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600

# Fin de /etc/inittab
EOF


Instalación de Util-linux-2.11y

Estimación del tiempo de construcción:       0.38 SBU
Estimación del espacio necesario en disco:  10 MB

Notas sobre la conformidad con el estándar FHS

El estándar FHS recomienda que usemos /var/lib/hwclock para la ubicación del archivo adjtime, en lugar del habitual /etc. Para hacer que hwclock sea conforme a FHS, ejecuta lo siguiente:

cp hwclock/hwclock.c{,.backup} &&
sed 's%etc/adjtime%var/lib/hwclock/adjtime%' \
    hwclock/hwclock.c.backup > hwclock/hwclock.c &&
mkdir -p /var/lib/hwclock


Instalación de Glibc-2.3.1

Tiempo estimado de construcción:       Por determinar
Estimación del espacio necesario en disco:  Por determinar

Instalación de Glibc

Al principio de este capítulo instalaste Glibc aplicandole un parche. Parte de este parche deshaciá algunos cambios para hacer que los binarios compilados con Glibc-2.2 funcionasen. Sin embargo, esto no es lo que los desarrolladores de Glibc intentan y nosotros no necesitamos mantener esta Glibc modificada. Así que reinstalamos aquí Glibc para eliminar este parche.

Una segunda razón para reinstalar Glibc de nuevo es para poder considerarla límpia. La primera Glibc se instaló usando programas compilados en tu sistema anfitrión que, en ocasiones, tienen el efecto de corromper Glibc. Mientras que este no es un problema con los otros programas compilados anteriormente en este capítulo, para Glibc queremos asegurarnos de que es 100% correcta (de todas formas, eres libre de reinstalar otros paquetes en este punto para poder decir que has compilado un sistema LFS con LFS. Algo similar al metodo de instalación de autocompilación (bootstrap) de GCC.

También instalaremos aquí las páginas de manual de linuxthreads. Como puedes recordar, no fué posible hacerlo durante la primera instalación de Glibc debido a que aún no estaba instalado Perl. Ahora que todo lo que necesitamos para instalar las páginas de manual de linuxthreads está presente, las instalaremos también.

Antes de instalar Glibc, debes entrar al directorio glibc-2.3.1 y desempaquetar glibc-linuxthreads dentro del directorio glibc-2.3.1, no en /usr/src como normalmente harías.

Se sabe que este programa se comporta mal si cambias sus parámetros de optimización (incluyendo las opciones -march y -mcpu). Por tanto, si tienes definida cualquier variable de entorno que pueda sobreescribir las optimizaciones por defecto, como CFLAGS y CXXFLAGS, te recomendamos que las desactives o modifiques antes de construir Glibc.

Básicamente, compilar Glibc de forma diferente a como el libro sugiere pone tu sistema en grave riesgo.

La documentación sobre la instalación de Glibc recomienda construir Gluibc fuera del árbol de las fuentes. Crea el directorio de construcción:

mkdir ../glibc-build &&
cd ../glibc-build

A continuación, prepara Glibc para su compilación:

../glibc-2.3.1/configure --prefix=/usr --disable-profile \
    --enable-add-ons --libexecdir=/usr/bin

Continúa compilando el paquete:

make

Inicia la instalación del paquete:

make install

Construye las páginas de manual de linuxthreads:

make -C ../glibc-2.3.1/linuxthreads/man

Instala las páginas de manual:

make -C ../glibc-2.3.1/linuxthreads/man install

Completa la instalación del paquete recargando bash:

exec /bin/bash --login


Instalación de LFS-Bootscripts-1.11

Estimación del tiempo de construcción:       0.01 SBU
Estimación del espacio necesario en disco:  252 KB

Instalación de LFS-Bootscripts

Nosotros usamos guiones de inicio al estilo SysV. Lo hemos elegido porque es ampliamente usado y nos sentimos cómodos con él. Si quieres probar alguna otra cosa, Marc Heerdink ha escrito una receta sobre los guiones de arranque al estilo BSD, que puedes encontrar en http://www.escomposlinux.org/lfs-es/recetas/bsd-init.html (la versión original se encuentra en http://hints.linuxfromscratch.org/hints/bsd-init.txt).

Si decides usar el estilo BSD o cualquier otro estilo de guiones, puedes saltarte el Capítulo 7 e ir directamente al Capítulo 8.

Instala los guiones de arranque:

cp -a rc.d sysconfig /etc

Asignale a root la propiedad de los guiones:

chown -R root:root /etc/rc.d /etc/sysconfig


Configuración de los componentes del sistema

Ahora que están todos los paquetes instalados, lo que necesitamos hacer son algunas tareas de configuración.


Capítulo 7. Preparando los guiones de arranque


¿Cómo hacen estos guiones que funcione el proceso de arranque?

Linux utiliza como sistema de inicio SysVinit, que se basa en el concepto de niveles de ejecución. Este sistema de inicio puede variar ampliamente de un sistema a otro, por lo tanto, no se debe asumir que porque las cosas funcionen en <inserte el nombre de una distribución> tengan que funcionar en LFS también. LFS tiene su propia manera de hacer las cosas, la cual suele respetar los estándares aceptados.

SysVinit (al que llamaremos init a partir de este momento) se basa en un esquema de niveles de ejecución. Hay 7 (desde el 0 al 6) niveles de ejecución (en realidad, existen más pero son para casos especiales y es raro utilizarlos. Puedes leer la página man de init para obtener más información), y cada uno de ellos indica lo que debe hacer el sistema durante el arranque. El nivel de ejecución por omisión es el 3. He aquí una breve descripción de los distintos niveles de ejecución como suelen implementarse:

 0: parada del sistema
 1: modo monousuario
 2: modo multiusuario sin red
 3: modo multiusuario con red
 4: reservado para personalizar, si no, hace lo mismo que el 3
 5: Igual que el 4. Normalmente se utiliza para iniciar el entorno
     gráfico (como xdm de X o kdm de KDE)
 6: reinicio del sistema

Para cambiar el nivel de ejecución se utiliza el comando init <nivel de ejecución> donde <nivel de ejecución> representa el nivel de ejecución que deseemos arrancar. Por ejemplo, para reiniciar el sistema se utilizaría el comando init 6. El comando reboot no es más que un alias de dicho comando, al igual que el comando halt lo es de init 0.

Debajo de /etc/rc.d existe una serie de directorios rc?.d, donde ? representa el número del nivel de ejecución, más el directorio rcsysinit.d, que contienen un conjunto de enlaces simbólicos. Los nombres de estos enlaces simbólicos empiezan con K o con S seguidos de 2 cifras. Los enlaces que comienzan por una K indican la parada (kill) de un servicio, mientras que la S indica su inicio (start). Las dos cifras determinan el orden de ejecución, desde 00 hasta 99; cuanto menor sea el número antes se ejecutará. En el momento que se desee cambiar de nivel se pararán los servicios del nivel actual, para iniciar los del nuevo nivel.

Los enlaces simbólicos apuntan a los guiones situados en el directorio /etc/rc.d/init.d, que son los que realmente se ejecutan. Tanto los enlaces de parada como los de inicio apuntan al mismo guión. Esto se debe a que se pueden ejecutar usando parámetros como start, stop, restart, reload o status. Cuando se encuentra un enlace que comienza por K se ejecuta el guión con el parámetro stop. Y cuando comienza por S, con el parámetro start.

Hay una excepción. Los enlaces que comienzan por S en los directorios rc0.d y rc6.d no inician nada. Todos estos guiones se ejecutan con el parámetro stop para parar algo. Es evidente que cuando quieres apagar o reiniciar el sistema, no quieres ejecutar nada, sólo quieres pararlo.

He aquí una descripción de lo que hace cada parámetro:

Por supuesto, puedes modificar el proceso de inicio para adecuarlo a tus necesidades (después de todo es tu sistema LFS). Lo aquí expuesto es tan sólo un ejemplo de cómo hacer las cosas de una manera correcta (claro que aunque a nosotros esta manera nos parezca bien, puede que tú la odies).


Configuración del guión network

Esta sección solamente es aplicable en el caso de que vayas a configurar una tarjeta de red.

Si no tienes tarjeta de red es muy probable que no vayas a crear ninguna configuración relacionada con ellas. En ese caso, debes eliminar los enlaces simbólicos a network de todos los directorios de los niveles de ejecución (/etc/rc.d/rc*.d)


Capítulo 8. Hacer el sistema LFS arrancable


Instalación de Linux-2.4.20

Estimación del tiempo de construcción:      Todas las opciones por defecto: 4.20 SBU
Estimación del espacio necesario en disco:  Todas las opciones por defecto: 181 MB

Instalación del núcleo

Construir el núcleo comprende dos pasos: configurarlo y compilarlo. Hay varias maneras de configurar el núcleo. Si no te gusta la que utiliza este libro, lee el fichero README que acompaña al árbol de código fuente del núcleo, y busca qué otras opciones existen.

Prepara la compilación ejecutando el siguiente comando:

make mrproper

Esto asegura que las fuentes del núcleo están completamente limpias. El equipo del núcleo recomienda que se ejecute este comando antes de cada compilación del núcleo. No debes confiar en que el árbol de las fuentes esté limpio despues de desempaquetarlo.

Configura el núcleo mediente una interfaz de menús:

make menuconfig

Puede que make oldconfig sea mejor elección en algunas situaciones. Lee el fichero README para más detalles.

Si lo deseas, puedes saltarte la configuración del núcleo copiando el fichero de configuración del núcleo, .config, de tu sistema anfitrión al directorio $LFS/usr/src/linux-2.4.20.

Comprueba las dependencias y crea los ficheros de información de las dependencias:

make dep

Compila la imagen del núcleo:

make bzImage

Compila los controladores que han sido configurados como módulos:

make modules

Si intentas usar los módulos del núcleo necesitas el fichero /etc/modules.conf. La información relativa a los módulos, y a la configuración del núcleo en general, puedes encontrarla en la documentación del núcleo, que se guarda en /usr/src/linux-2.4.20/Documentation. La página de manual de modules.conf y el kernel-CÓMO en http://es.tldp.org/COMO-INSFLUG/COMOs/Kernel-Como/ (el original se encuentra en http://www.tldp.org/HOWTO/Kernel-HOWTO.html) puede que también sean de interes para ti.

Instala los módulos:

make modules_install

La compilación del núcleo ha terminado, pero algunos de los ficheros creados aún residen en el árbol de las fuentes. Para completar la instalación, dos ficheros deben copiarse al directorio /boot.

La ruta al fichero del núcleo puede variar dependiendo de la plataforma que utilices. Ejecuta el siguiente comando para instalar el núcleo:

cp arch/i386/boot/bzImage /boot/lfskernel

System.map es un fichero de símbolos para el núcleo. Mapea los puntos de entrada de las funciones de cada función en la API del núcleo, al igual que las direcciones de las estructuras de datos del núcleo para el núcleo en ejecución. Ejecuta el siguiente comando para instalar el fichero del mapa:

cp System.map /boot


Capítulo 9. El final


El final

¡Bien hecho! Has terminado de instalar tu sistema LFS. Puede que haya sido un proceso largo pero esperamos que haya merecido la pena. Te deseamos mucha diversión con tu flamante sistema Linux hecho a la medida.

Ahora podría ser un buen momento para quitar todos los símbolos de depurado de los archivos binarios de tu sistema LFS. Si no eres un programador y no planeas depurar tus programas, entonces te alegrará saber que puedes recuperar algunas decenas de megabytes borrando estos símbolos. Este proceso no produce ningún otro inconveniente que no sea no poder depurar los programas nunca más, lo que no es problema si no sabes cómo depurarlos.

Advertencia: El 98% de la gente que usa el comando mencionado más adelante no experimenta ningún problema. Pero haz una copia de seguridad de tu sistema LFS antes de ejecutar este comando. Hay una pequeña posibilidad de que te salga el tiro por la culata, y convierta tu sistema en inutilizable (principalmente destruyendo los módulos del núcleo y las librerías dinámicas y compartidas). Sin embargo, suele ocurrir más a menudo por un error tipográfico que por un problema con el comando utilizado.

Después de haber dicho esto, la opción --strip-debug que usaremos para quitar los símbolos de depuración es, bajo circunstancias normales, bastante inocua. No borrará nada vital de los ficheros. También es bastante seguro usar --strip-all con programas normales (no se debe usar en librerías -se destruirían), pero no es tan seguro como el anterior y el espacio que ganas no es tan grande. Pero si andas justo de espacio de disco, cada granito de arena ayuda, así que decide por ti mismo. Por favor, lee la página del manual (man) de strip para ver las opciones que puedes usar. La idea general es no ejecutar strip sobre librerías (usando otra opción que no sea --strip-debug) para asegurarnos de hacer la apuesta segura.

find $LFS/{,usr/,usr/local/}{bin,sbin,lib} -type f \
   -exec /usr/bin/strip --strip-debug '{}' ';'

Puede ser una buena idea crear el fichero $LFS/etc/lfs. Teniendo este fichero, te será muy fácil (y a nosotros, si es que vas a pedir ayuda en algún momento) saber qué versión de LFS tienes instalada en tu sistema. Crea el fichero $LFS/etc/lfs ejecutando el siguiente comando:

echo 4.1 > $LFS/etc/lfs


Registrarse

¿Quieres registrarte como usuario de LFS ahora que has terminado el libro? Visita http://linuxfromscratch.org/cgi-bin/lfscounter.cgi y regístrate como usuario de LFS introduciendo tu nombre y la primera versión de LFS que has usado.

Arranquemos el sistema LFS ahora...


Arranque del sistema

Ahora que se han instalado todos los programas , ya es hora de reiniciar el ordenador. Antes de reiniciar, desmontemos $LFS/proc y la partición LFS, ejecutando

umount $LFS/proc &&
umount $LFS

Si has decidido crear varias particiones, necesitas desmontar las otras particiones antes de desmontar $LFS, por ejemplo:

umount $LFS/proc &&
umount $LFS/usr &&
umount $LFS/home &&
umount $LFS

Y ahora puedes reiniciar el sistema ejecutando algo como:

/sbin/shutdown -r now

Asegúrate de indicar, en la línea de órdenes de LILO, que arranque lfs y no la entrada por defecto que haría arrancar de nuevo tu sistema original.

Una vez hayas reiniciado, tu sistema LFS está listo para su uso, y puedes empezar a añadir los programas que desees.

Una última cosa que puede que quieras hacer es ejecutar lilo, ahora que ya estás dentro del sistema LFS. De esta forma, pondrás en el MBR la versión de LILO del sistema LFS, en lugar de la que hay allí en este momento, que es la de tu sistema original. Dependiendo de cómo sea de antigua tu distribución original, la versión del sistema LFS puede tener más características avanzadas que necesites/puedas usar.

De cualquier forma, ejecuta lo siguiente para activar la versión de lilo instalada en el sistema LFS:

/sbin/lilo

Ahora puedes eliminar el directorio static. Si piensas que puedes necesitar rehacer el Capítulo 5, entonces querrás guardar una copia de respaldo del directorio antes de eliminarlo. Para eliminar el directorio static, escribe el siguiente comando:

rm -rf /static


Y ahora, ¿qué?

Te agradecemos que hayas leido el Libro LFS y esperamos que lo hayas encontrado útil y te recompense el tiempo empleado.

Ahora que has terminado de instalar tu sistema LFS, puede que te preguntes "Y ahora, ¿qué?". Para responder esta cuestión, te hemos preparado una lista de recursos.


Apéndice A. Descripción de paquetes y dependencias


Introducción

En este apéndice se describen los siguiente aspectos de cada paquete instalado en este libro.

Mucha de la información sobre estos paquetes (especialmente, su descripción) se ha extraído de las páginas del manual de esos paquetes. No incluimos las páginas del manual completas, sólo los elementos clave que hagan posible entender lo que cada programa hace. Para conseguir información detallada de un programa, dirijete a su página de manual o a su página info.

Ciertos paquetes están documentados con mayor profundidad que otros, sencillamente porque sabemos más sobre unos que sobre otros. Si algo debería ser añadido a las siguientes descripciones, por favor no dudes en comunicarlo en las listas de correo. Intentamos que la lista contenga una descripción detallada de cada paquete, pero no podemos hacerlo sin ayuda.

Ten en cuenta que actualmente sólo está descrito lo que hace un paquete , y no lo que necesita que esté instalado. Esto se añadirá más adelante.

También están listadas todas las dependencias para la instalación de todos los paquetes instalados en el libro. La lista incluye qué programas de qué paquetes son necesarios para compilar correctamente el paquete a instalar.

Estas no son las dependencias necesarias para su ejecución, por lo tanto no te ayudarán para saber qué programas son necesarios para usar los programas del paquete. Son solamente las dependencias necesarias para compilarlo.

La lista de dependencias puede estar en ocasiones anticuada con respecto a la versión del paquete usada actualmente. Comprobar las dependencias es un trabajo pesado por lo que puede haber un desfase en la actualización de los paquetes. Pero, normalmente, en la actualización de versiones menores del paquete, las dependencias de instalación no cambian, por lo que son actuales en muchos casos. Cuando actualizamos a una versión mayor, nos aseguramos de hacer también un chequeo de las dependencias.


Autoconf


Descripciones

Última versión comprobada: 2.53.


Descripción de los programas


Automake


Descripciones

Última versión comprobada: 1.6.2.


Descripción de los programas


Bash


Binutils


Descripciones

Última versión comprobada: 2.12.1.


Descripción de los programas


Bison


Descripciones

Última versión comprobada: 1.35.


Descripción de los programas

bison

bison es un generador de analizadores sintácticos, un sustituto de yacc ("Yet Another Compiler Compiler", Otro Compilador de Compiladores). Entonces, ¿qué es bison? Es un programa que genera un programa que analiza la estructura de un fichero de texto. En lugar de escribir el programa, el usuario especifica qué cosas deben ser conectadas y con esas reglas se genera un programa que analiza el fichero de texto. Hay muchos ejemplos en los que se necesita esta estructura y uno de ellos es la calculadora.

Tomando la cadena :

        1 + 2 * 3

Una persona puede fácilmente saber que el resultado es 7. ¿Por qué? Porque al ver la estructura nuestro cerebro sabe como interpretar la cadena. La computadora no sabe eso y bison es una herramienta que le ayuda a interpretarla presentando la cadena de la siguiente forma al compilador:

            +
           / \
          *   1
         / \
        2   3

Comenzando por la base del árbol y subiendo por los números 2 y 3, que están unidos por el símbolo de la multiplicación, la computadora multiplica 2 y 3. Almacena el resultado de la multiplicación y, lo siguiente que ve, es el resultado de 2*3 y el número 1 unido con el símbolo de la suma. Añadiendo 1 al resultado previo se obtiene 7. El cálculo de formulas más complejas puede hacerse pasándolas a este formato de árbol. El ordenador comienza justo por la base y sigue trabajando hacia arriba hasta alcanzar el resultado correcto. Por supuesto, bison no se usa sólo en calculadoras.


Bzip2


E2fsprogs


Descripciones

Última versión comprobada: 1.27.


Descripción de los programas


Fileutils


Descripciones

Última versión comprobada: 4.1.


Descripción de los programas


Findutils


Descripciones

Última versión comprobada: 4.1.


Descripción de los programas


GCC


Descripciones

Última versión comprobada: 3.1.


Descripción de los programas


Gettext


Descripciones

Última versión comprobada: 0.11.2.


Descripción de los programas


Glibc


Descripciones

Última versión comprobada: 2.2.5.


Descripción de los programas


Descripción de las librerías


Groff


Descripciones

Última versión comprobada: 1.17.2.


Descripción de los programas


Gzip


Kbd


Descripciones

Última versión comprobada: 1.06.


Descripción de los programas


LFS-Bootscripts


Descripciones

Última versión comprobada: 1.11.


Descripción de los guiones


Linux (el núcleo)


M4


Man


Modutils


Ncurses


Descripciones

Última versión comprobada: 5.2.


Descripción de los programas


Net-tools


Patch


Perl


Descripciones

Última versión comprobada: 5.6.1.


Descripción de los programas


Procps


Descripciones

Última versión comprobada: 2.0.7.


Shadow


Descripciones

Última versión comprobada: 4.0.3.


Descripción de los programas


Sh-utils


Descripciones

Última versión comprobada: 2.0.


Descripción de los programas


Sysvinit


Descripciones

Última versión comprobada: 2.84.


Descripción de los programas


Texinfo


Textutils


Descripciones

Última versión comprobada: 2.0.


Descripción de los programas


Util-linux


Descripciones

Última versión comprobada: 2.11t.


Descripción de los programas


Vim


Contenido de Vim

Última versión comprobada: 6.1.


Descripción de los programas