wiki:PruebasNBDRoot

Version 1 (modified by adelcastillo, 14 years ago) (diff)

--

Concepto

ESTADO ALFA

El sistema actual se basa en un initrd vitaminado que consigue tener un sistema lo suficientemente bueno como para poder ejecutar OpenGnSys. Para conseguir poder añadir más programas y configuraciones al initrd se consigue montando un directorio por NFS.

Problemas:

  • No hay un método de instalación bueno para estos clientes en un servidor.
  • NFS tiene problemas para soportar varios clientes.
  • El initrd tiene poca flexibilidad.

Estas pruebas se realizan suponiendo (y por tanto no demostrado):

  • El cambio de initrd a root no tiene porque dar una duración excesiva, y una vez tomado el root tomado el control poder modificar el init para que no pierda más tiempo.
  • NBD permite mejorar los tiempos de NFS.

Para ello usamos:

  • Debootstrap para generar el cliente base completo de Ubuntu para posteriormente mejorarlo.
  • NBD-server para poner al servicio del cliente generado por debootstrap para su arranque.

Estado actual de una posible instalación

Dependencias nuevas:

sudo apt-get install debootstrap nbd-server

Generación del cliente:

mkdir -p /tmp/nbdroot
cd /tmp/nbdroot
dd if=/dev/zero of=nbdroot.img bs=1M count=1024
mkfs.xfs nbdroot.img
mkdir mnt
mount nbdroot.img mnt -o loop
debootstrap --arch i386 lucid mnt

Esto crea un cliente básico. Ahora es cuando podemos hacerle todas las modificaciones necesarias al cliente para prepararlo de OpenGnSys. Por ejemplo instalarle todas los paquetes deb OpenGnSys. Como se observará es mucho más fácil de instalar cosas nuevas que en el actual sistema y además es muchísimo más flexible. Ya hemos eliminado dos de los inconvenientes que hablamos al principio. Seguimos:

sudo chroot mnt
# Ahora estamos dentro de la jaula
passwd # Por si una vez arrancado queremos probar algo ponemos contraseña al root
apt-get install nbd-client linux-image # Instalamos el kernel image y le añadimos soporte de nbd-client
# Nos preguntará si queremos que cuando pare el servicio de nbd-client pare todas las unidades. Le decimos que no!!
exit

Ya hemos instalado lo necesario que no instala el debootstrap básico ¡¡en ARCHLINUX!! Esto podría variar con Ubuntu. En ArchLinux? otras distribuciones Ubuntu como karmic el cliente es muchísimo más básico y no tiene instalado nada de sistema de ficheros. Se comenta más abajo. Ficheros que hay que copiar para el pxelinux son el mnt/initrd.img mnt/vmlinuz. Además otros cambios necesarios son:

echo Lucid > mnt/etc/hostname
echo 127.0.0.1 localhost.localdomain localhost >> mnt/etc/hosts

mnt/etc/network/intefaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface, commented out for NFS root
#auto eth0
#iface eth0 inet dhcp
iface eth0 inet manual

mnt/etc/fstab

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
none            /tmp            tmpfs   defaults        0       0
none            /var/run        tmpfs   defaults        0       0
none            /var/lock       tmpfs   defaults        0       0
none            /var/tmp        tmpfs   defaults        0       0

Con esto tenemos un sistema que una vez arrancado funciona perfectamente. Para terminar como un comando para servir la imagen (¡¡RECORDAR DESMONTAR LA IMAGEN!!) (también se puede hacer modificando su fichero de configuración y haciendo /etc/init.d/nbd-server restart) y los argumentos para pxelinux para arrancar:

sudo umount mnt
nbd-server -c 2345 /tmp/nbdroot/nbdroot.img

PXELinux

kernel vmlinuz
append initrd=initrd.img nbdsrv=192.168.2.2 nbdport=2345 nbdroot=192.168.2.2,2345 root=/dev/nbd0 ip=192.168.2.3::192.168.2.2:255.255.255.0::eth0: rootdelay=1

Resultados

De servidor un Atom y de arranque un ordenador portátil de la Universidad con procesador T2XXX, no muy potente, tarda en el arranque 10 segundos, sin contar el paso del kernel ni el de initrd.

TODO/Mejoras

  • El proceso init no se modifica, podriamos ganarle tiempo por ahí pero no mucho ya que tarda muy poco un segundo o así, y entre otras cosas pone el framebuffer al máxima resolución.
  • Un initrd más pequeño. Como se comenta antes el debootstrap de ArchLinux? mete muchas cosas por defecto entre ellos utilidades de sistema de ficheros o el bootsplash plymouth. Se podría hacer más pequeño. Mejoraría el paso del initrd, la descompresión y el arranque del initrd. Se podría hacer copiando en el chroot /usr/share/initramfs-tools/ en otro directorio prueba, eliminar todo lo innecesario y ejecutar mkinitramfs -C elotrodirectorio. Podría automatizarse con un paquete deb.
  • Hay que poner rootdelay=1 porque crea el /dev/nbd0 pero da un error diciendo que "/dev/nbd0 unknown partition table". Es como si el initrd que genera no este bien preparado para que arranque por nbd. En los scripts se observa que hay un delay si el root no está preparado. El tiempo por defecto es 30 segundos, cuando se sale de ese bucle continúa y arranca perfecto. Puede que cuando lucid salga estable se arregle o que haya que crear nuestro propio initrd como se dice en el punto anterior.
  • Paquetes deb de todo componente que vaya en el cliente.
  • Permitir dos root para arrancar siempre: sino esta disponible la cache que arranque por disco duro.
  • Crear bootsplash con plymouth.
  • Algo muy útil y curioso es que si el servidor nbd lo ejecutas con la opcion -c se le permite al cliente escribir en la imagen, pero el servidor lo escribe en un fichero distinto y cuando se desconecta el cliente borra el fichero dejando intacto el sistema. Creo que podría ralentizar pero es cuestión de probarlo.

No hace falta implementarlo todo, lo más necesario es crear paquetes deb de los componentes indispensables (engine, clientadmin, etc) para poder instalar y poco a poco intentar personalizar el arranque con más paquetes deb que modifiquen el init y que creen otros initrd.