sábado, junio 24, 2006

Creando una live de gentoo desde gentoo

Desde hace unos años queria hacer una live como servidor dedicado de juegos fps (campus de 2004) y como voy a volver este año a la campus me puse las pilas para ver que tipo de live podia hacer.

Buscando por la red encontre este wiki al que doy gracias a su creador y posteadores ya que este post es basicamente una traduccion obviando las cosas que no he utilizado en mi live y agregando alguna que he utilizado que no aparece en el wiki.

Captura del boot splash


Todos los paso comentados son para ejecutarse como root y el directorio elegido que contendra la livecd se ubicara en /root/livecd

Hay que tener en cuenta que segun las cosas que instalemos vamos a necesitar un minimo de 200 Gb (o mas) para compilar etc... asi que df -h para ver el espacio que hay en /root/

Requerimientos :
emerge -va squashfs-tools cdrtools qemu


Sitio de instalacion del original :
cd ~
mkdir -p ~/livecd/source


Cogiendo packetes basicos
# cd ~/livecd
wget [YOUR FAVORITE MIRROR]/releases/x86/current/stages/stage2-x86-2006.0.tar.bz2
wget [YOUR FAVORITE MIRROR]/snapshots/portage-latest.tar.bz2


Extrayendo el stage
cd ~/livecd/source
tar jxvpf ~/livecd/stage2-x86-2006.0.tar.bz2
mkdir newroot


Extrayendo el portage
cd ~/livecd/source/usr/
tar jxvf ~/livecd/portage-latest.tar.bz2


Preparandonos para hacer el chroot
cd ~/livecd/source
mkdir -p proc dev
mount -o bind /proc proc
mount -o bind /dev dev
mount -o bind /sys sys
mkdir usr/portage/distfiles
mount -o bind /usr/portage/distfiles usr/portage/distfiles
cp /etc/resolv.conf etc/resolv.conf


chroot al nuevo entorno
cd ~/livecd/source

Normalmente
chroot . /bin/bash --login

Pero si deseas generar una iso compatible con x86 desde 64 bits seria...
linux32 chroot . /bin/bash --login


Actualizacion del entorno
env-update
source /etc/profile


Obligatorioamente hay que bajarse el systema base
emerge -va system

Por si se ha actualizado algo durante el emerge system (por ejemplo gcc)
emerge -uva world

Yo siempre paso de hacerlo (no por que sea un machote sino por que soy un vago)

Editamos el mapa de caracteres del teclado (/etc/conf.d/keymaps)
Para el tipico español
KEYMAP="es"
SET_WINDOWKEYS="yes"


Muy importante editar el /etc/fstab para dejarlo como sigue
echo "" > /etc/fstab
echo "/dev/loop0 / squashfs ro,defaults 0 0" >> /etc/fstab
echo "none /proc proc defaults 0 0" >> /etc/fstab
echo "none /dev/shm tmpfs defaults 0 0" >> /etc/fstab
echo "none /dev/pts devpts defaults 0 0" >> /etc/fstab
echo "" >> /etc/fstab


Zona horaria de la peninsula iberica
ln -sf /usr/share/zoneinfo/Europe/Madrid /etc/localtime


Modificamos el resto de ficheros en /etc/ que te interese

Instalamos lo que te interese, algunos recomendados son :
emerge -va memtest86+ localepurge genkernel dhcpcd mingetty nano

No tan necesario pero recomendable es el coldplug y nada necesario ni recomendable pero super-chuli es el splashutils con algun tema que os apetedca, eso ya depende de cada uno

Emerge de juegos fps basados en el engine de quake3 (Esto es totalmente necesario :o)
USE="dedicated" emerge -va quake3 quake3-alliance quake3-alternatefire quake3-bfp quake3-brainworks quake3-cpma quake3-data quake3-defrag quake3-matrix quake3-nsco quake3-osp quake3-ra3 quake3-ruinhunters quake3-teamarena quake3-threewave quake3-tremulous quake3-truecombat quake3-urbanterror quake3-wop enemy-territory enemy-territory-etpro enemy-territory-fortress enemy-territory-truecombat


NOTA : localepurge es para limpiar de ficheros sobre configuracion de idioma que no usas el mingetty es para hacer autologin y las splashutils son para arrancar con el framebuffer superchuli que nos tiene acostumbrados las instalaciones de gentoo (es posible que tu lo supieras pero yo no :o)

Modificamos otra vez los /etc/ que nos interese

Actualizamos los servicios requeridos para el arranque red, gdm... depende de lo que os hayamos instalado
rc-update add net.eth0 default


