jueves, 29 de abril de 2010

servidor ssh (Security Shell)

¿Bueno primeramente que es un servidor SSH?
SSH (Secure SHell, en español: intérprete de órdenes segura) es el nombre de un protocolo y del programa que lo implementa, y sirve para acceder a máquinas remotas a través de una red. Permite manejar por completo la computadora mediante un intérprete de comandos, y también puede redirigir el tráfico de X para poder ejecutar programas gráficos si tenemos un Servidor X (en sistemas Unix y Windows) corriendo.

Además de la conexión a otros dispositivos, SSH nos permite copiar datos de forma segura (tanto ficheros sueltos como simular sesiones FTP cifradas), gestionar claves RSA para no escribir claves al conectar a los dispositivos y pasar los datos de cualquier otra aplicación por un canal seguro tunelizado mediante SSH.

¿Como instalar SSH?
1. Abrimos una terminal y escribimos el siguiente comando
sudo apt-get install ssh
2. Ahora solo esperamos a termine la instalcion y es todo con respecto a la instalacion.

¿Como configurar el servidor SSH?Para saber las directivas que podemos realizar en el Servidor SSH, escribimos este comando:
man sshd_config

Ahora los archivos importantes para la configuracion son los siguientes:
/etc/ssh/sshd_config
/etc/ssh/ssh_config
/etc/hosts.deny
/etc/hosts.allow



1. Escribimos lo siguiente:
sudo nano /etc/ssh/sshd_config.

A continuación se analizarán los parámetros a modificar.

Parámetro Port.
Una forma de elevar considerablemente la seguridad al servicio de SSH, es cambiar el número de puerto utilizado por el servicio, por otro que solo conozca el administrador del sistema. A este tipo de técnicas se les conoce como Seguridad por Oscuridad. La mayoría de los delincuentes informáticos utiliza guiones que buscan servidores que respondan a peticiones a través del puerto 22. Cambiar de puerto el servicio de SSH disminuye considerablemente la posibilidad de una intrusión a través de este servicio.

Port 22

SSH trabaja a través del puerto 22 por TCP. Puede elegirse cualquier otro puerto entre el 1025 y 65535. ejemplo:

Port 52341


Parámetro ListenAddress.
Por defecto, el servicio de SSH responderá peticiones a través de todas las interfaces del sistema. En algunos casos es posible que no se desee esto y se prefiera limitar el acceso sólo a través de una interfaz a la que sólo se pueda acceder desde la red local. Para tal fin puede establecerse lo siguiente, considerando que el servidor a configurar posee la IP 192.168.1.254:

ListenAddress 192.168.1.254


Parámetro PermitRootLogin.
Establece si se va a permitir el acceso directo del usuario root al servidor SSH. Si se va a permitir el acceso hacia el servidor desde redes públicas, resultará prudente utilizar este parámetro con el valor no.

PermitRootLogin no


Parámetro X11Forwarding.
Establece si se permite o no la ejecución remota de aplicaciones gráficas. Si se va a acceder hacia el servidor desde red local, este parámetro puede quedarse con el valor yes. Si se va a permitir el acceso hacia el servidor desde redes públicas, resultará prudente utilizar este parámetro con el valor no.

X11Forwarding yes


Parámetro AllowUsers.
Permite restringir el acceso por usuario y, opcionalmente, anfitrión desde el cual pueden hacerlo. El siguiente ejemplo restringe el acceso hacia el servidor SSH para que solo puedan hacerlo los usuarios fulano y mengano, desde cualquier anfitrión.

AllowUsers fulano mengano

Permite restringir el acceso por usuario y, opcionalmente, anfitrión desde el cual pueden hacerlo. El siguiente ejemplo restringe el acceso hacia el servidor SSH para que solo puedan hacerlo los usuarios fulano y mengano, solamente desde los anfitriones 10.1.1.1 y 10.2.2.1.
AllowUsers fulano@10.1.1.1 mengano@10.1.1.1 fulano@10.2.2.1 mengano@10.2.2.1
Aplicando los cambios.

Cambiar el número de intentos fallidos de autentificación

Cambiar el número de intentos fallidos de autentificación es una buena estrategia, sobre todo si nuestro servidor está escuchando en una red pública. De ésta forma podemos evitar que un posible atacante intente repetidamente averiguar una contraseña.

Editamos el archivo /etc/ssh/sshd_config:

MaxAuthTries 2

Cambiar el número de conexiones concurrentes no autentificadas

Ésta es una buena estrategia también, para evitar intentos de conexión. La directiva MaxStartUps controla el número de conexiones no autenticadas en el servidor, de ésta forma, evitamos que posibles atacantes intentasen conectarse demasiadas veces.

Editamos el archivo /etc/ssh/sshd_config

MaxStartUps 3





El servicio de SSH puede iniciar, detenerse o reiniciar a través de un guión similar a los del resto del sistema. De tal modo, podrá iniciar, detenerse o reiniciar a través del mandato service y añadirse al arranque del sistema en un nivel o niveles de corrida en particular con el mandato chkconfig.

En esta linea es para cuadno se inicie sesion aparesca un mensaje y despues el login y por obvia razon hay que modificar tambien el archivo /etc/issue.net asi para que aparezca el cambio o en su caso hacemos uno nuevo en la ruta de la carpeta donde esta la configuracion.
Banner /etc/issue.net



Para ejecutar por primera vez el servicio, utilice:
sudo service sshd start

Para hacer que los cambios hechos a la configuración surtan efecto, utilice:
service sshd restart

Para detener el servicio.
sudo service sshd stop


miércoles, 28 de abril de 2010

FTP

BIBLIOGRAFIA: http://www.alejandrox.com/2007/03/instalar-un-servidor-ftp-en-ubuntu/

Instalar un servidor FTP en Ubuntu

