{"id":773,"date":"2014-09-24T11:13:20","date_gmt":"2014-09-24T14:13:20","guid":{"rendered":"http:\/\/blog.abratel.com.br\/?p=773"},"modified":"2014-09-24T11:26:15","modified_gmt":"2014-09-24T14:26:15","slug":"773","status":"publish","type":"post","link":"https:\/\/blog.abratel.com.br\/?p=773","title":{"rendered":"Verifica\u00e7\u00e3o autom\u00e1tica dos sistemas de arquivos (auto-fsck)"},"content":{"rendered":"<p>N\u00e3o importa que sistema ou distribui\u00e7\u00e3o Linux voc\u00ea esteja usando, sempre h\u00e1 um sistema de arquivos armazenando os seus dados. H\u00e1 alguns anos atr\u00e1s, os sistemas de arquivos (ou filesystems, em ingl\u00eas) n\u00e3o eram t\u00e3o modernos e precisam de alguns cuidados. Por exemplo: ao usar o sistema de arquivos ext2, se o computador fosse reiniciado ou desligado de forma for\u00e7ada (o famoso dedoff, ou seja, mete o dedo no bot\u00e3o), logo na inicializa\u00e7\u00e3o do Linux era feita a verifica\u00e7\u00e3o de todo o sistema de arquivos, procurando por inconsist\u00eancias, erros, arquivos e dados perdidos, essas coisas. Dependendo do tamanho do disco, isso poderia demorar v\u00e1rios minutos ou at\u00e9 horas\u2026<\/p>\n<p>Com os sistemas de arquivos mais modernos isso n\u00e3o acontece. Exemplo: ext3, ext4, XFS, ReiserFS, brtfs, entre outros. Todos esses sistemas de arquivos possuem uma funcionalidade muito \u00fatil chamada de journaling, uma esp\u00e9cie de meu querido di\u00e1rio. Com o journaling, as opera\u00e7\u00f5es do sistema de arquivos s\u00e3o gravadas em um log, antes de come\u00e7ar e depois que acabou a opera\u00e7\u00e3o. Assim, se algo falhar no caminho, o sistema de arquivos l\u00ea o log e sabe exatamente como consertar ou refazer (ou n\u00e3o fazer). Isso evita termos que ficar esperando uma verifica\u00e7\u00e3o completa em todo o sistema de arquivos\u2026.<\/p>\n<p>Mas mesmo assim, pode acontecer algum erro! E nesse caso, a verifica\u00e7\u00e3o se torna necess\u00e1ria. \u00c0s vezes \u00e9 at\u00e9 bom fazer uma verifica\u00e7\u00e3o, depois de alguns anos rodando\u2026 Assim voc\u00ea pode at\u00e9 encontrar alguma falha e corrig\u00ed-la antes de dar algum problema.<\/p>\n<p>Muitas vezes os administradores possuem m\u00e1quinas que funcionam apenas como servidores. Essas m\u00e1quinas geralmente ficam ali encostadas, sem ningu\u00e9m mexer, sem monitor, teclado, ou mouse. Depois de configuradas corretamente, podem ser muito bem usadas via acesso remoto (SSH), ent\u00e3o n\u00e3o importa o estado dela. Isso \u00e9 verdade principalmente em cloud computing e servidores dedicados em data centers externos, onde o acesso f\u00edsico a m\u00e1quina \u00e9 inexistente aos administradores.<\/p>\n<p>Se acontecer alguma coisa com o sistema de arquivos por acaso\u2026 Se o faxineiro que n\u00e3o entende de nada resolve desligar a m\u00e1quina porque parece que n\u00e3o est\u00e1 sendo usada? E se a energia cair? Quando o Linux voltar, o sistema de arquivos dele pode estar corrompido, e ent\u00e3o come\u00e7ar a fazer uma verifica\u00e7\u00e3o completa (no caso dos sistemas de arquivos mais antigos)\u2026<\/p>\n<p>\u00c9 a\u00ed que entra o fsck e o nosso assunto (auto-fsck)!<br \/>\n<strong>Verificando automaticamente na inicializa\u00e7\u00e3o (gen\u00e9rico)<\/strong><\/p>\n<p>Precisamos fazer com que o sistema verifique o disco sem a interven\u00e7\u00e3o do usu\u00e1rio, toda vez que ele for desligado de forma incorreta. Para fazer isso, usamos o comando fsck e alguns macetes divertidos. Podemos at\u00e9 usar esses m\u00e9todos para, de vez em quando, programar uma verifica\u00e7\u00e3o ap\u00f3s um reboot esperado.<\/p>\n<p>Primeiro vamos ao m\u00e9todo gen\u00e9rico, que acredito que funcione em todas as distribui\u00e7\u00f5es. Toda vez que o Linux \u00e9 iniciado e monta suas parti\u00e7\u00f5es, ele verifica se o disco foi desmontado da \u00faltima vez de forma correta ou n\u00e3o. Dependendo da severidade, ele faz a verifica\u00e7\u00e3o completa ou n\u00e3o. Para for\u00e7ar a verifica\u00e7\u00e3o no pr\u00f3ximo boot, independente dele ser considerado bom ou n\u00e3o, \u00e9 s\u00f3 criar um arquivo assim:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\"> touch \/forcefsck <\/pre>\n<p>Com o arquivo \/forcefsck, no pr\u00f3ximo boot a parti\u00e7\u00e3o raiz (\/) ser\u00e1 verificada automaticamente, independente de ter desligado natoralmente ou n\u00e3o. Note que para cada parti\u00e7\u00e3o criada, voc\u00ea pode for\u00e7ar a verifica\u00e7\u00e3o de cada uma. Por exemplo, se meu sistema tem as parti\u00e7\u00f5es:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n\/dev\/sda1 no \/boot\r\n\/dev\/sda2 no \/\r\n\/dev\/sda3 no \/home\r\n<\/pre>\n<p>Ent\u00e3o, pra verificar todos os sistemas de arquivos, eu crio um arquivo para cada parti\u00e7\u00e3o:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\ntouch \/boot\/forcefsck\r\ntouch \/forcefsck\r\ntouch \/home\/forcefsck\r\n<\/pre>\n<p>Ah, mas mesmo assim o sistema pode ter erros cabeludos e necessitar que um usu\u00e1rio com acesso \u00e0 console e teclado diga ao sistema para corrigir os erros. Para solucionar isso, a gente deve dizer ao fsck para corrigir tudo automaticamente e sem interven\u00e7\u00f5es, criando outro arquivo assim:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\necho '-p' &gt; \/fsckoptions\r\n<\/pre>\n<p>O par\u00e2metro -p, de acordo com a p\u00e1gina de manual do fsck diz ao programa para corrigir todos os erros automaticamente. O comando acima colocou um -p dentro do arquivo \/fsckoptions, que ser\u00e1 lido pelo fsck no pr\u00f3ximo boot. Dessa forma a verifica\u00e7\u00e3o na parti\u00e7\u00e3o raiz vai ser feita de forma totalmente autom\u00e1tica, mesmo encontrando aquele pau gozado de sistema de arquivos que costuma dar nas piores horas.<\/p>\n<p>Criando esses arquivos, a verifica\u00e7\u00e3o fica sempre autom\u00e1tica! Legal n\u00e3o?<\/p>\n<p><strong>N\u00e3o! <\/strong>Isso quer dizer que vamos ter que esperar essa verifica\u00e7\u00e3o toda vez que o Linux for iniciado, mesmo ele tendo sido desligado corretamente. As distribui\u00e7\u00f5es mais modernas apagam o arquivo forcefsck logo depois que a verifica\u00e7\u00e3o foi feita for\u00e7adamente e \u00e9 uma boa para fazer uma verifica\u00e7\u00e3o programada em um pr\u00f3ximo reboot. Mas e pra deixar isso autom\u00e1tico?<\/p>\n<p>A solu\u00e7\u00e3o gen\u00e9rica para este problema \u00e9 colocar os dois comandos citados acima, que criam os arquivos forcefsck e fsckoptions em um arquivo de inicializa\u00e7\u00e3o. No RHEL\/Fedora seria no \/etc\/rc.d\/rc.local, e no Debian\/Ubuntu seria no \/etc\/rc.local. Depois basta colocar dois comandos de remo\u00e7\u00e3o dos arquivos na hora de desligar o sistema. Em outras palavras:<\/p>\n<p><strong>Na inicializa\u00e7\u00e3o:<\/strong><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\t\r\n#!\/bin\/bash\r\ntouch \/forcefsck\r\necho '-p' &gt; \/fsckoptions\r\n<\/pre>\n<p>E ao reiniciar\/desligar a m\u00e1quina:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n#!\/bin\/bash\r\nrm -f \/forcefsck\r\nrm -f \/fsckoptions\r\n<\/pre>\n<p>Com esses comandos nos lugares certos, toda vez que o sistema for iniciado, ele vai criar os dois arquivos. Mas se o sistema for reiniciado ou desligado corretamente, no processo de desligamento estes arquivos ser\u00e3o removidos, e no pr\u00f3ximo boot a verifica\u00e7\u00e3o n\u00e3o ocorrer\u00e1. Caso ele desligue ou reinicie abruptamente, os comandos de remo\u00e7\u00e3o n\u00e3o ir\u00e3o ocorrer e os arquivos estar\u00e3o l\u00e1 na pr\u00f3xima inicializa\u00e7\u00e3o, for\u00e7ando a verifica\u00e7\u00e3o.<\/p>\n<p>Nota: Aqui no Devin temos tutoriais de como incluir comandos\/servi\u00e7os na inicializa\u00e7\u00e3o e desligamento. Confira nos artigos: Scripts Init no Linux \u2013 Parte 1 e Upstart \u2013 Scripts Init no Linux \u2013 Parte 2.<\/p>\n<p>O script dos comandos de reinicializa\u00e7\u00e3o\/desligamento podem ser colocados como um link simb\u00f3lico no sistema tradicional de init (SystemV). Supondo que o arquivo seja o <strong>\/usr\/local\/bin\/apagar-arquivos-fsck<\/strong>, execute o comando como root:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n# permiss\u00e3o de execu\u00e7\u00e3o para o script\r\nchmod 755 \/usr\/local\/bin\/apagar-arquivos-fsck\r\n\r\n# link simbolico para executar o script no desligamento:\r\nln -s \/usr\/local\/bin\/apagar-arquivos-fsck \/etc\/rc0.d\/K99apagar-arquivos-fsck\r\n# link simbolico na reinicializa\u00e7\u00e3o\r\nln -s \/usr\/local\/bin\/apagar-arquivos-fsck \/etc\/rc6.d\/K99apagar-arquivos-fsck\r\n<\/pre>\n<p><strong>Usando a automatiza\u00e7\u00e3o das distribui\u00e7\u00f5es<\/strong><br \/>\n<strong>Agora o m\u00e9todo usado pelas distribui\u00e7\u00f5es!<\/strong><\/p>\n<p>Para fazer o mesmo processo descrito acima em sistemas RHEL\/Fedora, basta apenas criar o arquivo \/etc\/sysconfig\/autofsck com o conte\u00fado:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nAUTOFSCK_TIMEOUT=5\r\nAUTOFSCK_DEF_CHECK=yes\r\nAUTOFSCK_OPT=&quot;-p&quot;\r\n<\/pre>\n<p>Assim o padr\u00e3o para quando o sistema for desligado incorretamente ser\u00e1 fazer a verifica\u00e7\u00e3o com o fsck (AUTOFSCK_DEF_CHECK), com a op\u00e7\u00e3o -p (AUTOFSCK_OPT). \u00c9 s\u00f3 salvar este arquivo que as modifica\u00e7\u00f5es j\u00e1 entram em vigor.<\/p>\n<p>Em sistemas Debian\/Ubuntu, basta editar o arquivo \/etc\/default\/rcS e configura a seguinte vari\u00e1vel:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\t\r\nFSCKFIX=yes\r\n<\/pre>\n<p>Dessa forma, ele vai usar a op\u00e7\u00e3o -p para n\u00e3o necessitar de interven\u00e7\u00e3o manual.<br \/>\n<strong>Configura\u00e7\u00f5es do sistema de arquivos com o tune2fs<\/strong><\/p>\n<p>Antes de acabar o artigo, uma informa\u00e7\u00e3o relacionada muito interessante, um b\u00f4nus! Todo sistema de arquivo tem seus metadados, que podem ser considerados suas configura\u00e7\u00f5es. Essas configura\u00e7\u00f5es incluem coisas como: nome e label do volume, tamanho do inode, tamanho dos blocos, quantidade de blocos reservados pro root, quando foi criado, montado ou modificado, qual as funcionalidades suportadas, tipo de journal, e muito mais.<\/p>\n<p>Para visualizar, usamos o comando tune2fs. Por exemplo, minha parti\u00e7\u00e3o \/boot aqui na m\u00e1quina:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n[eitch@tyrion ~]$ sudo tune2fs -l \/dev\/sda1\r\n  \r\ntune2fs 1.42.5 (29-Jul-2012)\r\nFilesystem volume name:   &lt;none&gt;\r\nLast mounted on:          \/boot\r\nFilesystem UUID:          ac4fbd99-d6d6-4cbc-8544-2f67d5374eae\r\nFilesystem magic number:  0xEF53\r\nFilesystem revision #:    1 (dynamic)\r\nFilesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize\r\nFilesystem flags:         signed_directory_hash\r\nDefault mount options:    user_xattr acl\r\nFilesystem state:         clean\r\nErrors behavior:          Continue\r\nFilesystem OS type:       Linux\r\nInode count:              128016\r\nBlock count:              512000\r\nReserved block count:     25600\r\nFree blocks:              385569\r\nFree inodes:              127646\r\nFirst block:              1\r\nBlock size:               1024\r\nFragment size:            1024\r\nReserved GDT blocks:      256\r\nBlocks per group:         8192\r\nFragments per group:      8192\r\nInodes per group:         2032\r\nInode blocks per group:   254\r\nRAID stride:              4\r\nRAID stripe width:        4\r\nFlex block group size:    16\r\nFilesystem created:       Fri Mar 15 10:15:28 2013\r\nLast mount time:          Wed Sep 25 04:19:17 2013\r\nLast write time:          Wed Sep 25 04:19:17 2013\r\nMount count:              150\r\nMaximum mount count:      -1\r\nLast checked:             Fri Mar 15 10:15:28 2013\r\nCheck interval:           0 (&lt;none&gt;)\r\nLifetime writes:          136 MB\r\nReserved blocks uid:      0 (user root)\r\nReserved blocks gid:      0 (group root)\r\nFirst inode:              11\r\nInode size:               128\r\nJournal inode:            8\r\nDefault directory hash:   half_md4\r\nDirectory Hash Seed:      adab03b5-9415-4563-9c05-715bb172a70c\r\nJournal backup:           inode blocks\r\n[eitch@tyrion ~]$ sudo tune2fs -l \/dev\/sda1\r\ntune2fs 1.42.5 (29-Jul-2012)\r\nFilesystem volume name:   &lt;none&gt;\r\nLast mounted on:          \/boot\r\nFilesystem UUID:          ac4fbd99-d6d6-4cbc-8544-2f67d5374eae\r\nFilesystem magic number:  0xEF53\r\nFilesystem revision #:    1 (dynamic)\r\nFilesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize\r\nFilesystem flags:         signed_directory_hash\r\nDefault mount options:    user_xattr acl\r\nFilesystem state:         clean\r\nErrors behavior:          Continue\r\nFilesystem OS type:       Linux\r\nInode count:              128016\r\nBlock count:              512000\r\nReserved block count:     25600\r\nFree blocks:              385569\r\nFree inodes:              127646\r\nFirst block:              1\r\nBlock size:               1024\r\nFragment size:            1024\r\nReserved GDT blocks:      256\r\nBlocks per group:         8192\r\nFragments per group:      8192\r\nInodes per group:         2032\r\nInode blocks per group:   254\r\nRAID stride:              4\r\nRAID stripe width:        4\r\nFlex block group size:    16\r\nFilesystem created:       Fri Mar 15 10:15:28 2013\r\nLast mount time:          Wed Sep 25 04:19:17 2013\r\nLast write time:          Wed Sep 25 04:19:17 2013\r\nMount count:              150\r\nMaximum mount count:      -1\r\nLast checked:             Fri Mar 15 10:15:28 2013\r\nCheck interval:           0 (&lt;none&gt;)\r\nLifetime writes:          136 MB\r\nReserved blocks uid:      0 (user root)\r\nReserved blocks gid:      0 (group root)\r\nFirst inode:              11\r\nInode size:               128\r\nJournal inode:            8\r\nDefault directory hash:   half_md4\r\nDirectory Hash Seed:      adab03b5-9415-4563-9c05-715bb172a70c\r\nJournal backup:           inode blocks\r\n<\/pre>\n<p>As informa\u00e7\u00f5es interessantes para n\u00f3s nesse momento, relacionadas \u00e0 verifica\u00e7\u00e3o de disco s\u00e3o essas:<\/p>\n<p>    <strong>Mount count:<\/strong> Quando esse sistema de arquivos for montado essa quantidade de vezes, na pr\u00f3xima vez ele for\u00e7a uma verifica\u00e7\u00e3o. No exemplo anterior, depois que eu montar 150 vezes a parti\u00e7\u00e3o \/boot, na vez n\u00famero 151 ele vai for\u00e7ar a verifica\u00e7\u00e3o e recome\u00e7ar a contagem. 0 ou -1 significa nunca for\u00e7ar.<br \/>\n    <strong>Check interval:<\/strong> De quanto em quanto tempo ele for\u00e7a a verifica\u00e7\u00e3o. O n\u00famero mostrado est\u00e1 em dias. 0 (no exemplo) ou -1 significa nunca for\u00e7ar.<\/p>\n<p>Pra configurar esses par\u00e2metros, basta usar o mesmo tune2fs, assim:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\t\r\n# configura para for\u00e7ar a verifica\u00e7\u00e3o a cada 50 montagens\r\ntune2fs -c 50 \/dev\/sda1\r\n \r\n# configura para for\u00e7ar a verifica\u00e7\u00e3o a cada 30 dias\r\ntune2fs -i 30 \/dev\/sda1\r\n \r\n# configura para for\u00e7ar a veririca\u00e7\u00e3o a cada 3 meses (repare o 'm' no numero)\r\ntune2fs -i 3m \/dev\/sda1\r\n \r\n# configura para nunca for\u00e7ar a verifica\u00e7\u00e3o!\r\ntune2fs -c 0 \/dev\/sda1\r\ntune2fs -i 0 \/dev\/sda1\r\n<\/pre>\n<p>Interessante, n\u00e3o? :)<br \/>\n&#8211; See more at: http:\/\/www.devin.com.br\/auto-fsck\/#sthash.1Rf83v4l.dpuf<\/p>\n<p>Cr\u00e9ditos: http:\/\/www.devin.com.br<\/p>\n","protected":false},"excerpt":{"rendered":"<p>N\u00e3o importa que sistema ou distribui\u00e7\u00e3o Linux voc\u00ea esteja usando, sempre h\u00e1 um sistema de arquivos armazenando os seus dados. H\u00e1 alguns anos atr\u00e1s, os sistemas de arquivos (ou filesystems, em ingl\u00eas) n\u00e3o eram t\u00e3o modernos e precisam de alguns cuidados. Por exemplo: ao usar&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/posts\/773"}],"collection":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=773"}],"version-history":[{"count":9,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/posts\/773\/revisions"}],"predecessor-version":[{"id":782,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=\/wp\/v2\/posts\/773\/revisions\/782"}],"wp:attachment":[{"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=773"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=773"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.abratel.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=773"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}