                    FreeBSD e Dispositivos de Estado Solido

  John Kozubik

       <john@kozubik.com>
     

   Revisao: 02bdf1876c

   Copyright (c) 2001, 2009 Projeto de Documentac,ao do FreeBSD

   FreeBSD is a registered trademark of the FreeBSD Foundation.

   Many of the designations used by manufacturers and sellers to distinguish
   their products are claimed as trademarks. Where those designations appear
   in this document, and the FreeBSD Project was aware of the trademark
   claim, the designations have been followed by the "(TM)" or the "(R)"
   symbol.

   Copyright

   Redistribution and use in source (XML DocBook) and 'compiled' forms (XML,
   HTML, PDF, PostScript, RTF and so forth) with or without modification, are
   permitted provided that the following conditions are met:

    1. Redistributions of source code (XML DocBook) must retain the above
       copyright notice, this list of conditions and the following disclaimer
       as the first lines of this file unmodified.

    2. Redistributions in compiled form (transformed to other DTDs, converted
       to PDF, PostScript, RTF and other formats) must reproduce the above
       copyright notice, this list of conditions and the following disclaimer
       in the documentation and/or other materials provided with the
       distribution.

  Importante:

   THIS DOCUMENTATION IS PROVIDED BY THE FREEBSD DOCUMENTATION PROJECT "AS
   IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD DOCUMENTATION
   PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

   2018-09-09 12:48:32 +0000 por Edson Brandi.
   Resumo

   Este artigo aborda o uso de dispositivos de disco de estado solido no
   FreeBSD para criar sistemas embarcados.

   Os sistemas embarcados tem a vantagem de uma maior estabilidade devido `a
   ausencia de partes moveis (discos rigidos). No entanto, e preciso ter em
   conta que o espac,o disponivel em disco e geralmente baixo no sistema e a
   durabilidade do meio de armazenamento.

   Topicos especificos a serem abordados incluem os tipos e atributos das
   midia de estado solido adequadas para uso como disco no FreeBSD, opc,oes
   de kernel que sao de interesse em tal ambiente, os mecanismos
   rc.initdiskless que automatizam a inicializac,ao de tais sistemas e a
   necessidade de sistemas de arquivos read-only e a construc,ao de sistemas
   de arquivos a partir do zero. O artigo sera concluido com algumas
   estrategias gerais para ambientes FreeBSD pequenos e read-only .

   [ Documento HTML em partes / Documento HTML completo ]

     ----------------------------------------------------------------------

   Indice

   1. Dispositivos de Disco de Estado Solido

   2. Opc,oes do Kernel

   3. O Subsistema rc e os Sistemas de Arquivos Read-Only

   4. Construindo um sistema de arquivos a partir do zero

   5. Estrategias do Sistema para Ambientes Pequenos e Somente Leitura

1. Dispositivos de Disco de Estado Solido

   O escopo deste artigo sera limitado a dispositivos de disco de estado
   solido feitos de memoria flash. A memoria flash e uma memoria de estado
   solido (sem partes moveis) que e nao volatil (a memoria mantem os dados
   mesmo depois de todas as fontes de energia terem sido desconectadas). A
   memoria flash pode suportar um enorme choque fisico e e razoavelmente
   rapida (as soluc,oes de memoria flash abordadas neste artigo sao um pouco
   mais lentas que um disco rigido EIDE para operac,oes de gravac,ao e muito
   mais rapidas para operac,oes de leitura). Um aspecto muito importante da
   memoria flash, cujas ramificac,oes serao discutidas mais adiante neste
   artigo, e que cada setor tem uma capacidade limitada de reescrita. Voce so
   pode gravar, apagar e gravar novamente em um setor de memoria flash um
   certo numero de vezes antes que o setor fique permanentemente
   inutilizavel. Embora muitos produtos de memoria flash mapeiam
   automaticamente os blocos defeituosos, e embora alguns ate distribuam
   operac,oes de gravac,ao uniformemente por toda a unidade, a verdade e que
   existe um limite para a quantidade de escrita que pode ser feita no
   dispositivo. Unidades competitivas possuem entre 1.000.000 e 10.000.000
   gravac,oes por setor em suas especificac,oes. Este valor varia com `a
   temperatura do ambiente.

   Especificamente, estaremos discutindo unidades compact-flash compativeis
   com ATA, as quais sao bastante populares como midia de armazenamento para
   cameras digitais. De particular interesse e o fato de que eles sao fixados
   diretamente no barramento IDE e sao compativeis com o conjunto de comandos
   ATA. Portanto, com um adaptador muito simples e de baixo custo, esses
   dispositivos podem ser conectados diretamente a um barramento IDE em um
   computador. Uma vez implementado desta maneira, sistemas operacionais como
   o FreeBSD veem o dispositivo como um disco rigido normal (embora pequeno).

   Outras soluc,oes de disco de estado solido existem, mas seu custo,
   obscuridade e relativa dificuldade de uso os colocam alem do escopo deste
   artigo.