Compilando el kernel genkernel forever
emerge gentoo-sources
genkernel all

Si queremos meterle el gensplash (splashutils)
genkernel --gensplash=[theme] all


Configurando grub
Borramos el link de menu.lst a grub.conf (los sistemas de archivo iso no admiten links) y editamos /boot/grub/grub.conf

Salvo excepciones lo podemos dejar algo parecido a esto
default 0
timeout 30
splashimage=(cd)/boot/grub/splash.xpm.gz

title=LiveCD
root (cd)
kernel (cd)/boot/kernel-genkernel-x86-2.6.16-gentoo-r9 vga=791 root=/dev/ram0 init=/linuxrc looptype=squashfs loop=/livecd.squashfs udev nodevfs cdroot dodmraid
initrd (cd)/boot/initramfs-genkernel-x86-2.6.16-gentoo-r9

title=LiveCD NO-FB
root (cd)
kernel (cd)/boot/kernel-genkernel-x86-2.6.16-gentoo-r9 root=/dev/ram0 init=/linuxrc looptype=squashfs loop=/livecd.squashfs udev nodevfs cdroot dodmraid
initrd (cd)/boot/initramfs-genkernel-x86-2.6.16-gentoo-r9

title=Memtest86+
root (cd)
kernel (cd)/boot/memtest86plus/memtest.bin


Si hemos utilizado gensplash, debemos añadir un par de parametros al kernel
splash=silent,theme:livecd-2006.0 CONSOLE=/dev/tty1 quiet

Asi que la linea de LiveCD del grubconf quedaria algo asin:
title=LiveCD
root (cd)
kernel (cd)/boot/kernel-genkernel-x86-2.6.16-gentoo-r9 vga=791 root=/dev/ram0 init=/linuxrc looptype=squashfs loop=/livecd.squashfs udev nodevfs cdroot dodmraid splash=silent,theme:livecd-2006.0 CONSOLE=/dev/tty1 quiet
initrd (cd)/boot/initramfs-genkernel-x86-2.6.16-gentoo-r9


Copiamos grub.conf como menu.lst
cp /boot/grub/grub.conf /boot/grub/menu.lst


Si utilizamos mingetty debemos editar el archivo /etc/inittab y reemplazar
c1:12345:respawn:/sbin/agetty 38400 tty1 linux

por
c1:12345:respawn:/sbin/mingetty --autologin root --noclear tty1


tambien editaremos el archivo /sbin/rc y reemplazar
if [ -f "/sbin/livecd-functions.sh" -a -n "${CDBOOT}" ]
then
  ebegin "Updating inittab"
  livecd_fix_inittab
  eend $?
  /sbin/telinit q &>/dev/null
fi

por
if [ -f "/sbin/livecd-functions.sh" -a -n "${CDBOOT}" ]
then
  ebegin "Updating inittab"
  /bin/true #livecd_fix_inittab
  eend $?
  /bin/true #/sbin/telinit q &>/dev/null
fi

si no lo utilizamos, deberiamos poner password al root al menos ejecutando passwd


Nos salimos del chroot con exit

Para generar la iso, ejecutamos el script 02 que he puesto al final que hace mas o menos esto:

Desmontar unidades y actualizar el entorno
cd ~/livecd/source
umount sys proc dev usr/portage/distfiles
env-update
source /etc/profile



