doc/es_ES.ISO8859-1/articles/fbsd-from-scratch/article.sgml
J. Vicente Carrasco e13f73ad67 -Add articles.ent and books.ent for easier handling of entity
sets.

Approved by: jesusr (mentor)

-MFen:
2007-11-08 21:49:11 +00:00

721 lines
33 KiB
Text
Raw Blame History

<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
<!ENTITY % articles.ent PUBLIC "-//FreeBSD//ENTITIES DocBook FreeBSD Articles Entity Set//ES">
%articles.ent;
<!ENTITY scratch.ap "<application>FreeBSD From Scratch</application>">
]>
<article>
<articleinfo>
<title>FreeBSD From Scratch</title>
<author>
<firstname>Jens</firstname>
<surname>Schweikhardt</surname>
<affiliation>
<address><email>schweikh@FreeBSD.org</email></address>
</affiliation>
</author>
<copyright>
<year>2002</year>
<holder>Jens Schweikhardt</holder>
</copyright>
<pubdate>$FreeBSD$</pubdate>
</articleinfo>
<abstract>
<para>&scratch.ap; explica la instalaci&oacute;n totalmente automatizada
de un sistema &os; hecho a medida y compilado desde las fuentes,
proceso que incluye adem&aacute;s la compilaci&oacute;n de sus
<quote>ports</quote> favoritos y configurado para coincidir con
su idea del sistema perfecto. Si cree que
<command>make world</command> es un concepto fascinante
&scratch.ap; lo ampl&iacute;a hasta ser
<command>make evenmore</command>. N. del T. : Juego de palabras
intraducible basado en el nombre que en &os; se da al proceso de
recompilar todo el sistema desde los fuentes, <command>make world</command>,
que podr&iacute;a traducirse muy libremente como <quote>hacer, o m&aacute;s bien rehacer el
mundo entero</quote> y <command>make evenmore</command>, osea, <quote>hacer m&aacute;s
a&uacute;n</quote>. </para>
&trans.es.carvay;
</abstract>
<sect1 id="introduction">
<title>Introducci&oacute;n</title>
<para>&iquest;Ha actualizado alguna vez su sistema mediante
<command>make world</command>?. Si solamente tiene un sistema
en sus discos se encontrar&aacute; con un problema. Si
<maketarget>installworld</maketarget> falla a la mitad
su sistema quedar&aacute; da&ntilde;ado e incluso
puede ser incapaz de arrancar de nuevo. O quiz&aacute;s
<maketarget>installworld</maketarget> se ha ejecutado sin problemas
pero el nuevo kernel no arranca. Se impone buscar el CD de
Rescate y tratar de encontrar algo &uacute;til en aquellos
<quote>backups</quote> que hizo hace seis meses.</para>
<para>Creo en el paradigma de <quote>al actualizar sistemas operativos
instala desde cero</quote>. Haci&eacute;ndolo as&iacute;, esto es,
al borrar sobreescribiendo en los discos o mejor dicho las particiones,
nos aseguraremos de no dejar datos antiguos en ellos, un aspecto
&eacute;ste del que la mayor&iacute;a de los procesos de
actualizaci&oacute;n no se preocupan en absoluto.
Por otra parte borrar las particiones significa
que tendr&aacute; que recompilar/reinstalar todos sus
<quote>ports</quote> y <quote>packages</quote> y despu&eacute;s de eso
rehacer todas y cada una de las configuraciones que con muchos esfuerzos
atesoraba. Si usted tambi&eacute;n piensa que &eacute;sta tarea
deber&iacute;a automatizarse siga leyendo.</para>
</sect1>
<sect1 id="why">
<title>&iquest;Por qu&eacute; (no) deber&iacute;a interesarme
&scratch.ap;?</title>
<para>Esa es una pregunta muy razonable. Tenemos
<application>sysinstall</application>, una compilaci&oacute;n
del kernel que funciona sin sorpresas y tenemos tambi&eacute;n
las herramientas de entorno de usuario.</para>
<para>El problema que tiene <application>sysinstall</application>
es que est&aacute; extremadamente limitado cuando se trata de
qu&eacute;, d&oacute;nde y c&oacute;mo queremos que haga la
instalaci&oacute;n.</para>
<itemizedlist>
<listitem>
<para>Normalmente se usa para instalar distribuciones precompiladas
y <quote>packages</quote> desde diversas fuentes (CD, DVD,
FTP). No puede instalar el resultado de
<literal>make buildworld</literal>.</para>
</listitem>
<listitem>
<para>No puede instalar un segundo sistema en un directorio
de un sistema en funcionamiento.</para>
</listitem>
<listitem>
<para>No puede hacer una instalaci&oacute;n en particiones
<application>Vinum</application>.</para>
</listitem>
<listitem>
<para>No puede compilar <quote>ports</quote>, s&oacute;lo
instala <quote>packages</quote> precompilados.</para>
</listitem>
<listitem>
<para>Es dif&iacute;cil automatizar mediante
<quote>scripts</quote> o incluso hacer de forma manual
los cambios que considere
necesarios despu&eacute;s de la instalaci&oacute;n</para>
</listitem>
<listitem>
<para>Por si todo esto fuera poco
<application>sysinstall</application>
est&aacute; semioficialmente al final de su
<quote>Ciclo de Vida &Uacute;til</quote>.</para>
</listitem>
</itemizedlist>
<para>El archiconocido proceso de <quote>constru&iacute;r/instalar
el mundo</quote> (<quote>build/install world</quote>), explicado en
<ulink url="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/makeworld.html">el
Handbook</ulink>, por defecto realiza la tarea de sustitu&iacute;r el
sistema existente. S&oacute;lo respeta el kernel y los
m&oacute;dulos. Los binarios del sistema, los ficheros de
cabecera y muchos otros ficheros son sobreescritos; hay ficheros
obsoletos que se quedan donde estaban y pueden causar
sorpresas. Si el proceso de actualizaci&oacute;n falla por alguna
raz&oacute;n puede ser dif&iacute;cil o incluso imposible volver a
dejar el sistema en el estado inicial.</para>
<para>&scratch.ap; resuelve todos esos problemas. La estrategia es
simple: utiliza un sistema en funcionamiento para instalar un nuevo
sistema en un &aacute;rbol de directorios y montar nuevas particiones
limpiamente en ese &aacute;rbol. Muchos ficheros de
configuraci&oacute;n pueden copiarse al sitio que les corresponda y
&man.mergemaster.8; se encargar&aacute; de aquellos a los que
no. Pueden hacerse cambios discrecionales tras la
instalaci&oacute;n del nuevo sistema desde el viejo,
como si el nuevo sistema estuviera dentro de un
<quote>chroot</quote>. El proceso tiene tres fases,
cada una de los cuales consiste en ejecutar un
<quote>script de shell</quote> o invocar
<command>make</command>:</para>
<orderedlist>
<listitem>
<para><filename>fase_1.sh</filename>:
Crea un sistema nuevo y capaz de arrancar en un directorio
vac&iacute;o y combina o copia tantos ficheros como sea
necesario. Una vez acabado esto arranca el nuevo sistema.</para>
</listitem>
<listitem>
<para><filename>fase_2.sh</filename>:
Instala los <quote>ports</quote> que hayamos elegido.</para>
</listitem>
<listitem>
<para><filename>fase_3.mk</filename>:
Remata la configuraci&oacute;n del software instalado en la
fase anterior.</para>
</listitem>
</orderedlist>
<para>Una vez que ha usado &scratch.ap; para constru&iacute;r un
segundo sistema y ha comprobado que funciona satisfactoriamente
durante unas cuantas semanas puede usarlo de nuevo para reinstalar
el sistema original. Desde ese momento cada vez que crea que
debe actualizar un sistema simplemente elija las particiones que
hay que borrar y reinstalar.</para>
<para>Puede que haya o&iacute;do hablar o incluso haya usado ya
<ulink
url="http://www.linuxfromscratch.org/">Linux From Scratch</ulink>,
LFS para ser m&aacute;s breve. LFS abarca tambi&eacute;n c&oacute;mo
constru&iacute;r e instalar un sistema desde cero en particiones
vac&iacute;as partiendo de un sistema en funcionamiento. El
objetivo de LFS parece ser mostrar la raz&oacute;n de ser y de estar
de todas y cada una de las partes del sistema (como el kernel,
el compilador, los dispositivos, la shell, la base de datos de
terminales, etc.) y los detalles de la instalaci&oacute;n de cada
parte. &scratch.ap; no entra en detalles tan exahustivos. Mi
intenci&oacute;n es facilitar una instalaci&oacute;n automatizada y
completa, no explicar cada detalle escabroso del cicl&oacute;peo
proceso que arrancamos cuando hacemos un
<command>make world</command>. Si desea usted explorar &os; de
modo tan profundo comience por leer
<filename>/usr/src/Makefile</filename> y siga cuidadosamente lo
que sucede al teclear
<command>make buildworld</command>.</para>
<para>Hay tambi&eacute;n algunos detalles delicados con los que
me encontr&eacute; durante el desarrollo de &scratch.ap; que
deber&iacute;a tener muy en cuenta.</para>
<!-- XXX: Ser<65>a una buena idea escribir el fase_2.sh usando un
"jail" situada en el sistema nuevo instalado en la primera
fase. Si disponemos de una direcci<63>n de red bien configurada
como IP primaria de esa "jail" podr<64>a ser posible incluso
compilar "ports" en un "chroot" sin desinstalar nada del
sistema anfitri<72>n. No obstante tenga en cuenta que incluso
las "jail" est<73>n ejecutando el kernel anfitri<72>n.-->
<itemizedlist>
<listitem>
<para>El sistema no puede ser usado normalmente
durante la compilaci&oacute;n de los <quote>ports</quote>
que tiene lugar en la segunda fase. Si va a ejecutar
el proceso en un servidor en producci&oacute;n tenga en cuenta
el tiempo de parada provocado por la fase dos. Los
<quote>ports</quote> compilados por
<filename>fase_2.sh</filename> necesitan aproximadamente 4 horas
para acabar en un sistema SCSI AMD1800+ con discos de 10.000 rpm
y 1GB de RAM.</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 id="prerequisites">
<title>Requisitos previos</title>
<para>Para poder usar &scratch.ap;
necesitar&aacute; lo siguiente:</para>
<itemizedlist>
<listitem>
<para>Un sistema &os; con el &aacute;rbol de <quote>ports</quote> y
los fuentes instalados.</para>
</listitem>
<listitem>
<para>Al menos una partici&oacute;n vac&iacute;a donde instalaremos
el nuevo sistema.</para>
</listitem>
<listitem>
<para>Experiencia en el uso de &man.mergemaster.8; o al menos no
tener miedo de usarlo.</para>
</listitem>
<listitem>
<para>Si su acceso a Internet es lento o si no dispone del mismo
necesitar&aacute; los <quote>distfiles</quote> de los ports que
vaya a instalar.</para>
</listitem>
<listitem>
<para>Conocimientos b&aacute;sicos de confecci&oacute;n de
<quote>scripts</quote> de shell con la shell Bourne,
&man.sh.1;</para>
</listitem>
<listitem>
<para>Finalmente, deber&iacute;a ser capaz de decirle a su
<quote>boot loader</quote> (cargador de arranque) c&oacute;mo arrancar el nuevo
sistema, en modo interactivo o mediante un fichero de
configuraci&oacute;n.</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 id="stage1">
<title>Primera Fase: Instalaci&oacute;n del Sistema</title>
<para>Lo que vamos a explicar m&aacute;s adelante es mi
<filename>fase_1.sh</filename>. Tendr&aacute; que modificarlo
en varios sitios para que cuadre con su propia idea del
<quote>sistema perfecto</quote>. He intentado inclu&iacute;r
todos los comentarios posibles en los sitios donde deber&iacute;a
usted introducir sus cambios. Los puntos a estudiar son:</para>
<itemizedlist>
<listitem>
<para>Esquema de particiones.</para>
<para>No estoy de acuerdo con la idea de una sola
partici&oacute;n inmensa en la que instalar todo el
sistema. Mis sistemas tienen generalmente al menos
una partici&oacute;n para
<filename>/</filename>,
<filename>/usr</filename> y
<filename>/var</filename> con
<filename>/tmp</filename> enlazado simb&oacute;licamente a
<filename>/var/tmp</filename>.
Adem&aacute;s comparto los sistemas de ficheros en los que
ubico
<filename>/home</filename> (los directorios de los usuarios),
<filename>/home/ncvs</filename> (r&eacute;plica del repositorio
de &os;,
<filename>/usr/ports</filename> (el &aacute;rbol de ports),
<filename>/src</filename> (diversos &aacute;rboles de fuentes de
procedencias varias) y
<filename>/share</filename> (otros datos compartidos que no
necesitan ser guardados, por ejemplo mensajes de
<quote>news</quote>.</para>
</listitem>
<listitem>
<para><quote>Lujos</quote>.</para>
<para>Me refiero a lo que usaremos inmediatamente tras el arranque
del nuevo sistema e incluso antes de la segunda fase. En mi caso
se trata de <filename
role="package">shells/zsh</filename> puesto
que es la shell que aparece en mi cuenta de usuario en <filename>
/etc/passwd</filename>. De todos modos la tarea puede culminarse
sin esos <quote>lujos</quote> (de ah&iacute; su nombre), todo lo
que necesita es entrar en el sistema como root y pasar a la
siguiente fase.</para>
<para>&iquest;Por qu&eacute; no instalar entonces todos mis ports
en la primera fase?: en teor&iacute;a y en la pr&aacute;ctica
nos encontraremos con problemas de arranque y de consistencia:
durante la primera fase tendr&aacute; funcionando su viejo kernel
mientras el entorno <quote>chroot</quote> dispone de sus propios
binarios y ficheros de cabecera todos nuevos. Si por ejemplo el
sistema nuevo integra una nueva llamada al sistema (conforme a sus
cabeceras) algunos <quote>scripts</quote> de configuraci&oacute;n
podr&iacute;an intentar usarla y en concuencia ver <quote>
muertos</quote> sus procesos al tratar de ejecutarse en el viejo
kernel. He tenido problemas de otro tipo al intentar
constru&iacute;r <filename
role="package">lang/perl5</filename>.</para>
</listitem>
</itemizedlist>
<para>Antes de ejecutar <filename>fase_1.sh</filename> aseg&uacute;rese
de haber cumplido con las tareas previas a un
<command>make installworld installkernel</command>, es decir:</para>
<itemizedlist>
<listitem>
<para>haber adaptado el fichero de configuraci&oacute;n de su
kernel</para>
</listitem>
<listitem>
<para>haber completado sin errores <command>
make buildworld</command></para>
</listitem>
<listitem>
<para>haber completado sin errores<command>
KERNCONF=<replaceable>
nombre_de_su_kernel</replaceable></command></para>
</listitem>
</itemizedlist>
<para>Cuando ejecute <filename>fase_1.sh</filename> por primera vez
y copie sus ficheros de configuraci&oacute;n de su sistema en
funcionamiento a su nuevo sistema no est&aacute;n al d&iacute;a
con respecto a lo que hay bajo
<filename>/usr/src</filename>, as&iacute; que <command>
mergemaster</command> le preguntar&aacute; por lo que quiere
hacer. Le recomiendo combinar los cambios. (Nota del traductor:
merge (to): unir, fusionar, mezclar). Si se cansa de pelear con
los di&aacute;logos de <command>mergemaster</command> puede
simplemente actualizar sus ficheros una vez en el sistema <emphasis>
original</emphasis> (pero s&oacute;lo si existe esa opci&oacute;:
por ejemplo, si uno de sus sistemas usa <literal>-STABLE</literal> y
el otro <literal>-CURRENT</literal> los cambios tienen bastantes
probabilidades de ser incompatibles). En posteriores usos
de <command>mergemaster</command> detectar&aacute; que los ID de
las versiones RCS de esos ficheros coinciden con los que est&aacute;n
bajo <filename>/usr/src</filename> y no les prestar&aacute; m&aacute;s
atenci&oacute;n.</para>
<para>El <quote>script</quote> <filename>fase_1.sh</filename>
detendr&aacute; su ejecuci&oacute;n si falla alguno de los
comandos que contiene (si alguno da una salida distinta de
cero) por inclu&iacute;r <command>set -e</command>, as&iacute;
que es imposible que pase por alto alg&uacute;n error. Antes
de seguir adelante deber&iacute;a asegurarse de que no hay errores
en su versi&oacute;n de
<filename>fase_1.sh</filename>.</para>
<para>En <filename>fase_1.sh</filename> invocamos
<command>mergemaster</command>. Tanto si alguno de los ficheros
requiere ser combinado como si no, <command>mergemaster</command>
emitir&aacute; el siguiente mensaje</para>
<screen>*** Comparison complete
Do you wish to delete what is left of /var/tmp/temproot.fase1? [no] <userinput>no</userinput></screen>
<para>es decir</para>
<screen>*** Comparaci&oacute;n completada
&iquest;Quiere borrar el contenido de /var/tmp/temproot.fase1? [no] <userinput>no</userinput></screen>
<para>Por favor, responda <literal>no</literal> o simplemente pulse
<keycap>Enter</keycap>. Eso es debido a que <command>
mergemaster</command> habr&aacute; dejado unos cuantos ficheros
de longitud igual a cero en <filename>
/var/tmp/temproot.fase1</filename> y los copiar&aacute; al nuevo
sistema (a menos que ya est&eacute;n ah&iacute;).</para>
<para>Despu&eacute;s mostrar&aacute; los ficheros que ha instalado
mediante &man.more.1; o si lo prefiere mediante &man.less.1;):</para>
<screen>*** You chose the automatic install option for files that did not
exist on your system. The following were installed for you:
/rootnuevo/etc/defaults/rc.conf
...
/rootnuevo/COPYRIGHT
(END)</screen>
<para>es decir</para>
<screen>*** Ha elegido la opci&oacute;n de instalar autom&aacute;ticamente
los ficheros que no existen en su sistema. Han sido instalados los
siguientes:
/rootnuevo/etc/defaults/rc.conf
...
/rootnuevo/COPYRIGHT
</screen>
<para>Tecl&eacute;e <keycap>q</keycap> para salir del
paginador. Ahora se le informar&aacute; sobre <filename>
login.conf</filename>:</para>
<screen>*** You installed a login.conf file, so make sure that you run
'/usr/bin/cap_mkdb /newroot/etc/login.conf'
to rebuild your login.conf database
Would you like to run it now? y or n [n]</screen>
<para>es decir</para>
<screen>*** Ha instalado un fichero login.conf as&iacute; que
aseg&uacute;rese de ejecutar '/usr/bin/cap_mkdb /rootnuevo/etc/login.conf'
para reconstru&iacute;r la base de datos de login.conf
&iquest;Quiere ejecutarlo ahora mismo? (s)i o (n)o [n]</screen>
<para>La respuesta no tiene importancia puesto que ejecutaremos
&man.cap.mkdb.1; en todos los casos.</para>
<para>Todo lo que hace <filename>fase_1.sh</filename> queda registrado
en un fichero <quote>log</quote> para que pueda examinarse con
detalle si es preciso.</para>
<para>&Eacute;ste es el <filename>fase_1.sh</filename> del autor,
as&iacute; que tendr&aacute; que modificarlo a conciencia,
en especial los pasos 1, 2, 5 y 6.</para>
<warning>
<para>Por favor, ponga una atenci&oacute;n esmerada a las
entradas en las que aparece &man.newfs.8;. Si bien
es cierto que es imposible crear nuevos sistemas de archivos en
particiones montadas nuestro <quote>script</quote> no tendr&aacute;
ning&uacute;n inconveniente en borrar cualquier partici&oacute;n
que no est&eacute; montada y con los nombres que aparezcan en
&eacute;l, en nuestro caso
<filename>/dev/da3s1a</filename>, <filename>/dev/vinum/var_a</filename>
y <filename>/dev/vinum/usr_a</filename>. Puede provocar un desastre,
as&iacute; que aseg&uacute;rese de cambiar los nombres de los
dispositivos como corresponda.</para>
</warning>
<programlisting><inlinegraphic fileref="fase_1.sh" format="linespecific"></programlisting>
<para>Descargue <ulink
url="fase_1.sh"><filename>fase_1.sh</filename></ulink>.</para>
<para>La ejecuci&oacute;n de &eacute;ste <quote>script</quote> instala
un sistema equipado con lo siguiente:</para>
<itemizedlist>
<listitem>
<para>Usuarios y grupos heredados del anterior sistema.</para>
</listitem>
<listitem>
<para>Acceso a Internet mediante Ethernet y PPP protegido por
un cortafuegos.</para>
</listitem>
<listitem>
<para>NTP y zona horaria correctas.</para>
</listitem>
<listitem>
<para>Algunos ficheros secundarios como
<filename>/etc/ttys</filename> e
<command>inetd</command>.</para>
</listitem>
</itemizedlist>
<para>Hay otras &aacute;reas listas para ser configuradas pero
no las tocaremos hasta conclu&iacute;r la segunda fase. Por ejemplo,
hemos copiado unos cuantos ficheros para configurar la impresi&oacute;n
y X11. Sin embargo la impresi&oacute;n suele necesitar de aplicaciones
que no se encuentran en el sistema base, por ejemplo PostScript. X11
no funcionar&aacute; hasta que no compilemos el servidor, las
bibliotecas y los programas.</para>
</sect1>
<sect1 id="stage2">
<title>Segunda Fase: Instalaci&oacute;n de <quote>
ports</quote></title>
<note>
<para>En &eacute;sta fase es posible instalar <quote>packages</quote>
(que vienen precompilados) en lugar de compilar <quote>
ports</quote>. Para poder hacerlo convertiremos <filename>
fase_2.sh</filename> en poco m&aacute;s que una lista de
comandos <command>pkg_add</command>. Conf&iacute;o en que
ser&aacute; usted capaz de escribir un <quote>script</quote>
como ese. Ahora nos concentraremos en el sistema tradicional
y mucho m&aacute;s flexible de funcionamiento de los
<quote>ports</quote>.</para>
</note>
<para>El siguiente <quote>script</quote> <filename>
fase_2.sh</filename> es el que yo uso para instalar mis <quote>
ports</quote> favoritos. Puede ejecutarse tantas veces como sea
preciso y no prestar&aacute; atenci&oacute;n a los <quote>
ports</quote> que ya est&eacute;n instalados. Incluye tambi&eacute;n
soporte para la
opci&oacute;n <option>-n</option> que hace un <emphasis>ensayo
general con todo</emphasis>, es decir, muestra lo que hubiera sucedido
si se hubiera ejecutado. Seguro que tiene que editar la lista de
<quote>ports</quote> y probablemente tenga que cambiar unas cuantas
variables de entorno.</para>
<para>La lista de <quote>ports</quote> consiste en l&iacute;neas
de dos o m&aacute;s palabras separadas por espacios: la categor&iacute;a
y el <quote>port</quote>. Es opcional situar detr&aacute;s
un comando de instalaci&oacute;n que compilar&aacute; e instalar&aacute;
el <quote>port</quote> (por defecto <command>make install</command>).
Se ignoran las l&iacute;neas vac&iacute;s y las que comienzan
por #. La mayor&iacute;a de las veces es suficiente inclu&iacute;r el
nombre del <quote>port</quote> y la categor&iacute;a a que pertenece pero
existen unos pocos <quote>ports</quote> en cuya compilaci&oacute;n
podemos afinar mucho asignando valores a variables de <command>
make</command>; veamos un ejemplo:</para>
<programlisting>www mozilla make WITHOUT_MAILNEWS=yes WITHOUT_CHATZILLA=yes install
mail procmail make BATCH=yes install</programlisting>
<para>De hecho puede usted usar comandos de <quote>shell</quote> a
su criterio, as&iacute; que no tiene que limitarse a simples
invocaciones de <command>make</command>:</para>
<programlisting>java linux-sun-jdk13 yes | make install
news inn-stable CONFIGURE_ARGS="--enable-uucp-rnews --enable-setgid-inews" make install</programlisting>
<para>Observe que la l&iacute;nea de <filename
role="package">news/inn-stable</filename> es un ejemplo de una
asignaci&oacute;n de entrada a la variable del int&eacute;rprete de
mandatos <literal>CONFIGURE_ARGS</literal>. El fichero <filename>Makefile</filename>
del <quote>port</quote> la usar&aacute; como valor inicial y la
completar&aacute; con otros argumentos esenciales. La diferencia respecto a
a especificar la variable para <filename>make</filename> en la l&iacute;nea de
comandos mediante </para>
<programlisting>news inn-stable make CONFIGURE_ARGS="--enable-uucp-rnews --enable-setgid-inews" install</programlisting>
<para>est&aacute; en que esto &uacute;ltimo sustituye directamente el valor
en lugar de completarlo. El m&eacute;todo m&aacute;s adecuado depende de cada
<quote>port</quote> en particular.</para>
<para>Compruebe cuidadosamente que ninguno de sus <quote>ports</quote>
tenga una instalaci&oacute;n interactiva, es decir, que ninguno
deber&iacute; intentar recibir de stdin nada que no le d&eacute;
usted en stdin. Si alguno lo hace leer&aacute; la siguiente o
siguientes l&iacute;neas de &eacute;ste documento y no entender&aacute;
nada de nada. Si <filename>fase_2.sh</filename> pasa por alto
un <quote>port</quote> o cesa su ejecuci&oacute;n sin raz&oacute;n
aparente es muy posible que esa sea la raz&oacute;n.</para>
<para>He aqu&iacute; <filename>fase_2.sh</filename>. Crea un fichero
<quote>log</quote> por cada port que instala y les da nombres
seg&uacute;n el esquema <filename>
DIRECTORIO_LOG/categor&iacute;a+port</filename>. Si no tiene una
copia de su <filename>fase_2.sh</filename> en una partici&oacute;n
compartida no olvide copiarlo al sistema nuevo antes de
arrancarlo.</para>
<programlisting><inlinegraphic fileref="fase_2.sh" format="linespecific"></programlisting>
<para>Descargue <ulink
url="fase_2.sh"><filename>fase_2.sh</filename></ulink>.</para>
</sect1>
<sect1 id="stage3">
<title>Tercera Fase</title>
<para>Ya hemos conclu&iacute;do la segunda fase y ya est&aacute;n
instalados sus querid&iacute;simos <quote>ports</quote>, pero
algunos de ellos requieren un poco de configuraci&oacute;n. En
eso consistir&aacute; la tercera fase, a&ntilde;adir los
detalles espec&iacute;ficos de las configuraciones. Podr&iacute;a
haberlos integrado en el <quote>script</quote> <filename>
fase_2.sh</filename> pero creo que hay una diferencia conceptual
entre instalar un <quote>port</quote> y en modificar la
configuraci&oacute;n con la que viene por defecto para adaptarla
a nuestros gustos o necesidades y creo por lo tanto que esa
diferencia justifica una separaci&oacute;n en una fase
propia.</para>
<para>He cre&iacute;do m&aacute;s conveniente implementar la
tercera fase como un <filename>Makefile</filename> porque
admiten la selecci&oacute;n de lo que quiera configurar
tecleando simplemente:
<informalexample>
<screen>&prompt.root; <userinput>make -f fase_3.mk <replaceable>
nombre_del_port</replaceable></userinput></screen>
</informalexample>
<para>Al igual que con <filename>fase_2.sh</filename> aseg&uacute;rese
de que dispone de una copia de su <filename>fase_3.mk</filename> una
vez que arranca el sistema nuevo, bien situ&aacute;ndolo en una
partici&oacute;n compartida bien copi&aacute;ndolo en alg&uacute;n
lugar dentro del nuevo sistema.</para>
<programlisting><inlinegraphic fileref="fase_3.mk" format="linespecific"></programlisting>
<para>Descargue <ulink
url="fase_3.mk"><filename>fase_3.mk</filename></ulink>.</para>
</sect1>
<sect1 id="limitations">
<title>Restricciones</title>
<para>La instalaci&oacute;n automatizada de un <quote>port</quote>
puede resultar dif&iacute;cil si es interactiva y no soporta
<command>make BATCH=YES install</command>. En algunos casos
la interacci&oacute;n se reduce a teclear <literal>yes</literal>
cuando se le pregunta si acepta alguna licencia. Si esa entrada de
datos ha de llegar por la entrada est&aacute;ndar simplemente
redirigiremos las respuestas pertinentes a la orden de
instalaci&oacute;n (que suele ser <command>make install</command>;
ese es el modo en el que hemos procedido con <filename
role="package">java/linux-sun-jdk13</filename> en
<filename>fase_2.sh</filename>).</para>
<para>No obstante &eacute;sta estrategia no funciona con <filename
role="package">editors/staroffice52</filename>, que exige que X11
est&eacute; funcionando. El proceso de instalaci&oacute;n comprende
un buen n&uacute;mero de pulsaciones de rat&oacute;n y de tecleo,
con lo que es imposible automatizarlo tal y como se hace con otros
<quote>ports</quote>. Sin embargo el siguiente atajo workaround
nos soluciona el problema: previamente he creado un <filename>
staroffice</filename> en el sistema original con</para>
<informalexample>
<screen>&prompt.root; <userinput>cd /usr/ports/editors/staroffice52</userinput>
&prompt.root; <userinput>make package</userinput>
===> Building package for staroffice-5.2_1
Creating package /usr/ports/editors/staroffice52/staroffice-5.2_1.tbz
Registering depends:.
Creating bzip'd tar ball in '/usr/ports/editors/staroffice52/staroffice-5.2_1.tbz'</screen>
</informalexample>
<para>y durante la segunda fase usamos:</para>
<informalexample>
<screen>&prompt.root; <userinput>pkg_add /usr/ports/editors/staroffice52/staroffice-5.2_1.tbz</userinput></screen>
</informalexample>
<para>Debe usted tambi&eacute;n tener muy en cuenta posibles
problemas con los ficheros de configuraci&oacute;n a la hora de
actualizar. En general no sabemos cu&aacute;ndo van a hacerse cambios
en el formato o el contenido de un fichero de configuraci&oacute;n.
Es posible que haya que a&ntilde;adir un nuevo grupo a <filename>
/etc/group</filename>, o quiz&aacute;s <filename>/etc/passwd</filename>
necesite un nuevo campo en sus entradas. &Eacute;stas cosas han
sucedido en alguna ocasi&oacute;n anteriormente. Si simplemente
copiamos un fichero de configuraci&oacute;n del sistema viejo al nuevo
ser&aacute; suficiente la mayor&iacute;a de la veces pero ya hemos
visto dos casos en los que no lo era. Si actualiza su sistema siguiendo
el sistema ortodoxo (sobreescribiendo los ficheros ant&iacute;guos)
tendr&aacute; que usar <command>mergemaster</command> para proceder
con los cambios que quiera inclu&iacute;r en
la configuraci&oacute;n de su nuevo sistema, teniendo en cuenta que
entre esos cambios hay o puede haber nuevos ficheros. Por desgracia
<command>mergemaster</command> s&oacute;lo es &uacute;til con ficheros
del sistema base y no para aquellos relacionados con los <quote>
ports</quote>. Adem&aacute;s, ciertas aplicaciones parecen
especialmente dise&ntilde;adas para sacarme de mis casillas por el
procedimiento de cambiar el fichero de configuraci&oacute;n cada quince
d&iacute;as. Lo &uacute;nico que puede hacerse es estar alerta,
sobre todo cuando cambia el n&uacute;mero de versi&oacute;n.
En ocasiones anteriores he tenido que modificar o reescribir
ficheros para servidores web, servidores y clientes de <quote>news</quote>.
Cualquier tipo de software cuyo mantenimiento sea muy activo es un firme
candidato a que sus ficheros de configuraci&oacute;n merezcan nuestro
examen.</para>
<para>He usado &scratch.ap; varias veces para actualizar un sistema
<literal>5-CURRENT</literal> a <literal>5-CURRENT</literal>, esto es,
nunca he intentado instalar <literal>5-CURRENT</literal> desde un
sistema <literal>4-STABLE</literal> o viceversa, pero dada la
cantidad de cambios existentes entre las diferentes <quote>
RELEASE</quote> no ser&iacute;a insensato esperar que esa tarea
sea un tanto compleja. Usar &scratch.ap; para actualizaciones
dentro del campo de <literal>4-STABLE</literal> deber&iacute;a
ser mucho menos penoso (aunque yo a&uacute;n no lo he
intentado). Si quiere hacerlo deber&iacute;a tener en cuenta
lo siguiente:</para>
<itemizedlist>
<listitem>
<para>Si no usa el sistema de ficheros de dispositivo
(<literal>devfs</literal>) puede necesitar crear los
dispositivos necesarios para su hardware con &man.MAKEDEV.8;
en la primera fase, sexto paso.</para>
</listitem>
</itemizedlist>
</sect1>
</article>