Mortuux

Diario de un estudiante geek. Informática, tecnología, programación, redes, sistemas operativos, bases de datos…

ATENCIÓN: EL BLOG CAMBIA DE DIRECCIÓN

He decidido cambiar de hosting y de dirección.

La nueva dirección pasa a ser:

http://www.aesptux.com

 

 

Muchas gracias, y disculpen las molestias del cambio.

Visión general de los Kernel Unix (I): Modelo Proceso/Kernel.

Proveen un entorno de ejecución donde las aplicaciones se ejecutan. Luego, el kernel debe implementar un conjunto de servicios y sus correspondientes interfaces. Las aplicaciones utilizan esas interfaces y normalmente no interactuan directamente con los recursos hardware.

Una CPU puede ejecutarse en modo Usuario o en modo Kernel. En realidad, algunas CPUs pueden tener más de dos modos de ejecución, pero todos los kernel estándar de Unix utilizan los dos modos mencionados anteriormente.

Cuando un programa es ejecutado en modo usuario, no puede acceder directamente a las estructuras del kernel o a los programas de éste. Cuando se ejecuta en modo Kernel, sin embargo, esas restricciones desaparecen. Cada modelo de CPU provee instrucciones especiales para cambiar de modo Usuario a modo Kernel y vice versa. Un programa normalmente se ejecuta en modo Usuario y cambia a modo Kernel sólo cuando requiere de un servicio que provee el kernel. Cuando el kernel ha completado la petición del programa, vuelve a modo Usuario.

Los procesos son entidades dinámicas que normalmente tienen una vida limitada en el sistema. La tarea de crear, eliminar y sincronizar los procesos existentes se delega a un grupo de rutinas del kernel.

El kernel como tal, no es un proceso si no un gestor de procesos. El modelo proceso/kernel asume que los procesos que requieren un servicio kernel utilizan lo que se conoce como llamadas al sistema. Cada llamada al sistema establece el grupo de parámetros que identifican la petición del proceso y después ejecuta la instrucción CPU independiente del hardware para cambiar de modo Usuario a modo Kernel.

Además de los procesos de usuario, los sistemas Unix incluyen unos pocos procesos privilegiados llamados hilos kernel (kernel threads) con las siguientes características:

  • Se ejecutan en modo Kernel en el espacio de direcciones Kernel
  • No interactuan con usuarios, no requiere dispositivos terminales.
  • Normalmente son creados durante el inicio del sistema y permanecen vivos hasta que el sistema se apaga.
Los kernel Unix hacen mucho más que gestionar llamadas al sistema; de hecho, las rutinas kernel pueden ser activadas de diferentes formas:
  • Un proceso invoca una llamada al sistema
  • La CPU recibe una excepción mientras ejecuta un proceso, lo cual es una condición inusual así como una instrucción no valida. El kernel gestiona la excepcion en nombre del proceso que la causó.
  • Un hilo kernel es ejecutado. Como se ejecuta en modo Kernel, el programa correspondiente debe ser considerado parte del kernel.

Reducir el tiempo de espera para utilizar el DNS Secundario. Balanceo de carga

En el archivo /etc/resolv.conf se encuentran definidos los servidores dns, por ejemplo:

nameserver 192.168.1.10

nameserver 192.168.1.11

Éstos actuarían como dns primario y secundario respectivamente. En caso de que falle el primero, se utilizaría el segundo.

El problema se encuentra en que el tiempo de espera (timeout) es alto, alrededor de unos 5 segundos, por lo que la utilización del segundo dns no será instantánea.

Esto se puede solventar utilizando la directiva options y el parámetro timeout:

nameserver 192.168.1.10

nameserver 192.168.1.11

options timeout:1

Aquí lo que estamos indicando es que el tiempo de espera, sea de 1 segundo.

Si queremos distribuir la carga entre los dos servidores lo haremos de la siguiente manera:

nameserver 192.168.1.10

nameserver 192.168.1.11

options timeout:1 rotate attempts:1

Así, la carga se distribuirá entre los dos servidores evitando saturar siempre el primero.

Vía | rm-rf.es

Bash script que busca hosts en tu red, sincroniza carpetas y después apaga los hosts.

En clase nos pidieron hacer un script que buscase hosts en tu red para después apagarlos, o que incluso antes de apagarse sincronizasen unas carpetas.

He tratado de automatizarlo todo lo que he podido, en mi red funciona perfectamente, y el único requerimiento previo es que todos los hosts tengan instalado un servidor SSH. Este script esta pensado para hosts Linux, pero con algunos pequeños cambios se podría adaptar para Windows también.

El código es el siguiente:

#!/bin/bash

# Find online hosts on your network, backup a directory and halt them

# Copyright (C) <2011> <Adrian Espinosa>

#

