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 |
- 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.
- 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.
- 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.
- Tras salir de cfdisk, conviene reiniciar el sistema para estar
seguros de que Linux lee correctamente la tabla de particiones.
- 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
- Creamos un directorio nuevo, en el que iremos montando las
particiones del disco duro nuevo:
mkdir /nuevo
- 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
- Nos cambiamos al directorio /home:
cd /home
- 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
- 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.
- Concluido el trasvase, podemos borrar el archivo de texto si
queremos:
rm /home/lista.txt
- Desmontamos la partición del disco nuevo:
umount /nuevo
- Ahora nos preparamos para pasar al disco nuevo los datos de
la partición raíz. Comenzamos por cambiarnos al directorio
raíz:
cd /
- Ahora hay que desmontar todas las particiones que tengamos
montadas. En nuestro caso, solo tenemos el /home, de modo
que
umount /home
- 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
- Ahora tenemos que pasar a modo monousuario, con lo que conseguimos
parar los servicios del sistema.
init 1
- Volvemos a colocarnos en el directorio raíz, porque al pasar a
modo monousuario el sistema nos coloca en /root.
cd /
- Montamos la primera partición del disco duro nuevo:
mount /dev/hdc1 /nuevo
- 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.
- Necesitamos crear a mano el directorio /proc en el nuevo disco:
mkdir /nuevo/proc
- Concluido el trasvase, podemos borrar el archivo de texto si
queremos:
rm /lista.txt
- Desmontamos la partición del disco nuevo:
umount /nuevo
- Paramos el sistema:
halt
- Colocamos el disco duro nuevo en el lugar del viejo y volvemos
a colocar el lector de CD-ROM.
- 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
- 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
- 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.