martes, 18 de febrero de 2014

Acomodando virt-install para Debian sobre OpenSuSE

Siguiendo la línea de una anterior entrada, me pareció que todo iba bien hasta el momento en que tuve que virtualizar un sistema Debian.
Usando paravirtualización y escogiendo un servidor HTTP como fuente del árbol de instalación, mediante las herramientas virt-manager (Que se encuentra en los repositorios de Open SuSE y CentOS, por ejemplo ), el comando de instalacion

virt-install --prompt --network bridge=br0 --virt-type=xen --location http://ftp.egr.msu.edu/debian/dists/wheezy/main/installer-amd64/ -n enlace --description enlace -r 512 --vcpus=1 --disk path=/dev/system/gateway --os-type=linux --paravirt --arch x86_64 
me arrojaba el siguiente error:
ERROR    'NoneType' object has no attribute '__getitem__'
Después de revisar el log de virt-manager
tail -f  ~/.virtinst/virt-install.log
Llegué a la siguiente solución
Abrimos el fichero
vim /usr/lib/python2.7/site-packages/virtinst/OSDistro.py 
 
Aproximadamente en la línea 80 de dicho fichero, empieza una selección en la código de esta forma (La lista de hecho se extiende un poco màs)

 # FIXME: This 'distro ==' doesn't cut it. 'distro' is from our os
    # dictionary, so would look like 'fedora9' or 'rhel5', so this needs
    # to be a bit more intelligent
    if distro == "fedora" or distro is None:
        stores.append(FedoraDistro)
    if distro == "rhel" or distro is None:
        stores.append(RHELDistro)
    if distro == "centos" or distro is None:
        stores.append(CentOSDistro)
    if distro == "suse" or distro is None:
        stores.append(SuseDistro)
    if distro == "sl" or distro is None:
        stores.append(SLDistro)
    if distro == "debian" or distro is None:
        stores.append(DebianDistro) ... 

Básicamente, el cambio consiste en cambiar el orden de las opciones. Hasta ahora el error sólo aparece cuando el sistema es Debian, por lo tanto basta con anteponer este a SuSE Empresarial
if distro == "fedora" or distro is None:
        stores.append(FedoraDistro)
    if distro == "rhel" or distro is None:
        stores.append(RHELDistro)
    if distro == "centos" or distro is None:
        stores.append(CentOSDistro)
    if distro == "debian" or distro is None:
        stores.append(DebianDistro)
    if distro == "suse" or distro is None:
        stores.append(SuseDistro)
    if distro == "sl" or distro is None:
        stores.append(SLDistro)

Obviamente, si hoy problemas de ese tipo con otras distribuciones, entonces también puede cambiarse el orden con respecto a SLES. 
Y claro, el problema pasa por ser más complicado, pero esta solución chapucera realmente me funciona

lunes, 17 de febrero de 2014

Problemas con el cliente ownCloud en Open SuSE

Instalo la versión 1.5.1 del cliente de ownCloud para openSuSE 13.1 desde un One Click Install y tras configurarlo y descargar los archivos, me aparece el siguiente error:
No se puede iniciar un registro (journal) de sincronización
Imagen del error
 La solución es tan simple como instalar el plugin de sqlite para QT 4.
zypper info libqt4-sql-sqlite
No entiendo como es que esta dependencia no sea había resuelto. Quizá suponían que cualquier sistema tendría instalado ese paquete, pero en openSuSE 13.1 con XFCE parece que ningún otro programa lo necesita.

Por cierto, para darse cuenta del error, bastó con revisar el fichero .csync_journal.db, que se crea en cada directorio que se sincroniza, con el comando file, y ver que al empezar no lo reconocía sino como un archivo vacío, cuando en realidad su tipo debería ser SQLite 3.x database.

sábado, 15 de febrero de 2014

Afinando nuestro servidor Xen en Open SuSE

Virtualizar con Open SuSE podría parecer más fácil (que no sencillo) que en otras distros, por el hecho que casi todo es más fácil (que no sencillo) que hacer que en otras distros.

Sólo agrego una último detalle del que parece que nadie se había dado cuenta que faltaba:

Según las buenas prácticas de Xen, se aconseja especificar un máximo de memoria RAM a ser usado por Domain-0. Y no estaría mal el limitar el número de núcleos del procesador a ser usados por él. Que aparte de seguir con la costumbre de no dejar configuraciones por defecto, permite que se gane un poco en rendimiento.

