# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

rhn_register y yum a través de un proxy


En el caso de necesitar registrar un sistema RHEL en la Red Hat Network y el equipo no tenga salida a Internet porque se encuentra en una red privada, existe la posibilidad de habilitar el acceso vía proxy. Para ello usamos el comando rhn_register como siempre, pero añadiendo el proxy como parámetro:

# rhn_register --nox --proxy=proxy:puerto
# rhn_register --nox --proxy=10.0.0.100:8080

Si el proxy requiere autenticación usamos los parámetros –proxyUser=PROXYUSER y –proxyPassword=PROXYPASSWORD.

Por otra parte, también necesitaremos utilizar yum para instalar aplicaciones o parchear el sistema una vez registrado. Para ello únicamente tenemos que especificar el proxy en el fichero de configuración de yum /etc/yum.conf:

proxy=http://10.0.0.100:8080/
proxy_username=usuario
proxy_password=password

La barra final parece ser necesaria, a mí no me funcionaba sin ella.

Cómo montar un servidor DHCP


Esta es una forma sencilla de instalar y configurar un servidor DHCP en una máquina Linux (Red-Hat, CentOS, Fedora). Voy a mostraros los pasos para hacerlo y una configuración básica para hacer funcionar el equipo como servidor DHCP.

DHCP (sigla en inglés de Dynamic Host Configuration Protocol – Protocolo Configuración Dinámica de Servidor) es un protocolo de red que permite a los nodos de una red IP obtener sus parámetros de configuración automáticamente. Se trata de un protocolo de tipo cliente/servidor en el que generalmente un servidor posee una lista de direcciones IP dinámicas y las va asignando a los clientes conforme éstas van estando libres, sabiendo en todo momento quién ha estado en posesión de esa IP, cuánto tiempo la ha tenido y a quién se la ha asignado después. (Wikipedia)

En primera instancia, instalamos el paquete necesario vía yum:

yum install dhcp.i586

Una vez instalado, podemos utilizar como base para el fichero de configuración el que nos ofrecen con la instalación. Incorpora comentarios sobre cada una de las opciones y configuraciones para hacer más sencilla la puesta en marcha del servicio:

cp /usr/share/doc/dhcp-4.1.0p1/dhcpd.conf.sample /etc/dhcp/dhcp.conf

El fichero de ejemplo es el siguiente:

# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#

# option definitions common to all supported networks...
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;

default-lease-time 600;
max-lease-time 7200;

# Use this to enble / disable dynamic dns updates globally.
#ddns-update-style none;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.

subnet 10.152.187.0 netmask 255.255.255.0 {
}

# This is a very basic subnet declaration.

subnet 10.254.239.0 netmask 255.255.255.224 {
 range 10.254.239.10 10.254.239.20;
 option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
}

# This declaration allows BOOTP clients to get dynamic addresses,
# which we don't really recommend.

subnet 10.254.239.32 netmask 255.255.255.224 {
 range dynamic-bootp 10.254.239.40 10.254.239.60;
 option broadcast-address 10.254.239.31;
 option routers rtr-239-32-1.example.org;
}

# A slightly different configuration for an internal subnet.
subnet 10.5.5.0 netmask 255.255.255.224 {
 range 10.5.5.26 10.5.5.30;
 option domain-name-servers ns1.internal.example.org;
 option domain-name "internal.example.org";
 option routers 10.5.5.1;
 option broadcast-address 10.5.5.31;
 default-lease-time 600;
 max-lease-time 7200;
}

# Hosts which require special configuration options can be listed in
# host statements.   If no address is specified, the address will be
# allocated dynamically (if possible), but the host-specific information
# will still come from the host declaration.

host passacaglia {
 hardware ethernet 0:0:c0:5d:bd:95;
 filename "vmunix.passacaglia";
 server-name "toccata.fugue.com";
}

