ubuntu

Apache

Apache

Introducción

Apache es un servidor web.

Instalación

Para instalarlo tendremos que instalar el paquete apache2 desde nuestro gestor de paquetes gráfico favorito o ejecutando la siguiente orden:

>> sudo aptitude install apache2

Uso

  • Si lo hemos instalado como servicio:

>> sudo /etc/init.d/apache2 start
>> sudo /etc/init.d/apache2 stop
>> sudo /etc/init.d/apache2 restart
  • Si no lo hemos instalado como servicio (standalone):

>> /usr/local/apache2/bin/apachectl start
>> /usr/local/apache2/bin/apachectl restart
>> /usr/local/apache2/bin/apachectl stop

Configuración

El fichero de configuración

El fichero de configuración se llama httpd.conf y esta en la siguiente ruta:

  • Desde las fuentes: /usr/local/apache2/conf/httpd.conf
  • Desde el repositorio: /etc/apache2/httpd.conf

Directorio raiz por defecto

  • Desde las fuentes: /usr/local/apache2/htdocs
  • Desde el repositorio: /var/www/

Cambiar el directorio de las páginas web

Modificar en el fichero de configuración /usr/local/apache2/conf/httpd.conf la variable DocumentRoot con la ruta nueva:

DocumentRoot "/media/windows/WEB"

Seguridad

  • La variable ServerTokens nos permite decidir que información dice el servidor. ServerTokens por defecto tiene el valor Full, por seguridad es decir cuanto menos información. Un ejemplo de los valores de esta variable y de sus salidas serian los siguientes:
Prod: Apache
Major: Apache/2
Minor: Apache/2.0
Minimal: Apache/2.0.55
OS: Apache/2.0.55 (Debian)
Full: Apache/2.0.55 (Debian) PHP/5.1.2-1+b1 mod_ssl/2.0.55 OpenSSL/0.9.8b

Por lo que editaremos el fichero /etc/apache2/apache2.conf y pondremos la variable ServerTokens con el valor Prod:

ServerTokens Prod
  • La variable ServerSignature permite la configuración del pie de página que aparece en ciertos mensajes generados por el servidor (mensajes de error, salida de mod_info , etc.). Si se utiliza ServerSignature On, se añade una línea con el número de versión de Apache, el nombre del servidor ServerName, y el email del responsable ServerAdmin. Por ejemplo:
Not Found  
The requested URL /docu/proyecto_web/img34.png was not found on this server.

Apache/2.2.3 (Debian) DAV/2 SVN/1.4.2 mod_fastcgi/2.4.2 PHP/5.2.0-8+etch7 mod_ssl/2.2.3 OpenSSL/0.9.8c Server at www.realidadfutura.com Port 80

Por lo tanto la pondremos en Off. Editaremos el fichero /etc/apache2/apache2.conf y pondremos la variable ServerSignature en Off:

ServerSignature Off
  • Por seguridad es conveniente deshabilitar el método TRACE y dejar solo los que voy a necesitar GET,HEAD, POST y OPTIONS. Esto habra que indicarselo en cada VirtualHost gracias a la variable TraceEnable. Por ejemplo, para deshabilitarlo en el VirtualHost por defecto iremos al archivo /etc/apache2/sites-available/default y dentro de la etiqueta VirtualHost pondremos la variable TraceEnable en Off:
TraceEnable off

Impedir que ciertas IPs accedan a una carpeta del servidor

Crear o modificar un archivo de nombre .htaccess en la carpeta e introducirle el siguiente contenido:

Order Deny,Allow
Allow from 155.210.155.169
Deny from all

Para hacerlo de esta forma necesitaremos que este activa la opción AllowOverride de usar archivos .htaccess a un valor distinto a None

Impedir que otras webs usen nuestras imagenes

A veces otras webs pueden usar imagenes nuestras subidas en nuestro servidor (consumiendo nuestro respectivo ancho de banda). Para evitar esto tendremos que crear o editar el archivo .htaccess en la carpeta principal de nuestra página web y añadir las siguientes líneas:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://tu-dominio.com [NC]
RewriteCond %{HTTP_REFERER} !^http://www.tu-dominio.com [NC]
RewriteRule .*\.(gif|jpg|swf|png|jpeg)$ - [NC,F]

Si ademas queremos que cuando usen una imagen nuestra, les aparezca otra, solo tendremos que cambiar la úlñtima línea por esta otra:

RewriteRule .*\.(gif|jpg|swf|png|jpeg)$ imagen_ladron.jpg [L]

Siendo imagen_ladron.jpg la imagen que queremos que les salga.

Security enhanced linux

Aveces podemos encontrarnos con el siguiente problema en el apache (aunque tengamos los permisos bien):

Permission denied: access to /index.html denied

Esto puede deberse a que algunos linux (similares a Red Hat, por ejemplo en Centos 5) implementan últimamente un sistema de seguridad llamado Security-Enhanced Linux.

Security-Enhanced Linux (o SELinux) es una arquitectura de seguridad integrada en el kernel 2.6.x usando los módulos de seguridad linux (o linux security modules, LSM). Este es un proyecto de la Agencia de Seguridad Nacional (NSA) de los Estados Unidos y de la comunidad SELinux. La integración de SELinux en Red Hat Enterprise Linux fue un esfuerzo conjunto entre al NSA y Red Hat

Usarlo

Por ejemplo: si queremos darle permisos al apache para que pueda acceder a una carpeta TU_CARPETA. Primero veremos que no tiene los permisos para que pueda ser accedida por el apache con la siguiente orden:

>> ls -Z TU_CARPETA
   drwxr-xr-x  root root system_u:object_r:home_root_t    TU_CARPETA

Entonces le daremos los permisos con la siguiente orden:

>> chcon -R -h -t httpd_sys_content_t TU_CARPETA

Por último comprobaremos que ya tiene los permisos:

>> ls -Z TU_CARPETA
   drwxrwxrwx  root root root:object_r:httpd_sys_content_t TU_CARPETA

Deshabilitarlo

Para saber si lo tenemos activado tendremos que ejecutar la siguiente orden (si esta off, significa que no esta activado lo que lo deshabilita, lo que quiere decir que esta activado):

>> getsebool -a | grep httpd
   allow_httpd_anon_write --> off
   allow_httpd_bugzilla_script_anon_write --> off
   allow_httpd_mod_auth_pam --> off
   allow_httpd_nagios_script_anon_write --> off
   allow_httpd_squid_script_anon_write --> off
   allow_httpd_sys_script_anon_write --> off
   httpd_builtin_scripting --> on
   httpd_can_network_connect --> off
   httpd_can_network_connect_db --> off
   httpd_can_network_relay --> off
   httpd_disable_trans --> off
   httpd_enable_cgi --> on
   httpd_enable_ftp_server --> off
   httpd_enable_homedirs --> on
   httpd_rotatelogs_disable_trans --> off
   httpd_ssi_exec --> off
   httpd_suexec_disable_trans --> off
   httpd_tty_comm --> on
   httpd_unified --> on

