A única maneira que eu vejo para fazer isso é independente do sistema de arquivos usado porque ele age na camada de bloco.
O que se deseja é um tipo de lvmcache: Clique no dispositivo e leia os metadados do sistema de arquivos ( find /path/to/mountpoint -perm 700 -printf ""
) para que ele seja copiado para o dispositivo de cache e depois congele o dispositivo de cache.
Infelizmente, parece que o lvmcache não tem essa função de congelamento.
Mas você pode fazer algo semelhante: você pode configurar um instantâneo. Você tem que fazer isso manualmente porque o LVM suporta apenas dentro de um grupo de volumes. Crie um instantâneo em um VG e dê uma olhada nos detalhes com dmsetup ls
e dmsetup table
para os dispositivos envolvidos. dmsetup
não se importa se os dispositivos envolvidos pertencem a um grupo de volumes (ou são dispositivos LVM).
Geralmente você cria um instantâneo e continua usando o dispositivo principal. O estado anterior do dispositivo principal pode ser restaurado revertendo o instantâneo porque os dados originais são gravados no instantâneo antes de serem alterados no dispositivo original. Isto não é o que você quer. Você deseja minimizar os acessos ao dispositivo de origem. Assim, você não monta o dispositivo de origem (novo), mas o dispositivo de instantâneo.
Em seguida, você modifica todos os setores que contêm metadados para que eles sejam gravados no dispositivo de instantâneo. Mesmo se você escrever duas vezes (porque você altera os dados e depois os altera de volta ao seu estado original) para que os dados em si não sejam alterados, o setor mantém parte do dispositivo de instantâneo. Isso significa que é sempre lido a partir do dispositivo de instantâneo. Em caso de falha, basta restaurar a configuração dmsetup
e o dispositivo de origem não será mais acessado por metadados.
Você pode precisar de um instantâneo bastante grande com um tamanho pequeno de cluster, no entanto. Mas você não precisa armazenar em cache todos os metadados do sistema de arquivos de uma só vez. Você pode configurar uma captura instantânea, armazenar em cache os metadados de uma árvore de diretórios, copiar todos os arquivos de lá, excluir a captura instantânea, criar uma nova e armazenar em cache os metadados da próxima subárvore. Você pode ver (IIRC com dmsetup status
) quanto do espaço do snapshot está em uso.
Para escrever os inodes, você pode alterar o registro de data e hora ( touch /path/to/file
), especialmente se não precisar do valor original. Ou você (talvez depois de escrever o valor original em algum lugar) executar, e. %código%. Para escrever todos os setores que pertencem a entradas de diretório, você pode renomear todos os arquivos (para algum nome não usado e vice-versa):
unique_suffix=4itxIIq5kyGhMVPJ
mv "$file" "${file}${unique_suffix}"
mv "${file}${unique_suffix}" "$file"
Não tenho certeza se o cache de páginas é inteligente o suficiente para detectar que não houve alteração, portanto você pode verificar se o instantâneo está realmente gravado em.
Estas operações em todos os arquivos devem ser feitas (talvez apenas para um subdiretório) com
find /path/to/mountpoint -type f -exec ... + # for chmod and mv
find /path/to/mountpoint -type d -exec ... + # for mv