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








Hola
Muy bueno este articulo pero tengo otra pregunta.
Se puede hacer botear una imagen de XP?
Salu2
La verdad que nunca intente hacer algo por el estilo, pero seguro que se puede, pero no hay una manera oficial de hacer eso.