vsftpd es un servidor ftp para Linux sencillo de instalar y configurar. Es el recomendado por Debian y Ubuntu, tiene una configuración muy sencilla en un solo fichero y es bastante ligero y seguro.

Instalación.

La configuración del servidor FTP requiere del paquete vsftpd. Para ello abre el terminal (Aplicaciones/Accesorios/Terminal) y escribe:

# sudo apt-get install vsftpd.

También puedes instalar el servidor mediante el gestor de paquetes Synaptic.

Al instalar vsftpd en el sistema se crean los siguientes archivos y directorios en el sistema:

/etc/init.d/vsftpd: fichero que inicia el servidor ftp.
/usr/bin/vsftpd: archivo ejectable.
/etc/vsftpd.conf: es el fichero de configuración del servidor.
/etc/ftpusers: fichero que contiene una lista de usuarios que no se podrán conectar al servidor.

Configuración

El fichero de configuración del servidor se llama vsftpd.conf y se encuentra en el directorio /etc. Las directivas más importantes de este fichero son las siguientes:

anonymous_enable

Si el valor de esta directiva es YES cualquier usuario se puede conectar al servidor dando el nombre de usuario anonymous o ftp. Por razones de seguridad se debe poner NO (anonymous_enable=NO)

local_enable

Esta línea indica que si se permite o no el acceso de usuarios locales a sus respectivas carpetas privadas. Si se permite el acceso habría que poner local_enable=YES (local_enable=NO en caso contrario).

chroot_local_user

Permite enjaular a los usuarios dentro de su propio directorio personal. Si en el fichero de configuración aparece chroot_local_user=NO, entonces el usuario tiene acceso a todo el sistema de archivos, en función de los permisos asignados. Cuando un usuario local se conecta y en el fichero de configuración aparece chroot_local_user=YES, entonces enjaulamos a los usuarios dentro de su propio directorio personal, sin posibilidad de acceder a todo el sistema de ficheros. Se mejora por tanto la seguridad.

write_enable

Con esta directiva se puede permitir o denegar la subida de ficheros al servidor FTP. Si se permite que los usuarios suban archivos al servidor FTP habría que poner write_enable=YES.

local_umask

Se pueden establecer los permisos con los que quedará el archivo al subirlo al servidor FTP. local_umask=022 indicará que los permisos de los archivos serán 644, es decir, lectura y escritura para el propietario del fichero, y sólo lectura para el grupo y los demás.

anon_upload_enable

Esta directiva indica si los usuarios anónimos pueden cargar archivos en el servidor. anon_upload_enable=YES permite que los usuarios anónimos puedan subir ficheros.

anon_mkdir_write_enable

Si esta directiva tiene el valor YES se permitirá la creación de directorios en el servidor.

ftpd_banner

Con esta directiva se puede mostrar un mensaje de bienvenida cuando un usuario se conecte al servidor FTP. ftpd_banner=”Bienvenido a mi servidor FTP”.

anon_max_rate

Se utiliza para limitar la tasa de transferencia a usuarios anónimos. En el siguiente ejemplo se limita la tasa de transferencia a los usuarios anónimos a 10Kb/s:
anon_max_rate=1024

local_max_rate

Se utiliza para limitar la tasa de transferencia en bytes por segundo a los usuarios locales del servidor. En el siguiente ejemplo se limita la tasa de transferencia a 10Kb/s:
local_max_rate=1024

max_clients

Indica el número máximo de cliente que podrán conectarse simultáneamente al servidor. En el siguiente ejemplo son 5: max_clients=5

Hay que tener en cuenta que cada vez que se haga un cambio en el fichero de configuración de vsftpd se debe reiniciar el servidor con la siguiente orden: # sudo /etc/init.d/vsftpd restart

Otras opciones disponibles son stop (parar), reload (recarga), start (inicio).

Para conectarnos al servidor podemos utilizar un programa cliente como gFTP. Se puede instalar con el gestor de paquetes Synaptic o escribiendo la siguiente orden en el terminal:

# sudo apt-get install gftp

otra opcion para ftp
nota: este sobre la version de ubuntu server
Para hacer la instalcion se va haeer la instalacion de un paquete llamdo proftpd
1. subimos privelegios con sudo su
2. apt-get install proftpd
3. Abrimos el archivo de configuracion que se encuentra en /etc/proftpd/proftpd.conf
4. nano /etc/proftpd/proftpd.conf
5. Nos vamso hasta el final del archivo y ponermos la siguiente linea:
DefaultRoot ~
nota: esto es para que se encierre el usuario y no se vea todos los archivos del sistema y no tengamos problemas con los archivos criticos del sistema.
puedes sacar este carecter "~" con alt+126
6. Reiniciamos el servicoio asi:
/etc/init.d/prftpd restart
7. ahora solo falta provar si quedo nuestro servidor, nos logueamos con el usuario que entramos al server y listo

lunes, 19 de abril de 2010

shell script

encabezado de una shell
#/bin/sh
nota. con esto hace referecia aque llama a la terminal del sistema


para ejecutar una shell seria los siguientes comandos:
sh nombre_de_la_shell.sh

jueves, 8 de abril de 2010

SQUID

********************************************************************************
¿COMO INSTALAR SQUID?
1. Abrimos una terminal y escribimos este comando:
sudo apt-get install squid
********************************************************************************

cache_mem 1576 MB Memoria asignada al cache
maximum_object_size 8192 KB Tamaño maximo de un objeto que
puede estar en cache

dns_nameservers 8.8.8.8 DNS con que resuelve los dominios,
se debe poner el DNS de la red
local

logfile_rotate 7 Dias que los logs rotan
(access.log.1 access.log.2 ...)

error_directory /usr/share/squid/errors/Spanish Mensajes de error del
proxy, si se quiere
personalizar editar
archivos html del

auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/usuarios


Parámetro cache_mem.

El parámetro cache_mem establece la cantidad ideal de memoria para lo siguiente:

Objetos en tránsito.

Objetos frecuentemente utilizados (Hot).

Objetos negativamente almacenados en el caché.



De modo predefinido se establecen 8 MB. Si se posee un servidor con al menos 128 MB de RAM, 16 MB es el valor para este parámetro:



cache_mem 16 MB



Parámetro cache_dir:

El parámetro cache_dir se utiliza para establecer que tamaño se desea que tenga el caché en el disco duro para Squid. De modo predefinido Squid utilizará un caché de 100 MB, de modo tal que encontrará la siguiente línea:



cache_dir ufs /var/spool/squid 100 16 256



Mientras más grande sea el caché, más objetos se almacenarán en éste y por lo tanto se utilizará menos el ancho de banda. La siguiente línea establece un caché de 700 MB:



cache_dir ufs /var/spool/squid 700 16 256



Los números 16 y 256 significan que el directorio del caché contendrá 16 directorios subordinados con 256 niveles cada uno.


Parámetro ftp_user.

Al acceder a un servidor FTP de manera anónima, de modo predefinido Squid enviará como clave de acceso Squid@. Puede establecerse una dirección de correo especificada como clave de acceso:



ftp_user proxy@gmail.com



Controles de acceso.

Las Listas de Control de Acceso definen una red o bien ciertas máquinas en particular. A cada lista se le asignará una Regla de Control de Acceso que permitirá o denegará el acceso a Squid.

Listas de control de acceso, se establecen con la siguiente sintaxis:



acl [nombre de la lista] src [lo que compone a la lista]



Si se desea establecer una lista de control de acceso que abarque a toda la red local, basta definir la IP correspondiente a la red y la máscara de la sub-red. Por ejemplo, si se tiene una red donde las máquinas tienen direcciones IP 10.140.111.n con máscara de sub-red 255.255.255.0, podemos utilizar lo siguiente:



acl miredlocal src 10.140.111.0/255.255.255.0

Más conveniente es definir una Lista de Control de Acceso especificando un archivo localizado en cualquier parte del disco duro, y la cual contiene una lista de direcciones IP.:



acl permitidos src "/etc/squid/permitidos"



El archivo /etc/squid/permitidos contendría algo como siguiente:



10.140.111.2

10.140.111.3

10.140.111.4

10.140.111.5

10.140.111.6



En caso de querer restringir el acceso de una pc, basta con eliminarla de la lista.





En caso de querer restringir el acceso de una pc, basta con eliminarla de la lista.



Listas de control de acceso: Bloqueo de Dominios de Destino.

Es conveniente definir una Lista de Control de Acceso especificando los dominios bloqueados en un archivo localizado en cualquier parte del disco duro, y la cual contiene una lista de los dominios:





acl bloqueados dstdomain "/etc/squid/bloqueados"

El archivo /etc/squid/bloqueados contendría algo como siguiente:





www.microsoft.com

www.ibm.com

www.hotmail.com



Reglas de Control de Acceso.

Las Reglas de control de Aceso definen si se permite o no el acceso hacia Squid. Se aplican a las Listas de Control de Acceso. Deben colocarse en la sección de reglas de control de acceso definidas por el administrador, es decir, a partir de donde se localiza la siguiente leyenda:



# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS



La sintaxis básica es la siguiente:



http_access [deny o allow] [lista de control de acceso]



En este ejemplo la regla que establece acceso permitido a Squid a la Lista de Control de Acceso denominada permitidos:



http_access allow permitidos



La expresión !, significa no. Pueden definirse así respecto de dos listas de control de acceso, lista1 y lista2, que se permite el acceso a Squid a lo que comprenda lista1 excepto aquello que comprenda lista2:



http_access allow lista1 !lista2



Esta regla es útil cuando se tiene un gran grupo de IP dentro de un rango de red al que se debe permitir acceso, y otro grupo dentro de la misma red al que se debe denegar el acceso.


-*Parámetro chache_mgr.

De modo predefinido, si algo ocurre con el caché, se envia un mensaje de aviso a la cuenta webmaster del servidor, puede especificarse una distinta si se considera conveniente;



cache_mgr webmaster@gmail.com






Para crear el directorio cache, en modo consola ejecutamos;



sudo /usr/local/squid/sbin/squid -z

********************************************************************************
¿COMO HACER QUE TU PROXY LO PUEDAN UTILIZAR DESDE INTERNET?
1. Abrimos la terminal y abrimos el archivo squid.conf
sudo nano /etc/squid/squid.conf
2. Ahora buscamso este aprtado
#TAG http_access
y buscamos la sigueinte linea:
http_access deny all #Esta linea dice que impide conexiones http al proxy lo que impide las conexiones http al proxy, como esto normalmente no es lo que deseamos, deben de cambiar esta linea a
3.Ahora cambiamos la line http_access deny all por esta:
http_access allow all
****************************************************************************************************************************************************************
bloquear paginas de internet y palabras
1. Agregamos esta linea en el apartado de las reglas:
acl nombre_regla url_regex -i "ruta del archivo que contiene los sitios"
2. En el apartado de permitir o denegar la regla :
http_access allow nombre de la regla !nombre_de_la_regla_que_quieres_que_se_bloque
********************************************************************************
********************************************************************************
instalar sarg
¿que es sarg?
sarg es un pluing para squid que sirve para sacar estadisticas de squid como cual es son las paginas mas visitadas, que ancho de banda genera cada usuario, etc .