Activamos la opción de deshabilitar y comprobamos que se ha activado:

>> setsebool -P httpd_disable_trans 1
>> getsebool -a | grep httpd
   allow_httpd_anon_write --> off
   allow_httpd_bugzilla_script_anon_write --> off
   allow_httpd_mod_auth_pam --> off
   allow_httpd_nagios_script_anon_write --> off
   allow_httpd_squid_script_anon_write --> off
   allow_httpd_sys_script_anon_write --> off
   httpd_builtin_scripting --> on
   httpd_can_network_connect --> off
   httpd_can_network_connect_db --> off
   httpd_can_network_relay --> off
   httpd_disable_trans --> on
   httpd_enable_cgi --> on
   httpd_enable_ftp_server --> off
   httpd_enable_homedirs --> on
   httpd_rotatelogs_disable_trans --> off
   httpd_ssi_exec --> off
   httpd_suexec_disable_trans --> off
   httpd_tty_comm --> on
   httpd_unified --> on

Por último reiniciamos el apache para que tenga efecto:

>> sudo /etc/init.d/apache2 restart
   Parando apache2:                                             [  OK  ]
   Iniciando apache2:                                           [  OK  ]

Problemas

External APR-util

 Puede ser que apache nos de un erro como el siguiente:

configure: error: Cannot use an external APR-util with the bundled APR

Solución

Para solucionar este error, tendremos que instalar el paquete libaprutil1-dev:

>> sudo aptitude install  libaprutil1-dev
temas: 

Escritorio remoto en Ubuntu con Freenx

Escritorio remoto en Ubuntu con Freenx

Introducción

En Ubuntu hay muchas maneras de conectarnos por escritorio remoto. La que mas me gusta es con freenx (mas seguro que con VNC y mucho mas rápido). En este articulo veremos como instalarlo, configurarlo y usarlo.

Instalación

Tendremos que instalar dos partes. En el ordenador al que nos queremos conectar, tendremos que instalarle el servidor freenx. En el ordenador desde el que nos conectaremos al otro ordenador, tendremos que instalar el cliente nxclient.

Instalar el servidor

Lo primero que necesitaremos es tener un repositorio que tenga el paquete freenx-server. Si no tenéis ninguno podéis usar este:

deb http://ppa.launchpad.net/freenx-team/ubuntu TU_DISTRO main
deb-src http://ppa.launchpad.net/freenx-team/ubuntu TU_DISTRO main

Dependiendo de vuestra versión de ubuntu cambiareis TU_DISTRO por una de las siguientes que corresponda a vuestra distribución:

  • feisty
  • gutsy
  • hardy
  • intrepid
  • jaunty
  • karmic
  • lucid

Tambien podemos añadirlo con el siguiente comando:

>> sudo add-apt-repository ppa:freenx-team

Una vez lo tengamos en nuestro repositorio procederemos a instalarlo con las siguientes ordenes:

>> sudo aptitude update
>> sudo aptitude upgrade
>> sudo aptitude install freenx

Instalar el cliente

Para instalar el cliente tendremos que ir a la web http://www.nomachine.com e ir a la sección de descargas y seleccionar el programa NX Client y para que Sistema Operativo lo necesitamos (Windows o Linux), y si es para linux elegiremos después la versión para Ubuntu NX Client DEB for Linux.

Después de bajarlo lo instalaremos. Para instalarlo en Ubuntu desde consola tendremos que ejecutar la siguiente orden:

>> sudo dpkg -i nxclient_3.2.0-9_i386.deb

Configuración

Establecer el puerto donde sshd esta escuchando

Freenx una sshd para establecer las conexiones con más seguridad. Por ello tiene que saber en que puerto esta escuchando sshd. Por defecto piensa que está en el 22, pero si esta en otro puerto, tendremos que indicarselo. Para ello tendremos que editar el fichero /etc/nxserver/node.conf y descomentaremos la variable SSHD_PORT y le pondremos el valor de nuestro puerto.

Por ejemplo, si nuestro servidor sshd esta escuchando en el puerto 4022, tendremos que dejar la línea así:

SSHD_PORT=4444
temas: 

Ver las temperaturas en ubuntu con lm-sensors

Ver las temperaturas en ubuntu con lm-sensors

Introducción

Para ver las temperaturas de la placa base, procesator, etc, en un Ubuntu, disponemos de un programa llamado lm-sensors. En este artículo os voy a explicar como instalarlo y configurarlo. Si además de poder ver las temperaturas, queréis añadirlas a la barra de tareas de Ubuntu podéis hacerlo como os indico aquí.

Instalación

Para instalar el programa lm-sensors tendremos que instalar el paquete de nombre lm-sensors desde nuestro gestor de paquetes gráfico favorito o ejecutando el siguiente comando:

    >> sudo apt-get install lm-sensors

Ejecución

Una vez lo tengamos ya instado, podemos ver las temperaturas ejecutando el siguiente comando:

    >> sensors
   
      it8712-isa-0290
      Adapter: ISA adapter
      VCore 1: +1.34 V (min = +0.00 V, max = +4.08 V)
      VCore 2: +2.58 V (min = +0.00 V, max = +4.08 V)
      +3.3V: +3.38 V (min = +0.00 V, max = +4.08 V)
      +5V: +3.79 V (min = +0.00 V, max = +6.85 V)
      +12V: +11.90 V (min = +0.00 V, max = +16.32 V)
      -12V: -8.22 V (min = -27.36 V, max = +3.93 V)
      -5V: -4.29 V (min = -13.64 V, max = +4.03 V)
      Stdby: +4.41 V (min = +0.00 V, max = +6.85 V)
      VBat: +4.08 V
      fan1: 2556 RPM (min = 0 RPM, div = 8)
      fan2: 0 RPM (min = 0 RPM, div = 8)
      fan3: 0 RPM (min = 0 RPM, div = 8)
      M/B Temp: +25°C (low = +127°C, high = +127°C) sensor = thermistor
      CPU Temp: +39°C (low = +127°C, high = +127°C) sensor = thermistor
      Temp3: +71°C (low = +127°C, high = +127°C) sensor = thermistor

Configuración

  • El archivo de configuración
    /etc/sensors.conf
  • Detectar los sensores que tenemos:
    >> sudo sensors-detect

Ejemplo

Por ejemplo, para la placa Gigabyte GA-K8NF-9 (rev1):

