Tu propio repositorio de Debian
17.01.05 | 27 Comentarios
debian mirrorHace ya tiempo que mi amigo Luis Mariño me había hablado de tener una réplica (mirror) de Debian GNU/Linux; de hecho, la Primera Fiesta Debian de Instalación fue hecha utilizando un mirror del propio Luis. Así que un día me puse las pilas (aunque parezca redundante ;) ) y armé mi propio repositorio de Debian, a partir del cual actualizo todas mis computadoras (y las computadoras de mis amigos que vienen por casa). El esfuerzo vale la pena, pues hacer
apt-get upgrade
Descargados 3621kB en 5s (716kB/s)
apt-get dist-upgrade
Descargados 14,4MB en 2s (6773kB/s)
en solamente 7 segundos es fantástico.
Unos días atrás, ante una consulta en la lista UYLUG-linux, Christian Huelmo me sugirió documentar cómo hacer un repositorio, así que aquí escribo una breve receta para tener un repositorio funcionando, bah, exactamente cómo hago yo para tenerlo funcionando ;)
Version 1.5
Preparando el terreno
Debemos tener al menos un espacio libre de 15 GB. Yo actualmente estoy replicando Sid y en total ocupa 12 GB. En mi script la variable LOCATION define el lugar donde estará el repositorio.
Tenemos que instalar los paquetes:
* gnupg - GNU privacy guard
* debmirror - Debian partial mirror script, with FTP and package pool support
Es necesario informar a su sistema de verificación de firmas dónde encontrar las firmas de los releases de Debian, para ello debe editar el archivo que esta en el home del usuario que mantendrá el mirror y tener las dos líneas que se indican abajo; el archivo es el ~/.gnupg/gpg.conf:
keyserver-options auto-key-retrieve
keyserver keyring.debian.org
Armando y manteniendo la réplica
El siguiente es el script que utilizo para mantener mi réplica, yo lo tengo colocado en /usr/local/bin/, pero puede estar ubicado en el lugar de su preferencia.
1. #!/bin/sh
2. # Mirrorea debian
3. #
4. # Version 1.5 - 06.feb.2006
5. # * Eliminado repositorio non-US
6. # * Control de sincronizacion y reintentos
7. # Version 1.0 - 17.ene.2005
8. # * Primer version
9.
10. # 0 corre en modo consola con feedback a stdout
11. # 1 corre en modo batch con feedback a /var/log/syslog
12. SILENT=0
13.
14. # Cantidad de reintentos en sincronizar antes de abortar
15. REINTENTOS=10
16.
17. DEBMIRROR=/usr/bin/debmirror
18.
19. function bajo_mirror {
20. if [ $SILENT -eq 1 ]; then
21. /usr/bin/logger "Inicio actualizacion mirror $DISTRO"
22. PROGRESO=""
23. else
24. echo Distro: $DISTRO
25. echo Section: $SECTION
26. echo Server: $HOST
27. echo Mirror en: $LOCATION
28. PROGRESO="-p -v"
29. fi
30. BUCLES=1
31. run_debmirror
32. if [ $SILENT -eq 1 ]; then
33. /usr/bin/logger "Final actualizacion mirror $DISTRO"
34. else
35. echo "========================================================================================"
36. fi
37. }
38.
39. function run_debmirror {
40. if [ $BUCLES -gt $REINTENTOS ]; then return; fi
41. # TEST="--dry-run"
42. $DEBMIRROR $TEST $PROGRESO -h $HOST -d $DISTRO $REPOSIT --nosource -s $SECTION $LOCATION
43. if [ $? -ne 0 ]; then
44. if [ $SILENT -eq 1 ]; then
45. /usr/bin/logger "Error al sincronizar repositorio, intento $BUCLES"
46. else
47. echo "Error al sincronizar repositorio, intento $BUCLES"
48. fi
49. BUCLES=$(($BUCLES+1))
50. run_debmirror
51. fi
52. }
53.
54.
55. #DISTRO=sid,sarge
56. DISTRO=sid
57. SECTION=main,contrib,non-free,main/debian-installer
58. LOCATION=/mirror/debmirror
59. HOST=ftp.us.debian.org
60. bajo_mirror
61.
62. # Para hacer una replica de otro repositorio, agregar bloques como el siguiente
63. #
64. #DISTRO=sid/non-US
65. #SECTION=main,contrib,non-free
66. #LOCATION=/mirror/debmirror_non-US
67. #HOST=non-us.debian.org
68. #REPOSIT="-r /debian-non-US"
69. # bajo_mirror
70.
71. exit 0
# Descargar el código de: debmirror.sh
Al ejecutar el script, debmirror se encargaró de crear todos los directiorios que sean necesarios, por lo que no precisa tener ninguna estructura pre-creada.
Recuerde que estamos hablando de descargar de Internet aproximadamente 12 GB de archivos, por lo que puede ser una tarea que insuma varios dias o semanas, dependiendo de su conexión. Si su conexión se corta o la transferencia aborta, simplemente re-inicie el script. (una buena solución es un amigo que le provea de una primera copia del repositorio…. Gracias Luis!)
Al finalizar la réplica, posiblemente algunos paquetes que bajaron hace algunos días han sido cambiados por nuevos, vuelva a correr el script las veces que sean necesarias hasta estar completamente seguro que ya no hay paquetes nuevos para bajar a su repositorio local.
Luego que tenga todo replicado, debemos mantener todo día; para esto yo tengo en el crontab de root la siguiente linea:
1 5 * * * /usr/local/bin/debmirror.sh
De todas formas, si esta solución no le satisface, puede ejecutar el script cada cierto tiempo, pero recuerde que Debian tiene un desarrollo vertiginoso y puede ser que cambien muchos paquetes en poco tiempo, lo que puede obligarle a bajar ~6 GB de cosas nuevas si demora alguna semana en sincronizar réplica.
En principio, si tomó las precauciones previas, todo debería funcionar correctamente, aunque el script tiene variables que pueden requerir ser modificadas para obtener un mejor funcionamiento o adecuación a las necesidades de cada sistema:
* DISTRO - Qué distribución de Debian se va a replicar
* SECTION - Qué secciones dentro de la distribución se van a replicar
* LOCATION - (ya comentada anteriormente) Lugar donde estará guardada la réplica en el sistema local
* HOST - Fuente u origen desde donde se descargará la réplica
* TEST - Permite correr correr el script en modo prueba, es decir, se muestra lo que hará, pero no se hace o modifica nada
* SILENT - Permite correr en modo consola o desatendido, mostrando salida por consola o dejando registro en los logs
Disponibilizando los paquetes en su red
Bien, asumiendo de que todo a funcionado de maravillas y que en estos momentos su ancho de banda está saturado descargando paquetes y armando su repositorio, podemos dedicarnos a otras tareas: la primera de ellas es ofrecer o disponibilizar el repositorio al resto de las máquinas de la red y, por qué no, al mismo servidor donde está haciendo su réplica.
Puede hacerlo por FTP o por http. Yo lo hago por http pues ya tengo Apache instalado y funcionando. En otras palabras, lo primero que deberá tener es Apache funcionando y que las máquinas de su red puedan acceder con Firefox (como? hay alguien que navega con otro software…??) al servidor done está su repositorio. Pero, cómo hacer ésto, es tema de otro documento….
Lo más fácil es colocar dos enlaces simbólicos dentro del DocumentRoot de su servidor web. Yo lo tengo así:
/var/www/debian -> /mirror/debmirror
/var/www/debian-non-US -> /mirror/debmirror_non-US
Para que esto funcione deberá asegurarse que la configuración permita que Apache sirva enlaces simbólicos. Busque la configuración de Directory /var/www y asegúrese de tener habilitado Options FollowSymLinks (esto debería venir deshabilitado por defecto).
Para hacer más flexible la forma en que su repositorio sirve paquetes, sugiero dos enlaces simbólicos llamados testing y unstable que apunten a los directorios de los nombres reales de las distribuciones, asi:
/mirror/debmirror/dists/testing -> /mirror/debmirror/dists/sarge
/mirror/debmirror/dists/unstable -> /mirror/debmirror/dists/sid
/mirror/debmirror_non-US/dists/testing -> /mirror/debmirror_non-US/dists/sarge
/mirror/debmirror_non-US/dists/unstable -> /mirror/debmirror_non-US/dists/sid
esto permitirá que las máquinas de su red puedan acceder tanto por el nombre real de la distribución (sid), como por su categoría (unstable); se puede leer más sobre esto en SigT. Además, haciendo esto, dejará todo preparado para la próxima versión de Debian.
El sources.list de sus sistemas Debian
Bueno, ahora la configuración de cada Debian de la red….. Ponga estos repositorios en el /etc/apt/sources.list:
deb http://SU_SERVER/debian unstable main contrib non-free
deb http://SU_SERVER/debian-non-US unstable/non-US main contrib non-free
y cuando tenga ya todo el repositorio replicado disfrute del apt-get
Notas finales
Este documento tiene por objetivo ser una guía rápida. Si alguno de los conceptos aquí descriptos le son ajenos busque documentación complementaria.
Obviamente, este documento es perfectible. Si tiene alguna sugerencia que permita mejorar cómo yo hago mi repositorio, le agradecerí si la comparte conmigo, colocando un comentario aquí mismo o mediante el formulario de contacto. Me comprometo a publicar aquà mismo su sugerencia.
Histórico:
* Version 1.5 - 25.ago.2005 - Verificacion de firmas en GPG.conf
* Version 1.0 - 17.ene.2005
Popularidad: 29%
Wednesday, February 20, 2008
Compilando Un Kernel
1) OBTENER LAS HERRAMIENTAS NECESARIAS
Para compilar un kernel a medida vamos a necesitar los paquetes build-essential y kernel-package, por lo tanto:
bash:# aptitude install build-essential kernel-package linux-source libncurses5-dev
libqt3-dev
2) OBTENER LAS FUENTES DEL KERNEL
Las fuentes del kernel las podemos obtener de muchos sitios. El oficial, como todos sabeis es www.kernel.org
Pero también están en los repositorios de Debian, y yo las he sacado de ahí, porque tiene algunas ventajas, como luego veremos.
En los repositorios de Debian os vais a encontrar con paquetes llamados kernel-source y con paquetes llamados linux-source. Ambos son las fuentes del kernel. ¿Cuál es la diferencia?, pues que los kernel-source vienen de Debian, y los linux-source vienen de Debian. Por lo tanto para obtener las fuentes del kernel que tenemos instalado y corriendo en nuestro sistema, sólo tendremos que hacer:
Con esto se descargará el archivo linux-source-nº_de_version.tar.bz2 en el directorio /usr/src (A partir de ahora asumiré que hemos descargado el linux-source-2.6.8.1, que es el que viene con debian)
Nos movemos a ese directorio:
bash:# cd /usr/src
Si existe un enlace llamado linux a un kernel antiguo, lo borramos:
bash:/usr/src# rm linux
Ahora vamos a descomprimir el archivo de las fuentes:
bash:/usr/src# tar jxvf linux-source-2.6.8.1.tar.bz2
Esto creará un directorio llamado linux-source-2.6.8.1
Creamos un enlace simbólico (llamado linux) a ese directorio:
bash:/usr/src# ln -s linux-source-2.6.8.1 linux
3) CONFIGURAR EL KERNEL
Hay varias formas de configurar el kernel. Probablemente la mayoría de la gente utiliza una de estas dos: make menuconfig o make xconfig. La diferencia es que con make menuconfig no hace falta tener las Xwindow corriendo, y con make xconfig sí.
Nota: para utilizar make menuconfig necesitaremos el paquete libncurses5-dev (con todas sus dependencias) y para utilizar make xconfig necesitaremos el paquete libqt3-dev (con todas sus dependencias). Así que según lo que queramos utilizar, tendremos que hacer:
Una duda que siempre surge: para configurar el kernel, ¿puedo partir de una configuración conocida?. Pues la respuesta es que sí. Si tenemos, por ejemplo, instalado el kernel que trae Debian por defecto (2-6-8-1-3-386 en mi caso), en el directorio /boot nos encontraremos con un archivo llamado config-2.6.8.1-3-386, y, ¿qué es ese archivo?, pues no es más que un archivo de texto con la configuración actual del kernel, por lo tanto, para partir de esa base y comenzar la configuración del nuevo kernel desde la actual, lo que tenemos que hacer es copiar dicho archivo al directorio /usr/src/linux-source-2.6.8.1, pero llamándolo .config, es decir:
bash:# cd /usr/src/linux
bash:/usr/src/linux# cp /boot/config-2.6.8.1-3-386 .config
(lógicamente tendreis que cambiar los números de versión del kernel por los que se ajusten a vuestro caso particular).
bash:/usr/src/linux# make menuconfig
Pues ahora ya podemos hacer (situados en el directorio /usr/src/linux) un make oldconfig menuconfig o un make oldconfig xconfig y modificar las opciones que queramos del kernel, es decir, configurarlo a nuestro gusto. Con mucho cuidado, eso sí, porque este es el paso crítico. Aquí es donde lo podemos arruinar todo si, por ejemplo, no incluimos algún módulo necesario para nuestro sistema.
4) CONSTRUIR EL PAQUETE DEL KERNEL
Para construir el paquete con el que instalaremos el nuevo kernel vamos a usar la orden make-kpkg. Esta orden lo que hace básicamente es sustituir a las clásicas make dep, make clean, make bzImage y make modules. Admite numerosas opciones y modificadores (ya sabeis: man make-kpkg), pero para lo que nos ocupa ahora sólo necesitaremos hacer lo siguiente:
bash:/usr/src/linux# make-kpkg clean
bash:/usr/src/linux# make-kpkg --append-to-version=.XXXX --initrd kernel_image
Lo único que teneis que modificar de la orden anterior es XXXX, que representa una secuencia alfanumérica que tendréis que decidir vosotros, y que se añadirá al número de versión del kernel para diferenciar el kernel que estais compilando de cualquier otro que ya esté instalado en vuestro sistema. Por lo tanto XXXX lo debereis sustituir por lo que querais, intentando no utilizar el guión de subrayado bajo (_) ni expresiones como "-386", "-606", "-K7", "-sparc", etc., porque expresiones similares son las usadas por los kernel precompilados de Debian y podrían inducir a error. Personalmente yo uso la fecha en la que compilo el kernel, de forma que si lo compilase hoy (19 de noviembre de 2004), mi orden querdaría así:
bash:/usr/src/linux# make-kpkg --append-to-version=.191104 --initrd kernel_image
Ahora hay que hablar un poco sobre la opción --initrd
Esta opción lo que hace es crear una imagen initrd en el directorio /boot.
Realmente no es imprescindible utilizarla siempre que a la hora de configurar el kernel hayamos incluido de forma estática (y no como módulos) los controladores para al menos nuestro bus, disco y sistema de archivos de nuestro directorio raiz. Pero (y esto es sólo una experiencia personal) siempre que he intentado compilar un kernel sin esa opción, me he encontrado con un sistema que no arrancaba, así que yo la uso siempre. ¿Qué problema tiene?, pues que para que funcione correctamente la opción --initrd, hay que aplicar a las fuentes del kernel el parche cramfs. Tranquilos, porque todos los kernel de Debian (y por supuesto también los de Debian) tienen ese parche ya aplicado. Pero es algo que tendréis que tener en cuenta si habeis obtenido las fuentes del kernel en algún otro sitio (por ejemplo en www.kernel.org).
Bien, como he dicho antes, las órdenes que tenemos que ejecutar son:
bash:/usr/src/linux# make-kpkg clean
bash:/usr/src/linux# make-kpkg --append-to-version=.XXXX --initrd kernel_image
Tras ejecutar la segunda de ellas nos saldrá un mensaje de aviso diciéndonos que la opción --initrd puede no funcionar como nosotros esperamos, y preguntándonos si queremos abortar el proceso. Como ya sabemos que a nosotros nos va a funcionar correctamente, contestamos que no.
Y ahora a esperar, porque el proceso de compilación puede durar mucho.
5) INSTALAR EL KERNEL
Si todo lo anterior ha ido bien, en el directorio /usr/src se debe haber creado un archivo de nombre kernel-image-2.6.8.1.XXXX_10.00.Custom_i386.deb
Este es el archivo que contiene nuestro kernel compilado listo para instalar, lo que haremos con:
bash:/usr/src# dpkg -i kernel-image-2.6.8.1.XXXX_10.00.Custom_i386.deb
Esta orden es equivalente a las clásicas make modules_install y make install, además de colocar en su sitio la imagen initrd generada y actualizar el grub o el lilo.
Ahora, y por seguridad, borramos el enlace que habíamos creado:
bash:/usr/src# rm linux
Y ya está. Sólo nos queda arrancar con nuestro nuevo kernel.
Saludos a todos, y espero que os sea de utilidad.
1) OBTENER LAS HERRAMIENTAS NECESARIAS
Para compilar un kernel a medida vamos a necesitar los paquetes build-essential y kernel-package, por lo tanto:
bash:# aptitude install build-essential kernel-package linux-source libncurses5-dev
libqt3-dev
2) OBTENER LAS FUENTES DEL KERNEL
Las fuentes del kernel las podemos obtener de muchos sitios. El oficial, como todos sabeis es www.kernel.org
Pero también están en los repositorios de Debian, y yo las he sacado de ahí, porque tiene algunas ventajas, como luego veremos.
En los repositorios de Debian os vais a encontrar con paquetes llamados kernel-source y con paquetes llamados linux-source. Ambos son las fuentes del kernel. ¿Cuál es la diferencia?, pues que los kernel-source vienen de Debian, y los linux-source vienen de Debian. Por lo tanto para obtener las fuentes del kernel que tenemos instalado y corriendo en nuestro sistema, sólo tendremos que hacer:
Con esto se descargará el archivo linux-source-nº_de_version.tar.bz2 en el directorio /usr/src (A partir de ahora asumiré que hemos descargado el linux-source-2.6.8.1, que es el que viene con debian)
Nos movemos a ese directorio:
bash:# cd /usr/src
Si existe un enlace llamado linux a un kernel antiguo, lo borramos:
bash:/usr/src# rm linux
Ahora vamos a descomprimir el archivo de las fuentes:
bash:/usr/src# tar jxvf linux-source-2.6.8.1.tar.bz2
Esto creará un directorio llamado linux-source-2.6.8.1
Creamos un enlace simbólico (llamado linux) a ese directorio:
bash:/usr/src# ln -s linux-source-2.6.8.1 linux
3) CONFIGURAR EL KERNEL
Hay varias formas de configurar el kernel. Probablemente la mayoría de la gente utiliza una de estas dos: make menuconfig o make xconfig. La diferencia es que con make menuconfig no hace falta tener las Xwindow corriendo, y con make xconfig sí.
Nota: para utilizar make menuconfig necesitaremos el paquete libncurses5-dev (con todas sus dependencias) y para utilizar make xconfig necesitaremos el paquete libqt3-dev (con todas sus dependencias). Así que según lo que queramos utilizar, tendremos que hacer:
Una duda que siempre surge: para configurar el kernel, ¿puedo partir de una configuración conocida?. Pues la respuesta es que sí. Si tenemos, por ejemplo, instalado el kernel que trae Debian por defecto (2-6-8-1-3-386 en mi caso), en el directorio /boot nos encontraremos con un archivo llamado config-2.6.8.1-3-386, y, ¿qué es ese archivo?, pues no es más que un archivo de texto con la configuración actual del kernel, por lo tanto, para partir de esa base y comenzar la configuración del nuevo kernel desde la actual, lo que tenemos que hacer es copiar dicho archivo al directorio /usr/src/linux-source-2.6.8.1, pero llamándolo .config, es decir:
bash:# cd /usr/src/linux
bash:/usr/src/linux# cp /boot/config-2.6.8.1-3-386 .config
(lógicamente tendreis que cambiar los números de versión del kernel por los que se ajusten a vuestro caso particular).
bash:/usr/src/linux# make menuconfig
Pues ahora ya podemos hacer (situados en el directorio /usr/src/linux) un make oldconfig menuconfig o un make oldconfig xconfig y modificar las opciones que queramos del kernel, es decir, configurarlo a nuestro gusto. Con mucho cuidado, eso sí, porque este es el paso crítico. Aquí es donde lo podemos arruinar todo si, por ejemplo, no incluimos algún módulo necesario para nuestro sistema.
4) CONSTRUIR EL PAQUETE DEL KERNEL
Para construir el paquete con el que instalaremos el nuevo kernel vamos a usar la orden make-kpkg. Esta orden lo que hace básicamente es sustituir a las clásicas make dep, make clean, make bzImage y make modules. Admite numerosas opciones y modificadores (ya sabeis: man make-kpkg), pero para lo que nos ocupa ahora sólo necesitaremos hacer lo siguiente:
bash:/usr/src/linux# make-kpkg clean
bash:/usr/src/linux# make-kpkg --append-to-version=.XXXX --initrd kernel_image
Lo único que teneis que modificar de la orden anterior es XXXX, que representa una secuencia alfanumérica que tendréis que decidir vosotros, y que se añadirá al número de versión del kernel para diferenciar el kernel que estais compilando de cualquier otro que ya esté instalado en vuestro sistema. Por lo tanto XXXX lo debereis sustituir por lo que querais, intentando no utilizar el guión de subrayado bajo (_) ni expresiones como "-386", "-606", "-K7", "-sparc", etc., porque expresiones similares son las usadas por los kernel precompilados de Debian y podrían inducir a error. Personalmente yo uso la fecha en la que compilo el kernel, de forma que si lo compilase hoy (19 de noviembre de 2004), mi orden querdaría así:
bash:/usr/src/linux# make-kpkg --append-to-version=.191104 --initrd kernel_image
Ahora hay que hablar un poco sobre la opción --initrd
Esta opción lo que hace es crear una imagen initrd en el directorio /boot.
Realmente no es imprescindible utilizarla siempre que a la hora de configurar el kernel hayamos incluido de forma estática (y no como módulos) los controladores para al menos nuestro bus, disco y sistema de archivos de nuestro directorio raiz. Pero (y esto es sólo una experiencia personal) siempre que he intentado compilar un kernel sin esa opción, me he encontrado con un sistema que no arrancaba, así que yo la uso siempre. ¿Qué problema tiene?, pues que para que funcione correctamente la opción --initrd, hay que aplicar a las fuentes del kernel el parche cramfs. Tranquilos, porque todos los kernel de Debian (y por supuesto también los de Debian) tienen ese parche ya aplicado. Pero es algo que tendréis que tener en cuenta si habeis obtenido las fuentes del kernel en algún otro sitio (por ejemplo en www.kernel.org).
Bien, como he dicho antes, las órdenes que tenemos que ejecutar son:
bash:/usr/src/linux# make-kpkg clean
bash:/usr/src/linux# make-kpkg --append-to-version=.XXXX --initrd kernel_image
Tras ejecutar la segunda de ellas nos saldrá un mensaje de aviso diciéndonos que la opción --initrd puede no funcionar como nosotros esperamos, y preguntándonos si queremos abortar el proceso. Como ya sabemos que a nosotros nos va a funcionar correctamente, contestamos que no.
Y ahora a esperar, porque el proceso de compilación puede durar mucho.
5) INSTALAR EL KERNEL
Si todo lo anterior ha ido bien, en el directorio /usr/src se debe haber creado un archivo de nombre kernel-image-2.6.8.1.XXXX_10.00.Custom_i386.deb
Este es el archivo que contiene nuestro kernel compilado listo para instalar, lo que haremos con:
bash:/usr/src# dpkg -i kernel-image-2.6.8.1.XXXX_10.00.Custom_i386.deb
Esta orden es equivalente a las clásicas make modules_install y make install, además de colocar en su sitio la imagen initrd generada y actualizar el grub o el lilo.
Ahora, y por seguridad, borramos el enlace que habíamos creado:
bash:/usr/src# rm linux
Y ya está. Sólo nos queda arrancar con nuestro nuevo kernel.
Saludos a todos, y espero que os sea de utilidad.
Subscribe to:
Posts (Atom)