1. Abrimos una terminal y escribimos lo siguiente:
apt-get install sarg
2. Ahora configuramso algunas opciones en su archivo de configuracion que se encuentra:
sudo nano /etc/squid/sarg.conf
3. Se configuran algunas opciones:
language English : Se configurar el idioma que sarg va a mostrar algunas opciones.
access_log /var/log/squid/access.log : Aqui se indica de donde sarg va a sacar los registros, en este caso es por defecto donde squid guarda los Log de acceso por Ip, Hora, Web visitada y varios formatos que se pueden configurar.
title “Squid User Access Reports” : Queda claro que pide el Titulo de sarg cuando se visita por web.
output_dir /var/www/squid-reports : Aqui se indica cual va a ser la salida o donde se van a mostrar los registros que Sarg muestra, aqui se debe colocar la Ruta donde esta configurado APACHE.
resolve_ip yes o no : Aqui se indica si el registro que aparesca no por la IP si no por el nombre de la maquina.
exclude_users /etc/squid/sarg.users : Se puede indicar que no realize registros de los usuario que esten configurados en el archivo correspondiente.
date_format u : Se indica que los reportes los muestre con la configuracion de la hora U america (mes/dia/año)
mail_utility mailx : Aqui se indica si los reportes se envian mediante correo, no es muy recomendable ya que estarias recibiendo muchos correos y no es indispensable ya que los podras ver mediante web.
weekdays 0-6 : Se indica que dias va a ver los registros.( Sunday->0, Saturday->6 )
Las lineas de Dansguardian y squidguard, hay que dejarlas comentadas ya que si no se tiene configurada ninguna de estas opciones en el server dara error Sarg.

Las demas lineas hay que dejarlas tal como estan por defecto y las comentadas dejarlas tal como estan.
4. Ahora ejecutamos sarg con el siguiente comando:
sudo /usr/bin/sarg
5. Para hacer q sarg no saque un reporte automatico en cierto dia o diario no svamso a este archivo:
sudo nano /etc/crontab
6.

¿Como cambiar el idioma a los errores mostrados al usuario?
1. Abrimos el archivo /etc/squid/squid.conf
2. Buscamos la linea:
# error_directory /usr/share/squid/errors/en
3. Descomentamos quitando el simbolo '#' y quitamos la '/usr/share/squid/errors/en' por esta: /usr/share/squid/errors/es-mx

NOTA: es-mx quiere deir que es el español mexico si ustedes son de otro paises tendran que buscar el archivo correspondiente a us idioma o ubicacion.
Tambien puede editar los archivos ya que se encuentran eh HTML asi que ustedes pueden generar su propia presentacion de errores

¿Como hacer que aprescan los nombres en vez de IP en los reportes de SARG?
1. Abrimos el archivo
/etc/sarg/sarg.conf
2. Buscamos la linea usertab en dicho archivo
3. Agregams la ruta donde esta el archivo para que ueda leerlo
4. Creamos un archivo con un nombre que ustedes gusten
nano usuarios
5. Editamos el archivo creado(usuarios) de la siguiente forma:
192.168.1.1 Pedrito
192.168.1.2 Pambaso
...
...
...
6. Guardamos los cambios y ejecutamos el sarg, y ahora solo nos ostrara por nombres y no por IP el reporte.
NOTA: si notaron se debe de agregar primero la IP y el nombre dandole un espacio entre la IP y el Nombre para que lo lea el SARG, ya que esa es la nomeclatura que maneja.

********************************************************************************
DESCARGAR LISTAS NEGRAS

http://urlblacklist.com/?sec=download



********************************************************************************

martes, 6 de abril de 2010

java


nota: esto fue sacado de http://sixservix.com/blog/david/2009/08/21/gestion-de-memoria-en-java/


Gestión de memoria en Java

memoriaHace poco me llegó un correo de un compañero del metal pidiéndome ayuda sobre la gestión de memoria en java. No me conocía pero, había encontrado mi correo en un hilo de javaHispano sobre la gestión de consultas a base de datos con respuesta con muchos registros de, nada mas y nada menos que… ¡el 2004!.

Han pasado 5 años, un presidente del gobierno, una crisis mundial por las hipotecas subprime y 6 entrenadores por el equipo de mis amores y, después de todo, parece que aun hay bastantes dudas sobre la gestión de memoria con el lenguaje java así que, he decidido recopilar los post sobre memoria de mi antiguo blog, darles un lavado de cara, completar información y escribir el post ¿definitivo? sobre gestión de memoria.

Empecemos por el principio, la maquina virtual. La maquina virtual de java -o JVM en sus siglas en inglés- es el anclaje “físico” de nuestro maravilloso lenguaje multiplataforma con el Sistema Operativo correspondiente y, como tal, ocupa y utiliza memoria del sistema. Bien, esto es evidente pero, lo que es menos conocido, es como está implementada esta gestión de memoria.

La JVM se arranca reservando, por defecto, 64MB de memoria para trabajar que va ampliando según necesidades. Sin embargo, estas sucesivas ampliaciones automáticas llegan a un límite. Podemos gestionar nosotros mismos estos límites -tanto por arriba como por abajo- gracias a unos parámetros con los que se puede acompañar al comando de arranque de la JVM.
Esto es IMPORTANTE si sabemos que nuestra aplicación va a requerir una gran cantidad de memoria para su funcionamiento y queremos evitar un OutOfMemoryError o si, por el contrario, nuestra aplicación compite con otras de mayor prioridad en un sistema y queremos que utilice solo una parcela de memoria.
PARÁMETROS DE GESTIÓN DE MEMORIA

Antes de nada, es importante tener en cuenta que los parámetros de gestión de memoria son, en la mayoría de los casos, específicos de la maquina virtual. Así, el parámetro -Xlp es exclusivo de la maquina virtual implementada por IBM y se puede utilizar exclusivamente con esta. Aunque hay un montón de implementaciones de JVMs, en la práctica, solo 3 o 4 son utilizadas en un porcentaje significativo y, en cualquier caso, siempre tendremos que probar nuestra aplicación con la implementación de referencia, la de SUN, para evitar posibles problemas de compatibilidades. Por eso, nos centraremos en los parámetros que se puedan utilizar con las maquinas virtuales de SUN.