Ejecutamos >> sudo sensors-detect y nos dice que tenemos los siguientes sensores:

    To make the sensors modules behave correctly, add these lines to
    /etc/modules:
    
    #----cut here----
    # I2C adapter drivers
    i2c-nforce2
    # Chip drivers
    eeprom
    # Warning: the required module k8temp is not currently installed
    # on your system. For status of 2.6 kernel ports check
    # http://www.lm-sensors.org/wiki/Devices. If driver is built
    # into the kernel, or unavailable, comment out the following line.
    pca9540
    k8temp
    it87
    #----cut here----

Probamos si tenemos los modulos que nos dice:

    >> sudo modprobe i2c-nforce2
    >> sudo modprobe eeprom
    >> sudo modprobe pca9540
    >> sudo modprobe k8temp
    >> sudo modprobe it87
    >> sudo depmod -a

Entonces probamos si funciona:

    >> sensors
    
    k8temp-pci-00c3
    Adapter: PCI adapter
    Core0 Temp:
                 +49°C
    
    it8712-isa-0290
    Adapter: ISA adapter
    VCore 1:   +1.36 V  (min =  +0.00 V, max =  +4.08 V)
    VCore 2:   +2.58 V  (min =  +0.00 V, max =  +4.08 V)
    +3.3V:     +3.36 V  (min =  +0.00 V, max =  +4.08 V)
    +5V:       +5.24 V  (min =  +0.00 V, max =  +6.85 V)
    +12V:     +11.97 V  (min =  +0.00 V, max = +16.32 V)
    -12V:     -11.16 V  (min = -27.36 V, max =  +3.93 V)
    -5V:       -1.59 V  (min = -13.64 V, max =  +4.03 V)
    Stdby:     +4.09 V  (min =  +0.00 V, max =  +6.85 V)
    VBat:      +4.08 V
    fan1:     2766 RPM  (min =    0 RPM, div = 8)
    fan3:        0 RPM  (min =    0 RPM, div = 8)
    M/B Temp:    +25°C  (low  =  +127°C, high =  +127°C)   sensor = thermistor
    CPU Temp:    +46°C  (low  =  +127°C, high =  +127°C)   sensor = thermistor
    Temp3:       +72°C  (low  =  +127°C, high =  +127°C)   sensor = thermistor

Si todo ha funcionado tenemos que ir al archivo /etc/modules y añadimos los sensores que no han dado error con modprobe:

    i2c-nforce2
    eeprom
    k8temp
    it87 

Problemas

Problema No sensors found

Al ejecutar el comando sensors nos aparece el siguiente mensaje:

>> sensors
No sensors found!
Make sure you loaded all the kernel drivers you need.
Try sensors-detect to find out which these are.

Solución

El problema está en que no hemos cargado los módulos que nos ha devuelto el comando sensors-detect.

temas: 

Abrir puertos en VirtualBox

Abrir puertos en virtualbox

Abrir puertos

Puede darse el caso de que nos encontremos con la necesidad de tener que acceder a un puerto de nuestra máquina virtual desde el exterior (Por ejemplo, si queremos acceder por ssh a la máquina virtual el puerto 22 tendrá que ser accesible desde el exterior). Para configurar esto no hay de momento forma de hacerlo con la interfaz gráfica de Virtualbox, pero se puede hacer por línea de comandos. Para abrir un puerto al exterior de una máquina virtual (Por ejemplo de nombre windows) tendremos que crear una regla (Por ejemplo, de nombre apache) para abrir un puerto de la máquina virtual (Por ejemplo el 80) para un protocolo (Por ejemplo, TCP) en un puerto de la máquina donde esta instalado el virtualbox (Por ejemplo, el 20080). De esta manera cuando accedamos al puerto que le indiquemos de la máquina que tiene instalado el VirtualBox, estaremos accediendo al puerto indicado de la maquina virtual.

Para hacer esto tendremos que apagar la máquina virtual (apagarlo, no pausarlo). Después ejecutaremos las siguientes ordenes:

  >> VBoxManage setextradata "windows" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache/Protocol" TCP
  >> VBoxManage setextradata "windows" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache/GuestPort" 80
  >> VBoxManage setextradata "windows" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache/HostPort" 20080

Si nos fijamos en cada línea, veremos que ponemos pcnet. Esto es el dispositivo de red que esta usando la máquina virtual para emular una tarjeta de red del tipo que le hemos dicho en la configuración. Dependiendo de un tipo u otro, tendremos que poner una cadena u otra. Los posibles tipos que hay son los siguientes:

  • Intel Network Adapter: e1000
  • PCNet: pcnet
  • ...

Para comprobar que se ha introducido bien podemos listar todas propiedades de la maquina virtual (Por ejemplo para la máquina de nombre windows):

  >> VBoxManage getextradata windows enumerate
    VirtualBox Command Line Management Interface Version 1.5.6_OSE
    (C) 2005-2008 innotek GmbH
    All rights reserved.
    
    Key: GUI/LastWindowPostion, Value: 425,339,644,531,max
    Key: GUI/Fullscreen, Value: off
    Key: GUI/Seamless, Value: off
    Key: GUI/AutoresizeGuest, Value: on
    Key: GUI/LastCloseAction, Value: save
    Key: VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache/Protocol, Value: TCP
    Key: VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache/GuestPort, Value: 80
    Key: VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache/HostPort, Value: 20080

Como podemos observar aparecen las propiedades que hemos introducido.

Problemas

Error get MAC

Al encender la máquina virtual después de haber abierto puertos, nos indica este error:

Configuration error: Failed to get the "MAC" value.
VBox status code: -2103 (VERR_CFGM_VALUE_NOT_FOUND).

Solución

Este error aparece cuando abrimos los puertos indicando una tarjeta de red que no es la que le hemos indicado en la configuración a la máquina (pcnet, e1000, ...). Para solucionarlo tendremos que cambiar la tarjeta de red en la configuración de la máquina virtual por la correspondiente que hayamos puesto al abrir el puerto. O sino borrar los datos del puerto abierto y volverlo a poner para la tarjeta de red correcta. (Para mas información leer la guia de esta página)

Fuente

Crear y reparar archivos comprimirdos con volúmenes de recuperación (rev)

Volúmenes de recuperación

Introducción

Hoy os vamos a explicar otra manera de recuperar archivos rar dañados comprimidos en volumenes. Hace unos días os explicamos como hacerlo usando archivos par2 y hoy os vamos a explicar como hacerlo con volúmenes de recuperación (extensión rev).

Los volúmenes de recuperación o fichero .rev son ficheros especiales que pueden ser creados por WinRAR y que permiten reconstruir volúmenes ausentes o dañados. Solo pueden usarse con archivos multivolumen.

Creación de los ficheros de recuperación

