Instalando FreeBSD desde la red (desde GNU/Linux)

Siguiendo mi post anterior de instalación de GNU/Linux desde la red, estube googleando por ahí para hacer lo mismo, pero instalar FreeBSD, usando GNU/Linux como servidor de “instalaciones”. La documentación existente sobre este es bastante confusa y solo funciona desde un FreeBSD como servidor de instalación.

Mi idea era tener en mi servidor de instalación (que es un GNU/Linux) la posibilidad de instalar FreeBSD. Para esta misión tenia que ver alguna compatibilidad con pxelinux, afortunadamente encontre googleando mucho un increible artículo que muestra como crear un imagen de disco duro (UFS) con todo lo necesario para bootear usando pxelinux + memdisk. La imagen generada en el artículo solo ejecuta el sysinstall, y desde ahí hay que hacer todo el proceso manualmente, como si tuviéramos un cdrom de FreeBSD ( y utilizando un método de instalación, se tratará mas tarde este punto).

A continuación esta el script que modifique, pueden usarlo bajo los términos de la licencia BSD. Este script tiene que ser ejecutado desde un FreeBSD, ya que el soporte de UFS para escritura en Linux es “dangerous”, y por defecto viene con soporte solo para lectura. Para habilitarlo hay que recompilar el kernel o buscar otra alternativa. Para hacer funcionar este en GNU/Linux hay que usar losetup en vez de mdconfig

#   FreeBSD PXE Image Creator
#   Copyleft crodas (http://cesar.la). all wrongs reserved
#
#   Basado en http://web.irtnog.org/doc/how-to/freebsd-install-pxe-wds.
#   Algunas mejoras
#       - Agrega el install.cfg al mfsroot.gz para instalaciones automaticas
#       - Copia los archivos necesarios desde el CD de FreeBSD
ISO=$1
LOG=pxebsd.log
if [ ! -d $ISO ] ;
then
echo "${ISO} no es un directorio valido"
exit
fi

FLP=$ISO/floppies
if [ ! -d $FLP ] ;
then
echo "${FLP} no es un directorio valido"
exit
fi

echo "Creando directorios temporales"
mkdir data
mkdir mnt
mkdir tmp

cp -r "$FLP/*" tmp

echo "Extrayendo boot.flp"
## extract contents of boot floppy
MD=`mdconfig -a -t vnode -f tmp/boot.flp`
mount /dev/${MD} mnt
cp -R "mnt/*" data
umount /dev/${MD}
mdconfig -d -u ${MD}

echo "Extrayendo el kernel"

i=1
while ([ -e "tmp/kern${i}.flp" ])
do
MD=`mdconfig -a -t vnode -f tmp/kern${i}.flp`
mount /dev/${MD} mnt
cp -R "mnt/*" data
umount /dev/${MD}
mdconfig -d -u ${MD}
i=`expr ${i} + 1`
done

echo "Juntando el  kernel"
cat data/kernel.gz.boot data/kernel.gz.?? > data/kernel.gz
rm data/kernel.gz.*

#
#
echo "Limpiando cosas innecesarias"
grep -v acpi_before data/boot/loader.conf > loader.conf.new
mv loader.conf.new data/boot/loader.conf

#
#
if [ -f $2  ] ;
then
echo "Agregando el  install.cfg"
gunzip data/mfsroot.gz
MD=`mdconfig -a -t vnode -f data/mfsroot`
mount /dev/${MD} mnt
cp $2 mnt/install.cfg
umount /dev/${MD}
mdconfig -d -u ${MD}
gzip -9 data/mfsroot
fi

#
#
echo "Calculando el tamaño"
FLPSIZ=`du -sk data | awk '{print $1}'`
FLPSIZ=`expr ${FLPSIZ} \* 1024`
IMGSIZ=0
i=0
while ([ ${FLPSIZ} -gt ${IMGSIZ} ])
do
i=`expr ${i} + 2`
IMGSIZ=`expr ${i} \* 16 \* 63 \* 512`
done
CYL=${i}
TRK=16                # heads per cylinder
SEC=63                # sectors per head
SECSIZ=512            # bytes per sector
NUMFILES=`find data | wc -l`
NUMINODS=`expr ${FLPSIZ} \/ ${NUMFILES}`

