<?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>Freedom Interface</title>
	<atom:link href="http://www.freedominterface.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.freedominterface.org</link>
	<description>Pensamentos livres</description>
	<lastBuildDate>Wed, 01 Sep 2010 21:00:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1-alpha</generator>
		<item>
		<title>libvirt e nested paging</title>
		<link>http://www.freedominterface.org/2010/09/01/libvirt-e-nested-paging/</link>
		<comments>http://www.freedominterface.org/2010/09/01/libvirt-e-nested-paging/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 21:00:59 +0000</pubDate>
		<dc:creator>Eduardo Ramos</dc:creator>
				<category><![CDATA[servidores]]></category>
		<category><![CDATA[virtualização]]></category>

		<guid isPermaLink="false">http://www.freedominterface.org/?p=343</guid>
		<description><![CDATA[Embora o qemu-kvm já tenha suporte à páginas aninhadas (nested pages), a última versão do libvirt-0.8.3 ainda não suporta. Apenas para esclarecer, Nested Paging é um recurso disponível apenas para processadores AMD da linha Phenom ou superior. Maiores detalhes, consulte este documento. Pesquisei por referências de como habilitar a opção &#8216;-enable-nesting&#8217; do qemu-kvm no libvirt, [...]]]></description>
			<content:encoded><![CDATA[<p>Embora o qemu-kvm já tenha suporte à páginas aninhadas (nested pages), a última versão do <strong>libvirt-0.8.3</strong> ainda não suporta.</p>
<p>Apenas para esclarecer, <strong>Nested Paging</strong> é um recurso disponível apenas para processadores <strong>AMD</strong> da linha Phenom ou superior. Maiores detalhes, consulte <a href="http://developer.amd.com/assets/NPT-WP-1%25201-final-TM.pdf" target="_blank">este</a> documento.</p>
<p>Pesquisei por referências de como habilitar a opção &#8216;-enable-nesting&#8217; do qemu-kvm no libvirt, mas não encontrei. Depois de pelo menos 2 dezenas de cliques, eis que encontro na lista de e-mails dos desenvolvedores do libvirt <a href="https://www.redhat.com/archives/libvir-list/2009-November/msg00304.html" target="_blank">referências</a> já antigas (novembro de 2009), de como usar o nesting. Pois bem, meu trabalho se resumiu em ler certinho as mensagens e montar um patch. Mesmo que a versão que estou usando (0.8.3) seja muito mais nova que esse post, testei as alterações, e que maravilha, funcionou!!!</p>
<p>Depois de compilado e instalado, só precisei acrescentar na definição do domínio dentro da tag <strong>&lt;features&gt;</strong> uma tag <strong>&lt;nesting/&gt;</strong>. Depois disso é só iniciar a VM e ver que na linha de comando da sua máquina virtual tem o -enable-nesting.</p>
<p>Agradeço demais a equipe de desenvolvimento de qemu-kvm e libvirt!</p>
<p>Abaixo segue o meu patch para libvirt-0.8.3:</p>
<pre class="brush: diff;">
diff -Naur ../libvirt-0.8.3//docs/schemas/domain.rng ./docs/schemas/domain.rng
--- ../libvirt-0.8.3//docs/schemas/domain.rng   2010-07-29 06:48:30.000000000 -0300
+++ ./docs/schemas/domain.rng   2010-09-01 16:51:57.710851479 -0300
@@ -1595,6 +1595,11 @@
               &lt;empty/&gt;
             &lt;/element&gt;
           &lt;/optional&gt;
+          &lt;optional&gt;
+           &lt;element name=&quot;nesting&quot;&gt;
+             &lt;empty/&gt;
+           &lt;/element&gt;
+         &lt;/optional&gt;
         &lt;/interleave&gt;
       &lt;/element&gt;
     &lt;/optional&gt;
diff -Naur ../libvirt-0.8.3//src/conf/domain_conf.c ./src/conf/domain_conf.c
--- ../libvirt-0.8.3//src/conf/domain_conf.c    2010-08-02 16:16:42.000000000 -0300
+++ ./src/conf/domain_conf.c    2010-09-01 16:51:57.710851479 -0300
@@ -75,7 +75,8 @@
 VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST,
               &quot;acpi&quot;,
               &quot;apic&quot;,
-              &quot;pae&quot;)
+              &quot;pae&quot;,
+             &quot;nesting&quot;)

 VIR_ENUM_IMPL(virDomainLifecycle, VIR_DOMAIN_LIFECYCLE_LAST,
               &quot;destroy&quot;,
diff -Naur ../libvirt-0.8.3//src/conf/domain_conf.h ./src/conf/domain_conf.h
--- ../libvirt-0.8.3//src/conf/domain_conf.h    2010-07-29 06:48:30.000000000 -0300
+++ ./src/conf/domain_conf.h    2010-09-01 16:51:57.710851479 -0300
@@ -649,6 +649,7 @@
     VIR_DOMAIN_FEATURE_ACPI,
     VIR_DOMAIN_FEATURE_APIC,
     VIR_DOMAIN_FEATURE_PAE,
+    VIR_DOMAIN_FEATURE_NESTING,

     VIR_DOMAIN_FEATURE_LAST
 };
diff -Naur ../libvirt-0.8.3//src/qemu/qemu_conf.c ./src/qemu/qemu_conf.c
--- ../libvirt-0.8.3//src/qemu/qemu_conf.c      2010-08-04 09:21:27.000000000 -0300
+++ ./src/qemu/qemu_conf.c      2010-09-01 16:57:47.485469640 -0300
@@ -1190,6 +1190,8 @@
         flags |= QEMUD_CMD_FLAG_MEM_PATH;
     if (strstr(help, &quot;-chardev&quot;))
         flags |= QEMUD_CMD_FLAG_CHARDEV;
+    if (strstr(help, &quot;-enable-nesting&quot;))
+        flags |= QEMUD_CMD_FLAG_NESTING;
     if (strstr(help, &quot;-balloon&quot;))
         flags |= QEMUD_CMD_FLAG_BALLOON;
     if (strstr(help, &quot;-device&quot;))
@@ -3907,6 +3909,9 @@
             goto error;
         }
     }