Los parámetros de gestión de memoria se identifican por un sistema de prefijos que indican la naturaleza de dichos parámetros, así y según SUN:

* Los parámetros que comienzan con -X no son estándar, no se garantiza su implementación en todas las implementaciones de la JVM y pueden cambiar en futuras versiones del JDK.
* Los parámetros que comienzan con -XX no se consideran estables (¿¿??) y no se recomienda su uso para usuarios sin un conocimiento especifico.

La primera maquina virtual :)

La primera maquina virtual :)

Los principales parámetros de gestión de memoria son:

* Xms <> establece la cantidad inicial de memoria
* Xmx <> establece la cantidad máxima de memoria
* Xss <> establece el tamaño máximo de pila de cada hilo JAVA

Es decir, si quisiéramos arrancar nuestra aplicación con una cantidad de memoria asignada de 64MB y queremos que llegue a utilizar un GB, por ejemplo, tendríamos que lanzar un script de la siguiente manera:

java -Xms64m -Xmx1024m <>

Es importante conocer en profundidad que implican y para que se utilizan cada uno de estos parámetros:

* Los parámetros Xms y Xmx establecen el tamaño inicial y máximo de la cantidad de memoria que la JVM utilizará para ejecutar programas java pero, esto no implica que nuestro proceso java ocupe en memoria un tamaño máximo como el establecido en el parámetro Xmx. Como se ha especificado antes, la JVM es un proceso en si mismo y, como tal, necesita memoria para poder cargar su código y datos. Por tanto, un proceso java puede llegar a ocupar mas espacio en memoria que el determinado en Xmx.
* El parámetro Xss sirve para determinar cual es la cantidad de memoria máxima que podrá utilizar un hilo ejecutado dentro de la maquina virtual. Para aquellos que no estén familiarizados con la gestión de hilos, pondremos un ejemplo de sencilla comprensión: imaginemos una aplicación web desarrollada en java. Esta aplicación web tendrá sus datos comunes y ocupará X espacio en memoria. Cada vez que alguien haga una petición a nuestra página web, se creará un hilo de ejecución independiente que tendrá sus propios datos (por ejemplo, los datos de un formulario de registro en nuestra página) y que no serán compartidos por el resto de hilos que se estén ejecutando en dicho momento (nuestra página web no es monousuario puede tener un montón de usuarios concurrentes). Bueno, en este caso, toda la memoria que utilice cada uno de los hilos se suma para el cómputo de memoria global determinado por el parámetro Xmx pero, además cada hilo comprueba que no supere el máximo de memoria que determina el parámetro Xss. Si se supera, se lanza un StackOutOfMemoryError.

Un caso común y conocido donde se puede dar un StackOutOfMemoryError es a la hora de usar reflexión en procesos XSLT por lo que, probablemente tengamos que subir el tamaño máximo de pila por hilo si utilizamos este tipo de tecnología.
PARÁMETROS AVANZADOS DE GESTIÓN DE MEMORIA

Hasta ahora, hemos visto los parámetros más básicos de gestión de memoria pero hay muchísimos más. Vamos a centrarnos en dos de los más importantes o, lo que es lo mismo, de los que pueden solucionarnos problemas tanto de rendimiento como de funcionamiento (seamos sinceros, nadie se interesa por esto hasta que el marrón le estalla entre las manos).

El problema es que, antes de poder especificar los comandos, tendremos que tragarnos algo de literatura para comprender de que estamos hablando.

EL GARBAGE COLLECTOR

Toda máquina virtual viene con un recolector de basura o Garbage Collector. Este maravilloso invento es el que consigue que los programadores java nos olvidemos por completo de tener que lidiar con la gestión de la memoria (y es el culpable, por otro lado, que todo este tema nos suene tan raro y distante… y de ahí este articulo).

El Garbage Collector libera el espacio de memoria ocupado por objetos que no van a volver a ser utilizados. El proceso de localización y eliminado de esos objetos puede ser tan pesado que llegue a parar una aplicación hasta su conclusión, por lo que es especialmente importante que lo configuremos correctamente.

La JVM divide el espacio en “generaciones” o particiones en los que poder aplicar sofisticados algoritmos de recolección. Cuando alguno de estos espacios se llena, se fuerza una recolección de objetos y, la eficiencia de este sistema se basa en que la mayoría de los objetos tienen una vida útil muuuy corta. El espacio en memoria, se divide generalmente en dos particiones: la nueva y la vieja generación.

Cuando el tamaño de la nueva generación se llena, se invoca una recolección de objetos muy rápida (GC) que acaba con los objetos que no vayan a ser utilizados y que traspasa a la vieja generación los objetos con vida. Cuando la vieja generación se llena, se invoca una recolección completa (Full GC) que implica a toda la memoria y que es mucho más lenta que la recolección rápida. Para entender un poco mas gráficamente de lo que estamos hablando, veamos unas trazas de una JVM:

[GC 50650K->21808K(76868K), 0.0478645 secs]
[GC 51197K->22305K(76868K), 0.0478645 secs]
[GC 52293K->23867K(76868K), 0.0478645 secs]
[Full GC 52970K->1690K(76868K), 0.54789968 secs]

En estas trazas se puede ver cómo, tras la primera recolección rápida (GC), se pasó de 50650Kb usados a 21808Kb (de un total de 76868Kb que es el espacio asignado mediante -Xmx). También se puede ver cómo, tras la recolección completa (Full GC) se pasó a un uso de tan solo 1690Kb pero, a cambio de casi medio segundo de inactividad de nuestra aplicación, que es lo que tardo la recolección completa en llevarse a cabo.

