14 julio 2013

Linux From Scratch: Copiar nuestra instalación en otra máquina

Como lo prometido es deuda, he escrito el artículo que le prometí a Amaury sobre la forma de copiar nuestra instalación de LFS en otra máquina. Hay varias soluciones para esto. Amaury hablaba de usar un LiveCD. También tendré que escribir sobre eso, pero por lo que he estado viendo, requiere hacer cambios importantes en el initrd y en los scripts de arranque, así que de momento voy a plantear otras opciones.
Lo primero que hay que tener en cuenta, ya que estamos hablando de LFS, es que el kernel tiene que tener soporte para el hardware de la máquina en la que vamos a copiar nuestro sistema. De no ser así, lo primero que tendremos que hacer será compilar el kernel con soporte para esa máquina. Para esto, os remito a mi artículo sobre compilación del kernel, aunque las opciones más importantes serán las de la sección Device Drivers, sobre las cuales no he comentado nada porque dependen completamente de la máquina.
Voy a explicaros aquí tres posibles formas de llevar un sistema linux de una máquina a otra. La mayoría sirven para cualquier distro. El caso más importante y en el que más me voy a detener es el primero, ya que las instrucciones que contiene son la base para todos los demás y son las que al final vamos a tener que seguir.

1. Desde un sistema instalado en USB

