A veces, quienes tenemos que administrar servidores dedicados a diario, tenemos nuestras preferencias en lo referente al sistema operativo que nos gusta utilizar. El problema surge cuando el proveedor donde los tenemos alojados nos limita de alguna forma el abanico de opciones en cuanto a sistemas operativos se refiere.
Habitualmente uso Debian en mi ordenador de escritorio, y tenía ganas de probarlo al menos en uno de mis servidores en producción. El problema es que el principal proveedor con el que trabajo limita la elección a CentOS, FreeBSD o Windows.
Así que tuve que ponerme manos a la obra y empezar a buscar información sobre como instalar Debian, partiendo de CentOS, en un servidor situado a varios miles de kilómetros. Evidentemente coger un DVD de instalación y tomar un avión no era una opción aceptable.
Encontré un manual escrito por Erik Jacobson que, aunque algo desfasado, ya que data de 2003, contenía la base de la información que precisamente estaba buscando.
Explicación del proceso:
Partiendo de un servidor con CentOS, utilizaremos una herramienta llamada debootstrap, que nos permite instalar cualquier versión de Debian en un entorno chroot. Utilizaremos la partición swap para crear el chroot con Debian y, a partir de ahí, le añadiremos los paquetes necesarios para tener una instalación funcional. Configuraremos grub para hacer un primer reinicio ya en Debian, pasaremos la instalación temporal de éste desde la partición swap a la partición principal, configuraremos de nuevo grub para que arranque ya con la partición principal y, tras un último reinicio volveremos a restaurar la partición swap. El resultado será una flamante instalación, limpia, de Debian en una máquina en la que partíamos de CentOS.
Aunque no lo he probado, este proceso debería de poderse reproducir con cualquier otra distribución de Linux, especialmente las basadas en paquetes rpm.
Como mínimo, para instalar temporalmente el chroot, necesitamos una partición, que no sea la principal y que tenga al menos 500MB. En este caso usaremos swap al estar en una partición independiente.
Aviso:
Vamos a trabajar remotamente en un servidor al que no tenemos acceso físico. Esto implica que si algo va mal, necesitaremos ayuda de alguien que tenga acceso directo a la máquina. Por lo general el servicio técnico de la mayoría de los proveedores, nos cobrará una cantidad de dinero si tienen que intervenir para arreglar algún “destrozo” que hayamos causado o para reinstalar el sistema operativo original. Posiblemente si ellos te pueden instalar Debian directamente, por un precio razonable, deberías considerar esa opción antes de meterte en esta aventura.
1. - Particionado provisional:
Para empezar, vamos a acceder al servidor como root mediante ssh.
home:~# ssh root@servidor
Lo primero que haremos será desactivar la partición swap.
[root@servidor ~]# swapoff -a
Ahora vamos a comprobar las particiones que tenemos disponibles en el disco principal. Escribimos (suponiendo que partimos de un disco SCSI o SATA. Si fuese IDE el nombre de la unidad sería hda en vez de sda):
[root@servidor ~]# fdisk /dev/sda
Y nos aparece una pantalla similar a la siguiente:
The number of cylinders for this disk is set to 8924.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help):
en la última línea, donde nos pide escribir un comando, ponemos p y le damos a intro:
Command (m for help): p
Disk /dev/sda: 73.4 GB, 73407820800 bytes
255 heads, 63 sectors/track, 8924 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 267 2040255 82 Linux swap / Solaris
/dev/sda3 268 8924 69537352+ 83 Linux
Command (m for help):
Bajo la columna Device tenemos las tres particiones en las que está dividida la unidad: sda1, sda2 y sda3 en mi caso particular. Lógicamente en cada caso las particiones pueden ser distintas.
Tomamos nota de esta información ya que a lo largo de la tarea nos va a ser útil. Vemos que la partición usada para swap es la sda2. Las otras dos son particiones tipo Linux.
Bien, es el momento de convertir la partición sda2 en tipo Linux también. Para eso escribimos el comando t y pulsamos intro. Entonces nos pide el número de partición que modificaremos y, en este caso, le diremos 2. Posteriormente nos pide el hex code y pondremos 83. Para finalizar escribiremos w para escribir los cambios:
Command (m for help): t
Partition number (1-3): 2
Hex code (type L to list codes): 83
Changed system type of partition 2 to 83 (Linux)
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
Con esto salimos de fdisk habiendo ya convertido, provisionalmente, la partición swap en partición Linux.
Ahora llegó el momento de darle formato. En mi caso he usado el sistema de archivos ext3, aunque podrías usar cualquier otro soportado.
[root@servidor ~]# mke2fs -j /dev/sda2
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (long=2)
Fragment size=4096 (long=2)
255488 inodes, 510063 blocks
….. ….. ….. …..
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 27 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
Ya tenemos convertida la partición swap a linux y formateada en ext3. Ahora toca montarla:
[root@servidor ~]# mkdir /debian
[root@servidor ~]# mount /dev/sda2 /debian
2. - Creación del chroot:
Para crear el chroot en la partición provisional que hemos creado, necesitamos la herramienta debootstrap que viene en las distribuciones Debian.
Como estamos, por el momento, trabajando desde un CentOS, basado en paquetes rpm, el paquete debootstrap de Debian no nos sirve, y lo que es peor, CentOS no trae ningún paquete debootstrap.
Así que la única solución que nos queda es crearlo nosotros mismos. Afortunadamente, si dispones de un ordenador ya con Debian, el proceso será fácil. Instala con apt-get o aptitude el paquete alien en tu máquina Debian (aptitude install alien). Luego de bajas la última versión de debootstrap desde cualquier repositorio de Debian y lo conviertes con alien en un paquete rpm: alien –to-rpm debootstrap_0.3.3.2etch1_all.deb El resultado es el paquete rpm debootstrap-0.3.3.2etch1-2.noarch.rpm.
De todos modos, puedes descargar desde aquí el paquete que yo mismo he creado para la versión Etch.
Luego lo subiremos e instalaremos en el servidor con CentOS:
[root@servidor ~]# rpm -ivh debootstrap-0.3.3.2etch1-2.noarch.rpm
Ahora ya podemos comenzar la instalación del chroot con Debian:
[root@servidor ~]# debootstrap –arch i386 etch /debian http://http.us.debian.org/debian
Con este comando pedimos que debootstrap descargue desde el mirror http://http.us.debian.org los paquetes base de la versión Etch en arquitectura i386 y los instale en el directorio /debian de nuestro servidor, que, recordemos, se corresponde a la partición provisional que hemos montado.
Esta operación tardará unos minutos mientras descarga, instala y configura los paquetes base de la distribución. Al final nos tiene que decir Base system installed successfully.
Es importante que comprobemos si en el chroot se ha creado el archivo resolv.conf con las entradas de los servidores DNS de nuestra máquina. Lo comprobaremos mirando en /debian/etc/resolv.conf. Si no existe o está vacio, entonces lo copiaremos del CentOS:
[root@servidor ~]# cp /etc/resolv.conf /debian/etc/resolv.conf
3. - Configuración del chroot:
En el chroot que creamos en el paso anterior tenemos instalados los paquetes base de un sistema Debian, pero por el momento nos corren con el Kernel del CentOS. Además tenemos que instalar y configurar algunos paquetes adicionales que vamos a necesitar.
Para empezar, entremos en el chroot:
[root@servidor ~]# chroot /debian /usr/bin/env -i HOME =/root \
> TERM=$TERM PS1=’\u:\w\$ ‘ PATH=/bin:/usr/bin:/sbin:/usr/sbin \
> /bin/bash –login
Ahora vamos a crear un archivo fstab, con el que montar las particiones, que nos sea útil para el nuevo sistema:
[root@servidor ~]# cat > /etc/fstab << “EOF”
> # <file system> <mount point> <type> <options> <dump> <pass>
> proc /proc proc defaults 0 0
> /dev/sda2 / ext3 defaults,errors=remount-ro 0 1
> /dev/sda1 /boot ext3 defaults 0 2
> EOF
Que la red funcione es esencial, ya que ella es el único acceso que tenemos a la máquina remota, así que vamos a configurarla.
En primer lugar vamos a abrir una segunda ventana de terminal y nos conectaremos por ssh con el servidor, fuera del chroot, para ejecutar el comando ifconfig con el que obtendremos los valores de address, broadcast y netmask:
[root@servidor ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:02:44:40:15:F0
inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::202:44ff:fe40:15f0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:23847761 errors:0 dropped:0 overruns:0 frame:0
TX packets:24393539 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3590596263 (3.3 GiB) TX bytes:3838914212 (3.5 GiB)
Interrupt:10 Base address:0xd800
Tomamos buena nota de ellos. En este ejemplo son address 192.168.1.3, broadcast 192.168.1.255 y netmask 255.255.255.0. Como es lógico en tu caso variarán, así que asegúrate de usar los correctos.
Aunque no es estrictamente necesario, también podemos obtener los valores de network y gateway ejecutando el siguiente comando desde la misma ventana:
[root@servidor ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
Aquí la primera ip que aparece bajo la interfaz eth0 será el valor de network, que en el ejemplo es 192.168.1.0, y la ip que aparece en la última linea bajo la columna Gateway, será el valor de gateway, aquí 192.168.1.1. Toma nota de estos valores.
Sabiendo esto, de nuevo en la primera ventana, con la que estamos dentro del chroot, configuramos la red con los valores obtenidos:
[root@servidor ~]# cat > /etc/network/interfaces << “EOF”
> # The loopback interface
> auto lo
> iface lo inet loopback
>
> # The first network card (network, broadcast and gateway are optional)
> auto eth0
> iface eth0 inet static
> address 192.168.1.3
> netmask 255.255.255.0
> network 192.168.1.0
> broadcast 192.168.1.255
> gateway 192.168.1.1
> EOF
También configuramos el hostname:
[root@servidor ~]# echo nombre.del.host > /etc/hostname
El valor de nombre.del.host será el nombre que le hallamos asignado a la máquina, por ejemplo host1.debian.org
Como por el momento el chroot nos funciona con el kernel de CentOS, descargamos e instalamos el kernel de Debian:
[root@servidor ~]# aptitude search linux-image
Este comando nos muestra una lista de kernels para diferentes arquitecturas y tipo de procesador. De ahí tenemos que seleccionar el más apropiado para la máquina en que vamos a usar Debian e instalarlo. En mi caso , y en este ejemplo, es linux-image-2.6.18-6-686.
[root@servidor ~]# aptitude install linux-image-2.6.18-6-686
Es posible que de algún mensaje de error durante la instalación del kernel. Simplemente ignoralos y continua hasta finalizarla. Si te pregunta en algún punto si deseas detener la instalación, le dices que no.
Llegó el momento de instalar algunos paquetes básicos y configurarlos:
[root@servidor ~]# aptitude install console-data locales initrd-tools ssh discover grub
Es posible que durante la instalación de estos paquetes tengas que configurar algunos, en caso contrario los configuramos ahora.
Primero vamos con el teclado:
[root@servidor ~]# dpkg-reconfigure console-data
Probablemente la mejor opción sería seleccionar Select keymap from arch list –> qwerty –> US american –> Standard –> Standard.
Después configuramos los “locales”
[root@servidor ~]# dpkg-reconfigure locales
Aquí lo normal sería seleccionar en_US.UTF-8 UTF-8 para inglés o es_ES.UTF-8 UTF-8 para español.
También configuramos la forma de almacenar las contraseñas de manera un poco más segura:
[root@servidor ~]# dpkg-reconfigure passwd
Aquí activaremos “shadow passwords” y crearemos una contraseña para el usuario root. De lo contrario más adelante no podremos acceder al servidor mediante ssh. Opcionalmente se puede crear un usuario sin privilegios.
Antes de salir del chroot vamos a asegurarnos que el kernel que hemos instalado soporta la tarjeta de red del servidor. De lo contrario tendremos un problema porque al reiniciarlo no estará disponible la red y, por tanto, nos quedaremos sin acceso a él.
[root@servidor ~]# discover
Este comando nos muestra una lista de dispositivos detectados. Tenemos que asegurarnos que la tarjeta de red se encuentra en la lista. Normalmente debería parecer una entrada del tipo “ethernet” o “network” o el nombre o modelo de la tarjeta ethernet. Insisto, es imprescindible que nos aseguremos que la tarjeta de red está en la lista o tendremos una máquina inaccesible al reiniciar.
Finalmente salimos del chroot:
[root@servidor ~]# logout
4. - Configuración de grub y 1er reinicio:
Bueno, ya estamos solo a un paso del primer momento crítico del proceso. En unos instantes vamos a hacer el primer reinicio. En él se espera que la máquina arranque ya en Debian, pero para que eso suceda, previamente tendremos que preparar correctamente el gestor de arranque, que hoy en día suele ser grub.
continuará…
0 Respuestas a “Instalación remota de Debian por ssh”
Añade un Comentario