Como armazenar um grande volume de arquivos pequenos

0

Vamos fazer a seguinte tarefa:

  • grande quantidade de backup (por exemplo, 500 GB) de arquivos pequenos (poucos kB até 1 MB) no linux
  • o armazenamento de backup é principalmente somente leitura
  • o armazenamento é rápido o suficiente para acessar arquivos específicos na visualização normal de diretório / arquivo, de preferência através de funções integradas ou plug-in em gerenciadores de arquivos comuns (como mc, TotalCommander (via samba))
  • o armazenamento deve ser idealmente apenas um arquivo único (capaz de ser efetivamente movido para o nas ou assim)
  • nenhuma compactação é necessária
  • adicionar arquivo (s) pode ser uma operação dispendiosa (mesmo a inicialização inicial do armazenamento)

Eu tentei o antigo tar , mas "abrir" o índice para 500G parece ser infinito - então eu provavelmente precisaria extraí-lo como um todo. Existe, por exemplo, como dd parte do sistema de arquivos em uma imagem e depois montá-lo?

Quaisquer pensamentos?

    
por sharpener 14.08.2018 / 21:11

3 respostas

1

Você pode criar um arquivo e tratá-lo como um dispositivo de bloco. Você pode precisar montá-lo manualmente.

  1. O primeiro passo é criar o "dispositivo de bloco" - você pode usar dd para fazer isso (por exemplo, dd if=/dev/zero of=/path/to/file.name bs=100M count=6000 ) ou outra ferramenta ( fallocate , truncate ).
  2. Você formata o dispositivo usando algo como mkfs.ext4 /path/to/file.name
  3. .
  4. em seguida, monte-o - mkdir /mntpoint; moint /path/to/file.name /mntpoint .
  5. Copie os arquivos para /mntpoint usando sua ferramenta preferida, por exemplo rsnapshot , rsync ou antigo cp .
  6. Desmonte quando terminar: verifique se você não está no diretório /mntpoint , umount /mntpoint .
por 14.08.2018 / 21:39
0

Eu faço em tais casos quando é necessário acesso rápido ao conteúdo de backup - backup incremental usando a opção rsync with --link-dest= .
Ele roda muito rápido, não afeta as cópias de backup anteriores que você pode ter quantas desejar e o backup não ocupa muito espaço, pois as cópias de backup são links físicos para arquivos existentes. Nesse caso, o acesso ao backup é instantâneo e a transferência real de arquivos leva alguns segundos, mesmo em uma quantidade enorme de arquivos, já que rsync copiou apenas arquivos novos.

#!/bin/sh

srcDir='/importunt/data'  # Use full path
bkpDir='/backups'         # Use full path

cd "${bkpDir}"

previousDir="$(ls -td -- */ | head -n 1 | awk -F'/' '{print $1}')"   # Get most newest directory
currentDir="$(date '+%Y-%m-%dT%H;%M;%S')"

[ -n "${previousDir}" ] && {
  rsync_opts="-aPvz --safe-links --link-dest=${bkpDir}/${previousDir} --exclude=*.mp3"
} || {
  rsync_opts="-aPvz --safe-links --exclude=*.mp3"
}

mkdir -m 770 "${currentDir}"
rsync  ${rsync_opts}  "${srcDir}" "${bkpDir}"/"${currentDir}"

Basicamente, essa solução cria instantâneos exatos no tempo, portanto a restauração de arquivos é bem fácil.

Não seja assustador se você usar du no diretório /backups quando ele mostrar um tamanho crescente em cada atualização, se você usar df , verá que o espaço real não é reduzido. É assim que os hard links contavam com o Linux e o FreeBSD, então não se preocupe. Para ter certeza de que não menti, você pode verificar o inode em algum arquivo em backup incremental com ls -i file . Você verá que o mesmo arquivo em todos os diretórios tem o mesmo inode, o que significa rsync duplicado apenas nomes de arquivos com links físicos, mas todos eles apontando para o mesmo conteúdo.

Mais uma vantagem deste método é que você pode excluir os diretórios de backup mais antigos em qualquer ordem, - mais recente, intermediária ou mais antiga.

O script acima é um exemplo simplificado. Se o conteúdo do backup incremental deve ser editado, não use o mecanismo ls -t para detectar o diretório anterior mais novo no backup, mas salve ${currentDir} em algum arquivo e restaure para ${previousDir} na chamada subsequente.

Como rsync suporta transferência acima de ssh , você pode mover o backup incremental para a máquina remota com a mesma eficiência, as únicas alterações serão sincronizadas.

    
por 15.08.2018 / 14:52
0

tar não armazena um índice conciso em um ponto no arquivo (como Zip) - em vez disso, ele declara cada entidade com os dados da entidade, portanto, o " parece ser infinito " - você precisa ler o arquivo inteiro para obter uma lista de todas as entidades dentro dele.

Se você quiser ter acesso fácil ao índice, basta capturar a saída de tar -cv e armazená-la junto com o arquivo.

tar -cv -f ./test.tar ./to_backup/ \
    > index.txt

Como alternativa, se precisar de informações extras, você pode usar tar -cT ${FILE_LIST} , que aceita uma lista de arquivos de ${FILE_LIST} . Dessa forma, você pode usar find para coletar nomes de arquivos, gravar detalhes de cada arquivo em seu " índice " e produzir o nome do arquivo para stdout para tar no arquivo.

find ./to_backup/ -type f \
    | tee index.txt \
    | tar -cT /dev/stdin \
    > ./test.tar

Sem compressão, é muito fácil adicionar arquivos a um tar archive ( tar significa " Tape Archive " ... embaralhar dados em fita é doloroso). Um formato de arquivo que tenha um índice conciso será mais difícil de adicionar arquivos em uma data posterior, embora geralmente seja possível.

    
por 15.08.2018 / 15:36