# This program is free software: you can redistribute it and/or modify

# it under the terms of the GNU General Public License as published by

# the Free Software Foundation, either version 3 of the License, or

# (at your option) any later version.

#

# This program is distributed in the hope that it will be useful,

# but WITHOUT ANY WARRANTY; without even the implied warranty of

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

# GNU General Public License for more details.

#

# You should have received a copy of the GNU General Public License

# along with this program. If not, see <http://www.gnu.org/licenses/&gt;.

# If you don’t want to write every password, you should add the hosts keys to your machine.

clear

f=`echo networkscanned_$(date +%Y%m%d)`

me=`echo $(whoami)`

DIR=”put_here_your_dir_to_sync”

DEST=”put_here_your_destination”

if [ $UID -ne 0 ]

then

echo “Sorry, you have to run this script as root”

else

net=`ip route show | grep / | cut -d ” ” -f1`

echo “Please, wait while your network is scanned”

completescan=`nmap -sP $net | grep “is up” | cut -d ” ” -f2`

clear

echo “$completescan” > $f

gateway=`ip route show | grep via | cut -d ” ” -f3`

cat $f | egrep -v `echo $gateway$` > /tmp/net

cat /tmp/net > $f

rm -rf /tmp/net

ownip=`ip route show | grep src | cut -d ” ” -f12`

cat $f | grep -v $ownip > /tmp/net

cat /tmp/net > $f

rm -rf /tmp/net

echo “Starting synchronization”

for host in $(cat $f)

do

echo “Syncing with $host”

rsync –progress -avhe ssh $me@$host:$DIR $DEST &> backup.log

ssh $me@$host “shutdown -h now” &> backup.log

done

echo “Done. You may check backup.log to see if there are any errors”

rm -rf $f

exit 0

fi # END

Hay que ser root para ejecutarlo y básicamente lo que hace es lo siguiente

  • Si NO eres root
    • Sale del programa
  • Si eres root
    • Detecta tu red y máscara
    • Escanea con nmap y recoge sólo la IP de los hosts y la guarda en fichero
    • Detecta cuál es tu ip y tu gateway y los elimina del fichero anterior
    • Recorre el fichero leyendo cada hosts y haciendo las correspondientes operaciones

.

Este script lo he probado en Debian, y como digo funciona correctamente. En ubuntu hay que hacer unos pequeños cambios que podéis encontrar en mi github, también está publicado este script.

Evitar los atributos en XML.

Algunos de los problemas de (ab)usar de los atributos en XML son:

  • Los atributos no pueden contener valores múltiples. (Los elementos sí)
  • Los atributos no pueden contener estructuras en árbol. (Los elementos sí)
  • Los atributos no se pueden extender fácilmente (para futuros cambios)

Los atributos son difíciles de leer y mantener. Para datos es mejor utilizar elementos. Usa atributos para información que no sea relevante para los datos.

dia=”10″ mes=”01″ anio=”2008″
para=”Marcos” de=”Adrian” asunto=”Recordatorio”
contenido=”No te olvides de mi cumpleaños eh :P”>
</nota>

El código anterior es complicado de leer, y ya que estamos no es para nada bonito. La forma más correcta sería:

<nota>

<fecha>

<dia>10</dia>

<mes>01</mes>

<anio>2008</anio>

</fecha>

<para>Marcos</para>

<de>Adrian</de>

<asunto>Recordatorio</asunto>

<contenido>No te olvides de mi cumpleaños eh:P</contenido>

</nota>

 

Un uso que podemos dar a los atributos en XML es para metadatos, es decir, datos sobre los datos. Por ejemplo:

<nota id=”200″>

<fecha>

<dia>10</dia>

<mes>01</mes>

<anio>2008</anio>

</fecha>

<para>Marcos</para>

<de>Adrian</de>

<asunto>Recordatorio</asunto>

<contenido>No te olvides de mi cumpleaños eh:P</contenido>

</nota>

Esta nota tiene un id “200”, y otra nota cualquiera tendrá otro id diferente, para así diferenciar las posibles notas que haya.

Obteniendo información desde /proc con procinfo.

En  /proc podemos encontrar toda una fuente de información sobre nuestro sistema, y para facilitarnos la tarea, tenemos el comando procinfo, su instalación es muy sencilla:

# apt-get install procinfo

Luego lo ejecutamos con

# procinfo

Y nos mostrará la información del sistema.

Memory: Muestra el total de ram libre y ocupada. También muestra el swap

Bootup: Hora de inicio del sistema.

Load average: Media de ‘jobs’ corriendo, seguido por el número de procesos ejecutables y el número total de procesos, seguido por el PID de el último proceso ejecutado.

User: Cantidad de tiempo empleada en correr ‘jobs’ en el espacio del usuario