# Fixed IP addresses can also be specified for hosts.   These addresses
# should not also be listed as being available for dynamic assignment.
# Hosts for which fixed IP addresses have been specified can boot using
# BOOTP or DHCP.   Hosts for which no fixed address is specified can only
# be booted with DHCP, unless there is an address range on the subnet
# to which a BOOTP client is connected which has the dynamic-bootp flag
# set.
host fantasia {
 hardware ethernet 08:00:07:26:c0:a5;
 fixed-address fantasia.fugue.com;
}

# You can declare a class of clients and then do address allocation
# based on that.   The example below shows a case where all clients
# in a certain class get addresses on the 10.17.224/24 subnet, and all
# other clients get addresses on the 10.0.29/24 subnet.

class "foo" {
 match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
}

shared-network 224-29 {
 subnet 10.17.224.0 netmask 255.255.255.0 {
   option routers rtr-224.example.org;
 }
 subnet 10.0.29.0 netmask 255.255.255.0 {
   option routers rtr-29.example.org;
 }
 pool {
   allow members of "foo";
   range 10.17.224.10 10.17.224.250;
 }
 pool {
   deny members of "foo";
   range 10.0.29.10 10.0.29.230;
 }
}

Veréis que es un fichero con muchísimas opciones, os dejo un ejemplo más sencillo. En el siguiente dhcp.conf utilizamos la interfaz de red eth0 para las tareas de DHCP, esta interfaz tiene configurada la red 192.168.0.0/24 (subnet), sobre la cual vamos a reservar las IPs desde la 192.168.0.200 a la 192.168.0.220 para las asignaciones DHCP (range).

Esto es lo más básico, respecto a las distintas opciones añadidas en el fichero sample de configuración véis especificado lo que es cada cosa:

ddns-update-style none;
ddns-updates off;
deny client-updates;
one-lease-per-client false;
allow bootp;
option T150 code 150 = string;

subnet 192.168.0.0 netmask 255.255.255.0 {
  interface eth0;
   range 192.168.0.200 192.168.0.220;
       option subnet-mask 255.255.255.0;
       default-lease-time 6000;
       max-lease-time 7200;
       option time-offset -3600;
}

Finalmente, arrancamos el servicio:

/etc/init.d/dhcp start

Y el log (en mi caso vuelca a messages):

Oct 23 19:35:37 sylv1006 dhcpd: Internet Systems Consortium DHCP Server 4.1.0p1
Oct 23 19:35:37 sylv1006 dhcpd: Copyright 2004-2009 Internet Systems Consortium.
Oct 23 19:35:37 sylv1006 dhcpd: All rights reserved.
Oct 23 19:35:37 sylv1006 dhcpd: For info, please visit http://www.isc.org/sw/dhcp/
Oct 23 19:35:37 sylv1006 dhcpd: Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file
Oct 23 19:35:47 sylv1006 dhcpd: Internet Systems Consortium DHCP Server 4.1.0p1
Oct 23 19:35:47 sylv1006 dhcpd: Copyright 2004-2009 Internet Systems Consortium.
Oct 23 19:35:47 sylv1006 dhcpd: All rights reserved.
Oct 23 19:35:47 sylv1006 dhcpd: For info, please visit http://www.isc.org/sw/dhcp/
Oct 23 19:35:47 sylv1006 dhcpd: Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file
Oct 23 19:35:47 sylv1006 dhcpd: Wrote 0 leases to leases file.
Oct 23 19:35:47 sylv1006 dhcpd: Listening on LPF/eth0/00:16:3e:1d:36:42/192.168.0.0/24
Oct 23 19:35:47 sylv1006 dhcpd: Sending on   LPF/eth0/00:16:3e:1d:36:42/192.168.0./24
Oct 23 19:35:47 sylv1006 dhcpd: Sending on   Socket/fallback/fallback-net

Ahora que todo funciona correctamente, podemos configurar DHCP para que arranque automáticamente:

chkconfig dhcpd on

CentOS & Red-Hat: Configurar interfaz de red para trabajar en Full Duplex con ETHTOOL_OPTS


