Por que recebo 3048 MB de uma memória flash de 64 MB?

4

Eu tenho um STB (set-top-box) baseado em Linux e ele possui 64 MB de memória flash e 256 MB de RAM. Eu queria fazer um backup de algumas das minhas configurações antes de fazer o flash com outra imagem, mas não sabia exatamente onde elas estavam localizadas. Eu imaginei que eu iria investigar isso mais tarde. Então decidi me conectar à caixa via FTP e baixar todos os arquivos e pastas. Dentro do cliente FTP, cliquei com o botão direito do mouse na raiz da caixa e escolhi baixá-lo para uma pasta dedicada na minha área de trabalho no Windows.

O download continuou, parecia que nunca iria parar ... mas então a conexão FTP foi terminada pelo servidor FTP (eu acho que disse no log). Acabei com 2,97 GB de dados. Como isso é possível? De onde vêm todos esses dados? ... ele não pode conter mais que 256 MB no máximo?! ...

Por que você não pode simplesmente copiar a raiz de uma máquina Linux e esperar que todos os outros arquivos e pastas sigam? Não é o mesmo que copiar o C: \ no Windows? É porque é um sistema ao vivo? ... talvez eu precise desligá-lo primeiro ou fazer logoff e interromper processos? Estava em espera na hora ...

    
por Samir 22.09.2012 / 00:27

3 respostas

7

Pelo menos 3 coisas diferentes podem explicar por que você transferiu mais dados do que poderia ter sido armazenado no STB:

  • Arquivos esparsos : os arquivos sempre parecem conter uma seqüência contínua de bytes desde o início do tempo até o comprimento atual do arquivo. Mas você pode criar um arquivo (geralmente binário) e gravar somente em determinados intervalos de byte. Nesse caso, os buracos vazios entre esses intervalos de bytes (que nunca foram gravados) parecem conter bytes de valores 0 quando lidos. Os sistemas de arquivos geralmente percebem quando o software cria esses "furos" e não os armazena no disco. Dessa forma, você pode criar um arquivo de byte de 1000000, escrever um único byte na posição 999999 e observar que o arquivo tem quase um megabyte de tamanho, mas consome apenas um único bloco de espaço em disco.

    Certos tipos de banco de dados ou arquivos de índice podem ser geralmente esparsos, se o formato do arquivo exigir que certas partes do arquivo estejam em determinados byte offsets, mas nem tudo esteja preenchido.

    As copiadoras de arquivos não podem dizer que um arquivo estava esparso no local de início, portanto, apenas leem todo o arquivo como um fluxo de bytes da fonte e gravam o mesmo fluxo de bytes no destino. Como cada byte do arquivo é gravado no destino, o sistema de arquivos do destino não cria um arquivo esparso.

    Se você suspeitar que arquivos esparsos no conjunto de dados estão causando um aumento no tamanho, experimente a opção --sparse para rsync . Ele oportunisticamente criará arquivos esparsos no destino sempre que houver grandes execuções de bytes de valores 0 na origem. (Ele não pode dizer se o arquivo de origem era realmente esparso, apenas potencialmente disperso, mas isso torna o destino escasso de qualquer maneira.)

    Seu STB provavelmente contém um banco de dados interno de algum tipo que pode ser implementado com um ou mais arquivos esparsos. Procure por arquivos muito grandes no sistema de arquivos de origem, em arquivos específicos que são maiores do que a quantidade de armazenamento no STB. Aqueles têm como escassos.

  • Coisas montadas em mais de um lugar . Sistemas embarcados como STBs frequentemente têm um layout de sistema de arquivos estranho devido ao fato de que eles podem ter uma mistura de partições somente leitura e leitura-gravação que fazem parte da distribuição de software e dos dados do usuário, respectivamente, diferentes tipos de sistemas projetados para uso em flash bruto (não dispositivos de bloco), partições de bootloader, sistemas de arquivos montados em união que permitem implementação muito fácil de recursos de redefinição de fábrica, ramdisks para sobreviver à perda de energia sem corrupção do sistema de arquivos, etc ... Como resultado, o mesmo conteúdo pode aparecer montado em vários locais independentes diferentes (por exemplo, na forma original de fábrica, como uma montagem de união, ligar montagens para outros fins ...)

    Para quebrar essa porca, o comando df pode ser útil, embora alguns fabricantes de sistemas incorporados façam coisas que são estranhas o suficiente para que não fique claro o que está acontecendo na saída df . Mas você deve pelo menos ser capaz de ver quais sistemas de arquivos existem e quão cheios eles são.

  • Links físicos : o FTP não reconhece links físicos, portanto, se você pedir para copiar dois links para o mesmo arquivo, ele copiará o arquivo duas vezes e ocupará o dobro do espaço disponível. o lado do destino. Se o arquivo tiver mais de dois links, multiplique-o de acordo.

    Para ajudar, tente a opção --hard-links do rsync.

