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 😉


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!


Simulador de hipoteca (III): Amortización

diciembre 10, 2007

Respondiendo al comentario de SirDrake, este post trata de explicar como usar mi hoja de Simulador de hipoteca (bajar la hoja) para simular amortizaciones. Ademas de explicar como hacerlo, tambien voy a comparar, gracias a la hoja, dos tipos de amortizaciones: con reduccion de tiempo o de cuota.

Recordemos los datos de nuetro ejemplo (ver el post original para mas detalles): se trata de un prestamo hipotecario de 240,000.00 € a 25 años. Nos sale a pagar unos 146,031.08 € de intereses.

Vamos a simular el efecto de realizar una amortizacion de 12,000.00 € a final del primer año de hipoteca (mes 12).

Conozco 2 tipos de amortización de prestamo:

  • Reducción de tiempo: se reduce el tiempo del prestamo, manteniendose las cuotas mensuales,
  • Reducción de cuota: se reducen las cuotas mensuales, manteniendose la duracion del prestamo.

Vamos a ver como usar mi hoja para simular ambos tipos de amortizacion, y asi ver como se comporta nuestro prestamo:

Amortizacion en tiempo

Ponemos la cantidad que vamos a amortizar en la columna «Am.Extra» (ver flecha roja en el pantallazo):

Amortización con reducción de tiempo

Reduccion del tiempo de prestamo: Podemos ver en la columa «Reduc. Meses» que la duracion total del prestamo se va a reducir de 24 meses, es decir 2 años menos en este caso (lo importante es que son dos años menos que vamos a pagar intereses al banco). Esto tambien queda reflejado en la columna «Quedan Meses».

Vemos que la siguiente cuota se mantiene mas o menos igual (pasa de 1,286.77 € a 1,286.15 €). Realmente no es igual porque la hoja la recalcula y vemos que difiere un poco. Algunos bancos no recalculan la cuota mensual tras una amortizacion. En este caso, solo basta con poner manualmente la cuota que calcula el banco.

Vemos que la parte de intereses de la cuota si que ha reducido de unos 43€ mensuales, de 812.32 € a 769.18 € (son 43€ mas que amortizamos cada mes en vez de darselos al banco).

Lo mas interesante de esta amortizacion es lo que nos vamos a ahorrar de intereses a lo largo del prestamo (celda F3, «Intereses»): vemos que pasa de 146,031.08 € a 126,984.25 €, es decir que amortizando 12,000.00 €, nos ahorraremos 19,046.83 € de intereses!

Amortización en cuota

Al igual que en la amortizacion en tiempo, ponemos la cantidad que vamos a amortizar en la columna «Am.Extra» (ver flecha roja en el pantallazo):

Amortización con reducción de cuota

Sin embargo, lo que pretendemos es que se recalcule la cuota (a la baja), sin reducir el tiempo del prestamo. Para hacer esto con mi hoja, hay que frozarla a que no reduzca en tiempo, poniendo manualmente en la celda correspondiente de la columna «Quedan Meses» el valor que queremos: en nuestro caso si el mes 12 nos quedaban 289 cuotas, el mes siguiente tenemos que forzar el valor a 288 cuotas(meses) (ver flecha roja).

En este caso vemos que la cuota mensual se reduce de unos 65€ (pasa de 1,286.77 € a 1,220.90 €).

La cantidad total de intereses que paguaremos tambien se reduce, pero menos que con una amortizacion en tiempo, como se puede ver: pasa de 146,031.08 € a 139,059.98 €, es decir que nos ahorraremos unos 6,971.10 € (frente a los 19,046.83 € que no ahorraremos si amrtizamos con reduccion de tiempo).

Conclusión

Como podemos ver, a largo plazo la opcion mas interesante es hacer una amortizacion con reduccion de tiempo, y no de cuota (siempre y cuando uno se lo pueda permitir). Si lo que necesita uno es ahorrase dinero de forma inmediata, entonces puede interesar la opcion de reducir cuota, pero creo que hay que tener presente la consecuencia sobre el precio en intereses a largo plazo.


Lucía, Nov 2007

noviembre 30, 2007

¡Os presento mi hija, Lucía!

Update 30/11 17:40: En una primera version del video habia elegido la musica sin escucharla. Despues me di cuenta que era muy cañera y no pegaba mucho con el espiritu del video… Esta es ahora una version mas tierna :-).

Gracias Carlos por la idea.