<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dr. Danguer y Mr. Daniel &#187; Trabajo</title>
	<atom:link href="http://vida.danguer.com/category/trabajo/feed/" rel="self" type="application/rss+xml" />
	<link>http://vida.danguer.com</link>
	<description>Un blog más de un freelancer</description>
	<lastBuildDate>Wed, 26 Oct 2011 15:54:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>&#8220;Permission Denied&#8221; en un cliente NFS en Debian Unstable</title>
		<link>http://vida.danguer.com/2010/11/18/permission-denied-en-un-cliente-nfs-en-debian-unstable/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=permission-denied-en-un-cliente-nfs-en-debian-unstable</link>
		<comments>http://vida.danguer.com/2010/11/18/permission-denied-en-un-cliente-nfs-en-debian-unstable/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 06:17:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Trabajo]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[lenny]]></category>
		<category><![CDATA[NFS]]></category>
		<category><![CDATA[Permission Denied]]></category>
		<category><![CDATA[squeeze]]></category>

		<guid isPermaLink="false">http://vida.danguer.com/?p=119</guid>
		<description><![CDATA[<a href="http://vida.danguer.com/2010/11/18/permission-denied-en-un-cliente-nfs-en-debian-unstable/" title="&quot;Permission Denied&quot; en un cliente NFS en Debian Unstable"></a><p>Cuando intentaba acceder a una partición NFS de un servidor  in <code>lenny</code> desde un cliente en <code>squeeze</code>, obtuve varios &#8220;<code>Permission Denied</code>&#8221; (Permiso Denegado) al intentar escribir un archivo. Como existen otros clientes NFS que pueden escribir al servidor, no se trataba de configuración sino más bien de la versión del nuevo cliente.</p>
<p>Después de buscar un poco, encontré este bug:<br />
<a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=492970">http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=492970</a></p>
<p>Si quieres saber si tu versión tiene este problema, puedes verificarlo con el comando: &#8220;<code>cat /proc/mounts</code>&#8221; notarás que el NFS tiene un parámetro &#8220;<code>sec=null</code>&#8221; y es lo que genera el problema.</p>
<p>El arreglo es un fácil:</p>
<ol>
<li>Desmontar todas las particiones NFS (muy importante, en mi caso tenía dos particiones y solo desmonté una e intenté pasar la nueva configuración que no funcionó hasta que desmonté las dos particiones)</li>
<li>En <code>/etc/fstab</code> (o al montarlo manualmente)  pasar el parámetro <code>sec=sys</code> para todas las particiones de ese servidor, por ejemplo para <code>fstab</code>:<br />
<code>example.com:/shared /tmp/shared nfs rw,sec=sys 0 0</code><br />
O de forma manual<br />
<code>mount -t nfs  -o "rw,sec=sys" example.com:/shared /tmp/shared</code></li>
<li>Montar todas las particiones de ese servidor</li>
</ol>
<p>Al verificar nuevamente <code>/proc/mounts</code> verás el parámetro <code>sec=sys</code> en lugar de <code>null</code></p>
]]></description>
			<content:encoded><![CDATA[<a href="http://vida.danguer.com/2010/11/18/permission-denied-en-un-cliente-nfs-en-debian-unstable/" title="&quot;Permission Denied&quot; en un cliente NFS en Debian Unstable"></a><p>Cuando intentaba acceder a una partición NFS de un servidor  in <code>lenny</code> desde un cliente en <code>squeeze</code>, obtuve varios &#8220;<code>Permission Denied</code>&#8221; (Permiso Denegado) al intentar escribir un archivo. Como existen otros clientes NFS que pueden escribir al servidor, no se trataba de configuración sino más bien de la versión del nuevo cliente.</p>
<p>Después de buscar un poco, encontré este bug:<br />
<a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=492970">http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=492970</a></p>
<p>Si quieres saber si tu versión tiene este problema, puedes verificarlo con el comando: &#8220;<code>cat /proc/mounts</code>&#8221; notarás que el NFS tiene un parámetro &#8220;<code>sec=null</code>&#8221; y es lo que genera el problema.</p>
<p>El arreglo es un fácil:</p>
<ol>
<li>Desmontar todas las particiones NFS (muy importante, en mi caso tenía dos particiones y solo desmonté una e intenté pasar la nueva configuración que no funcionó hasta que desmonté las dos particiones)</li>
<li>En <code>/etc/fstab</code> (o al montarlo manualmente)  pasar el parámetro <code>sec=sys</code> para todas las particiones de ese servidor, por ejemplo para <code>fstab</code>:<br />
<code>example.com:/shared /tmp/shared nfs rw,sec=sys 0 0</code><br />
O de forma manual<br />
<code>mount -t nfs  -o "rw,sec=sys" example.com:/shared /tmp/shared</code></li>
<li>Montar todas las particiones de ese servidor</li>
</ol>
<p>Al verificar nuevamente <code>/proc/mounts</code> verás el parámetro <code>sec=sys</code> en lugar de <code>null</code></p>
]]></content:encoded>
			<wfw:commentRss>http://vida.danguer.com/2010/11/18/permission-denied-en-un-cliente-nfs-en-debian-unstable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mantener cambios en branches de SVN</title>
		<link>http://vida.danguer.com/2010/09/28/mantener-cambios-en-branches-de-svn/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mantener-cambios-en-branches-de-svn</link>
		<comments>http://vida.danguer.com/2010/09/28/mantener-cambios-en-branches-de-svn/#comments</comments>
		<pubDate>Tue, 28 Sep 2010 18:04:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Trabajo]]></category>

		<guid isPermaLink="false">http://vida.danguer.com/?p=102</guid>
		<description><![CDATA[<a href="http://vida.danguer.com/2010/09/28/mantener-cambios-en-branches-de-svn/" title="Mantener cambios en branches de SVN"></a><p>Cuando se desarrolla en un branch de SVN el mayor problema es mantener actualizados los archivos que estamos modificando con los cambios que se hacen en la rama principal (<code>trunk</code>) de SVN. Para hacer más fácil esto, he creado un  script que checa los archivos cambiados en nuestro branch y checa con los archivos modificados del principal, la manera de invocarlo es simple:</p>
<pre>
php changes-branch.php BASE_SVN PROYECTO BRANCH
</pre>
</p>
<p>Así por ejemplo si nuestro svn está en: <code>http://svn.example.com/proyecto</code> y nuestro branch es: <code>http://svn.example.com/proyecto/branches/cambios</code> debemos invocar el programa como:</p>
<pre>php changes.branch.php http://svn.example.com proyecto cambios</pre>
</p>
<p>El sistema mostrará cuales archivos han tenido cambios desde nuestra última actualización de nuestro branch, así como la salida del diff para ver los cambios.</p>
<p>El script también tiene una opción que les permite ver todos los cambios desde que se inició el branch, simplemente agregar un cuarto parámetro, por ejemplo:</p>
<pre>php changes-branch.php BASE_SVN PROYECTO BRANCH true</pre>
</p>
<p>El código completo está aqui: <a href="https://github.com/danguer/blog-examples/blob/master/php/svn/changes-branch.php">https://github.com/danguer/blog-examples/blob/master/php/svn/changes-branch.php</a></p>
]]></description>
			<content:encoded><![CDATA[<a href="http://vida.danguer.com/2010/09/28/mantener-cambios-en-branches-de-svn/" title="Mantener cambios en branches de SVN"></a><p>Cuando se desarrolla en un branch de SVN el mayor problema es mantener actualizados los archivos que estamos modificando con los cambios que se hacen en la rama principal (<code>trunk</code>) de SVN. Para hacer más fácil esto, he creado un  script que checa los archivos cambiados en nuestro branch y checa con los archivos modificados del principal, la manera de invocarlo es simple:</p>
<pre>
php changes-branch.php BASE_SVN PROYECTO BRANCH
</pre>
</p>
<p>Así por ejemplo si nuestro svn está en: <code>http://svn.example.com/proyecto</code> y nuestro branch es: <code>http://svn.example.com/proyecto/branches/cambios</code> debemos invocar el programa como:</p>
<pre>php changes.branch.php http://svn.example.com proyecto cambios</pre>
</p>
<p>El sistema mostrará cuales archivos han tenido cambios desde nuestra última actualización de nuestro branch, así como la salida del diff para ver los cambios.</p>
<p>El script también tiene una opción que les permite ver todos los cambios desde que se inició el branch, simplemente agregar un cuarto parámetro, por ejemplo:</p>
<pre>php changes-branch.php BASE_SVN PROYECTO BRANCH true</pre>
</p>
<p>El código completo está aqui: <a href="https://github.com/danguer/blog-examples/blob/master/php/svn/changes-branch.php">https://github.com/danguer/blog-examples/blob/master/php/svn/changes-branch.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vida.danguer.com/2010/09/28/mantener-cambios-en-branches-de-svn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cuidado al usar Zend_Date</title>
		<link>http://vida.danguer.com/2010/01/30/cuidado-al-usar-zend_date/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cuidado-al-usar-zend_date</link>
		<comments>http://vida.danguer.com/2010/01/30/cuidado-al-usar-zend_date/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 00:14:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Trabajo]]></category>
		<category><![CDATA[Fechas]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Date]]></category>

		<guid isPermaLink="false">http://vida.danguer.com/?p=96</guid>
		<description><![CDATA[<a href="http://vida.danguer.com/2010/01/30/cuidado-al-usar-zend_date/" title="Cuidado al usar Zend_Date"></a><p>En un proyecto, estaba utilizando Zend_Date para manejo de horas en diferentes zonas horarias, cuando lo estaba desarrollando empecé a tener un error porque olvidé que la fecha se actualiza cuando cambias un parámetro y el problema surge cuando cambias el mes o día y se encuentra con una fecha inexistente aunque en el código parezca correcta, por ejemplo, supongamos que estamos en el mes de febrero y queremos crear una fecha de marzo (asignaré la fecha para reproducir el error, aunque el error es cuando se utiliza la fecha actual)</p>
<pre name="code" class="php">include_once("Zend/Date.php");
$fecha_febrero = mktime(0, 0, 0, 2, 1, 2010);
$fecha = new Zend_Date($fecha_febrero);
$fecha-&#62;setDay(31);
$fecha-&#62;setMonth(3);
print "Fecha Marzo: ".date("d/m/Y", $fecha-&#62;getTimestamp());</pre>
<p>Uno esperaría que el resultado fuera: <strong>31/03/2010</strong></p>
<p>Pero en su lugar mostrará <strong>03/03/2010</strong></p>
<p>Esto es porque al hacer <code>$fecha-&#62;setDay(31)</code> el sistema intenta crear la fecha: <strong>31/02/2010</strong> que no existe, por lo que &#8220;recorre&#8221; los días restantes para quedar en <strong>03/03/2010</strong>, al asignar el mes, no tiene efecto.</p>
<p>La solución es simplemente hacerlo en orden inverso:</p>
<pre name="code" class="php">include_once("Zend/Date.php");
$fecha_febrero = mktime(0, 0, 0, 2, 1, 2010);
$fecha = new Zend_Date($fecha_febrero);
$fecha-&#62;setMonth(3);
$fecha-&#62;setDay(31);
print "Fecha Marzo: ".date("d/m/Y", $fecha-&#62;getTimestamp());</pre>
<p>Eso parecería la solución ideal (y es la recomendada por la documentación), pero no es totalmente cierta, si por ejemplo estamos en enero 31 del 2010 e intentamos asignar una fecha de febrero, siempre obtendremos una fecha de marzo:</p>
<pre name="code" class="php">include_once 'Zend/Date.php';
$fecha_enero = mktime(0, 0, 0, 1, 31, 2010);
$fecha = new Zend_Date($fecha_enero);
$fecha-&#62;setMonth(2);
$fecha-&#62;setDay(10);
print "Fecha Febrero: ".date("d/m/Y", $fecha-&#62;getTimestamp());</pre>
<p>Uno esperaría que mostrara la fecha:<br />
<strong>10/02/2010</strong></p>
<p>Pero en realidad muestra<br />
<strong>10/03/2010</strong></p>
<p>Esto porque cuando asignamos el mes, el sistema intenta crear la fecha 31/03/2010 que una vez más es incorrecta, por lo que crea la fecha 03/03/2010, pero al asignar la fecha, el resultado es&#8230;</p>]]></description>
			<content:encoded><![CDATA[<a href="http://vida.danguer.com/2010/01/30/cuidado-al-usar-zend_date/" title="Cuidado al usar Zend_Date"></a><p>En un proyecto, estaba utilizando Zend_Date para manejo de horas en diferentes zonas horarias, cuando lo estaba desarrollando empecé a tener un error porque olvidé que la fecha se actualiza cuando cambias un parámetro y el problema surge cuando cambias el mes o día y se encuentra con una fecha inexistente aunque en el código parezca correcta, por ejemplo, supongamos que estamos en el mes de febrero y queremos crear una fecha de marzo (asignaré la fecha para reproducir el error, aunque el error es cuando se utiliza la fecha actual)</p>
<pre name="code" class="php">include_once("Zend/Date.php");
$fecha_febrero = mktime(0, 0, 0, 2, 1, 2010);
$fecha = new Zend_Date($fecha_febrero);
$fecha-&gt;setDay(31);
$fecha-&gt;setMonth(3);
print "Fecha Marzo: ".date("d/m/Y", $fecha-&gt;getTimestamp());</pre>
<p>Uno esperaría que el resultado fuera: <strong>31/03/2010</strong></p>
<p>Pero en su lugar mostrará <strong>03/03/2010</strong></p>
<p>Esto es porque al hacer <code>$fecha-&gt;setDay(31)</code> el sistema intenta crear la fecha: <strong>31/02/2010</strong> que no existe, por lo que &#8220;recorre&#8221; los días restantes para quedar en <strong>03/03/2010</strong>, al asignar el mes, no tiene efecto.</p>
<p>La solución es simplemente hacerlo en orden inverso:</p>
<pre name="code" class="php">include_once("Zend/Date.php");
$fecha_febrero = mktime(0, 0, 0, 2, 1, 2010);
$fecha = new Zend_Date($fecha_febrero);
$fecha-&gt;setMonth(3);
$fecha-&gt;setDay(31);
print "Fecha Marzo: ".date("d/m/Y", $fecha-&gt;getTimestamp());</pre>
<p>Eso parecería la solución ideal (y es la recomendada por la documentación), pero no es totalmente cierta, si por ejemplo estamos en enero 31 del 2010 e intentamos asignar una fecha de febrero, siempre obtendremos una fecha de marzo:</p>
<pre name="code" class="php">include_once 'Zend/Date.php';
$fecha_enero = mktime(0, 0, 0, 1, 31, 2010);
$fecha = new Zend_Date($fecha_enero);
$fecha-&gt;setMonth(2);
$fecha-&gt;setDay(10);
print "Fecha Febrero: ".date("d/m/Y", $fecha-&gt;getTimestamp());</pre>
<p>Uno esperaría que mostrara la fecha:<br />
<strong>10/02/2010</strong></p>
<p>Pero en realidad muestra<br />
<strong>10/03/2010</strong></p>
<p>Esto porque cuando asignamos el mes, el sistema intenta crear la fecha 31/03/2010 que una vez más es incorrecta, por lo que crea la fecha 03/03/2010, pero al asignar la fecha, el resultado es un error en el mes.</p>
<p>Aunque esto no es un error, es muy peligroso porque uno puede suponer que la fecha es correcta porque en el código lo parece, la solución sin embargo es trivial, asignar el primer día de un mes que tenga 31 días y asignar los valores en orden inverso (primero año, luego mes y por último día), así el código sin error sería:</p>
<pre name="code" class="php">
include_once 'Zend/Date.php';
$fecha = new Zend_Date(0, 0, 0, 1, 1, date('Y'));
$fecha-&gt;setMonth(2);
$fecha-&gt;setDay(10);
print "Fecha Febrero: ".date("d/m/Y", $fecha-&gt;getTimestamp());
</pre>
<p>Resultado (el esperado)<br />
<strong>10/02/2010</strong></p>
<p>Esto funciona en la mayoría de los casos; aunque si van a manejar diferentes zonas horarias mediante <code>setTimezone()</code> el código anterior tendrá el mismo error en los casos que la zona horaria sea menor a la zona horaria del servidor, por lo que hay que hacer algo más elaborado:</p>
<pre name="code" class="php">
include_once 'Zend/Date.php';
$fecha = new Zend_Date();
//eliminar "errores"
$fecha-&gt;setTimezone('mi_codigo_zona_horaria');
$fecha-&gt;setDay(1);
$fecha-&gt;setMonth(1);

//nuestro código
$fecha-&gt;setMonth(2);
$fecha-&gt;setDay(10);
print "Fecha Febrero: ".date("d/m/Y", $fecha-&gt;getTimestamp());
</pre>
<p>Lo peligroso del comportamiento de Zend_Date es que funcionará con errores durante algunos días/meses dependiendo de la manera en como se programe y es un poco difícil de diagnosticar por su misma naturaleza, con esto se elimina cualquier tipo de errores.</p>
]]></content:encoded>
			<wfw:commentRss>http://vida.danguer.com/2010/01/30/cuidado-al-usar-zend_date/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Una hora perdida</title>
		<link>http://vida.danguer.com/2009/11/25/una-hora-perdida/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=una-hora-perdida</link>
		<comments>http://vida.danguer.com/2009/11/25/una-hora-perdida/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 07:12:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Trabajo]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[strtotime]]></category>
		<category><![CDATA[Tiempo]]></category>
		<category><![CDATA[Zona Horaria]]></category>

		<guid isPermaLink="false">http://vida.danguer.com/?p=95</guid>
		<description><![CDATA[<a href="http://vida.danguer.com/2009/11/25/una-hora-perdida/" title="Una hora perdida"></a><p>Mientras estaba haciendo un pequeño calendario que mostrara fechas con ligas a otras parte del sitio, pensé que la manera más fácil era evitar llamar a <code><a href="http://www.php.net/strtotime">strototime</a></code>:</p>
<pre class="code">strtotime("+1 days", $time)</pre>
<p>y en su lugar utilizar directamente la suma de <code>86,400</code> segundos que es un día:</p>
<pre>60 * 60 segundos = 3600 segundos (1 hora) * 24 = 86400</pre>
<p>El calendario no tenía ningún problema hasta que noté que tenía repetido dos veces el día 1º de noviembre, los tiempos eran los siguientes (tiempo Unix):</p>
<pre>1257051600: 2009-11-01 00:00:00
1257138000: 2009-11-01 23:00:00</pre>
<p>Si hacen la suma, observarán que se sumó <code>86,400</code> segundos a una fecha y otra; pero el tiempo regresado por PHP (de hecho por el sistema Linux) es de 23 horas y no 24 horas.</p>
<p>Hice algunas pruebas en otros servidores y solo uno imprimió la fecha que esperaba (<code>2009-11-02 00:00:00</code>), la primera idea (por el cansancio) fue que era un error de PHP/Linux. Buscando un posible error, encontré algunas preguntas que como yo habían tenido un problema similar, pero mencionaban algo de la zona horaria, eso me recordó que el 1º de Noviembre en México atrasamos el reloj una hora por lo que en realidad el cálculo era correcto desde la perspectiva de Linux ya que estaba olvidando esa &#8220;hora perdida&#8221; en mis cálculos, el servidor que regresó bien la fecha estaba en otra zona horaria por lo que no compartían nuestro cambio de horario.</p>
<p>El tiempo Unix correcto es: <code>1257141600</code> no es otra cosa que es el día (<code>86400</code>) más la hora &#8220;perdida&#8221; (<code>3600</code>), este tiempo lo obtuve llamando a <code><a href="http://www.php.net/strtotime">strtotime</a></code> en PHP en lugar de calcularlo por mi cuenta.</p>
<p><strong>Moraleja</strong>: Manipular el tiempo Unix de forma directa agregando valores puede ser muy rápido y simplifica la implementación, pero si quieres hacer algo que no tenga errores utiliza&#8230;</p>]]></description>
			<content:encoded><![CDATA[<a href="http://vida.danguer.com/2009/11/25/una-hora-perdida/" title="Una hora perdida"></a><p>Mientras estaba haciendo un pequeño calendario que mostrara fechas con ligas a otras parte del sitio, pensé que la manera más fácil era evitar llamar a <code><a href="http://www.php.net/strtotime">strototime</a></code>:</p>
<pre class="code">strtotime("+1 days", $time)</pre>
<p>y en su lugar utilizar directamente la suma de <code>86,400</code> segundos que es un día:</p>
<pre>60 * 60 segundos = 3600 segundos (1 hora) * 24 = 86400</pre>
<p>El calendario no tenía ningún problema hasta que noté que tenía repetido dos veces el día 1º de noviembre, los tiempos eran los siguientes (tiempo Unix):</p>
<pre>1257051600: 2009-11-01 00:00:00
1257138000: 2009-11-01 23:00:00</pre>
<p>Si hacen la suma, observarán que se sumó <code>86,400</code> segundos a una fecha y otra; pero el tiempo regresado por PHP (de hecho por el sistema Linux) es de 23 horas y no 24 horas.</p>
<p>Hice algunas pruebas en otros servidores y solo uno imprimió la fecha que esperaba (<code>2009-11-02 00:00:00</code>), la primera idea (por el cansancio) fue que era un error de PHP/Linux. Buscando un posible error, encontré algunas preguntas que como yo habían tenido un problema similar, pero mencionaban algo de la zona horaria, eso me recordó que el 1º de Noviembre en México atrasamos el reloj una hora por lo que en realidad el cálculo era correcto desde la perspectiva de Linux ya que estaba olvidando esa &#8220;hora perdida&#8221; en mis cálculos, el servidor que regresó bien la fecha estaba en otra zona horaria por lo que no compartían nuestro cambio de horario.</p>
<p>El tiempo Unix correcto es: <code>1257141600</code> no es otra cosa que es el día (<code>86400</code>) más la hora &#8220;perdida&#8221; (<code>3600</code>), este tiempo lo obtuve llamando a <code><a href="http://www.php.net/strtotime">strtotime</a></code> en PHP en lugar de calcularlo por mi cuenta.</p>
<p><strong>Moraleja</strong>: Manipular el tiempo Unix de forma directa agregando valores puede ser muy rápido y simplifica la implementación, pero si quieres hacer algo que no tenga errores utiliza siempre las funciones de tiempo de PHP/Linux.</p>
]]></content:encoded>
			<wfw:commentRss>http://vida.danguer.com/2009/11/25/una-hora-perdida/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dumpear todas las bases de datos</title>
		<link>http://vida.danguer.com/2009/02/19/dumpear-todas-las-bases-de-datos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dumpear-todas-las-bases-de-datos</link>
		<comments>http://vida.danguer.com/2009/02/19/dumpear-todas-las-bases-de-datos/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 01:25:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Trabajo]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[respaldo]]></category>

		<guid isPermaLink="false">http://vida.danguer.com/?p=91</guid>
		<description><![CDATA[<a href="http://vida.danguer.com/2009/02/19/dumpear-todas-las-bases-de-datos/" title="Dumpear todas las bases de datos"></a><p>Recientemente tuve que &#8220;dumpear&#8221; todas las bases de datos de un servidor por lo que utilice un script muy simple para hacerlo:</p>
<pre name="code" class="php">
USER=root;PASS=mi_pass;for database in `echo "SHOW DATABASES" &#124; mysql --user=$USER --password=$PASS &#124; sed '1d'`; do mysqldump --user=$USER --password=$PASS $database > $database.sql; tar jcvf $database.tar.bz2 $database.sql; rm $database.sql; done
</pre>
<p>Un poco más leible:</p>
<pre name="code" class="php">
USER=root
PASS=mi_pass
for database in `echo "SHOW DATABASES" &#124; mysql --user=$USER --password=$PASS &#124; sed '1d'`
do
    mysqldump --user=$USER --password=$PASS $database > $database.sql
    tar jcvf $database.tar.bz2 $database.sql
    rm $database.sql
done
</pre>
<p>Básicamente manda todas las bases de datos y quita la linea inicial (que siempre es Databases) y por cada base de datos invoca mysqldump y por último lo comprime con bunzip2 para obtener un archivo muy pequeño y por supuesto elimina las &#8220;fuentes&#8221; de sql.</p>
]]></description>
			<content:encoded><![CDATA[<a href="http://vida.danguer.com/2009/02/19/dumpear-todas-las-bases-de-datos/" title="Dumpear todas las bases de datos"></a><p>Recientemente tuve que &#8220;dumpear&#8221; todas las bases de datos de un servidor por lo que utilice un script muy simple para hacerlo:</p>
<pre name="code" class="php">
USER=root;PASS=mi_pass;for database in `echo "SHOW DATABASES" | mysql --user=$USER --password=$PASS | sed '1d'`; do mysqldump --user=$USER --password=$PASS $database > $database.sql; tar jcvf $database.tar.bz2 $database.sql; rm $database.sql; done
</pre>
<p>Un poco más leible:</p>
<pre name="code" class="php">
USER=root
PASS=mi_pass
for database in `echo "SHOW DATABASES" | mysql --user=$USER --password=$PASS | sed '1d'`
do
    mysqldump --user=$USER --password=$PASS $database > $database.sql
    tar jcvf $database.tar.bz2 $database.sql
    rm $database.sql
done
</pre>
<p>Básicamente manda todas las bases de datos y quita la linea inicial (que siempre es Databases) y por cada base de datos invoca mysqldump y por último lo comprime con bunzip2 para obtener un archivo muy pequeño y por supuesto elimina las &#8220;fuentes&#8221; de sql.</p>
]]></content:encoded>
			<wfw:commentRss>http://vida.danguer.com/2009/02/19/dumpear-todas-las-bases-de-datos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Auto inicio de dominios en Xen</title>
		<link>http://vida.danguer.com/2009/01/09/auto-inicio-de-dominios-en-xen/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=auto-inicio-de-dominios-en-xen</link>
		<comments>http://vida.danguer.com/2009/01/09/auto-inicio-de-dominios-en-xen/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 22:47:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Trabajo]]></category>
		<category><![CDATA[Xen]]></category>

		<guid isPermaLink="false">http://vida.danguer.com/?p=90</guid>
		<description><![CDATA[<a href="http://vida.danguer.com/2009/01/09/auto-inicio-de-dominios-en-xen/" title="Auto inicio de dominios en Xen"></a><p>Algo muy útil es iniciar/apagar automáticamente dominios XEN cuando se reinicia o apaga el anfitrión (<code>dom0</code>), cuando se instala XEN, por defecto deberemos ver creado un directorio llamado <code>/etc/xen/auto</code></p>
<p>En este directorio el script <code>/etc/init.d/xendomains</code> buscará las configuraciones de las máquinas virtuales a iniciar/detener estos pueden ser vínculos simbólicos a las verdaderas configuraciones.</p>
<p>Para que todo esto suceda en primer lugar debes de tener el script <code>/etc/init.d/xendomains</code> que se instala junto con <code>/etc/init.d/xend</code></p>
<p>También debes haber habilitado el inicio de este script con el siguiente comando:</p>
<pre name="code" class="php">
update-rc.d xendomains defaults 21 20
</pre>
<p> <br />
El script <code>/etc/init.d/xendomains</code> necesita del archivo de configuración: <code>/etc/sysconfig/xendomains</code></p>
<p>En este verás una línea que contiene:</p>
<pre name="code" class="php">
XENDOMAINS_AUTO=/etc/xen/auto
</pre>
<p>Con esto definimos el directorio donde se buscarán los dominios que se auto iniciarán</p>
]]></description>
			<content:encoded><![CDATA[<a href="http://vida.danguer.com/2009/01/09/auto-inicio-de-dominios-en-xen/" title="Auto inicio de dominios en Xen"></a><p>Algo muy útil es iniciar/apagar automáticamente dominios XEN cuando se reinicia o apaga el anfitrión (<code>dom0</code>), cuando se instala XEN, por defecto deberemos ver creado un directorio llamado <code>/etc/xen/auto</code></p>
<p>En este directorio el script <code>/etc/init.d/xendomains</code> buscará las configuraciones de las máquinas virtuales a iniciar/detener estos pueden ser vínculos simbólicos a las verdaderas configuraciones.</p>
<p>Para que todo esto suceda en primer lugar debes de tener el script <code>/etc/init.d/xendomains</code> que se instala junto con <code>/etc/init.d/xend</code></p>
<p>También debes haber habilitado el inicio de este script con el siguiente comando:</p>
<pre name="code" class="php">
update-rc.d xendomains defaults 21 20
</pre>
<p> <br />
El script <code>/etc/init.d/xendomains</code> necesita del archivo de configuración: <code>/etc/sysconfig/xendomains</code></p>
<p>En este verás una línea que contiene:</p>
<pre name="code" class="php">
XENDOMAINS_AUTO=/etc/xen/auto
</pre>
<p>Con esto definimos el directorio donde se buscarán los dominios que se auto iniciarán</p>
]]></content:encoded>
			<wfw:commentRss>http://vida.danguer.com/2009/01/09/auto-inicio-de-dominios-en-xen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tip: Usando rsync para transferencias rápidas entre linux</title>
		<link>http://vida.danguer.com/2008/11/26/tip-usando-rsync-para-transferencias-rapidas-entre-linux/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tip-usando-rsync-para-transferencias-rapidas-entre-linux</link>
		<comments>http://vida.danguer.com/2008/11/26/tip-usando-rsync-para-transferencias-rapidas-entre-linux/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 07:37:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Trabajo]]></category>
		<category><![CDATA[replica]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://vida.danguer.com/?p=87</guid>
		<description><![CDATA[<a href="http://vida.danguer.com/2008/11/26/tip-usando-rsync-para-transferencias-rapidas-entre-linux/" title="Tip: Usando rsync para transferencias rápidas entre linux"></a><p>Usualmente uso el famosímo <code>scp</code> para transferir archivos, el problema es que al parecer <code>scp</code> es muy lento cuando se trata de muchos archivos pequeños. </p>
<p><code>rsync</code> es un comando para hacer réplicas de un directorio a otro lugar, lo que hace es checar el comparar los directorios y copiar todos los archivos que hayan sido modificados, que sean nuevos o incluso que hayan sido elminados para hacer una copia exacta.</p>
<p>La gran ventaja de <code>rsync</code> es que aparte de crear una réplica, es sorprendentemente rápido, en especial con archivos pequeños.</p>
<p>El uso es muy simple:</p>
<pre>rsync -az -e ssh FUENTE usuario@servidor:DESTINO</pre>
<p>Eso es todo, para que funcione ambos servidores deben tener el programa <code>rsync</code> instalado, <code>FUENTE</code> es el directorio local a copiar (o puede ser un archivo), <code>DESTINO</code> es el directorio del servidor remoto a donde se copiará.</p>
<p>La opción <code>-az</code> envia la información compresa y <code>-e ssh</code> indica que hay que usar el programa <code>ssh</code> para transferir los archivos (con esto se puede enviar también mediante <code>ftp</code>, etc)</p>
<p>Otra opción que uso mucho es <code>--delete</code>, de esta manera <code>rsync</code> también borrará los archivos &#8220;extra&#8221; para que la copia sea exacta. Hay que tener cuidado, porque en algo descuidado se pueden borrar los archivos locales (inversión de parámetros)&#8230; algo que me pasó una vez, pero tenía respaldo =).</p>
<p> </p>
<p> </p>
]]></description>
			<content:encoded><![CDATA[<a href="http://vida.danguer.com/2008/11/26/tip-usando-rsync-para-transferencias-rapidas-entre-linux/" title="Tip: Usando rsync para transferencias rápidas entre linux"></a><p>Usualmente uso el famosímo <code>scp</code> para transferir archivos, el problema es que al parecer <code>scp</code> es muy lento cuando se trata de muchos archivos pequeños. </p>
<p><code>rsync</code> es un comando para hacer réplicas de un directorio a otro lugar, lo que hace es checar el comparar los directorios y copiar todos los archivos que hayan sido modificados, que sean nuevos o incluso que hayan sido elminados para hacer una copia exacta.</p>
<p>La gran ventaja de <code>rsync</code> es que aparte de crear una réplica, es sorprendentemente rápido, en especial con archivos pequeños.</p>
<p>El uso es muy simple:</p>
<pre>rsync -az -e ssh FUENTE usuario@servidor:DESTINO</pre>
<p>Eso es todo, para que funcione ambos servidores deben tener el programa <code>rsync</code> instalado, <code>FUENTE</code> es el directorio local a copiar (o puede ser un archivo), <code>DESTINO</code> es el directorio del servidor remoto a donde se copiará.</p>
<p>La opción <code>-az</code> envia la información compresa y <code>-e ssh</code> indica que hay que usar el programa <code>ssh</code> para transferir los archivos (con esto se puede enviar también mediante <code>ftp</code>, etc)</p>
<p>Otra opción que uso mucho es <code>--delete</code>, de esta manera <code>rsync</code> también borrará los archivos &#8220;extra&#8221; para que la copia sea exacta. Hay que tener cuidado, porque en algo descuidado se pueden borrar los archivos locales (inversión de parámetros)&#8230; algo que me pasó una vez, pero tenía respaldo =).</p>
<p> </p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://vida.danguer.com/2008/11/26/tip-usando-rsync-para-transferencias-rapidas-entre-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solución a &#8220;Failed to find an unused loop device&#8221;</title>
		<link>http://vida.danguer.com/2008/11/10/solucion-a-failed-to-find-an-unused-loop-device/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=solucion-a-failed-to-find-an-unused-loop-device</link>
		<comments>http://vida.danguer.com/2008/11/10/solucion-a-failed-to-find-an-unused-loop-device/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 16:06:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Trabajo]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Loop]]></category>
		<category><![CDATA[Xen]]></category>

		<guid isPermaLink="false">http://vida.danguer.com/?p=82</guid>
		<description><![CDATA[<a href="http://vida.danguer.com/2008/11/10/solucion-a-failed-to-find-an-unused-loop-device/" title="Solución a &quot;Failed to find an unused loop device&quot;"></a><p>En Xen, si no configuras de antemano linux verás que después de iniciar varios servidores virtuales te marcará un error que dice: &#8220;<code>Failed to find an unused loop device</code>&#8221;</p>
<p>Esto significa que linux ya no tiene &#8220;lugar&#8221; para montar más dispositivos <code>loop </code>(montar tu disco duro virtual o <code>swap</code>), por defecto tienes ochos dispositivos <code>loop</code> permitidos, que son para cuatro máquinas virtuales (debido a que utilizan al menos dos imágnes, una para el <code>swap</code> y otra para el disco duro)</p>
<p>Para aumentar este límite es muy fácil, primero detienes las instancias virtuales de Xen:</p>
<pre name="code" class="php">
/etc/init.d/xendomains stop
</pre>
<p>Agregas al archivo <code>/etc/modprobe.d/local-loop</code> lo siguiente (o crealo si no existe):</p>
<pre name="code" class="php">
options loop max_loop=64
</pre>
<p>Después vuelves a cargar el módulo</p>
<pre name="code" class="php">
rmmod loop
modprobe loop
</pre>
<p>Por último inicias las instancias virtuales</p>
<pre name="code" class="php">
/etc/init.d/xendomains start
</pre>
<p>Con esto puede tener hasta 32 instancias de Xen sin problemas.</p>
]]></description>
			<content:encoded><![CDATA[<a href="http://vida.danguer.com/2008/11/10/solucion-a-failed-to-find-an-unused-loop-device/" title="Solución a &quot;Failed to find an unused loop device&quot;"></a><p>En Xen, si no configuras de antemano linux verás que después de iniciar varios servidores virtuales te marcará un error que dice: &#8220;<code>Failed to find an unused loop device</code>&#8221;</p>
<p>Esto significa que linux ya no tiene &#8220;lugar&#8221; para montar más dispositivos <code>loop </code>(montar tu disco duro virtual o <code>swap</code>), por defecto tienes ochos dispositivos <code>loop</code> permitidos, que son para cuatro máquinas virtuales (debido a que utilizan al menos dos imágnes, una para el <code>swap</code> y otra para el disco duro)</p>
<p>Para aumentar este límite es muy fácil, primero detienes las instancias virtuales de Xen:</p>
<pre name="code" class="php">
/etc/init.d/xendomains stop
</pre>
<p>Agregas al archivo <code>/etc/modprobe.d/local-loop</code> lo siguiente (o crealo si no existe):</p>
<pre name="code" class="php">
options loop max_loop=64
</pre>
<p>Después vuelves a cargar el módulo</p>
<pre name="code" class="php">
rmmod loop
modprobe loop
</pre>
<p>Por último inicias las instancias virtuales</p>
<pre name="code" class="php">
/etc/init.d/xendomains start
</pre>
<p>Con esto puede tener hasta 32 instancias de Xen sin problemas.</p>
]]></content:encoded>
			<wfw:commentRss>http://vida.danguer.com/2008/11/10/solucion-a-failed-to-find-an-unused-loop-device/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruteo en Xen</title>
		<link>http://vida.danguer.com/2008/11/10/ruteo-en-xen/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ruteo-en-xen</link>
		<comments>http://vida.danguer.com/2008/11/10/ruteo-en-xen/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 15:56:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Trabajo]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Virtualizacion]]></category>
		<category><![CDATA[Xen]]></category>

		<guid isPermaLink="false">http://vida.danguer.com/?p=81</guid>
		<description><![CDATA[<a href="http://vida.danguer.com/2008/11/10/ruteo-en-xen/" title="Ruteo en Xen"></a><p>Hace poco instalé un servidor Xen, después para terminar de configurarlo solicitamos IP&#8217;s adicionales para que cada servidor virtual tuviera su IP dedicada.</p>
<p>Lamentablemente nos dieron IPs en otra subred, esto puede ocasionar algunos problemas pero aqui está una solución =)</p>
<p>Vamos a suponer que nuestro servidor Xen tiene ip <code>192.168.1.90</code> y que nuestras nuevas ips a asignar son <code>192.168.247.130</code> y <code>192.168.247.131</code>, y que el gateway de nuestra máquina anfitrión es <code>192.168.1.1</code></p>
<p> </p>
<p><strong>Configuración de Xen</strong></p>
<p>Debido a que en mi caso necesitaba rutear los datos entre mi máquina anfitrión (<code>dom0</code>) y mis máquinas virtuales (<code>domU</code>) habilité lo siguiente en xen:</p>
<pre name="code" class="php">(network-script network-route)
(vif-script vif-route)</pre>
<p>Tanto <code>network-script</code>  y <code>vif-script</code> deben ser las únicas configuraciones disponibles (esto es comentar todos los otro <code>network-script</code> y <code>vif-script</code>)</p>
<p> </p>
<p>Reiniciamos el servidor Xen:</p>
<pre name="code" class="php">/etc/init.d/xend restart
/etc/init.d/xendomains restart </pre>
<p>Es muy importante que verifiques si te marca un error, ya que a mi me mandaba un error por un script que no reconocía la interfaz que ibamos a utilizar, así que hice el siguiente cambio en el archivo: <code>/etc/xen/scripts/network-route</code></p>
<pre name="code" class="php">dir=$(dirname "$0")

. "$dir/xen-script-common.sh"

evalVariables "$@"

 

#netdev=${netdev:-eth${vifnum}}

netdev=eth0 #definir por defecto la interfaz a utilizar

echo 1 &#62;/proc/sys/net/ipv4/ip_forward
echo 1 &#62;/proc/sys/net/ipv4/conf/${netdev}/proxy_arp</pre>
<p> </p>
<p>Básicamente lo que hace el script de Xen es habilitar el ruteo en linux y crear unas reglas de <code>iptables</code> (que tu puedes configurar si quieres personalizar el rendimiento o seguridad de tus máquinas virtuales por medio del anfitrión)</p>
<p>Ya por último debes borrar el puente que hace Xen en la configuración por defecto de <code>bridge</code> (usando el comando <code>brctl</code>)</p>
<p> </p>
<p><strong>Configuración de la Imagen</strong></p>
<p>Al crear la imagen. proporciona la IP, el gateway de tu máquina anfitrión (<code>dom0</code>) y la máscara de red correspondiente, en nuestro ejemplo <code>255.255.0.0</code>, ejemplo:</p>
<pre name="code" class="php">xen-create-image --hostname=misitio.com --ip=192.168.247.130 --netmask=255.255.0.0 --gateway=192.168.1.1 --passwd</pre>
<p> </p>
<p>Con esto&#8230;</p>]]></description>
			<content:encoded><![CDATA[<a href="http://vida.danguer.com/2008/11/10/ruteo-en-xen/" title="Ruteo en Xen"></a><p>Hace poco instalé un servidor Xen, después para terminar de configurarlo solicitamos IP&#8217;s adicionales para que cada servidor virtual tuviera su IP dedicada.</p>
<p>Lamentablemente nos dieron IPs en otra subred, esto puede ocasionar algunos problemas pero aqui está una solución =)</p>
<p>Vamos a suponer que nuestro servidor Xen tiene ip <code>192.168.1.90</code> y que nuestras nuevas ips a asignar son <code>192.168.247.130</code> y <code>192.168.247.131</code>, y que el gateway de nuestra máquina anfitrión es <code>192.168.1.1</code></p>
<p> </p>
<p><strong>Configuración de Xen</strong></p>
<p>Debido a que en mi caso necesitaba rutear los datos entre mi máquina anfitrión (<code>dom0</code>) y mis máquinas virtuales (<code>domU</code>) habilité lo siguiente en xen:</p>
<pre name="code" class="php">(network-script network-route)
(vif-script vif-route)</pre>
<p>Tanto <code>network-script</code>  y <code>vif-script</code> deben ser las únicas configuraciones disponibles (esto es comentar todos los otro <code>network-script</code> y <code>vif-script</code>)</p>
<p> </p>
<p>Reiniciamos el servidor Xen:</p>
<pre name="code" class="php">/etc/init.d/xend restart
/etc/init.d/xendomains restart </pre>
<p>Es muy importante que verifiques si te marca un error, ya que a mi me mandaba un error por un script que no reconocía la interfaz que ibamos a utilizar, así que hice el siguiente cambio en el archivo: <code>/etc/xen/scripts/network-route</code></p>
<pre name="code" class="php">dir=$(dirname "$0")

. "$dir/xen-script-common.sh"

evalVariables "$@"

 

#netdev=${netdev:-eth${vifnum}}

netdev=eth0 #definir por defecto la interfaz a utilizar

echo 1 &gt;/proc/sys/net/ipv4/ip_forward
echo 1 &gt;/proc/sys/net/ipv4/conf/${netdev}/proxy_arp</pre>
<p> </p>
<p>Básicamente lo que hace el script de Xen es habilitar el ruteo en linux y crear unas reglas de <code>iptables</code> (que tu puedes configurar si quieres personalizar el rendimiento o seguridad de tus máquinas virtuales por medio del anfitrión)</p>
<p>Ya por último debes borrar el puente que hace Xen en la configuración por defecto de <code>bridge</code> (usando el comando <code>brctl</code>)</p>
<p> </p>
<p><strong>Configuración de la Imagen</strong></p>
<p>Al crear la imagen. proporciona la IP, el gateway de tu máquina anfitrión (<code>dom0</code>) y la máscara de red correspondiente, en nuestro ejemplo <code>255.255.0.0</code>, ejemplo:</p>
<pre name="code" class="php">xen-create-image --hostname=misitio.com --ip=192.168.247.130 --netmask=255.255.0.0 --gateway=192.168.1.1 --passwd</pre>
<p> </p>
<p>Con esto tus máquinas clientes podrán ser vistas y accesar a internet sin problemas.</p>
]]></content:encoded>
			<wfw:commentRss>http://vida.danguer.com/2008/11/10/ruteo-en-xen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xen 3.3 y Debian Etch</title>
		<link>http://vida.danguer.com/2008/10/26/xen-33-y-debian-etch/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=xen-33-y-debian-etch</link>
		<comments>http://vida.danguer.com/2008/10/26/xen-33-y-debian-etch/#comments</comments>
		<pubDate>Sun, 26 Oct 2008 23:34:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Trabajo]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Virtualizacion]]></category>
		<category><![CDATA[Xen]]></category>

		<guid isPermaLink="false">http://vida.danguer.com/?p=79</guid>
		<description><![CDATA[<a href="http://vida.danguer.com/2008/10/26/xen-33-y-debian-etch/" title="Xen 3.3 y Debian Etch"></a><p>Recientemente me tocó configurar un servidor para tener máquinas virtuales mediante <a title="Xen - Virtualizacion" href="http://xen.org" target="_blank">XEN</a>. Anteriormente sólo había trabajado con un poco con <a title="VMWare ESXi - Virtualizacion" href="http://www.vmware.com/products/esxi/" target="_blank">VMWare ESXi</a> y <a title="XenServer - Virtualizacion" href="http://www.xenserver5.com/" target="_blank">XenServer</a> (la versión &#8220;comercial&#8221; de XEN), el problema es que se tenía que instalar en un servidor remoto que solo se tiene acceso mediante ssh.</p>
<p>Con algo de trabajo y pruebas (y con las buenas herramientas de <a title="ServerBeach - Hosting Recomendable" href="http://serverbeach.com/" target="_blank">ServerBeach</a>, que sólo le faltan una vista a la consola para diagnosticar kernel panics) por fin pude instalarlo.</p>
<p>Debian tiene una versión de Xen, pero es la 3.0.3 que para mi gusto es demasiado vieja (se liberó en 2006) y la versión <a title="Debian Lenny" href="http://www.debian.org/devel/debian-installer/" target="_blank">Lenny</a> (testing) tiene la versión 3.2, pero también algo &#8220;inestable&#8221; a mi gusto para un servidor de batalla.</p>
<p>Como dije después de hacer varias pruebas logré instalar la versión Xen 3.3 utilizando el kernel que viene en Debian preparado para Xen.</p>
<p>Una breve descripción de Xen, es que está separado en varias partes, en primer lugar Xen tiene un kernel modificado para llevar a cabo la virtualización, la ventaja es que la versión 3.3 utiliza la versión 2.6.18 que es la que viene con Debian.</p>
<p>Después la parte &#8220;fuerte&#8221; de Xen es el denominado hypervisor que es un servidor que se encarga de hacer la virtualización propiamente dicha. Después vienen las máquinas virtuales que utilizan por lo general otro kernel que se denomina domU (y el kernel de la máquina base se denomina dom0).</p>
<p>Pues bien, para lograr esto simplemente primero instalé la imagen del kernel apropiado y compilar solamente el hypervisor de Xen 3.3</p>
<p>En pasos simples:</p>
<pre name="code" class="php">
#Instalar la imagen del kernel con parche para xen
apt-get install</pre><p>&#8230;</p>]]></description>
			<content:encoded><![CDATA[<a href="http://vida.danguer.com/2008/10/26/xen-33-y-debian-etch/" title="Xen 3.3 y Debian Etch"></a><p>Recientemente me tocó configurar un servidor para tener máquinas virtuales mediante <a title="Xen - Virtualizacion" href="http://xen.org" target="_blank">XEN</a>. Anteriormente sólo había trabajado con un poco con <a title="VMWare ESXi - Virtualizacion" href="http://www.vmware.com/products/esxi/" target="_blank">VMWare ESXi</a> y <a title="XenServer - Virtualizacion" href="http://www.xenserver5.com/" target="_blank">XenServer</a> (la versión &#8220;comercial&#8221; de XEN), el problema es que se tenía que instalar en un servidor remoto que solo se tiene acceso mediante ssh.</p>
<p>Con algo de trabajo y pruebas (y con las buenas herramientas de <a title="ServerBeach - Hosting Recomendable" href="http://serverbeach.com/" target="_blank">ServerBeach</a>, que sólo le faltan una vista a la consola para diagnosticar kernel panics) por fin pude instalarlo.</p>
<p>Debian tiene una versión de Xen, pero es la 3.0.3 que para mi gusto es demasiado vieja (se liberó en 2006) y la versión <a title="Debian Lenny" href="http://www.debian.org/devel/debian-installer/" target="_blank">Lenny</a> (testing) tiene la versión 3.2, pero también algo &#8220;inestable&#8221; a mi gusto para un servidor de batalla.</p>
<p>Como dije después de hacer varias pruebas logré instalar la versión Xen 3.3 utilizando el kernel que viene en Debian preparado para Xen.</p>
<p>Una breve descripción de Xen, es que está separado en varias partes, en primer lugar Xen tiene un kernel modificado para llevar a cabo la virtualización, la ventaja es que la versión 3.3 utiliza la versión 2.6.18 que es la que viene con Debian.</p>
<p>Después la parte &#8220;fuerte&#8221; de Xen es el denominado hypervisor que es un servidor que se encarga de hacer la virtualización propiamente dicha. Después vienen las máquinas virtuales que utilizan por lo general otro kernel que se denomina domU (y el kernel de la máquina base se denomina dom0).</p>
<p>Pues bien, para lograr esto simplemente primero instalé la imagen del kernel apropiado y compilar solamente el hypervisor de Xen 3.3</p>
<p>En pasos simples:</p>
<pre name="code" class="php">
#Instalar la imagen del kernel con parche para xen
apt-get install linux-image-2.6.18-6-xen-amd64

#Descargar el código fuente de xen
wget http://bits.xensource.com/oss-xen/release/3.3.0/xen-3.3.0.tar.gz
tar zxvf xen-3.3.0.tar.gz
cd xen-3.3.0

#Compilar solamente el hypervisor
make xen
﻿make install-xen

#Compilar los archivos ejecutables como xm y herramientas de red
make tools
make install-tools

#Hacer que Debian cree las entradas correspondientes en los rc.X
#para que cuando el servidor se inicie ejecute los servidores de Xen
update-rc.d xend defaults 20 21
update-rc.d xendomains defaults 21 20

#Hacer que grub reconozca el nuevo kernel con la configuración de Xen 3.3.0
update-grub
</pre>
<p>Con eso deberían de ver una entrada en el grub como:</p>
<pre name="code" class="php">
title           Xen 3.3.0 / Debian GNU/Linux, kernel 2.6.18-6-xen-amd64
root            (hd0,0)
kernel          /xen-3.3.0.gz
module          /vmlinuz-2.6.18-6-xen-amd64 root=/dev/sda6 ro console=tty0
module          /initrd.img-2.6.18-6-xen-amd64
savedefault
</pre>
<p>Que debería de bootear con el hypervisor 3.3</p>
<p>Incluyo algunas ligas de sitios (en inglés) que me ayudaron muchísimo para entender algo más de Xen <img src='http://vida.danguer.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<ul>
<li><a href="http://www.howtoforge.com/debian_etch_xen_3.1_p5">http://www.howtoforge.com/debian_etch_xen_3.1_p5</a> (muy buen documento)</li>
<li><a href="http://27smiles.com/2008/08/08/setting-up-xen-on-debian-etch-64bit/">http://27smiles.com/2008/08/08/setting-up-xen-on-debian-etch-64bit/</a> (para instalar Xen con las versiones estables de Debian)</li>
<li><a href="http://www.nabble.com/Xen-3.3-install-from-source-on-centos-5.2-td19761354.html">http://www.nabble.com/Xen-3.3-install-from-source-on-centos-5.2-td19761354.html</a> (Otra versión de como compilar Xen, incluye copiar la configuración actual, en el ejemplo de CentOS pero puede ser de Debian, algo que no solucionó mi problema, pero es buena idea)</li>
<li><a href="http://xen-tools.org/software/xen-tools/releases.html">http://xen-tools.org/software/xen-tools/releases.html</a> (Herramientas de ayuda para Xen, descárguenla, ya que la versión estable de Debian es vieja y no necesita muchas cosas, si les pide algo chequen la primera liga)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://vida.danguer.com/2008/10/26/xen-33-y-debian-etch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