Observe que, em dois dos três casos, recomendei que você use o rsync para copiar os arquivos. Isso só é possível se você tiver acesso shell ao STB e o rsync estiver instalado (ou você puder instalá-lo) ou se o STB oferecer rsync como um protocolo de transferência de arquivos (um STB provavelmente não oferece, mas alguns dispositivos NAS vendidos para casa use do).

Se você puder usá-lo, o rsync é uma ótima maneira de copiar grandes quantidades de dados de um sistema para outro. Não só tem opções para resolver dois dos três problemas mencionados acima (ou talvez todos os 3? Olhe para --one-file-system ), mas é muito útil para resumir uma cópia interrompida.

    
por 22.09.2012 / 01:50
4

No Windows, você não copiou apenas a unidade c: , você também copiou todos os tipos de arquivos que não são arquivos de disco, mas sim dispositivos de hardware, e você copiou alguns arquivos muitas vezes. Provavelmente incluindo todo o conteúdo do disco e um dump da RAM várias vezes.

No Linux e em outros sistemas semelhantes a unix, quase tudo é um arquivo. Além de arquivos e diretórios regulares, há links simbólicos (ponteiros para outros arquivos) e dispositivos de dispositivo que representam dispositivos de hardware (discos, partições, RAM, portas seriais, etc.). Existem também sistemas de arquivos especiais que não são armazenados em um disco, mas permitem que os aplicativos acessem dados sobre o sistema: /proc (procfs) e /sys (sysfs) .

Entre os dispositivos em /dev , existem arquivos infinitos - arquivos que você pode continuar lendo para sempre. Há /dev/zero , que contém quantos bytes nulos você deseja ler. Há também /dev/urandom , que contém quantos bytes aleatórios você quiser ler - então, para obter n bytes aleatórios, você lê n bytes de /dev/urandom .

Se você usou um programa de FTP para transferir toda a árvore do sistema de arquivos, copiou tudo e provavelmente copiou a grande quantidade de coisas que podem ser obtidas de /proc , ou mais provavelmente a quantidade infinita de dados de /dev .

Leitura adicional:

Se você tiver alguma maneira de se conectar à caixa diferente de FTP, por exemplo, uma linha de comando SSH, use-a em vez de FTP, que não sabe sobre arquivos especiais. Execute o comando df para ver quais sistemas de arquivos estão presentes. Você pode fazer um backup do sistema de arquivos raiz com o comando

rsync -a -x root@settopbox:/ settopbox.backup

(Observe a opção -x para informar ao programa rsync para não cruzar sistemas de arquivos.)

O sistema de arquivos raiz pode não ser o mais interessante para fazer backup, alguns dispositivos são configurados com um sistema de arquivos raiz somente leitura e um sistema de arquivos read-write diferente contendo configurações. Poste a saída dos comandos df e mount se precisar de ajuda para descobrir qual (is) backup (es).

Alternativamente, faça o backup da própria memória flash. Você terá que encontrar o nome do dispositivo. Experimente os seguintes comandos para procurar dispositivos de bloco, ou seja, dispositivos que correspondem a uma partição de disco ou disco ou outro dispositivo semelhante:

find /dev -type b
ls -l /dev /dev/* | grep '^b'

Se você não tiver certeza do significado dos dispositivos, poste a saída desses comandos.

    
por 22.09.2012 / 02:38
0

O motivo é porque o Linux tem algo chamado de sistema de arquivos proc .

proc é montado em /proc e representa em estruturas de dados do kernel. Um desses objetos é /proc/kcore , que é uma imagem binária do núcleo de memória do kernel. Ou seja, toda a memória em uso no sistema incluindo a memória virtual .

Aqui está um exemplo na minha estação de trabalho:

$ cat /proc/meminfo | grep MemTotal
MemTotal:        3507728 kB
$ ls -lh /proc/kcore
-r-------- 1 root root 128T 2012-09-21 17:24 /proc/kcore

Como você pode ver, eu tenho apenas 4GB de RAM. Enquanto /proc/kcore é um gritante 128TB ! Isto é significativamente mais (aproximadamente 32.000 vezes mais) de memória do que eu tenho.

    
por 22.09.2012 / 02:31