Inicializacion de maquina sin disco utilizando iscsi en debian squeeze
El objetivo principal es emplear el arranque por red (network booting) en una maquina sin disco para cargar el sistema operativo desde un servidor utilizando el protocolo iSCSI para conectar a un dispositivo SCSI (target).
Para preparar dicho servidor en este caso se utilizará:
- SCSI target (Maquina Virtual Xen 1)
- SCSI Initiator (Maquina Virtual Xen 2 - para pruebas)
- Servidor TFTP (Maquina Virtual Xen 2)
- Servidor DHCP (Maquina Virtual Xen 2)
Maquina sin disco (Maquina VirtualBox)
El arranque por red es el proceso de arranque de la maquina desde una red en vez de un disco local, las maquinas por lo general proporcionan una opción en sus firmware para arrancar desde la red (Preboot Execution Environment - PXE); con el objetivo principal de conectarse a un disco de red vía NetBoot. El software inicial se carga desde un servidor en la red, generalmente hecho usando TFTP. El servidor del cual se carga el software inicial es generalmente encontrado por una solicitud DHCP. [1] [2] [3]
Tabla de Contenidos
- Inicializacion de maquina sin disco utilizando iscsi en debian squeeze
Instalación del software de soporte de iSCSI para el Target (Servidor)
iSCSI es un protocolo de la capa de transporte. iSCSI permite a un computador utilizar un iniciador iSCSI (initiator) para conectar a un dispositivo SCSI (target) como puede ser un disco duro en una red. [4] [5]
- Preparar los dispositivos de almacenamiento que constituirán los LUN (volúmenes lógicos, particiones, etc.).
- Crea un volumen lógico y sus particiones (Dependiendo de los requerimientos):
lvcreate --name [LogicalVolumeName] --size [LogicalVolumeSize] [VolumeGroupName] lvcreate --name lvm3 --size 3G vg1 parted [device] mklabel [label-type] >> parted /dev/vg1/lvm3 mklabel msdos #Se crean dos particiones para /boot y para el grupo de volúmenes lógicos (/home, /, /swap..) parted [device] mkpart [part-type] [start] [end] >> parted /dev/vg1/lvm3 mkpart primary 63s 262143s >> parted /dev/vg1/lvm3 mkpart primary 262144s 6291455s >> parted /dev/vg1/lvm3 set 2 lvm on
- Crea un volumen lógico y sus particiones (Dependiendo de los requerimientos):
- Instalar los siguientes paquetes:
linux-headers-uname -r
iscsitarget
iscsi-dkms
- Establecer la IP en la que escuchará el target (IP del servidor):
ietd -a X.X.X.X
Editar el archivo de configuración /etc/iet/ietd.conf (Descomentar las siguientes lineas y agregar la informacón correspondiente):
# Authentication for discovery sessions. IncomingUser [username] [password] OutgoingUser [username] [password] # Targets definitions start with "Target" and the target name. Target iqn.2012-07.com.prueba:disk1 #Referencia http://www.ietf.org/rfc/rfc3720.txt # Authentication for Target. IncomingUser [username] [password] OutgoingUser [username] [password] # Logical Unit definition. Lun 0 Path=/dev/vg1/lvm3,Type=fileio
Establecer la configuración para el control de acceso al Target en los archivos /etc/iet/initiators.allow /etc/iet/targets.allow
iqn.2012-07.com.prueba:disk1 [Direccion de red / Mascara]
- Habilitar el inicio del duende en el archivo /etc/default/iscsitarget:
ISCSITARGET_ENABLE=true
- Iniciar/Reiniciar el servicio:
/etc/init.d/iscsitarget start
Instalación del software de soporte de iSCSI para el Initiator (Cliente de prueba)
Instalar el paquete open-iscsi
Configurar las siguientes directivas en /etc/iscsi/iscsid.conf
# To request that the iscsi initd scripts startup a session set to "automatic". node.startup = automatic # To enable CHAP authentication set node.session.auth.authmethod node.session.auth.authmethod = CHAP # Authentication by the target(s) node.session.auth.username = [username] node.session.auth.password = [password] # Authentication by the initiator node.session.auth.username_in = [username] node.session.auth.password_in = [password] # To enable CHAP authentication for a discovery session to the target discovery.sendtargets.auth.authmethod = CHAP # Authentication by the target(s) discovery.sendtargets.auth.username = [username] discovery.sendtargets.auth.password = [password] # Authentication by the initiator discovery.sendtargets.auth.username_in = [username] discovery.sendtargets.auth.password_in = [password]
- Iniciar/Reiniciar el servicio:
/etc/init.d/open-iscsi start
- Detección del Target
- Discovery: En este modo se pueden descubrir targets y agregarlos a la base de datos.
iscsiadm --mode discovery --type sendtargets --portal [IP del Target]
- Node: En este modo se administran los targets ya descubiertos y se pueden visualizar datos acerca de estos nodos, así como conectarse a ellos.
iscsiadm --mode node --targetname [TargetName] --portal [IP del Target] --login
- Comprobar la conexión dispositivo:
parted /dev/sda unit s print
ls /dev/s*
- Establecer la conexión automática con el target (si asi lo requiere):
iscsiadm --mode node --targetname [TargetName] --portal [IP del Target] --op=update --name=node.startup --value=automatic
- Discovery: En este modo se pueden descubrir targets y agregarlos a la base de datos.
Preperación de arranque por red (iPXE Booting) desde un dispositivo iSCSI
Servidor TFTP
Instalar el paquete tftpd ó tftp-hpa
- Crear el directorio que contedrá los archivos para transferir, y cambiar los permisos. Ejemplo:
mkdir /srv/tftp
chmod 777 /srv/tftp
mkdir /srv/tftp/debianamd64
Descomentar la siguiente linea en el archivo de configuración /etc/inetd.conf y agregar el directorio creado:
<service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftp Especificando otros argumentos como una direccion IP especifica por donde escuchara las peticiones:
tftp dgram udp4 wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 --bind-address [x.x.x.x] /srv/tftp
Descargar el paquete debian installer-amd64 y moverlo al directorio del servidor tftp /srv/tftp:
- Desde el repositorio:
aptitude search debian-installer
aptitude install debian-installer-6.0-netboot-amd64
La imagenes están en /usr/lib/debian-installer/images/amd64/text/.
- Realizar cambios en los archivos de instalación:
Crear un directorio en /usr/lib/debian-installer/images/amd64/text/
mkdir -p /usr/lib/debian-installer/images/amd64/text/debian-installer/amd64
- Crear los siguientes enlaces desde el directorio creado anteriormente:
ln -s ../../boot-screens /usr/lib/debian-installer/images/amd64/text/debian-installer/amd64/
ln -s ../../initrd.gz /usr/lib/debian-installer/images/amd64/text/debian-installer/amd64/
ln -s ../../linux /usr/lib/debian-installer/images/amd64/text/debian-installer/amd64/
- Crear un enlace simbólico desde el directorio del servidor tftp hacia el directorio donde se encuentra debian-installer amd64:
ln -s /usr/lib/debian-installer/images/amd64/text/ /srv/tftp/debianamd64/
- La ruta del archivo de arranque pxelinux.0 está:
/srv/tftp/debianamd64/text/pxelinux.0
- Desde el repositorio:
Servidor DHCP
Instalar el paquete dhcp3-server
Modificar el archivo de configuración /etc/dhcp/dhcpd.conf descomentando y agragando las siguientes lineas:
allow booting; allow bootp; subnet [Dirección de red] netmask [Mascara de red] { range X.X.X.X X.X.X.X ; #Rango de direcciones IP que se publicarán por DHCP option domain-name-servers X.X.X.X; option routers X.X.X.X; default-lease-time 600; max-lease-time 7200; } group { next-server X.X.X.X; host [HostName] { hardware ethernet 00:00:00:00:00:00; fixed-address X.X.X.X; filename "/srv/tftp/debianamd64/text/pxelinux.0"; #Ruta donde se encuentra el archivo para el arranque desde el servidor con el sistema Entorno de ejecución de Pre-arranque } }
Maquina cliente sin disco arranque por red
- Configurar la maquina cliente sin disco para que arranque por red.
- En virtualbox es necesario instalar el siguiente paquete para el PXE:
wget http://download.virtualbox.org/virtualbox/4.1.18/Oracle_VM_VirtualBox_Extension_Pack-4.1.18-78361.vbox-extpack
- En el instalador se seleccionará la instalación mediante modo experto, para realizar otro tipos de configuraciones (como la detección del dispositivo iSCSI)
- Pasos para la instalación del S.O:
Cambiar lenguaje >> Spanish >> Venezuela (Opcional) >> Configurar la localización >> Venezuela es_VE.UTF-8 >> Localizaciones adiciones >> Niguna (Opcional).
Eligir la distribución del teclado >> Teclado de tipo pc >> Español
Detección del hardware de red >> Modulos a cargar >> El que esta seleccionado por defecto >> Algún hardware PCMCIA (dejar en blanco) >> Continuar
Configurar la red >> Por dhcp (SI) >> Nombre de la maquina (xxxx) >> Nombre de domino (cenditel)
Escoja una réplica de debian >> http >> Introducir información manualmente >> Nombre del servidor (debian.cenditel) >> DIrectorio de réplica (/debian/) >> Proxy (dejar en blanco) >> continuar
Elegir versión de Debian a instalar >> Squeeze (estable)
Descargar componentos del instalador >> Seleccionar para particiones y LVM:
- Crypt-dm-modules
- Crypto-modules
- Lvmcfg: Configure the Local Volumen Manager
- Parted- udeb
- Partman-reiserfs
Configurar usuarios y contraseñas >> Habilito las contraseñas ocultas-shadow (NO) >> Permitir accesor como superusuario -root- (SI) >> Clave de superusuario [xxxx] >> Crear una cuenta de usuario normal (SI) >> Nombre completo para el usuario [xxxx] >> Nombre de usuario para la cuenta [xxxx] >> Contraseña para el nuevo usuario [xxxx]
Configurar el reloj >> Fijar la hora con NTP (SI) >> Servidor NTP a usar [ntp.cenditel] >> Seleccione su zona horaria (America/Caracas)
- Se debe saltar la opción detectar disco, debido a que la maquina no tiene. Ir a la opción Ejecutar intérprete de órdenes:
- Se debe instalar el sistema base con debootstrap:
- Crear un directorio donde se instalará el sistema base:
mkdir /destino
debootstrap [suite] [directorio] [mirror] >> debootstrap squeeze /destino http://debian.cenditel/debian/
- Montar el nuevo sistema instalado:
mount --bind /dev /destino/dev
mount --bind /proc /destino/proc
mount --bind /sys /destino/sys
- Crear un directorio donde se instalará el sistema base:
- Abrir el terminal:
chroot /destino /bin/bash
- Instalar open-iscsi para la conexión al dispositivo iSCSI
aptitude install open-iscsi
Configurar el archivo /etc/iscsi/iscsi.conf como se realizó en la parte de http://wiki.cenditel.gob.ve/wiki/infra_red/iscsi_squeeze_arranque#Instalaci.2BAPM-n_del_software_de_soporte_de_iSCSI_para_el_Initiator_.28Cliente_de_prueba.29
- Instalar el kernel y agregar el modulo de iscsi:
aptitude search linux-image aptitude install linux-image-2.6.32-5-adm64 #El kernel depende del modulo ISCSI modprobe scsi_transport_iscsi
- Reiniciar el open-iscsi y realizar la conexión con el target.
- Liberar memoria RAM al menos 250MB
- Salir de la linea de comandos para regresar al menú de instalación
- Se debe instalar el sistema base con debootstrap:
- Detectar discos.
Particiones de discos: Se detectan las dos particiones ejecutadas en http://wiki.cenditel.gob.ve/wiki/infra_red/iscsi_squeeze_arranque#Instalaci.2BAPM-n_del_software_de_soporte_de_iSCSI_para_el_Target_.28Servidor.29 :
- Se asigana el sistema de ficheros para finalizar las particiones:
La primera partición (Sda1) >> Para /boot de 128MB
La segunda partición (Sda2) >> Esta asignada para volúmenes lógicos (LVM):
- Se crea un grupo de volumenes con los siguientes volúmenes lógicos:
- /swap de 512MB
- / de 1.2GB
- /home de 298MB.
- Se crea un grupo de volumenes con los siguientes volúmenes lógicos:
- Se asigana el sistema de ficheros para finalizar las particiones:
Instalar el sistema base >> Elija el núcleo a instalar: Seleccionar >> linux-image-2.6-amd64 >> Controladores a incluir en initrd (opción incluir todo los controladores disponibles)
- Configurar el gestor de paquetes.
- Seleccionar e instalar programas
- Instalar el cargador de arranque GRUB
- NO TERMINAR LA INSTALACION, Configurar el proceso de initrd para la conexión del dispositivo iSCSI
- Ir a la consola de comandos
- Revisar que todos el dispositivo este montado con
df
- Abrir el terminal:
chroot /target /bin/bash
Instalar los siguientes paquetes: initramfs-tools y open-iscsi
- Agregar iSCSI en los modulos de initramfs:
echo iscsi >> /etc/initramfs-tools/modules
Agregar el nombre del iniciador en /etc/iscsi/initiatiorname.iscsi
echo InitiatorName=iqn.2012-08.com.laurac:01:712b532ec15a >> /etc/iscsi/initiatorname.iscsi
- Crear el siguiente archivo para que se incluya el nuevo initrd:
touch /etc/iscsi/iscsi.initramfs
Agragar al archivo /etc/default/grub en la siguiente linea la opción de DHCP:
GRUB_CMDLINE_LINUX_DEFAULT="quiet ip=dhcp"
Agragar los datos del Target en /etc/iscsi/iscsi.initramfs
ISCSI_TARGET_NAME=iqn.2012-08.com.laura:mydisk ISCSI_TARGET_IP=X.X.X.X ISCSI_USERNAME=XXXX ISCSI_PASSWORD=XXXXX ISCSI_IN_USERNAME=XXXX ISCSI_IN_PASSWORD=XXXXX
- Actualizar el initramfs y el GRUB
update-initramfs -u
update-grub
- Si se desea revisar la nueva configuración de initrd, realizar lo siguiente:
cd root
mkdir initnew
cd initnew
zcat /boot/initrd.img-2.6.32-5-amd64 | cpio -idv
cat etc/iscsi.initramfs
cat etc/initiatorname.iscsi
- Terminar la instalación
- Modificar el servidor DHCP con iPXE:
- Instalar el paquete de iPXE en el servidor:
aptitude search ipxe
aptitude install ipxe
ls -l /usr/lib/ipxe/undionly.kpxe #Buscar la ruta del archivo undionly.kpxe
ln -s /usr/lib/ipxe/undionly.kpxe /srv/tftp/ipxe #Realizar un enlace simbolico hacia el directorio donde se va a publicar por el servidor tftp
Agragar al arichivo de configuración /etc/dhcp/dhcpd.conf las siguientes opciones (Referencia www.ipxe.org):
#Opciones para ipxe option space ipxe; option ipxe.username code 190 = string; option ipxe.password code 191 = string; option ipxe.reverse-username code 192 = string; option ipxe.reverse-password code 193 = string; option iscsi-initiator-iqn code 203 = string;
- Modficar los que se publica por DHCP a la maquina cliente:
- Instalar el paquete de iPXE en el servidor:
Antes:
group { next-server X.X.X.X; host [HostName] { hardware ethernet 00:00:00:00:00:00; fixed-address X.X.X.X; filename "/srv/tftp/debianamd64/text/pxelinux.0"; #Ruta donde se encuentra el archivo para el arranque desde el servidor con el sistema Entorno de ejecución de Pre-arranque } }
Ahora:
group { next-server X.X.X.X; host [HostName] { hardware ethernet 00:00:00:00:00:00; fixed-address X.X.X.X; if exists user-class and option user-class = "iPXE" { filename ""; option root-path "iscsi:X.X.X.X::::iqn.2012-07.com.prueba:disk1"; #X.X.X.X es IP del servidor que publica el Target option ipxe.username "[username]"; option ipxe.password "[password]"; option ipxe.reverse-username "[username]"; option ipxe.reverse-password "[password]"; } else { filename "/srv/tftp/ipxe/undionly.kpxe"; } }
- Iniciar la maquina cliente:
- Recibe la IP mediante dhcp.
- Recibe en el archivo de iPXE y los datos correspondiente del dispositivo iSCSI.
Revisar el nombre del iniciador creado por open-iscsi en /etc/iscsi/initiatorname.iscsi
- Actualizar el initramfs:
update-initramfs -u
- Revisar si el nombre del iniciador esta en initrd:
mkdir initnew
cd initnew
zcat /boot/initrd.img-2.6.32-5-amd64 | cpio -idv
cat etc/iscsi.initramfs
cat etc/initiatorname.iscsi
- Ya tienes el dispositivo con el sistema operativo debian squeeze publicado mediante el protocolo iSCSI y DHCP a una maquina cliente sin disco.
Referencias Bibliograficas
[1] http://www.debian.org/distrib/netinst
[2] http://wiki.debian.org/PXEBootInstall
[3] http://www.syslinux.org/wiki/index.php/PXELINUX