Como clonar una distribución para actualizarla

Introducción

Tengo instalado Ubuntu 8.10 en una de mis particiones. Está bastante personalizado. Y no me refiero a mi usuario
(para eso tengo una partición /home) sino a todos los paquetes que he instalado.

Hace poco ha salido 9.04. Tengo un howto que habla de cómo instalaria Ubuntu 9.04 desde cero y a partir de la lista de paquetes del 8.10 lo dejaría casi igual. Ese howto tiene, entre otros problemas, que luego hay
que crear los usuarios a mano, poner sus passwords, quizás poner algunos passwords, quizás configurar las X a partir
de un backup de un xorg.

El howto está muy bien si queremos “pasar” de un Ubuntu a un Debian, a una derivada de Debian o bien u otra combinación. Pero, claro, cuándo podemos actualizar de un Ubuntu 8.10 a un Ubuntu 9.04 sin apenas complicaciones (ya veremos 🙂 ), ¿Por qué no hacerlo?

Bien. La respuesta está clara. Quiero seguir teniendo el Ubuntu 8.10 por si acaso. Y al mismo tiempo tener el Ubuntu 9.04 para ir quedandome poco a poco con él.

¿Como hago esto? Pues clonando una distribución. O haciendo una copia. La copia será identica de no ser por su partición y esto lo tendremos que hacer saber.

Mi sistema

Antes de nada os tengo que hablar de mi sistema.

sda1 10 GB  Windows (Está con telarañas porque no lo uso)
sda2 300 MB /boot (Aqui tengo el arranque multiple)
sda3 20 GB / Debian Etch 4.0
sda4 Partition Extendida (Contiene a las lógicas)
sda5 8 GB / Ubuntu Intrepid 8.10
sda6 8 GB / Desdeslin desde cero (Ubuntu Intrepid 8.10)
sda7 8 GB / Debian 5.0 Lenny
sda8 3 GB SWAP
sda9 900 GB /home

Para tener arranque multiple uso la configuración descrita en Multi Distribution Boot Howto.

Antes de instalar el nuevo Ubuntu 9.04 tengo el /boot/grub/menu.lst:

default         2                                                                               
timeout         5                                                                               
color cyan/blue white/blue                                                                      

title Windows 95/98/ME (sda1)
root (hd0,0)                 
makeactive                   
chainloader +1               

title MENU DEBIAN ETCH
configfile (hd0,2)/boot/grub/menu.lst

title MENU UBUNTU INTREPID 8.10
rootnoverify (hd0,4)
chainloader +1
boot

title MENU DESDESLIN DESDE CERO
rootnoverify (hd0,5)
chainloader +1
boot

title MENU DEBIAN 5.0 LENNY
rootnoverify (hd0,6)
chainloader +1
boot

title Disco Externo
rootnoverify (hd1)
chainloader +1
boot

Preparación partición

Ahora mismo estoy trabajando en el sistema a clonar.
El proceso de clonado lo realizaré efectivamente desde un Debian Lenny.
No obstante como el ext3 está cambiando mucho últimamente el proceso de creación
del sistema de ficheros de la partición lo haré desde el sistema a clonar (Ubuntu 8.10).

Bien. Veamos. Me voy a cargar “Desdeslin desde cero”. Si toco más el desdeslin lo haré desde máquinas virtuales.
Usaba una partición dedicada porque era mi proyecto de fin de carrera y así iba todo mucho más rápido.
Era para probar desde una partición con Ubuntu 8.10 recien instalada si mis pasos eran correctos.

Desdeslin desde cero es: sda6 en este sistema.

Vamos a ello.

adrian@desdeslinserver:~$ sudo mkfs.ext3 /dev/sda6
[sudo] password for adrian:
mke2fs 1.41.3 (12-Oct-2008)
Etiqueta del sistema de ficheros=
Tipo de SO: Linux
Tamaño del bloque=4096 (bitácora=2)
Tamaño del fragmento=4096 (bitácora=2)
513072 nodos-i, 2048279 bloques
102413 bloques (5.00%) reservados para el superusuario
Primer bloque de datos=0
Número máximo de bloques del sistema de ficheros=2101346304
63 bloque de grupos
32768 bloques por grupo, 32768 fragmentos por grupo
8144 nodos-i por grupo
Respaldo del superbloque guardado en los bloques:
 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Escribiendo las tablas de nodos-i: hecho