Por tanto, no parece tener mucho sentido que tengamos un espacio de 4GB asignado a nuestro proceso java y un espacio de 2MB -que es lo que viene asignado por defecto- para nuestra nueva generación. Normalmente, se recomienda que pongamos el tamaño de la nueva generación que queramos mientras no supere el tamo determinado en -Xmx y, como buena práctica, se recomienda asignar la mitad del espacio total de memoria (Ej. java -Xmx1024m -Xmn512m <>). Así:

* Xmn <> establece la memoria asignada para la nueva generación.

El tunning del Garbage Collector respecto al uso de la nueva generación da para mucho, como podéis ver aquí y en muchos otros sitios.

distributed_cache_latency_and_jvm_heap_size-001

También se puede forzar la recolección mediante una llamada al sistema en java con System.gc() pero, no se recomiendo su uso porque fuerza recolecciones completas e impide la escalabilidad de los grandes sistemas.

LA MEMORIA PERMANENTE

Un concepto que, a veces, no queda muy claro es que todo esto de lo que estamos hablando se refiere a memoria volátil, es decir memoria ocupada por datos con una esperanza de vida mas o menos larga pero, en ningún caso, pensados para ser utilizados durante todo el tiempo de ejecución de nuestro proceso. Sin embargo, si hay datos permanentes que utilizará nuestro proceso java.

Estos datos (classes, librerías, etc.) se almacenan en la memoria permanente que funciona adicionalmente al espacio establecido por nosotros para la memoria volátil mediante el parámetro -Xmx.

¿Que para que se utiliza esto realmente? Para la carga y descarga de classes dinamicamente y, cuando alguien se pregunte que clases son esas que se cargan dinamicamente debe recordar que nuestras JSPs se convierten en classes dinamicamente según se van invocando (aunque se pueda efectuar una precompilación para ganar en rendimiento) y que las librerías invocadas por nuestras aplicaciones también utilizan este espacio.

¿Cómo puede afectarnos esto? Bueno, la JVM establece por defecto un tamaño máximo de 64mb para la memoria permanente. Si nuestra aplicación empieza a generar clases como si no hubiera mañana (nadie duda de que todos nosotros hace aplicaciones con TRILLONES de usuarios concurrentes) y llenamos este espacio en memoria, forzaremos una recolección completa del Garbage Collector que penalizará el rendimiento de nuestra aplicación. En un escenario más real, si nos hemos dedicado a agregar y usar librerías y librerías con sus dependencias y nuestra memoria permanente no puede cargar todas las que necesitamos, daremos con un OutOfMemoryError que nos romperá el Chi a nosotros y a nuestros usuarios (no te digo ya a nuestro jefe). No parece que tenga muchos sentido, por otro lado, que le demos a nuestra mega-aplicación 2GB de memoria volátil y la dejemos con 64mb para cargar clases y librerías ¿verdad?. Así:

* XX:PermSize=<> establece el tamaño mínimo de la memoria permanente
* XX:MaxPermSize=<> establece el tamaño máximo de la memoria permanente

Si, por ejemplo, queremos utilizar 128mb para nuestra memoria permanente, ejecutaremos algo como java -Xmx1024m -Xmn512m -XX:PermSize=128m <>)

Es importante recalcar que la memoria permanente es adicional a la memoria volátil establecida por el comando -Xmx. Por eso, si arrancamos un proceso java con un permSize de 256mb y un -Xms de 256mb, el espacio total de memoria usada será de mas de 512mb (256 de memoria volátil + 256 de memoria permanente + la memoria que utilice la maquina virtual en si) Ej.

---------------------------------------------
$ java -Xms256m -Xmx256m -XX:PermSize=256m -XX:MaxPermSize=256m Hello
$ pmap 6472
6472: /usr/java1.3.1/bin/../bin/sparc/native_threads/java -Xms256m
-Xmx256m
total 550544K
---------------------------------------------

Podéis encontrar todo esto mucho mejor explicado aquí (pero eso si, en inglés).
OPTIMIZACIÓN DEL RENDIMIENTO EN ARRANQUE Y EN TIEMPO DE EJECUCIÓN

Otra optimización que hay que tener en cuenta es la proporcionada por los diferentes perfiles de la maquina virtual y el uso del compilador de cada uno de los mismos. Así, el perfil por defecto es el de -client que prioriza la velocidad de arranque del proceso antes que el rendimiento general de la aplicación. Por el contrario, el perfil -server prima el rendimiento en tiempo de ejecución en vez que el arranque rápido del proceso (además de modificar ciertos valores por defecto como, por ejemplo, el tamaño por defecto de la memoria permanente que pasa de 32 a 64mb).

Para utilizar el perfil -server solo hay que introducirlo como parámetro en la ejecución de nuestro proceso java.

CONCLUSIONES

Por último, además de la correcta configuración de nuestra maquina virtual, otra de las cosas que debemos tener en cuenta es seguir una serie de buenas practicas a la hora de programar nuestras aplicaciones aunque dejaremos esto para otro post. Se pueden encontrar múltiples sitios con listas de optimización de memoria para nuestras aplicaciones pero destaquemos un articulo reciente sobre antipatrones de memoria que hay que evitar y que puede enseñarnos mucho.

También es importante tener en cuenta el enorme muestrario de aplicaciones de profiling y monitorización disponibles en el mercado, gratuitas y de pago, para comprender que pasa con nuestra memoria, cuando y porqué.

Espero que hayáis encontrado este artículo de utilidad.


Pásalo: Facebook Twitter Menéame Barrapunto LinkedIn
Tags: -Xmn, -Xms, -Xmx, -Xss, garbage collector, java, jvm, OutOfMemoryError, StackOutOfMemoryError