Copiar la live a un directorio temporal para limpiarla
rm -rf ~/livecd/target
mkdir ~/livecd/target
cp -a ~/livecd/source/boot ~/livecd/target/
mkdir -p ~/livecd/target/files/source
rsync -a --delete --progress --exclude "var/cache/*" --exclude "usr/portage" --exclude "usr/share/doc" --exclude "usr/src" ~/livecd/source/ ~/livecd/target/files/source/
cd ~/livecd/target/files/source/
rm -rf var/tmp/*
rm -rf var/run/*
rm -rf var/lock/*
rm -rf var/cache/*
rm -rf var/db
rm -rf tmp/*
rm -f etc/mtab
touch etc/mtab
rm -rf var/log
mkdir var/log
mkdir var/lib/
mkdir var/lib/dhcpc
rm -rf usr/portage
rm -rf etc/portage
rm -rf usr/share/doc
rm -rf usr/src/
rm root/.bash_history



Crea el sistema de archivos squash y la iso
cd ~/livecd/target/files
time mksquashfs source/ ~/livecd/target/livecd.squashfs
touch ~/livecd/target/livecd
rm -rf ~/livecd/target/files
cd ~/livecd/

time mkisofs -R -udf -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -iso-level 3 -hide-rr-moved -c boot.catalog -o ~/livecd/livecd.iso ~/livecd/target/


Por ultimo, para probar el iso sin necesidad de hacer posavasos
cd ~/livecd/
nice -n 2 qemu -m 512 -cdrom livecd.iso


El -m 512 le dice al qemu que utilce hasta 512 Mb de memoria lo pongo por que al cambiar a la version con gensplash requeria mas que los 128 que te pone por defecto

Cada vez que queramos actualizar cosas o instalar nuevos paquetes he generado dos scripts que son mu sencillos de usar.

Ejecutas el 01-entrar-livecd.sh que te ejecuta los pasos hasta el chroot y ejecutas
env-update
source /etc/profile

(Esto se debe a que no se como continuar la ejecucion del script una vez hecho el chroot)

Haces lo que te venga en gana emerge -va world, emerge nuevos paquetes etc

Te sales del chroot con exit y por ultimo ejecutas el script 02-limpiar-y-crear-livecd.sh


Los dos scripts los pongo a continuacion

# 01-entrar-livecd.sh
# ===================
cd ~/livecd/source
mkdir -p proc dev
mount -o bind /proc proc
mount -o bind /dev dev
mount -o bind /sys sys
mount -o bind /usr/portage/distfiles usr/portage/distfiles
cp /etc/resolv.conf etc/resolv.conf

echo -n "Vas a generar una live compatible con x86 desde un entorno de 64 bits? [Y/n] : "
read yn
echo ""

echo "No te olvides de ejecutar :"
echo "env-update"
echo "source /etc/profile"
echo ""
echo "Despues de hacer esto ya puedes hacer emerges y demas chorradas"
echo ""
echo "Si es la primera vez que entras en tu live (source) tendrias que hacer emerge como poco de system"

echo ""
echo "Cuando termines y salgas 'exit' ejecuta el paso 02-limpiar-y-crear-livecd.sh"
echo ""


if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then
linux32 chroot . /bin/bash --login
else
chroot . /bin/bash --login
fi



# 02-limpiar-y-crear-livecd.sh
# ============================
echo -n "Desea desmontar unidades y actualizar el entorno (solamente es necesario si se hico el chroot) [Y/n] : "
read yn
echo ""

if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then
echo "Desmontar unidades y actualizar entorno"
cd ~/livecd/source
umount sys proc dev usr/portage/distfiles
env-update
source /etc/profile
fi

echo -n "Desea copiar la nueva live? (esto borrara la live anterior -target-) [Y/n] : "
read yn
echo ""

if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then
echo "Borrando la live anterior -target-"
rm -rf ~/livecd/target
mkdir ~/livecd/target
cp -a ~/livecd/source/boot ~/livecd/target/
mkdir -p ~/livecd/target/files/source

echo "Copiando la nueva live -desde source a target-"
rsync -a --delete --progress --exclude "var/cache/*" --exclude "usr/portage" --exclude "usr/share/doc" --exclude "usr/src" ~/livecd/source/ ~/livecd/target/files/source/

echo "Limpiando la nueva live"
cd ~/livecd/target/files/source/
rm -rf var/tmp/*
rm -rf var/run/*
rm -rf var/lock/*
rm -rf var/cache/*
rm -rf var/db
rm -rf tmp/*
rm -f etc/mtab
touch etc/mtab
rm -rf var/log
mkdir var/log
mkdir var/lib/
mkdir var/lib/dhcpc
rm -rf usr/portage
rm -rf etc/portage
rm -rf usr/share/doc
rm -rf usr/src/
rm root/.bash_history
fi

echo -n "Desea crear la nueva live (iso)? [Y/n] : "
read yn
echo ""

if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then
echo "Creando el live"

echo "Creando el sistema squash"
cd ~/livecd/target/files
time mksquashfs source/ ~/livecd/target/livecd.squashfs

touch ~/livecd/target/livecd
rm -rf ~/livecd/target/files
cd ~/livecd/

echo "Creando el iso"
rm -rf /root/livecd/livecd.iso
time mkisofs -R -udf -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -iso-level 3 -hide-rr-moved -c boot.catalog -o ~/livecd/livecd.iso ~/livecd/target/
fi

echo -n "Desea probar la nueva live (iso) con qemu? [Y/n] : "
read yn
echo ""

if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then
echo "Probando live..."
nice -n 2 qemu -m 512 -cdrom ~/livecd/livecd.iso
fi

echo "Finish..."

No hay comentarios.: