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.


sleep en la shell de Windows (cmd.exe)

febrero 7, 2008

Estaba buscando como hacer un sleep de 1 minutos en un .bat de Windows (CMD.EXE). Encontre esta forma, es original 馃檪 :

@  ping -n 60 127.0.0.1 > NUL 2>&1

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

Hipoteca: reducci贸n de plazo al amortizar (formula)

diciembre 20, 2007

En este post quiero responder al comentario de Conchi, que preguntaba como calcular la reducci贸n de plazos tras amortizar una hipoteca:

Para ello, parto de la formula de la Cuota mensual a pagar (ver demostraci贸n en la Wikipedia):

Formula Cuota Hipoteca

Donde,

  • i es el interes mensual, es decir, i=(Interes anual en %)/(12*100)
  • Capital es el capital que queda por amortizar
  • Plazo es el numero de meses que queden por pagar la hipoteca

Si queremos saber cuantos plazos quedaran pendientes de pagar tras una amortizacion, podemos sacar “Plazo” de la formula:

Formula Plazo Hipoteca

En el caso de mi simulaci贸n:

Amortizaci贸n con reducci贸n de tiempo

  • Tenemos un capital pendiente de 234887.74鈧 y amortizamos 12000鈧, con lo que tras amortizar nos queda un capital pendiente de 222887.74鈧.
  • El interes mensual es de i=4.150/(12*100)=0.003458333…
  • La cuota no cambia (o poco), con lo que tomamos el valor antes de amortizar como referencia: Cuota=1286.77鈧
  • Al calcular el nuevo Plazo nos sale efectivamente 264 meses si redondeamos.

    Por informaci贸n, he generado las imagenes de las formulas con LaTeX Equation Editor – SITMO, usando las siguientes formulas Latex:

    Cuota = \\frac{Capital \\cdot i}{1-(1+i )^{-Plazo}}
    Plazo = -\\frac{Log(1-i \\cdot \\frac{Capital}{Cuota})}{Log(1+i)}

    y he hecho los calculos en mi PC con el emulador de la HP48sx (buenisimo! la unica pena es que no consigo hacer funcionar la version Pocket PC).


Hacer backup de una Fonera

diciembre 18, 2007

Teniendo acceso por SSH a una Fonera, se puede hacer un tar de los ficheros de la fonera directamente a otra maquina (por si no cupiera en la propia fonera):

ssh root@fon01 "cd /; tar cvf - bin etc lib sbin tmp var jffs rom usr www" | gzip -9 > /tmp/fon01.tar.gz

Tambien se puede usar algo parecido para replicar el SO de una Fonera en un Linux:

$ mkdir /tmp/fon01
$ cd /tmp/fon01
$ ssh root@fon01 "cd /; tar cvf - bin etc lib sbin tmp var jffs rom usr www" | tar xvf -

Esto ultimo puede ser util para verificar desde el Linux que una actualizacion de Fon no va a machacar ficheros de la Fonera que hayamos tocado nosotros antes.


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 馃槈