Creating journal (32768 blocks): hecho
Escribiendo superbloques y la información contable del sistema de ficheros: hecho

Este sistema de ficheros se revisará automáticamente cada 27 montajes o
180 días, lo que suceda primero.  Utilice tune2fs -c o -i para cambiarlo.
adrian@desdeslinserver:~$

Como iba diciendo esto la clonación la voy a hacer desde el Debian Lenny.
Porque no quiero usar live cds teniendo tantas distribuciones instaladas.
Y porque así la distribución a clonar está desmontada y no me tengo que preocupar
de excluir directorios temporales y otras cosas por el estilo.

Pues nada. Voy a reiniciar a Lenny y seguiré editando este documento. 🙂

Clonación

Ya estoy aqui otra vez. Pero en vez de usar el Kwrite que venía con el kde4 de
Ubuntu 8.10 uso el de kde 3.5 que viene en Debian 5.0.

Bueno. La clonación es muy simple consiste en copiar todos los archivos de un sistema
a otro. Como ya hemos borrado la partición destino pues una cosa menos.

Para poder copiar archivos de una partición tanto para leer (origen) como para escribir
(destino) se han de montar las particiones.

Crearemos un par de directorios vacios para poder montar.

mkdir /mnt/origen
mkdir /mnt/destino

Notese que no uso sudo porque estoy en Debian, con su entro como root.

Bien. Ahora voy a montar la partición del Ubuntu 8.10 en origen,
es decir, sda5. Y la partición sda6 en destino.

mount -t ext3 /dev/sda5 /mnt/origen
mount -t ext3 /dev/sda6 /mnt/destino

Y ahora iniciaré la copia de archivos.

