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.