2. Opc,oes do Kernel

   Algumas opc,oes do kernel sao de interesse especifico para aqueles que
   criam sistemas FreeBSD embarcados.

   Todos os sistemas embarcados FreeBSD que usam memoria flash como disco
   para o sistema estarao interessados &#8203;&#8203;em usar discos em
   memoria e sistemas de arquivos em memoria. Devido ao numero limitado de
   gravac,oes que podem ser feitas na memoria flash, o disco e os sistemas de
   arquivos no disco provavelmente serao montados como read-only. Nesse
   ambiente, sistemas de arquivos tais como /tmp e /var sao montados como
   sistemas de arquivos em memoria para permitir que o sistema crie logs e
   atualize contadores e arquivos temporarios. Os sistemas de arquivos em
   memoria sao um componente critico para uma implementac,ao bem-sucedida do
   FreeBSD em dispositivos de estado solido.

   Voce deve ter certeza de que as seguintes linhas existem no seu arquivo de
   configurac,ao do kernel:

 options         MFS             # Memory Filesystem
 options         MD_ROOT         # md device usable as a potential root device
 pseudo-device   md              # memory disk

3. O Subsistema rc e os Sistemas de Arquivos Read-Only

   A inicializac,ao pos-boot de um sistema FreeBSD embarcado e controlada por
   /etc/rc.initdiskless.

   O /etc/rc.d/var monta o /var como um sistema de arquivos em memoria, cria
   uma lista configuravel de diretorios em /var com o comando mkdir(1) e
   altera os modos em alguns desses diretorios. Na execuc,ao do
   /etc/rc.d/var, uma outra variavel rc.conf entra em jogo - varsize. Uma
   partic,ao /var e criada por /etc/rc.d/var baseado no valor desta variavel
   em rc.conf:

 varsize=8192

   Lembre-se de que esse valor e informado em setores, por padrao.

   O fato do /var ser um sistema de arquivos read-write e uma distinc,ao
   importante, pois a partic,ao / (e quaisquer outras partic,oes que voce
   possa ter em sua midia flash) deve ser montada como read-only. Lembre-se
   que em Sec,ao 1, "Dispositivos de Disco de Estado Solido" detalhamos as
   limitac,oes da memoria flash - especificamente a capacidade de gravac,ao
   limitada. A importancia de nao montar sistemas de arquivos em midia flash
   em modo read-write, e a importancia de nao usar um arquivo de swap, nao
   pode ser exagerado. Um arquivo de swap em um sistema ocupado pode
   inutilizar uma midia flash em menos de um ano. Criac,ao de log pesado ou
   criac,ao e destruic,ao de arquivos temporarios podem fazer o mesmo.
   Portanto, alem de remover a entrada swap do seu /etc/fstab, voce tambem
   deve alterar o campo Options para cada sistema de arquivos para ro como
   segue:

 # Device                Mountpoint      FStype  Options         Dump    Pass#
 /dev/ad0s1a             /               ufs     ro              1       1

   Alguns aplicativos no sistema comec,arao a falhar imediatamente como
   resultado desta alterac,ao. Por exemplo, o cron nao sera executado
   corretamente como resultado da falta de crontabs no /var criado pelo
   /etc/rc.d/var, o syslog e o dhcp tambem irao encontrar problemas como
   resultado do sistema de arquivos estar em modo read-only e dos itens
   ausentes no /var que o /etc/rc.d/var criou. Estes sao apenas problemas
   temporarios, embora sejam abordados, juntamente com soluc,oes para a
   execuc,ao de outros pacotes de software comuns em Sec,ao 5, "Estrategias
   do Sistema para Ambientes Pequenos e Somente Leitura".

   Uma coisa importante para lembrar e que um sistema de arquivos que foi
   montado como read-only com o /etc/fstab pode ser colocado em modo
   read-write a qualquer momento, executando o comando:

 # /sbin/mount -uw partition

   e pode ser alternado de volta para somente leitura com o comando:

 # /sbin/mount -ur partition