Nice: Cantidad de tiempo empleada en ejecutar ‘niced jobs’ en el espacio del usuario

System: Cantidad de tiempo empleada ejecutada en el espacio del kernel

Idle: Cantidad de tiempo sin hacer nada

Uptime: Tiempo que ha estado el sistema activo

Page in: Número de bloques del disco paginados en el núcleo del disco.

Page out: Número de bloques del disco paginados fuera del disco.

Swap in: Número de páginas de memoria paginadas a el swap

Swap out: Número de páginas de memoria paginadas fuera del swap

Interrupts: Número de interrupciones servidas desde que se inició el sistema.

La información completa la puedes encontrar en el respectivo manual del comando.

Drizzle. Fork de MySQL

Como bien indica el título Drizzle es un fork de MySQL, concretamente de la versión 6.0.

Desde entonces ha habido muchos cambios, como los siguientes:

Uso

  • No hay un servidor embebido. El servidor Drizzle no se puede cargar como librería compartida
  • Drizzle está optimizado para entornos concurrentes masivos
  • Diseñado para sistemas POSIX modernos
  • Windows, HP-UX e IRIX no son soportados
  • Drizzle no utiliza timezones. Todo es UTC

Instalación

  • No hay scripts/mysql_install_db o similar. Drizzle se basa en una instalación conocida como “just works” (simplemente funciona)
  • Drizzle puede escuchar en el puerto Drizzle (4427) y/o en el puerto MySQL (3306) y entender los respectivos protocolos

Procedimientos Almacenados

Drizzle actualmente no tiene ningún plugin que implemente procedimientos almacenados. La implementación en MySQL no era óptima

Comandos eliminados

  • ALTER TABLE UPGRADE
  • REPAIR TABLE
  • CREATE FUNCTION
  • CONVERT
  • SET NAMES
  • Borrado y actualizado multi-tabla

Funciones eliminadas

  • crypt()
  • bit_length()
  • bit_count()

Palabras clave eliminadas

  • CIPHER
  • CLIENTE
  • CODE
  • CONTRIBUTORS
  • CPU
  • DEFINER
  • DES_KEY_FILE
  • ENGINES
  • EVERY
  • IO
  • IPC
  • ISSUER

Objetos eliminados

  • No hay requerimiento de un schema mysql
  • No hay SET datatype, hay que usar ENUM
  • No hay comando SET NAMES, UTF-8 por defecto
  • No hay CHARACTER o CHARACTER SET, todo está por defecto en UTF-8
  • No hay TIME, DATETIME o INT
  • No hay TINYINT, SMALLINT o MEDIUMINT. Las operaciones de enteros han sido optimizadas para 32 y 64 bits
  • No hay TINYBLOB, MEDIUMBLOB o LONGBLOB. Hay un BLOB optimizado
  • No hay TINYTEXT, MEDIUMTEXT o LONGTEXT. Usar TEXT o BLOB
  • No hay UNSIGNED
  • No hay tipos de datos espaciales (GEOMETRY, POINT, LINESTRING, POLYGON)

 

Hay bastantes más cambios, pero con estos nos hacemos una idea de más o menos lo que ha cambiado en este nuevo fork que acaba de publicar su primera versión estable.

 

Podéis ver la lista de cambios completos aquí (inglés): Drizzle differences

 

Sistemas de archivos en Linux

Los sistemas de archivos de GNU/Linux se organizan de forma jerárquica, empezando desde el raíz (/)hacia abajo por una estructura de directorios y subdirectorios.

Los sistemas de archivos no se organizan de igual forma en Linux que en Windows. En éste último se utilizan letras de unidad para cada “partición” en un disco local, en un sistema de archivos de red, cd-rom u otro medio de almacenamiento. En Linux se “encajan” dentro del sistema de archivos (son directorios) através de los “puntos de montaje”.

Para acceder a las particiones actualmente configuradas en nuestro sistema (discos duros exclusivamente) utilizamos el comando fdisk -l.Para saber que particiones se están utilizando en este momento en nuestro sistema utilizamos el comando mount . Este comando nos mostrará tanto las particiones disponibles “montadas” como el lugar donde están montadas (punto de montaje).

Punto de montaje: este término se refiere al directorio que se asocia con una partición de disco o concualquier otro dispositivo de almacenamiento secundario.

 

GNU/Linux trata todos los dispositivos como archivos y tiene archivos reales que representan cada dispositivo. En Linux estos “archivos de dispositivo” se localizan en el directorio /dev. En este directorio podemos encontrar los siguientes “archivos de dispositivo”:

/dev/hda Primera unidad IDE.

/dev/hdb Segunda unidad IDE.

/dev/sda Primera unidad SCSI (también utilizada para pendrive)

/dev/sdb Segunda unidad SCSI

/dev/fd0 Disquetera