Este caso es fácil y debería funcionar en cualquier distro, ya que lo he hecho varias veces en varias distros diferentes y siempre me ha funcionado. No es recomendable que la distro que estamos copiando esté en ejecución, así que es mejor arrancar la máquina destino con algún otro sistema que esté instalado en ella o con un LiveCD o algo parecido. No hace falta que sea de la misma distro. Cualquiera vale. Si esto no es posible, se puede hacer arrancando con el USB que se quiere copiar, pero entonces es mejor hacerlo desde una consola en modo texto (Ctrl+Alt+F1) sin las X arrancadas e incluso detener los servicios que estén en ejecución.
Lo primero es tener claro cómo va a ser el esquema de particiones que queremos tener. No tiene por qué ser igual que el del USB. La forma de crear la partición no la voy a detallar aquí, ya que hay muchas maneras y cada uno lo puede hacer a su gusto. Si no estamos seguros de cuál es el disco en el que queremos hacer la instalación o de cuál es la estructura de particiones que tiene, podemos usar fdisk -l para ver todos los discos duros que hay conectados junto con sus correspondientes particiones. Usar mount para ver qué particiones están montadas también puede ayudar a identificarlas. Después podemos usar fdisk de forma interactiva o cualquier otra herramienta que nos guste para crear las particiones necesarias.
En mi caso, voy a suponer que quiero copiar mi LFS a una partición situada en sda1 que ya está creada. La swap va a ser sda3. Es mejor que la partición sda1 esté marcada como arrancable con fdisk. Si queréis, también es posible crear varias particiones para montarlas en distintos puntos del sistema de ficheros. Por ejemplo, se puede tener una partición aparte para /home o para /var. En este caso no hay que olvidar formatearlas y montarlas todas antes de empezar a copiar.
Lo primero que hay que hacer es formatear las particiones. LFS usa ext3 para las particiones. Si estamos haciendo esto con otra distro, se puede usar un sistema de ficheros más moderno como ext4. Aquí hay que formatear todas las particiones que se hayan creado nuevas para copiar LFS en ellas. Ojo con los nombres de los dispositivos, no nos vayamos a equivocar y formateemos las originales. :) La swap sólo la crearemos si no está ya en uso. Esto lo podemos comprobar mediante el comando cat /proc/swaps. Si la swap ya está en uso, omitimos el comando mkswap.
# mkfs.ext3 /dev/sda1
# mkswap /dev/sda3
Ahora creamos un punto de montaje para la partición original y otro para la partición destino que acabamos de crear. Solo es necesario crear puntos de montaje para las particiones correspondientes a los sistemas de ficheros raíz. Las demás, en caso de que las tengamos, las montaremos dentro. En mi caso, la partición original que estoy copiando es sdb3.
# mkdir sda1 sdb3
# mount /dev/sda1 sda1
# mount /dev/sdb3 sdb3
Si tenemos más particiones, por ejemplo para /home, ahora es cuando viene el momento de montarlas todas en sus puntos correspondientes. Tanto las particiones originales como las que estamos usando como copia. En el caso de las de copia, habrá que crear los directorios correspondientes a cada punto de montaje, ya que estamos usando una partición recién formateada. Por ejemplo, para montar sda2 como partición home de nuestro destino de copia sería así:
# mkdir sda1/home
# mount /dev/sda2 sda1/home
De la misma manera, si tenemos una partición home en nuestro LFS original, por ejemplo sdb2, tenemos que montarla con un comando como este:
# mount /dev/sdb2 sdb3/home
Una vez montadas las particiones, hay que lanzar el comando mágico. Lo que vamos a hacer es copiar todos los ficheros del USB original al disco duro de destino.
# cp -a sdb3/* sda1
El parámetro -a sirve para que haga la copia recursivamente y respetando el propietario, el grupo y los permisos de los ficheros. Esto es importante para que después funcione todo. Ojo también con el * que hay que poner detrás de sdb3, ya que lo que queremos es que nos copie todos los ficheros y directorios que hay dentro de sdb3 en sda1. Si no ponemos el * nos creará un directorio sda1/sdb3 que no es lo que queremos.
Ahora viene la parte más delicada. Hemos copiado todos los ficheros, pero falta configurar el arranque. Y hay que tener en cuenta que el fstab y el fichero de configuración de los gestores de arranque tienen el UUID de la partición raíz original, así que hay que cambiarlos por los de la nueva. Nos encargaremos primero de ajustar estos UUID. Para ello, lo primero es averiguar el UUID de las particiones necesarias, que son las que aparezcan en el fstab. En mi caso son la raíz y la swap.
# cat sda1/etc/fstab
/dev/disk/by-uuid/dd02b529-840e-4ffa-9433-e2709dffd81c      /            ext3     defaults            1     1
/dev/disk/by-uuid/340b50a5-3b52-4b22-b86d-ff211511fc03      swap         swap     pri=1               0     0
proc           /proc        proc     nosuid,noexec,nodev 0     0
sysfs          /sys         sysfs    nosuid,noexec,nodev 0     0
devpts         /dev/pts     devpts   gid=5,mode=620      0     0
tmpfs          /run         tmpfs    defaults            0     0
devtmpfs       /dev         devtmpfs mode=0755,nosuid    0     0
Ahora vamos a ver cuales son los UUID que necesitamos.
# ls -l /dev/disk/by-uuid
total 0
lrwxrwxrwx 1 root root 10 Jun 29 11:39 729d1fb7-7fc1-4eef-a527-d3c5c7d83ec7 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jun 29 11:39 74ff127c-eb6c-4058-8e7e-daa1af7a83c2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Jun 29 11:39 cca4dea8-13d0-47f6-9046-11881a612312 -> ../../sda3
Ya podemos editar el fstab y poner los UUID adecuados.
/dev/disk/by-uuid/729d1fb7-7fc1-4eef-a527-d3c5c7d83ec7      /            ext3     defaults            1     1
/dev/disk/by-uuid/cca4dea8-13d0-47f6-9046-11881a612312      swap         swap     pri=1               0     0
proc           /proc        proc     nosuid,noexec,nodev 0     0
sysfs          /sys         sysfs    nosuid,noexec,nodev 0     0
devpts         /dev/pts     devpts   gid=5,mode=620      0     0
tmpfs          /run         tmpfs    defaults            0     0
devtmpfs       /dev         devtmpfs mode=0755,nosuid    0     0
El siguiente paso es modificar el fichero de configuración del gestor de arranque que estemos usando para adaptarlo al nuevo UUID. En caso de tener varios kernels habrá que modificar las entradas correspondientes a cada kernel y poner el UUID correcto en todas ellas.
Si usamos grub, en LFS el fichero de configuración estará montado en sda1/boot/grub/grub.cfg. Si estamos haciendo esto con otra distro, este fichero de configuración estará generado automáticamente, así que no será necesario modificarlo. Generará uno nuevo cuando reinstalemos el grub. Para LFS, este es un ejemplo de cómo tienen que quedar las entradas del grub:
menuentry "GNU/Linux, Linux 3.5.2-lfs-7.2" {
        linux   /boot/vmlinuz-3.5.2-lfs-7.2 root=UUID=729d1fb7-7fc1-4eef-a527-d3c5c7d83ec7 ro
        initrd  /boot/initrd.cpio.gz
}
Si estamos usando syslinux, el fichero de configuración es sda1/boot/extlinux/extlinux.conf y debemos dejar sus entradas de una forma parecida a esta:
LABEL lfs
        LINUX ../vmlinuz-3.5.2-lfs-7.2
        APPEND root=UUID=729d1fb7-7fc1-4eef-a527-d3c5c7d83ec7 ro
        INITRD ../initrd.cpio.gz