+    if ((qemuCmdFlags &amp; QEMUD_CMD_FLAG_NESTING) &amp;&amp;
+        (def-&gt;features &amp; (1 &lt;&lt; VIR_DOMAIN_FEATURE_NESTING)))
+        ADD_ARG_LIT(&quot;-enable-nesting&quot;);

     /*
      * NB, -nographic *MUST* come before any serial, or monitor
@@ -6265,6 +6270,8 @@
             fullscreen = 1;
         } else if (STREQ(arg, &quot;-localtime&quot;)) {
             def-&gt;clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME;
+        } else if (STREQ(arg, &quot;-enable-nesting&quot;)) {
+            def-&gt;features |= (1 &lt;&lt; VIR_DOMAIN_FEATURE_NESTING);
         } else if (STREQ(arg, &quot;-kernel&quot;)) {
             WANT_VALUE();
             if (!(def-&gt;os.kernel = strdup(val)))
diff -Naur ../libvirt-0.8.3//src/qemu/qemu_conf.h ./src/qemu/qemu_conf.h
--- ../libvirt-0.8.3//src/qemu/qemu_conf.h      2010-07-28 11:18:15.000000000 -0300
+++ ./src/qemu/qemu_conf.h      2010-09-01 16:58:29.900876561 -0300
@@ -92,6 +92,7 @@
     QEMUD_CMD_FLAG_PCI_CONFIGFD  = (1LL &lt;&lt; 36), /* pci-assign.configfd */
     QEMUD_CMD_FLAG_NODEFCONFIG   = (1LL &lt;&lt; 37), /* -nodefconfig */
     QEMUD_CMD_FLAG_BOOT_MENU     = (1LL &lt;&lt; 38), /* -boot menu=on support */
+    QEMUD_CMD_FLAG_NESTING       = (1LL &lt;&lt; 39), /* Is the -enable-nesting flag available */
 };

 /* Main driver state */
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.freedominterface.org/2010/09/01/libvirt-e-nested-paging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grandeza invisível</title>
		<link>http://www.freedominterface.org/2010/09/01/grandeza-invisivel/</link>
		<comments>http://www.freedominterface.org/2010/09/01/grandeza-invisivel/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 12:42:21 +0000</pubDate>
		<dc:creator>Eduardo Ramos</dc:creator>
				<category><![CDATA["viagens"]]></category>
		<category><![CDATA[filosofias]]></category>

		<guid isPermaLink="false">http://www.freedominterface.org/?p=330</guid>
		<description><![CDATA[Na física, aprendemos que existem duas grandezas para medir, as escalares e as vetoriais. Explicações a parte, as escalares são aquelas na qual o valor sempre é em módulo, enquanto que as vetoriais consideram o sinal para definição do sentido. No caso, eu estou falando de uma grandeza que está presente em todos os momentos [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.freedominterface.org/wp-content/uploads/2010/09/tempo.jpg"><img class="alignleft size-full wp-image-336" title="tempo" src="http://www.freedominterface.org/wp-content/uploads/2010/09/tempo.jpg" alt="" width="147" height="160" /></a>Na física, aprendemos que existem duas grandezas para medir, as escalares e as vetoriais. Explicações a parte, as escalares são aquelas na qual o valor sempre é em módulo, enquanto que as vetoriais consideram o sinal para definição do sentido. No caso, eu estou falando de uma grandeza que está presente em todos os momentos da nossa vida e dificilmente percebemos, ou melhor, damos atenção à ela, a grandeza vetorial do tempo.</p>
<p>Noutro dia, enquanto dirigia pra casa, fiquei pensando sobre o tempo e a importância dele para nós. Sem perceber usamos a referência do tic-tac. Ao observar minha namorada dançar em uma aula de ginástica, percebi como é impressionante a sincronia entre os bailarinos. <a href="http://www.freedominterface.org/wp-content/uploads/2010/09/dance.jpg"><img class="alignright size-full wp-image-337" title="dance" src="http://www.freedominterface.org/wp-content/uploads/2010/09/dance.jpg" alt="" width="160" height="116" /></a>Na aula, o professor colocava uma música, na maioria um axé, e ia dando instruções de passos. O que me impressionou foi a rapidez com que as meninas (sim, eram todas meninas) encontravam o pulso da música e entravam em sincronia.</p>
<p><a href="http://www.freedominterface.org/wp-content/uploads/2010/09/notas.jpg"><img class="alignleft size-full wp-image-338" title="notas" src="http://www.freedominterface.org/wp-content/uploads/2010/09/notas.jpg" alt="" width="160" height="159" /></a>A mesma coisa acontece com músicos de uma sinfonia. Dezenas de músicos com cada grupo responsável por um timbre, por momentos de notas e silêncios, trabalhando em consonância na reprodução de uma música em compassos certos.</p>
<p>Na engenharia este respeito pelo relógio está presente, e um exemplo são os motores, que têm seus pistões e válvulas rigorosamente alinhados e postos para agir em sincronia com outros. No trânsito nas ruas e avenidas também vemos todos os dias um maestro, que alternando suas luzes vermelha, amarela e verde, coordena em função do tempo, o fluxo dos automóveis.</p>
<p>Isso sem olhar par a necessidade de dividir esta linha, que dizem ser infinita, em períodos cíclicos, como dias, semanas, meses, anos&#8230;</p>
<p>Seguindo essa linha, percebo que Albert Einstein estava certíssimo ao relacionar intimamente o espaço e o tempo. Além de estarmos conectados ao Universo através das distâncias escalares, nossa participação na existência não pode ser posteriormente negada nem por Deus, pois está gravada de maneira única num período em que nunca mais voltará.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freedominterface.org/2010/09/01/grandeza-invisivel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extrair fonte de imagem</title>
		<link>http://www.freedominterface.org/2010/08/16/extrair-fonte-de-imagem/</link>
		<comments>http://www.freedominterface.org/2010/08/16/extrair-fonte-de-imagem/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 16:36:04 +0000</pubDate>
		<dc:creator>Eduardo Ramos</dc:creator>
				<category><![CDATA[variedades]]></category>

		<guid isPermaLink="false">http://www.freedominterface.org/?p=324</guid>
		<description><![CDATA[Estava em procurando alguma forma de descobrir a fonte usada em uma imagem, encontrei esta ferramenta muito útil. Você simplesmente faz um upload da image; confere se ele identificou corretamente e confirma. Ele vai te mostrar o nome da fonte!]]></description>
			<content:encoded><![CDATA[<p>Estava em procurando alguma forma de descobrir a fonte usada em uma imagem, encontrei <a href="http://new.myfonts.com/WhatTheFont/" target="_blank">esta</a> ferramenta muito útil. Você simplesmente faz um upload da image; confere se ele identificou corretamente e confirma. Ele vai te mostrar o nome da fonte!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freedominterface.org/2010/08/16/extrair-fonte-de-imagem/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>VirtualBox e usb</title>
		<link>http://www.freedominterface.org/2010/08/12/virtualbox-e-usb/</link>
		<comments>http://www.freedominterface.org/2010/08/12/virtualbox-e-usb/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 15:24:22 +0000</pubDate>
		<dc:creator>Eduardo Ramos</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[utilidades]]></category>
		<category><![CDATA[virtualização]]></category>
		<category><![CDATA[dicas]]></category>

		<guid isPermaLink="false">http://www.freedominterface.org/?p=319</guid>
		<description><![CDATA[O VirtualBox tem um recurso de acesso à dispositivos USB da máquina host, mas nem sempre é fácil usá-lo. No meu caso, o host é um Slackware 13.1 Linux. O problema é de permissão e simples de se resolver. No início, quando o sistema de arquivos USB (usbfs) é montado, ele normalmente coloca tudo para [...]]]></description>
			<content:encoded><![CDATA[<p>O VirtualBox tem um recurso de acesso à dispositivos USB da máquina host, mas nem sempre é fácil usá-lo. No meu caso, o host é um Slackware 13.1 Linux. O problema é de permissão e simples de se resolver. No início, quando o sistema de arquivos USB (usbfs) é montado, ele normalmente coloca tudo para apenas o root ter controle. A mágica está em alterar isto, usando o grupo plugdev, que no Slackware é usado para dispositivos removíveis.<br />
Primeiramente seu usuário deve estar no grupo. Adicione o usuário que vai usar o VirtualBox no grupo com o seguinte comando, no meu caso, usuário eduardo:</p>
<pre class="brush: bash;">usermod -a -G plugdev eduardo</pre>
<p>Agora basta uma alteração no fstab. Acrescente a seguinte linha:</p>
<pre class="brush: plain;">usbfs            /proc/bus/usb    usbfs       devgid=83,devmode=660 0 0</pre>
<p>Isso fará com que o sistema no início monte o usbfs sendo do grupo do plugdev também, e dando permissão de leitura e escrita para seus membros.</p>
<p>Para resolver isso rapidamente sem reinicializar o sistema, use o seguinte:</p>
<pre class="brush: bash;">mount -o remount,devgid=83,devmode=660 /proc/bus/usb</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.freedominterface.org/2010/08/12/virtualbox-e-usb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dicas rápidas</title>
		<link>http://www.freedominterface.org/2010/07/28/dicas-rapidas/</link>
		<comments>http://www.freedominterface.org/2010/07/28/dicas-rapidas/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 13:37:11 +0000</pubDate>
		<dc:creator>Eduardo Ramos</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[curiosidade]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[utilidades]]></category>

		<guid isPermaLink="false">http://www.freedominterface.org/?p=301</guid>
		<description><![CDATA[Nessa ultima semana, descobri dois comandos que me foram bastante úteis. Esses são at e ionice. Abaixo segue um brief sobre ambos. At Esse comando é um agendador de tarefas. Semelhante ao cron, porém este não é cíclico. Agendar uma tarefa é fácil, basta informar ao at o arquivo que contém os comandos que serão [...]]]></description>
			<content:encoded><![CDATA[<p>Nessa ultima semana, descobri dois comandos que me foram bastante úteis. Esses são <strong>at</strong> e <strong>ionice</strong>. Abaixo segue um brief sobre ambos.</p>
<h3>At</h3>
<p>Esse comando é um agendador de tarefas. Semelhante ao <strong>cron</strong>, porém este não é cíclico. Agendar uma tarefa é fácil, basta informar ao <strong>at</strong> o arquivo que contém os comandos que serão executados e a hora e data. Talvez assim tenha ficado um pouco vago. Vou dar um exemplo. Crie um arquivo contendo o seguinte:</p>
<pre class="brush: plain;">
#/bin/sh
touch /tmp/teste-at
</pre>
<p>Assumindo que o arquivo criado seja o ~/job.txt, vamos agendar a execução desse programa:</p>
<pre class="brush: bash;">at -f ~/job.txt 3pm tomorrow</pre>
<p>Se tudo ocorrer bem, aparecerá uma mensagem semelhante à essa:</p>
<pre class="brush: bash;">job 1 at Thu Jul 29 15:00:00 2010</pre>
<p>A notação de hora e data do <strong>at</strong> é um tanto flexível. Neste exemplo, poderíamos definir como <strong>15:00 Jul 29 2010</strong>, ou então<strong>15:00 07/29/10</strong>. O resultado seria o mesmo. Para melhor detalhamento, consulte o manual do comando: <strong>man at</strong>. Para consultar os jobs que já foram agendados, use o comando primo <strong>atq</strong>, e para remover/cancelar um job, use o <strong>atrm</strong> fornecendo o id do job como primeiro argumento.</p>
<h3>ionice</h3>
<p>Assim como o comando <strong>nice</strong>, ele estabelece prioridades para os processos, mas este, se limita às operações de disco (I/O). Sua sintaxe é semelhante do seu primo <strong>nice</strong>. Dois argumentos eu enfatizo: -c e -p. O primeiro define o número da classe de prioridade e o segundo o número do PID que sofrerá a modificação.</p>
<p>As classes podem ser:</p>
<p style="padding-left: 30px;">Idle: O processo só usará o processador para I/O se nenhum outro processo estiver usando.</p>
<p style="padding-left: 30px;">Best effort: O processo concorrerá o processador em níveis de prioridade que podem ser definidas entre 0 e 7, sendo 0 (zero) a maior prioridade. Para definir esse valor, use a opção -n. Vale lembrar que qualquer que seja o nível de prioridadem ele sempre passará na frente de processos da classe Idle.</p>
<p style="padding-left: 30px;">Real-time: Esse é para processos que realmente necessitem de atenção de I/O. Assim como a classe Best effort, esse é dividido em 8 níveis de prioridades e sua definição é idêntica. Vale lembrar que qualquer processo dessa classe, mesmo que seja prioridade 7, passará na frente de processos Best effort e Idle.</p>
<p>O número das classes Idle, Best effort e Real-time são respectivamente 3, 2 e 1. 0 (zero) significa que não pertence a classe alguma. Caso queira já iniciar o processo com <strong>ionice</strong> definido, troque o argumento -p pelo comando em si, como por exemplo:</p>
<pre class="brush: bash;">ionice -c 3 cp ~/hugefile.img /tmp</pre>
<p>Ou seja, defina classe Idle para o processo que executará a cópia do arquivo hugefile.img.</p>
<p>Para maior detalhamento, consulte o manual do comando, <strong>man ioince</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freedominterface.org/2010/07/28/dicas-rapidas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>swapfile</title>
		<link>http://www.freedominterface.org/2010/07/21/swapfile/</link>
		<comments>http://www.freedominterface.org/2010/07/21/swapfile/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 01:49:32 +0000</pubDate>
		<dc:creator>Eduardo Ramos</dc:creator>
				<category><![CDATA[curiosidade]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[utilidades]]></category>

		<guid isPermaLink="false">http://www.freedominterface.org/?p=290</guid>
		<description><![CDATA[Para usuários GNU/Linux, é muito comum o termo swap, ou partição swap. Em poucas palavras, ele diz respeito à técnica de extender a memória física, que as vezes não é suficiente, para o disco rígido. No Linux, o subsistema de memória usa um mapeamento virtual da memória, que permite um programa da userspace gravar na [...]]]></description>
			<content:encoded><![CDATA[<p>Para usuários GNU/Linux, é muito comum o termo <em>swap</em>, ou <em>partição swap</em>. Em poucas palavras, ele diz respeito à técnica de extender a memória física, que as vezes não é suficiente, para o disco rígido. No Linux, o subsistema de memória usa um mapeamento virtual da memória, que permite um programa da userspace gravar na memória sem se preocupar onde está fisicamente. Mas este já é assunto para outro post.</p>
<p>Como de costume, logo na instalação de uma distribuição já particionamos o disco de uma tal maneira que uma parte fica reservada para a área de troca, que é a tradução de <em>swap</em>. Alguns usam partições primárias para isto, outros lógicas&#8230; Alguns seguem uma regra que diz que &#8220;a capacidade do <em>swap</em> deve ser o dobro da memória física&#8221;&#8230; mas no final, isso fica mesmo é a critério do administrador do sistema.</p>
<p>O problema da partição é que complica no caso de precisar aumentar seu espaço. Para isto, poderia criar outra partição e ativá-la no sistema, mas seria necessário espaço em disco não particionado.</p>
<p>Uma solução rápida para isto seria criar um arquivo de <em>swap</em>, ou <em>swapfile</em>. Para criá-lo é quase igual à uma partição, já que para o Linux, os dispositivos de block são representados como arquivos e, cá entre nós, uma partição nada mais é que um conteiner grande de dados (um arquivão!). Na prática, sua criação ficaria assim:</p>
<p>Gerar um arquivo do tamanho de 512 * 100.000 bytes (100.000 blocos de 512 bytes) contendo apenas zeros:</p>
<pre class="brush: bash;">dd if=/dev/zero of=/tmp/swapfile bs=512 count=100000</pre>
<p>Definir o arquivo criado como <em>swap</em>:</p>
<pre class="brush: bash;">mkswap /tmp/swapfile</pre>
<p>Ativar o novo arquivo no pool de <em>swap</em> do sistema com prioridade 0 (zero):</p>
<pre class="brush: bash;">swapon -p 0 /tmp/swapfile</pre>
<p>Verificar o pool <em>swap</em> do sistema:</p>
<pre class="brush: bash;">swapon -s</pre>
<p>Desativar um dispositivo/arquivo <em>swap</em> do sistema:</p>
<pre class="brush: bash;">swapoff /tmp/swapfile</pre>
<p>Quanto à performance e aplicabilidade em ambiente de produção, prefiro não opinar, mas acredito ser uma alternativa mais rápida e simples para o aumento da área de troca, <em>swap</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freedominterface.org/2010/07/21/swapfile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ssh com chave privada</title>
		<link>http://www.freedominterface.org/2010/07/14/ssh-com-chave-privada/</link>
		<comments>http://www.freedominterface.org/2010/07/14/ssh-com-chave-privada/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 15:09:26 +0000</pubDate>
		<dc:creator>Eduardo Ramos</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[servidores]]></category>
		<category><![CDATA[utilidades]]></category>

		<guid isPermaLink="false">http://www.freedominterface.org/?p=230</guid>
		<description><![CDATA[No mundo Linux o protocolo ssh é muito utilizado para administração remota e transferência segura de arquivos entre hosts, sendo na maioria servidores. Acredito que sua ampla adoção se deve à simplicidade, velocidade e segurança. Por padrão, na maioria das distribuições Linux ele usa autenticação por senha e um par de chaves públicas. Outro método [...]]]></description>
			<content:encoded><![CDATA[<p>No mundo Linux o protocolo <a href="http://pt.wikipedia.org/wiki/SSH" target="_blank">ssh</a> é muito utilizado para administração remota e transferência segura de arquivos entre hosts, sendo na maioria servidores. Acredito que sua ampla adoção se deve à simplicidade, velocidade e segurança. Por padrão, na maioria das distribuições Linux ele usa autenticação por senha e um par de chaves públicas.</p>
<p>Outro método de autenticação seria por meio de um par de chaves pública e privada. Nesse método, cada cliente possui uma chave privada que o identifica e deve ser protegida. O servidor recebe a chave pública correspondente de cada cliente para autenticar. Desta forma, não há, à princípio, necessidade de senha. Porém, o próprio certificado pode exigir uma senha para ser acessado, mas assim, ele será único para todos os servidores e não haverá tráfego de senha entre servidor e cliente. Vejamos como fazer isto:</p>
<p>No cliente, é preciso gerar as chaves com o seguinte comando:</p>
<pre class="brush: bash;">ssh-keygen</pre>
<p>Ele perguntará por uma senha. Caso queira fornecer, digite-a. Caso queira que o acesso seja direto, deixe em branco. Por padrão, ele gerará dois arquivos: ~/.ssh/id_rsa e ~/.ssh/id_rsa.pub. Respectivamente eles são a chave privada e pública em algorítmo <a href="http://pt.wikipedia.org/wiki/RSA" target="_blank">RSA</a>. Copie a chave pública para o servidor (assumindo que o IP dele é 10.0.0.8):</p>
<pre class="brush: bash;">scp ~/.ssh/id_rsa.pub 10.0.0.8:~</pre>
<p>No servidor, insira a chave pública recém recebida na lista de chaves autorizadas:</p>
<pre class="brush: bash;">cat ~/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys</pre>
<p>Feito isto, basta alterar o modo de autenticação do servidor. Acesse o arquivo de configuração /etc/ssh/sshd_config e altere, acrescente ou descomente as seguintes opções para que confira com o modelo:</p>
<pre class="brush: plain;">
# Define autenticação por chave pública RSA.
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile     .ssh/authorized_keys

# Desabilita autenticação por senha
PasswordAuthentication no
PermitEmptyPasswords no
</pre>
<p>Reinicialize o serviço do ssh. No Slackware execute <strong>/etc/rc.d/rc.sshd restart</strong>. Agora está pronto, basta testar. No cliente, pode-ser conectar usando duas sintaxes:</p>
<pre class="brush: bash;">ssh 10.0.0.8</pre>
<p>Use o exemplo acima caso o nome do arquivo e caminho da chave seja o padrão, ~/.ssh/id_rsa. Se for diferente, a seguinte sintaxe será necessária:</p>
<pre class="brush: bash;">ssh -i &lt;caminho completo para chave privada&gt; 10.0.0.8</pre>
<p>Para mais informações, o bom e velho <strong>man</strong> sempre ajuda.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freedominterface.org/2010/07/14/ssh-com-chave-privada/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Acorda Todi!</title>
		<link>http://www.freedominterface.org/2010/07/08/todi/</link>
		<comments>http://www.freedominterface.org/2010/07/08/todi/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 01:08:16 +0000</pubDate>
		<dc:creator>Eduardo Ramos</dc:creator>
				<category><![CDATA[variedades]]></category>
		<category><![CDATA[vídeos]]></category>

		<guid isPermaLink="false">http://www.freedominterface.org/?p=204</guid>
		<description><![CDATA[Outro dia vi esse vídeo no TV UOL e achei uma figurinha, especialmente porque tenho duas cachorrinhas dessa raça e são tão folgadas quanto!!! O vídeo original é encontrado aqui.]]></description>
			<content:encoded><![CDATA[<p>Outro dia vi esse vídeo no TV UOL e achei uma figurinha, especialmente porque tenho duas cachorrinhas dessa raça e são tão folgadas quanto!!!</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="457" height="368" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowscriptaccess" value="always" /><param name="allowfullscreen" value="true" /><param name="wmode" value="window" /><param name="src" value="http://storage.mais.uol.com.br/embed.swf?mediaId=5382821" /><embed type="application/x-shockwave-flash" width="457" height="368" src="http://storage.mais.uol.com.br/embed.swf?mediaId=5382821" wmode="window" allowfullscreen="true" allowscriptaccess="always"></embed></object></p>
<p>O vídeo original é encontrado <a href="http://tvuol.uol.com.br/permalink/?view/id=acorda-todi-0402983270C8C133A6/mediaId=5382821/date=2010-07-05&amp;&amp;list/type=search/q=acorda%20t%F3di/edFilter=all/sort=mostRelevance/" target="_blank">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freedominterface.org/2010/07/08/todi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>libvirt e LVM2</title>
		<link>http://www.freedominterface.org/2010/07/07/libvirt-e-lvm2/</link>
		<comments>http://www.freedominterface.org/2010/07/07/libvirt-e-lvm2/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 03:08:06 +0000</pubDate>
		<dc:creator>Eduardo Ramos</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[servidores]]></category>
		<category><![CDATA[utilidades]]></category>
		<category><![CDATA[virtualização]]></category>

		<guid isPermaLink="false">http://www.freedominterface.org/?p=208</guid>
		<description><![CDATA[Uma ótima forma de criar uma estrutura para suportar máquinas virtuais é a parceria entre libvirt e LVM2. No meu caso em específico, uso o emulador qemu-kvm para rodar minhas máquinas virtuais. A seguir, apresentarei como se cria um pool de volumes lógicos no libvirt e como converter máquinas já criadas em arquivos de imagens. [...]]]></description>
			<content:encoded><![CDATA[<p>Uma ótima forma de criar uma estrutura para suportar máquinas virtuais é a parceria entre libvirt e LVM2. No meu caso em específico, uso o emulador qemu-kvm para rodar minhas máquinas virtuais. A seguir, apresentarei como se cria um pool de volumes lógicos no libvirt e como converter máquinas já criadas em arquivos de imagens.</p>
<p>Antes de tudo, é necessário que já tenha sido criado um grupo virtual. Como isso não está no escopo do post, recomendo navegar por <a href="http://www.tldp.org/HOWTO/LVM-HOWTO/commontask.html" target="_blank">esse howto</a>. Com o grupo criado e ativado, vamos criar a definição do pool para o libvirt. Abra um editor de texto, como o vim, e coloque nele o seguinte texto:</p>
<pre class="brush: xml;">
&lt;pool type='logical'&gt;
&lt;name&gt;logical&lt;/name&gt;
&lt;source&gt;
&lt;device path='/dev/sdb1'/&gt;
&lt;name&gt;logical&lt;/name&gt;
&lt;format type='lvm2'/&gt;
&lt;/source&gt;
&lt;target&gt;
&lt;path&gt;/dev/logical&lt;/path&gt;
&lt;/target&gt;&lt;/pool&gt;</pre>
<p>Nesse exemplo, vamos assumir que a partição que compõe o grupo logico é o /dev/sdb1. Após, salve com um nome sugestivo, como por exemplo logical.xml. Agora só resta registrar no libvirt.</p>
<pre class="brush: bash;">virsh pool-define logical.xml</pre>
<p>Mesmo registrado, o sistema ainda não ativou o pool. É recomendado que ele seja marcado como <strong>autostart</strong>, para que caso o libvirt pare, ele ative automaticamente o pool. Para isto, basta os seguintes comandos:</p>
<pre class="brush: bash;">
virsh pool-autostart logical
virsh pool-start logical
</pre>
<p><a name="vol-create-as"></a>Com o pool inicializado, agora só resta criar um volume lógico dentro dele:</p>
<pre class="brush: bash;">virsh vol-create-as logical disco_teste 10GB</pre>
<p>Este comando criará um volume lógico de nome disco_teste no grupo logical tendo como capacidade 10GiB</p>
<h3>Convertendo arquivos de imagens em volumes lógicos</h3>
<p>Caso já tenha uma máquina virtual configurada em um arquivo de imagem nos formatos suportados pelo qemu, basta convertê-lo usando o próprio qemu-img para o formato desejado. Na versão 0.12.4 os formatos suportados são: cow, qcow, vdi, vmdk, cloop, dmg, bochs, qcow2, host_device, raw entre outros.</p>
<p>Antes de começar, é preciso criar um volume lógico com o mesmo tamanho da imagem existente. Para ter o valor correto, use a ferramenta qemu-img para saber o tamanho total da imagem:</p>
<pre class="brush: bash;">qemu-img info disco.img</pre>
<p>Ele retornará algo como:</p>
<pre class="brush: plain;">
image: disco.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 4.0G
cluster_size: 65536
</pre>
<p>Veja que, embora o arquivo tenha tamanho de 4GB, ele pode crescer até o tamanho virtual, que é de 10GB para esta imagem. Agora, crie um volume lógico com este tamanho seguindo o modelo logo <a href="#vol-create-as">acima</a>.</p>
<p>Eu conheço duas formas de levar o arquivo de imagem para um volume lógico. A primeira é usando o qemu-img para já gravar a imagem no volume:</p>
<pre class="brush: bash;">qemu-img convert -f qcow2 -O host_device disco.img /dev/logical/disco_teste</pre>
<p>Ou então, com uma etapa a mais, e portanto mais demorada, transformando a imagem do formato nativo para raw e depois transferindo os dados de forma bruta para o volume com o <strong>dd</strong>:</p>
<pre class="brush: bash;">
qemu-img convert -f qcow2 -O raw disco.img disco.raw
dd if=disco.raw of=/dev/logical/disco_teste
</pre>
<p>O resultado de ambos é o mesmo. Desde que tenha um domínio registrado com esse disco, agora é só usar o volume lógico recém criado. A definição de um disco em volume lógico segue o modelo:</p>
<pre class="brush: xml;">
&lt;devices&gt;
...
&lt;disk type='block' device='disk'&gt;
&lt;source dev='/dev/logical/disco_teste'/&gt;
&lt;target dev='sdc' bus='scsi'/&gt;
&lt;/disk&gt;
...
&lt;/devices&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.freedominterface.org/2010/07/07/libvirt-e-lvm2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LVM2 Snapshot</title>
		<link>http://www.freedominterface.org/2010/07/06/lvm2-snapshot/</link>
		<comments>http://www.freedominterface.org/2010/07/06/lvm2-snapshot/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 17:36:39 +0000</pubDate>
		<dc:creator>Eduardo Ramos</dc:creator>
				<category><![CDATA[backup]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[utilidades]]></category>
		<category><![CDATA[virtualização]]></category>
		<category><![CDATA[curiosidade]]></category>

		<guid isPermaLink="false">http://www.freedominterface.org/?p=197</guid>
		<description><![CDATA[Nessas ultimas semanas andei procurando por uma solução eficiente para backups de discos, se possível, usando imagens. Eis que conheço o recurso de snapshot do LVM2. Ele é bastante fácil de usar, mas, é lógico, você precisa de uma partição no seu disco do tipo LVM, tipo 8e. Tendo isto em mãos, basta criar um [...]]]></description>
			<content:encoded><![CDATA[<p>Nessas ultimas semanas andei procurando por uma solução eficiente para backups de discos, se possível, usando imagens. Eis que conheço o recurso de snapshot do LVM2. Ele é bastante fácil de usar, mas, é lógico, você precisa de uma partição no seu disco do tipo LVM, tipo 8e.</p>
<p>Tendo isto em mãos, basta criar um grupo de volumes lógicos do tamanho desejado na nova partição LVM. Isso pode ser feito com o seguinte comando:</p>
<pre class="brush: bash;">vgcreate logical /dev/sdb1</pre>
<p>No meu caso, eu não especifiquei o tamanho máximo do grupo, portanto ele pega todo o espaço disponível em sdb1. A grosso modo, o grupo de volumes lógicos está para um disco físico assim como os volumes lógicos estão para as partições. A diferença é que a virtualização do disco permite um ambiente mais flexível e simples.</p>
<p>Com o grupo pronto, basta adicionar os volumes. Meu disco tem 80GB, e para teste vou gerar um volume de 10GB chamado <strong>teste</strong> no grupo <strong>logical</strong>:</p>
<pre class="brush: bash;">lvcreate -L10G -n teste logical</pre>
<p>Pronto! Agora pode verificar que existe um dispositivo de bloco criado em /dev/logical/teste. Ele representa o volume lógico. Ele se comporta como um dispositivo de bloco comum, e portanto, pode ser tratado como um. Para conseguir usar, esse volume precisa ser formatado. Eu costumo usar o raiserfs, mas pode ser usado ext3, ext4, xfs&#8230;</p>
<pre class="brush: bash;">
mkreiserfs /dev/logical/teste
mount -t reiserfs /dev/logical/teste /mnt/tmp
</pre>
<p>O volume agora pode ser usado normalmente. É só acessar o ponto de montagem /mnt/tmp. Com o ambiente todo pronto, agora vamos ao que interessa, o snapshot. Assumindo que o volume está em plena produção, vamos simular uma situação de backup online, que é a aplicação mais óbvia que vejo neste recurso. Para melhor entendimento, vamos analisando os passos seguintes:</p>
<pre class="brush: bash;">lvcreate -L 500M -s -n backup /dev/logical/teste</pre>
<p>Isso fará com que seja criado um volume lógico de 500MB, de nome backup e tipo snapshot do volume já existente /dev/logical/teste. O tamanho do snapshot é claramente menor que o volume original, e isso não está errado. No momento em que o snaphot é criado, o sistema &#8216;congela&#8217; o volume original para que possamos trabalhar com ele sem que haja alterações, e o tamanho do snapshot representa o volume de alterações que ele permitirá que o sistema em produção faça nesse volume sem que seja prejudicado. A grosso modo, é como se fosse um buffer de alterações, que são armazenadas sem serem efetivadas no volume original. Para aqueles que conhecem o sistema de arquivamento e hotbackup de SGBDs, é a mesma coisa.</p>
<p>Muitos dão exemplos de backups usando snapshots montando o volume snapshot e copiando os arquivos com <strong>cp</strong>, compactando com <strong>tar</strong> e <strong>gz</strong>, mas eu normalmente crio uma imagem completa com o <strong>dd</strong>. De qualquer forma, apresentarei ambos abaixo:</p>
<h3>Tar e gz</h3>
<pre class="brush: plain;">
mount -t reiserfs /dev/logical/backup /mnt/tmp0
tar cf ~/backup.tar.gz /mnt/tmp0
</pre>
<h3>dd</h3>
<pre class="brush: plain;">
dd if=/dev/logical/backup of=~/backup.img
</pre>
<p>Depois do backup, basta remover o snapshot que as alterações serão aplicadas.</p>
<pre class="brush: bash;">lvremove -f /dev/logical/backup</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.freedominterface.org/2010/07/06/lvm2-snapshot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