sábado, 3 de abril de 2010

VIRTUAL BOX

*********** ACTIVAR USB ********************************************************
1. Abrir un terminal y ejecutar el comando
sudo adduser USUARIO vboxusers

2. sudo nano /etc/fstab
y al final agregamos la siguiente línea:
#usbfs
none /proc/bus/usb usbfs devgid=124,devmode=664 0 0
3. Reiniciar el equipo y probar.
*********************************************************************************
*********************************************************************************
*****¿como manejar virtual box desde consola?***************************************
nota: esto fue sacado desde: http://www.improvisa.com/index.php?name=News&
file=article&sid=376

VBoxmanage startvm Nombre_Maquina_virtual --> Encender una maquina viertual
VBoxManage list vms ---> listar todas las maquinas virtuales creadas
VBoxManage modifyvm Pruebita --memory 512 --> Moficia la memoria de la maquina virtual
En este nuevo Howto os enseñaremos a manejar VirtualBox desde consola. La pregunta nos surgió a CeLSuM y a mi cuando intentábamos crear un servidor de máquinas virtuales pero sin tener que instalar X, es decir un servidor en el que sólo pudiesemos utilizar la consola. La aplicación VirtualBox permite la creacion de máquinas virtuales desde consola, asi como su modificación, tambien desde consola, y todos los comandos que podamos ejecutar sobre la máquina virtual están contemplados en el aplicativo que utiliza Virtua­lBox para­ la administración de sus maquinas desde la interfaz de comandos.
Dividiremos el HowTo en Instalación, creación de máquinas virtuales, inicio de las máquinas virtuales asi como instalación del sistema operativo en las mismas, borrado de máquinas virtuales y una breve explicación de como manejar las máquinas virtuales, arreglaremos además el problema que le surgió a CeLSuM con el reescalado de la máquina virtual.
Pongámonos manos a la obra:
­Comenzaremos con la instalación de VirtualBox en nuestro sistema operativo anfitrión, yo como siempre elijo Debian­­, os cuento­ que la versión que trae Debian por defecto es algo peor que la que nos podemos bajar desde la página de VirtualBox, la instalación es muy simple, podemos hacerlo por dos caminos, descargando el paquete e instalarlo junto con sus dependencias o agragando una linea anuestro /etc/apt/sources.list
Mediante dpkg:
virtualbox_desde_consola:/# cd /usr/src
virtualbox_desde_consola:/usr/src# wget http://download.virtualbox.org/virtualbox/2.1.4/virtualbox-2.1_2.1.4-42893_Debian_lenny_i386.deb -O virtualbox.deb
una vez lo tenemos pasemos a instalarlo, debemos resolver todas sus dependencias:
virtualbox_desde_consola:/# dpkg -i virtualbox.deb
virtualbox_desde_consola:/#apt-get install todas_las_dependencias
virtualbox_desde_consola:/# dpkg -i virtualbox.deb
Mediante apt-get
virtualbox_desde_consola:/# vi /etc/apt/sources.list
añadiremos la siguiente linea:
deb http://download.virtualbox.org/virtualbox/debian lenny non-free
Descargaremos la key y la instalaremos.

virtualbox_desde_consola:/# wget http://download.virtualbox.org/virtualbox/debian/sun_vbox.asc
virtualbox_desde_consola:/# sudo apt-key add sun_vbox.asc
virtualbox_desde_consola:/# wget -q http://download.virtualbox.org/virtualbox/debian/sun_vbox.asc -O- | sudo apt-key add -
virtualbox_desde_consola:/# apt-get update
virtualbox_desde_consola:/# apt-get install virtualbox-2.1
­Muy bien, una vez instalado VirtualBox pasaremos a explicar como crear las máquinas virutales para su posterior manejo dede la consola:
CREACION DE MÁQUINAS VIRTUALES VIRTUALBOX DESDE CONSOLA
Creamos la máquina virtual
virtualbox_desde_consola:/# VBoxManage createvm -name Pruebita -register
Creamos el disco duro
virtualbox_desde_consola:/# VBoxManage createvdi -filename Pruebita.vdi -size 8000 -register

Asociamos el disco duro a la máquina pruebita:
virtualbox_desde_consola:/# VBoxManage modifyvm Pruebita -hda Pruebita.vdi -ostype debian

Le asignamos la memoria correspondiente a la máquina virtual
virtualbox_desde_consola:/# VBoxManage modifyvm Pruebita -memory 512

Le asignamos la tarjeta de red, en nuestro caso queremos que esté en la misma subred que todas las maquinas de la oficina, para ello tenemos que utilizar el script que utilizamos en Improvisa en el documento­ ­­"Bridge automático para VirtualBox"
virtualbox_desde_consola:/# VBoxManage modifyvm Pruebita -nic1 hostif -cableconnected1 on -hostifdev1 tap1

Registramos la imagen desde la que inciará la nueva máquina, usad aqui vuestro sistema operativo, yo en este ejemplo utilizo el cd de instalación de debian lenny.
virtualbox_desde_consola:/# VBoxManage registerimage dvd /usr/src/debian-500-i386-businesscard.iso

Listamos las imagenes registradas para utilizarlas posteriormente:
virtualbox_desde_consola:/# VBoxManage list dvds
UUID: 33e7bcf8-bcee-48cb-abbe-8b5b42d9c274
Path: /usr/src/debian-50-i386-businesscard.iso
Accessible: no

Asociamos DVD a la máquina virtual:
virtualbox_desde_consola:/# VBoxManage modifyvm Pruebita -dvd 33e7bcf8-bcee-48cb-abbe-8b5b42d9c274

Añadimos audio:
virtualbox_desde_consola:/# VBoxManage modifyvm Pruebita -audio alsa -audiocontroller sb16 -clipboard bidirectional
Le decimos que arranque desde el DVD, acordaros luego de quitarlo:
virtualbox_desde_consola:/# VBoxManage modifyvm Pruebita -boot1 dvd

