<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>O Mundo Arcano de CEFALA Admin</title><link href="https://admin.cefala.org/blog/" rel="alternate"></link><link href="https://admin.cefala.org/blog/feeds/all.atom.xml" rel="self"></link><id>https://admin.cefala.org/blog/</id><updated>2025-08-20T06:47:00-03:00</updated><entry><title>Interface cgit para os repositórios do CEFALA</title><link href="https://admin.cefala.org/blog/interface-cgit-para-os-repositorios-do-cefala.html" rel="alternate"></link><published>2025-08-20T06:47:00-03:00</published><updated>2025-08-20T06:47:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2025-08-20:/blog/interface-cgit-para-os-repositorios-do-cefala.html</id><summary type="html">&lt;p&gt;Faz tempo que eu desejava instalar uma interface web para os repositórios Git do CEFALA, que se encontram na VM &lt;code&gt;git.cefala.org&lt;/code&gt;. Dentre as &lt;a class="external" href="https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#Web_Interfaces"&gt;inúmeras interfaces disponíveis&lt;/a&gt;, acabei optando pelo &lt;a class="external" href="https://git.zx2c4.com/cgit/about/"&gt;cgit&lt;/a&gt;, que reúne as vantagens de ser leve (escrito em C), eficaz (sem PHP nem JavaScript) e de fácil …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Faz tempo que eu desejava instalar uma interface web para os repositórios Git do CEFALA, que se encontram na VM &lt;code&gt;git.cefala.org&lt;/code&gt;. Dentre as &lt;a class="external" href="https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#Web_Interfaces"&gt;inúmeras interfaces disponíveis&lt;/a&gt;, acabei optando pelo &lt;a class="external" href="https://git.zx2c4.com/cgit/about/"&gt;cgit&lt;/a&gt;, que reúne as vantagens de ser leve (escrito em C), eficaz (sem PHP nem JavaScript) e de fácil configuração, além de fornecer (quase) tudo que se espera de uma interface web para o Git.&lt;/p&gt;
&lt;p&gt;No caso do CEFALA, apenas a VM &lt;code&gt;www.cefala.org&lt;/code&gt; é accessível via HTTP e HTTPS. Neste caso, é necessário utilizar o mecanismo de &lt;a class="external" href="https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html"&gt;proxy do Apache2&lt;/a&gt; para poder acessar o servidor cgit na VM &lt;code&gt;git.cefala.org&lt;/code&gt;. O servidor HTTP/HTTPS virtual está definido na configuração do Apache da VM &lt;code&gt;www.cefala.org&lt;/code&gt; e é acessível pela URL &lt;a href="https://cgit.cefala.org"&gt;https://cgit.cefala.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Por hora, os seguintes repositórios são visíveis na interface cgit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="external" href="https://cgit.cefala.org/cgit/cefala-cgit"&gt;cefala-cgit&lt;/a&gt;: Configuração do servidor cgit (vide abaixo)&lt;/li&gt;
&lt;li&gt;&lt;a class="external" href="https://cgit.cefala.org/cgit/apt-debian-pinning/"&gt;apt-debian-pinning&lt;/a&gt;: configuração do APT pinning para as diversas distribuições da Debian, descrita num &lt;a class="internal" href="https://admin.cefala.org/blog/alfinetando-o-apt.html"&gt;artigo&lt;/a&gt; deste blog&lt;/li&gt;
&lt;li&gt;&lt;a class="external" href="https://cgit.cefala.org/cgit/git-scripts/"&gt;git-scripts&lt;/a&gt;: Scripts de ajuda para uso do Git na VM &lt;code&gt;git.cefala.org&lt;/code&gt;, descritos num &lt;a class="internal" href="https://admin.cefala.org/blog/vida-facil-com-git-scripts.html"&gt;artigo&lt;/a&gt; deste Blog&lt;/li&gt;
&lt;li&gt;&lt;a class="external" href="https://cgit.cefala.org/cgit/notmyidea-pt/"&gt;notmyidea-pt&lt;/a&gt;: Tradução do tema notmyidea do Pelican em português.  Este tema é usado neste Blog.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O servidor cgit está configurado para aceitar um arquivo de descrição &lt;code&gt;README.md&lt;/code&gt; na raiz de cada repositório (&lt;a class="external" href="https://cgit.cefala.org/cgit/apt-debian-pinning/about/"&gt;exemplo&lt;/a&gt;) e também para colorir sintaticamente os arquivos mostrados (&lt;a class="external" href="https://cgit.cefala.org/cgit/apt-debian-pinning/tree/README.md"&gt;exemplo&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;É possível também clonar os repositórios via HTTP:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone http://cgit.cefala.org/cgit/cefala-cgit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A configuração deve ser feita tanto na VM &lt;code&gt;www.cefala.org&lt;/code&gt; (servidor Apache) quanto na VM &lt;code&gt;git.cefala.org&lt;/code&gt; (servidor cgit). Ambas configurações são feitas através do projeto &lt;a class="external" href="https://cgit.cefala.org/cgit/cefala-cgit"&gt;cefala-cgit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Na VM &lt;code&gt;www.cefala.org&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone cefala-admin@git.cefala.org:cefala-cgit.git
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; cefala-cgit
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo make apache-install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Na VM &lt;code&gt;git.cefala.org&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone /var/git/cefala-cgit
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; cefala-cgit
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo make cgit-install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Modificações permanentes nos arquivos de configuração devem ser registradas (&lt;em&gt;commit&lt;/em&gt;) e subidas (&lt;em&gt;push&lt;/em&gt;) no repositório centralizado:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git add apache cgitrc cgitrepos
&lt;span class="gp"&gt;$ &lt;/span&gt;git commit -m &lt;span class="s1"&gt;&amp;#39;Modificação na configuração para [isto] ou [aquilo]&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;git push
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;P.S.: Eu nunca sei como traduzir &lt;em&gt;commit&lt;/em&gt; e &lt;em&gt;push&lt;/em&gt; em português. Algumas pessoas já tentaram fazer isto, &lt;a class="external" href="https://portuguese.stackexchange.com/questions/5919/qual-seria-a-tradu%C3%A7%C3%A3o-do-termo-commit-para-o-portugu%C3%AAs"&gt;ali&lt;/a&gt; e &lt;a class="external" href="https://portuguese.stackexchange.com/questions/1182/how-to-translate-committed-to-portuguese-in-a-technical-documentation"&gt;acolá&lt;/a&gt;.&lt;/p&gt;
&lt;!--
LocalWords:  Pelican notmyidea JavaScript Git CEFALA Scripts PHP VM push
LocalWords:  cgit Debian commit push
--&gt;</content><category term="Git"></category></entry><entry><title>Certbot is our friend</title><link href="https://admin.cefala.org/blog/certbot-is-our-friend.html" rel="alternate"></link><published>2022-07-16T20:42:00-03:00</published><updated>2022-07-16T20:42:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2022-07-16:/blog/certbot-is-our-friend.html</id><summary type="html">&lt;p&gt;Há cinco anos e meio, Leandro Leão escreveu um ótimo &lt;a class="internal" href="https://admin.cefala.org/blog/usando-o-lets-encrypt.html"&gt;artigo&lt;/a&gt; sobre a utilização do &lt;a class="external" href="https://letsencrypt.org"&gt;Let's Encrypt&lt;/a&gt; para habilitar o acesso com criptografia (HTTPS) dos servidores web do CEFALA. Naquela época, o Let's Encrypt era incipiente e não havia uma maneira totalmente automatizada de instalar os certificados.&lt;/p&gt;
&lt;p&gt;Neste meio tempo …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Há cinco anos e meio, Leandro Leão escreveu um ótimo &lt;a class="internal" href="https://admin.cefala.org/blog/usando-o-lets-encrypt.html"&gt;artigo&lt;/a&gt; sobre a utilização do &lt;a class="external" href="https://letsencrypt.org"&gt;Let's Encrypt&lt;/a&gt; para habilitar o acesso com criptografia (HTTPS) dos servidores web do CEFALA. Naquela época, o Let's Encrypt era incipiente e não havia uma maneira totalmente automatizada de instalar os certificados.&lt;/p&gt;
&lt;p&gt;Neste meio tempo, as coisas evoluíram e existe agora um programa para tanto, o &lt;a class="external" href="https://certbot.eff.org/"&gt;certbot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;No exemplo abaixo, descrevo o processo de criação de um novo site foo.cefala.org, que responderá em HTTPS. Suponhamos que, no servidor www.cefala.org tenhamos um arquivo de configuração &lt;code&gt;/etc/apache2/sites-available/foo.conf&lt;/code&gt; com o seguinte conteúdo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;VirtualHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;*:80&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;ServerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;foo.cefala.org&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;DocumentRoot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/var/www/foo&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Suponhamos também que, no diretório root deste novo site, haja um arquivo &lt;code&gt;/var/www/foo/index.html&lt;/code&gt; com o seguinte conteúdo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;FOO&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Este site pode então ser ativado no servidor Apache:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo a2ensite foo
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo systemctl reload apache2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O novo site se tornará assim acessível através da URL &lt;code&gt;http://foo.cefala.org/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Para que ele seja também acessível via HTTPS, basta fazer o seguinte:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo certbot --apache -d foo.cefala.org
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Um novo certificado Let's Encrypt será gerado para o site foo.cefala.org e os arquivos correspondentes serão colocados no diretório &lt;code&gt;/etc/letsencrypt/live/foo.cefala.org&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Como a opção &lt;code&gt;--apache&lt;/code&gt; do comando &lt;code&gt;certbot&lt;/code&gt; foi usada, o arquivo &lt;code&gt;/etc/apache2/sites-available/foo.conf&lt;/code&gt; é modificado automaticamente e terá este conteúdo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;VirtualHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;*:80&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;ServerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;foo.cefala.org&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;DocumentRoot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/var/www/foo&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;RewriteEngine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;on&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;RewriteCond&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;%{SERVER_NAME}&lt;span class="w"&gt; &lt;/span&gt;=foo.cefala.org&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;RewriteRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;^&lt;span class="w"&gt; &lt;/span&gt;https://%{SERVER_NAME}%{REQUEST_URI}&lt;span class="w"&gt; &lt;/span&gt;[END,NE,R=permanent]&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Além disto, um novo arquivo &lt;code&gt;/etc/apache2/sites-available/foo-le-ssl.conf&lt;/code&gt; será criado, com este conteúdo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;IfModule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mod_ssl.c&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;VirtualHost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;*:443&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;ServerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;foo.cefala.org&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;DocumentRoot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/var/www/foo&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;SSLCertificateFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/etc/letsencrypt/live/foo.cefala.org/fullchain.pem&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;SSLCertificateKeyFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/etc/letsencrypt/live/foo.cefala.org/privkey.pem&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/etc/letsencrypt/options-ssl-apache.conf&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/IfModule&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O novo site em HTTPS será automaticamente habilitado para o Apache. Basta então lançar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo systemctl reload apache2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;e o site &lt;code&gt;https://foo.cefala.org/&lt;/code&gt;, com criptografia SSL, estará acessível.&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>Religando as VMs</title><link href="https://admin.cefala.org/blog/religando-as-vms.html" rel="alternate"></link><published>2022-07-12T18:15:00-03:00</published><updated>2022-07-12T18:15:00-03:00</updated><author><name>Hani Yehia</name></author><id>tag:admin.cefala.org,2022-07-12:/blog/religando-as-vms.html</id><summary type="html">&lt;div id="pec-encrypted-content" style="display:none"&gt;NBA8gPoZ6J/H3OMn5b8VYg==;LrAiXir42M8Dc1h0pqPD4RPgFmjXxAQKMtv55vBLpPrz1PVe/Ci9au3OiaKks4OcLEPyHdHvRdXWqRT+ucEgTr4iMP1q7zPjM65pgDxxEDwqrL5urhLHWxvjuzBkO+5giTvXU+/7sFE7c6SWCPpFACCMtlYN+dTAIN0VGXDxdx46QIFxiheWDD1L5Dm43RosBJz2ujlqjET0Cv0HzBh3UPbX+E6R57dhr6ISabcHmVp8Qh1PGpUfKyWU8q0Nj+zFYiX8NxCXX274HRCgqzo+hrVIx2OsJWuTlLMO+wXSZPZvnU1qe8oq9m98aUWm/jefgLK0snLh8wCg3tlp+FlGQ051N3KdM/hvyPzmVQA3OzXMvn6zbfOH1RNVQi4kfmz96W8nO3XEMiT44tehuz6eAHIdpeYwM7U8TG0M92oY2+aNOriJAC1hkKSxYKq4kvkb5oHVr5eHA9ZDItUaXrwpCe8KocqCPQkHttDyH5OMrp+J7MazFxjuBsVdy1RO2ROLDXC0YZWuYk0VRHWiapsi+H0zlbZnR+3fsvTsmPAAEtWgvnsbB/+OBUhhxragazzL98SSe5RRBLbgzW4snj1dkl1B6zW5BEWG7RbUUl93kWDhHVrF5mD8NCEfhf/pMleZLu51ucADp5f0a3lxfAq9MQf2+1FQPXcyx5L8mtZyWs2WpC/RHQx/NYJ8aBYF1RtU1vFBKl+wDlBKQRbwlKfwGIW1J0aN4d2KKz/U6Z3pN3lj3HBw0s8dYnchO9OV231FCFXRiEZjjkiBLg5HFJNNyoI96fAishYzclOzmTu8RT/5mkyQ807FuTgkhJHRvifcntyCKTS9lTNhi4F3lssblxiMz05ZBXDw1+Mc6kNHWV/iWomv1+zgNnPu/gKb0qK5;^&lt;/div&gt;
&lt;div id="pec-decrypted-content"&gt;
    &lt;h4&gt;&lt;i&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;/div&gt;

&lt;form id="pec-decrypt-form"&gt;
    &lt;label for="pec-content-password"&gt;Password&lt;/label&gt;
    &lt;input type="password" id="pec-content-password" placeholder="Password" /&gt;
    &lt;button type="button" id="pec-decrypt-content"&gt;Decrypt&lt;/button&gt;
&lt;/form&gt;


&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/cipher-core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/pad-nopadding.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/md5.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes.js"&gt;&lt;/script&gt;


&lt;script type="text/javascript"&gt;
    (function () {
        var strip_padding = function (padded_content, padding_char) {
            /*
             * Strips the padding character from decrypted content.
             */
            for (var i = padded_content …&lt;/script&gt;</summary><content type="html">&lt;div id="pec-encrypted-content" style="display:none"&gt;NBA8gPoZ6J/H3OMn5b8VYg==;LrAiXir42M8Dc1h0pqPD4RPgFmjXxAQKMtv55vBLpPrz1PVe/Ci9au3OiaKks4OcLEPyHdHvRdXWqRT+ucEgTr4iMP1q7zPjM65pgDxxEDwqrL5urhLHWxvjuzBkO+5giTvXU+/7sFE7c6SWCPpFACCMtlYN+dTAIN0VGXDxdx46QIFxiheWDD1L5Dm43RosBJz2ujlqjET0Cv0HzBh3UPbX+E6R57dhr6ISabcHmVp8Qh1PGpUfKyWU8q0Nj+zFYiX8NxCXX274HRCgqzo+hrVIx2OsJWuTlLMO+wXSZPZvnU1qe8oq9m98aUWm/jefgLK0snLh8wCg3tlp+FlGQ051N3KdM/hvyPzmVQA3OzXMvn6zbfOH1RNVQi4kfmz96W8nO3XEMiT44tehuz6eAHIdpeYwM7U8TG0M92oY2+aNOriJAC1hkKSxYKq4kvkb5oHVr5eHA9ZDItUaXrwpCe8KocqCPQkHttDyH5OMrp+J7MazFxjuBsVdy1RO2ROLDXC0YZWuYk0VRHWiapsi+H0zlbZnR+3fsvTsmPAAEtWgvnsbB/+OBUhhxragazzL98SSe5RRBLbgzW4snj1dkl1B6zW5BEWG7RbUUl93kWDhHVrF5mD8NCEfhf/pMleZLu51ucADp5f0a3lxfAq9MQf2+1FQPXcyx5L8mtZyWs2WpC/RHQx/NYJ8aBYF1RtU1vFBKl+wDlBKQRbwlKfwGIW1J0aN4d2KKz/U6Z3pN3lj3HBw0s8dYnchO9OV231FCFXRiEZjjkiBLg5HFJNNyoI96fAishYzclOzmTu8RT/5mkyQ807FuTgkhJHRvifcntyCKTS9lTNhi4F3lssblxiMz05ZBXDw1+Mc6kNHWV/iWomv1+zgNnPu/gKb0qK5;^&lt;/div&gt;
&lt;div id="pec-decrypted-content"&gt;
    &lt;h4&gt;&lt;i&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;/div&gt;

&lt;form id="pec-decrypt-form"&gt;
    &lt;label for="pec-content-password"&gt;Password&lt;/label&gt;
    &lt;input type="password" id="pec-content-password" placeholder="Password" /&gt;
    &lt;button type="button" id="pec-decrypt-content"&gt;Decrypt&lt;/button&gt;
&lt;/form&gt;


&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/cipher-core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/pad-nopadding.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/md5.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes.js"&gt;&lt;/script&gt;


&lt;script type="text/javascript"&gt;
    (function () {
        var strip_padding = function (padded_content, padding_char) {
            /*
             * Strips the padding character from decrypted content.
             */
            for (var i = padded_content.length; i &gt; 0; i--) {
                if (padded_content[i - 1] !== padding_char) {
                    return padded_content.slice(0, i);
                }
            }
        };

        var decrypt_content = function (password, iv_b64, ciphertext_b64, padding_char) {
            /*
             * Decrypts the content from the ciphertext bundle.
             */
            var key = CryptoJS.MD5(password),
                iv = CryptoJS.enc.Base64.parse(iv_b64),
                ciphertext = CryptoJS.enc.Base64.parse(ciphertext_b64),
                bundle = {
                    key: key,
                    iv: iv,
                    ciphertext: ciphertext
                };

            var plaintext = CryptoJS.AES.decrypt(bundle, key, { iv: iv, padding: CryptoJS.pad.NoPadding });

            try {
                return strip_padding(plaintext.toString(CryptoJS.enc.Utf8), padding_char);
            }
            catch (err) {
                // encoding failed; wrong password
                return false;
            }
        };


        document.addEventListener('DOMContentLoaded', function () {
            var decrypt_btn = document.getElementById('pec-decrypt-content'),
                password_input = document.getElementById('pec-content-password'),
                encrypted_content = document.getElementById('pec-encrypted-content'),
                decrypted_content = document.getElementById('pec-decrypted-content'),
                decrypt_form = document.getElementById('pec-decrypt-form');

            var decrypt_document = function (event) {
                // grab the ciphertext bundle
                var parts = encrypted_content.innerHTML.split(';');

                // decrypt it
                var content = decrypt_content(
                    password_input.value,
                    parts[0],
                    parts[1],
                    parts[2]
                );

                if (content) {
                    // success; display the decrypted content
                    decrypted_content.innerHTML = content;
                    decrypt_form.parentNode.removeChild(decrypt_form);
                    encrypted_content.parentNode.removeChild(encrypted_content);

                    // any post processing on the decrypted content should be done here
                }
                else {
                    // ¯\_(ツ)_/¯
                    password_input.value = '';
                }
                event.preventDefault();
                return false;
            }
            
            decrypt_btn.addEventListener('click', decrypt_document);
            decrypt_form.addEventListener('submit', decrypt_document);
        });
    })();
&lt;/script&gt;</content><category term="S.O.S."></category></entry><entry><title>O compositor de teclado internacional</title><link href="https://admin.cefala.org/blog/o-compositor-de-teclado-internacional.html" rel="alternate"></link><published>2021-11-09T08:40:00-03:00</published><updated>2021-11-09T08:40:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2021-11-09:/blog/o-compositor-de-teclado-internacional.html</id><summary type="html">&lt;p&gt;Quando um usuário de computador utiliza o seu teclado para escrever em línguas diferentes ele se confronta sempre com o problema de introduzir caracteres especiais no seu texto. Isto vai além dos caracteres acentuados (quem nunca precisou digitar o nome daquele famoso vulcão Eyjafjallajökull, que fica em Suðurland, na Islândia …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Quando um usuário de computador utiliza o seu teclado para escrever em línguas diferentes ele se confronta sempre com o problema de introduzir caracteres especiais no seu texto. Isto vai além dos caracteres acentuados (quem nunca precisou digitar o nome daquele famoso vulcão Eyjafjallajökull, que fica em Suðurland, na Islândia?) e também diz respeito à caracteres usuais como moedas internacionais (€, £, ¥, etc), o alfabeto grego (α, β, γ, etc), ou mesmo caracteres de pontuação que não se encontram normalmente em teclados (–, «, “, etc).&lt;/p&gt;
&lt;p&gt;Usuários de X11 em Linux (isto é, qualquer usuário de ambiente de trabalhos como KDE, Gnome, ou outros) dispõem de um mecanismo para digitar facilmente estes caracteres especiais, conhecido em inglês como “&lt;a class="external" href="https://en.wikipedia.org/wiki/Compose_key"&gt;Compose key&lt;/a&gt;”, traduzido em português como &lt;a class="external" href="https://artigos.wiki/blog/en/Compose_key"&gt;tecla de composição&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A ideia é muito simples. Para obter, por exemplo, o caractere ä (a com trema), basta teclar &lt;code&gt;Compose&lt;/code&gt; seguido de &lt;code&gt;a&lt;/code&gt; e &lt;code&gt;"&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Você dirá : “Beleza, mas como eu teclo &lt;code&gt;Compose&lt;/code&gt;?” Quando a ideia de composição foi implementada, nos anos 1980, alguns teclados foram produzidos com a tecla &lt;code&gt;Compose&lt;/code&gt;, como as teclas &lt;code&gt;Alt&lt;/code&gt;, &lt;code&gt;Ctrl&lt;/code&gt; e &lt;code&gt;Shift&lt;/code&gt;, que existem em praticamente em qualquer atual.&lt;/p&gt;
&lt;p&gt;Em Linux, é possível configurar uma das teclas do teclado como sendo a tecla &lt;code&gt;Compose&lt;/code&gt;. Eu restringirei este artigo ao ambiente de trabalho Gnome.&lt;/p&gt;
&lt;p&gt;Há duas maneiras de definir a tecla &lt;code&gt;Compose&lt;/code&gt; no sistema Gnome. Se você gosta de usar o mouse, abra o painel de configurações e selecione a aba “Teclado”. Na seção “Entrada de caracteres especiais”, escolha a “Tecla de composição” que você desejar. No meu laptop, como eu uso muito pouco a tecla &lt;code&gt;Windows&lt;/code&gt; (aquela que, no meu teclado, fica ao lado da tecla &lt;code&gt;Alt&lt;/code&gt; da esquerda), eu a escolhi como a minha tecla &lt;code&gt;Compose&lt;/code&gt;. No painel de configurações do sistema Gnome, esta tecla é identificada como “Super da esquerda”.&lt;/p&gt;
&lt;p&gt;A segunda maneira de definir a tecla &lt;code&gt;Compose&lt;/code&gt; á através do comando &lt;code&gt;gsettings&lt;/code&gt;, por exemplo :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;gsettings &lt;span class="nb"&gt;set&lt;/span&gt; org.gnome.desktop.input-sources xkb-options &lt;span class="s2"&gt;&amp;quot;[&amp;#39;compose:lwin&amp;#39;]&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;No exemplo acima, &lt;code&gt;lwin&lt;/code&gt; corresponde à tecla Windows da esquerda. Com esta técnica, é possível fazer uma configuração automática, que pode ser propagada de uma conta para outra, ou de um sistema para outro.&lt;/p&gt;
&lt;p&gt;Agora que a tecla &lt;code&gt;Compose&lt;/code&gt; foi definida, basta consultar o arquivo &lt;code&gt;/usr/share/X11/locale/en_US.UTF-8/Compose&lt;/code&gt; para saber quais sequências de composição são definidas. Neste arquivo, você verá linhas como esta abaixo, que corresponde ao exemplo que eu dei acima (a com trema):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lt;Multi_key&amp;gt; &amp;lt;a&amp;gt; &amp;lt;quotedbl&amp;gt; : &amp;quot;ä&amp;quot; adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Em sistemas onde a localização é definida como sendo &lt;code&gt;pt_BR&lt;/code&gt;, algumas sequências suplementares são definidas no arquivo &lt;code&gt;/usr/share/X11/locale/pt_BR.UTF-8/Compose&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;De qualquer maneira, não é necessário decorar todas as sequências de composição, pois elas são, em geral, graficamente mnemônicas. Por exemplo, para obter o caractere polonês Ł, basta teclar &lt;code&gt;Compose&lt;/code&gt;+&lt;code&gt;L&lt;/code&gt;+&lt;code&gt;/&lt;/code&gt; ou &lt;code&gt;Compose&lt;/code&gt;+&lt;code&gt;/&lt;/code&gt;+&lt;code&gt;L&lt;/code&gt;, para obter o símbolo da moeda japonesa ¥ (yen), basta teclar &lt;code&gt;Compose&lt;/code&gt;+&lt;code&gt;y&lt;/code&gt;+&lt;code&gt;=&lt;/code&gt; ou &lt;code&gt;Compose&lt;/code&gt;+&lt;code&gt;Y&lt;/code&gt;+&lt;code&gt;=&lt;/code&gt; ou &lt;code&gt;Compose&lt;/code&gt;+&lt;code&gt;=&lt;/code&gt;+&lt;code&gt;y&lt;/code&gt; ou &lt;code&gt;Compose&lt;/code&gt;+&lt;code&gt;=&lt;/code&gt;+&lt;code&gt;Y&lt;/code&gt; (note que y maiúsculo ou minúsculo funciona neste caso), para obter o símbolo de copyright ©, basta teclar &lt;code&gt;Compose&lt;/code&gt; e qualquer combinação de &lt;code&gt;c&lt;/code&gt; e &lt;code&gt;o&lt;/code&gt; maiúsculos ou minúsculos.&lt;/p&gt;
&lt;p&gt;Por fim, é possível também definir as suas combinações próprias de sequências de composição, no arquivo &lt;code&gt;~/.XCompose&lt;/code&gt;, com a mesma sintaxe dos arquivos &lt;code&gt;/usr/share/X11/locale/*/Compose&lt;/code&gt;. Por exemplo, esta a minha maneira de definir a sequência para a letra grega α (alfa):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lt;Multi_key&amp;gt; &amp;lt;a&amp;gt; &amp;lt;space&amp;gt; : &amp;quot;α&amp;quot; U03B1 # GREEK SMALL LETTER ALPHA
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Dica"></category></entry><entry><title>Atualizando este Blog</title><link href="https://admin.cefala.org/blog/atualizando-este-blog.html" rel="alternate"></link><published>2021-04-06T08:47:00-03:00</published><updated>2021-04-06T08:47:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2021-04-06:/blog/atualizando-este-blog.html</id><summary type="html">&lt;p&gt;Fazem anos que este Blog não foi atualizado. Neste meio tempo, o &lt;a class="external" href="http://blog.getpelican.com/"&gt;Pelican&lt;/a&gt;, o motor que move este Blog, passou da versão 3 para a versão &lt;a class="external" href="https://blog.getpelican.com/pelican-4.6-released.html"&gt;4.6&lt;/a&gt;. Eu atualizei o sistema da VM &lt;code&gt;git.cefala.org&lt;/code&gt; para refletir a atualização do Pelican.&lt;/p&gt;
&lt;p&gt;Entre as novidades, está o &lt;a class="external" href="https://blog.getpelican.com/namespace-plugin-migration.html"&gt;esquema moderno …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Fazem anos que este Blog não foi atualizado. Neste meio tempo, o &lt;a class="external" href="http://blog.getpelican.com/"&gt;Pelican&lt;/a&gt;, o motor que move este Blog, passou da versão 3 para a versão &lt;a class="external" href="https://blog.getpelican.com/pelican-4.6-released.html"&gt;4.6&lt;/a&gt;. Eu atualizei o sistema da VM &lt;code&gt;git.cefala.org&lt;/code&gt; para refletir a atualização do Pelican.&lt;/p&gt;
&lt;p&gt;Entre as novidades, está o &lt;a class="external" href="https://blog.getpelican.com/namespace-plugin-migration.html"&gt;esquema moderno de plugins&lt;/a&gt; do Pelican. O presente Blog usa apenas os plugins &lt;a class="external" href="https://pypi.org/project/pelican-linkclass/"&gt;linkclass&lt;/a&gt; e &lt;a class="external" href="https://pypi.org/project/pelican-avatar/"&gt;avatar&lt;/a&gt;, que são instalados na VM &lt;code&gt;git.cefala.org&lt;/code&gt; via &lt;a class="external" href="https://pypi.org/project/pip/"&gt;pip&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As modificações que foram feitas para atualizar o Blog podem ser visualizadas com este comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git diff &lt;span class="m"&gt;9301493&lt;/span&gt;..
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Quase nada mudou do ponto de vista dos usuários (isto é, autores de artigos) deste blog. A única mudança importante é o fato de que a categoria do artigo é agora determinada pelo nome do sub-diretório onde o arquivo fonte &lt;code&gt;*.md&lt;/code&gt; se encontra. Antigamente, era necessário colocar o campo &lt;code&gt;Category:&lt;/code&gt; no cabeçalho do artigo.&lt;/p&gt;
&lt;p&gt;Eu também aproveitei para participar do &lt;a class="external" href="https://www.zdnet.com/article/github-to-replace-master-with-alternative-term-to-avoid-slavery-references/"&gt;movimento anti-racista do software livre&lt;/a&gt;, renomeando o ramo principal do repositório Git de &lt;code&gt;master&lt;/code&gt; para &lt;code&gt;main&lt;/code&gt;. Quem já tem um repositório clonado localmente, terá que fazer isto aqui:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git branch -m master main
&lt;span class="gp"&gt;$ &lt;/span&gt;git fetch origin
&lt;span class="gp"&gt;$ &lt;/span&gt;git branch -u origin/main main
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Doc"></category></entry><entry><title>Configuração Apache sob Git</title><link href="https://admin.cefala.org/blog/configuracao-apache-sob-git.html" rel="alternate"></link><published>2017-09-15T20:45:00-03:00</published><updated>2022-07-20T18:11:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2017-09-15:/blog/configuracao-apache-sob-git.html</id><summary type="html">&lt;p&gt;A configuração do servidor HTTP Apache da VM &lt;code&gt;www.cefala.org&lt;/code&gt; está agora sob controle Git. Para obter os arquivos, rode o seguinte neste servidor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone cefala-admin@git.cefala.org:cefala-apache-config
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; cefala-apache-config
&lt;span class="gp"&gt;$ &lt;/span&gt;ls -p
&lt;span class="go"&gt;Makefile  www/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O diretório &lt;code&gt;www&lt;/code&gt; corresponde ao valor retornado pelo comando &lt;code&gt;hostname&lt;/code&gt;. Este projeto …&lt;/p&gt;</summary><content type="html">&lt;p&gt;A configuração do servidor HTTP Apache da VM &lt;code&gt;www.cefala.org&lt;/code&gt; está agora sob controle Git. Para obter os arquivos, rode o seguinte neste servidor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone cefala-admin@git.cefala.org:cefala-apache-config
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; cefala-apache-config
&lt;span class="gp"&gt;$ &lt;/span&gt;ls -p
&lt;span class="go"&gt;Makefile  www/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O diretório &lt;code&gt;www&lt;/code&gt; corresponde ao valor retornado pelo comando &lt;code&gt;hostname&lt;/code&gt;. Este projeto poderá ser usado para configurar o Apache de outros servidores do CEFALA mas, pelo momento, somente a VM &lt;code&gt;www&lt;/code&gt; responde ao protocolo HTTP. Este design também assegura que os arquivos não seram instalados por erro em outras VMs.&lt;/p&gt;
&lt;p&gt;Pelo momento, somente o diretório &lt;code&gt;sites-available&lt;/code&gt; está no repositório, mas isto pode mudar no futuro:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;ls -lR www
&lt;span class="go"&gt;www:&lt;/span&gt;
&lt;span class="go"&gt;total 4&lt;/span&gt;
&lt;span class="go"&gt;drwxr-xr-x 2 rlaboiss rlaboiss 4096 Sep 15 20:50 sites-available&lt;/span&gt;

&lt;span class="go"&gt;www/sites-available:&lt;/span&gt;
&lt;span class="go"&gt;total 52&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss 1444 Sep 15 20:50 000-default.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  315 Sep 15 20:50 admin-blog.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  205 Sep 15 20:50 audio.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  166 Sep 15 20:50 blog.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  163 Sep 15 20:50 cefalaorg.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  102 Sep 15 20:50 cefalaorgRedirect.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  339 Sep 15 20:50 cefalaorg-tls.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  159 Sep 15 20:50 fonologia.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  155 Sep 15 20:50 issp2006.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  159 Sep 15 20:50 morphala.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  304 Sep 15 20:50 netscan.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  175 Sep 15 20:50 praat.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  282 Sep 15 20:50 sii.conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Eu considerei todos os sites que estão atualmente (2017-09-15) ativados através dos links existentes em &lt;code&gt;/etc/apache2/sites-enabled&lt;/code&gt;. Para adicionar um novo site, basta adicionar um novo arquivo &lt;code&gt;.conf&lt;/code&gt; e rodar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo make install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Em seguida, não se esqueça de adicionar o arquivo ao repositório e fazer o &lt;code&gt;git push&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Existe também um comando para verificar, a cores e em 2D, as diferenças entre os arquivos que estão no diretório de trabalho e aqueles que estão no diretório de configuração do Apache:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;make diff
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Isto permitirá de detetar arquivos que foram introduzidos manualmente na configuração sem passar pelo Git.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (2022-07-20):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A estrutura de diretórios do projeto Git foi modificada e corresponde agora
à estrutura no diretório &lt;code&gt;/etc&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;ls -lR www
&lt;span class="go"&gt;www:&lt;/span&gt;
&lt;span class="go"&gt;total 8&lt;/span&gt;
&lt;span class="go"&gt;drwxr-xr-x 3 rlaboiss rlaboiss 4096 Jul 19 03:28 apache2&lt;/span&gt;
&lt;span class="go"&gt;drwxr-xr-x 2 rlaboiss rlaboiss 4096 Jul 19 03:22 letsencrypt&lt;/span&gt;

&lt;span class="go"&gt;www/apache2:&lt;/span&gt;
&lt;span class="go"&gt;total 4&lt;/span&gt;
&lt;span class="go"&gt;drwxr-xr-x 2 rlaboiss rlaboiss 4096 Jul 19 12:02 sites-available&lt;/span&gt;

&lt;span class="go"&gt;www/apache2/sites-available:&lt;/span&gt;
&lt;span class="go"&gt;total 56&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss 1444 Sep 15  2017 000-default.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  461 Jul 19 12:02 admin-blog.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  555 Jul 19 03:21 admin-blog-le-ssl.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  205 Sep 15  2017 audio.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  166 Sep 15  2017 blog.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  174 Oct 16  2017 cefalaorg.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  102 Sep 15  2017 cefalaorgRedirect.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  425 Oct 16  2017 cefalaorg-tls.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  159 Sep 15  2017 fonologia.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  155 Sep 15  2017 issp2006.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  159 Sep 15  2017 morphala.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  304 Sep 15  2017 netscan.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  175 Sep 15  2017 praat.conf&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss  282 Sep 15  2017 sii.conf&lt;/span&gt;

&lt;span class="go"&gt;www/letsencrypt:&lt;/span&gt;
&lt;span class="go"&gt;total 4&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss 953 Jul 19 03:22 options-ssl-apache.conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note também, que o arquivo &lt;code&gt;www/letsencrypt/options-ssl-apache.conf&lt;/code&gt; foi adicionado ao projeto. Este arquivo é automaticamente gerado pelo &lt;code&gt;certbot&lt;/code&gt; (veja o &lt;a class="internal" href="https://admin.cefala.org/blog/usando-o-lets-encrypt.html"&gt;artigo&lt;/a&gt; deste Blog sobre isto). Neste arquivo, a opção &lt;code&gt;SSLSessionTickets off&lt;/code&gt; foi comentada, o que não é caso do arquivo original.&lt;/p&gt;
&lt;p&gt;Os módulos Apache necessários são também ativados via &lt;code&gt;make enable-modules&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A mensagem mostrada pelo comando &lt;code&gt;make diff&lt;/code&gt; também foi modificada. Na versão atual, os arquivos que estão no sistema (em &lt;code&gt;/etc/apache2/sites-available&lt;/code&gt;) e que não estão sob controle Git são listados separadamente. Além disto as diferenças entre as listas de módulos Apache listados em &lt;code&gt;Makefile&lt;/code&gt; e aqueles que estão habilitados no sistema (isto é, os arquivos em &lt;code&gt;/etc/apache2/sites-enabled/*.conf&lt;/code&gt;) também é mostrada.&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>Reinicializando o servidor via SMASH CLP</title><link href="https://admin.cefala.org/blog/reinicializando-o-servidor-via-smash-clp.html" rel="alternate"></link><published>2017-07-24T14:44:00-03:00</published><updated>2017-07-24T14:44:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2017-07-24:/blog/reinicializando-o-servidor-via-smash-clp.html</id><summary type="html">&lt;p&gt;O servidor do CEFALA desligou abruptamente no dia 23 de julho de 2017 às 16h30. Hani avisou hoje:&lt;/p&gt;
&lt;p&gt;“Para fins de registro, agora pela manhã, ao não conseguir contato com o servidor do cefala 150.164.32.8, que é uma máquina virtual, nem com 150.164.32.49, que …&lt;/p&gt;</summary><content type="html">&lt;p&gt;O servidor do CEFALA desligou abruptamente no dia 23 de julho de 2017 às 16h30. Hani avisou hoje:&lt;/p&gt;
&lt;p&gt;“Para fins de registro, agora pela manhã, ao não conseguir contato com o servidor do cefala 150.164.32.8, que é uma máquina virtual, nem com 150.164.32.49, que é o host que hospeda o servidor virtual, verifiquei que era possível contactar a 150.164.32.39 que, creio eu, seja a placa de rede inteligente do servidor físico.&lt;/p&gt;
&lt;p&gt;Acessei então a placa:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;ssh root@150.164.32.39
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;e entrei no sistema SMASH CLP por meio do qual foi possível reiniciar o servidor com os comandos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;system1&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;COMMAND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;COMPLETED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;system1&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;ufip&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;system1&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;COMMAND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;COMPLETED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;ufip&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;system1&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;started&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;successfully&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Encontrei os comandos básicos do SMASH CLP &lt;a class="external" href="http://www.cisco.com/c/en/us/td/docs/unified_computing/ucs/sw/utilities/smash/reference/guide/ucs_smash_reference/CLP_Access.html"&gt;nesta página&lt;/a&gt;.”&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>Don't go /home-less!</title><link href="https://admin.cefala.org/blog/dont-go-home-less.html" rel="alternate"></link><published>2016-11-12T18:15:00-02:00</published><updated>2016-11-12T18:15:00-02:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2016-11-12:/blog/dont-go-home-less.html</id><summary type="html">&lt;p&gt;Recentemente, o servidor &lt;code&gt;kvm&lt;/code&gt; teve de ser reinicializado de maneira brutal e as VMs que são nele abrigadas não foram enviadas em hibernação, como deveriam ter sido. Uuando &lt;code&gt;kvm&lt;/code&gt; retorna à vida, algumas das VMs que estão em seu bojo não são inicializadas corretamente. Isto acontece porque a partição &lt;code&gt;/home …&lt;/code&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Recentemente, o servidor &lt;code&gt;kvm&lt;/code&gt; teve de ser reinicializado de maneira brutal e as VMs que são nele abrigadas não foram enviadas em hibernação, como deveriam ter sido. Uuando &lt;code&gt;kvm&lt;/code&gt; retorna à vida, algumas das VMs que estão em seu bojo não são inicializadas corretamente. Isto acontece porque a partição &lt;code&gt;/home&lt;/code&gt;, disponibilizada pela VM &lt;code&gt;nfs&lt;/code&gt; ainda não está disponível via NFS quando as outras VMs &lt;code&gt;git&lt;/code&gt;, a &lt;code&gt;dev&lt;/code&gt; e a &lt;code&gt;sci&lt;/code&gt; tentam montá-la.&lt;/p&gt;
&lt;p&gt;Este problema poderia ser corrigido com um script de hook no servidor &lt;code&gt;kvm&lt;/code&gt; colocado em &lt;code&gt;/etc/libvirt/hooks/qemu&lt;/code&gt;. Este script é chamado várias vezes durante a inicialização de cada VM. Por exemplo, ele é chamado quando libvirt terminou de fazer o labeling de todos os recursos mas ainda não inicializou a VM hospedada, desta forma:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/etc/libvirt/hooks/qemu guest_name start begin -
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Neste caso, bastaria colocar no script de hook o seguinte código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; start -a &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; !&lt;span class="o"&gt;=&lt;/span&gt; CEFALA-NFS &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    sleep &lt;span class="m"&gt;60&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Entretanto, como o Arlindo bem lembrou, existem dezenas de opções para Ligar e Desligar as VMs e seria um tanto crítico intervir com hooks em algo tão simples, que pode afetar o desligamento correto das VMs (caso esse sleep seja executa muitas vezes durante a hibernação a VM corre o risco de ultrapassar o timeout e ser encerrada abruptamente).&lt;/p&gt;
&lt;p&gt;Resolvemos, então, adotar um outro método, baseado no script cron &lt;code&gt;/etc/cron.hourly/mount-home&lt;/code&gt; contendo o seguinte código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
grep -q &lt;span class="s1"&gt;&amp;#39;172.16.10.1:/home&amp;#39;&lt;/span&gt; /etc/mtab &lt;span class="o"&gt;||&lt;/span&gt; mount -a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Este script foi integrado no repositório Git &lt;code&gt;cefala-vm-conf&lt;/code&gt; (descrito em um outro &lt;a class="internal" href="https://admin.cefala.org/blog/criando-e-configurando-novas-vms-do-cefala.html"&gt;artigo&lt;/a&gt; deste blog). Para instalá-lo em cada VM, basta fazer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone cefala-admin@git.cefala.org:cefala-vm-conf.git
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; cefala-vm-conf
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo make cron
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;P.S.: O título deste post não tem nada a ver com os &lt;a class="external" href="http://www.deezer.com/album/7677279"&gt;Shoulders&lt;/a&gt; e a sua canção!&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>Nobreak novo, saudades do antigo</title><link href="https://admin.cefala.org/blog/nobreak-novo-saudades-do-antigo.html" rel="alternate"></link><published>2016-10-09T23:10:00-03:00</published><updated>2016-10-09T23:10:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2016-10-09:/blog/nobreak-novo-saudades-do-antigo.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Hani avisou na nossa lista de difusão cefala-admin:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;“Para os que não estão informados, há algumas semanas, o nobreak APC Back UPS RS 1500 estava apitando (emitindo sons de alarme) e, depois de algumas horas, decidimos substituí-lo pelo nobreak APC Back UPS BR1200, mais novo, que estava na minha sala …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Hani avisou na nossa lista de difusão cefala-admin:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;“Para os que não estão informados, há algumas semanas, o nobreak APC Back UPS RS 1500 estava apitando (emitindo sons de alarme) e, depois de algumas horas, decidimos substituí-lo pelo nobreak APC Back UPS BR1200, mais novo, que estava na minha sala.&lt;/p&gt;
&lt;p&gt;A interface do nobreak antigo era por meio de um conector RJ45, enquanto que a do novo é por meio de uma porta USB. Ontem, Arlindo alterou a configuração do &lt;a class="external" href="http://150.164.32.49/mrtg/"&gt;sistema de monitoramento de carga do nobreak&lt;/a&gt; para ler os dados na nova interface.&lt;/p&gt;
&lt;p&gt;Ao fazer isto, foi necessário desligar o servidor uma vez desligando as máquinas virtuais ao invés de hiberná-las. Desculpem se isto tiver causado a interrupção de algum processo em execução :-(&lt;/p&gt;
&lt;p&gt;Durante o processo, descobrimos que o nobreak antigo tinha uma autonomia de aproximadamente 40 minutos, a qual é algo em torno do dobro da autonomia do nobreak atual, que é de aproximadamente 20 minutos. (Vejam a curva abaixo. Nosso servidor consome em torno de 200 watts.)&lt;/p&gt;
&lt;p&gt;&lt;img alt="autonomia" src="https://admin.cefala.org/blog/images/GraphData.cfm.png"&gt;&lt;/p&gt;
&lt;p&gt;Entretanto, fiquei sem entender o por quê de uma diferença tão grande. O nobreak antigo possui duas baterias de 12 V e 9 Ah, enquanto que o novo possui duas baterias de 12 V e 7 Ah.&lt;/p&gt;
&lt;p&gt;As baterias de 12 V e 7 Ah em série (i.e. 24 V) deveriam ser capazes de fornecer uma potência de 200 watts por 50 min (7/(200/24)×60) com uma eficiência de 100%. Se o nobreak está aguentando apenas algo em torno de 20 minutos, a eficiência seria de apenas 40%. (Não estou considerando uma possível condição ruim das baterias, pois o valor foi calculado com base na curva do fabricante em anexo e não nos testes que eu e Arlindo fizemos ontem.)&lt;/p&gt;
&lt;p&gt;No caso do nobreak antigo, as baterias de 12 V e 9 Ah em série (i.e. 24 V) deveriam ser capazes de fornecer uma potência de 200 watts por 65 min (9/(200/24)×60) com uma eficiência de 100%. Se o nobreak estava aguentando apenas algo em torno de 40 minutos, a eficiência era de 62%, o que não é alto, mas é bem melhor que o obtido com o nobreak novo.”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Arlindo completou:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;“Eu utilizei uma calculadora para estimar o consumo de energia em função dos componentes do nosso servidor. Cheguei ao seguinte &lt;a class="external" href="http://outervision.com/b/gCoh0M"&gt;resultado&lt;/a&gt;:”&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;            Motherboard: Server
                 Socket: Socket LGA 1366 CPU: 1 x Intel Xeon E5620
              CPU Speed: 2400 MHz CPU Vcore: 1.2 V CPU Utilization: 50%

                 Memory: 6 x 8GB DDR3 Module

       Video Card Set 1: 1 x NVIDIA GeForce GTX 560
             Core Clock: 810 MHz
           Memory Clock: 1000 MHz

                Storage: 5 x SATA 7.2K RPM

          Optical Drive: 1 x DVD-RW/DVD+RW Drive

               Keyboard: 1 x Standard Keyboard
                  Mouse: 1 x Standard Mouse

                    Fan: 1 x 120mm

   Computer Utilization: Always On (24/7)

           Load Wattage: 396 W               -------------------------
 Recommended UPS rating: 750 VA              | +3.3V |   +5V |  +12V |
Recommended PSU Wattage: 446 W               --------+-------+--------
                                             | 9.4A  | 18.1A | 27.0A |
                                             --------+-------+--------
                                             |     122W      |  325W |
                                             -------------------------
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Servidores"></category></entry><entry><title>Informações Estatísticas CEFALA KVM</title><link href="https://admin.cefala.org/blog/informacoes-estatisticas-cefala-kvm.html" rel="alternate"></link><published>2016-06-16T12:40:00-03:00</published><updated>2016-06-16T12:40:00-03:00</updated><author><name>Arlindo Follador Neto</name></author><id>tag:admin.cefala.org,2016-06-16:/blog/informacoes-estatisticas-cefala-kvm.html</id><summary type="html">&lt;p&gt;Após utilizar o &lt;strong&gt;MRTG&lt;/strong&gt; na criação de um gráfico estatístico para monitorar a tensão de entrada do nobreak, visto que este estava chaveando ininterruptamente em alguns momentos, o trabalho realizado para um gráfico foi aproveitado para criar diversos outros relacionados ao Servidor CEFALA KVM. Estes gráficos são úteis para acompanhar …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Após utilizar o &lt;strong&gt;MRTG&lt;/strong&gt; na criação de um gráfico estatístico para monitorar a tensão de entrada do nobreak, visto que este estava chaveando ininterruptamente em alguns momentos, o trabalho realizado para um gráfico foi aproveitado para criar diversos outros relacionados ao Servidor CEFALA KVM. Estes gráficos são úteis para acompanhar dados de CPU, Memória, Discos, Ocupação, Processos, Rede de Comunicação, entre outros como exemplificado abaixo:&lt;/p&gt;
&lt;p&gt;&lt;img alt="placeholder" src="http://150.164.32.49/mrtg/apcups-day.png" title="Tensão do Nobreak do Servidor"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="placeholder" src="http://150.164.32.49/mrtg/cpu.user-day.png" title="Ocupação da CPU"&gt;&lt;/p&gt;
&lt;p&gt;Os demais gráficos, atualizados a cada cinco minutos, podem ser acessados através do endereço: &lt;a href="http://150.164.32.49/mrtg"&gt;http://150.164.32.49/mrtg&lt;/a&gt;.&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>Do the fscking thing</title><link href="https://admin.cefala.org/blog/do-the-fscking-thing.html" rel="alternate"></link><published>2016-05-28T10:12:00-03:00</published><updated>2016-06-25T14:54:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2016-05-28:/blog/do-the-fscking-thing.html</id><summary type="html">&lt;p&gt;No dia 22 de maio de 2016, a energia elétrica foi desligada na parte da manhã na Engenharia da UFMG para que a subestação fotovoltaica instalada seja ligada. O sistema do servidor kvm.cefala.org foi desligado graciosamente, de acordo com o arquivo &lt;code&gt;syslog&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;No dia 22 de maio de 2016, a energia elétrica foi desligada na parte da manhã na Engenharia da UFMG para que a subestação fotovoltaica instalada seja ligada. O sistema do servidor kvm.cefala.org foi desligado graciosamente, de acordo com o arquivo &lt;code&gt;syslog&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apcupsd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1168&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Initiating&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;shutdown&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apcupsd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1168&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;logins&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prohibited&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24851&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24851&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24851&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Basic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24851&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Basic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24851&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24851&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24851&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Timers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24851&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Timers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24851&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sockets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24851&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sockets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24851&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Starting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Shutdown&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24851&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Reached&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Shutdown&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24851&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Starting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24851&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Received&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SIGRTMIN&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;27192&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kill&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;smartd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1127&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;smartd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;received&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;signal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Terminated&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rsyslogd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;software&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rsyslogd&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;swVersion&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;8.4.2&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1197&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://www.rsyslog.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;exiting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;signal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;15.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O nobreak do servidor aguentou 40 minutos e o sistema de detecção de baixa autonomia das baterias funcionou a contento:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;May 22 07:55:56 CEFALA apcupsd[1168]: Running on UPS batteries.
[…]
May 22 08:35:39 CEFALA apcupsd[1168]: Battery charge below low limit.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Entretanto, quando a energia elétrica foi restabelecida, o servidor não voltou ao ar. O processo de boot foi interrompido, devido a problemas no sistema de arquivos que já existiam antes do nobreak entrar em ação:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;May 22 08:35:37 CEFALA kernel: [2818552.456483] EXT4-fs error (device md3): ext4_read_dirblock:902: inode #103025245: block 32: com\ m find:Directory hole found
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Para evitar que o servidor fique fora do ar em situações como esta no futuro, eu fiz as modificações abaixo, de modo a forçar a verificação do sistema de arquivos, via &lt;code&gt;fsck&lt;/code&gt;, no momento do boot (inspiradas em uma &lt;a class="external" href="http://unix.stackexchange.com/questions/123963/how-to-force-fsck-at-every-boot-all-relevant-filesystems"&gt;questão&lt;/a&gt; do StackExchange):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Criação do arquivo vazio &lt;code&gt;/forcefsck&lt;/code&gt;, na raiz do sistema de arquivos. A presença deste arquivo é detectada pelo script de inicialização do sistema &lt;code&gt;/etc/init.d/checkfs.sh&lt;/code&gt;. Entretanto, em sua execução, este script apaga o arquivo &lt;code&gt;/forcefsck&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Para a coisa ficar perene, o arquivo &lt;code&gt;/etc/default/grub&lt;/code&gt; deve ser modificado com a adição de &lt;code&gt;"forcefsck"&lt;/code&gt; na variável &lt;code&gt;GRUB_CMDLINE_LINUX&lt;/code&gt;.  O script &lt;code&gt;/etc/init.d/checkfs.sh&lt;/code&gt; detecta a presença da opção &lt;code&gt;forcefsck&lt;/code&gt; em &lt;code&gt;/proc/cmdline&lt;/code&gt;.  Existe também a opção do kernel &lt;code&gt;fsck.mode=force&lt;/code&gt;, mas eu não encontrei documentação sobre ela para sistemas Debian.&lt;/li&gt;
&lt;li&gt;Enfim, para que o &lt;code&gt;fsck&lt;/code&gt; seja executado sem intervenção humana, adicionei a linha &lt;code&gt;FSCKFIX=yes&lt;/code&gt; no arquivo &lt;code&gt;/etc/default/rcS&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Como não é possível, e nem desejável, fazer o teste desta nova configuração, teremos que esperar pelo próximo apagão e que ele ocorra num momento em que o sistema de arquivos contenha erros.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; A natureza nos deu uma mão e fez com que o teste acima pudesse ser realizado. No dia 21 de junho de 2016, houve falta de energia elétrica no CEFALA. O nobreak aguentou em torno de 40 minutos e o shutdown e o reboot foram realizados como esperado. Além disto, a partição /dev/md3 continha erros, que foram corrigidos convenientemente pelo fsck. Estas são as linhas relevantes do arquivo syslog:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apcupsd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1133&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Battery&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;charge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;below&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;low&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apcupsd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1133&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Initiating&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;shutdown&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apcupsd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1133&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;logins&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prohibited&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;smartd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1112&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;smartd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;received&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;signal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Terminated&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rsyslogd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;software&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rsyslogd&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;swVersion&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;8.4.2&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1406&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://www.rsyslog.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;exiting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;signal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;15.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rsyslogd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;software&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rsyslogd&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;swVersion&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;8.4.2&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1399&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://www.rsyslog.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hdparm&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;282&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Setting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;disc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;keyboard&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;283&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Setting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;preliminary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mf"&gt;0.000000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Initializing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cgroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;subsys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cpuset&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mdadm&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;raid&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;280&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Generating&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;udev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;arrays&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mf"&gt;0.000000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Initializing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cgroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;subsys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mf"&gt;0.000000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Initializing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cgroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;subsys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cpuacct&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mf"&gt;0.000000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Linux&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;3.16&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;amd64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debian&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debian&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.8&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Debian&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.8&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;#1 SMP Debian 3.16.7-ckt11-1+deb8u3 (2015-08-04)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mf"&gt;0.000000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BOOT_IMAGE&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;vmlinuz&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.16&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;amd64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;cfbd920&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;a21&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;bcd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;9e07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;b7337f6ea74&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quiet&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mf"&gt;0.000000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e820&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BIOS&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;provided&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;physical&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RAM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fsck&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;487&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;md3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;recovering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;journal&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mf"&gt;0.000000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BIOS&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e820&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0000000000000000&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x000000000009a3ff&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;usable&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mf"&gt;0.000000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BIOS&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e820&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x000000000009a400&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x000000000009ffff&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reserved&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mf"&gt;0.000000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BIOS&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e820&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x00000000000e0000&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x00000000000fffff&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reserved&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mf"&gt;0.000000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BIOS&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e820&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0000000000100000&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x000000008c11afff&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;usable&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mf"&gt;0.000000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BIOS&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e820&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x000000008c11b000&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x000000008c1fafff&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ACPI&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NVS&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CEFALA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mf"&gt;0.000000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BIOS&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e820&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x000000008c1fb000&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x000000008c4e7fff&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ACPI&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O MRTG implementado pelo Arlindo e explicado num outro &lt;a class="internal" href="https://admin.cefala.org/blog/blogar-e-viver.html"&gt;artigo&lt;/a&gt;, mostra como a carga da bateria evoluiu durante o apagão:&lt;/p&gt;
&lt;p&gt;&lt;img alt="% de carga - apagão 2016-06-21" src="https://admin.cefala.org/blog/images/apcupsbat-day-2016-06-21.png"&gt;&lt;/p&gt;
&lt;p&gt;[N.B.: Segundo Arlindo, a existência das faixas brancas de menor espessura ao longo do gráfico não é algo que está relacionado à saúde do nobreak, mas ao script de coleta de dados via USB.]&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>As VMs não morrem, só hibernam</title><link href="https://admin.cefala.org/blog/as-vms-nao-morrem-so-hibernam.html" rel="alternate"></link><published>2016-03-23T07:55:00-03:00</published><updated>2016-03-23T07:55:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2016-03-23:/blog/as-vms-nao-morrem-so-hibernam.html</id><summary type="html">&lt;p&gt;Arlindo manda avisar que as VMs do CEFALA são resilientes aos apagões brasileiros:&lt;/p&gt;
&lt;p&gt;From: Arlindo F. Neto&lt;br&gt;
Subject: Estado do Nobreak do CEFALA&lt;br&gt;
Date: Tue, 22 Mar 2016 14:42:22 -0300&lt;br&gt;
To: cefala-admin&lt;/p&gt;
&lt;p&gt;Pessoal,&lt;/p&gt;
&lt;p&gt;Compartilhando uma informação interessante. Notei uma diferença considerável de uptime entre as VMs (67 dias …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Arlindo manda avisar que as VMs do CEFALA são resilientes aos apagões brasileiros:&lt;/p&gt;
&lt;p&gt;From: Arlindo F. Neto&lt;br&gt;
Subject: Estado do Nobreak do CEFALA&lt;br&gt;
Date: Tue, 22 Mar 2016 14:42:22 -0300&lt;br&gt;
To: cefala-admin&lt;/p&gt;
&lt;p&gt;Pessoal,&lt;/p&gt;
&lt;p&gt;Compartilhando uma informação interessante. Notei uma diferença considerável de uptime entre as VMs (67 dias para a SCI) e o Servidor do CEFALA (12 dias). A diferença é sinal de que a metodologia de hibernar as VMs está funcionando, bem como a detecção de falta de eletricidade e shutdown do hospedeiro, como pode ser visto no log abaixo:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2016-03-10 08:15:29 -0300 Power failure.&lt;/strong&gt;&lt;br&gt;
2016-03-10 08:15:35 -0300 Running on UPS batteries.&lt;br&gt;
&lt;strong&gt;2016-03-10 08:58:08 -0300 Battery charge below low limit.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2016-03-10 08:58:08 -0300 Initiating system shutdown!&lt;/strong&gt;&lt;br&gt;
2016-03-10 08:58:08 -0300 User logins prohibited&lt;br&gt;
2016-03-10 08:58:08 -0300 apcupsd exiting, signal 15&lt;br&gt;
&lt;strong&gt;2016-03-10 08:58:08 -0300 apcupsd shutdown succeeded&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>Automatizemos a renovação de certificados Let's Encrypt para acalmar o meu TOC</title><link href="https://admin.cefala.org/blog/automatizemos-a-renovacao-de-certificados-lets-encrypt-para-acalmar-o-meu-toc.html" rel="alternate"></link><published>2016-02-26T18:00:00-03:00</published><updated>2018-03-24T15:32:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2016-02-26:/blog/automatizemos-a-renovacao-de-certificados-lets-encrypt-para-acalmar-o-meu-toc.html</id><summary type="html">&lt;p&gt;Vocês já devem ter percebido que eu tenho um &lt;a class="external" href="https://pt.wikipedia.org/wiki/Transtorno_obsessivo-compulsivo"&gt;TOC&lt;/a&gt; e que este TOC é relacionado com a reprodutibilidade das configurações. Sempre que eu configuro algo no sistema, eu penso: "E se eu precisar de fazer isto de novo amanhã, será que eu vou me lembrar de todos os passos …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Vocês já devem ter percebido que eu tenho um &lt;a class="external" href="https://pt.wikipedia.org/wiki/Transtorno_obsessivo-compulsivo"&gt;TOC&lt;/a&gt; e que este TOC é relacionado com a reprodutibilidade das configurações. Sempre que eu configuro algo no sistema, eu penso: "E se eu precisar de fazer isto de novo amanhã, será que eu vou me lembrar de todos os passos?". Pelo visto, não é só TOC não, tem também um pouco de Mal de Alzheimer precoce por aí. Ah, e eu já contei para vocês que eu tenho um TOC?&lt;/p&gt;
&lt;p&gt;Bom, vamos ao que interessa. Há alguns meses, o Leandro Leão instalou o certificado da Let's Encrypt na VM www.cefala.org, tudo muito bem explicado em outro &lt;a class="internal" href="https://admin.cefala.org/blog/usando-o-lets-encrypt.html"&gt;artigo&lt;/a&gt; deste blog. Como este certificado expira de três em três meses, o Leandro criou um script de renovação automática e adicionou uma linha na crontab do usuário root. Aí, me bateu aquele TOC e eu decidi automatizar o processo usando Git, make e &lt;a class="external" href="https://wiki.freedesktop.org/www/Software/systemd/"&gt;systemd&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Antes de mais nada, deixe-me justificar a mudança do crontab para o systemd. Apesar de &lt;a class="external" href="https://en.wikipedia.org/wiki/Systemd#History_and_controversy"&gt;não ter ainda aprovação unânime&lt;/a&gt; na comunidade de software livre, o systemd já se tornou o substituto por default do &lt;a class="external" href="https://en.wikipedia.org/wiki/Init#SYSV"&gt;sysvinit&lt;/a&gt; nas principais distribuições GNU/Linux (Debian, Fedora, Arch, CoreOS, etc.). Mais especificamente com relação ao assunto do presente artigo, o systemd permite um controle mais fino de tarefas periódicas do que o crontab, além de integrar automaticamente o log das tarefas. Tem gente por aí que já explicou direitinho como &lt;a class="external" href="https://blog.higgsboson.tk/2013/06/09/use-systemd-as-a-cron-replacement/"&gt;migrar do crontab ao systemd&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pois bem, eu criei assim um repositório Git para esta configuração específica do Let's Encrypt na VM www.cefala.org. Basta então fazer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone cefala-admin@git.cefala.org:/var/git/cefala-admin/letsencrypt-www
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; letsencrypt-www
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo make
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Com estes comandos, o script &lt;code&gt;.sh&lt;/code&gt; de renovação automática é instalado em &lt;code&gt;/usr/local/sbin&lt;/code&gt; e os arquivos &lt;code&gt;.service&lt;/code&gt; e &lt;code&gt;.timer&lt;/code&gt; são instalados e inicializados para o systemd. O script de renovação escrito pelo Leandro usa o comando &lt;code&gt;renew&lt;/code&gt; do programa &lt;code&gt;letsencrypt&lt;/code&gt;. Um novo certificado TLS só é obtido se o certificado corrente for vencer em menos de 30 dias. Graças ao timer do systemd, este script rodará todos os dias de madrugada na VM www.cefala.org.&lt;/p&gt;
&lt;p&gt;Uma das coisas legais no systemd é que não é preciso se preocupar com o arquivo de log, pois fica tudo registrado automaticamente no &lt;code&gt;/var/log/syslog&lt;/code&gt;, o que pode ser consultado com &lt;code&gt;journalctl&lt;/code&gt; ou com o seguinte comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo systemctl status letsencrypt-renew-tls-certs.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ufa, consegui acalmar o meu TOC!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; No fim das contas, me toquei que o sisteminha que escrevi é genérico o suficiente para ser útil a outras pessoas. &lt;a class="external" href="https://github.com/rlaboiss/letsencrypt-systemd.git"&gt;Coloquei-o&lt;/a&gt; então no GitHub. Você pode cloná-lo desta maneira:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone https://github.com/rlaboiss/letsencrypt-systemd.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Servidores"></category></entry><entry><title>Usando o Let's Encrypt</title><link href="https://admin.cefala.org/blog/usando-o-lets-encrypt.html" rel="alternate"></link><published>2015-12-10T09:16:00-02:00</published><updated>2022-07-16T20:42:00-03:00</updated><author><name>Leandro Leão</name></author><id>tag:admin.cefala.org,2015-12-10:/blog/usando-o-lets-encrypt.html</id><summary type="html">&lt;h2&gt;Sobre o Let's Encrypt&lt;/h2&gt;
&lt;p&gt;O projeto &lt;a class="external" href="https://letsencrypt.org"&gt;Let's Encrypt&lt;/a&gt; entrou na fase beta pública na semana passada, começando a oferecer certificados TLS/SSL válidos a qualquer site interessado.&lt;/p&gt;
&lt;p&gt;O objetivo do projeto é oferecer, gratuitamente, uma maneira simples e automatizada para administradores ativarem e manterem o protocolo TLS (antigamente SSL) em …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Sobre o Let's Encrypt&lt;/h2&gt;
&lt;p&gt;O projeto &lt;a class="external" href="https://letsencrypt.org"&gt;Let's Encrypt&lt;/a&gt; entrou na fase beta pública na semana passada, começando a oferecer certificados TLS/SSL válidos a qualquer site interessado.&lt;/p&gt;
&lt;p&gt;O objetivo do projeto é oferecer, gratuitamente, uma maneira simples e automatizada para administradores ativarem e manterem o protocolo TLS (antigamente SSL) em seus websites.&lt;/p&gt;
&lt;p&gt;Ele é de código aberto e pode ser encontrado no github: &lt;code&gt;https://github.com/letsencrypt/letsencrypt&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Instalação do certificado&lt;/h2&gt;
&lt;p&gt;Antes de qualquer coisa, é necessário baixar os scripts:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone https://github.com/letsencrypt/letsencrypt
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; letsencrypt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A documentação está disponível em: &lt;a href="http://letsencrypt.readthedocs.org/en/latest/index.html"&gt;http://letsencrypt.readthedocs.org/en/latest/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A maneira mais simples de obter e configurar os certificados é com o script &lt;code&gt;letsencrypt-auto&lt;/code&gt; rodado como root. Se você não gosta da ideia de executar esse script como root, há um projeto paralelo (não oficial) que talvez lhe interese: &lt;a href="https://github.com/diafygi/letsencrypt-nosudo"&gt;https://github.com/diafygi/letsencrypt-nosudo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Executando o letsencrypt-auto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo ./letsencrypt-auto
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ele irá procurar as dependências necessárias e, caso não encontre, automaticamente usará o apt-get para instalá-las.&lt;/p&gt;
&lt;p&gt;O let's encrypt mostrará uma lista com os sites encontrados no servidor:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Lista de nomes" src="https://admin.cefala.org/blog/images/letsencrypt01.png"&gt;&lt;/p&gt;
&lt;p&gt;O script enviará uma requisição ao Let's Enrypt solicitando um certificado. Após verificar que o servidor realmente é proprietário da entrada DNS correspondente, o certificado será enviado. Esse processo é automático e não demora mais que alguns segundos. Os certificados são colocados em: &lt;code&gt;/etc/letsencrypt/live&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Em seguida você deve escolher se quer habilitar o redirecionamento http -&amp;gt; https, ou prefere manter o site também acessível sem criptografia:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Redirecionar ou não?" src="https://admin.cefala.org/blog/images/letsencrypt02.png"&gt;&lt;/p&gt;
&lt;p&gt;Assim, as modificações serão feitas automaticamente nos arquivos correspondentes em &lt;code&gt;/etc/apache2/sites available&lt;/code&gt;. Em seguida, as configurações serão aplicadas ao apache.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Tudo pronto" src="https://admin.cefala.org/blog/images/letsencrypt03.png"&gt;&lt;/p&gt;
&lt;p&gt;Caso queira reverter essas configurações, execute:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo ./letsencrypt-auto --rollback
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O certificado tem validade de 3 meses. Portanto, o certificado deve ser renovado antes disso. Para tal, é só executar novamente o mesmo script e seguir os passos. Em determinado ponto, você verá a seguinte tela:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Renovando o certificado" src="https://admin.cefala.org/blog/images/letsencrypt04.png"&gt;&lt;/p&gt;
&lt;p&gt;É só aceitar e o certificado será renovado por mais 3 meses.&lt;/p&gt;
&lt;p&gt;É possível automatizar essa renovação utilizando um arquivo de configuração do let's encrypt e o crontab, porém, a intenção do projeto é de oferecer uma ferramenta oficial que faça isso, portanto, por enquanto, é mais interessante esperar pra ver o que eles oferecerão.&lt;/p&gt;
&lt;p&gt;Aqui você pode conferir o teste de segurança no domínio cefala.org: &lt;a href="https://www.ssllabs.com/ssltest/analyze.html?d=www.cefala.org"&gt;https://www.ssllabs.com/ssltest/analyze.html?d=www.cefala.org&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Post-scriptum&lt;/h2&gt;
&lt;p&gt;(por Rafael Laboissière, em 2022-07-16)&lt;/p&gt;
&lt;p&gt;A técnica descrita acima é obsoleta e devemos &lt;a class="internal" href="https://admin.cefala.org/blog/certbot-is-our-friend.html"&gt;usar agora o certbot&lt;/a&gt;.&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>Homepage default para *.cefala.org</title><link href="https://admin.cefala.org/blog/homepage-default-para-cefalaorg.html" rel="alternate"></link><published>2015-11-22T17:13:00-02:00</published><updated>2015-11-22T17:13:00-02:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-11-22:/blog/homepage-default-para-cefalaorg.html</id><summary type="html">&lt;p&gt;O servidor Apache instalado na VM &lt;code&gt;www.cefala.org&lt;/code&gt; abriga vários sites web virtuais (“VirtualHost”, na terminologia do Apache). Para que isto funcione corretamente, o servidor DNS instalado em &lt;code&gt;ppgeemaster.cpdee.ufmg.br&lt;/code&gt; traduz qualquer nome &lt;code&gt;*.cefala.org&lt;/code&gt; para o número IP 150.164.32.8, que é o da …&lt;/p&gt;</summary><content type="html">&lt;p&gt;O servidor Apache instalado na VM &lt;code&gt;www.cefala.org&lt;/code&gt; abriga vários sites web virtuais (“VirtualHost”, na terminologia do Apache). Para que isto funcione corretamente, o servidor DNS instalado em &lt;code&gt;ppgeemaster.cpdee.ufmg.br&lt;/code&gt; traduz qualquer nome &lt;code&gt;*.cefala.org&lt;/code&gt; para o número IP 150.164.32.8, que é o da VM &lt;code&gt;www.cefala.org&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;O problema com esta configuração é que qualquer site &lt;code&gt;*.cefala.org&lt;/code&gt;, para o qual não existe VirtualHost definido, exibe a homepage default do Apache, aquela famosa página frugal com o conteúdo seguinte:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;It&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;works&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nv"&gt;This&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;page&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;server&lt;/span&gt;.&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nv"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;web&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;software&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;running&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;but&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;been&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;added&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;yet&lt;/span&gt;.&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Isto dá a falsa impressão de que o site existe e o seu conteúdo será um dia criado. Para evitar este constrangimento, eu fiz modificações no arquivo &lt;code&gt;/var/www/index.html&lt;/code&gt; da VM &lt;code&gt;www.cefala.org&lt;/code&gt;. Resultou nisto aqui: &lt;a class="external" href="http://nao.existe.e.nunca.existiu.cefala.org/"&gt;http://nao.existe.e.nunca.existiu.cefala.org/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;P.S.: Para não perder o hábito, e também para perpetuar esta nova configuração, a instalação da homepage default está sob controle Git:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone cefala-admin@git.cefala.org:/var/git/cefala-admin/default-website
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Servidores"></category></entry><entry><title>Agrupando a gente</title><link href="https://admin.cefala.org/blog/agrupando-a-gente.html" rel="alternate"></link><published>2015-09-12T15:25:00-03:00</published><updated>2015-09-12T15:25:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-09-12:/blog/agrupando-a-gente.html</id><summary type="html">&lt;p&gt;Recentemente, eu &lt;a class="internal" href="https://admin.cefala.org/blog/simplificando-a-criacao-de-usuarios-na-base-ldap.html"&gt;apresentei&lt;/a&gt; as novas regras para a gestão de grupos POSIX no CEFALA. Como eu já mencionei em outras ocasiões, grupos POSIX existem única e exclusivamente para facilitar compartilhamento de arquivos em sistemas UNIX-like.&lt;/p&gt;
&lt;p&gt;Entretanto, o grande obstáculo para o compartilhamento de arquivos é o fato de que os …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Recentemente, eu &lt;a class="internal" href="https://admin.cefala.org/blog/simplificando-a-criacao-de-usuarios-na-base-ldap.html"&gt;apresentei&lt;/a&gt; as novas regras para a gestão de grupos POSIX no CEFALA. Como eu já mencionei em outras ocasiões, grupos POSIX existem única e exclusivamente para facilitar compartilhamento de arquivos em sistemas UNIX-like.&lt;/p&gt;
&lt;p&gt;Entretanto, o grande obstáculo para o compartilhamento de arquivos é o fato de que os nossos diretórios de login têm direitos de acesso muito restritos (&lt;code&gt;drwx------&lt;/code&gt;). Isto também causa problemas de acesso do diretório &lt;code&gt;~/public_html&lt;/code&gt; pelo servidor Apache.&lt;/p&gt;
&lt;p&gt;Para contornar este problema, foram criados diretórios para cada usuário em &lt;code&gt;/home/shared/&lt;/code&gt;, com direitos de acesso &lt;code&gt;drwxr-xr-x&lt;/code&gt;. Os diretórios &lt;code&gt;~/public_html&lt;/code&gt; foram também transferidos para &lt;code&gt;/home/shared/*&lt;/code&gt; e substituídos por links simbólicos apropriados. O script &lt;code&gt;cefala-add-user&lt;/code&gt; também foi modificado de acordo com o que acabei de expor. Eis um exemplo de criação de usuário do CEFALA com a versão mais recente do script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;cefala-add-user foo
&lt;span class="go"&gt;[snip]&lt;/span&gt;
&lt;span class="gp"&gt;# &lt;/span&gt;ls -ld /home/foo /home/shared/foo
&lt;span class="go"&gt;drwx------ 2 foo foo 4096 Sep 12 04:37 /home/foo&lt;/span&gt;
&lt;span class="go"&gt;drwxr-xr-x 3 foo foo 4096 Sep 12 04:37 /home/shared/foo&lt;/span&gt;
&lt;span class="gp"&gt;# &lt;/span&gt;ls -l /home/foo /home/shared/foo
&lt;span class="go"&gt;/home/foo:&lt;/span&gt;
&lt;span class="go"&gt;total 0&lt;/span&gt;
&lt;span class="go"&gt;lrwxrwxrwx 1 root root 28 Sep 12 04:37 public_html -&amp;gt; /home/shared/foo/public_html&lt;/span&gt;

&lt;span class="go"&gt;/home/shared/foo:&lt;/span&gt;
&lt;span class="go"&gt;total 4&lt;/span&gt;
&lt;span class="go"&gt;drwxr-xr-x 2 foo foo 4096 Sep 12 04:37 public_html&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A configuração do Apache teve de ser modificada, ficando o arquivo &lt;code&gt;/etc/apache2/mods-enabled/userdir.conf&lt;/code&gt; desta maneira:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;IfModule&lt;/span&gt; &lt;span class="err"&gt;mod_userdir.c&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    UserDir /home/shared/*/public_html
    UserDir disabled root

    &lt;span class="nt"&gt;&amp;lt;Directory&lt;/span&gt; &lt;span class="err"&gt;/home/shared/*/public_html&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        AllowOverride FileInfo AuthConfig Limit Indexes
        Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
        &lt;span class="nt"&gt;&amp;lt;Limit&lt;/span&gt; &lt;span class="err"&gt;GET&lt;/span&gt; &lt;span class="err"&gt;POST&lt;/span&gt; &lt;span class="err"&gt;OPTIONS&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            Require all granted
        &lt;span class="nt"&gt;&amp;lt;/Limit&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;LimitExcept&lt;/span&gt; &lt;span class="err"&gt;GET&lt;/span&gt; &lt;span class="err"&gt;POST&lt;/span&gt; &lt;span class="err"&gt;OPTIONS&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            Require all denied
        &lt;span class="nt"&gt;&amp;lt;/LimitExcept&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Directory&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/IfModule&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Para terminar este artigo, aqui vai uma dica sobre o uso de diretórios compartilhados onde os direitos de acesso ao grupo se propagam automaticamente. Como exemplo, eu usarei o meu nome de login (&lt;code&gt;rlaboiss&lt;/code&gt;) e um dos grupos ao qual pertenço (&lt;code&gt;issp2006&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;getent group issp2006
&lt;span class="go"&gt;issp2006:*:503:hani,rlaboiss&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Imaginem que eu crie um diretório a ser compartilhado pelo outro membro deste grupo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /home/shared/rlaboiss
&lt;span class="gp"&gt;$ &lt;/span&gt;mkdir test-bad
&lt;span class="gp"&gt;$ &lt;/span&gt;chgrp issp2006 test-bad
&lt;span class="gp"&gt;$ &lt;/span&gt;chmod o-rx,g&lt;span class="o"&gt;=&lt;/span&gt;u test-bad
&lt;span class="gp"&gt;$ &lt;/span&gt;ls -ld test-bad
&lt;span class="go"&gt;drwxrwx--- 2 rlaboiss issp2006 4096 Sep 12 09:39 test-bad&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Agora, imaginem que eu crie um arquivo e um sub-diretório dentro do diretório recém-criado:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; test-bad
&lt;span class="gp"&gt;$ &lt;/span&gt;mkdir foo
&lt;span class="gp"&gt;$ &lt;/span&gt;touch bar
&lt;span class="gp"&gt;$ &lt;/span&gt;ls -l
&lt;span class="go"&gt;total 4&lt;/span&gt;
&lt;span class="go"&gt;-rw-r--r-- 1 rlaboiss rlaboiss    0 Sep 12 09:41 bar&lt;/span&gt;
&lt;span class="go"&gt;drwxr-xr-x 2 rlaboiss rlaboiss 4096 Sep 12 09:41 foo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Se eu quiser também compartilhar os arquivos foo e bar com membros do grupo &lt;code&gt;issp2006&lt;/code&gt;, então eu terei que rodar os comandos &lt;code&gt;chgrp&lt;/code&gt; e &lt;code&gt;chmod&lt;/code&gt; com os argumentos adequados.&lt;/p&gt;
&lt;p&gt;É possível automatizar o processo graças ao uso dos comandos &lt;code&gt;newgrp&lt;/code&gt; e &lt;code&gt;umask&lt;/code&gt;, além do flag &lt;code&gt;s&lt;/code&gt; (“set group ID on execution”) do comando &lt;code&gt;chmod&lt;/code&gt;. A coisa seria assim:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;newgrp issp2006
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;umask&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /home/shared/rlaboiss
&lt;span class="gp"&gt;$ &lt;/span&gt;mkdir test-good
&lt;span class="gp"&gt;$ &lt;/span&gt;chmod o-rx,g+s test-good
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; test-good/
&lt;span class="gp"&gt;$ &lt;/span&gt;mkdir foo
&lt;span class="gp"&gt;$ &lt;/span&gt;touch bar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;e o resultado seria este:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;ls -ld ../test-good
&lt;span class="go"&gt;drwxrws--- 3 rlaboiss issp2006 4096 Sep 12 09:49 ../test-good&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;ls -l
&lt;span class="go"&gt;total 4&lt;/span&gt;
&lt;span class="go"&gt;-rw-rw-r-- 1 rlaboiss issp2006    0 Sep 12 09:49 bar&lt;/span&gt;
&lt;span class="go"&gt;drwxrwsr-x 2 rlaboiss issp2006 4096 Sep 12 09:49 foo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Notem que não foi preciso usar os comandos &lt;code&gt;chgrp&lt;/code&gt; e &lt;code&gt;chmod&lt;/code&gt; para ajustar os direitos de acesso do diretório &lt;code&gt;foo&lt;/code&gt; e do arquivo &lt;code&gt;bar&lt;/code&gt;. O comando &lt;code&gt;newgrp&lt;/code&gt; abre um novo shell, de tal maneira que o umask, que normalmente deve ser &lt;code&gt;22&lt;/code&gt;, não se propagará ao shell superior. Não se esqueça de rodar o commando &lt;code&gt;exit&lt;/code&gt; ou teclar &lt;code&gt;Ctrl-D&lt;/code&gt; para voltar à seção shell original, uma vez terminadas as ações relacionadas com o compartilhamento de arquivos.&lt;/p&gt;</content><category term="Sistema"></category></entry><entry><title>Simplificando a criação de usuários na base LDAP</title><link href="https://admin.cefala.org/blog/simplificando-a-criacao-de-usuarios-na-base-ldap.html" rel="alternate"></link><published>2015-09-09T08:06:00-03:00</published><updated>2015-09-09T08:06:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-09-09:/blog/simplificando-a-criacao-de-usuarios-na-base-ldap.html</id><summary type="html">&lt;p&gt;Eu até que gosto de interfaces web, como a &lt;a class="internal" href="https://admin.cefala.org/blog/servidor-nfs-national-foundation-for-security.html"&gt;phpLDAPadmin&lt;/a&gt;, mas eu pertenço àqueles tempos passados da informática pré-histórica, onde eu me comunicava com computadores via &lt;a class="external" href="https://en.wikipedia.org/wiki/VT100"&gt;VT100&lt;/a&gt;. Além disto, às vezes, eu tenho ataques de claustrofobia quando fico preso dentro de um browser. Por estas razões, eu resolvi experimentar o …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Eu até que gosto de interfaces web, como a &lt;a class="internal" href="https://admin.cefala.org/blog/servidor-nfs-national-foundation-for-security.html"&gt;phpLDAPadmin&lt;/a&gt;, mas eu pertenço àqueles tempos passados da informática pré-histórica, onde eu me comunicava com computadores via &lt;a class="external" href="https://en.wikipedia.org/wiki/VT100"&gt;VT100&lt;/a&gt;. Além disto, às vezes, eu tenho ataques de claustrofobia quando fico preso dentro de um browser. Por estas razões, eu resolvi experimentar o script &lt;code&gt;ldapadduser&lt;/code&gt;, do pacote Debian &lt;a class="external" href="https://tracker.debian.org/pkg/ldapscripts"&gt;ldapscripts&lt;/a&gt;, destinado à criação de usuários na base LDAP.&lt;/p&gt;
&lt;p&gt;Descobri logo de cara que phpLDAPadmin e ldapscripts não são bom amigos, pois eles adotam esquemas de base LDAP e gabaritos de objetos (“templates” en inglês) incompatíveis entre si. O primeiro passo para a reconciliação dos dois foi a reestruturação da nossa base LDAP. Os objetos do tipo “user account” e “POSIX group” estão agora dentro dos subníveis &lt;code&gt;ou=Groups&lt;/code&gt; e &lt;code&gt;ou=People&lt;/code&gt;, respectivamente. O atributo &lt;code&gt;ou&lt;/code&gt; do LDAP significa “Organizational Unit”. Na interface phpLDAPadmin, vocês verão atualmente algo do gênero:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;─&amp;gt; dc=cefala,dc=org (3)
 └────&amp;gt; cn=admin
 └[+]─&amp;gt; ou=Groups (32)
 └[+]─&amp;gt; ou=People (27)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Esta mudança não foi suficiente, pois o gabarito de usuário usado pelo comando &lt;code&gt;ldapadduser&lt;/code&gt; é incompatível com aquele usado pelo phpLDAPadmin. Após arrancar os poucos cabelos que restam na minha cabeça ao tentar forçar um gabarito específico no &lt;code&gt;ldapadduser&lt;/code&gt;, eu acabei desistindo e escrevi o meu próprio script, &lt;code&gt;cefala-add-user&lt;/code&gt;, que está agora no Git:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone cefala-admin@git.cefala.org:/var/git/cefala-admin/cefala-ldap
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Eis um exemplo de criação de usuário utilizando o script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo cefala-add-user foo
&lt;span class="go"&gt;cefala-add-user:I: Creating user foo.&lt;/span&gt;
&lt;span class="go"&gt;Last name: Bar&lt;/span&gt;
&lt;span class="go"&gt;First name: Foo&lt;/span&gt;
&lt;span class="go"&gt;Email address: foo.bar@example.org&lt;/span&gt;
&lt;span class="go"&gt;Login shell (default /bin/bash):&lt;/span&gt;

&lt;span class="go"&gt;    Last name: Bar&lt;/span&gt;
&lt;span class="go"&gt;    First name: Foo&lt;/span&gt;
&lt;span class="go"&gt;    Email address: foo.bar@example.org&lt;/span&gt;
&lt;span class="go"&gt;    Login shell: /bin/bash&lt;/span&gt;
&lt;span class="go"&gt;Is the above information correct [y/n]: y&lt;/span&gt;
&lt;span class="go"&gt;New password:&lt;/span&gt;
&lt;span class="go"&gt;Re-enter new password:&lt;/span&gt;
&lt;span class="go"&gt;Successfully added group foo to LDAP&lt;/span&gt;
&lt;span class="go"&gt;adding new entry &amp;quot;cn=Foo Bar,ou=People,dc=cefala,dc=org&amp;quot;&lt;/span&gt;

&lt;span class="go"&gt;cefala-add-user:I: Created user foo (UID: 1027, GID: 532)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Dois commentários importantes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Vocês devem ter notado que o script cria um grupo específico para o usuário, cujo nome é idêntico ao nome de login.  Esta é a norma na distribuição Debian.  Anteriormente, os usuários do CEFALA ficavam todos no mesmo grupo &lt;code&gt;cefala-users&lt;/code&gt;.  Como os grupos POSIX servem apenas para o compartilhamento de arquivos, não fazia sentido colocar todo mundo dentro do mesmo grupo.  Para que tudo fique coerente, eu criei grupos para os usuários existentes e modifiquei os GIDs dos arquivos na partição &lt;code&gt;/home&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Vocês também devem ter notado que o script cria o diretório de login na partição &lt;code&gt;/home&lt;/code&gt;.  Esta é uma razão a mais para a utilização do script &lt;code&gt;cefala-users&lt;/code&gt; ao invés da criação de usuários via phpLDAPadmin.  No caso acima, o diretório ficou assim:&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;ls -ld /home/foo
&lt;span class="go"&gt;drwx------ 40 foo foo 4096 Sep  9 13:12 /home/foo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;/ol&gt;</content><category term="LDAP"></category></entry><entry><title>Snapshots no KVM/QEMU</title><link href="https://admin.cefala.org/blog/snapshots-no-kvmqemu.html" rel="alternate"></link><published>2015-09-04T12:00:00-03:00</published><updated>2015-09-04T12:00:00-03:00</updated><author><name>Arlindo Follador Neto</name></author><id>tag:admin.cefala.org,2015-09-04:/blog/snapshots-no-kvmqemu.html</id><summary type="html">&lt;p&gt;Após a atualização do &lt;a class="external" href="http://virt-manager.org/"&gt;Virt-Manager&lt;/a&gt; surgiu um ícone muito curioso na interface de administração da aplicação. Como o ícone estava desativado não foi dado muita atenção para o mesmo. Eis que em uma visita aos amigos do DCC (Projeto FUZA), o referido ícone estava habilitado e funcionando na implementação KVM …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Após a atualização do &lt;a class="external" href="http://virt-manager.org/"&gt;Virt-Manager&lt;/a&gt; surgiu um ícone muito curioso na interface de administração da aplicação. Como o ícone estava desativado não foi dado muita atenção para o mesmo. Eis que em uma visita aos amigos do DCC (Projeto FUZA), o referido ícone estava habilitado e funcionando na implementação KVM/QEMU de lá. Ao retornar para o CEFALA o motivo de estar desativado foi encontrado: é utilizado a imagem RAW ao invés de QCOW2. Foi convertido uma das VMs para QCOW2 (recomendado por sinal) e lá estava o ícone ativo.&lt;/p&gt;
&lt;p&gt;&lt;img alt="snapshot desativado" src="https://admin.cefala.org/blog/images/snapshots-01.png"&gt;&lt;/p&gt;
&lt;p&gt;A própria descrição do ícone explica muito bem o que este faz! Uma vez ativo, é possível criar snapshots das VMs em pleno funcionamento, como demonstrado pela figura abaixo.&lt;/p&gt;
&lt;p&gt;&lt;img alt="criar snapshot" src="https://admin.cefala.org/blog/images/snapshots-02.png"&gt;&lt;/p&gt;
&lt;p&gt;Uma vez criado um snapshot ele pode ser manipulado através dos botões, a saber: i) criar novo snapshot; ii) executar VM com a versão do snapshot; iii) restaurar VM na versão do snapshot, e; iv) excluir snapshot.&lt;/p&gt;
&lt;p&gt;&lt;img alt="botoes" src="https://admin.cefala.org/blog/images/snapshots-03.png"&gt;&lt;/p&gt;
&lt;p&gt;Toda a manipulação feita no Virt-Manager também pode ser realizada por linha de comando, no Hospedeiro das VMs.&lt;/p&gt;
&lt;p&gt;&lt;img alt="snapshot no shell" src="https://admin.cefala.org/blog/images/snapshots-04.png"&gt;&lt;/p&gt;
&lt;p&gt;Aparentemente os snapshots são guardados dentro do arquivo QCOW2 da respectiva VM. O snapshot é uma técnica interessante principalmente para manter a integridade da VM. Aos poucos as VMs do CEFALA serão alteradas para o formato QCOW2 possibilitando assim a criação de snapshots.&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>Impressoras na Rede do CEFALA</title><link href="https://admin.cefala.org/blog/impressoras-na-rede-do-cefala.html" rel="alternate"></link><published>2015-09-01T12:38:00-03:00</published><updated>2015-09-01T12:38:00-03:00</updated><author><name>Arlindo Follador Neto</name></author><id>tag:admin.cefala.org,2015-09-01:/blog/impressoras-na-rede-do-cefala.html</id><summary type="html">&lt;p&gt;No intuito de manter a nossa boa e velha - &lt;em&gt;mais velha do que boa&lt;/em&gt; - HP LaserJet 1200 funcionando, mapeei sua porta USB para dentro da VM NFS e a configurei para liberar que usuários da rede 10.0.5.0/24 (rede interna do CEFALA) possam utilizá-la sem restrições.&lt;/p&gt;
&lt;p&gt;A …&lt;/p&gt;</summary><content type="html">&lt;p&gt;No intuito de manter a nossa boa e velha - &lt;em&gt;mais velha do que boa&lt;/em&gt; - HP LaserJet 1200 funcionando, mapeei sua porta USB para dentro da VM NFS e a configurei para liberar que usuários da rede 10.0.5.0/24 (rede interna do CEFALA) possam utilizá-la sem restrições.&lt;/p&gt;
&lt;p&gt;A configuração foi demasiadamente simples e por isto não entrarei em detalhes a respeito da mesma, basicamente um &lt;code&gt;apt-get install cups&lt;/code&gt; resolveu todo o problema.&lt;/p&gt;
&lt;p&gt;Os passos posteriores foram utilizar a ferramenta web (acessível via &lt;a href="http://10.0.5.253:631"&gt;http://10.0.5.253:631&lt;/a&gt;) para instalar, configurar e compartilhar a impressora.&lt;/p&gt;
&lt;h2&gt;Configurações para Utilização de Impressoras&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;HP LaserJet 1200&lt;/code&gt;&lt;/strong&gt; - para utilizar esta impressora (a única presente no CEFALA) o link de acesso é &lt;a href="http://10.0.5.253:631/printers/HP_LaserJet_1200"&gt;http://10.0.5.253:631/printers/HP_LaserJet_1200&lt;/a&gt;; este endereço deve ser utilizado para configuração seja em Linux, Windows ou MAC. Trata-se de uma impressora de rede que só aceitará serviços caso o solicitante esteja dentro da rede 10.0.5.0/24.&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>Instalando LDAP + NFS em Estações de Trabalho</title><link href="https://admin.cefala.org/blog/instalando-ldap-nfs-em-estacoes-de-trabalho.html" rel="alternate"></link><published>2015-08-31T21:11:00-03:00</published><updated>2015-08-31T21:11:00-03:00</updated><author><name>Arlindo Follador Neto</name></author><id>tag:admin.cefala.org,2015-08-31:/blog/instalando-ldap-nfs-em-estacoes-de-trabalho.html</id><summary type="html">&lt;p&gt;Há pouco foi feito a instalação de uma Estação de Trabalho física no CEFALA, que utiliza os recursos de autenticação e compartilhamento de arquivos da VM &lt;code&gt;nfs.cefala.org&lt;/code&gt;. A máquina roda Ubuntu 14.04, no entanto o procedimento a ser descrito funciona perfeitamente em Debian e acredita-se funcionar em …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Há pouco foi feito a instalação de uma Estação de Trabalho física no CEFALA, que utiliza os recursos de autenticação e compartilhamento de arquivos da VM &lt;code&gt;nfs.cefala.org&lt;/code&gt;. A máquina roda Ubuntu 14.04, no entanto o procedimento a ser descrito funciona perfeitamente em Debian e acredita-se funcionar em qualquer outra distribuição Debian Like.&lt;/p&gt;
&lt;p&gt;O primeiro passo para a configuração é a instalação dos pacotes necessários:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;apt-get install libnss-ldap libpam-ldap ldap-utils&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Durante a instalação dos pacotes o &lt;code&gt;dpkg&lt;/code&gt; fará a configuração passo-a-passo do &lt;code&gt;libnss-ldap&lt;/code&gt;, as imagens a seguir mostram como uma Estação de Trabalho deve ser configurada na rede CEFALA.&lt;/p&gt;
&lt;p&gt;&lt;img alt="passo 1" src="https://admin.cefala.org/blog/images/debian-ldap-config-01.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="passo 2" src="https://admin.cefala.org/blog/images/debian-ldap-config-02.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="passo 3" src="https://admin.cefala.org/blog/images/debian-ldap-config-03.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="passo 4" src="https://admin.cefala.org/blog/images/debian-ldap-config-04.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="passo 5" src="https://admin.cefala.org/blog/images/debian-ldap-config-05.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="passo 6" src="https://admin.cefala.org/blog/images/debian-ldap-config-06.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="passo 7" src="https://admin.cefala.org/blog/images/debian-ldap-config-07.png"&gt;&lt;/p&gt;
&lt;p&gt;Ao final da configuração interativa do libnss-pam é necessário ainda a configuração manual de alguns arquivos, a saber:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/nsswitch.conf&lt;/code&gt; - é necessário inserir ldap à frente de compat nas linhas passwd, group e shadow, como no exemplo abaixo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;passwd:     compat ldap&lt;/span&gt;
&lt;span class="go"&gt;group:      compat ldap&lt;/span&gt;
&lt;span class="go"&gt;shadow:     compat ldap&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;/etc/pam.d/common-password&lt;/code&gt; - para que a alteração de senha via passwd funcione, é necessário remover a opção &lt;code&gt;use_authtok&lt;/code&gt; da respectiva linha, que deverá ser alterada para:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;password     [success=1 user_unknown=ignore default=die]     pam_ldap.so try_first_pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;/etc/pam.d/common-session&lt;/code&gt; - é possível, com auxílio do módulo pam_mkhomedir.so, criar automaticamente o diretório /home/user para os usuários que ainda não o têm. Entretanto, recomenda-se que o administrador que criou o usuário faça manualmente a criação do diretório com permissão 700, visto que a criação automática do diretório não está presente em todos os servidores/estações que o usuário pode logar. Para que o módulo seja ativado, a linha baixo deve ser inserida no final do arquivo de configuração.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;session optional        pam_mkhomedir.so skel=/etc/skel umask=077&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ao final da configuração LDAP, deve-se garantir que o serviço libnss-pam tenha sido selecionado para ser iniciado com o sistema:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;sysv-rc-conf libnss-ldap on
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A configuração do NFS é mais simples, sendo necessário a instalação do pacote nfs-common:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;apt-get install nfs-common
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A linha de configuração que montará a partição /home deverá ser incluída no arquivo /etc/fstab:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;10.0.5.253:/home   /home    nfs          rw,async,nfsvers=3,rsize=65536,wsize=65536,timeo=5,retrans=4           0    0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Após a montagem, o /home atual será substituído pelo /home remoto exportado via NFS. É interessante, antes desta montagem, mudar o /home para /home_local (lembrando de alterar em /etc/passwd o /home para /home_local dos usuários locais, caso houver).&lt;/p&gt;
&lt;p&gt;&lt;a class="external" href="http://www.server-world.info/en/note?os=Ubuntu_14.04&amp;amp;p=ldap&amp;amp;f=2"&gt;(crédito)&lt;/a&gt;&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>Desempenho dos Tipos de Dispositivos de Rede</title><link href="https://admin.cefala.org/blog/desempenho-dos-tipos-de-dispositivos-de-rede.html" rel="alternate"></link><published>2015-08-31T20:11:00-03:00</published><updated>2015-08-31T20:11:00-03:00</updated><author><name>Arlindo Follador Neto</name></author><id>tag:admin.cefala.org,2015-08-31:/blog/desempenho-dos-tipos-de-dispositivos-de-rede.html</id><summary type="html">&lt;p&gt;Há pouco tempo atrás descobri um terrível gargalo que estava prejudicando o compartilhamento de arquivos com o NFS (Network File System). Trata-se da seleção do Modelo de Dispositivo de Rede a ser utilizado como Placa de Rede em uma VM. No KVM são apenas três opções possíveis: &lt;code&gt;e1000&lt;/code&gt;, &lt;code&gt;rtl8139&lt;/code&gt; e …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Há pouco tempo atrás descobri um terrível gargalo que estava prejudicando o compartilhamento de arquivos com o NFS (Network File System). Trata-se da seleção do Modelo de Dispositivo de Rede a ser utilizado como Placa de Rede em uma VM. No KVM são apenas três opções possíveis: &lt;code&gt;e1000&lt;/code&gt;, &lt;code&gt;rtl8139&lt;/code&gt; e &lt;code&gt;virtio&lt;/code&gt;; sendo que a primeira opção, &lt;code&gt;Hypervisor padrão&lt;/code&gt;, no caso do CEFALA é o &lt;code&gt;virtio&lt;/code&gt;. Por não saber do problema, todas as VMs do CEFALA estavam utilizando o rtl8139 por ser um driver mais conhecido. Após perceber que esta configuração acarretava em uma perda em performance, decidi testar os demais modelos para verificar o desempenho de cada um deles.&lt;/p&gt;
&lt;p&gt;Os testes utilizaram o iperf combinando os modelos de dispositivos de rede existentes em um enlace virtual: e1000 &amp;lt;-&amp;gt; e1000, rtl8131 &amp;lt;-&amp;gt; rtl8139 e virtio &amp;lt;-&amp;gt; virtio. O iperf foi executado por três vezes consecutivas e o melhor resultado para 10 segundos de transferência é apresentado abaixo:&lt;/p&gt;
&lt;p&gt;e1000 &amp;lt;-&amp;gt; e1000&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;[ ID] Interval       Transfer     Bandwidth&lt;/span&gt;
&lt;span class="go"&gt;[ 3]  0.0-10.0 sec  1.48 GBytes  1.27 Gbits/sec&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;rtl8131 &amp;lt;-&amp;gt; rtl8139&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;[ ID] Interval       Transfer     Bandwidth&lt;/span&gt;
&lt;span class="go"&gt;[ 3]  0.0-10.0 sec   179 MBytes   150 Mbits/sec&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;virtio &amp;lt;-&amp;gt; virtio&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;[ ID] Interval       Transfer     Bandwidth&lt;/span&gt;
&lt;span class="go"&gt;[  3]  0.0-10.0 sec  20.9 GBytes  18.0 Gbits/sec&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Os testes deixam claro o desempenho do &lt;code&gt;virtio&lt;/code&gt; em comparação com os demais. Obviamente todas as VMs passaram a utilizá-lo em substituição ao &lt;code&gt;rtl8139&lt;/code&gt;. Como este post não tem o intuito de investigar o motivo da diferença, mas sim de expor a mesma, vou parando por aqui...&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>Acesso seguro (e prático) às VMs</title><link href="https://admin.cefala.org/blog/acesso-seguro-e-pratico-as-vms.html" rel="alternate"></link><published>2015-08-09T11:31:00-03:00</published><updated>2015-09-11T09:17:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-08-09:/blog/acesso-seguro-e-pratico-as-vms.html</id><summary type="html">&lt;p&gt;Como já foi &lt;a class="internal" href="https://admin.cefala.org/blog/servidor-nfs-national-foundation-for-security.html"&gt;divulgado&lt;/a&gt; por aqui, o controle do acesso às Vms do CEFALA está centralizado no servidor LDAP, que se encontra instalado na VM nfs. A senha de login de cada usuário é única para todas as VMs e está armazenada na base LDAP.&lt;/p&gt;
&lt;p&gt;Existem duas maneiras de modificar …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Como já foi &lt;a class="internal" href="https://admin.cefala.org/blog/servidor-nfs-national-foundation-for-security.html"&gt;divulgado&lt;/a&gt; por aqui, o controle do acesso às Vms do CEFALA está centralizado no servidor LDAP, que se encontra instalado na VM nfs. A senha de login de cada usuário é única para todas as VMs e está armazenada na base LDAP.&lt;/p&gt;
&lt;p&gt;Existem duas maneiras de modificar a senha:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Faça um login em &lt;code&gt;nfs.cefala.org&lt;/code&gt; e use o comando &lt;code&gt;passwd&lt;/code&gt;. Note que é possível rodar o comando &lt;code&gt;passwd&lt;/code&gt; nas outras VMs, mas a modificação não é propagada à base LDAP e, na verdade, não serve para nada.&lt;/li&gt;
&lt;li&gt;Visite a interface phpLDAPadmin da VM nfs na URL &lt;code&gt;https://nfs.cefala.org/phpldapadmin/&lt;/code&gt;.  Clique en &lt;code&gt;login&lt;/code&gt; na barra da esquerda e preencha o campo &lt;code&gt;Login DN&lt;/code&gt; com &lt;code&gt;cn=Rafael Laboissière,dc=cefala,dc=org&lt;/code&gt; (usando o seu nome ao invés do meu) e o campo &lt;code&gt;Password&lt;/code&gt; com a sua senha LDAP.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Obviamente, estes dois métodos só funcionam se você já possuir uma senha válida na base LDAP e se você se lembrar dela. Caso contrário, você terá que pedir ajuda a um dos administradores da base LDAP (Arlindo e este seu humilde servidor, no momento).&lt;/p&gt;
&lt;p&gt;O login por SSH às VMs utiliza, por default, a autenticação Unix clássica usando a senha LDAP. Entretanto, a maneira mais prática e mais segura de se autentificar nas VMs do CEFALA é através de pares de chave SSH. Ela é segura porque evita o envio de senhas através da Internet. Ok, ok, eu sei que as conexões via SSH são encriptadas, mas deixem-me cultivar a minha paranoia de segurança. Além disto, a conexão por par de chaves SSH introduz um obstáculo a mais aos piratas da Net pois, além da senha, elas terão que se apoderar também da chave privada que, normalmente, nunca sai do seu notebook ou computador pessoal.&lt;/p&gt;
&lt;p&gt;Quando ao aspecto da praticidade, o uso de pares de chave SSH permite conexões transparentes sem a necessidade de fornecimento da senha a cada transação (&lt;code&gt;scp&lt;/code&gt;, &lt;code&gt;git pull&lt;/code&gt;/&lt;code&gt;push&lt;/code&gt;, etc.).&lt;/p&gt;
&lt;p&gt;A coisa funciona da seguinte maneira. Inicialmente, crie um par de chaves no seu sistema pessoal, usando o comando &lt;code&gt;ssh-keygen&lt;/code&gt;. Este comando proporá a criação da chave privada em &lt;code&gt;~/.ssh/id_rsa&lt;/code&gt;. Você poderá mudar este nome, o que te permite criar tantos pares de chaves quanto você quiser. Eis um exemplo de criação de pares de chave:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ ssh-keygen
Generating public/private rsa key pair.
Enter file &lt;span class="k"&gt;in&lt;/span&gt; which to save the key &lt;span class="o"&gt;(&lt;/span&gt;/home/rafael/.ssh/id_rsa&lt;span class="o"&gt;)&lt;/span&gt;: /home/rafael/.ssh/id_rsa.cefala
Enter passphrase &lt;span class="o"&gt;(&lt;/span&gt;empty &lt;span class="k"&gt;for&lt;/span&gt; no passphrase&lt;span class="o"&gt;)&lt;/span&gt;:
Enter same passphrase again:
Your identification has been saved &lt;span class="k"&gt;in&lt;/span&gt; /home/rafael/.ssh/id_rsa.cefala.
Your public key has been saved &lt;span class="k"&gt;in&lt;/span&gt; /home/rafael/.ssh/id_rsa.cefala.pub.
The key fingerprint is:
b4:37:bd:e8:e8:64:f2:4c:0a:1b:59:09:d0:ef:af:04 rafael@edge
The key&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;s randomart image is:
+---&lt;span class="o"&gt;[&lt;/span&gt;RSA &lt;span class="m"&gt;2048&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;----+
&lt;span class="p"&gt;|&lt;/span&gt;  ..             &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;   ..            &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;    ..  .        &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;     ..o . .     &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;    E.o S o .    &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;     +.  . o .   &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;    + o.+ . .    &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; O.o       &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;    . &lt;span class="nv"&gt;oo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; .      &lt;span class="p"&gt;|&lt;/span&gt;
+-----------------+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note que, no exemplo acima, eu criei chaves com nomes &lt;code&gt;~/.ssh/id_rsa.cefala&lt;/code&gt; (a chave privada) e &lt;code&gt;~/.ssh/id_rsa.cefala.pub&lt;/code&gt; (a chave pública). A primeira é preciosa e não deve nunca sair do seu sistema pessoal. A segunda é feita para ser divulgada a Zeus e o mundo. Note, também, que é possível criar a chave sem senha. Entretanto, se você fizer isto, eu desço aí em Belo Horizonte para bater em você com vara de marmelo.&lt;/p&gt;
&lt;p&gt;O próximo passo consiste na transferência da chave pública ao CEFALA, o que é feito da seguinte forma:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;id_rsa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cefala&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rlaboiss&lt;/span&gt;&lt;span class="nv"&gt;@xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cefala&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;substituindo &lt;code&gt;rlaboiss&lt;/code&gt; pelo seu nome de login e &lt;code&gt;xxx&lt;/code&gt; pelo nome de qualquer uma das VMs do CEFALA (&lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;nfs&lt;/code&gt;, &lt;code&gt;sci&lt;/code&gt; ou &lt;code&gt;www&lt;/code&gt;). Este comando simplesmente adiciona a sua chave pública como uma linha do arquivo remoto &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;. Como a partição &lt;code&gt;/home/&lt;/code&gt; é compartilhada por todas as VMs, basta rodar uma só vez o comando &lt;code&gt;ssh-copy-id&lt;/code&gt; acima.&lt;/p&gt;
&lt;p&gt;Em seguida, para simplificar as coisas e evitar o uso da opção &lt;code&gt;-i&lt;/code&gt; a cada comando &lt;code&gt;ssh&lt;/code&gt;, coloque o seguinte no arquivo &lt;code&gt;.ssh/config&lt;/code&gt; do seu computador pessoal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Host *.cefala.org
  User rlaboiss
  IdentityFile ~/.ssh/id_rsa.cefala
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Lembre-se de usar o seu nome de login no lugar de &lt;code&gt;rlaboiss&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Se você estiver usando um desktop moderno, como o GNOME3, por exemplo, que roda sob &lt;code&gt;ssh-agent&lt;/code&gt;, você só precisará fornecer uma única vez a senha do seu par de chaves SSH, aquele que você usou no comando &lt;code&gt;ssh-keygen&lt;/code&gt; (e espero que você tenha realmente usado uma senha, para o bem do seu lombo!). A partir daí, todas as conexões SSH ou Git nas VMs do CEFALA serão feitas sem necessidade de fornecimento da senha.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; No parágrafo acima, eu dou a entender que o &lt;code&gt;ssh-agent&lt;/code&gt; só pode ser usado em sessões de desktop como o GNOME, por exemplo. Entretanto, existe uma maneira muito simples de rodá-lo dentro de uma sessão de shell. Neste caso basta fazer isto aqui:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;ssh-agent&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;ssh-add ~/.ssh/id_rsa
&lt;span class="go"&gt;Enter passphrase for /home/rlaboiss/.ssh/id_rsa:&lt;/span&gt;
&lt;span class="go"&gt;Identity added: /home/rlaboiss/.ssh/id_rsa (/home/rlaboiss/.ssh/id_rsa)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Você pode usar qualquer chave SSH como argumento do comando &lt;code&gt;ssh-add&lt;/code&gt;, sendo o valor por default &lt;code&gt;~/.ssh/id_rsa&lt;/code&gt;. Após a execução destes comandos, as conexões via &lt;code&gt;sss&lt;/code&gt;/&lt;code&gt;scp&lt;/code&gt; não pedirão senha, contanto que a chave pública (no exemplo acima &lt;code&gt;.ssh/id_rsa.pub&lt;/code&gt;) esteja estocada no arquivo &lt;code&gt;.ssh/authorized_keys&lt;/code&gt; do servidor acessado. Vide explicação mais acima neste post.&lt;/p&gt;</content><category term="Dica"></category></entry><entry><title>Criando e configurando novas VMs do CEFALA</title><link href="https://admin.cefala.org/blog/criando-e-configurando-novas-vms-do-cefala.html" rel="alternate"></link><published>2015-06-15T13:13:00-03:00</published><updated>2016-11-12T18:41:00-02:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-06-15:/blog/criando-e-configurando-novas-vms-do-cefala.html</id><summary type="html">&lt;p&gt;Neste artigo, as etapas para a criação e a configuração de máquinas virtuais (VMs) do CEFALA sào descritas. O processo não é complicado, mas exige a realização de uma sequência de ações manuais, dificilmente automatizáveis. Como vocês verão abaixo, eu tentei automatizar ao máximo a configuração dos clientes NSS, LDAP …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Neste artigo, as etapas para a criação e a configuração de máquinas virtuais (VMs) do CEFALA sào descritas. O processo não é complicado, mas exige a realização de uma sequência de ações manuais, dificilmente automatizáveis. Como vocês verão abaixo, eu tentei automatizar ao máximo a configuração dos clientes NSS, LDAP e NFS. Vamos então ao que interessa.&lt;/p&gt;
&lt;h2&gt;Preliminares&lt;/h2&gt;
&lt;p&gt;Antes de se criar uma nova VM, é necessário que um IP seja reservado para ela no servidor DNS do CEFALA. Digamos que a VM a ser criada é a &lt;code&gt;xyz&lt;/code&gt;. Assim que seu IP estiver atribuído, podemos conhecê-lo através do seguinte comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;host xyz.cefala.org
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O arquivo de configuração KVM da VM deverá também ser criada. Não entrarei em detalhes deste processo no presente artigo. Normalmente, após a sua criação, o arquivo de configuração aparecerá como &lt;code&gt;/etc/libvirt/qemu/CEFALA-XYZ.xml&lt;/code&gt; ou algo do gênero.&lt;/p&gt;
&lt;p&gt;Algo importante para o bom funcionamento da VM é a criação da interface de rede &lt;code&gt;br3&lt;/code&gt;. Se ela ainda não existir, é possível fazê-lo no &lt;code&gt;virt-manager&lt;/code&gt;. Para tanto, clique no ícone “Show virtual hardware details” e em seguida no botão “Add Hardware”. Crie uma interface de rede com esta configuração:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Network source: Specify shared device name
Bridge name: br3
Device model: rtl8139
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Instalação do sistema operacional&lt;/h2&gt;
&lt;p&gt;Antes de iniciar a instalação do sistema operacional, é necessário indicar o arquivo ISO contendo o netinst da Debian. Se isto não tiver ainda sido feito, lance o &lt;code&gt;virt-manager&lt;/code&gt; e configure o “IDE CDROM 1”, apontando o seu “Source path” para o arquivo ISO &lt;code&gt;/var/lib/libvirt/images/debian-testing-amd64-netinst.iso&lt;/code&gt; ou aquele que for apropriado. É também importante colocar “IDE CDROM 1” no topo da lista “Boot Options”. Em seguida, basta ligar a VM e o instalador da Debian será lançado.&lt;/p&gt;
&lt;p&gt;Dizem por aí que até uma galinha é capaz de instalar um sistema Debian, pois basta ficar bicando na tecla “Enter”. No nosso caso, teremos que ter um cérebro ligeiramente superior ao de uma galinha, pois teclas diferentes da “Enter” terão que ser usadas. Em particular, a etapa “Configuring the network with DHCP” não funcionará (pois não existe servidor DHCP para as VMs) e teremos que escolher a opção “Configure network manually” e fornecer os dados abaixo, manualmente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;150.164&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;XX&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;netmask&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;255.255&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;255.0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;150.164&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;32.254&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;nameserver&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;150.164&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;32.32&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O XX do address IP é aquele que o DNS do CEFALA nos fornece. Na sequência da configuração rede, escolhemos o nome da máquina adequado (&lt;code&gt;xyz&lt;/code&gt; no nosso exemplo) e usamos o “domain name” &lt;code&gt;cefala.org&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;O programa de instalação da Debian exige a criação de um usuário além do root. Escolha um nome de login qualquer para ele. Este usuário deverá ser suprimido mais tarde, pois as contas dos usuário serão compartilhadas via LDAP.&lt;/p&gt;
&lt;h2&gt;Configuração da VM&lt;/h2&gt;
&lt;p&gt;Como descrito por Arlindo em um outro &lt;a class="internal" href="https://admin.cefala.org/blog/servidor-nfs-national-foundation-for-security.html"&gt;artigo&lt;/a&gt;, as VMs do CEFALA compartilham o diretório &lt;code&gt;/home&lt;/code&gt; através do NFS, cujo servidor é a VM &lt;code&gt;nfs.cefala.org&lt;/code&gt;. O protocolo NFS passa pela bridge &lt;code&gt;br3&lt;/code&gt;, definida no hospedeiro &lt;code&gt;kvm.cefala.org&lt;/code&gt;. Deste modo, será necessário criar na nova VM uma nova interface de rede (a &lt;code&gt;eth1&lt;/code&gt;) com o IP apropriado.&lt;/p&gt;
&lt;p&gt;Além disto, a administração das contas dos usuários é centralizada na VM &lt;code&gt;nfs.cefala.org&lt;/code&gt;, via LDAP. É necessário, assim, instalar e configurar os pacotes Debian com os clientes NSS e LDAP.&lt;/p&gt;
&lt;p&gt;No intuito de automatizar ao máximo as ações descritas acima, eu criei um Makefile e alguns arquivos de configuração que estão atualmente sob w controle Git. Aqueles que têm acesso aos repositórios cefala-admin (via &lt;a class="internal" href="https://admin.cefala.org/blog/blogar-e-viver.html"&gt;par de chaves SSH&lt;/a&gt;) poderão obter os arquivos desta maneira:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone cefala-admin@git.cefala.org:cefala-vm-conf.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O comando acima não funcionará na VM que acabou de ser criada, pois a partição &lt;code&gt;/home&lt;/code&gt; ainda não está disponível. Ora, é para isto mesmo que precisamos dos arquivos! Podemos contornar este problema do ovo e da galinha com os seguintes comandos (utilize a console do &lt;code&gt;virt-manager&lt;/code&gt;, fazendo o login como root):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;scp -r rlaboiss@git.cefala.org:/var/git/cefala-admin/cefala-vm-conf.git .
&lt;span class="gp"&gt;# &lt;/span&gt;aptitude install git
&lt;span class="gp"&gt;# &lt;/span&gt;git clone cefala-vm-conf.git
&lt;span class="gp"&gt;# &lt;/span&gt;aptitude remove git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Obviamente, você terá que substituir o &lt;code&gt;rlaboiss&lt;/code&gt; acima pelo seu nome de login na base LDAP. Em seguida, instale os pacotes &lt;code&gt;libnss-ldapd&lt;/code&gt; e &lt;code&gt;nfs-common&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;aptitude install libnss-ldapd nfs-common
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Aceite todos os valores propostos como default no debconf. Eles serão modificados no passo seguinte, que é este abaixo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; cefala-vm-conf
&lt;span class="gp"&gt;# &lt;/span&gt;aptitude install make
&lt;span class="gp"&gt;# &lt;/span&gt;make &lt;span class="nv"&gt;IP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;85&lt;/span&gt; &lt;span class="nv"&gt;HOSTNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xyz
&lt;span class="gp"&gt;# &lt;/span&gt;aptitude remove make
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A especificação das variáveis &lt;code&gt;IP&lt;/code&gt; e &lt;code&gt;HOSTNAME&lt;/code&gt; é obrigatória. A variável &lt;code&gt;IP&lt;/code&gt; corresponde ao último número do IP na bridge &lt;code&gt;br3&lt;/code&gt;. Atualmente, nós temos as seguintes definições:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;172.16.10.1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nfs&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cefala&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;172.16.10.2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cefala&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;172.16.10.3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cefala&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;172.16.10.4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cefala&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;172.16.10.5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sci&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cefala&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et voilà! A nova VM está pronta para utilização. Para ter certeza que tudo está funcionando, faça um teste de conexão à partir de uma outra máquina, com o comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;ssh xyz.cefala.org
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Nota: os comandos para remover os pacotes &lt;code&gt;git&lt;/code&gt; e &lt;code&gt;make&lt;/code&gt; não são obrigatórios, mas garantem que as VMs permaneçam limpas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Desde o commit &lt;code&gt;528e67f&lt;/code&gt;, não é mais necessário especificar as variáveis IP e HOSTNAME no lançamento do commando &lt;code&gt;make&lt;/code&gt;.&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>Migração dos repositórios Git</title><link href="https://admin.cefala.org/blog/migracao-dos-repositorios-git.html" rel="alternate"></link><published>2015-06-06T12:32:00-03:00</published><updated>2015-06-06T12:32:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-06-06:/blog/migracao-dos-repositorios-git.html</id><summary type="html">&lt;p&gt;Os repositórios Git que se encontravam na VM www foram todos transferidos para a VM git. Este mudança é praticamente transparente para os usuários, mas as URLs indicando os repositórios centralizados devem ser atualizadas. Para tanto, vá até o seu repositório Git e edite a linha contendo &lt;code&gt;url =&lt;/code&gt; do arquivo …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Os repositórios Git que se encontravam na VM www foram todos transferidos para a VM git. Este mudança é praticamente transparente para os usuários, mas as URLs indicando os repositórios centralizados devem ser atualizadas. Para tanto, vá até o seu repositório Git e edite a linha contendo &lt;code&gt;url =&lt;/code&gt; do arquivo .git/config, trocando o &lt;code&gt;cefala.org&lt;/code&gt; por &lt;code&gt;git.cefala.org&lt;/code&gt;. Por exemplo, no repositório Git deste blog, a tal linha deve ficar assim:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cefala&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;admin&lt;/span&gt;&lt;span class="nv"&gt;@git&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cefala&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nl"&gt;org&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;blog&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Por sinal, a migração do repositório Git deste blog deu um pouco de trabalho, ligado à construção automática do site web a cada &lt;code&gt;git push&lt;/code&gt;. Anteriormente, como o servidor HTTP e o repositório estavam na mesma VM, a www, tudo era simples. Na situação atual, o web site continua sendo construído pelo Pelican a cada &lt;code&gt;git push&lt;/code&gt;. Entretanto, isto ocorre na VM git. É necessário, assim, transferir os arquivos produzidos para a VM www.&lt;/p&gt;
&lt;p&gt;Uma solução que foi pensada inicialmente por Hani e por mim, seria o compartilhamento de um diretório entre as duas VMs. Esta solução é realmente simples de se implementar no contexto atual, onde as duas VMs, www e git, rodam no mesmo hospedeiro KVM. Na eventualidade de migração das VMs para máquinas diferentes, esta solução teria que ser adaptada, o que resultaria em mais trabalho no futuro.&lt;/p&gt;
&lt;p&gt;A solução mais robusta que encontrei pelo momento foi o uso de um &lt;a class="external" href="http://httpd.apache.org/docs/current/mod/mod_proxy.html"&gt;proxy&lt;/a&gt; no servidor HTTP da VM www. Para que isto funcione, a VM git tem também que rodar um servidor HTTP, fornecendo as páginas produzidas pelo Pelican ao compilar este blog. Isto é feito através de um script de init (&lt;code&gt;/etc/init.d/admin-blog&lt;/code&gt;) que roda um &lt;a class="external" href="http://www.pythonforbeginners.com/modules-in-python/how-to-use-simplehttpserver/"&gt;SimpleHTTPServer&lt;/a&gt; a partir do diretório do site web do blog. Como o seu nome bem diz, o SimpleHTTPServer é servidor HTTP minimalista que é, na verdade, um módulo do Python. Isto evita a instalação e a configuração de um servidor HTTP completo, como o Apache, na VM git. Para matar um passarinho, basta um estilingue, não precisamos de um caça F-16. (Vixe, com essa eu cacei briga com a Sociedade Protetora dos Animais e com o IBAMA!)&lt;/p&gt;
&lt;p&gt;Este servidor HTTP na VM git serve apenas as páginas do blog e fica na escuta de uma porta TCP específica, cujo número eu escolhi aleatoriamente. Assim, é possível acessar o blog nesta URL: &lt;a class="external" href="http://git.cefala.org:8367/"&gt;http://git.cefala.org:8367/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;O próximo passo é a configuração do proxy na VM www. Isto foi feito graças ao arquivo &lt;code&gt;/etc/apache/sites-available/admin-blog.conf&lt;/code&gt;, que contém as linhas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;VirtualHost&lt;/span&gt; &lt;span class="err"&gt;*:80&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    ServerName admin.cefala.org
    &lt;span class="nt"&gt;&amp;lt;Location&lt;/span&gt; &lt;span class="err"&gt;/blog&lt;/span&gt;&lt;span class="nt"&gt;/ &amp;gt;&lt;/span&gt;
        ProxyPass http://git.cefala.org:8367/
        ProxyPassReverse http://git.cefala.org:8367/
    &lt;span class="nt"&gt;&amp;lt;/Location&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O servidor &lt;code&gt;admin.cefala.org&lt;/code&gt; foi recentemente adicionado ao servidor DNS e aponta para &lt;code&gt;www.cefala.org&lt;/code&gt;. Após instalação do arquivo acima na VM www, basta rodar &lt;code&gt;an2ensite&lt;/code&gt;. A URL pública para acessar o blog é, assim, &lt;a class="external" href="http://admin.cefala.org/blog/"&gt;http://admin.cefala.org/blog/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Para não perder o vício, eu coloquei tudo sobre controle GIt, tanto o scritp init da VM git quanto a configuração Apache da VM www, além de criar um &lt;code&gt;Makefile&lt;/code&gt; para automatizar as tarefas. Isto tudo está no diretório &lt;code&gt;webserver&lt;/code&gt; do repositório Git deste blog.&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>Aﬁnando o teste do VirtFS</title><link href="https://admin.cefala.org/blog/afinando-o-teste-do-virtfs.html" rel="alternate"></link><published>2015-06-01T20:25:00-03:00</published><updated>2015-06-01T20:25:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-06-01:/blog/afinando-o-teste-do-virtfs.html</id><summary type="html">&lt;p&gt;Arlindo escreveu um ótimo &lt;a class="internal" href="https://admin.cefala.org/blog/nfs-ou-9p-virtio-eis-a-questao.html"&gt;artigo&lt;/a&gt; sobre os testes comparativos de desempenho do NFS e do VirtFS. Isto gerou uma longa discussão na lista de difusão cefala-admin na semana passada. No frigir dos ovos, a escolha recaiu sobre o NFS, principalmente porque o desempenho do rsync com arquivo destino numa partição …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Arlindo escreveu um ótimo &lt;a class="internal" href="https://admin.cefala.org/blog/nfs-ou-9p-virtio-eis-a-questao.html"&gt;artigo&lt;/a&gt; sobre os testes comparativos de desempenho do NFS e do VirtFS. Isto gerou uma longa discussão na lista de difusão cefala-admin na semana passada. No frigir dos ovos, a escolha recaiu sobre o NFS, principalmente porque o desempenho do rsync com arquivo destino numa partição VirtFS foi catastrófico, por razões que desconhecemos. No presente artigo, estou documentando os aspectos metodológicos que levantei durante a tal discussão, caso a questão volte à pauta no futuro.&lt;/p&gt;
&lt;h2&gt;Performance/reliability/concurrency: Pick two&lt;/h2&gt;
&lt;p&gt;Nos testes feitos por Arlindo, a partição VirtFS foi montada com as opções por default. Entretanto, eu descobri que a opção de cache pode ter uma influência enorme no desempenho. Este é o resultado com a opção cache por default:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;rlaboiss@NFS:~$ &lt;/span&gt;sudo umount /mnt/virtfs
&lt;span class="gp"&gt;rlaboiss@NFS:~$ &lt;/span&gt;sudo mount -t 9p /virtfs /mnt/virtfs -otrans&lt;span class="o"&gt;=&lt;/span&gt;virtio,version&lt;span class="o"&gt;=&lt;/span&gt;9p2000.L
&lt;span class="gp"&gt;rlaboiss@git:~$ &lt;/span&gt;dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/mnt/virtfs/test &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt; &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;32k
&lt;span class="go"&gt;1000+0 records in&lt;/span&gt;
&lt;span class="go"&gt;1000+0 records out&lt;/span&gt;
&lt;span class="go"&gt;32768000 bytes (33 MB) copied, 0.653058 s, 50.2 MB/s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Abaixo está o resultado do mesmo teste com a opção &lt;code&gt;cache=loose&lt;/code&gt;, para o qual desempenho é multiplicado por 6.6:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;rlaboiss@git:~$ &lt;/span&gt;sudo umount /mnt/virtfs/
&lt;span class="gp"&gt;rlaboiss@git:~$ &lt;/span&gt;sudo mount -t 9p /virtfs /mnt/virtfs -otrans&lt;span class="o"&gt;=&lt;/span&gt;virtio,version&lt;span class="o"&gt;=&lt;/span&gt;9p2000.L,cache&lt;span class="o"&gt;=&lt;/span&gt;loose
&lt;span class="gp"&gt;rlaboiss@git:~$ &lt;/span&gt;dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/mnt/virtfs/test &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt; &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;32k
&lt;span class="go"&gt;1000+0 records in&lt;/span&gt;
&lt;span class="go"&gt;1000+0 records out&lt;/span&gt;
&lt;span class="go"&gt;32768000 bytes (33 MB) copied, 0.0980486 s, 334 MB/s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A ideia de testar variações do parâmetro de cache veio da &lt;a class="external" href="http://landley.net/kdocs/Documentation/filesystems/9p.txt"&gt;documentação do v9fs&lt;/a&gt; do kernel Linux. O que é descrito neste documento me lembra o velho dilema dos estudantes, que almejam sempre ter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;boas notas&lt;/li&gt;
&lt;li&gt;vida social&lt;/li&gt;
&lt;li&gt;oito horas de sono por dia&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apenas dois destes objetivos podem ser alcançados simultaneamente. É como no VirtFS, em que você tem que escolher dois dentre os três objetivos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;desempenho&lt;/li&gt;
&lt;li&gt;confiabilidade&lt;/li&gt;
&lt;li&gt;concorrência&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Com a opção “no cache” por default, perde-se o desempenho. Com &lt;code&gt;cache=loose&lt;/code&gt;, perde-se a confiabilidade. Com &lt;code&gt;cache=fscache&lt;/code&gt;, perde-se a concorrência. (Nota: o termo “concorrência” significa gestão de acesso simultâneo a um mesmo arquivo por dois processos diferentes.)&lt;/p&gt;
&lt;h2&gt;Em se tratando de &lt;code&gt;dd&lt;/code&gt;, tamanho de bloco é documento&lt;/h2&gt;
&lt;p&gt;Vocês talvez tenham notado que eu utilizei a opção &lt;code&gt;bs&lt;/code&gt; do comando &lt;code&gt;dd&lt;/code&gt; nos meus testes acima. O desempenho do &lt;code&gt;dd&lt;/code&gt; depende de maneira crítica do tamanho do bloco (512 bytes, por default). Além disso, existe, aparentemente, um tamanho ideal de bloco que depende do hardware do HD.&lt;/p&gt;
&lt;p&gt;Eis aqui o teste realizado com o arquivo de destino na partição VirtFS, no qual pode-se observar a existência de um tamanho ótimo de bloco:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;rlaboiss@git:~$ &lt;/span&gt;sudo umount /mnt/virtfs/
&lt;span class="gp"&gt;rlaboiss@git:~$ &lt;/span&gt;sudo mount -t 9p /virtfs /mnt/virtfs -otrans&lt;span class="o"&gt;=&lt;/span&gt;virtio,version&lt;span class="o"&gt;=&lt;/span&gt;9p2000.L,cache&lt;span class="o"&gt;=&lt;/span&gt;loose
&lt;span class="gp"&gt;rlaboiss@NFS:~$ &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; bs &lt;span class="k"&gt;in&lt;/span&gt; 1k 2k 4k 8k 16k 32k 64k 128k 256k 512k 1M 2M 4M 8M 16M&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="go"&gt;    speed=$(dd if=/dev/zero of=/mnt/virtfs/test count=10 bs=$bs 2&amp;gt;&amp;amp;1 | grep copied | cut -f3 -d, );&lt;/span&gt;
&lt;span class="go"&gt;    printf &amp;quot;%5s %8s&amp;quot; $bs $speed;&lt;/span&gt;
&lt;span class="go"&gt;    echo &amp;quot;&amp;quot;;&lt;/span&gt;
&lt;span class="go"&gt;done&lt;/span&gt;
&lt;span class="go"&gt;   1k      6.0 MB/s&lt;/span&gt;
&lt;span class="go"&gt;   2k     16.2 MB/s&lt;/span&gt;
&lt;span class="go"&gt;   4k     53.7 MB/s&lt;/span&gt;
&lt;span class="go"&gt;   8k     84.7 MB/s&lt;/span&gt;
&lt;span class="go"&gt;  16k      178 MB/s&lt;/span&gt;
&lt;span class="go"&gt;  32k      323 MB/s&lt;/span&gt;
&lt;span class="go"&gt;  64k      540 MB/s&lt;/span&gt;
&lt;span class="go"&gt; 128k      583 MB/s&lt;/span&gt;
&lt;span class="go"&gt; 256k      936 MB/s&lt;/span&gt;
&lt;span class="go"&gt; 512k      1.3 GB/s&lt;/span&gt;
&lt;span class="go"&gt;   1M      1.6 GB/s&lt;/span&gt;
&lt;span class="go"&gt;   2M      1.5 GB/s&lt;/span&gt;
&lt;span class="go"&gt;   4M      2.2 GB/s&lt;/span&gt;
&lt;span class="go"&gt;   8M      2.0 GB/s&lt;/span&gt;
&lt;span class="go"&gt;  16M      590 MB/s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Como Arlindo comentou, é sempre interessante comparar os resultados obtidos no VirtFS com os resultados obtidos quando o arquivo destino está na própria imagem da VM. Ei-los:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;rlaboiss@NFS:~$ &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; bs &lt;span class="k"&gt;in&lt;/span&gt; 1k 2k 4k 8k 16k 32k 64k 128k 256k 512k 1M 2M 4M 8M 16M&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="go"&gt;    speed=$(dd if=/dev/zero of=/var/tmp/test count=10 bs=$bs 2&amp;gt;&amp;amp;1 | grep copied | cut -f3 -d, );&lt;/span&gt;
&lt;span class="go"&gt;    printf &amp;quot;%5s %8s&amp;quot; $bs $speed;&lt;/span&gt;
&lt;span class="go"&gt;    echo &amp;quot;&amp;quot;;&lt;/span&gt;
&lt;span class="go"&gt;done&lt;/span&gt;
&lt;span class="go"&gt;   1k      116 MB/s&lt;/span&gt;
&lt;span class="go"&gt;   2k     99.6 MB/s&lt;/span&gt;
&lt;span class="go"&gt;   4k      161 MB/s&lt;/span&gt;
&lt;span class="go"&gt;   8k      288 MB/s&lt;/span&gt;
&lt;span class="go"&gt;  16k      457 MB/s&lt;/span&gt;
&lt;span class="go"&gt;  32k      663 MB/s&lt;/span&gt;
&lt;span class="go"&gt;  64k      832 MB/s&lt;/span&gt;
&lt;span class="go"&gt; 128k      1.0 GB/s&lt;/span&gt;
&lt;span class="go"&gt; 256k      1.1 GB/s&lt;/span&gt;
&lt;span class="go"&gt; 512k      1.1 GB/s&lt;/span&gt;
&lt;span class="go"&gt;   1M      927 MB/s&lt;/span&gt;
&lt;span class="go"&gt;   2M      587 MB/s&lt;/span&gt;
&lt;span class="go"&gt;   4M      401 MB/s&lt;/span&gt;
&lt;span class="go"&gt;   8M      430 MB/s&lt;/span&gt;
&lt;span class="go"&gt;  16M      340 MB/s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;É interessante observar que o pico de desempenho do VirtFS acontece mais
tarde (&lt;code&gt;bs=4M&lt;/code&gt;) do que aquele do arquivo na imagem da VM (&lt;code&gt;bs=256k&lt;/code&gt;).
Entretanto, a velocidade de escritura máxima no VirtFS é o dobro daquela do
disco da imagem VM (2.2 GB/s contra 1.1 GB/s, respectivamente)&lt;/p&gt;
&lt;p&gt;Para terminar o registro, aqui vão os resultados com o arquivo de destino
numa partição compartilhada via NFS:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;rlaboiss@NFS:~$ &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; bs &lt;span class="k"&gt;in&lt;/span&gt; 1k 2k 4k 8k 16k 32k 64k 128k 256k 512k 1M 2M 4M 8M 16M&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="go"&gt;    speed=$(dd if=/dev/zero of=/home/rlaboiss/test count=10 bs=$bs 2&amp;gt;&amp;amp;1 | grep copied | cut -f3 -d, );&lt;/span&gt;
&lt;span class="go"&gt;    printf &amp;quot;%5s %8s&amp;quot; $bs $speed;&lt;/span&gt;
&lt;span class="go"&gt;    echo &amp;quot;&amp;quot;;&lt;/span&gt;
&lt;span class="go"&gt;done&lt;/span&gt;
&lt;span class="go"&gt;   1k      197 kB/s&lt;/span&gt;
&lt;span class="go"&gt;   2k      533 kB/s&lt;/span&gt;
&lt;span class="go"&gt;   4k      1.1 MB/s&lt;/span&gt;
&lt;span class="go"&gt;   8k      1.3 MB/s&lt;/span&gt;
&lt;span class="go"&gt;  16k      3.4 MB/s&lt;/span&gt;
&lt;span class="go"&gt;  32k      4.7 MB/s&lt;/span&gt;
&lt;span class="go"&gt;  64k      6.6 MB/s&lt;/span&gt;
&lt;span class="go"&gt; 128k      8.4 MB/s&lt;/span&gt;
&lt;span class="go"&gt; 256k      9.5 MB/s&lt;/span&gt;
&lt;span class="go"&gt; 512k      9.5 MB/s&lt;/span&gt;
&lt;span class="go"&gt;   1M     11.7 MB/s&lt;/span&gt;
&lt;span class="go"&gt;   2M     13.8 MB/s&lt;/span&gt;
&lt;span class="go"&gt;   4M     14.2 MB/s&lt;/span&gt;
&lt;span class="go"&gt;   8M     16.2 MB/s&lt;/span&gt;
&lt;span class="go"&gt;  16M     15.8 MB/s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Detalhes metodológicos&lt;/h2&gt;
&lt;p&gt;Os testes do Arlindo foram feitos na VM nfs. Os testes acima, foram feitos na git.cefala.org. Para isto, eu adicionei um hardware nesta VM, que aparece assim no arquivo &lt;code&gt;/etc/libvirt/qemu/CEFALA-Git.xml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;filesystem&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mount&amp;#39;&lt;/span&gt; &lt;span class="na"&gt;accessmode=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mapped&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;driver&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;path&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;dir=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/var/tmp/virtfs&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;target&lt;/span&gt; &lt;span class="na"&gt;dir=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/virtfs&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;address&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;pci&amp;#39;&lt;/span&gt; &lt;span class="na"&gt;domain=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0x0000&amp;#39;&lt;/span&gt; &lt;span class="na"&gt;bus=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0x00&amp;#39;&lt;/span&gt; &lt;span class="na"&gt;slot=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0x07&amp;#39;&lt;/span&gt; &lt;span class="na"&gt;function=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0x0&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/filesystem&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O diretório &lt;code&gt;/var/tmp/virtfs&lt;/code&gt; aparece assim na kvm:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;rlaboiss@CEFALA:~$ &lt;/span&gt;ls -ld /var/tmp/virtfs/
&lt;span class="go"&gt;drwxrwxrwx 3 libvirt-qemu libvirt-qemu 4096 Jun  1 13:39 /var/tmp/virtfs/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Servidores"></category></entry><entry><title>Alﬁnetando o APT</title><link href="https://admin.cefala.org/blog/alfinetando-o-apt.html" rel="alternate"></link><published>2015-06-01T18:10:00-03:00</published><updated>2015-06-01T18:10:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-06-01:/blog/alfinetando-o-apt.html</id><summary type="html">&lt;p&gt;Debian é um sistema maneiro (se fosse usar gíria do meu tempo, eu diria “supimpa”). Entretanto, a distribuição &lt;em&gt;stable&lt;/em&gt; é sempre velha de dois anos, mesmo quando ela acaba de nascer. Este conservadorismo, aliado à coerência entre zilhões de pacotes disponíveis, é que faz o sucesso da Debian. Por outro …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Debian é um sistema maneiro (se fosse usar gíria do meu tempo, eu diria “supimpa”). Entretanto, a distribuição &lt;em&gt;stable&lt;/em&gt; é sempre velha de dois anos, mesmo quando ela acaba de nascer. Este conservadorismo, aliado à coerência entre zilhões de pacotes disponíveis, é que faz o sucesso da Debian. Por outro lado, é difícil ficar na crista da onda em termos de aplicativos.&lt;/p&gt;
&lt;p&gt;É por isto que eu mantenho o APT da Debian do meu notebook sempre apontando para a distribuição &lt;em&gt;testing&lt;/em&gt;. Obviamente, não é aconselhável seguir esta prática em servidores compartilhados, como as VMs do CEFALA. Felizmente, já encontraram uma maneira de contornar o problema: basta alfinetar o APT (&lt;a class="external" href="https://wiki.debian.org/AptPreferences"&gt;&lt;em&gt;APT pinning&lt;/em&gt;&lt;/a&gt;, em inglês).&lt;/p&gt;
&lt;p&gt;Imagine que você esteja rodando a Debian amd64 &lt;em&gt;stable&lt;/em&gt; atual (a.k.a. &lt;em&gt;jessie&lt;/em&gt;), que tem o kernel Linux no pacote &lt;code&gt;linux-image-3.16.0-4-amd64&lt;/code&gt;. Digamos que você deseja testar um kernel mais moderno, por exemplo a versão 4.0 do Linux. Uma solução seria fazer a atualização completa do sistema para a Debian &lt;em&gt;unstable&lt;/em&gt;, no que só de pensar já dá preguiça. Outra solução seria espetar o APT com um alfinete, da seguinte forma:&lt;/p&gt;
&lt;p&gt;Primeiro, informe o seu sistema da existência da Debian &lt;em&gt;unstable&lt;/em&gt;, por exemplo, criando o arquivo &lt;code&gt;/etc/apt/sources.list.d/debian-unstable.list&lt;/code&gt; com o seguinte conteúdo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;deb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://ftp.br.debian.org/debian/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;unstable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;main&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;contrib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;non-free&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="k"&gt;deb-src&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://ftp.br.debian.org/debian/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;unstable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;main&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;contrib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;non-free&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Em seguida, informe o APT quais são as suas preferências, por exemplo, criando o arquivo &lt;code&gt;/etc/apt/preferences.d/debian-releases&lt;/code&gt; com o seguinte conteúdo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Package: *
Pin: release a=stable
Pin-Priority: 650

Package: *
Pin: release a=unstable
Pin-Priority: 600
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Os números que aparecem nas linhas &lt;code&gt;Pin-Priority&lt;/code&gt; não têm relevância particular, mas o essencial é saber que o maior deles indica a distribuição preferida.&lt;/p&gt;
&lt;p&gt;Em seguida, basta rodar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo aptitude update
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo aptitude install linux-image-4.0.0-1-amd64/unstable
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;e você terá o kernel Linux 4.0 rodando na sua máquina após o próximo reboot.&lt;/p&gt;
&lt;p&gt;Como eu sou um cara supimpa (ou maneiro, se você preferir) eu criei um projetinho para automatizar os passos acima. Para variar, e por vício meu, ele está no Git do cefala-admin. Para aqueles que têm acesso via par de chaves SSH (veja as instruções que eu postei num outro &lt;a class="internal" href="https://admin.cefala.org/blog/blogar-e-viver.html"&gt;artigo&lt;/a&gt;), basta fazer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone cefala-admin@www.cefala.org:apt-debian-pinning
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Em seguida, basta rodar &lt;code&gt;sudo make&lt;/code&gt; para alfinetar o APT. O “programa” fará algumas perguntas, como no exemplo abaixo, mas basta teclar “Enter” para aceitar as opções por default. Leia a documentação no arquivo &lt;code&gt;README.md&lt;/code&gt;, para maiores detalhes.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo make
&lt;span class="go"&gt;Debian mirror [ftp.us.debian.org]: ftp.fr.debian.org&lt;/span&gt;
&lt;span class="go"&gt;Priority order [stable testing unstable experimental]: testing unstable experimental&lt;/span&gt;
&lt;span class="go"&gt;Installing preferences file...&lt;/span&gt;
&lt;span class="go"&gt;Installing source files...&lt;/span&gt;
&lt;span class="go"&gt;aptitude update&lt;/span&gt;
&lt;span class="go"&gt;[...]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Sistema"></category></entry><entry><title>NFS ou 9p Virtio..., eis a questão</title><link href="https://admin.cefala.org/blog/nfs-ou-9p-virtio-eis-a-questao.html" rel="alternate"></link><published>2015-05-25T10:25:00-03:00</published><updated>2015-05-25T10:25:00-03:00</updated><author><name>Arlindo Follador Neto</name></author><id>tag:admin.cefala.org,2015-05-25:/blog/nfs-ou-9p-virtio-eis-a-questao.html</id><summary type="html">&lt;p&gt;Amigos, como solicitado em nossos inúmeros e-mails, crio agora este post acerca de minha saga com a utilização de 9p Virtio ou NFS (Network File System) para compartilhamento de pastas entre Hospedeiro (Host) e Hospedado (Guest). Este tipo de compartilhamento é muito útil e largamente utilizado (por mim) no VirtualBox …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Amigos, como solicitado em nossos inúmeros e-mails, crio agora este post acerca de minha saga com a utilização de 9p Virtio ou NFS (Network File System) para compartilhamento de pastas entre Hospedeiro (Host) e Hospedado (Guest). Este tipo de compartilhamento é muito útil e largamente utilizado (por mim) no VirtualBox, devido a sua praticidade. Entretanto, confesso nunca ter analisado afinco sua performance. Nas últimas semanas a necessidade de utilização de compartilhamento de pastas com alto desempenho surgiu, e junto esta necessidade os problemas.&lt;/p&gt;
&lt;p&gt;Em todos os testes que se seguem, o Hospedeiro foi o servidor do CEFALA. A pasta a ser compartilhada do Hospedeiro para uma VM foi a &lt;code&gt;/home/backup_users&lt;/code&gt;. O Sistema Operacional de ambos é o Debian 8. O comando utilizado para obter a performance de gravação foi &lt;code&gt;dd if=/dev/zero of=test count=100000 &amp;amp;&amp;amp; rm test&lt;/code&gt;, variações de configuração neste comando alteram a performance observada, no entanto o percentual entre o desempenho do Hospedeiro e da pasta montada no Hospedado segue o mesmo. Para a coleta de resultados o comando será executado por cinco vezes e o último resultado será considerado (vale lembrar que a diferença entre os cinco é mínima).&lt;/p&gt;
&lt;p&gt;Para a configuração do 9p Virtio a referência oficial do &lt;a class="external" href="http://www.linux-kvm.org/page/9p_virtio"&gt;KVM/QEMU&lt;/a&gt; foi seguida, sendo realizada a configuração via Virt-Manager. Os parâmetros para compartilhamento foram Driver: Default e Modo: Mapped. O modo Mapped foi escolhido por preservar as permissões dos arquivos na pasta compartilhada. Entretanto, no Hospedeiro, a pasta compartilhada deverá ter como do o usuário dono o mesmo usuário que executa a VM que a montará, no caso &lt;code&gt;libvirt-qemu&lt;/code&gt;. A pasta compartilhada no Hospedeiro está sob uma partição RAID 5, que tem a performance abaixo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;root@CEFALA:/home# &lt;/span&gt;dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;100000&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="go"&gt;100000+0 records in&lt;/span&gt;
&lt;span class="go"&gt;100000+0 records out&lt;/span&gt;
&lt;span class="go"&gt;51200000 bytes (51 MB) copied, 0.196585 s, 260 MB/s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Na VM CEFALA-NFS, utilizada para os testes, a performance de acesso da em seu próprio sistema de arquivos (root) foi a seguinte:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;root@NFS:/# &lt;/span&gt;dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;100000&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="go"&gt;100000+0 registros de entrada&lt;/span&gt;
&lt;span class="go"&gt;100000+0 registros de saída&lt;/span&gt;
&lt;span class="go"&gt;51200000 bytes (51 MB) copiados, 0,190469 s, 269 MB/s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;pode-se dizer que é igual a performance do sistema de arquivos onde encontra-se o arquivo imagem desta VM. Entretanto, ao montar na VM a pasta &lt;code&gt;/home/backup_users&lt;/code&gt; compartilhada do Hospedeiro, a performance do 9p Virtio não segue o desempenho observado nos testes anteriores:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;root@NFS:/mnt/backup_users# &lt;/span&gt;dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;100000&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="go"&gt;100000+0 registros de entrada&lt;/span&gt;
&lt;span class="go"&gt;100000+0 registros de saída&lt;/span&gt;
&lt;span class="go"&gt;51200000 bytes (51 MB) copiados, 8,01939 s, 6,4 MB/s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Foram utilizadas diversas formas de montagem da pasta compartilhada, como por exemplo &lt;code&gt;mount -t 9p -o trans=virtio,version=9p2000.L&lt;/code&gt;, que é uma orientação do manual oficial &lt;a class="external" href="http://www.linux-kvm.org/page/9p_virtio"&gt;KVM/QEMU&lt;/a&gt;. Em todos os testes a performance se manteve a mesma.&lt;/p&gt;
&lt;p&gt;Um teste comparativo foi realizado com o VirtualBox, neste a máquina utilizada foi um Laptop (laptop pessoal). O sistema de arquivos onde a imagem da VM Ubuntu está alocada tem o seguinte desempenho:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;lopan@lopan:~# &lt;/span&gt;dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;100000&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="go"&gt;100000+0 registros de entrada&lt;/span&gt;
&lt;span class="go"&gt;100000+0 registros de saída&lt;/span&gt;
&lt;span class="go"&gt;51200000 bytes (51 MB) copiados, 0,155031 s, 330 MB/s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;na VM que foi executada pelo VirtualBox, seu sistema de arquivos tem um desempenho inferior ao observado no Hospedeiro, comportamento que não ocorre no KVM/QEMU:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;root@lopan:/# &lt;/span&gt;dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;100000&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="go"&gt;100000+0 registros de entrada&lt;/span&gt;
&lt;span class="go"&gt;100000+0 registros de saída&lt;/span&gt;
&lt;span class="go"&gt;51200000 bytes (51 MB) copiados, 0,379748 s, 135 MB/s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ainda que inferior em relação ao desempenho do Hospedeiro, trata-se de um desempenho razoável. No entanto, ao utilizar o mecanismo de compartilhamento de pasta do VirtualBox o desempenho do compartilhamento de pasta é parecido com o do KVM/QEMU, ridiculamente baixo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;root@lopan:/media/sf_tmp# &lt;/span&gt;dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;100000&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="go"&gt;100000+0 registros de entrada&lt;/span&gt;
&lt;span class="go"&gt;100000+0 registros de saída&lt;/span&gt;
&lt;span class="go"&gt;51200000 bytes (51 MB) copiados, 9,26114 s, 5,5 MB/s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Diferentemente daquilo que foi visto em &lt;a class="external" href="http://www.landley.net/kdocs/ols/2010/ols2010-pages-109-120.pdf"&gt;VirtFS - A virtualization aware File System pass-through&lt;/a&gt;, o desempenho observado com o NFS é muito maior que o 9p Virtio. No teste com o NFS a configuração do servidor obedeceu o indicado pelo Debian &lt;a class="external" href="https://wiki.debian.org/NFSServerSetup"&gt;NFS Server Setup&lt;/a&gt;, e a montagem da partição foi configurada da seguinte forma (em &lt;code&gt;/etc/fstab&lt;/code&gt;): &lt;code&gt;172.16.10.254:/mnt/backup/PPGEEMaster   /mnt/backup    nfs          rw,async,nfsvers=3,rsize=65536,wsize=65536,timeo=5,retrans=4           0    0&lt;/code&gt;, sendo observado o seguinte desempenho:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;root@ppgeemaster:/mnt/backup# &lt;/span&gt;dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;100000&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="go"&gt;100000+0 registros de entrada&lt;/span&gt;
&lt;span class="go"&gt;100000+0 registros de saída&lt;/span&gt;
&lt;span class="go"&gt;51200000 bytes (51 MB) copiados, 0,263266 s, 194 MB/s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Meus amigos do CEFALA, os testes que foram executados podem e devem conter falhas! Do contrário não seria possível uma afirmação como a do artigo &lt;a class="external" href="http://www.landley.net/kdocs/ols/2010/ols2010-pages-109-120.pdf"&gt;VirtFS - A virtualization aware File System pass-through&lt;/a&gt;. Apesar do desempenho do VirtualBox e KVM/QEMU serem parecidos, não creio que o KVM/QEMU deveria ficar tão abaixo do NFS (Network File System), visto as afirmações do artigo. Este post deve ser complementado à medida em que: (i) encontrarmos o problema e nivelarmos o desempenho em conformidade com o exposto no artigo; (ii) confirmar a baixa performance através de testes conclusivos, contradizendo assim o artigo.&lt;/p&gt;
&lt;p&gt;Todas as configurações iniciais utilizadas foram sob orientações de manuais oficiais do Debian, KVM, entre outros. Pesquisas em fóruns foram realizadas e testes com diversas configurações e linhas de execução do comando mount foram utilizadas, em nada alterou o desempenho em relação ao percentual comparado entre os sistemas de arquivo de Hospedeiro e Hospedado.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (por Rafael):&lt;/strong&gt; Excelente artigo, Arlindo. Eu escrevi alguns comentários sobre os testes acima em um &lt;a class="internal" href="https://admin.cefala.org/blog/afinando-o-teste-do-virtfs.html"&gt;outro artigo&lt;/a&gt;.&lt;/p&gt;</content><category term="Servidores"></category></entry><entry><title>Servidor NFS (National Foundation for Security)</title><link href="https://admin.cefala.org/blog/servidor-nfs-national-foundation-for-security.html" rel="alternate"></link><published>2015-05-21T19:15:00-03:00</published><updated>2016-04-08T13:59:00-03:00</updated><author><name>Arlindo Follador Neto</name></author><id>tag:admin.cefala.org,2015-05-21:/blog/servidor-nfs-national-foundation-for-security.html</id><summary type="html">&lt;p&gt;Em uma das reuniões de um projeto no qual eu e Hani participamos, um coreano visitante mencionou que é preciso uma catástrofe para que algo possa ser reconstruído da forma correta. Confesso que a declaração do coreano me marcou muito, e a cada dia eu vejo que isso é verdade …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Em uma das reuniões de um projeto no qual eu e Hani participamos, um coreano visitante mencionou que é preciso uma catástrofe para que algo possa ser reconstruído da forma correta. Confesso que a declaração do coreano me marcou muito, e a cada dia eu vejo que isso é verdade. Tudo bem que ele fez menção à guerras, insinuando talvez que o Brasil só “tomará jeito” quando algo do tipo acontecer. Enfim, parece que isso se aplica também a tecnologia, pois nos últimos meses o PPGEE e CEFALA foram assombrados por problemas envolvendo RAID e ambos estão sendo reerguidos de forma estável e estruturados para crescer.&lt;/p&gt;
&lt;p&gt;Esta contribuição tem o intuito de documentar parte do que está sendo feito no servidor do CEFALA, mais especificamente ao novo servidor de compartilhamento de arquivos e autenticação. Atualmente, o servidor físico do CEFALA (KVM ou Hospedeiro, chamem como quiser) tem SSH e Libvirt instalados. O acesso à este servidor ficará restrito aos administradores do Libvirt, demais usuários do CEFALA terão acesso apenas aos serviços providos através de Máquinas Virtuais. Neste momento irei focar no servidor &lt;code&gt;CEFALA-NFS&lt;/code&gt; (National Foundation for Security) o qual será responsável por compartilhar o &lt;code&gt;/home&lt;/code&gt; e a base de dados para autenticação via &lt;code&gt;LDAP (Lightweight Directory Access Protocol)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;No hospedeiro, que deve ser entendido como o servidor físico do CEFALA, foi configurado um volume em RAID 1 que totaliza 1.8TB e que será de uso exclusivo para o &lt;code&gt;/home&lt;/code&gt;. O volume foi adicionado à VM CEFALA-NFS de forma transparente, ou seja, a VM consegue acesso direto ao &lt;code&gt;/dev/md3&lt;/code&gt; do hospedeiro. Isso foi possível com a seguinte inserção no arquivo &lt;code&gt;/etc/libvirt/qemu/CEFALA-NFS.xml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;disk&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;block&amp;#39;&lt;/span&gt; &lt;span class="na"&gt;device=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;disk&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;driver&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;qemu&amp;#39;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;raw&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;dev=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/dev/md3&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;target&lt;/span&gt; &lt;span class="na"&gt;dev=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;hdc&amp;#39;&lt;/span&gt; &lt;span class="na"&gt;bus=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;virtio&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/disk&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ainda é cedo para afirmar a performance e estabilidade da forma de acesso utilizada. No entanto, caso a VM apresente alguma instabilidade, uma alternativa seria exportar o NFS diretamente do hospedeiro ou compartilhar o diretório do hospedeiro no qual o RAID 1 está montado. Se leu até aqui, faça agora um minuto de oração para que tudo funcione adequadamente!&lt;/p&gt;
&lt;p&gt;Seguindo adiante, após a implementação do RAID 1 dentro da VM, que foi montado como /home e teve todos os dados do antigo servidor copiados via &lt;code&gt;rsync&lt;/code&gt;, o próximo passo é compartilhá-lo com outras VMs. Deu-se início então ao processo de instalação do LDAP, necessário para que as permissões do /home e a autenticação dos usuários sejam possíveis. O processo de instalação do LDAP seguiu à risca os manuais do próprio &lt;a class="external" href="https://wiki.debian.org/LDAP"&gt;Debian&lt;/a&gt;, tanto para instalação do &lt;a class="external" href="https://wiki.debian.org/LDAP#Server_Setup"&gt;Servidor&lt;/a&gt; quando para o &lt;a class="external" href="https://wiki.debian.org/LDAP#Using_LDAP"&gt;Uso do LDAP&lt;/a&gt;. Não é necessário entrar em detalhes sobre a configuração do LDAP, visto que com o uso da documentação citada não houve imprevistos, o LDAP foi posto em funcionamento em poucos minutos tanto no Servidor quando no Cliente.&lt;/p&gt;
&lt;p&gt;Para facilitar a administração da base LDAP, a aplicação &lt;code&gt;phpLDAPadmin&lt;/code&gt; foi instalada. A interface pode ser acessada através do endereço &lt;a class="external" href="https://nfs.cefala.org/phpldapadmin/"&gt;http://nfs.cefala.org/phpldapadmin&lt;/a&gt;, que funcionará unicamente com HTTPS. O usuário administrador da base é &lt;code&gt;cn=admin,dc=cefala,dc=org&lt;/code&gt; e a senha será compartilhada posteriormente com os administradores. Será neste ambiente que novos usuários deverão ser criados, farei isso com todos os usuários que existiam no servidor antigo e após isso o acesso ao hospedeiro será cancelado, permanecendo apenas os usuários &lt;code&gt;hani&lt;/code&gt;, &lt;code&gt;rlaboiss&lt;/code&gt; e &lt;code&gt;lopan&lt;/code&gt;, com contas Unix, para administração do KVM/QEMU.&lt;/p&gt;
&lt;p&gt;Com o LDAP funcionando, agora é a vez do NFS-Server (Network File System) para exportará o /home para outras VMs. A instalação do NFS-Server seguiu as orientações do Debian, disponível na página &lt;a class="external" href="https://wiki.debian.org/NFSServerSetup"&gt;NFS Server Setup&lt;/a&gt;. Exportação da pasta &lt;code&gt;/home&lt;/code&gt; foi configurada no &lt;code&gt;/etc/exports&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;/home        172.16.10.*(rw,no_root_squash,subtree_check)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Mais uma vez não houve imprevistos com a documentação do Debian, o NFS-Server foi tranquilamente instalado e testado, em outra VM, com o comando &lt;code&gt;mount 172.16.10.1:/home /mnt/home&lt;/code&gt;. O único problema diagnosticado nesta etapa, mas que não é falha da documentação utilizada, foi a respeito de portas abertas para o mundo, ouvindo no endereço &lt;code&gt;0.0.0.0&lt;/code&gt;. Para resolver este problema de forma definitiva, optei pela implementação de um Firewall simples, a ser carregado no &lt;code&gt;/etc/rc.local&lt;/code&gt;, que tem o intuito de preservar acesso externo apenas para ICMP, SSH, HTTP e HTTPS:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;iptables -A INPUT -i lo -j ACCEPT&lt;/span&gt;
&lt;span class="go"&gt;iptables -A INPUT -i eth1 -j ACCEPT&lt;/span&gt;
&lt;span class="go"&gt;iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT&lt;/span&gt;
&lt;span class="go"&gt;iptables -A INPUT -p tcp --dport 22 -j ACCEPT&lt;/span&gt;
&lt;span class="go"&gt;iptables -A INPUT -p tcp --dport 80 -j ACCEPT&lt;/span&gt;
&lt;span class="go"&gt;iptables -A INPUT -p tcp --dport 443 -j ACCEPT&lt;/span&gt;
&lt;span class="go"&gt;iptables -A INPUT -p icmp -j ACCEPT&lt;/span&gt;
&lt;span class="go"&gt;iptables -P INPUT DROP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Se a paciência (ou curiosidade) foi tamanha para chegar até aqui, provavelmente estará se perguntando: que rede é essa no NFS-Server (&lt;code&gt;172.16.10.*&lt;/code&gt;)? A resposta tem ligação com o Firewall anterior. Seria ingenuidade colocar um NFS-Server com acesso via porta WAN ou LAN, e em nosso caso é até desnecessário! Em um ambiente como o nosso é possível criar uma Rede Virtualizada. Cria-se uma Bridge no Hospedeiro que interconectará todas as Interfaces Virtuais das VMs que a utilizarem. Ficou confuso? Então vamos a uma explicação mais detalhada...&lt;/p&gt;
&lt;p&gt;A rede &lt;code&gt;172.16.10.0/24&lt;/code&gt; foi reservada para comunicação exclusivamente entre VMs, não sendo possível acesso via WAN ou LAN. Neste sentido foi criado a bridge &lt;code&gt;br3&lt;/code&gt; no hospedeiro, sem adição de endereço IP pois nem este terá acesso à rede &lt;code&gt;172.16.10.0/24&lt;/code&gt;. As VMs que desejarem acesso aos serviços LDAP, NFS, ou simplesmente uma conexão fora da rede pública (WAN ou LAN), devem inserir uma Interface de Rede na &lt;code&gt;br3&lt;/code&gt;, que irá se comportar analogamente como um switche. A VM CEFALA-NFS, objetivo deste post, está configurada com o Endereço IP &lt;code&gt;172.16.10.1&lt;/code&gt; na &lt;code&gt;br3&lt;/code&gt;. Outras VMs deverão ser configuradas como &lt;code&gt;172.16.10.{2, 3, 4, ..., 254}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Como o hospedeiro conta com um RAID 5, além do RAID 1 utilizado exclusivamente para o &lt;code&gt;/home&lt;/code&gt;, este será utilizado para backup. A VM CEFALA-NFS será agendada para diariamente (semanalmente ou mensalmente, a definir) fazer o backup do &lt;code&gt;/home&lt;/code&gt; no RAID 5 do hospedeiro. Os usuários dos serviços providos pelo CEFALA-NFS terão acesso ao &lt;code&gt;/home&lt;/code&gt; somente através deste servidor, ficando o &lt;code&gt;/home&lt;/code&gt; backup acessível apenas pelos administradores.&lt;/p&gt;
&lt;p&gt;Chega ao fim a implementação do Servidor NFS (National Foundation for Security), sendo necessário em seus clientes (VMs) apenas três passos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Configuração de uma Interface Virtual na &lt;code&gt;br3&lt;/code&gt; com IP na rede &lt;code&gt;172.16.10.0/24&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Instalação do &lt;a class="external" href="https://wiki.debian.org/LDAP#Using_LDAP"&gt;LDAP cliente&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Configuração do NFS no &lt;code&gt;/etc/fstab&lt;/code&gt; para montagem automática do &lt;code&gt;/home&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; (por &lt;a class="internal" href="author/rafael-laboissiere.html"&gt;Rafael Laboissière&lt;/a&gt;) Este
é o comando, a ser rodado na VM &lt;code&gt;kvm.cefala.org&lt;/code&gt;, para restaurar um
diretório &lt;code&gt;/home/$user&lt;/code&gt; a partir do backup diário:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="go"&gt;rsync -av /mnt/sdc1/backup_users/$user nfs.cefala.org:/home/$user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Servidores"></category></entry><entry><title>Porque prefiro o sudo</title><link href="https://admin.cefala.org/blog/porque-prefiro-o-sudo.html" rel="alternate"></link><published>2015-05-15T11:41:00-03:00</published><updated>2015-05-15T11:41:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-05-15:/blog/porque-prefiro-o-sudo.html</id><summary type="html">&lt;p&gt;Os servidores *.cefala.org são administrados por várias pessoas. Todas elas devem ter, em princípio, acesso à conta root nos diferentes sistemas. A maneira mais simples de se lidar com esta situação é de divulgar a senha do root a todos os colaboradores. Ou prefiro usar o &lt;a class="external" href="http://www.sudo.ws/"&gt;sudo&lt;/a&gt;, pelas razões …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Os servidores *.cefala.org são administrados por várias pessoas. Todas elas devem ter, em princípio, acesso à conta root nos diferentes sistemas. A maneira mais simples de se lidar com esta situação é de divulgar a senha do root a todos os colaboradores. Ou prefiro usar o &lt;a class="external" href="http://www.sudo.ws/"&gt;sudo&lt;/a&gt;, pelas razões que exponho abaixo.&lt;/p&gt;
&lt;p&gt;Primeiramente, senha não é coisa que se compartilhe, apesar do fato de que formamos uma confraria de paz e amor.&lt;/p&gt;
&lt;p&gt;&lt;img alt="sharing password" src="https://admin.cefala.org/blog/images/sharing-password.png"&gt; &lt;a class="external" href="http://uwire.com/wp-content/uploads/2012/01/Sharing-Passwords.jpg"&gt;(crédito)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Quando mais de duas pessoas compartilham um segredo, é provável que, mais cedo ou mais tarde, ele seja publicado no Estado de Minas.&lt;/p&gt;
&lt;p&gt;Em segundo lugar, utilizar sudo é uma boa porque fica sempre registrado no arquivo &lt;code&gt;/var/log/auth.log&lt;/code&gt; quem fez o quê e quando.&lt;/p&gt;</content><category term="Sistema"></category></entry><entry><title>Vida fácil com git-scripts</title><link href="https://admin.cefala.org/blog/vida-facil-com-git-scripts.html" rel="alternate"></link><published>2015-05-14T12:34:00-03:00</published><updated>2016-01-21T21:41:00-02:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-05-14:/blog/vida-facil-com-git-scripts.html</id><summary type="html">&lt;p&gt;Git é legal, é bacana, mas impõe também uma certa dose de trabalho ao administrador dos repositórios centralizados. Bom, antes de continuar com o assunto deste artigo, deixe-me somente esclarecer que o conceito de “repositório centralizado” não existe em Git, &lt;em&gt;per se&lt;/em&gt;. Todo e qualquer repositório, seja ele “bare” ou …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Git é legal, é bacana, mas impõe também uma certa dose de trabalho ao administrador dos repositórios centralizados. Bom, antes de continuar com o assunto deste artigo, deixe-me somente esclarecer que o conceito de “repositório centralizado” não existe em Git, &lt;em&gt;per se&lt;/em&gt;. Todo e qualquer repositório, seja ele “bare” ou “working” (veja os detalhes neste &lt;a class="external" href="http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/"&gt;post&lt;/a&gt;), é apenas um repositório a mais na rede de repositórios associados a um projeto. Somos nós, seres humanos, que impomos as regras e declaramos: “Este aqui é o repositório central. O resto é firula!”&lt;/p&gt;
&lt;p&gt;Pois bem, voltando ao assunto, o administrador do sistema onde os repositórios ditos centralizados serão instalados deve executar uma certa quantidade de tarefas, de maneira a manter a ordem mundial. No setup que foi escolhido para a atual VM webserver (e para a futura VM git.cefala.org), um dado repositório será acessado pelos diversos contribuidores através da conta de um único usuário não-humano do sistema. Não confunda não-humano com desumano. Este tal usuário te tratará muito bem, contanto que o administrador do sistema faça a sua parte.&lt;/p&gt;
&lt;p&gt;E o assunto carga de trabalho do coitado do administrador volta à tona. Primeiro, ele tem que criar a conta daquele usuário não-humano, levando-se em conta tudo o que a sua não-humanidade exige, como proibir login, apagar eventuais senhas, etc. Em seguida, o nosso pobre administrador tem que criar os repositórios nos lugares certos e com as boas permissões. como exige a boa etiqueta do mundo Unix. Enfim, deve-se também garantir que este usuário não-humano se comunicará polidamente com os usuários mais humanos que compartilharão os repositórios.&lt;/p&gt;
&lt;p&gt;Está confuso? .ique tranquilo, eu também fiquei, no início. Após matutar bastante, a maneira mais simples que encontrei para o compartilhamento de repositórios centrais foi através de &lt;a class="external" href="https://www.debian-administration.org/article/530/SSH_with_authentication_key_instead_of_password"&gt;autentificação por pares de chave SSH&lt;/a&gt;. Neste caso as chaves públicas RSA dos contribuidores deverão ser instaladas na conta do usuário não-humano que detém o repositório centralizado. Veja um exemplo de uso em um outro &lt;a class="internal" href="https://admin.cefala.org/blog/blogar-e-viver.html"&gt;artigo&lt;/a&gt; que escrevi.&lt;/p&gt;
&lt;p&gt;De modo a simplificar a vida do administrador do servidor git, eu criei uma série de scripts, que coloquei, obviamente, sob controle Git:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone cefala-admin@git.cefala.org:git-scripts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(N.B.: Você não precisa rodar o comando acima para poder usar os scripts da maneira descrita abaixo na VM &lt;code&gt;git.cefala.org&lt;/code&gt;. Rode o &lt;code&gt;git clone&lt;/code&gt; acima somente se você estiver curioso para saber como eu escrevi os scripts, ou se você encontrou algum bug e deseja corrigi-lo.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;No momento, existem quatro scripts disponíveis. O primeiro deles permite a criação do tal usuário não-humano:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;add-git-user usuario
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note que este comando deve ser rodado como root ou através do sudo. A conta do usuário será criada, com diretório home &lt;code&gt;/var/git/usuario/&lt;/code&gt;, com login shell &lt;code&gt;/usr/bin/git-shell&lt;/code&gt;, com senha desabilitada e com números UID et GID maiores que 2000. Esta última medida é necessária para evitar os conflitos futuros, quando as informações das contas dos usuários dos servidores CEFALA serão centralizadas, usando NSS+LDAP ou o que quer que seja.&lt;/p&gt;
&lt;p&gt;Em seguida, existe um script para criar o repositório centralizado:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;add-git-repo usuario repositorio.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O repositório será criado em &lt;code&gt;/var/git/usuario/repositorio.git/&lt;/code&gt;. Um outro script permite a instalação das chaves RSA autorizadas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;add-authorized-keys usuario id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O arquivo &lt;code&gt;id_rsa.pub&lt;/code&gt; é aquele obtido através do comando &lt;code&gt;ssh-keygen&lt;/code&gt; e enviado pelo contribuidor. Enfim, o script &lt;a class="external" href="https://github.com/git-multimail"&gt;git_multimail.py&lt;/a&gt; também foi incluído no projeto. Este script pode ser utilizado no hook &lt;code&gt;post-receive&lt;/code&gt; do repositório centralizado para o envio de notificações automáticas de &lt;code&gt;git push&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Para instalar os scripts no &lt;code&gt;$PATH&lt;/code&gt; do sistema, basta rodar &lt;code&gt;make&lt;/code&gt; de dentro do repositório clonado &lt;code&gt;git-scripts&lt;/code&gt;. Como diria maravilhosamente o Dadá, a vida do administrador agora virou mamão com açúcar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; O script &lt;code&gt;add-authorized-keys&lt;/code&gt; aceita agora a opção -r, que força o acesso read-only para a chave sendo adicionada. Neste caso, a pessoa que é proprietária da chave SSH só pode executar os comandos &lt;code&gt;git clone&lt;/code&gt;, &lt;code&gt;git pull&lt;/code&gt; e &lt;code&gt;git fetch&lt;/code&gt;, sendo o &lt;code&gt;git push&lt;/code&gt; interditado.&lt;/p&gt;</content><category term="Git"></category></entry><entry><title>Libere o seu avatar</title><link href="https://admin.cefala.org/blog/libere-o-seu-avatar.html" rel="alternate"></link><published>2015-05-11T05:57:00-03:00</published><updated>2015-05-11T05:57:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-05-11:/blog/libere-o-seu-avatar.html</id><summary type="html">&lt;p&gt;Gostou do meu avatar aí ao lado? .ocê também pode ter o seu avatar estampado neste blog, como todo narcisista que se preze. Para isto, basta fazer três coisas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;se inscrever no &lt;a class="external" href="http://libravatar.org"&gt;Libravatar&lt;/a&gt;, deixando lá a sua foto 3×4 (ou melhor, 80×80 px),&lt;/li&gt;
&lt;li&gt;redigir um artigo para este …&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;p&gt;Gostou do meu avatar aí ao lado? .ocê também pode ter o seu avatar estampado neste blog, como todo narcisista que se preze. Para isto, basta fazer três coisas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;se inscrever no &lt;a class="external" href="http://libravatar.org"&gt;Libravatar&lt;/a&gt;, deixando lá a sua foto 3×4 (ou melhor, 80×80 px),&lt;/li&gt;
&lt;li&gt;redigir um artigo para este blog, e&lt;/li&gt;
&lt;li&gt;preencher o campo &lt;code&gt;Email:&lt;/code&gt; no cabeçalho do dito artigo com o endereço mail que você usou para criar a conta no Libravatar.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Se você tem conta no &lt;a class="external" href="http://gravatar.com"&gt;Gravatar&lt;/a&gt;, vai funcionar também, contanto que você utilize o endereço mail adequado. Se você não tiver conta nem no Libravatar e nem no Gravatar, azar seu. A sua cara ficará &lt;a class="external" href="http://cdn.libravatar.org/avatar/0d42c03a08cccffd68b69a543d39b770?d=wavatar"&gt;deste jeito&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Algum engraçadinho vai perguntar: “Se o treco funciona com Gravatar e se a maioria das pessoas já têm conta lá, porque você me vem com esta estória de Libravatar? Mas vocês gostam de complicar uma coisa simples, hein?”&lt;/p&gt;
&lt;p&gt;Eu respondo com uma pergunta: Qual é a diferença entre os dois? E já dou a resposta: um termina com &lt;code&gt;.org&lt;/code&gt; e o outro com &lt;code&gt;.com&lt;/code&gt;. Precisa dizer mais?&lt;/p&gt;
&lt;p&gt;Libere o revolucionário que mora no fundo do seu ser!&lt;/p&gt;</content><category term="Doc"></category></entry><entry><title>Reescrevendo a história</title><link href="https://admin.cefala.org/blog/reescrevendo-a-historia.html" rel="alternate"></link><published>2015-05-09T19:42:00-03:00</published><updated>2019-01-07T20:27:00-02:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-05-09:/blog/reescrevendo-a-historia.html</id><summary type="html">&lt;p&gt;Git é uma excelente ferramenta para o trabalho cooperativo. Ele pode fazer muitas coisas, mas é incapaz de resolver conflitos entre as pessoas. Afinal de contas, o Git é apenas um programa de computador e, enquanto não chega o dia da &lt;a class="external" href="https://en.wikipedia.org/wiki/Chinese_room#Strong_AI"&gt;Strong AI&lt;/a&gt;, teremos que resolver os conflitos apenas entre …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Git é uma excelente ferramenta para o trabalho cooperativo. Ele pode fazer muitas coisas, mas é incapaz de resolver conflitos entre as pessoas. Afinal de contas, o Git é apenas um programa de computador e, enquanto não chega o dia da &lt;a class="external" href="https://en.wikipedia.org/wiki/Chinese_room#Strong_AI"&gt;Strong AI&lt;/a&gt;, teremos que resolver os conflitos apenas entre nós, reles seres humanos.&lt;/p&gt;
&lt;p&gt;A que tipo de conflito estou me referindo? .ão estou falando de nada muito sério, como o que aconteceu aqui na Europa há 70 anos, mas apenas de situações que ocorrem quando dois colaboradores estão trabalhando concomitantemente em um projeto sob controle Git. Cada um faz modificações e commits do seu lado, partindo do mesmo ponto da história. Um deles é mais esperto e faz o &lt;code&gt;git push&lt;/code&gt; primeiro. Quando o outro chega para fazer o seu push, o repositório remoto reclama, dizendo que há novidades e o obriga a fazer um pull, seguido de um merge. Aí, o outro fica com uma história assim:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;2015&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;09&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Hani&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Camille&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Yehia&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="err"&gt;─┐&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Merge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;branch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cefala&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;blog&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;2015&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;09&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;16&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rafael&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Laboissiere&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;correct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;multimail&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;2015&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;09&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Hani&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Camille&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Yehia&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;def&lt;/span&gt;&lt;span class="n"&gt;ine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;ci&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;an&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;commit&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;manda&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="n"&gt;icias&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;2015&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;09&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Hani&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Camille&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Yehia&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="err"&gt;─┘&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Hani&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="n"&gt;ication&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mailing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;list&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(Abrindo parêntese rapidinho, o que está mostrado acima é uma cópia das linhas do &lt;a class="external" href="http://jonas.nitro.dk/tig/"&gt;Tig&lt;/a&gt;. Trata-se de uma interface totalmente textual para visualizar a história do Git, sem aqueles frufrus todos das interfaces tipo Click-O-Rama. Fecha parêntese.)&lt;/p&gt;
&lt;p&gt;Bom, a história ficou feia de com força, por causa daquele commit “Merge branch &lt;em&gt;etc.&lt;/em&gt;”. Felizmente, o Git, como nos bons tempos do Stalinismo e do KGB, é capaz de reescrever a história e evitar que você passe constrangimento ao fazer o &lt;code&gt;git push&lt;/code&gt;. Normalmente, o fluxo de trabalho com Git deve ser o seguinte:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git pull
&lt;span class="gp"&gt;$ &lt;/span&gt;editor some-file
&lt;span class="gp"&gt;$ &lt;/span&gt;git pull
&lt;span class="gp"&gt;$ &lt;/span&gt;git add some-file
&lt;span class="gp"&gt;$ &lt;/span&gt;git commit -m &lt;span class="s2"&gt;&amp;quot;Changed some file&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;git push
&lt;span class="go"&gt;Great, thanks for your contribution!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note que eu coloquei duas vezes &lt;code&gt;git pull&lt;/code&gt; acima. O primeiro, você faz antes de introduzir as suas modificações. Entretanto, estas modificações podem durar horas ou dias. É por isto que recomendo o segundo &lt;code&gt;git pull&lt;/code&gt;. De qualquer maneira, a sequência pull/add/commit/push deve ser feita rapidamente.&lt;/p&gt;
&lt;p&gt;Agora, problemas acontecem quando você deixa de fazer o &lt;code&gt;git pull&lt;/code&gt; na hora certa. Aí, pode dar nisto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;editor some-file
&lt;span class="gp"&gt;$ &lt;/span&gt;git add some-file
&lt;span class="gp"&gt;$ &lt;/span&gt;git commit -m &lt;span class="s2"&gt;&amp;quot;Changed some file&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;git push
&lt;span class="go"&gt;You, moron, do a git pull first!&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;git pull
&lt;span class="go"&gt;Ha!  I will force you to do an ugly merge!&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;git push
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Quando isto ocorrer, chame o super &lt;code&gt;git rebase&lt;/code&gt; e ele virá ao seu socorro. &lt;a class="external" href="https://en.wikipedia.org/wiki/List_of_exclamations_by_Robin"&gt;Santa rebaseada, Batman!&lt;/a&gt; Logo após o &lt;code&gt;git pull&lt;/code&gt;, lance os comandos seguintes e a história voltará a ser linear, como se nada tivesse acontecido, não é mesmo, Vladimir?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git rebase remotes/origin/master master
&lt;span class="gp"&gt;$ &lt;/span&gt;git push
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Uma outra maneira de evitar todo e qualquer problema é o uso sistemático da opção &lt;code&gt;--rebase&lt;/code&gt; do command &lt;code&gt;git pull&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;P.S.: Por falar em reescrever a história, a Rússia festejou hoje o armistício da Segunda Guerra Mundial, com toda pompa militar de uma ex-URSS. Eles gostam de ser diferentes do resto do mundo, que festejou o armistício ontem, no dia 8 de maio. Muito se falou por aqui na Europa, nestes últimos dias, da tomada do Reichstag em Berlim pelo Exército Vermelho. Aí eu me lembrei daquela famosa foto do &lt;a class="external" href="https://en.wikipedia.org/wiki/Raising_a_flag_over_the_Reichstag"&gt;hasteamento da bandeira soviética&lt;/a&gt;. Notem que a foto, que foi toda preparada pela propaganda soviética, teve que ser retocada antes da publicação, pois aparecia nela um soldado com relógios nos dois pulsos, prova da pilhagem constrangedora de guerra. No bom estilo Git (o retoque, é claro, não a pilhagem!).&lt;/p&gt;</content><category term="Dica"></category></entry><entry><title>Ô Git, me manda notícias!</title><link href="https://admin.cefala.org/blog/o-git-me-manda-noticias.html" rel="alternate"></link><published>2015-05-08T23:26:00-03:00</published><updated>2015-05-09T11:43:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-05-08:/blog/o-git-me-manda-noticias.html</id><summary type="html">&lt;p&gt;O repositório Git centralizado, onde o controle de versão deste blog é feito, foi recentemente modificado para permitir a notificação automática de push, utilizando o script &lt;a class="external" href="https://github.com/git-multimail"&gt;git_multimail.py&lt;/a&gt;. A lista de endereços mails para os quais os avisos são enviados fica no arquivo &lt;code&gt;config&lt;/code&gt; do repositório centralizado.&lt;/p&gt;
&lt;p&gt;“Bacana”, você vai …&lt;/p&gt;</summary><content type="html">&lt;p&gt;O repositório Git centralizado, onde o controle de versão deste blog é feito, foi recentemente modificado para permitir a notificação automática de push, utilizando o script &lt;a class="external" href="https://github.com/git-multimail"&gt;git_multimail.py&lt;/a&gt;. A lista de endereços mails para os quais os avisos são enviados fica no arquivo &lt;code&gt;config&lt;/code&gt; do repositório centralizado.&lt;/p&gt;
&lt;p&gt;“Bacana”, você vai me dizer, “mas como eu faço para incluir o meu endereço mail nesta lista? .ou ter que me logar na VM webserver e fazê-lo manualmente?” Sim, esta seria uma opção, mas como nós já estamos usando o Git para administrar o blog, eu fiz o necessário para automatizar o processo… via Git! .amos lá, então, para a receita de bolo do dia.&lt;/p&gt;
&lt;p&gt;Se você ainda não tiver clonado o repositório, faça-o seguindo as instruções no meu &lt;a class="internal" href="https://admin.cefala.org/blog/blogar-e-viver.html"&gt;artigo precedente&lt;/a&gt;. Se você já havia clonado há mais tempo, é sempre bom dar uma pullada (isto evita fusões desnecessárias e arborecências de commit tortuosas):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git pull
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Em seguida, edite o arquivo que define a lista de difusão, comite-o e pushe a modificação:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;editor git-hooks/mailing-list
&lt;span class="gp"&gt;$ &lt;/span&gt;git add git-hooks/mailing-list
&lt;span class="gp"&gt;$ &lt;/span&gt;git commit -m &lt;span class="s2"&gt;&amp;quot;Add my email address to the push notification mailing list&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;git push
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Se o código que eu escrevi funcionar corretamente, então você deverá receber doravante os mails de notificação, a começar pelo seu push acima. Nestes mails, as modificações feitas nos arquivos fonte deste blog aparecerão de forma detalhada.&lt;/p&gt;</content><category term="Doc"></category></entry><entry><title>Blogar é viver</title><link href="https://admin.cefala.org/blog/blogar-e-viver.html" rel="alternate"></link><published>2015-05-08T11:43:00-03:00</published><updated>2025-08-19T13:28:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-05-08:/blog/blogar-e-viver.html</id><summary type="html">&lt;p&gt;Como dizia o outro, recordar é viver. Este blog foi criado para manter a memória de que tem sido feito em termos de administração dos servidores do CEFALA. O motor que o move é o &lt;a class="external" href="http://blog.getpelican.com/"&gt;Pelican&lt;/a&gt;. A escolha do sistema obedeceu aos seguintes critérios (impostos por mim, é claro!):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;geração …&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;p&gt;Como dizia o outro, recordar é viver. Este blog foi criado para manter a memória de que tem sido feito em termos de administração dos servidores do CEFALA. O motor que o move é o &lt;a class="external" href="http://blog.getpelican.com/"&gt;Pelican&lt;/a&gt;. A escolha do sistema obedeceu aos seguintes critérios (impostos por mim, é claro!):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;geração de website estático,&lt;/li&gt;
&lt;li&gt;escrito em &lt;a class="external" href="https://www.python.org/"&gt;Python&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;moderno e bem mantido,&lt;/li&gt;
&lt;li&gt;artigos escritos em &lt;a class="external" href="http://daringfireball.net/projects/markdown/"&gt;MarkDown&lt;/a&gt; e&lt;/li&gt;
&lt;li&gt;fácil integração com &lt;a class="external" href="http://git-scm.com/"&gt;Git&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A utilização é maldita de tão simples (“damn simple”):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;git clone cefala-admin@www.cefala.org:blog
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; blog/website
&lt;span class="gp"&gt;$ &lt;/span&gt;editor content/meu-artigo-fantastico.md
&lt;span class="gp"&gt;$ &lt;/span&gt;git add content/meu-artigo-fantastico.md
&lt;span class="gp"&gt;$ &lt;/span&gt;git commit -m &lt;span class="s2"&gt;&amp;quot;Add my fantastic article&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;git push
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Após o &lt;code&gt;git push&lt;/code&gt; final, o site é inteiramente reconstruído no servidor www. Como visto acima, A criação dos artigos pode ser feita inteiramente em um terminal, sem cliques de mouse, sem abrir navegadores web e, o supra sumo da perfeição, sem rodar PHP no servidor!&lt;/p&gt;
&lt;p&gt;Bom, para ser sincero, a utilização não é tão simples assim (mas também não é tão maldita assim). Para começo de conversa, o comando &lt;code&gt;git clone&lt;/code&gt; acima só funcionará se a sua chave pública SSH RSA estiver instalada na conta do "usuário" &lt;code&gt;cefala-admin&lt;/code&gt;. A conta deste “usuário” não-humano no servidor www.cefala.org não permite login e está limitada a aceitar apenas os comandos do Git.&lt;/p&gt;
&lt;p&gt;Este setup foi escolhido por várias razões. Em primeiro lugar, ele evita a criação de contas de usuários na www que terão acesso ao repositório Git centralizado. A manutenção deste repositório também fica mais simples, sem a necessidade de criação de um grupo Unix para controlar o acesso. Em segundo lugar, o acesso via chave SSH, além de ser mais seguro, é mais prático para os usuários. Cada usuário poderá ter quantas chaves quiser, uma para cada sistema do qual ele (ou ela) acessa o servidor www. Além disto, se ela (ou ele) estiver usando o ssh-agent, então, após a primeira conexão, não se precisará mais de entrar a senha da chave RSA para operações futuras (dentro de uma mesma sessão do ssh-agent, evidentemente).&lt;/p&gt;
&lt;p&gt;Bom, para aqueles que se esqueceram, gerar uma chave RSA pública é mais fácil do que torcer pelo próprio time:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;ssh-keygen
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Em seguida, envie-me o arquivo &lt;code&gt;~/.ssh/id_rsa.pub&lt;/code&gt;, para que eu (ou a pessoa que esteja administrando este blog) o adicione ao arquivo &lt;code&gt;/var/git/cefala-admin/.ssh/authorized_keys&lt;/code&gt; do usuário cefala-admin da VM git.cefala.org. No futuro, seria interessante elaborar uma maneira de automatizar esta tarefa mas, por enquanto, vai na mão mesmo.&lt;/p&gt;
&lt;p&gt;Nas instruções que coloquei acima, a pessoa contribuindo neste blog tem apenas que criar um novo artigo escrito em Markdown no diretório &lt;code&gt;content/&lt;/code&gt;, comitá-lo no Git e fazer o &lt;code&gt;git push&lt;/code&gt;. Obviamente, é interessante verificar localmente como ficará o site, antes de exportá-lo. Para tanto, comece por instalar o pacote necessário no seu sistema:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo aptitude install python-pelican
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Em seguida, após editar e salvar o seu novo artigo, vá para o diretório &lt;code&gt;website&lt;/code&gt; (de onde você vê um outro arquivo Makefile e o diretório &lt;code&gt;content/&lt;/code&gt;) e rode os comandos seguintes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;make html
&lt;span class="gp"&gt;$ &lt;/span&gt;make serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Aí, basta apontar o seu navegador para
&lt;a class="external" href="http://localhost:8000"&gt;http://localhost:8000&lt;/a&gt; e verificar se o
trabalho ficou bem feito. Se você achar que o mundo merece ler o que
você escreveu, então prossiga com o &lt;code&gt;git commit&lt;/code&gt; e o &lt;code&gt;git push&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Você pode pedir para o repositório centralizado te avisar quando um push ocorrer nele. Para tanto, basta seguir as &lt;a class="internal" href="https://admin.cefala.org/blog/o-git-me-manda-noticias.html"&gt;instruções&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Na Debian, o pacote python-markdwon é uma dependência do pacote python-pelican. Em outras distribuições, como a Gentoo, você terá que instalar o módulo Markdown do Python manualmente. Isto ainda não é tudo para poder construir localmente o website. O nosso blog precisa de alguns plugins extras do Pelican, que são instalados como sub-módulos Git. Para simplificar a tarefa, eu criei um arquivo &lt;code&gt;Makefile&lt;/code&gt;, que fica no diretório raiz do projeto. Logo após fazer o clone, faça isto aqui:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; blog
&lt;span class="gp"&gt;$ &lt;/span&gt;make
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Na verdade, ao invés do &lt;code&gt;git pull&lt;/code&gt;, será sempre melhor lançar o comando &lt;code&gt;make&lt;/code&gt; como acima.&lt;/p&gt;</content><category term="Doc"></category></entry><entry><title>Trazendo a VM webserver de volta à vida</title><link href="https://admin.cefala.org/blog/trazendo-a-vm-webserver-de-volta-a-vida.html" rel="alternate"></link><published>2015-05-07T23:00:00-03:00</published><updated>2015-05-07T23:00:00-03:00</updated><author><name>Rafael Laboissière</name></author><id>tag:admin.cefala.org,2015-05-07:/blog/trazendo-a-vm-webserver-de-volta-a-vida.html</id><summary type="html">&lt;p&gt;Ao fim do mês de abril de 2015, o volume RAID do servidor cefala2 começou a falhar e, de maneira esporádica e imprevisível, o sistema se tornava “read-only”. Nesta mesma época, eu decidi, de maneira impensada obviamente, fazer a atualização do sistema Debian da wheezy para a jessie, apesar das …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ao fim do mês de abril de 2015, o volume RAID do servidor cefala2 começou a falhar e, de maneira esporádica e imprevisível, o sistema se tornava “read-only”. Nesta mesma época, eu decidi, de maneira impensada obviamente, fazer a atualização do sistema Debian da wheezy para a jessie, apesar das nuvens negras que apareciam naquele não tão belo horizonte.&lt;/p&gt;
&lt;p&gt;Não deu outra. Durante a atualização do sistema via &lt;code&gt;aptitude dist-upgrade&lt;/code&gt;, o volume RAID falhou de novo e o sistema ficou num estado de morte cerebral. Como bem diz o Hani, o ponto nevrálgico do sistema foi atingido, pois a atualização do GRUB ficou pelo meio do caminho.&lt;/p&gt;
&lt;p&gt;Em 1º de maio, dia em que tive muito trabalho com o sistema, desci às profundezas do inferno (i.e. mount em loop device), dominei o Cérbero (i.e. chroot), negociei com o Hades (i.e. GRUB) e trouxe de volta ao mundo dos vivos o servidor webserver. Segue abaixo o relato passo à passo da minha Odisseia, durante a qual vesti o manto de root no arcano mundo do cefala2.&lt;/p&gt;
&lt;p&gt;A imagem da VM será montada como um dispositivo loop e ficará disponível como um disco do sistema. Para tanto, devemos obter o primeiro dispositivo loop do sistema que esteja livre:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;&lt;span class="nv"&gt;LOOPDEV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;sudo losetup -f &lt;span class="p"&gt;|&lt;/span&gt; sed s:/dev/::&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;No meu caso, foi:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$LOOPDEV&lt;/span&gt;
&lt;span class="go"&gt;loop0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Em seguida, associei a imagem da VM a este dispositivo loop (ATENÇÃO: a VM tem que estar completamente desligada neste momento, ou seja, shutoff):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;losetup /dev/&lt;span class="nv"&gt;$LOOPDEV&lt;/span&gt; /home/images_kvm/WinImages/CEFALA_VMs/CEFALAServer.img
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Usei o kpartx para criar os dispositivos neste disco virtual:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;kpartx -av /dev/&lt;span class="nv"&gt;$LOOPDEV&lt;/span&gt;
&lt;span class="go"&gt;add map loop0p1 (253:0): 0 58591232 linear /dev/loop0 2048&lt;/span&gt;
&lt;span class="go"&gt;add map loop0p2 (253:1): 0 15624192 linear /dev/loop0 58593280&lt;/span&gt;
&lt;span class="go"&gt;add map loop0p3 (253:2): 0 97656832 linear /dev/loop0 74217472&lt;/span&gt;
&lt;span class="go"&gt;add map loop0p4 (253:3): 0 876699648 linear /dev/loop0 171874304&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Verifiquei que as partições foram criadas corretamente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;ls -alF /dev/mapper
&lt;span class="go"&gt;total 0&lt;/span&gt;
&lt;span class="go"&gt;drwxr-xr-x  2 root root     140 Mai  1 03:36 ./&lt;/span&gt;
&lt;span class="go"&gt;drwxr-xr-x 16 root root    3880 Mai  1 03:36 ../&lt;/span&gt;
&lt;span class="go"&gt;crw------T  1 root root 10, 236 Abr 30 10:34 control&lt;/span&gt;
&lt;span class="go"&gt;lrwxrwxrwx  1 root root       7 Mai  1 03:36 loop0p1 -&amp;gt; ../dm-0&lt;/span&gt;
&lt;span class="go"&gt;lrwxrwxrwx  1 root root       7 Mai  1 03:36 loop0p2 -&amp;gt; ../dm-1&lt;/span&gt;
&lt;span class="go"&gt;lrwxrwxrwx  1 root root       7 Mai  1 03:36 loop0p3 -&amp;gt; ../dm-2&lt;/span&gt;
&lt;span class="go"&gt;lrwxrwxrwx  1 root root       7 Mai  1 03:36 loop0p4 -&amp;gt; ../dm-3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Em seguida, criei um ponto de montagem no sistema:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;mkdir -p /mnt/vm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Aí, já pude montar as partições (na verdade, eu tive que fazer uns testes antes para descobrir onde estavam as partições /, /home e /var, além da partição de swap):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;mount /dev/mapper/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOOPDEV&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;p1 /mnt/vm
&lt;span class="gp"&gt;# &lt;/span&gt;mount /dev/mapper/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOOPDEV&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;p3 /mnt/vm/home
&lt;span class="gp"&gt;# &lt;/span&gt;mount /dev/mapper/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOOPDEV&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;p4 /mnt/vm/var
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Para que o chroot funcione corretamente mais tarde, é preciso também montar os sistemas de arquivos udev, proc e sysfs do kernel no futuro ponto raiz de chroot:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;mount --bind /proc /mnt/vm/proc
&lt;span class="gp"&gt;# &lt;/span&gt;mount --bind /sys /mnt/vm/sys
&lt;span class="gp"&gt;# &lt;/span&gt;mount --bind /dev /mnt/vm/dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Neste ponto, estamos prontos para lançar o chroot e entrar, virtualmente, na máquina VM webserver:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;chroot /mnt/vm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;À partir daí, usei o &lt;code&gt;dpkg --configure -a&lt;/code&gt; e o aptitude para consertar o sistema. O problema de boot da webserver vinha do pacote GRUB, cuja atualização tinha sido interrompida brutalmente pelo apagão em Terra Brasilis. O problema foi corrigido ao reinstalar o MBR (master boot record) na imagem da VM, o que foi feito desta maneira:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;(hd0) /dev/loop0&amp;quot;&lt;/span&gt; &amp;gt; /boot/grub/device.map
&lt;span class="gp"&gt;# &lt;/span&gt;grub-install /dev/loop0
&lt;span class="gp"&gt;# &lt;/span&gt;update-grub
&lt;span class="gp"&gt;# &lt;/span&gt;rm -f /boot/grub/device.map
&lt;span class="gp"&gt;# &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Depois disto, de volta ao cefala2, desfiz as montagens das partições e liberei o dispositivo loop:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;# &lt;/span&gt;umount /mnt/vm/dev
&lt;span class="gp"&gt;# &lt;/span&gt;umount /mnt/vm/sys
&lt;span class="gp"&gt;# &lt;/span&gt;umount /mnt/vm/proc
&lt;span class="gp"&gt;# &lt;/span&gt;umount /mnt/vm/var
&lt;span class="gp"&gt;# &lt;/span&gt;umount /mnt/vm/home
&lt;span class="gp"&gt;# &lt;/span&gt;umount /mnt/vm
&lt;span class="gp"&gt;# &lt;/span&gt;kpartx -d /dev/&lt;span class="nv"&gt;$LOOPDEV&lt;/span&gt;
&lt;span class="gp"&gt;# &lt;/span&gt;losetup -d /dev/&lt;span class="nv"&gt;$LOOPDEV&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A partir daí, basta ressuscitar a VM moribunda, apertando no botão “Run” do virt-manager ou através de &lt;code&gt;virsh start CEFALAServer&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; [2025-08-19]: No texto acima não está indicado em qual sistema se encontram as imagens da VM. Atualmente, elas se encontram no servidor kvm.cefala.org e estão presentes no diretório &lt;code&gt;/var/lib/libvirt/images/&lt;/code&gt; (e não &lt;code&gt;/home/images_kvm/WinImages/&lt;/code&gt;, como escrito acima).&lt;/p&gt;</content><category term="S.O.S."></category></entry></feed>