{"id":369,"date":"2010-07-30T14:19:37","date_gmt":"2010-07-30T17:19:37","guid":{"rendered":"http:\/\/www.eriberto.pro.br\/blog\/?p=369"},"modified":"2011-10-10T17:40:39","modified_gmt":"2011-10-10T20:40:39","slug":"apaguei-o-varlib-em-um-debian-lenny-servidor-em-producao","status":"publish","type":"post","link":"https:\/\/eriberto.pro.br\/blog\/2010\/07\/30\/apaguei-o-varlib-em-um-debian-lenny-servidor-em-producao\/","title":{"rendered":"Apaguei o \/var\/lib em um Debian Lenny servidor (em produ\u00e7\u00e3o)"},"content":{"rendered":"<p>Hoje, eu tentava debugar um problema em um servidor. Com o entra e sai da minha sala, telefone tocando, chefe trazendo documentos etc., enquanto reaproveitava uma linha anterior (tecla seta para cima), pensando ter dado um <strong># ls \/var\/lib<\/strong>, na verdade, dei um <strong># rm -rf \/var\/lib<\/strong>. Come\u00e7ou a saga&#8230;<\/p>\n<h2>Os primeiros sentimentos<\/h2>\n<p>A coisa come\u00e7a num abstrato formato de p-q-p emanando no c\u00e9rebro. Depois vem a necessidade de incorporar Airton Sena para ser bem r\u00e1pido. Tratava-se do roteador de borda mas, como tudo estava na mem\u00f3ria da m\u00e1quina e ela n\u00e3o usava swap, havia uma enorme possibilidade da rede n\u00e3o cair enquanto eu agisse. Ent\u00e3o, calma Eriberto. Voc\u00ea consegue!<\/p>\n<h2>O que \u00e9 o \/var\/lib?<\/h2>\n<p>O <em>\/var\/lib<\/em> \u00e9 um diret\u00f3rio essencial do sistema que cont\u00e9m, dentre outras coisas, a lista de pacotes instalados e parte do sistema APT. Sem ele, n\u00e3o tem apt-get. Ent\u00e3o, no desespero, a primeira coisa que fiz foi dar um <em># apt-get update<\/em>, para ver do que ele iria reclamar. Fui criando os diret\u00f3rios n\u00e3o encontrados. Em determinado momento, um arquivo n\u00e3o foi encontrado. Com o comando <em>touch<\/em>, criei um arquivo vazio com o nome solicitado. No fim, o APT funcionou (<em>apt-cache<\/em> e <em>apt-get<\/em>). Mas tinha algo ruim&#8230; A base do sistema \u00e9 criada durante a instala\u00e7\u00e3o do Debian e eu n\u00e3o poderia refaz\u00ea-la com perfei\u00e7\u00e3o a partir de um bando de <em>apt-gets<\/em>&#8230;<\/p>\n<h2>A nova solu\u00e7\u00e3o<\/h2>\n<p>Bem, rapidamente pensei e resolvi criar e copiar uma estrutura b\u00e1sica de <em>\/var\/lib<\/em> para dentro da m\u00e1quina. Poderia fazer essa c\u00f3pia via rede, pois a m\u00e1quina acidentada tinha <em>ssh<\/em> e <em>rsync<\/em> ativos. Ent\u00e3o, em outra m\u00e1quina, criei um Debian b\u00e1sico com <em>debootstrap<\/em>:<\/p>\n<pre># mkdir \/tmp\/lenny<\/pre>\n<pre># debootstrap lenny \/tmp\/lenny http:\/\/ftp.us.debian.org\/debian<\/pre>\n<p>A seguir, com <em>rsync -av<\/em>, copiei todo o conte\u00fado de <em>\/tmp\/lenny\/var\/lib\/<\/em> para dentro do <em>\/var\/lib<\/em> da acidentada. Ufa! Estrutura b\u00e1sica montada. Agora, na base de dados do APT (e dpkg), que fica em <em>\/var\/lib<\/em>, s\u00f3 existiam os pacotes b\u00e1sicos . Em outras palavras, para o Debian, ele era um rec\u00e9m-nascido. Assim, eu precisava reinstalar todos os pacotes preexistentes. Mas eu n\u00e3o tinha uma lista de pacotes instalados. Agora sei que \u00e9 importante ter uma rela\u00e7\u00e3o gerada com <em>dpkg -l<\/em> dentro do meu backup. Vou implementar isso.<\/p>\n<p>Para descobrir os pacotes necess\u00e1rios, segui a seguinte ordem:<\/p>\n<ul>\n<li>Inicialmente, para garantir que a lista de pacotes instalados vinda da outra m\u00e1quina (dentro do conte\u00fado do <em>\/var\/lib<\/em>) estava batendo, mandei o sistema reinstalar cada um dos pacotes listados. Escrevi a seguinte linha para fazer isso:<\/li>\n<\/ul>\n<pre style=\"padding-left: 30px;\"># for i in $(dpkg -l|grep ^ii|cut -d\" \" -f3); do apt-get install --reinstall -y $i; done<\/pre>\n<ul>\n<li>Depois, instalei os pacotes b\u00e1sicos, que sempre instalo, como <em>mc<\/em>, <em>rcconf<\/em>, <em>less<\/em>, <em>ntpdate<\/em>, <em>tcpdump<\/em> etc.<\/li>\n<li>Instalei o kernel, pois esse \u00e9 o mais b\u00e1sico. Usei o <em>linux-image-2.6-686<\/em>.<\/li>\n<li>Fiz um <em># netstat -tunlp<\/em> para ver os servi\u00e7os que estavam rodando. Esses s\u00e3o muito importantes, porque podem vir a ter falha de seguran\u00e7a um dia e precisam estar na base de dados do APT para poderem ser atualizados.<\/li>\n<li>Semelhante ao passo anterior, com base no conte\u00fado de <em>\/etc\/init.d<\/em>, instalei pacotes. Para isso, escrevi a seguinte linha:<\/li>\n<\/ul>\n<pre style=\"padding-left: 30px;\"># for i in $(ls \/etc\/init.d); do echo -e '\\n' $i; apt-get install $i; done<\/pre>\n<ul>\n<li>Depois de reinstalar o daemons com base no<em> \/etc\/init.d<\/em>, fiz um novo <em># netstat -tunlp<\/em> para ver se n\u00e3o havia algum servi\u00e7o de rede indesejado no ar. A seguir, outra verifica\u00e7\u00e3o, agora incluindo os servi\u00e7os locais, com <em># ps ax<\/em>.<\/li>\n<li>Agora, o grande final. Eu precisava reinstalar todos os pacotes que tivessem nomes de execut\u00e1veis, exceto o que eu j\u00e1 tinha instalado. A solu\u00e7\u00e3o:<\/li>\n<\/ul>\n<pre style=\"padding-left: 30px;\"># for i in $(ls \/bin; ls \/sbin; ls \/usr\/bin; ls \/usr\/sbin); do echo -e '\\n' $i; apt-get install $i; done<\/pre>\n<ul>\n<li>Com a linha anterior, alguns pacotes foram instalados, outros dados como j\u00e1 instalados e v\u00e1rios nomes dados como n\u00e3o existentes. Houve mensagens citando pacotes virtuais e substitutos. Assim, depois de tudo feito, rodei novamente o comando com um <em>egrep<\/em> m\u00e1gico e um <em>2&gt;<\/em> para desviar erros para o lixo. Veja:<\/li>\n<\/ul>\n<pre style=\"padding-left: 30px;\"># for i in $(ls \/bin; ls \/sbin; ls \/usr\/bin; ls \/usr\/sbin); do echo -e '\\n' $i; apt-get install $i 2&gt; \/dev\/null; done | egrep -A 5 -B 5 '(virtual|substituem|S\\\/n)'<\/pre>\n<ul>\n<li>Nesta \u00faltima linha eu obtive resultados que foram tratados um a um, individualmente.<\/li>\n<\/ul>\n<p>Bem, foi isso. Espero que este post, um dia, ajude algu\u00e9m.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoje, eu tentava debugar um problema em um servidor. Com o entra e sai da minha sala, telefone tocando, chefe trazendo documentos etc., enquanto reaproveitava uma linha anterior (tecla seta para cima), pensando ter dado um # ls \/var\/lib, na verdade, dei um # rm -rf \/var\/lib. Come\u00e7ou a saga&#8230; Os primeiros sentimentos A coisa&hellip;&nbsp;<a href=\"https:\/\/eriberto.pro.br\/blog\/2010\/07\/30\/apaguei-o-varlib-em-um-debian-lenny-servidor-em-producao\/\" rel=\"bookmark\">Continue a ler &raquo;<span class=\"screen-reader-text\">Apaguei o \/var\/lib em um Debian Lenny servidor (em produ\u00e7\u00e3o)<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[16,3,11],"tags":[624,199,621,44,43,110],"class_list":["post-369","post","type-post","status-publish","format-standard","hentry","category-debian","category-linux","category-sistema-operacional","tag-debian","tag-desastres","tag-linux","tag-pacote","tag-pacotes","tag-recuperacao"],"_links":{"self":[{"href":"https:\/\/eriberto.pro.br\/blog\/wp-json\/wp\/v2\/posts\/369","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eriberto.pro.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eriberto.pro.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eriberto.pro.br\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/eriberto.pro.br\/blog\/wp-json\/wp\/v2\/comments?post=369"}],"version-history":[{"count":0,"href":"https:\/\/eriberto.pro.br\/blog\/wp-json\/wp\/v2\/posts\/369\/revisions"}],"wp:attachment":[{"href":"https:\/\/eriberto.pro.br\/blog\/wp-json\/wp\/v2\/media?parent=369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eriberto.pro.br\/blog\/wp-json\/wp\/v2\/categories?post=369"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eriberto.pro.br\/blog\/wp-json\/wp\/v2\/tags?post=369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}