Vamos a crear 10 archivos de recuperación a partir del fichero comprimido en volumenes. Para ello le pasaremos el parámetro rv seguido del numero de ficheros que queremos crear (en nuestro caso 10) y luego pondremos el nombre del primer fichero del volumen (en nuestro caso prueba.part01.rar)

>> rar rv10 prueba.part01.rar
 
RAR 3.80   Copyright (c) 1993-2008 Alexander Roshal   16 Sep 2008
Shareware version         Type RAR -? for help
 
Creating prueba.part01.rev
Creating prueba.part02.rev
Creating prueba.part03.rev
Creating prueba.part04.rev
Creating prueba.part05.rev
Creating prueba.part06.rev
Creating prueba.part07.rev
Creating prueba.part08.rev
Creating prueba.part09.rev
Creating prueba.part10.rev 100%
Done

Recuperación de un archivo dañado

Imaginemos que tenemos un archivo rar comprimido en volúmenes pero que nos faltan dos de esos volúmenes. Si tenemos los archivos de revisión (extensión rev) podremos intentar recuperar los archivos perdidos con ellos. Para ello tendremos que poner el parámetro rc seguido del nombre del primer archivo del volumen (en nuestro caso prueba.part01.rar)

>> rar rc prueba.part01.rar
  
RAR 3.80   Copyright (c) 1993-2008 Alexander Roshal   16 Sep 2008
Shareware version         Type RAR -? for help
 
Calculating control sums of all volumes.
5 recovery volumes found
Cannot find volume prueba.part12.rar
Cannot find volume prueba.part71.rar
2 volumes missing
Reconstructing... 100%
Done

Como podemos ver se han podido recuperar.

temas: 

Crear y reparar archivos comprimirdos con sus archivos par2

recuperar archivos multivolumen rar con archivos par2

Introducción

A veces puedes encontrarte con archivos comprimidos en varios volúmenes (prueba.part001.rar, prueba.part002.rar, prueba.part003.rar, ...). Puede darse el caso de que un archivo de este volumen no lo tengas o este corrupto (dañado). Hoy en día podemos disponer de herramientas que nos permitan descomprimir el contenido comprimido aun teniendo este problema (siempre que se haya comprimido creando unos archivos necesarios) si hay suficiente información para ello en el volumen.

Los ficheros Par2 pueden ser utilizados para reparar ficheros comprimidos dañados. Pero para ello se habrán tenido que crear al hacer el archivo comprimido. El proceso analiza los bloques de cada fichero rar y publica si esta completo, incompleto o perdido. Cada fichero par2 se puede utilizar para arreglar cierto número de bloques. Todo lo que necesitas es tener la suficiente cantidad de ficheros par2 que puedan arreglar los bloques perdidos para poder repararlos. Puedes reparar cualquier fichero rar dañado con cualquier fichero par2.

Lo primero que tendremos que hacer es instalar el programa:

>> sudo apt-get install par2

Creación de los ficheros par2

Si vamos a comprimir algo en varios archivos rar, podemos crear los  archivos par2 para que cuando lo queramos descomprimir y no tengamos alguno de los  archivos o que alguno de los archivos se haya dañado con el tiempo o al transprotarlo. Como ejemplo, vamos a crear una lista de archivos comprimidos. Vamos a comprimir el fichero prueba.avi con una compresión del 1 en archivos de 5 megas:

>> rar a prueba.rar -v5m -m1 prueba.avi
  ...
>> ls
  prueba.avi         prueba.part02.rar  prueba.part04.rar  prueba.part06.rar  prueba.part08.rar  prueba.part10.rar
  prueba.part01.rar  prueba.part03.rar  prueba.part05.rar  prueba.part07.rar  prueba.part09.rar

Ahora vamos a crear 4 archivos par2 de nombre prueba y con un tamaño igual para los 4:

>> par2create -u -n4 prueba prueba.part*.rar
   ...  
   Block size: 25012
   Source file count: 10
   Source block count: 2004
   Redundancy: 10%
   Recovery block count: 200
   Recovery file count: 4
  
   Opening: prueba.part01.rar
   ...
   Opening: prueba.part10.rar
   Computing Reed Solomon matrix.
   Constructing: done.
   Wrote 5002400 bytes to disk
   Writing recovery packets
   Writing verification packets
   Done

Ya tenemos creados los archivos par2, lo comprobamos:

>> ls
   prueba.avi   prueba.part01.rar  prueba.part03.rar  prueba.part05.rar  prueba.part07.rar 
   prueba.part09.rar  prueba.vol000+16.par2  prueba.vol048+64.par2   prueba.par2
   prueba.part02.rar  prueba.part04.rar  prueba.part06.rar  prueba.part08.rar  prueba.part10.rar 
   prueba.vol016+32.par2  prueba.vol112+88.par2

Otros ejemplos serían:

  • Crear archivos par2 del mismo tamaño y con un 10% de redundancia:
>> par2create -u -r10 prueba prueba.part*.rar

Recuperación con ficheros par2

Si queremos descomprimir un archivo comprimido en varios archivos rar pero no tenemos todos los archivos o alguno de estos esta dañado, podemos hacerlo si tenemos los archivos par2. Vamos a ver un ejemplo de uso si un archivo troceado en trozos con archivos PAR2 y que le falta 1 archivo (prueba.part019.rar). Estos son los archivos que tenemos:

>> ls
  prueba.md5
  prueba.par2
  prueba.part001.rar
  ...
  prueba.part018.rar
  prueba.part020.rar
  ...
  prueba.part030.rar
  prueba.vol000_50.PAR2
  prueba.vol050_50.PAR2
  prueba.vol100_50.PAR2

Ahora vamos a ejecutar el programa par2 para que compruebe cuantos archivos faltan o estan dañados y si tiene los suficientes bloques para recuperarlos:

>> par2repair prueba.par2
   par2cmdline version 0.4, Copyright (C) 2003 Peter Brian Clements.
  
   par2cmdline comes with ABSOLUTELY NO WARRANTY.
  
   This is free software, and you are welcome to redistribute it and/or modify
   it under the terms of the GNU General Public License as published by the
   Free Software Foundation; either version 2 of the License, or (at your
   option) any later version. See COPYING for details.
  
   Loading "prueba.par2".
   Loaded 370 new packets
   Loading "prueba.vol100_50.PAR2".
   Loaded 50 new packets including 50 recovery blocks
   Loading "prueba.vol000_50.PAR2".
   Loaded 50 new packets including 50 recovery blocks
   Loading "prueba.vol050_50.PAR2".
   Loaded 50 new packets including 50 recovery blocks

   There are 30 recoverable files and 0 other files.
   The block size used was 2000000 bytes.
   There are a total of 1529 data blocks.
   The total size of the data files is 19021486678 bytes.
   
   Verifying source files:
   
   Target: "prueba.part001.rar" - found.
   ...
   Target: "prueba.part058.rar" - found.
   Target: "prueba.part059.rar" - missing.
   Target: "prueba.part060.rar" - found.
   ...
   Target: "prueba.part130.rar" - found.
   
   Scanning extra files:
   
   Repair is required.
   1 file(s) are missing.
   30 file(s) are ok.
   You have 1495 out of 1529 data blocks available.
   You have 150 recovery blocks available.
   Repair is possible.
   You have an excess of 116 recovery blocks.
   34 recovery blocks will be used to repair.

   Computing Reed Solomon matrix.
   Constructing: done.
   Solving: done.

   Wrote 16776448 bytes to disk
   ...
   Wrote 13108224 bytes to disk

   Verifying repaired files:

   Target: "prueba.part019.rar" - found.

   Repair complete.