No entiendo porque las herramientas gráficas de OpenSuSE no me funcionaron para ello. Me salté el problema agregando lo siguiente al archivo /etc/default/grub, de donde se leen las configuraciones para crear el archivo  /boot/grub2/grub.cfg
GRUB_CMDLINE_XEN="resume=/dev/system/swap dom0_mem=2048M,max:2048M dom0_max_vcpus=1 splash=silent quiet showopts" 
 Tal como la documentación de Xen lo dice, lo importante acá son las opciones dom0_mem=2048M,max:2048M dom0_max_vcpus=1 

Luego, se crea el archivo grub.cfg de acuerdo a nuestra nueva configuración
grub2-mkconfig -o /boot/grub2/grub.cfg
Después basta con reiniciar, y al volver podrá verse que Domain-0 se restringe al uso de los recursos del sistema tal como se ha especificado.
Algunas pruebas de como la configuración ha funcionado
Y si, posiblemente sea lo que se tenga que hacer en otras distribuciones con Grub2

domingo, 28 de abril de 2013

"Instalar" Java: update-alternatives

Para Open SuSE,funciona el RPM que está en el sitio de Oracle (Dicho sea de paso, la navegabilidad del sitio siempre me ha parecido disfuncional)
Se instala con un simple rpm -ivh siendo administrador.

Acá viene lo bueno: Recuerdo que alguna vez usando el RPM, al final de la instalación empezaba un script que automatizaba la tarea. O no recuerdo si fue en Fedora, pero el caso que esta última vez lo único que hizo el instalador es copiar los paquetes a una dirección concreta: /usr/java/jdk1.7.0_21/ (La cual de hecho me parece "un poco incorrecta")

La cuestión es que en esta ubicación solo podemos ejecutar los archivos con su ruta absoluta, porque no se encuentran en el PATH del sistema. Lo único que ya esta en un PATH válido es jcontrol, una utilidad para configurar monitorear la máquina virtual de java.
Si bien podriamos agregar esa ruta, desinstalar el jdk que trae por defecto y así, creo que la forma más elegante es cambiarlo con update-alternatives

Update-alternativas permite tener instalado en el sistema varios programas iguales en características (Como en este caso, dos máquinas virtuales de java), pudiendo escoger uno para tal o cual ocasión, de una manera limpia, mediante un sistema de enlaces simbólicos.
Dicho esto, lo único que necesitamos es ejecutar:
update-alternatives --install /usr/bin/java java /usr/java/jdk1.7.0_21/bin/java 200 \
--slave /usr/bin/jar jar /usr/java/jdk1.7.0_21/bin/jar \
--slave /usr/bin/jarsigner jarsigner /usr/java/jdk1.7.0_21/bin/jarsigner \
--slave /usr/bin/javadoc javadoc /usr/java/jdk1.7.0_21/bin/javadoc \
--slave /usr/bin/javah javah /usr/java/jdk1.7.0_21/bin/javah \
--slave /usr/bin/javap javap /usr/java/jdk1.7.0_21/bin/javap

Una vez hecho esto, update-alternatives --config java bastará para escoger cuál es la versión de java que usaremos: Si la que traía por defecto o la que acabamos de instalar.
La utilidad de usar la opción --slave es que creará una especie de grupo alternativa, con solo escoger java, todas las demás opciones será escogidas con él

En Open SuSE me dió error incluir javac dentro del grupo, por lo que basta con eliminarlo e incluirlo aparte

update-alternatives --install /usr/bin/javac javac /usr/java/jdk1.7.0_21/bin/javac 10.

Como no había ninguna otra alternativa instalada, automáticamente lo escogió a él.

Basado parcialmente en How to setup up a new JDK with update-alternatives?

miércoles, 28 de marzo de 2012

Primeros pasos con Git

Git es básicamente un sistema de control de versiones. Es decir, ayuda a centralizar y administrar los cambios en el código de un proyecto. Lo usan pesos pesados como el mismo kermel de linux... E incluso Microsoft le da soporte en codeplex. Histeria y controversia aparte...

Para esta guía, sería bueno que vieras mi post sobre DNS, que aún no esta escrito.
En tanto porque puede ser más cómodo trabajar con nombres DNS que con direcciones IP

Instalación

Necesitamos git obviamente, y activar su soporte para ssh.
aptitude install apache2 git-core gitweb openssh-server
Sin embargo, puede que el ssh ya lo estés usando desde hace rato. Y el servidor Apache suelo instalarlo desde el principio. Esto puede bastar.
aptitude install git-core  gitweb

Configuración inicial.

