apt-get error: public key not available

Marzo 30, 2008

Este fin de semana me paso el siguiente error tras añadir una linea en el /etc/apt/sources.list:

# apt-get update
[...]
Reading package lists... Done
W: GPG error: http://www.virtualbox.org etch Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 390EC3FF927CCC73
W: You may want to run apt-get update to correct these problems

Tras buscar un poco por google, encontre como solucionar el error, importando la clave publica que faltaba, de la siguiente manera:

# gpg --keyserver hkp://subkeys.pgp.net --recv-keys 390EC3FF927CCC73
gpg: directory `/root/.gnupg' created
gpg: can't open `/gnupg/options.skel': No such file or directory
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: keyring `/root/.gnupg/pubring.gpg' created
gpg: requesting key 927CCC73 from hkp server subkeys.pgp.net
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 927CCC73: public key "innotek GmbH (archive signing key) " imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1
# gpg --export --armor 390EC3FF927CCC73 | apt-key add -
OK

Podemos verificar que la clave se ha importado con:

# apt-key list
/etc/apt/trusted.gpg
--------------------
[...]
pub   1024D/927CCC73 2007-06-04
uid                  innotek GmbH (archive signing key)
sub   2048g/F0C31E29 2007-06-04

Mirror de un lvol en LVM de Linux

Febrero 15, 2008

Para quien venga de HP-UX, resulta facil mirrorear un lvol bajo LVM: con un lvextend -m. En Linux, el lvextend -m simplemente no funciona…

De hecho el comando lvcreate si tiene una opcion -m, y esa si que funciona (lo he probado)! Pero con el lvextend no la coje.

Me he bajado las fuentes de lvm2. En commands.h he descubierto el comando lvconvert que no conocia:

alegrome# lvconvert
  Exactly one of --mirrors or --snapshot arguments required.
  lvconvert: Change logical volume layout

lvconvert [-m|--mirrors Mirrors [--corelog]]
        [--alloc AllocationPolicy]
        [-d|--debug]
        [-h|-?|--help]
        [-v|--verbose]
        [--version]
        LogicalVolume[Path] [PhysicalVolume[Path]...]

lvconvert [-s|--snapshot]
        [-c|--chunksize]
        [-d|--debug]
        [-h|-?|--help]
        [-v|--verbose]
        [-Z|--zero {y|n}]
        [--version]
        OriginalLogicalVolume[Path] SnapshotLogicalVolume[Path]

Este comando si que parece funcionar. Probemos a mirrorear un lvol:

# lvconvert -m 1 /dev/vg02/lvweb
  Logical volume lvweb converted.

Miremos con un lvdisplay lo que nos ha hecho el comando:

alegrome# lvdisplay -m lvweb
  --- Logical volume ---
  LV Name                /dev/vg02/lvweb
  VG Name                vg02
  LV UUID                9I4wK7-2hn7-j4dI-o5yT-ngYx-8Wtd-m3no6q
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                200.00 MB
  Current LE             50
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           253:6

  --- Segments ---
  Logical extent 0 to 49:
    Type                mirror
    Mirrors             2
    Mirror size         50
    Mirror log volume   lvweb_mlog
    Mirror region size  512.00 KB
    Mirror original:
      Logical volume    lvweb_mimage_0
      Logical extents   0 to 49
    Mirror destinations:
      Logical volume    lvweb_mimage_1
      Logical extents   0 to 49

A notar ahi: Type = mirror.

Como se puede ver, el lvweb ahora si esta en mirror. La verdad es que no he visto esto documentado en ningun sitio (¿alguien ha visto mas sobre esto?).

Para quitar el mirror (reducir), se haria asi:

# lvconvert -m 0 /dev/vg02/lvweb
  Logical volume lvweb converted.

# lvdisplay -m lvweb
  --- Logical volume ---
  LV Name                /dev/vg02/lvweb
  VG Name                vg02
  LV UUID                9I4wK7-2hn7-j4dI-o5yT-ngYx-8Wtd-m3no6q
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                200.00 MB
  Current LE             50
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           253:6

  --- Segments ---
  Logical extent 0 to 49:
    Type                linear
    Physical volume     /dev/hdh4
    Physical extents    18370 to 18419

Con lvs vemos el estado del mirrorring

alegrome# lvs lvweb
  LV     VG   Attr   LSize Origin Snap%  Move Log         Copy%
  lvweb  vg02 mwi-ao 200M                    lvweb_mlog   12.22

En Attr, la “m” es de mirror.

Este post viene originado por un comentario de Rubik a un post de Ivan sobre “Crear un raid 1 a partir de un disco con datos sin formatear“.. Gracias a ambos.


RHEL5, yum + proxy = Error

Febrero 7, 2008

En un RedHat EL 5, al hacer un yum con proxy recibo el siguente mensaje: “Error: Cannot open/read repomd.xml file for repository: rhel-i386-server-5″

# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5 (Tikanga)

# export http_proxy="http://localhost:8888"
# yum update
Loading "rhnplugin" plugin
Loading "installonlyn" plugin
Setting up Update Process
Setting up repositories
Error: Cannot open/read repomd.xml file for repository: rhel-i386-server-5

En el proxy recibimos lo siguiente:

[Fiddler] Request Header parsing failed. Request was:
43 4F 4E 4E 45 43 54 20 78 6D 6C 72 70 63 2E 72 68 6E 2E 72 65 64 68 61  CONNECT xmlrpc.rhn.redha
74 2E 63 6F 6D 3A 34 34 33 20 48 54 54 50 2F 31 2E 31 0D 0A 0D 0A        t.com:443 HTTP/1.1....

Encontre la solucion googleando un poco (solo una pagina hablaba de ello), pero probe la solucion y funciono:

It’s a bug in the crypto lib of python. It doesn’t add the HOST in the
headers of the HTTP/1.1.

Hay que editar el fichero /usr/lib/python2.4/site-packages/M2Crypto/httpslib.py en la maquina y añadir la linea siguiente entre las lineas 165 y 166:

msg = msg + "Host: %s:%d\\r\\n" % (self._real_host, self._real_port)

Quedando asi:

    def _get_connect_msg(self):
        """ Return an HTTP CONNECT request to send to the proxy. """
        msg = "CONNECT %s:%d HTTP/1.1\\r\\n" % (self._real_host, self._real_port)
        msg = msg + "Host: %s:%d\\r\\n" % (self._real_host, self._real_port)
        if self._proxy_auth:
            msg = msg + "%s: %s\\r\\n" % (self._AUTH_HEADER, self._proxy_auth)
        msg = msg + "\\r\\n"
        return msg

Una vez hecho esto, ya funciona bien:

# yum check-update
Loading "rhnplugin" plugin
Loading "installonlyn" plugin
Setting up repositories
rpmforge                  100% |=========================| 1.1 kB    00:00
rhel-i386-server-5        100% |=========================| 1.4 kB    00:00
Reading repository metadata in from local files
primary.xml.gz            100% |=========================| 1.5 MB    00:00
################################################## 6175/6175
primary.xml.gz            100% |=========================| 1.1 MB    00:05
################################################## 3219/3219

iSCSI entre una Solaris (Initiator) y un Linux (target)

Diciembre 12, 2007

Respondiendo al comentario de gonzo34 a ese post solicitando mas informacion sobre como usar iSCSI en Solaris, voy a poner aqui mis notas sobre el tema.

En el linux, que “exporta” por iSCSI el disco (o el lvol), instalamos el iSCSI Target. Una vez instalado, indicamos al demonio qué disco/lvol exportar (por ejemplo el /dev/vg01/lviscsi01):

# vi /etc/ietd.conf
#IncomingUser nwsmith secretsecret
Target iqn.2006-06.com.alegrome:storage.lvm
Lun 0 /dev/vg01/lviscsi01
Alias iscsitest01

Iniciamos el demonio (o lo reiniciamos):

# service iscsi-target start
Starting iSCSI target service:    [  OK  ]

Comprobamos que este arriba el demonio:

# netstat -ntlp | grep 3260
tcp  0  0  0.0.0.0:3260  0.0.0.0:*  LISTEN 3160/ietd
# tail /var/log/messages
Jan 14 15:59:02 server kernel: iSCSI Enterprise Target Software - version 0.4.5
Jan 14 15:59:02 server kernel: iotype_init(91) register fileio
Jan 14 15:59:03 server kernel: target_param(109) d 1 8192 262144 65536 2 20 8 0
Jan 14 15:59:03 server iscsi-target: ietd startup succeeded

alegrome# cat  /proc/net/iet/volume
tid:1 name:iqn.2006-06.com.alegrome:storage.lvm
        lun:0 state:0 iotype:fileio iomode:wt path:/dev/vg01/lviscsi01

Ahora en la solaris (cambiar IP por la IP del Linux):

# iscsiadm add discovery-address IP:3260

# iscsiadm modify discovery --sendtargets enable

# iscsiadm list discovery
Discovery:
        Static: disabled
        Send Targets: enabled
        iSNS: disabled

# devfsadm -v -i iscsi
devfsadm[752]: verbose: symlink /dev/dsk/c1t2d0s0 -> ../../devices/iscsi/disk@0000iqn.2006-06.com.alegrome%3Astorage.lvm0001,0:a
[...]

Ya vemos el disco con el format:

# format
Searching for disks...done

c1t2d0: configured with capacity of 1008.00MB

AVAILABLE DISK SELECTIONS:
       0. c0t0d0
          /pci@1f,0/pci@1,1/ide@3/dad@0,0
       1. c1t2d0
          /iscsi/disk@0000iqn.2006-06.com.alegrome%3Astorage.lvm0001,0
Specify disk (enter its number): ^D

Vemos los targets descubiertos:

# iscsiadm list target
Target: iqn.2006-06.com.alegrome:storage.lvm
        Alias: -
        TPGT: 1
        ISID: 4000002a0000
        Connections: 1
...

Y mas informacion sobre cada uno:

# iscsiadm list target-param -v iqn.2006-06.com.alegrome:storage.lvm
Target: iqn.2006-06.com.alegrome:storage.lvm
        Alias: -
        Bi-directional Authentication: disabled
        Authentication Type: NONE
        Login Parameters (Default/Configured):
                Data Sequence In Order: yes/-
                Data PDU In Order: yes/-
                Default Time To Retain: 20/-
                Default Time To Wait: 2/-
                Error Recovery Level: 0/-
                First Burst Length: 65536/-
                Immediate Data: yes/-
                Initial Ready To Transfer (R2T): yes/-
                Max Burst Length: 262144/-
                Max Outstanding R2T: 1/-
                Max Receive Data Segment Length: 8192/-
                Max Connections: 1/-
                Header Digest: NONE/-
                Data Digest: NONE/-
        Configured Sessions: 1

Por otra parte en la Linux, vemos la session iSCSI:

alegrome# cat  /proc/net/iet/session
tid:1 name:iqn.2006-06.com.alegrome:storage.lvm
        sid:281475681353792 initiator:iqn.1986-03.com.sun:01:0800209efab9.46bc3c8b
                cid:0 ip:192.168.0.30 state:active hd:none dd:none

Espero que le sirva a alguien ;-)


Syslog remoto para la Fonera

Diciembre 10, 2007

Para habilitar el syslog remoto de nuestra Fonera a un servidor de Syslog que tengamos:

fon01# vi /etc/init.d/rcS

Modificamos la linea del syslog por

syslogd -C 16 -L -R 192.168.X.Y

Donde 192.168.X.Y seria la IP de nuestro servidor de syslog.

Reiniciamos el syslog de la fonera:

ps -ef| grep syslog
kill

y lo lanzamos manualmente:

syslogd -C 16 -L -R 192.168.X.Y

En el syslog de nuestro servidor de syslog veremos:

server$ tail -f /var/log/syslog
...
Dec 10 20:22:50 fon01 syslog.info syslogd started: BusyBox v1.1.3
...

Por cierto, para leer el syslog desde la fonera:

fon01# logread
Dec 10 20:22:50 fon01 syslog.info syslogd started: BusyBox v1.1.3
...

De esta forma los logs no se pierden!


Upgrade a WP2.3.1

Noviembre 30, 2007

He actualizado mi blog a WordPress 2.3.1.

Siempre me ha dado bastante pereza actualizarlo, porque aunque no sea complicado (hasta ahora solia seguir este procedimiento), no es del todo sencillo: copiar la version actual, eliminar los ficheros de la version anterior y sustituirlos por la version nueva (para no perder todos los cambios que habia hecho yo y ficheros nuevos que he añadido a mano).

Hace poco descubri otro metodo que parece ser mucho mas sencillo!: Usar Subversion. Aqui esta el procedimiento correspondiente. Se hace con un comando:

$ svn sw http://svn.automattic.com/wordpress/tags/VERSION/ .

Obviamente, este metodo hace que actualizar sea tan sencillo que uno ya no se puede resistir. Ayer prepare mi instalacion para poder hacerlo con este metodo (viene explicado como hacerlo en el mismo link). Ahora, a ver cuando sale la siguiente release de WordPress… Estoy anxioso por actualizar mi blog otra vez con svn.


Redistribuir los PV links de un VG (HP-UX) — Update

Noviembre 29, 2007

Respecto al post anterior sobre como redistribuir los PV links de un VG sobre los distinctos caminos a los discos, agradezco el comentario de RuBiCK apuntando a la opción -s del comando pvchange:

NAME
   pvchange - change characteristics and access path of a physical volume
   in an LVM volume group

SYNOPSIS
...
   /usr/sbin/pvchange [-A autobackup] -s pv_path
...
     -s  Immediately begin accessing the associated
         physical volume named by pv_path.
...

Usando este comando no es necesario quitar y reañadir los PV links al VG. Ademas de ser mas seguro, tambien se reduce considerablemente el script, quedando asi:

#!/usr/bin/ksh
# Distribuye los PV links sobre las controladoras
set -o nounset

VG=$1
I=0
for PV in $(
   vgdisplay -v $VG | grep "PV Name" |
   grep -v "Alternate Link" | awk '{ print $3 }' )
do

   LISTA_LINKS=$( pvdisplay $PV | grep "PV Name" | awk '{ print $3 }' | sort )
   NUM_LINKS=$( echo $LISTA_LINKS | wc -w )

   NEW=$(( I % NUM_LINKS + 1 ))
   PRI=$( echo $LISTA_LINKS | awk "{ print \$${NEW} }" )

   pvchange -A n -s $PRI
   (( I = I + 1 ))

done
vgcfgbackup $VG

Gracias RuBiCK por la contribución ;-) .


Redistribuir los PV links de un VG (HP-UX)

Noviembre 28, 2007

Inspirado por el post de RuBiCK sobre como extender un VG con todos los PV links alternates de cada PV, se me occurrio hacer un script para distribuir todos los PV links sobre los distinctos caminos a los discos (es decir sobre las posibles controladoras). Esto no aplica si estamos usando un drivers que balancea el acceso a los discos y no hace uso de los pv links (por ejemplo Powerpath).

Por ejemplo, un VG de 3 PVs. Cada PV se ve por 4 caminos, por las controladoras c4, c6, c8 y c10.

Posiblemente, el primary path de los 3 PVs sea por la c4, mientras que los demas caminos estan en standby. Aun que no sea comparable a Powerpath, es mas interesante distribuir las I/O sobre todos los caminos posibles. Para esto, podemos redistribuir los primary path sobre los caminos posibles.

Por ejemplo: PV1 por la c4, PV2 por la c6 y PV3 por la c8 (y seguiriamos asi con los demas discos…)

Para hacerlo en caliente, lo que hace el script es quitar los caminos que no seran el primario y reañadirlos (en el orden correcto):

# pvdisplay /dev/dsk/c4t0d4
--- Physical volumes ---
PV Name                     /dev/dsk/c4t0d4
PV Name                     /dev/dsk/c6t0d4     Alternate Link
PV Name                     /dev/dsk/c8t0d4     Alternate Link
PV Name                     /dev/dsk/c10t0d4    Alternate Link

# vgreduce -A n $VG /dev/dsk/c8t0d4 /dev/dsk/c10t0d4 /dev/dsk/c4t0d4

# vgextend -A n $VG /dev/dsk/c8t0d4 /dev/dsk/c10t0d4 /dev/dsk/c4t0d4

# pvdisplay /dev/dsk/c6t0d4
--- Physical volumes ---
PV Name                     /dev/dsk/c6t0d4
PV Name                     /dev/dsk/c8t0d4     Alternate Link
PV Name                     /dev/dsk/c10t0d4    Alternate Link
PV Name                     /dev/dsk/c4t0d4     Alternate Link

He hecho el siguiente script para hacer el trabajo automaticamente con todos los discos de un VG:

#!/usr/bin/ksh
# Distribuye los PV links sobre las controladoras
set -o nounset

# bucle para cada primary link:
VG=$1
FILE=$( mktemp )
J=0
for PV in $(
   vgdisplay -v $VG | grep "PV Name" |
   grep -v "Alternate Link" | awk '{ print $3 }' )
do
   (( J = J + 1 ))
   I=1

   LISTA_LINKS=$( pvdisplay $PV | grep "PV Name" | awk '{ print $3 }' | sort )
   NUM_LINKS=$( echo $LISTA_LINKS | wc -w )

   for LINK in $( pvdisplay $PV | grep "PV Name" | awk '{ print $3 }' )
   do
      (( N = ( I + J ) % NUM_LINKS + 1 ))
      echo $PV $( echo $LINK | tr "t" "/" | cut -d/ -f 4 ) $LINK $I $N
      (( I = I + 1 ))
   done
done | sort -k 5 > $FILE

for PV in $(
   vgdisplay -v $VG | grep "PV Name" |
   grep -v "Alternate Link" | awk '{ print $3 }' )
do

   # Lista de links
   set -- $( grep $PV" " $FILE | awk '{ print $3 }' )

   PRIMARY=$1
   shift
   ALTERNATES=$*

   # esta bien el futur primary? (sino saltamos)
   pvdisplay $PRIMARY >/dev/null 2>&1 || continue

   vgreduce -A n $VG $ALTERNATES
   vgextend -A n $VG $ALTERNATES

done
vgcfgbackup $VG
rm $FILE

Acceso remoto a ficheros…

Noviembre 19, 2007

En mi trabajo apunto un monton de cosas cada dia, comandos, trucos,… porque recordarlo todo seria imposible. Tambien creo que apuntarlo hacer que lo recuerde, y si no, al menos recuerdo haberlo apuntado, con lo que suele ser mas facil encontrarlo cuando lo necesite. Son mis “chuletas”; forman mi repositorio de chuletas.

La cuestion es ?donde poner estas chuletas? Si las tengo en el trabajo, desde casa no tendria acceso. Y vice-versa. Por lo que hasta hace poco las tenia replicadas entre un equipo de casa y uno del trabajo (ambos linux), por medio de un script basado en rsync (y un par de tuneles ssh) y del socorrido cron para automatizarlo todo. La verdad es que estaba bien montado, con una sincronizacion “2-way”, es decir que si actualizaba algo durante el dia en el trabajo, al llegar a casa ya estaba en mi repositorio de casa. Y si actualizaba algo en casa, el dia siguiente ya lo tenia en el trabajo. No me tenia que preocupar. Tambien me valia de backup.

El problema es que ahora ya no me vale esta solucion… Asi que me puse a buscar otra, que se pueda usar a traves de un proxy web (en general es la unica salida al exterior que solemos tener en desde la empresa). Tambien intento evitar cosas raras como tuneles TCP a traves de proxy, porque prefiero una solucion estandar que no necesite que instale nada (o muy poco).

De momento he encontrado 2 formas muy interesantes de conectarme a traves de un proxy corporativo a mis ficheros de casa.

La primera es mediante WebDAV: basicamente es como montar una unidad compartida por HTTPS (web-share):

Web-based Distributed Authoring and Versioning: …The protocol’s aim was to make the Web a readable and writable medium, in line with Tim Berners-Lee’s original vision. It provides functionality to create, change and move documents on a remote server (typically a web server or “web share”)…

Montar un WebDAV es algo muy sencillo con Apache2. Basta con activar los modulos dav y dav_fs con a2enmod y configurar unas pocas lineas en el .conf del virtual host correspondiente. Sobre este punto, los siguientes links aportan la informacion mas que necesaria para configurar WebDAV con Apache2:
# HOW-TO: Red Hat 9 – Apache 2 – WebDAV
# No pain no gain » Howto enable WebDAV in Apache

Respecto al tema de seguridad de acceso y a la privacidad de los datos transferidos, no me preocupo porque he activado SSL en mi apache y por lo tanto el trafico entre ambos extremos esta cifrado.

Con esto que logramos: poder abrir el directorio WebDAV desde XP con el explorer, para abrir, modificar, borrar ficheros:

Lo malo de esto es que las modificaciones que se hacen en el directorio compartido por WebDAV (en el servidor) se hacen con el usuario del apache (www-data en Debian). Esto no mola mucho. Incluso si se pueden definir directorios por cada usuarios que pueda entrar, al final en la maquina todos pertenecen al www-data. En mi caso, como tambien entro en la maquina en local (ssh, samba,…) no me vale tener los ficheros con el usuario del apache. Para remediar esto, se puede hacer un cron (que se lance como root) para cambiar el propietario/grupo y los permisos de los ficheros cada x tiempo. (No es muy limpio, pero por lo visto no hay otra solucion que se haya desarrollado).

Por lo tanto, con un directorio WebDAV, uno puede tener acceso desde el trabajo a un repositorio de ficheros que tenga compartido desde su casa. (Lo he probado con XP solo).

Mientras estaba montando esto del WebDAV, encontre un script php muy interesante, tambien relacionado con el tema del acceso remoto (por http(s)): smbwebclient.php. La instalacion del script no presenta dificultad (teniendo un apache con soporte para php). Una vez instalado, el script permite navegar por la red Microsoft (o Samba) en la que este el servidor web (en mi caso la red Samba de mi casa). Si solo tenemos una maquina, el servidor Web, supongamos que hemos compartido por samba algunos directorios, pues con abrir con un navegador la pagina del smbwebclient, podremos navegar por estos directorio. El script gestiona la autenticacion en la red (pide el usuario del workgroup/dominio para acceder a los shares). Si tenemos toda una red Samba, podemos acceder a toda ella mediante smbwebclient simplemente por Web.

En la web oficial hay una demo que permite probarlo:

Con smbwebclient tambien es recomendable usar SSL, para que tanto la autenticacion como el trafico de datos este cifrado.

Mientras WebDAV permitia una navegacion del directorio compartido integrada en XP, en el caso de smbwebclient la navegacion se hace con el navegador (puede ser mas portable, independientemente del SO, y sin necesidad de ningun cliente WebDAV). Por otra parte, smbwebclient permite acceder a mas cosas que WebDAV (toda la red Samba), y deja los ficheros con el usuario que toca, no el www-data.

Son realmente dos soluciones muy interesantes para poder acceder a nuestros ficheros en remoto a traves de http(s).

Ahora, respecto al tema de la sincronizacion bidireccional, encontre una herramienta, Super Flexible File Synchronizer, que permite sincronizar ficheros entre dos directorios, y soporta multiples protocolos (smb, ftp, sftp…) pero el que mas me interesaria en este caso es que soporta WebDAV! (esto todavia no lo he probado, pero en breve lo hare!).

Por lo tanto, creo que me quedare con ambas soluciones de acceso remoto, poniendo mi repositorio de chuletas en el WebDAV, con un cron que me fije el propietario y los permisos regularmente. En el trabajo configurare el Super Flexible File Synchronizer para sincronizar las chuletas (2way) con el WebDAV. Para acceder al resto de ficheros, bien desde el trabajo, o desde donde sea, podre tambien usar smbwebclient.

(Vaya ladrillo acabo de escribir… Enhorabuena a quien me haya leido hasta el final!).


Solaris pkgadm tool

Noviembre 14, 2007

Estaba buscando hoy un gestor de paquetes tipo APT para HP-UX. Es decir, algo que permita bajar paquetes directamente de Internet, resolver y bajar dependencias y actualizar versiones obsoletas de paquetes.

Al final no encontre lo que buscaba, pero encontre algo parecido para Solaris (no lo he probado todavia): Solaris pkgadm tool.