Como podemos ver había suficientes bloques para recuperar el archivo perdido y lo ha recuperado.

temas: 

Raid 1 por software en linux

raid 1 en linux con ubuntu

Introducción

En linux existe un programa para hacer raid por software. Este se llama mdadm. En esta guia explicaré como hacer un raid 1 con dos particiones del mismo tamaño.

Detectar un raid ya construido

Puede ser que hayamos creado un raid anteriormente en otro SO y queramos montarlo en el nuestro. Para ello podemos decirle al programa que los gestiona, que escanée las particiones para descubrir los raid que hay en ella.

Para ello tendremos que ejecutar los siguientes comandos:

>> sudo apt-get install mdadm
>> sudo mdadm --assemble --scan

Hacer un raid

Lo primero será tener instalado mdadm, que es el programa que hará el raid por software. Instalamos el programa mdadm con la siguiente orden:

>> sudo apt-get install mdadm

Por ejemplo, tenemos una partición con datos (/dev/sda5) y queremos hacer un raid 1 con otra partición que tenemos sin datos (/dev/sdb1). Lo primero será desmontar las dos particiones:

>> sudo umount /dev/sda5
>> sudo umount /dev/sdb1

Comprobamos que las dos particiones tienen el mismo tamaño:

>>sudo fdisk -l
...
/dev/sda5            5227       35741   245111706   83  Linux
...
/dev/sdb1               1       30515   245111706   83  Linux
...

Ahora vamos a crear el raid con la partición que no tiene los datos originales (acordaros que si creáis varios raid, tendréis que poner un nombre a cada uno: /dev/md0, /dev/md1, ...):

>> sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 missing
  mdadm: /dev/sda5 appears to contain an ext2fs file system
      size=245111704K  mtime=Sun Jun 21 13:01:34 2009
  Continue creating array? y
  mdadm: array /dev/md0 started.

Ahora formateamos la partición del raid. Por ejemplo, para crear un sistema de ficheros de linux lo haremos con la siguiente orden (podemos formatearlo con lo que queramos: ntfs, fat32, ext4, ...):

>> sudo mkfs -t ext4 /dev/md0

Ya tenemos el raid creado con la partición sin datos. Ahora vamos a pasar los datos, de la partición que los contiene, al raid. Para hacerlo, primero tendremos que montar las particiones:

>> sudo mount /dev/sda5 /media/datos
>> sudo mount /dev/md0 /media/raid

Ahora copiaremos todos los datos de /media/datos a /media/raid (no hay que copiar las carpetas del sistema de archivos como lost+found).

Una vez hemos llegado aquí, ya tendremos el raid creado con los datos dentro, pero solo con 1 disco. Ahora añadiremos  al raid la partición que tenía los datos (/dev/sda5) para que se reconstruya con los datos del raid:

>> sudo mdadm --manage /dev/md0 --add /dev/sda5
   mdadm: added /dev/sdb1

Se empecará a copiar la información de la partición primaria en la que hemos añadido ahora. Para ver como va el proceso podremos ejecutar el siguiente comando para ver el % que lleva: 

>> cat /proc/mdstat
  Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
  md0 : active raid1 sdb1[2] sda5[0]
        245111616 blocks [2/1] [U_]
        [>....................]  recovery =  0.3% (857600/245111616) finish=66.4min speed=61257K/sec

O tambien podemos ver el proceso de reconstrucción con este otro comando:

>> sudo mdadm --detail /dev/md0
/dev/md0:
...
    Update Time : Sun Jun 21 15:38:24 2009
          State : clean, degraded, recovering
 Active Devices : 1
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 1
 
 Rebuild Status : 13% complete
...
    Number   Major   Minor   RaidDevice State
       0       8        5        0      active sync   /dev/sda5
       2       8       17        1      spare rebuilding   /dev/sdb1

Esperaremos hasta que desaparezca esta línea. Una vez acabado este proceso, iremos al fichero /etc/mdadm/mdadm.conf y añadiremos la línea en la que indicamos las particiones queu forman el raid, quedando el fichero de la siguiente forma:

...
# by default, scan all partitions (/proc/partitions) for MD superblocks.
# alternatively, specify devices to scan, using wildcards if desired.
DEVICE partitions
# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes
# automatically tag new arrays as belonging to the local system
HOMEHOST <system>
# instruct the monitoring daemon where to send mail alerts
MAILADDR root
# definitions of existing MD arrays
# This file was auto-generated on Thu, 21 May 2009 21:47:53 +0200
# by mkconf $Id$
ARRAY        /dev/md0 devices=/dev/sda5,/dev/sdb1

Una vez que ya tenemos creado dispositivo raid, vamos a ponerla en el /etc/fstab para que el ordenador la monte cada vez qeu se encienda. Lo primero que tenemos que saber es el UUID de nuestra particion raid. Para ello tendremos que ejecutar la siguiente orden (por ejemplo pasa saber el UUID del dispositivo md0):

>> sudo vol_id -u /dev/md0
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

(* En versiones ams nuevas de ubuntu podemos usar >> sudo blkid)

Una vez tenemos el UUID vamos a editar el fichero /etc/fstab, comentaremos las líneas en las que aparezcan los dispositivos que forman parte del raid (en nuestro caso /dev/sdb1 y /dev/sda5) si es que estan en el fichero (igual aparecen por su UUID, podeis saber cual es con la orden sudo vol_id -u /dev/XXX) y añadiremos la línea del nuevo dispositivo:

# /dev/sda5
#UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX       /media/SIN_RAID1        ext3    relatime        0       2
# /dev/sdb1
#UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX       /media/SIN_RAID2        ext3    relatime        0       2
# /dev/md0
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX    /media/CON_RAID    ext3    relatime    0    2

Quitar un raid

