pedroreina.net

Cambiar disco duro
Tenemos un sistema GNU/Linux funcionando en un PC, instalado en un disco duro, y el disco se nos ha quedado pequeño. Obtenemos un disco duro mayor y lo que deseamos hacer es pasar nuestro sistema del disco antiguo al nuevo.

La primera vez que tuve que resolver este problema busqué en Internet alguna solución y la encontré en thelinuxgurus.org, en un artículo que desgraciadamente ya no está disponible en su web. Lo que me sorprendió fue que un simple cp no fuera suficiente, y hubiera que recurrir a tar; el problema es que cp no mantiene todas las propiedades de todos los archivos.

Tomé las notas correspondientes, y las he usado muchas veces para resolver el problema con éxito. La última vez que lo he hecho ha sido en un Pentium II a 400 MHz con 64 MB de RAM, y he pensado que era buena idea publicarlo por si a alguien le puede servir.

Partimos del siguiente supuesto, que obviamente podrás adaptar a tu propia situación: tenemos un PC con dos canales IDE; en el canal maestro del primer BUS IDE tenemos un disco duro (llamado /dev/hda en GNU/Linux) y en canal maestro del segundo BUS IDE tenemos un lector de CD-ROM (llamado /dev/hdc en GNU/Linux). Hemos instalado GNU/Linux en el disco duro usando tres particiones y nuestra tabla de particiones tiene este aspecto:

Partición Sistema de archivos Uso
hda1 ext3 / (Raíz del sistema)
hda2 ext3 /home (datos de usuarios)
hda3 swap Intercambio
  1. Comenzamos por apagar el ordenador y desconectarlo de la red de datos. Durante el tiempo que estemos haciendo el cambio, nadie podrá acceder a los servicios ofrecidos por esta máquina.

  2. Abrimos el ordenador y conectamos el disco duro nuevo en el lugar del CD-ROM. Así no hará falta ni siquiera tocar los jumpers del disco para cambiar entre maestro y esclavo.

  3. Arrancamos el sistema y creamos particiones en el disco duro nuevo, por ejemplo con el programa cfdisk:

    cfdisk /dev/hdc

    Haremos tres particiones, para /, para /home y para swap, en el mismo orden que las tenemos en el disco antiguo.

  4. Tras salir de cfdisk, conviene reiniciar el sistema para estar seguros de que Linux lee correctamente la tabla de particiones.

  5. Cuando volvemos a tener el sistema en marcha, damos formato a las tres particiones creadas. Es un buen momento para leer las páginas man, por si queremos crear los sistemas de archivos con alguna característica especial.

    mkfs.ext3 /dev/hdc1
    mkfs.ext3 /dev/hdc2
    mkswap /dev/hdc3

  6. Creamos un directorio nuevo, en el que iremos montando las particiones del disco duro nuevo:

    mkdir /nuevo

  7. Vamos a comenzar por pasar al nuevo disco duro el contenido de la partición que contiene /home. Montamos la segunda partición del disco duro nuevo:

    mount /dev/hdc2 /nuevo

  8. Nos cambiamos al directorio /home:

    cd /home

  9. Ahora vamos a crear un archivo de texto con la lista de archivos y directorios que hay que trasvasar de un disco a otro. Para ello vamos a usar la sencilla orden ls, pero como es muy posible que hayamos definido un alias para que ls dé su salida en color, vamos a poner una barra invertida antes de invocar ls (esto hace que bash no use el alias, sino la orden original).

    Como no queremos trasvasar el directorio lost+found, usamos grep para filtrar ese nombre y que no acabe en la lista; la opción -v de grep sirve para invertir el uso habitual de grep.

    El archivo de texto se llamará lista.txt; lo creamos así:

    \ls | grep -v lost+found > lista.txt

  10. Ahora viene el paso importante, usamos tar para ir leyendo los archivos de la partición antigua y otro tar para ir creándolos en la partición nueva. Atención a las tildes invertidas. Se obtienen pulsando el acento grave seguido del espaciador.

    tar cf - `cat lista.txt` | (cd /nuevo ; tar xpf -)

    En la máquina en que he dicho que estoy haciendo esto tardé 2'42" en mover 276 MB de datos. Probablemente el tiempo hubiera sido mucho menor si hubiera usado hdparm para mejorar el acceso a disco.

  11. Concluido el trasvase, podemos borrar el archivo de texto si queremos:

    rm /home/lista.txt

  12. Desmontamos la partición del disco nuevo:

    umount /nuevo

  13. Ahora nos preparamos para pasar al disco nuevo los datos de la partición raíz. Comenzamos por cambiarnos al directorio raíz:

    cd /

  14. Ahora hay que desmontar todas las particiones que tengamos montadas. En nuestro caso, solo tenemos el /home, de modo que

    umount /home

  15. De modo similar a como hicimos antes, creamos una lista con los nombres de archivos y directorios que queremos trasvasar. Solo que ahora también hay que evitar poner en la lista el directorio /proc, por ser un directorio virtual creado por Linux, y el directorio /nuevo, por ser donde vamos a montar la partición del nuevo disco

    \ls | grep -v proc | grep -v lost+found | grep -v nuevo > lista.txt

  16. Ahora tenemos que pasar a modo monousuario, con lo que conseguimos parar los servicios del sistema.

    init 1

  17. Volvemos a colocarnos en el directorio raíz, porque al pasar a modo monousuario el sistema nos coloca en /root.

    cd /

  18. Montamos la primera partición del disco duro nuevo:

    mount /dev/hdc1 /nuevo

  19. Y el momento del trasvase de datos:

    tar cf - `cat lista.txt` | (cd /nuevo ; tar xpf -)

    En la máquina en que he dicho que estoy haciendo esto tardé 9'34" en mover 720 MB de datos. Probablemente el tiempo hubiera sido mucho menor si hubiera usado hdparm para mejorar el acceso a disco.

  20. Necesitamos crear a mano el directorio /proc en el nuevo disco:

    mkdir /nuevo/proc

  21. Concluido el trasvase, podemos borrar el archivo de texto si queremos:

    rm /lista.txt

  22. Desmontamos la partición del disco nuevo:

    umount /nuevo

  23. Paramos el sistema:

    halt

  24. Colocamos el disco duro nuevo en el lugar del viejo y volvemos a colocar el lector de CD-ROM.

  25. Necesitamos escribir el sector de arranque del sistema en el disco duro nuevo; para ello yo arranco el sistema con el primer CD de Debian con la opción de rescate, pero cualquier otro método valdría. Concretamente, arranco desde el primer CD de Debian 3.0 (Woody) escribiendo esta orden en el prompt:

    rescbf24 root=/dev/hda1

  26. Cuando arranca el nuevo sistema (cosa que debería ocurrir perfectamente), ejecuto la orden lilo para escribir el Master Boot Record del nuevo disco:

    lilo

  27. Ya debería estar todo correcto, pero lo comprobamos reiniciando el sistema y viendo que todo va bien.

    reboot

Ya podemos guardar el disco duro antiguo, que contendrá los datos anteriores sin ninguna modificación.

Agradecimiento
Ismael de Andrés Presa ha indicado la existencia de errores en las explicaciones, que han sido subsanados gracias a él.
Posibilidades para seguir
Mejor visto con cualquier navegador HTML 4.01 válido CSS válido