4. Construindo um sistema de arquivos a partir do zero

   Como os cartoes Compact Flash compativeis com ATA sao vistos pelo FreeBSD
   como discos rigidos IDE normais, voce poderia teoricamente instalar o
   FreeBSD a partir da rede usando o os disquetes do kern e mfsroot ou de um
   CD.

   No entanto, mesmo uma pequena instalac,ao do FreeBSD utilizando
   procedimentos normais de instalac,ao pode produzir um sistema com tamanho
   maior que 200 megabytes. Como a maioria das pessoas usara dispositivos de
   memoria flash menores (128 megabytes sao considerados razoavelmente
   grandes - 32 ou ate mesmo 16 megabytes sao comuns), uma instalac,ao usando
   mecanismos normais nao sera possivel - simplesmente nao ha espac,o em
   disco suficiente nem para as menores instalac,oes convencionais.

   A maneira mais facil de superar essa limitac,ao de espac,o e instalar o
   FreeBSD usando meios convencionais em um disco rigido normal. Apos a
   conclusao da instalac,ao, reduza o sistema operacional para um tamanho que
   caiba na midia flash e compacte o sistema de arquivos inteiro com o tar.
   Os passos seguintes irao guia-lo atraves do processo de preparac,ao de uma
   parte da memoria flash para o seu sistema de arquivos compactado com o
   tar. Lembre-se de que nao estamos executando uma instalac,ao normal, logo
   as operac,oes como particionamento, criac,ao dos labels, criac,ao do
   sistema de arquivos, etc. precisam ser executadas manualmente. Alem dos
   disquetes do kern e mfsroot, voce tambem precisara usar o disquete do
   fixit.

    1. Particionando seu Dispositivo de Midia Flash

       Apos inicializar com os disquetes do kern e mfsroot, escolha custom no
       menu de instalac,ao. No menu de instalac,ao personalizada, escolha
       partition. No menu de partic,oes, voce deve apagar todas as partic,oes
       existentes usando a tecla d. Depois de excluir todas as partic,oes
       existentes, crie uma partic,ao usando a tecla c e aceite o valor
       padrao para o tamanho da partic,ao. Quando perguntado sobre o tipo da
       partic,ao, certifique-se de que o valor esteja configurado para 165.
       Agora escreva esta tabela de partic,oes no disco pressionando w (esta
       e uma opc,ao oculta nesta tela). Se voce estiver usando um cartao
       compact flash compativel com ATA, devera escolher o FreeBSD Boot
       Manager. Agora pressione q para sair do menu de partic,oes. Voce vera
       novamente o menu do gerenciador de inicializac,ao - repita a escolha
       feita anteriormente.

    2. Criando Sistemas de Arquivos em seu Dispositivo de Memoria Flash

       Saia do menu de instalac,ao personalizada e, no menu de instalac,ao
       principal, escolha a opc,ao fixit. Depois de entrar no ambiente do
       fixit, digite o seguinte comando:

 # disklabel -e /dev/ad0c

       Neste ponto, voce tera entrado no editor vi sob os auspicios do
       comando disklabel. Em seguida, voce precisa adicionar uma linha a: no
       final do arquivo. Esta linha a: deve ser semelhante a linha abaixo:

 a:      123456  0       4.2BSD  0       0

       Onde 123456 e um numero o qual e exatamente o mesmo que o numero
       existente na entrada c: para o tamanho. Basicamente, voce esta
       duplicando a linha c: existente como uma linha a:, certifique-se de
       que o fstype seja 4.2BSD. Salve o arquivo e saia.

 # disklabel -B -r /dev/ad0c
 # newfs /dev/ad0a

    3. Colocando seu Sistema de Arquivos na Midia Flash

       Monte a midia flash recem-preparada:

 # mount /dev/ad0a /flash

       Coloque esta maquina na rede para que possamos transferir nosso
       arquivo tar e extrai-lo em nosso sistema de arquivos de midia flash.
       Um exemplo de como fazer isso e:

 # ifconfig xl0 192.168.0.10 netmask 255.255.255.0
 # route add default 192.168.0.1

       Agora que a maquina esta na rede, transfira seu arquivo tar. Voce pode
       se deparar com um pequeno dilema neste ponto - se a sua memoria flash
       tiver por exemplo 128 megabytes, e seu arquivo tar for maior que 64
       megabytes, voce nao podera ter o seu arquivo tar na midia flash ao
       mesmo tempo em que realiza a descompressao - voce ficara sem espac,o.
       Uma soluc,ao para esse problema, se voce estiver usando FTP, e
       descompactar o arquivo enquanto ele e transferido por FTP. Se voce
       realizar sua transferencia desta maneira, voce nunca tera o arquivo
       tar e o conteudo do tar em seu disco ao mesmo tempo:

 ftp> get tarfile.tar "| tar xvf -"

       Se o seu arquivo tar estiver gzipado, voce pode fazer isso tambem:

 ftp> get tarfile.tar "| zcat | tar xvf -"

       Depois que o conteudo do seu sistema de arquivos compactado pelo tar
       estiver no sistema de arquivos da sua memoria flash, voce podera
       desmontar a memoria flash e reinicializar:

 # cd /
 # umount /flash
 # exit

       Assumindo que voce configurou seu sistema de arquivos corretamente
       quando ele foi construido no disco rigido normal (com seus sistemas de
       arquivos montado como read-only, e com as opc,oes necessarias
       compiladas no kernel) voce agora deve inicializar com sucesso seu
       sistema embarcado FreeBSD.