cp -a /mnt/origen/* /mnt/destino

Hay un truco muy viejo para hacer esto mismo con el comando tar que se supone es mejor
cuando hay red por el medio porque comprimes, envias y descomprimes.

Mientras esperamos que se realice la copia os comentaré que -a quiere decir:

-dpR

-d es: --no-dereference --preserve=links
p es: --preserve=mode,ownership,timestamps
R es: -R, -r, --recursive
 copy directories recursively
Y mirando más en detalle:
-P, --no-dereference
 never follow symbolic links in SOURCE
--preserve[=ATTR_LIST]
 preserve   the   specified   attributes   (default:  mode,owner‐
 ship,timestamps), if possible  additional  attributes:  context,
 links, all

Esto lo tendría que explicar mejor pero sólo diré que de está manera tanto los permisos de usuario, los atributos, los enlaces y demás ficheros especiales se copian correctamente.

No sé si habéis probado a copiar un fichero que es de un usuario cualquiera a root. Los permisos, una vez copiados son de root. Pues de esta manera los permisos son de quien eran en un primer lugar.

Y no sé, puede que hayais probado a copiar un enlace y realmente lo que copias es el fichero al que apunta y no el enlace en sí que apenas ocupa espacio. Pues esa es la opción –no-dereference que no sigue los links.

Os adelanto. Después de la copia habrá que personalizar al Ubuntu en su nueva partición.
Para ello tendremo que modificar su menu.lst y su fstab básicamente, o al menos eso creo.

Cuando haya acabado la copia hacemos

sync

por si acaso.

Y desmontamos tanto el origen como el destino.

umount /mnt/destino
umount /mnt/origen

Adaptación a la nueva partición

Ahora vamos a adaptar nuestro sistema copiado a la nueva partición.

Para ello tendremos que montarlo.

mount -t ext3 /dev/sda6 /mnt/destino

Modificación de fstab

Veamos el contenido actual del /mnt/destino/etc/fstab

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
# /dev/sdb5
UUID=eab9759d-113c-4521-9f9b-5840327f7db5 /               ext3    relatime,errors=remount-ro 0       1
# /dev/sdb9
UUID=fac860f8-c7fb-4f3a-8b87-2ae79845e032 /home           ext3    relatime        0       2
# /dev/sda7
UUID=6cafcdaa-2799-4b20-af46-ad63dd1ff9a3 none            swap    sw              0       0
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto,exec,utf8 0       0
/dev/scd1       /media/cdrom1   udf,iso9660 user,noauto,exec,utf8 0       0

Si nos fijamos la partición root tiene un UUID determinado. No obstante ese no
es el UUID de la partición sda6.

En mi debian lenny (el tercer sistema que uso para la clonación) uso:

vol_id /dev/sda6

Este me devuelve:

ID_FS_USAGE=filesystem
ID_FS_TYPE=ext3
ID_FS_VERSION=1.0
ID_FS_UUID=24a0e91b-0e2d-409f-8ddc-4a6b0d90912d
ID_FS_UUID_ENC=24a0e91b-0e2d-409f-8ddc-4a6b0d90912d
ID_FS_LABEL=
ID_FS_LABEL_ENC=
ID_FS_LABEL_SAFE=

A nosotros nos interesa la linea:

ID_FS_UUID=24a0e91b-0e2d-409f-8ddc-4a6b0d90912d

En concreto el valor que va después del = que será el que usaremos en
el fstab como root.

Podriamos usar:

gedit /mnt/destino/etc/fstab

para editar el fichero.

Así pues la linea:

UUID=eab9759d-113c-4521-9f9b-5840327f7db5 /               ext3    relatime,errors=remount-ro 0       1

nos quedará como:

UUID=24a0e91b-0e2d-409f-8ddc-4a6b0d90912d /               ext3    relatime,errors=remount-ro 0       1

Modificación de menu.lst

Como Ubuntu está basado en Debian usa la herramienta update-grub para actualizar su menu.lst
cuando instala un nuevo kernel.

Curiosamente tendremos que editar lineas comentadas.

Podriamos usar:

gedit /mnt/destino/boot/grub/menu.lst (Aqui supongo que no se usan particiones /boot)

para editar el fichero.

Antes teníamos:

# kopt=root=UUID=eab9759d-113c-4521-9f9b-5840327f7db5 ro

# groot=eab9759d-113c-4521-9f9b-5840327f7db5

Ahora tendremos:

# kopt=root=UUID=24a0e91b-0e2d-409f-8ddc-4a6b0d90912d ro

# groot=24a0e91b-0e2d-409f-8ddc-4a6b0d90912d

Guardamos y salimos

Ahora actualizaremos el menu.lst con estos nuevos datos
(en efecto para el grub las lineas anteriores son comentarios
pero para update-grub no)

Necesitaremos hacer un chroot al directorio destino.
Pero el grub necesita /dev para funcionar correctamente.

El /dev es un directorio problemático entre distribuciones porque, a veces, el kernel
cambia su concepción de los dispositivos. Lo ideal en este caso, sería hacer
el chroot y el update-grub desde la distro origen. No obstante creo que lo haré
con Debian Lenny 5.0 porque no cambia tanto el /dev.

mount -o bind /dev /mnt/destino/dev
chroot /mnt/destino

Ejecutamos

update-grub

y si nos preguntan.
(Normalmente no hay preguntas pero estos de ubuntu lo cambian todo.)
decimos que queremos usar la versión del fabricante.

Bien. Antes de nada. Vamos a poner un fichero centinela para verificar que
estamos arrancando el nuevo sistema y no el viejo.

echo "Soy nuevo" > /soynuevo.txt

Esto nos creará en el root del nuevo sistema un fichero con nombre soynuevo.txt cuyo contenido
será “Soy nuevo”.

Hacemos exit.

Y verificamos el /mnt/destino/boot/grub/menu.lst para ver si está ok.

exit

(para salir del chroot)

Y comprobamos: /mnt/destino/boot/grub/menu.lst.

Tendremos que ver en las lineas uuid y kernel nuestro nuevo uuid.

title           Ubuntu 8.10, kernel 2.6.27-7-server
uuid            24a0e91b-0e2d-409f-8ddc-4a6b0d90912d
kernel          /boot/vmlinuz-2.6.27-7-server root=UUID=24a0e91b-0e2d-409f-8ddc-4a6b0d90912d ro quiet splash
initrd          /boot/initrd.img-2.6.27-7-server
quiet

Bien.

Instalación de GRUB

Ahora instalaremos grub en el sector de arranque de la partición destino.
De esa manera aprovechamos el multiarranque que explicaba al principio.

En teoría tendriamos que hacer un chroot otra vez.

chroot /mnt/destino

Y luego hacer:

grub-install /dev/sda6

Pero da este error.

root@adrianpc:/# grub-install /dev/sda6
Searching for GRUB installation directory ... found: /boot/grub
The file /boot/grub/stage2 not read correctly.

¿Puede ser por qué no está montado proc?
Prefiero no investigar.
Veremos como instalar grub como los hombres.

Es hora de volver a la distribución origen,
pero sólamente al grub de ella.

Si aún estamos en el chroot salimos de él con:

exit

Desmontamos

umount /mnt/destino/dev
umount /mnt/destino
sync

(por si acaso)
y reiniciamos, y elegimos arrancar la partición origen.

En nuestro menú de grub multiarranque elegimos
la partición origen, pulsamos ESC para ver nuestro menú de grub
(La gente de Ubuntu normalmente oculta el menú de grub)

Y pulsamos c

Esto nos llevará a una consola.

grub>

Ahí escribiremos

root (hd0,5)
setup (hd0,5)

Sí, es 5 porque las particiones en grub empiezan desde 0 y es 0 porque tambien los discos
duros empiezan desde cero.

Luego haremos cat (hd0,5)/boot/grub/menu.lst
Y reboot.

Lo del cat es por un posible bug del grub, muchas veces sin hacerlo igual nos irá.

Bien. Como aún no hemos cambiado nuestro menu.lst de multiarranque
si elegimos:

MENU DESDESLIN DESDE CERO

tendremos acceso al nuevo sistema.

Comprobamos que en / tenemos soynuevo.txt (nuestro fichero centinela).
Lo borramos si queremos.

En este punto podriamos editar el menu.lst de nuestro multiarranque
para que en vez de:

MENU DESDESLIN DESDE CERO

ponga:

MENU UBUNTU 9.04

Como algunos notareis de momento el sistema es un Ubuntu 8.10 recien clonado pero
no un Ubuntu 9.04 pero eso va a cambiar muy pronto.

Actualización a Ubuntu 9.04

Bien. Esta parte del howto es opcional. Podrías seguir cualquier howto para actualizar de Ubuntu 8.10 a 9.04 y tan contentos.

Yo entiendo que aqui lo novedoso
es clonar un sistema y que más o menos todo siga igual.
Si no tenéis un tercer sistema instalado en vuestro disco duro para hacer la copia usais
un live cd y ya está.

Yo voy actualizar a Ubuntu 9.04 offline.
Basicamente actualizo el /etc/apt/sources.list para que me apunte a mi repositorio
offline de Jaunty 9.04, ejecuto:

 apt-get update

y

apt-get dist-upgrade

No obstante este último comando lo ejecutaré desde tty1 (pulsando ctrl+alt+f1).
Ahora con Ubuntu creo que esto se puede hacer de forma gráfica con el
update-manager o algo así pero yo usaré el metodo de linea de comandos.

Copia de seguridad del sources.list.

root@desdeslinserver:~# cd /etc/apt/
root@desdeslinserver:/etc/apt# cp sources.list sources.list_antes_9.04

Crear mi nuevo sources.list puede ser un lio.

Vamos a ver yo consegui mi repositorio con el siguiente mirror.list
(Es mirror.list porque uso apt-mirror)

# Main repository
deb http://es.archive.ubuntu.com/ubuntu/ jaunty main restricted
deb-src http://es.archive.ubuntu.com/ubuntu/ jaunty main restricted

# Major bug fix updates produced after the final release of the distribution.
deb http://es.archive.ubuntu.com/ubuntu/ jaunty-updates main restricted
deb-src http://es.archive.ubuntu.com/ubuntu/ jaunty-updates main restricted

# Universe and multiverse repostories. ENTIRELY UNSUPPORTED by the Ubuntu team
deb http://es.archive.ubuntu.com/ubuntu/ jaunty universe multiverse
deb-src http://es.archive.ubuntu.com/ubuntu/ jaunty universe multiverse
deb http://es.archive.ubuntu.com/ubuntu/ jaunty-updates universe multiverse
deb-src http://es.archive.ubuntu.com/ubuntu/ jaunty-updates universe multiverse

# Software from the 'backports' repository. Software from this repository may not have been tested as
# extensively as that contained in the main release, although it includes newer versions of some
# applications which may provide useful features. Also, please note that software in backports WILL NOT
# receive any review or updates from the Ubuntu security team.
deb http://es.archive.ubuntu.com/ubuntu/ jaunty-backports main restricted universe multiverse
deb-src http://es.archive.ubuntu.com/ubuntu/ jaunty-backports main restricted universe multiverse

# Software from Canonical's 'partner' repository. This software is not part of Ubuntu, but is
# offered by Canonical and the respective vendors as a service to Ubuntu users.
deb http://archive.canonical.com/ubuntu jaunty partner
deb-src http://archive.canonical.com/ubuntu jaunty partner

# Security updates
deb http://security.ubuntu.com/ubuntu jaunty-security main restricted universe multiverse
deb-src http://security.ubuntu.com/ubuntu jaunty-security main restricted universe multiverse

# Multimedia stuff
# GPG: wget http://packages.medibuntu.org/medibuntu-key.gpg -O- | sudo apt-key add -
deb http://packages.medibuntu.org/ jaunty free non-free
deb-src http://packages.medibuntu.org/ jaunty free non-free

Bien. Ahora los ficheros están en el directorio jaunty_mirrors dentro del home.

root@desdeslinserver:/home/jaunty_mirrors# ls
archive.canonical.com  es.archive.ubuntu.com  packages.medibuntu.org  security.ubuntu.com

Habrá que cambiar http:// por file:/ y poner las rutas correctas.

Copio y pego del mirror.list en el sources.list (sustituyendo todo lo anterior)
y hago un buscar y reemplazar:

busco: http://
reemplazo por: file:/home/jaunty_mirrors/
(Obviamente reemplazo todas las ocurrencias)

Guardamos el sources.list.

Ahora ejecutamos:

sudo apt-get update

Una vez hecho esto. Guardaremos todo como si fueras a apagar el ordenador
pero en su lugar elegiremos “Terminar sesión”.

Veremos la pantalla de entrada. Pulsamos ctrl+alt+f1,
hacemos login, entramos como root y pedimos una actualización de la distribución.

sudo -i
apt-get dist-upgrade

Y dentro de poco tendremos la 9.04.

Ironías del destino no os puedo decir que estoy en la 9.04.
No sé si el mirror español que elegí está defectuoso y entre otras cosas
una semana después del lanzamiento no tenía sudo.
O es que el apt-mirror soporta muy mal las paradas con CTRL+C
porque no lo baje de una vez.

A mi ya me parecía extraño que el Jaunty ocupara 50 GB mientras que
Intrepid fuera de unos 60 GB.

Tendré que forzar la descarga de lo que falta, o peor aún, descargarlo todo de nuevo.

Me imagino que eso será en otro post.

Y ahora os preguntaréis si el apt-get dist-upgrade ha “roto” mi sistema a jamás.
Eso suele pasar cuando se mezclan ramas de paquetes en Debian.
Me da igual.
Yo puedo seguir trabajando con mi sistema antiguo (el origen) y cuando tenga listo
mi repositorio retomaré la actualización en el nuevo (el destino).

Una clonación que me ha salvado de posibles problemas futuros (sin yo pretenderlo).

Actualización: Acabo de mirar los logs del apt-mirror y se ve que el wget tuvo dificultad
en bajar algunos paquetes.
A ver cómo hago para que se los baje correctamente sin tener que ejecutar otra vez
el apt-mirror.

Anuncios

Etiquetas: , , , , , ,

Una respuesta to “Como clonar una distribución para actualizarla”

  1. Problema initramfs-tools al actualizar a Ubuntu 9.04 « LLUG Says:

    […] ya  os contaba en el post de la clonación tenía problemas con paquetes no encontrados. Ahora ya tengo todos los paquetes puesto que volví a […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: