Mover un directorio de Linux a una nueva partición

Posted on Monday, March 23, 2015

Mover un directorio de Linux a una nueva partición

En este texto vamos a tratar el tema de mover un directorio de Linux a una nueva partición porque en la actual se ha quedado sin espacio (o por cualquier otro motivo). Por sencillez, supongamos que ese directorio es /home, aunque podría ser casi cualquier otro sin grandes variaciones. Para los ejemplos, supondremos que la nueva partición en la que queremos ubicar el directorio es /dev/sdb1 y que esta partición ya esta formateada. Si esto no es así, entiendo que se sabe cómo llegar hasta ese punto y, en caso contrario, no es el objetivo de este texto explicar como crear y formatear particiones en Linux: es una tarea muy básica y hay abundante documentación al respecto.

¿Cuáles serían los pasos para alcanzar el propósito que nos hemos planteado?

En primer lugar, arrancamos el equipo sin iniciar sesión en las X. Si ya hemos iniciado sesión, la cerramos.

Vamos a una consola de texto con Control+Alt+F1 (o Control+Alt+F2, F3, F4, etc. en algunos sistemas que no tienen activada la consola 1).

Si usamos algún sistema como Ubuntu que tiene desactivado el acceso con el usuario root, tendremos que acceder con un usuario normal. Esto nos situará en su directorio personal que será /home/nombre_de_usuario. Será necesario salir de ahí y situarnos en cualquier otro directorio para no ocupar /home:

cd /tmp

Entonces, ahora que /home ya está libre, nos convertimos en root:

sudo bash

Nos aseguramos de que no hay ningún fichero en uso en /home:

lsof -n | fgrep /home

Si todavía existe algún proceso usando algún fichero en /home, lo cerramos o matamos.

Montamos la nueva partición home en un directorio vacío (acordándonos de cambiar /dev/sdb1 por lo que proceda):

mkdir /mnt/home
mount /dev/sdb1 /mnt/home

Movemos todos los ficheros de /home a la nueva partición:

mv /home/* /mnt/home

Nos aseguramos de que no haya quedado ningún fichero oculto por mover (los ficheros ocultos no se incluyen en *) y, si queda alguno, lo movemos:

ls -a /home

¡Ojo con hacer un mv de .*! Eso no tiene el resultado que se puede esperar en un principio.

Desmontamos la partición:

umount /dev/sdb1
rmdir /mnt/home

Añadimos a /etc/fstab la línea que provocará que siempre se monte la partición al arrancar:

/dev/sdb1 /home ext3 defaults,noatime,nodiratime 1 2

Para más información sobre el significado de cada columna, véase la página de manual de fstab(5).

Un truco: imaginemos que abrimos el ordenador, empezamos a tocar cables y el disco acaba enchufado en un bus SATA distinto y en vez de sdb pasa a ser sdc. Pues ya no funciona la línea que hemos puesto en fstab. Por eso es mejor usar el UUID del sistema de ficheros, ya que nunca cambia a no ser que formateemos. Podemos obtener el UUID de un sistema de ficheros con:

blkid /dev/sdb1

Apuntamos el UUID y lo usamos en fstab en lugar del nombre de dispositivo. Por ejemplo:

UUID=911013a0-e6e3-401c-88ca-23532284b7de /home ext3 defaults,noatime,nodiratime 1 2

Reemplazando, claro, ext3 por el sistema de ficheros que hayamos usado: ext2, ext3, ext4, btrfs, xfs, ...

Por defecto, cada vez que accedemos a un fichero, se actualiza su fecha de último acceso. Esto convierte una operación de lectura en una de lectura/escritura afectando al rendimiento y la vida del disco duro. Por eso es siempre recomendable montar los dispositivos con las opciones noatime y nodiratime a no ser que haya un buen motivo para necesitar las fechas de acceso.

Probamos a ver si la partición /home se monta correctamente:

mount /home

Y, por último, reiniciamos el equipo y, antes de iniciar sesión en las X, volvemos a la consola de texto (Control+Alt+F1) e iniciamos sesión para comprobar con mount que /home se monta correctamente al arranque.