Ahora hay que reinstalar el gestor de arranque. Si en el equipo que estamos instalando hay otra distro, lo más fácil es actualizar el gestor de aranque de esa distro y que nos autodetecte LFS. La forma de hacerlo depende de la distro, pero suele hacerse con update-grub. En otros casos habrá que hacerlo de forma manual, así que lo primero que tenemos que hacer es montar un chroot para entrar en la partición que acabamos de copiar y poder lanzar comandos desde ella.
# mount -B /dev sda1/dev
# mount -t devpts devpts sda1/dev/pts
# mount -t proc proc sda1/proc
# mount -t sysfs sysfs sda1/sys
# mount -t tmpfs shm sda1/dev/shm
# chroot sda1 bash
Una vez dentro del chroot. Instalamos el gestor de arranque. Para grub:
# grub-install /dev/sda
Ojo con el nombre del dispositivo. Tiene que ser el disco duro en el que hemos copiado nuestro LFS, pero sin el número de partición.
Para variar, con grub no me funciona. Si alguien sabe por qué, agradezco que me lo indique en los comentarios. Pongo las instrucciones para hacerlo con syslinux:
# extlinux -i /boot/extlinux
# cat /usr/share/syslinux/mbr.bin > /dev/sda
Y con syslinux me ha funcionado a la primera. Una vez instalado el gestor de arranque hay que salir del chroot y desmontar todo.
# exit
# umount sda1/{dev/shm,sys,proc,dev/pts,dev}
# umount sda1 sdb3
# rmdir sda1 sdb3
Ahora ya podemos reiniciar y comprobar que la máquina arranca con nuestro LFS. Si hemos compilado un kernel distinto para cada máquina, no nos olvidemos de arrancar con el kernel correcto.

2. Copiar nuestro sistema a USB y aplicar el caso 1.

La idea es simple. Se trata de hacer lo que hemos hecho en el caso 1 pero al revés. De manera que en vez de copiar nuestro sistema de un LiveUSB a un disco duro, primero lo copiamos del disco duro a un LiveUSB, que además nos lo podemos quedar para usarlo como disco de rescate, y luego seguimos las instrucciones del caso 1 para volver a copiarlo al disco duro de destino.
No voy a poner las instrucciones paso por paso, porque son iguales que las del caso 1. Solo hay que tener cuidado de no equivocarnos con los dispositivos. Recordad que habría que seguir las instrucciones dos veces. Primero para copiar el sistema del disco duro al USB y luego para volver a copiarlo del USB al otro disco duro.

3. De disco duro a disco duro.

Se trata de otra idea sencilla. Seguir las instrucciones del caso 1 para copiar el sistema directamente de un disco duro a otro. Esto lo he hecho muchas veces para copiar un sistema de una máquina a otra y, si se hace con cuidado de no equivocarse, funciona sin problemas. Si se hace bien tendría que funcionar con cualquier distro y con cualquier sistema operativo que esté bien diseñado. Windows no sirve. La última versión de Windows en la que me funcionó esto fue Windows ME.
La chicha que tiene este caso es que, para poder hacerlo, los dos discos duros tienen que estar conectados a la misma máquina, lo que significa que hay que abrir las máquinas y enchufar el disco duro de destino en la máquina en la que tenemos nuestro sistema, o al revés. Se puede hacer enchufándolo directamente en la placa o utilizando alguna caja USB.
Las instrucciones para hacer esto también serían las mismas que las del caso 1, así que no las voy a poner. Simplemente hay que adaptarlas al caso concreto de cada uno teniendo especial cuidado con los nombres de los dispositivos.

EOF

Tomado de: http://wrongshell.wordpress.com/2013/07/06/linux-from-scratch-copiar-nuestra-instalacion-en-otra-maquina/

No hay comentarios:

Publicar un comentario