Una vez creada podemos ver como nos ha quedado:
virtualbox_desde_consola:/# VBoxManage showvminfo Pruebita
LANZAMIENTO DE LA MÁQUINA VIRTUAL VIRTUALBOX
Una vez creada debemos ser capaces de instalar el sistema operativo que debamos, para ello necesitamos un entorno de escritorio, pero este no tiene porque estar en la máquina anfitriona, puede estar perfectamente en otro equipo. Para poder manejar la maquina virtual debemos levantarla con las siguientes opciones:
Le diremos que el puerto de escucha es el 3389, de la IP del sistema operativo anfitrion, es decir el servidor de maquinas virtuales.
virtualbox_desde_consola:/# VBoxManage modifyvm Pruebita -vrdpport 3389
Ahora lanzamos la máquina diciendole que nos conectaremos mediante vrdp:
virtualbox_desde_consola:/# VBoxManage startvm Pruebita -type vrdp

­CONEXION A LA MÁQUINA VIRTUAL VIRTUALBOX
Desde una maquina con X nos conectamos por Conexion a escritorio remoto (Si es windows) o con rdesktop (RDPV5) si es linux, tambien llamado cliente de servidor de terminales, alojado en Internet en KDE. Acordaos que debe ser a la IP del servidor de máquinas virtuales y al puerto que hemos configurado, en nuestro caso 3389.
BORRADO DE UNA MÁQUINA VIRTUAL VIRTUALBOX
Desasociamos el disco duro de la máquina virtual Pruebita:
virtualbox_desde_consola:/# VBoxManage modifyvm Pruebita -hda none
Desregistramos el disco duro:
virtualbox_desde_consola:/# VBoxManage unregisterimage disk Pruebita.vdi
Borramos la máquina de VirtualBox:
virtualbox_desde_consola:/# VBoxManage unregistervm Pruebita -delete
Borramos fisicamente el disco duro:
virtualbox_desde_consola:/# rm /root/.VirtualBox/HardDisks/Pruebita.vdi­
­
PROBLEMAS DE REESCALADO
Es posible que en algún momento de la instalación la máquina se nos apague y no podamos recuperarla, ni si quiera apagarla, es un problema del reescalado de la configuración de pantalla y, en mi caso, rdesktop, el error es el siguiente:
virtualbox_desde_consola:/# VBoxManage controlvm FacturaPlus poweroff
VirtualBox Command Line Management Interface Version 2.1.4
(C) 2005-2009 Sun Microsystems, Inc.
All rights reserved.

[!] FAILED calling a->virtualBox->

OpenExistingSession (a->session, uuid) at line 2784!
[!] Primary RC = VBOX_E_INVALID_SESSION_STATE (0x80BB000B) - Current session state prohibits operation
[!] Full error info present: true , basic error info present: true
[!] Result Code = VBOX_E_INVALID_SESSION_STATE (0x80BB000B) - Current session state prohibits operation
[!] Text = The machine 'FacturaPlus' does not have an open session
[!] Component = Machine, Interface: IMachine, {ea6fb7ea-1993-4642-b113-
f29eb39e0df0}
[!] Callee = IVirtualBox, {339abca2-f47a-4302-87f5-
7bc324e6bbde}
feda:/usr/src# VBoxManage controlvm FacturaPlus
VirtualBox Command Line Management Interface Version 2.1.4
(C) 2005-2009 Sun Microsystems, Inc.
All rights reserved.

Para solucionarlo bastará con eliminar la maquina y volver a crearla y al levantarla para la instalación hacerlo con el siguiente comando:
virtualbox_desde_consola:/# VBoxManage controlvm Pruebita setvideomodehint 800 600 16
De esta forma levantamos la maquina virtual obligando a la configuración de pantalla a 800 x 600 evitando el reescalado, hasta que instalemos las Guest Addittions, muy recomendables por cierto.
*********************************************************************************
¿como instalar Guest Addittions S.O. hueesped es linux?
1. Nos vamos al menu de virtual box y nos vamos a Dispositivos/Instalar Guest Additions
2.Montamos la unidad
mount /dev/cdrom /media/cdrom/
3. aptitude install gcc linux-headers-$(uname -r) make
4. Ejecutamos el archivo:
sh VBoxLinuxAdditions.run
5. Se instala y reinciamos.




¿como compartir archivos cuando el S.O. hueesped es linux?
1. Nos vamos al icono que dice compatir carpetas
2. A la carpeta que queramso compartir
3. Instalamos el plug-in de virtual box Guest Adittions
4. Reiniciamos el equipod
5.Iniciamos el equipo y ejecutamos con privilegios de administrador esto en una terminal:
sudo mkdir /mnt/compartidos
sudo mount -t vboxsf nombre_para_mostrar /mnt/compatidos
6. Nos vamos a la ruta:
/mnt/compartidos
Y ahi deberia de aparecer el contido de la carpeta que hemos compartido.
Nota donde puse /mnt/compartidos, este un nombre que puse ustedes pueden poner el que ustedes gusten.
Tambien tengan en cuenta que esto lo tendra que hacer cada vez que inice la mauina virtual para montar


si quieren que esto se monte automaticamente vayan al archivo :
1. /etc/init.d/rc.local
2. agragar al final del archivo esta linea:
sudo mount -t vboxsf nombre-para-mostrar /media/carpeta-asiganda
nota: si se dan cuenta deben de cambiar nombre-para-mostrar por el nombre que le se asignaron al recusro compartido por la maquina virtual y en la carpeta-asiganda es el nombre que se le asigno a la carpeta para montar la unidad que hicieron en la opcion de virtualbox para compartir carpeta.