Por razones de seguridad, es necesario que crees un usuario con contraseña en el sistema.
useradd git -c "Usuario Git" -m  passwd git
Nota: Por ahora no he podido hacer que este usuario funcione del todo. Mi vergüenza es infinita.
Use el usuario sin privilegio que cree al instalar Debian.

Configurando Apache

Intenté hacerlo más interesante usando Virtual Host para Apache. En resumen, apache en Debian usa dos directorios para guardar la configuración de los Virtual Host: sites-available y  sites-enabled, ambos dentro de /etc/apache/
Mi fichero se llama gitweb y se encuentra en ambos directorios. Puede servir de ejemplo para la configuración de otro VirtualHost
su root
cd /etc/apache2/
cp sites-available/{default,gitweb}

cat >gitweb <<EOF
<VirtualHost *:80>
ServerName git.xibalba.com
ServerAdmin webmaster@mail
DocumentRoot /usr/share/gitweb
<Directory /usr/share/gitweb>
Allow from all
AllowOverride none
Order allow,deny
<Files gitweb.cgi>
Options FollowSymLinks +ExecCGI
AddHandler cgi-script .cgi
</Files>
</Directory>
#DirectoryIndex /usr/share/gitweb/gitweb.cgi
SetEnv GITWEB_CONFIG /etc/gitweb.conf
ErrorLog ${APACHE_LOG_DIR}/error.log 
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
EOF

cp sites-available/gitweb sites-enabled/
service apache2 reload
Esto es lo que ves cuando apuntas a la dirección especificada en la configuración
Tengo otro post que aún no he escrito donde explico un poco más como funciona Virtual host. Existen otras combinaciones, para el caso esta sirve.
Debes hacer una entrada en el DNS que apunte hacia este host. Sí, la puedes ver en el post que aún no he escrito pero te adelanto que es sobre usar Webmin un poco.

Configuración de Git en el servidor.

De ahora en adelante usaremos el usuario que hemos creado por seguridad.
su- git
Encendemos el servicio
git daemon --base-path=/var/cache/git --detach --syslog --export-all
Nos movemos un poco
cd /var/cache/git

Creamos el directorio del repo. El nombre vienen dado por *.git. En este caso se llama
mkdir proyectophp.git
Entremos.
cd proyectophp/git
Iniciamos el repositorio en toda regla
git init
Le damos un poco de personalidad con una pequeña y corta descripción
echo "Este es el nuevo repositorio"> .git/description
Configuramos el usuario que va a mostrarse en todos los log y en la interfaz web.
git config --global user.name "Alexander Ortíz"
git config --global user.mail "vtacius@mail.com"

Este es nuestro proyecto. Vacío por ahora
Lo que sigue es la forma más básica de trabajar con los ficheros. 
Creamos el primer archivo. Usualmente un README es necesario en cualquier proyecto. Excusa al menos.
vim README
Agregamos el fichero.
git add README
Haces el envío de este a la copia del repositorio que tenemos en nuestro repo (En este caso el servidor)
git commit -a -m "Este es el primer envío de Administrador"
Acá se encuentra ya nuestro primer envío

Configuración de Git en el cliente. 

La siguiente es una de las tantas formas de exportar un repo. Hay bastante documentación al respecto, a veces quisiera tener la paciencia de leerla toda. Básicamente esto es la configuración de los clientes.

git clone \
 vtacius@git.xibalba.com:/var/cache/git/proyectophp.git proyectophp
cd proyectophp
Te darás cuenta que el archivo README esta en el directorio. Esa es la magia de Git

Configuras algunos aspectos, útiles para saber quién es realmente quién envía cada cambio y cosa
 
git config --global user.name "Anibal Barca"
git config --global user.mail "aníbal@mail.com"

Digamos que tu quieres hacer un aporte serio al proyecto.

 
vim index.php
git add index.php
git commit -a -m "Este es el prímer envío de Aníbal Barca"
git push
Pero no funciona. Te tira un mensaje en Inglés de la siguiente forma:
  remote: error: refusing to update checked out branch: refs/heads/master
  remote: error: By default, updating the current branch in a non-bare repository
  remote: error: is denied, because it will make the index and work tree inconsistent
  remote: error: with what you pushed, and will require 'git reset --hard' to match
  remote: error: the work tree to HEAD.
  remote: error: 
  remote: error: You can set 'receive.denyCurrentBranch' configuration variable t
  remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
  remote: error: its current branch; however, this is not recommended unless you
  remote: error: arranged to update its work tree to match what you pushed in some
  remote: error: other way.
  remote: error: 
  remote: error: To squelch this message and still keep the default behaviour, set
  remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
  To vtacius@git.xibalba.com:/var/cache/git/persona.git
  ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'vtacius@git.xibalba.com:/var/cache/git/persona.git'

