4. Primera Fase: Instalación del Sistema
Lo que vamos a explicar más adelante es mi
fase_1.sh
. Tendrá que modificarlo
en varios sitios para que cuadre con su propia idea del
“sistema perfecto”. He intentado incluír
todos los comentarios posibles en los sitios donde debería
usted introducir sus cambios. Los puntos a estudiar son:
Esquema de particiones.
No estoy de acuerdo con la idea de una sola
partición inmensa en la que instalar todo el
sistema. Mis sistemas tienen generalmente al menos
una partición para
/
,
/usr
y
/var
con
/tmp
enlazado simbólicamente a
/var/tmp
.
Además comparto los sistemas de ficheros en los que
ubico
/home
(los directorios de los usuarios),
/home/ncvs
(réplica del repositorio
de FreeBSD,
/usr/ports
(el árbol de ports),
/src
(diversos árboles de fuentes de
procedencias varias) y
/share
(otros datos compartidos que no
necesitan ser guardados, por ejemplo mensajes de
“news”.
“Lujos”.
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 shells/zsh
puesto
que es la shell que aparece en mi cuenta de usuario en
/etc/passwd
. De todos modos la tarea puede culminarse
sin esos “lujos” (de ahí su nombre), todo lo
que necesita es entrar en el sistema como root y pasar a la
siguiente fase.
?Por qué no instalar entonces todos mis ports
en la primera fase?: en teoría y en la práctica
nos encontraremos con problemas de arranque y de consistencia:
durante la primera fase tendrá funcionando su viejo kernel
mientras el entorno “chroot” 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 “scripts” de configuración
podrían intentar usarla y en concuencia ver “
muertos” sus procesos al tratar de ejecutarse en el viejo
kernel. He tenido problemas de otro tipo al intentar
construír lang/perl5
.
Antes de ejecutar fase_1.sh
asegúrese
de haber cumplido con las tareas previas a un
make installworld installkernel
, es decir:
haber adaptado el fichero de configuración de su
kernel
haber completado sin errores
make buildworld
haber completado sin errores
KERNCONF=
nombre_de_su_kernel
Cuando ejecute fase_1.sh
por primera vez
y copie sus ficheros de configuración de su sistema en
funcionamiento a su nuevo sistema no están al día
con respecto a lo que hay bajo
/usr/src
, así que
mergemaster
le preguntará 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álogos de mergemaster
puede
simplemente actualizar sus ficheros una vez en el sistema
original (pero sólo si existe esa opció:
por ejemplo, si uno de sus sistemas usa -STABLE
y
el otro -CURRENT
los cambios tienen bastantes
probabilidades de ser incompatibles). En posteriores usos
de mergemaster
detectará que los ID de
las versiones RCS de esos ficheros coinciden con los que están
bajo /usr/src
y no les prestará más
atención.
El “script” fase_1.sh
detendrá su ejecución si falla alguno de los
comandos que contiene (si alguno da una salida distinta de
cero) por incluír set -e
, así
que es imposible que pase por alto algún error. Antes
de seguir adelante debería asegurarse de que no hay errores
en su versión de
fase_1.sh
.
En fase_1.sh
invocamos
mergemaster
. Tanto si alguno de los ficheros
requiere ser combinado como si no, mergemaster
emitirá el siguiente mensaje
*** Comparison complete
Do you wish to delete what is left of /var/tmp/temproot.fase1? [no] no
es decir
*** Comparación completada
?Quiere borrar el contenido de /var/tmp/temproot.fase1? [no] no
Por favor, responda no
o simplemente pulse
Enter. Eso es debido a que
mergemaster
habrá dejado unos cuantos ficheros
de longitud igual a cero en
/var/tmp/temproot.fase1
y los copiará al nuevo
sistema (a menos que ya estén ahí).
Después mostrará los ficheros que ha instalado
mediante more(1) o si lo prefiere mediante less(1)):
*** 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)
es decir
*** Ha elegido la opción de instalar automáticamente
los ficheros que no existen en su sistema. Han sido instalados los
siguientes:
/rootnuevo/etc/defaults/rc.conf
...
/rootnuevo/COPYRIGHT
Teclée q para salir del
paginador. Ahora se le informará sobre
login.conf
:
*** 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]
es decir
*** Ha instalado un fichero login.conf así que
asegúrese de ejecutar '/usr/bin/cap_mkdb /rootnuevo/etc/login.conf'
para reconstruír la base de datos de login.conf
?Quiere ejecutarlo ahora mismo? (s)i o (n)o [n]
La respuesta no tiene importancia puesto que ejecutaremos
cap_mkdb(1) en todos los casos.
Todo lo que hace fase_1.sh
queda registrado
en un fichero “log” para que pueda examinarse con
detalle si es preciso.
Éste es el fase_1.sh
del autor,
así que tendrá que modificarlo a conciencia,
en especial los pasos 1, 2, 5 y 6.
Aviso:
Por favor, ponga una atención esmerada a las
entradas en las que aparece newfs(8). Si bien
es cierto que es imposible crear nuevos sistemas de archivos en
particiones montadas nuestro “script” no tendrá
ningún inconveniente en borrar cualquier partición
que no esté montada y con los nombres que aparezcan en
él, en nuestro caso
/dev/da3s1a
, /dev/vinum/var_a
y /dev/vinum/usr_a
. Puede provocar un desastre,
así que asegúrese de cambiar los nombres de los
dispositivos como corresponda.
#!/bin/sh
#
# fase_1.sh - FreeBSD From Scratch, Primera Fase: Instalación del Sistema.
# Uso: ./fase_1.sh
#
# $FreeBSD: release/9.2.0/es_ES.ISO8859-1/articles/fbsd-from-scratch/fase_1.sh 38826 2012-05-17 19:12:14Z hrs $
set -x -e
PATH=/bin:/usr/bin:/sbin:/usr/sbin
# Requisitos:
#
# a) Haber completado sin errores "make buildworld" y "make buildkernel"
# b) Particiones sin usar (al menos una para el sistema de ficheros raíz,
# probablemente más para los nuevos /usr y /var, a gusto de cada uno.)
# El punto montaje de la raíz bajo la que va usted a crear el sistema nuevo.
# Sólo va a usarse como punto de montaje; que no se usará espacio en él
# puesto que todos los ficheros serán depositados en el o los sistemas
# de ficheros que están efectivamente montados.
DESTDIR=/rootnuevo
SRC=/usr/src # Aquí está su árbol de fuentes.
# ---------------------------------------------------------------------------- #
# Primer Paso: Creación de un árbol de directorios vacío bajo $DESTDIR.
# ---------------------------------------------------------------------------- #
step_one () {
# El nuevo raíz del sistema de ficheros. Obligatorio.
# Cambie los nombres de dispositivo (DEV_*) para hacerlos acordes con
# sus necesidades o el "script" le
# estallará en la cara.
DEV_ROOT=/dev/da3s1a
mkdir -p ${DESTDIR}
newfs ${DEV_ROOT}
tunefs -n enable ${DEV_ROOT}
mount -o noatime ${DEV_ROOT} ${DESTDIR}
# Sistemas de ficheros extra y sus correspondientes puntos de montaje.
# Opcional.
DEV_VAR=/dev/vinum/var_a
newfs ${DEV_VAR}
tunefs -n enable ${DEV_VAR}
mkdir -m 755 ${DESTDIR}/var
mount -o noatime ${DEV_VAR} ${DESTDIR}/var
DEV_USR=/dev/vinum/usr_a
newfs ${DEV_USR}
tunefs -n enable ${DEV_USR}
mkdir -m 755 ${DESTDIR}/usr
mount -o noatime ${DEV_USR} ${DESTDIR}/usr
mkdir -m 755 -p ${DESTDIR}/usr/ports
mount /dev/vinum/ports ${DESTDIR}/usr/ports
# Aquí crearemos los demás directorios. Obligatorio.
cd ${SRC}/etc; make distrib-dirs DESTDIR=${DESTDIR}
# Personalmente me gusta enlazar tmp a var/tmp. Opcional.
cd ${DESTDIR}; rmdir tmp; ln -s var/tmp
}
# ---------------------------------------------------------------------------- #
# Segundo Paso: Poblamos el árbol de directorios /etc que está vacío aún y
# ubicamos unos cuantos ficheros en /.
# ---------------------------------------------------------------------------- #
step_two () {
# Añada o borre de ésta lista según su criterio. La mayoría son obligatorios.
for f in \
/.profile \
/etc/group \
/etc/hosts \
/etc/inetd.conf \
/etc/ipfw.conf \
/etc/make.conf \
/etc/master.passwd \
/etc/nsswitch.conf \
/etc/ntp.conf \
/etc/printcap \
/etc/profile \
/etc/rc.conf \
/etc/resolv.conf \
/etc/start_if.xl0 \
/etc/ttys \
/etc/ppp/* \
/etc/mail/aliases \
/etc/mail/aliases.db \
/etc/mail/hal9000.mc \
/etc/mail/service.switch \
/etc/ssh/*key* \
/etc/ssh/*_config \
/etc/X11/XF86Config-4 \
/boot/splash.bmp \
/boot/loader.conf \
/boot/device.hints ; do
cp -p ${f} ${DESTDIR}${f}
done
# Borre el temproot que haya creado mergemasger. Si lo ha creado.
TEMPROOT=/var/tmp/temproot.fase1
if test -d ${TEMPROOT}; then
chflags -R 0 ${TEMPROOT}
rm -rf ${TEMPROOT}
fi
mergemaster -i -m ${SRC}/etc -t ${TEMPROOT} -D ${DESTDIR}
cap_mkdb ${DESTDIR}/etc/login.conf
pwd_mkdb -d ${DESTDIR}/etc -p ${DESTDIR}/etc/master.passwd
# Mergemaster no crea ficheros vacíos por ejemplo en /var/log. Lo haremos
# aquí pero sin sobreescribir (y destruír) ficheros copiados en el bucle
# de más arriba.
cd ${TEMPROOT}
find . -type f | sed 's,^\./,,' |
while read f; do
if test -r ${DESTDIR}/${f}; then
echo "${DESTDIR}/${f} ya existe; no copiado"
else
echo "Creando ${DESTDIR}/${f} vacío"
cp -p ${f} ${DESTDIR}/${f}
fi
done
chflags -R 0 ${TEMPROOT}
rm -rf ${TEMPROOT}
}
# ---------------------------------------------------------------------------- #
# Tercer Paso: Instalando el mundo (install world).
# ---------------------------------------------------------------------------- #
step_three () {
cd ${SRC}
make installworld DESTDIR=${DESTDIR}
}
# ---------------------------------------------------------------------------- #
# Cuarto Paso: Instalación del kernel y los módulos.
# ---------------------------------------------------------------------------- #
step_four () {
cd ${SRC}
# loader.conf y device.hints son necesarios para installkernel.
# Si en el segundo paso no los ha copiado hágalo tal y como se muestra en
# las dos líneas siguientes.
# cp sys/boot/forth/loader.conf ${DESTDIR}/boot/defaults
# cp sys/i386/conf/GENERIC.hints ${DESTDIR}/boot/device.hints
make installkernel DESTDIR=${DESTDIR} KERNCONF=NOMBRE_DE_SU_KERNEL
}
# ---------------------------------------------------------------------------- #
# Quinto Paso: Instalación y modificación de algunos ficheros clave.
# ---------------------------------------------------------------------------- #
step_five () {
# Creamos /etc/fstab; obligatorio. Modifíquelo para que coincida con sus
# dispositivos.
cat <<EOF >${DESTDIR}/etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/da3s1b none swap sw 0 0
/dev/da4s2b none swap sw 0 0
/dev/da3s1a / ufs rw 1 1
/dev/da1s2a /src ufs rw 0 2
/dev/da2s2f /share ufs rw 0 2
/dev/vinum/var_a /var ufs rw 0 2
/dev/vinum/usr_a /usr ufs rw 0 2
/dev/vinum/home /home ufs rw 0 2
/dev/vinum/ncvs /home/ncvs ufs rw,noatime 0 2
/dev/vinum/ports /usr/ports ufs rw,noatime 0 2
#
/dev/cd0 /dvd cd9660 ro,noauto 0 0
/dev/cd1 /cdrom cd9660 ro,noauto 0 0
proc /proc procfs rw 0 0
EOF
# Más directorios; opcional.
mkdir -m 755 -p ${DESTDIR}/src; chown root:wheel ${DESTDIR}/src
mkdir -m 755 -p ${DESTDIR}/share; chown root:wheel ${DESTDIR}/share
mkdir -m 755 -p ${DESTDIR}/dvd; chown root:wheel ${DESTDIR}/dvd
mkdir -m 755 -p ${DESTDIR}/home; chown root:wheel ${DESTDIR}/home
mkdir -m 755 -p ${DESTDIR}/usr/ports; chown root:wheel ${DESTDIR}/usr/ports
# Configuración de la zona horaria; no es obligatorio pero casi.
cp ${DESTDIR}/usr/share/zoneinfo/Antarctica/South_Pole ${DESTDIR}/etc/localtime
if test -r /etc/wall_cmos_clock; then
cp -p /etc/wall_cmos_clock ${DESTDIR}/etc/wall_cmos_clock
fi
}
# ---------------------------------------------------------------------------- #
# Sexto Paso: Lo que considero importante tener cuando accedo a un sistema
# nuevo por primera vez.
# NOTA: No instale demasiados binarios en éste paso. Con el sistema viejo
# en funcionamiento y los nuevos binarios y ficheros de cabecera instalados
# es casi seguro tener problemas de bootstrap. Los "ports" deberían compilarse
# después de haber arrancado el nuevo sistema.
# ---------------------------------------------------------------------------- #
step_six () {
chroot ${DESTDIR} sh -c "cd /usr/ports/shells/zsh; make clean install clean"
chroot ${DESTDIR} sh -c "cd /etc/mail; make install" # configuración
# de sendmail
# Si no enlazamos simbólicamente compat los ficheros de linux_base
# irán a parar al sistema de ficheros raíz.
cd ${DESTDIR}; mkdir -m 755 usr/compat
chown root:wheel usr/compat; ln -s usr/compat
mkdir -m 755 usr/compat/linux
mkdir -m 755 boot/grub
# Creación de los directorios "spool" para las impresoras que hay en
# mi /etc/printcap
cd ${DESTDIR}/var/spool/output/lpd; mkdir -p as od ev te lp da
touch ${DESTDIR}/var/log/lpd-errs
# Más ficheros que quiero heredar del sistema antíguo.
for f in \
/var/cron/tabs/root \
/var/mail/* \
/boot/grub/*; do
cp -p ${f} ${DESTDIR}${f}
done
# Si no tiene /home en una partición compartida es un buen momento para
# copiarlo al sitio correcto.
# mkdir -p ${DESTDIR}/home
# cd /home; tar cf - . | (cd ${DESTDIR}/home; tar xpvf -)
# Como novedad en FreeBSD 5.x perl está en /usr/local/bin pero la
# mayoría de "scripts" esperan encontrarlo en /usr/bin/perl y así lo
# reflejan en su primera línea; use un enlace simbólico para que funcionen.
cd ${DESTDIR}/usr/bin; ln -s ../local/bin/perl
cd ${DESTDIR}/usr; rmdir src; ln -s ../src/current src
}
do_steps () {
step_one
step_two
step_three
step_four
step_five
step_six
}
do_steps 2>&1 | tee fase_1.log
# EOF $RCSfile: fase_1.sh,v $ vim: tabstop=2:expandtab:
Descargue fase_1.sh
.
La ejecución de éste “script” instala
un sistema equipado con lo siguiente:
Usuarios y grupos heredados del anterior sistema.
Acceso a Internet mediante Ethernet y PPP protegido por
un cortafuegos.
NTP y zona horaria correctas.
Algunos ficheros secundarios como
/etc/ttys
e
inetd
.
Hay otras áreas listas para ser configuradas pero
no las tocaremos hasta concluír la segunda fase. Por ejemplo,
hemos copiado unos cuantos ficheros para configurar la impresión
y X11. Sin embargo la impresión suele necesitar de aplicaciones
que no se encuentran en el sistema base, por ejemplo PostScript. X11
no funcionará hasta que no compilemos el servidor, las
bibliotecas y los programas.