#
#
#
echo "Creando la imagen PXE-boot"
dd if=/dev/zero of=pxeboot.img bs=${IMGSIZ} count=1 >> $LOG
MD=`mdconfig -a -t vnode -f pxeboot.img -y ${TRK} -x ${SEC} -S ${SECSIZ}`
fdisk -BIv /dev/${MD} >> $LOG 2>&1
disklabel -w -B /dev/${MD} auto >> $LOG
newfs -O1 -i ${NUMINODS} -b 4096 -f 512 -o space -m 0  /dev/${MD}a >> $LOG

mount /dev/${MD}a mnt

echo "Comprimiendo pxeboot.img"
cp -R "data/*" mnt
umount mnt
mdconfig -d -u ${MD}
gzip -9 -f pxeboot.img

echo "Limpiando directorios temporales"
rm -rf tmp data mnt

echo "Hecho"

Como usarlo:

$ DEV=`mdconfig -a -t vnode -f /path/to/freebsd.iso`
$ mount_cd9660 /dev/$DEV /mnt
$ cd ~; ./pxefbsd.sh /mnt install.cfg
$ umount /dev/$DEV
$ mdconfig -d -a $DEV

El archivo pxefbsd.sh recibe como primer parametro el directorio donde está montado el cdrom1 de FreeBSD, y el segundo parámetro es un archivo install.cfg que tiene toda la configuración de la instalación. Tambien se especifica de a donde instalar, en mi ejemplo se instala desde un directorio NFS, y se instala solo el kernel generic, base y manpages.

################################
# inicio
################################
debug=YES
nonInteractive=YES
noWarn=NO
tryDHCP=NO
#
bootManager=boot
diskInteractive=YES
diskPartitionEditor
diskInteractive=YES
diskLabelEditor
#
hostname=new-gw
domainname=somehost
#
nfs=192.168.1.1:/distros/FreeBSD/6.2-i386
tryDHCP=YES
mediaSetNFS
#
dists=base manpages GENERIC
distSetCustom
#
installCommit

Ahora solo debemos copiar el contenido del cdrom1 de freebsd a un directorio ( en el ejemplo /distros/) y compartirlo usando NFS.

mkdir -p /distro/FreeBSD/6.2-i386
mount /path/to/fbsd.iso /mnt -o loop
cp -r "/mnt/*" /distro/FreeBSD/6.2-i386
umount /mnt
echo "/distros 192.168.1.0/255.255.255.0 (ro)" >> /etc/exports
/etc/init.d/rpcbind restart
/etc/init.d/nfs restart
chkconfig rpcbind on
chkconfig nfs on

Luego de la ejecución del pxefbsd.sh, se genera un archivo “pxeboot.img.gz”, esta es la imagen booteable que tenemos que copiar a nuestro servidor de instalaciones. Luego editamos el archivo /tftpboot/pxelinux.cfg/default y agregamos algo similar, para eso ponemos memdisk (para ubicar ejecutar locate memdisk, necesita syslinux instalado ) con la imagen pxeboot.img.gz. Despues de esto ya podremos instalar FreeBSD desde la red!

label FreeBSD-6.2-i386
kernel /images/FreeBSD-6.2-i386/memdisk
append initrd=/images/FreeBSD-6.2-i386/pxeboot.img.gz harddisk noedd

Espero que les este artículo les haya sido de utilidad, cualquier duda no duden en dejar sus comentarios

2 Comments

  1. Roylan Suarez says:

    Hola

    Muy bueno este articulo pero tengo otra pregunta.

    Se puede hacer botear una imagen de XP?

    Salu2

  2. César Rodas says:

    La verdad que nunca intente hacer algo por el estilo, pero seguro que se puede, pero no hay una manera oficial de hacer eso.

Leave a Reply