Yo y mi deficiente inglés llegamos a la conclusión que esto es lo que quería:
Ejecutas en el servidor.

git config receive.denyCurrentBranch warn
De ahora en adelante, cada vez que algunos de los clientes envíe algo, debe ejecutarse lo siguiente en el servidor
git reset --hard
Esta es la prueba que todo valió la pena
Por ahora creo que me reservo otra entrada para que sigamos aprendiendo sobre esta onda. Al menos me ha para
Agradezco a Casidiablo.net y Pixhero, porque mi posts es casi una copia descarada de ambos post 

martes, 13 de marzo de 2012

El último que quedaba: Google Groups se entra a la onda moderna

Será que a muchos ya les habrá llegado la notificación hace tiempo, pero recién me entero que Google Groups ya entra en el mundo de los cambios que de diseño.

¿Soy el único al tantas superficies lisas y colores neutros es demasiado iCool?

Esto lo voy a extrañar. Cutre pero me encantaba
Ahora todo va más en la onda de las listas, como queriendo adaptar todo a interfaces más reducidas. Bien por los que lo usan desde dispositivos móviles
Recuerdo haber tenido otros grupos. Recuerdo el spam también
Pero bien, el trauma de apenas acostumbrarte a algo nuevo. Al menos ha dado un salto hacia la simplicidad.
Obvio, la compañía necesita unificar su imagen.
Se que este pasará por el post más SOSO que he hecho.

martes, 21 de febrero de 2012

Ripeando cd de música desde consola. Algunos apuntes de Multimedia

Esta es prácticamente una entrada obligatoria en cualquier blog linuxero, y como se supone que ese es el motivo de este blog, ahí les va:

En el casi improbable caso que tengan un CD de música que les ande por allí y que quieran ripear en archivos mp3 -u ogg, que no esta nada mal-, y en vista que quizá ya estén tan acostumbrados a la consola que posiblemente estén leyendo esto desde links, lo que hay que hacer se resume en dos sencillos pasos.

Primero, hay que ripear propiamente todo el CD. Usamos cdparanoia desde Se hace así:
cdparanoia -vsZB
Donde v es el típico verbose de la mayoría de comandos. El s es para escanear donde hay un CD, y no es necesario si no tienes más que un lector.
B es la opción. Básicamente, es el único necesario para ripear. Pero le agregamos Z para que vaya más rápido evitando la verificación de datos y características de corrección de errores.
Ahora hay que convertir a mp3 propiamente dicho, pues lo que tenemos ahora son un montón de archivos wav que si bien es cierto son teóricamente la mejor calidad posible, son demasiado grandes.
Para convertirlo es necesario usar lame.
lame -hb 192 track01.cdda.wav track01.mp3
h es la opción de la esperanza. Trata de hacer un ripeo de calidad con valores predeterminados, y b es el famoso bitraje que le hemos seteado en 192. Si se setea a 160 por ejemplo, el peso del archivo disminuye un 16%, pero no he comprobado nada de la calidad con que queda.

Podemos darle más opciones para que salga algo más acabado. Veamos las etiquetas ID3 tag más interesantes.

--tt Titulo de la canción (30 caracteres máximo)
--ta Nombre del artista (30 caracteres máximo. Creo)
--tl Album     
--tn Número de track.
--tg Género

Por ejemplo, una canción podría ir de esta forma.
lame -h -b 192 --tt "Morningstar" --ta "Gehena" --tl \
"First Spell" --tn 5 track01.cdda.wav Gehena\ -\ Morningstar.mp3

Y bien, eso es todo por ahora. Lo puedes hacer en forma de script para varias canciones, vamos, esa es de las partes divertidas. Por ejemplo
for i in $(ls *.wav ); 
do 
  lame -h -b 192 --tt $(basename $i cdda.wav) --ta "Oradores" \ 
--tl "Vocabulario en Inglés" $i $(basename $i cdda.wav)mp3; done

Que logra su cometido. Alguien más avispado podrá resolver lo del nombre para cada uno... Algo con dialog, quizá...

Tomando en cuanta que se puede usar Rhytmbox, Banshee o EasyTAG para cambiar las etiquetas, creo que es bastante ayuda.

La fuente es esta. Incluso el script final, -que solo modifique un poco-.

Otros apuntes interesantes

Otros apuntes interesantes