Ya hace un tiempo os dije las distintas formas de configurar una interfaz de red en sistemas Red-Hat, CentOS y derivados. Yendo un poco más lejos es posible que necesitemos configurar la interfaz para que trabaje en un modo de transimisión determinado, por ejemplo Full Duplex, Half Duplex, etc. y con un determinado caudal, 100Mb 10Mb, etc.

Esto se puede configurar a través del parámetro ETHTOOL_OPTS, que debemos añadir dentro del fichero de configuración de la interfaz de red (ifcfg), ver manual de configuración de interfaz de red.

Os dejo un ejemplo de la línea que tendríamos que añadir al fichero de configuración de la interfaz para configurarla sin autonegociación, a una velocidad de 100Mb y en Full Duplex:

ETHTOOL_OPTS="autoneg off speed 100 duplex full"

Definiciones Wikipedia:

Full dúplex (dúplex)

Una simple ilustración de un sistema de comunicación full-duplex.

La mayoría de los sistemas y redes de comunicaciones modernos funcionan en modo dúplex permitiendo canales de envío y recepción simultáneos. Podemos conseguir esa simultaneidad de varias formas:

  • Empleo de frecuencias separadas (multiplexación en frecuencia)
  • Cables separados

Nota: No existen colisiones en Ethernet en el modo full-duplex.

Half dúplex (semidúplex)

Una simple ilustración de un sistema de comunicación half-duplex.

En ocasiones encontramos sistemas que pueden transmitir en los dos sentidos, pero no de forma simultánea. Puede darse el caso de una comunicación por equipos de radio, si los equipos no son full dúplex, uno no podría transmitir (hablar) si la otra persona está también transmitiendo (hablando) porque su equipo estaría recibiendo (escuchando) en ese momento. En radiodifusión, se da por hecho que todo duplex ha de poder ser bidireccional y simultáneo, pues de esta manera, se puede realizar un programa de radio desde dos estudios de lugares diferente.

RamDisk: Cómo usar la memoria RAM para crear un disco virtual


Un RamDisk es básicamente utilizar una parte de la memoria RAM como si fuera un disco duro / partición. El objetivo de esto es conseguir una velocidad de acceso a los datos mucho más rápida. El tiempo de acceso a la memoria RAM es mucho menor que el de un disco duro.

Voy a utilizar/traducir este tutorial, en el que con unos sencillos pasos conseguimos crear discos virtuales o RamDisk.

Vamos a utilizar un sistema Red Hat o derivado con un kernel 2.4.x

Paso 1: Revisar los ramdisks que hay actualmente creados en el sistema:

Por defecto, Red-Hat crea 16 ramdisk, pero no están activos ni utilizan memoria, así que podemos utilizarlos o reconfigurarlos según nuestras necesidades. Podéis revisarlos con el siguiente comando:

[root]# ls -l /dev/ram*
lrwxrwxrwx    1 root     root            4 Jun 12 00:31 /dev/ram -> ram1
brw-rw----    1 root     disk       1,   0 Jan 30  2003 /dev/ram0
brw-rw----    1 root     disk       1,   1 Jan 30  2003 /dev/ram1
brw-rw----    1 root     disk       1,  10 Jan 30  2003 /dev/ram10
brw-rw----    1 root     disk       1,  11 Jan 30  2003 /dev/ram11
brw-rw----    1 root     disk       1,  12 Jan 30  2003 /dev/ram12
brw-rw----    1 root     disk       1,  13 Jan 30  2003 /dev/ram13
brw-rw----    1 root     disk       1,  14 Jan 30  2003 /dev/ram14
brw-rw----    1 root     disk       1,  15 Jan 30  2003 /dev/ram15
brw-rw----    1 root     disk       1,  16 Jan 30  2003 /dev/ram16
brw-rw----    1 root     disk       1,  17 Jan 30  2003 /dev/ram17
brw-rw----    1 root     disk       1,  18 Jan 30  2003 /dev/ram18
brw-rw----    1 root     disk       1,  19 Jan 30  2003 /dev/ram19
brw-rw----    1 root     disk       1,   2 Jan 30  2003 /dev/ram2
brw-rw----    1 root     disk       1,   3 Jan 30  2003 /dev/ram3
brw-rw----    1 root     disk       1,   4 Jan 30  2003 /dev/ram4
brw-rw----    1 root     disk       1,   5 Jan 30  2003 /dev/ram5
brw-rw----    1 root     disk       1,   6 Jan 30  2003 /dev/ram6
brw-rw----    1 root     disk       1,   7 Jan 30  2003 /dev/ram7
brw-rw----    1 root     disk       1,   8 Jan 30  2003 /dev/ram8
brw-rw----    1 root     disk       1,   9 Jan 30  2003 /dev/ram9
lrwxrwxrwx    1 root     root            4 Jun 12 00:31 /dev/ramdisk -> ram0