Lo primero que tendremos que saber es que particiones forman el raid. Por ejemplo, si queremos desacer el raid /dev/md1, tendremos que ejecutar el siguiente comando para saber las particiones que lo forman:

>> sudo mdadm --detail /dev/md1
/dev/md1:
...   
Number Major Minor RaidDevice State
0 8 6 0 active sync /dev/sda6
1 8 34 1 active sync /dev/sdc2

Como podemos ver, el raid esta formado por las particiones /dev/sda6 y /dev/sdc2. Una vez sabemos esto pararemos el raid y lo desmontamos con las siguientes ordenes:

>> mdadm --stop /dev/md1
>> sudo umount /dev/md1

Ahora limpiaremos las dos particiones de la configuración del raid con las siguientes ordenes:

>> mdadm --zero-superblock /dev/sda6
>> mdadm --zero-superblock /dev/sdc2

Y por último tendremos que ir al fichero /etc/mdadm/mdadm.conf y tendremos que quitar la línea correspondiente a el raid, en nuestro caso la siguiente:

ARRAY /dev/md1 devices=/dev/sda6,/dev/sdc2

Con esto ya habremos quitado el raid /dev/md1.

Comprobar el estado de un raid

Si lo que queremos es comprobar el estado de un raid, tendremos que ejecutar el siguiente comando. Por ejemplo para comprobar el estado del rad /dev/md0:

>> sudo mdadm --detail /dev/md0
/dev/md1:
        Version : 00.90
  Creation Time : Thu Jul  2 22:46:31 2009
     Raid Level : raid1
     Array Size : 271610816 (259.03 GiB 278.13 GB)
  Used Dev Size : 271610816 (259.03 GiB 278.13 GB)
  Raid Devices : 2
  Total Devices : 2
  Preferred Minor : 1
  Persistence : Superblock is persistent
 
    Update Time : Fri Jul  3 00:07:06 2009
          State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
 
           UUID : 8fe624fd:cef7961e:ce24d2e1:c686696d (local to host pcpedro)
         Events : 0.14
  
   Number   Major   Minor   RaidDevice State
       0       8        6        0      active sync   /dev/sda6
       1       8       34        1      active sync   /dev/sdc2

Problemas

Unexpected inconsistency

Al encender el ordenador, cuando esta cargando ubuntu se para el proceso y saca el siguiente mensaje:

Log of fsck -C3 -R -A -a
Sat Sep 19 13:01:06 2009
 
fsck 1.41.4 (27-Jan-2009)
D: The filesystem size (according to the superblock) is 61277926 blocks
The physical size of the device is 61277904 blocks
Either the superblock or the partition table is likely to be corrupt!
 
D: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
    (i.e., without -a or -p options)
 
fsck died with exit status 4
Sat Sep 19 13:01:07 2009
----------------

Se queda parado en la consola y tengo que poner exit para que siga la carga de ubuntu.

Solución

Este problema me apareció cuando metí al raid un sistema de ficheros ya creado para no tener qeu mover los datos que contenía. Y para solucionarlo, tuve que seguir estos pasos:

  • Quitar el raid (según indico en este artículo).
  • Volverlo ha hacer mediendo al raid una partición vacía.
  • Formatear el raid.
  • Copiar los datos en el raid.
  • Y por último meter la otra particion por el raid.

Has no superblock

A veces, cuando intentas activar un raid, puede aparecer el siguiente error:

>> sudo mdadm -A /dev/md1
mdadm: /dev/sdd2 has no superblock - assembly aborted

Miramos primero que raids tenemos activados:

>> cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md1 : inactive sda7[1](S)
      271610816 blocks
       
md_d1 : inactive sdd3[0](S)
      271610816 blocks

unused devices: <none>

Solución

Como podemos ver, hay un dispositivo que se ha creado con una de las particiones del raid md1, por eso no deja activarlo. Para solucionarlo tendremos que parar los dos raid (el que no nos funciona y el desconocido) y luego activaremos y montaremos el nuestro:

>> sudo mdadm --stop /dev/md_d1
mdadm: stopped /dev/md_d1
>> sudo mdadm --stop /dev/md1
mdadm: stopped /dev/md1
>> sudo mdadm -A /dev/md1
mdadm: /dev/md1 has been started with 2 drives.
>> sudo mount /dev/md1
temas: 

Cómo instalar una impresora multifunción Epson en Ubuntu

 Epson Stylus DX7400 en linux

Introducción

Yo tengo una Epson Stylus DX7400 aunque el proceso creo que sirve también para las siguientes:

  • Las siguientes Epson Stylus: CX2800, CX2900, ME200, CX3900, DX4000, CX4100, CX4200, DX4200, CX4900, CX5000, DX5000, CX5900, CX6000, DX6000, CX7400, DX7400, CX8300, CX8400, DX8400, CX9300F, CX9400Fax y DX9400F.
  • Las siguientes Epson Stylus Photo RX560, RX580, RX590, RX585, RX595, RX610, RX640, RX650, RX680, RX685 y RX690.

Instalación

Impresora

Para instalar la impresora en linux tendremos que hacer lo siguiente:

  • Tendremos que ir a esta webhttp://www.avasys.jp/english/linux_e/dl_spc.html.
  • Tendremos que rellenar el formulario indicando la multifunción que tenemos y los demás datos.
  • Para enviar el formulario le daremos al botón Next.
  • Ahora entre los archivos que nos mostrará tendremos que bajarnos el archivo deb de pipslite (por ejemplo: pipslite_1.4.0-3_i386.deb).
  • Ahora instalamos los deb:

>> dpkg -i pipslite_1.4.0-3_i386.deb

  • Tendremos que ejecutar el siguiente comando para generar el archivoo PPD:

>> sudo pipslite-install

  • Reiniciamos cups:

>> sudo /etc/init.d/cups restart

  • Y por último tendremos que crear la impresora en el menú de las impresoras.

Escaner

Para instalar el escaner de nuestra multifunción, tendremos que hacer lo siguiente:

  • Lo primero que tendremos que hacer es instalar el programa y utilidades para los escaners de linux:

>> sudo apt-get install sane sane-utils xsane

  • Tendremos que ir a esta webhttp://www.avasys.jp/english/linux_e/dl_spc.html.
  • Tendremos que rellenar el formulario indicando la multifunción que tenemos y los demás datos.
  • Para enviar el formulario le daremos al botón Next.
  • Ahora entre los archivos que nos mostrará tendremos que bajarnos el archivo deb de iscan (por ejemplo: iscan_2.20.1-1_i386.deb).
  • Ahora instalamos los deb:

>> dpkg -i iscan_2.20.1-1_i386.deb

  • Miramos si se detecta el escaner (la multifunción tendrá que estar encendida):

>> sane-find-scanner 
  ...
  found USB scanner (vendor=0x04b8, product=0x0838) at libusb:001:003
  ...

  • Ye esta instalado el escaner.

Uso

Para usar el escaner  tenemos el programa Xsane.

Comprobar que un juego grabado de xbox 360 es Stealth

Juegos Xbox 360 Stealth

Introducción

Antes de nada tendremos que familiarizarnos con ciertos términos.

  • Stealth: Un juego grabado es stealth cuando es indetectable que lo diferencien con uno original (o eso se cree en teora) en Xbox Live.
  • Región free: Un juego es Region Free cuando funciona en consolas de cualquier región. Por ejemplo si un juego NTSC/USA es Region Free podrems jugar a l en nuestra consola PAL.

Para hacer las comprobaciones vamos a usar un programa llamado Abgx360.

Windows

Instalación

 En windows la instalación es muy sencilla. Nos lo tendremos que bajar de la página de abgx360 y ejecutar el archivo para que lo instale.

Linux

Instalación

Lo primero de todo es bajarnos el programa para linux. En linux tenemos varios archivos:

  • Uno es el programa en si, que es por consola de comandos (por ejemplo abgx360-1.0.1.tar.gz).
  • Otro es una interfaz gráfica, ya que no es fácil saberse todos parámetros del programa. La interfaz es solo la interfaz, tendréis que instalar tambión el programa para poderlo usar. (por ejemplo abgx360gui-1.0.1.tar.gz)
  • El último son los datos. (por ejemplo abgx360data.tar.gz)

Una vez que hallamos bajado la última versión del programa vamos a compilarlo e instalarlo:

>> tar -zxvf abgx360-1.0.1.tar.gz
>> cd bgx360-1.0.1
>> sudo apt-get install libcurl4-openssl-dev zlib1g-dev
>> ./configure
>> make
>> sudo checkinstall -D --install=no
>> sudo dpkg -i abgx360_1.0.6-1_amd64.deb

Una vez hemos instalado el programa vamos a instalar la interfaz gráfica:

>> tar -zxvf abgx360gui-1.0.1.tar.gz
>> cd bgx360gui-1.0.1
>> sudo apt-get install libwxgtk2.8-dev xterm
>> ./configure
>> make
>> sudo checkinstall -D --install=no
>> sudo dpkg -i abgx360gui_1.0.2-1_amd64.deb

 Uso

Para abrir el programa tendremos que escribir en una consola la siguiente orden (o podemos crearnos un enlace en la barra de tareas):

>> abgx360gui

Problemas

Zlib not found

Al intentar compilar en linux nos aparece el siguiente error:

>> ./configure
...
configure: error: "zlib not found!"

Solución

No tenemos instalado el paquete de desarrollo de la librería zlib. Lo instalamos con la siguiente orden:

>> sudo apt-get install zlib1g-dev

Libcurl not found

Al intentar compilar en linux nos aparece el siguiente error:

>> ./configure
...
configure: error: "libcurl not found!"

Solución

No tenemos instalado el paquete de desarrollo de la librería libcurl. Para instalarlo tendremos que ejecutar la siguiente orden:

>> sudo apt-get install libcurl3-dev

wxWidgetsgets no instalados

Cuando estamos compilando la interfaz de ABGLX360 nos puede aparecer el siguiente mensaje de error:

>> ./configure
...
checking for wx-config... no
configure: error:
wxWidgets must be installed on your system.
Please check that wx-config is in path, the directory
where wxWidgets libraries are installed (returned by
'wx-config --libs' or 'wx-config --static --libs' command)
is in LD_LIBRARY_PATH or equivalent variable and
wxWidgets version is 2.5.0 or above.

Solución

El problema esta en que no tenemos instalado el paquete de desarrollo de la librería wx. A día de hoy me pedía una versión superior a la 2.5, asi que instale la última, que era la 2.8.

>> sudo apt-get install libwxgtk2.8-dev

libwx_gtk2u_richtext-2.8 Not found

Al ejecutar abgx360gui nos aparece un error indicando que no encuentra la librería libwx_gtk2u_richtext-2.8:

abgx360gui: error while loading shared libraries: libwx_gtk2u_richtext-2.8.so.0: cannot open shared object file: No such file or directory

Solución

La instalamos:

>> sudo apt-get install libwxgtk2.8-dev

 

Error: timed out

Puede pasarnos que en el resultado de analizar un dvd nos encontremos con el siguiente mensaje de aviso en letras amarillas en el comienzo:

ERROR: Resolving timed out after 20530 milliseconds
There seems to be a problem with the db so online functions have been disabled
Try again later...

Solución

Para solucionarlo tendremos que crear un fichero en la ruta /home/USUARIO/.abgx360/abgx360.ini con el siguiente contenido:

# http directory that contains verified ini files
web_inidir: http://5.39.25.104/Apps/verified/

# http directory that contains unverified ini files
web_unverifiedinidir: http://5.39.25.104/Apps/unverified/

# http path to GameNameLookup.csv
web_csv: http://5.39.25.104/Apps/Stealth360/GameNameLookup.csv

# http path to abgx360.dat
web_dat: http://5.39.25.104/Apps/Stealth360/abgx360.dat

# http path to topology.php
web_topology: http://5.39.25.104/Apps/topology.php

# http directory that contains SS/DMI/PFI/Video stealth files
web_stealthdir: http://5.39.25.104/Apps/StealthFiles/

# http form for submitting AutoUploads
web_autoupload: http://5.39.25.104/Apps/Control/AutoUpload.php

Ahora cuando abramos el programa y volvamos a analizar un dvd nos funcionará.

 

 

Migración de cvs a subversion

Cvs2svn

Introducción

Hace pocos meses que tuve que pasar de usar un servidor de CVS para usar uno de Subversión (este nos proporcionaba más cosas que el primero). En nuestro servidor de cvs tendríamos alrededor de 250 proyectos y la verdad es que me han salido muchos problemas, pero al final se pasó todo. Para la migración estuve mirando por internet y vi que todo el mundo utilizaba un programa llamado cvs2svn. A continuación os explico como hacerlo y la lista de los problemas que me aparecieron y sus soluciones.

Migración

Para importar nuestro repositorio de cvs a subversion (svn) usaremos el programa cvs2svn. Lo tendremos que bajar, descomprimir y ejecutar con los correspondientes parámetros:

>> wget http://cvs2svn.tigris.org/files/documents/1462/44372/cvs2svn-2.2.0.tar.gz
>> gzip -d cvs2svn-2.2.0.tar.gz
>> tar -xvf cvs2svn-2.2.0.tar
>> cd cvs2svn-2.2.0
>> ./cvs2svn --existing-svnrepos --encoding iso8859_15 -s /var/www/html/svn/root ../CVSROOT/miproyecto

Podéis mirar aquí para ver que encodings podemos poner.

Como mi caso, si queréis tener un repositorio multiproyecto tendréis que indicarle a cada proyecto que importéis que las carpetas trunk, branches y tags las meta dentro de una carpeta con el nombre del proyecto. Por ejemplo asi:

>> ./cvs2svn --existing-svnrepos --encoding iso8859_15 --trunk=miproyecto/trunk --branches=miproyecto/branches --tags=miproyecto/tags -s /var/www/html/svn/root ../CVSROOT/miproyecto

Problemas

is not a CVS repository

Al intentar importar una carpeta que contiene un proyecto del cvs nos da el siguiente error:

ERROR: the path '/root/miproyecto' is not a CVS repository, nor a path within a CVS repository. A CVS repository contains a CVSROOT directory within its root directory.

Solucion

Metemos la carpeta del proyecto en una carpeta llamada '''CVSROOT'''. Por ejemplo si nuestro proyecto esta en /root/miproyecto quedaría en /root/'''CVROOT'''/miproyecto.

co: No such file or directory

Al ejecutar el programa cvs2svn con la opción '''--use-rcs''' nos aparece el siguiente error:

ERROR: error executing co: [Errno 2] No such file or directory
Please check that co is installed and in your PATH
(it is a part of the RCS software).

Solución

No tenemos instalado el paquete '''rcs''' que contiene el programa '''co'''. Lo instalamos:

* Para sistemas Debian, Ubuntu, ...

>> sudo aptitude install rcs

* Para sistemas Centos, Redhat, ...

>> sudo yum install rcs

No such file or directory

Al ejecutar la importación de un proyecto del cvs a svn nos aparece el siguiente mensaje de error:

Exception occurred while parsing /projects/cvsroot/miproyecto/prueba/Attic/text.html,v
Traceback (most recent call last):
File "/cvs2svn-2.2.0/cvs2svn", line 31, in ?
main(sys.argv[0], sys.argv[1:])
File "/cvs2svn-2.2.0/cvs2svn_lib/main.py", line 88, in main
pass_manager.run(run_options)
File "/cvs2svn-2.2.0/cvs2svn_lib/pass_manager.py", line 181, in run
the_pass.run(run_options, stats_keeper)
File "/cvs2svn-2.2.0/cvs2svn_lib/passes.py", line 152, in run
cd.process_project(project)
File "/cvs2svn-2.2.0/cvs2svn_lib/collect_data.py", line 1329, in process_project
pdc.process_file(cvs_file)
File "/cvs2svn-2.2.0/cvs2svn_lib/collect_data.py", line 1014, in process_file
cvs2svn_rcsparse.parse(open(cvs_file.filename, 'rb'), fdc)
IOError: [Errno 2] No such file or directory: '/projects/cvsroot/miproyecto/prueba/Attic/text.html,v'

Comprobamos que el fichero existe:

>> ls /projects/cvsroot/miproyecto/prueba/Attic/text.html,v
/projects/cvsroot/miproyecto/prueba/Attic/text.html,v

Solución

Este problema fue muy raro. La carpeta donde almacenaba los proyectos del cvs estaba compartida en otra máquina y la tenia montada donde esta instalado el cvs. Creo que el problema era algo causado por la arquitectura de mi entorno. Al final tuve que copiar la carpeta del proyecto desde el ordenador donde estaba al ordenador donde tenía el servidor de cvs y estaba ejecutando el script de migración. Entonces ejecuté el program

Archivos duplicados, Attic

Al hacer la migración con el programa cvs2svn podemos encontrarnos con un error como este:

'''ERROR''': A CVS repository cannot contain both /repositorio/cvsroot/proyecto/src/file.java,v and /repositorio/cvsroot/proyecto/src/Attic/file.java,v

Solución

Antes de explicar el problema tenemos que saber que las carpetas Attic las usa cvs para guardar ficheros que han sido borrados en nuestro proyecto, para poder recuperarlos en caso necesario. Normalmente si tienes un fichero llamado path/file.txt en tu proyecto, CVS almacena su historia en un fichero llamado repo/path/file.txt,v. Pero si el fichero file.txt es borrado en la rama principal de desarrollo, CVS mueve el fichero de la historia a una subcarpeta especial llamada Attic: repo/path/Attic/file.txt,v. (Si el fichero se vuelve a crear, entonces este es movido fuera del directorio Attic donde estaba ántes.) El repositorio nunca debería contener ambos ficheros al mismo tiempo.

Este mensaje de error indica una leve corrupción en tu repositorio CVS. El archivo que da el problema tiene dos historias en conflicto, e incluso el CVS no sabe cual es la historia correcta. La corrupción probablemente fue creada al usar otras herramientas a parte del CVS para hacer copias de seguridad o manipular los archivos en tu repositorio. Con un poco de trabajo puedes ver las dos historias abriendo los dos ficheros en un editor de texto y así saber cual es el correcto.

Hay 4 maneras de corregir este problema, pero cada una tiene sus desventajas. Recuerda hacer una copia de seguridad antes de empezar. Nunca ejecutes el programa cvs2svn con un repositorio cvs en funcionamiento, trabaja siempre con una copia.

  • Vuelve ha hacer la migración con la opción --retain-conflicting-attic-files.  Esto hace que la verión Attic y no Attic de el fichero sea convertida separadamente almacenando la version Attic en un subdirectorio path/Attic/file.txt. Esto evita la perdida de cualquier historia, pero al moverlo a otro directorio proboca que el historio de revisiones se rompa.
  • Borra la versión Attic del fichero e  intentar otra vez la migración del proyecto. En algunas ocasiones esto representará una vieja versión del fichero que fue borrada hace tiempo. Pero estaremos descartando la historia de uno de los ficheros, probablemente esto causará la perdida de la historia antigua del fichero. Acuerdate de hacer una copia de seguridad del fichero antes de borrarlo.
>> rm /repositorio/cvsroot/proyecto/src/Attic/file.java,v
  • Borrar la versión de fichero no Attic e intentar otra vez la migración del proyecto. Esto puede ser apropiado si el fichero no Attic tiene menos contenido importante que la version Attic. Pero esto descarta una de las dos historias y probablemente causará la perdida de los cambios más recientes del fichero. Antes de borrarlo aseguraos de hacer una copia de seguridad del fichero que borréis.
>> rm /repositorio/cvsroot/proyecto/src/file.java,v
  • Renombrar la versión no Attic de el fichero e intentar otra vez la migración del proyecto. Esto nos evita perder historia, pero cambia el nombre del fichero no Attic.
>> mv /repositorio/cvsroot/proyecto/src/file.java,v /repositorio/cvsroot/proyecto/src/file-not-from-Attic.java,v