/dev/cdrom Unidad de CD-ROM

Las “particiones” se nombran igual que el dispositivo pero seguidas del número de partición. Así si tuvieramos 3 particiones el el segundo disco IDE estas se nombrarían:

/dev/hdb1

/dev/hdb2

/dev/hdb3

 

Un sistema de archivos es una forma de escribir los datos en el disco físico.Los ficheros, en casi todos los sistemas de archivos Linux, son sensibles a mayúsculas, es decir, fichero.txt no es Fichero.txt.

En Linux, cuando el sistema operativo entra a operar en modo kernel para resolver un acceso a discotrabaja con una capa intermedia de abstracción de sistema de ficheros que se denomina VFS (Virtual FileSystem). Cada sistema de archivos conoce cómo convertir una orden para VFS en algo que sea implementable en él. Esto permite a Linux trabajar con una cantidad realmente alta de sistemas de ficheros distintos de forma consistente y homogénea.

fichero /etc/fstab

Nos permite definir las particiones que se “montan” en el inicio de sistema, o las que son posible su montaje por parte de usuarios que no sean root. Cualquier dispositivo que no se encuentre en este fichero sólo podrá ser montado por el usuario root. Es un fichero con formato texto (podemos modificarlo con el editor vi) y la siguiente estructura:

1ª columna: Nombre del dispositivo o partición a montar.

2ª columna: punto de montaje.

3ª columna: sistema de archivos

.4ª columna: opciones de montaje

:rw: lectura y escritura

ro: sólo lectura

sw: partición swap

noexec: impide la ejecución

auto: se montará al inicio del sistema

noauto: no se montará en el inicio del sistema

user: permitirá a un usuario normal montar o desmontar el dispositivo en el punto de montaje indicado en la columna 2.

uid o gid: el usuario o grupo que tendrán control sobre los archivos.

5ª columna: por defecto a 0, tiene relación con los errores producidos en el arranque del montaje.

6ª columna: el número de este campo indica si el sistema de archivos necesita ser comprobado.

 

 

Script para obtener la dirección ip de uno o varios websites.

Si por algún casual como pasó con Wikileaks, a nuestros websites favoritos les quitan el dominio, sólo podremos acceder mediante ip.

He escrito un sencillo script para obtener la ip de nuestros websites favoritos:

Tiene tres modos

1 – Obtener dirección ip de un sólo dominio

2 – Importar un archivo de texto con varios dominios

3 – Importar un archivo OPML de Google Reader.

Aquí os dejo el enlace para descargar el script: Descargar script

Para ejecutarlo:

chmod +x getip.sh

./getip.sh

Hacking videojuegos. Trucos para casi cualquier juego en offline. Ejemplo Dead Space 2.

En algunas ocasiones, se nos atasca algún juego, y tiramos de alguna combinación de teclas para aumentar munición o lo que necesitemos.

En algunos juegos eso no es posible, como es el caso del Dead Space 2, en el cuál el truco para aumentar munición, dinero o nodos brilla por su ausencia.

En este caso podemos utilizar Cheat Engine.

Una breve explicación:

Cuando ejecutamos un juego, se carga el proceso en la ram. Ese proceso tiene unas variables en la ram, que pueden ser editadas mediante Cheat Engine. Estas variables pueden ser la munición, vida, dinero, etc. cualquiera que tenga el juego (¿ya pilláis por dónde va la cosa?)

Esta es la interfaz de Cheat Engine.  El botón que está recuadrado en verde es el que tenemos que pinchar para cargar el proceso, en este caso el juego que nos interese

Empezamos los pasos a seguir:

1- Abrimos el juego que nos interese, en este caso voy a abrir Dead Space 2

Munición antes de editar la variable

2- Abrimos Cheat Engine y seleccionamos el proceso del juego

3- Como sabemos que tenemos 9 balas, buscamos 9 en el buscador. Vemos que hay muchas variables. Entonces lo que haremos será gastar una bala, y dar Next scan poniendo el numero actual de balas tras el disparo, es decir 8. Y así, hasta que logremos aislar la(s) variable(s) en las que se almacena la munición

Click para ampliar

4- Una vez aislada la variable la arrastramos al cajón de abajo y con el botón derecho sacamos el menú desplegable y hacemos click en Change Record -> Value

Click para ampliar

5- Establecer el nuevo valor, en mi caso voy a poner 999, y como vemos ¡En el juego también tenemos 999 de munición!

Click para ampliar

6 – Jugar!

Yo lo he probado en el Counter Strike, modificando satisfactoriamente el dinero y la munición

Con Dead Space 2 he modificado la munición de todas las armas, el dinero, y la cantidad de nodos.

Quizás sea un poco engorroso, pero útil para cuando nos quedamos atascados.

Espero que os sirva 😀