Para averiguar el tamaño de cada disco (ramdisk) ejecutamos lo siguiente:

[root]# dmesg | grep RAMDISK
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
RAMDISK: Compressed image found at block 0

Paso 2: Incrementar el tamaño de cada ramdisk

Según para lo que lo vayáis a usar, 4 Mb puede ser muy poco, así que vamos a cambiar el tamaño de cada uno de estos “discos”, editamos el fichero de configuración del GRUB (/etc/grub.conf) y añadimos a la línea del kernel el tamaño que queremos para cada ramdisk:

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/hda5
#          initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.20-20.9)
        root (hd0,0)
        kernel /vmlinuz-2.4.20-20.9 ro root=LABEL=/ hdc=ide-scsi ramdisk_size=30000
        initrd /initrd-2.4.20-20.9.img

En este caso queremos cada disco de 30 Mb, es necesario reiniciar para que los cambios surtan efecto, una vez reiniciado, podemos comprobar que efectivamente ha cambiado el tamaño:

[root]# dmesg | grep RAMDISK
RAMDISK driver initialized: 16 RAM disks of 30000K size 1024 blocksize
RAMDISK: Compressed image found at block 0

Paso 3: Formatear el ramdisk a utilizar

Este paso hay que realizarlo para cada ramdisk que queramos utilizar, en este caso solo utilizamos uno, así que lo formateamos el primero (/dev/ram0), por ejemplo como ext2:

[root]# mke2fs -m 0 /dev/ram0
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
4000 inodes, 16000 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
2 block groups
8192 blocks per group, 8192 fragments per group
2000 inodes per group
Superblock backups stored on blocks:
        8193

Writing inode tables: done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 22 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

Paso 4: Crear el punto de montaje y montar el ramdisk

Esta parte es sencilla, creamos el punto de montaje y montamos seguidamente el disco:

[root]# mkdir /mnt/ramdisk
[root]# mount /dev/ram0 /mnt/ramdisk

Haciendo un df o mount podemos verificar que ha sido montado correctamente:

[root]# mount | grep ram0
/dev/ram0 on /mnt/ramdisk type ext2 (rw)
[root]# df -h | grep ram0
/dev/ram0              16M   13K   16M   1% /mnt/ramdisk

Paso 5: Usar el ramdisk

Poco hay que explicar aquí, ya podemos copiar ficheros, borrar, mover, etc al disco.

Paso 6: Automatizar la creación del ramdisk

Hay que recordar que esto es un disco dentro de la memoria RAM, por lo que con cada reinicio todo lo que haya en él se perderá, es recomendable no guardar ahí datos sensibles o que no sean temporales, para automatizar la creación del disco en el arranque podemos añadir las siguientes líneas al fichero /etc/rc.local:

# Formats, mounts, and sets permissions on my 16MB ramdisk
/sbin/mke2fs -q -m 0 /dev/ram0
/bin/mount /dev/ram0 /mnt/ramdisk

Con estos sencillos pasos podemos disfrutar de un disco virtual “ramdisk” en nuestra memoria RAM.