5. Estrategias do Sistema para Ambientes Pequenos e Somente Leitura

   Em Sec,ao 3, "O Subsistema rc e os Sistemas de Arquivos Read-Only", foi
   apontado que o sistema de arquivos /var construido pelo /etc/rc.d/var e a
   presenc,a de um sistema de arquivos raiz read-only causa problemas com
   muitos pacotes de software comuns usados &#8203;&#8203;com o FreeBSD.
   Neste artigo, serao fornecidas sugestoes para a execuc,ao bem-sucedida do
   cron, do syslog, instalac,oes de ports e do servidor Web Apache.

  5.1. Cron

   Na inicializac,ao, o /var e preenchido pelo /etc/rc.d/var usando a lista
   disponivel em /etc/mtree/BSD.var.dist, entao o cron, o cron/tabs, at, e
   alguns outros diretorios padroes sao criados.

   No entanto, isso nao resolve o problema de manter as crontabs entre nas
   reinicializac,oes. Quando o sistema for reinicializado, o sistema de
   arquivos /var que esta na memoria desaparecera e todas as crontabs que
   voce tenha nele tambem desaparecerao. Portanto, uma soluc,ao seria criar
   crontabs para os usuarios que precisam delas, montar seu sistema de
   arquivos / como read-write e copiar estas crontabs para algum lugar
   seguro, como /etc/tabs, em seguida, adicione uma linha ao final do
   /etc/rc.initdiskless que copie estes crontabs para /var/cron/tabs depois
   que o diretorio for criado durante inicializac,ao do sistema. Voce tambem
   pode precisar adicionar uma linha que altere modos e permissoes nos
   diretorios criados e nos arquivos copiados com /etc/rc.initdiskless.

  5.2. Syslog

   O syslog.conf especifica os locais de certos arquivos de log que existem
   em /var/log. Esses arquivos nao sao criados pelo /etc/rc.d/var na
   inicializac,ao do sistema. Portanto, em algum lugar do /etc/rc.d/var, logo
   apos a sec,ao que cria os diretorios em /var, voce precisara adicionar
   algo como isto:

 # touch /var/log/security /var/log/maillog /var/log/cron /var/log/messages
 # chmod 0644 /var/log/*

  5.3. Instalac,ao de Ports

   Antes de discutir as alterac,oes necessarias para usar com exito a arvore
   de ports, e necessario um lembrete sobre a natureza read-only dos seus
   sistemas de arquivos na midia flash. Como eles sao read-only, voce
   precisara monta-los temporariamente para read-write usando a sintaxe de
   montagem mostrada em Sec,ao 3, "O Subsistema rc e os Sistemas de Arquivos
   Read-Only". Voce sempre deve remontar esses sistemas de arquivos no modo
   read-only quando tiver terminado qualquer manutenc,ao - gravac,oes
   desnecessarias na midia flash podem reduzir consideravelmente sua vida
   util.

   Para tornar possivel entrar em um diretorio do ports e executar com
   sucesso o comando make install, devemos criar um diretorio de pacotes em
   um sistema de arquivos que nao esteja localizado na memoria o qual mantera
   o controle dos nossos pacotes entre as reinicializac,oes . Como e
   necessario montar seus sistemas de arquivos como read-write para a
   instalac,ao de um pacote, e sensato supor que uma area na midia flash
   tambem possa ser usada para que as informac,oes do pacote sejam gravadas.

   Primeiro, crie o diretorio do banco de dados de pacotes. Ele fica
   normalmente em /var/db/pkg, mas nao podemos coloca-lo la, pois ele ira
   desaparecer toda vez que o sistema for inicializado.

 # mkdir /etc/pkg

   Agora, adicione uma linha ao arquivo /etc/rc.d/var que vincule o /etc/pkg
   ao /var/db/pkg. Um exemplo:

 # ln -s /etc/pkg /var/db/pkg

   Agora, sempre que montar seus sistemas de arquivos como read-write e
   instalar um pacote, o make install funcionara e as informac,oes do pacote
   serao gravadas com exito em /etc/pkg (porque o sistema de arquivos sera,
   naquele momento, montado como read-write) que estara sempre disponivel
   para o sistema operacional como /var/db/pkg.

  5.4. Servidor Web Apache

  Nota:

   As etapas nesta sec,ao sao necessarias apenas se o Apache estiver
   configurado para gravar suas informac,oes de pid ou log fora do /var. Por
   padrao, o Apache mantem seu arquivo pid em /var/run/httpd.pid e seus
   arquivos de log em /var/log.

   Agora e assumido que o Apache mantem seus arquivos de log em um diretorio
   apache_log_dir fora do /var. Quando esse diretorio reside em um sistema de
   arquivos read-only, o Apache nao podera salvar nenhum arquivo de log e
   pode ter problemas para funcionar. Se assim for, e necessario adicionar um
   novo diretorio `a lista de diretorios em /etc/rc.d/var para criar no /var
   e vincular apache_log_dir ao /var/log/apache. Tambem e necessario definir
   permissoes e propriedade neste novo diretorio.

   Primeiro, adicione o diretorio log/apache `a lista de diretorios a serem
   criados em /etc/rc.d/var.

   Segundo, adicione estes comandos ao /etc/rc.d/var apos a sec,ao de
   criac,ao do diretorio:

 # chmod 0774 /var/log/apache
 # chown nobody:nobody /var/log/apache

   Por fim, remova o diretorio apache_log_dir existente e substitua-o por um
   link:

 # rm -rf apache_log_dir
 # ln -s /var/log/apache apache_log_dir
