Pergunta

Como posso obter acesso bruto ao HD e saber se aquele local é utilizado ou é espaço livre?Só para dar um exemplo, posso obter um acesso direto simplesmente abrindo e lendo um dispositivo de disco, o objetivo é saber se, por exemplo, 10.000 bytes são utilizados ou não.

Foi útil?

Solução

Para acumular os cuidados...

Não se esqueça de que você precisa cooperar com as próprias disposições de segurança de thread e cache interno da pilha de drivers existente.Muitos threads no sistema podem (e irão) gravar no disco o tempo todo.Para limpar um setor livre, você precisa saber que ele é gratuito e permanecer livre enquanto você faz o que quiser.Seria ruim se você apagasse um setor que o sistema de arquivos já tivesse decidido usar, mas ainda não tivesse liberado a evidência dessa decisão para o disco, então você não teria como saber que ele estava em uso.Isso pode resultar em perda de dados, o que pode resultar em usuários indignados.

Se você puder garantir que o sistema de arquivos não está montado no momento, você poderá, pelo menos em princípio, abrir /dev/sda (provavelmente não o específico que você deseja!) e analise as estruturas de dados no disco para fazer qualquer coisa que você precise fazer.Na verdade, é assim que os utilitários gostam fsck e mkfs são implementados.

O grande problema restante é que você precisa permanecer sincronizado com todas as versões de todos os sistemas de arquivos que encontrar.Pelo menos você tem o código-fonte disponível para o próprio sistema de arquivos para referência, mas não será fácil simplesmente portá-lo do kernel para um aplicativo em modo de usuário.

Meu conselho seria usar o próprio sistema de arquivos para obter as garantias necessárias.Abra arquivos grandes e preencha-os com seus padrões de limpeza.Encha o disco até a capacidade máxima.Observe que, se isso puder ter um impacto sério em quaisquer daemons em execução que assumam que algum espaço em disco esteja disponível, talvez ainda seja necessário fazer isso em um sistema com a maioria dos daemons e outros eliminados.Se você deseja uma limpeza segura, ainda precisará se preocupar em liberar os blocos gravados no disco entre as passagens, porque tudo no sistema de arquivos normal tentará otimizar várias gravações de um único bloco.

Outras dicas

Você pode apenas open o dispositivo de bloco (por exemplo, /dev/sda) e leia os setores manualmente.No entanto, isso não dirá se está vazio ou não diretamente.Estar vazio ou não é algo definido no nível de abstração do sistema de arquivos.As estruturas de dados do sistema de arquivos armazenam esse tipo de dados e você deve ter um conhecimento profundo do sistema de arquivos específico para fazer isso a partir dos blocos brutos (sem usar nenhuma função fornecida pelo sistema de arquivos).

Muito provavelmente, você não deseja acessar o dispositivo de bloco via /dev/sd* ou /dev/hd* diretamente.Como outros afirmaram, você terá que entender o sistema de arquivos subjacente bruto, e isso será muito difícil.

Se você estiver escrevendo um aplicativo que deseja tratar bytes no disco como um grande espaço de endereço linear, verifique a chamada de sistema mmap().Você pode criar um arquivo grande e vazio no disco e usar mmap() para mapeá-lo em seu espaço de processo.A partir daí, você pode usar operações regulares de memória para ler e gravar no arquivo grande subjacente.Observe que as gravações são armazenadas em buffer, portanto, garantir a consistência pode ser complicado.

A vantagem dessa abordagem é que mesmo que o arquivo subjacente esteja fragmentado, seu(s) padrão(s) de acesso podem considerá-lo(s) como uma coleção linear de bytes.

Se quiser limpar todo o espaço livre em um sistema de arquivos, você pode preencher o sistema de arquivos com um arquivo grande cheio de zeros, sincronizá-lo com o disco e excluí-lo.Isso pode não conseguir absolutamente tudo, especialmente se você estiver lidando com um sistema de arquivos de registro ou algo semelhante, mas fará a maior parte.Se você deseja limpar o disco para que uma imagem seja compactada melhor, provavelmente isso é tudo que você precisa fazer.Se você deseja limpar o disco por motivos de segurança...bem-vindo ao mundo do desenvolvimento de kernel, por favor, vá fundo e lembre-se de usar algo resistente a chamas.

Existe um utilitário chamado zero grátis para zerar blocos livres em sistemas de arquivos ext e destina-se a imagens de VM.Lembre-se, isso não é algo que você deva fazer com um sistema de arquivos montado.Essa página também possui alguns patches antigos do kernel que podem ser um ponto de partida interessante para fazer isso em sistemas de arquivos ativos.

OH MEU DEUS.

Seu código teria que:

  1. Percorra a tabela de partições para ver em qual partição ela se enquadra.
  2. Determine que tipo de sistema de arquivos é.
  3. Para cada sistema de arquivos que você suporta, forneça uma rotina para ver se aquele byte está em uso
  4. Verifique se o sistema de arquivos está montado
  5. Se estiver, percorra os registros do kernel para descobrir se há algo ainda não gravado no disco.
  6. Ah, e se você estiver usando EXT4 ou REISER, você não pode saber a resposta da pergunta anterior, então é melhor desistir.

Se eu fosse você, reconsideraria o que você está tentando fazer.

EDITAR:vendo o comentário dele sobre o que ele realmente está tentando fazer,

  • Aceite uma partição em vez de um disco bruto
  • Exigir desmontado
  • Chame e3fsck para acumular o diário
  • Percorra cada inode, encontrando o último bloco e limpando qualquer espaço livre nesse bloco (o tamanho do arquivo deve informar onde os dados terminam no bloco)
  • Percorra os bitmaps de alocação, encontre quaisquer blocos não alocados e limpe-os
  • Agora a parte complicada: limpe o diário.
  • Boa sorte
  • Ah, e LEIA A DOCUMENTAÇÃO DO SISTEMA DE ARQUIVOS

Muito dependente de muitos fatores, como

  • tipo de sistema de arquivos
  • tipo de sistema operacional
  • tipo médio

Soluções:

Você pode utilizar as mesmas funções que o sistema de arquivos e/ou ferramentas de disco usam para verificar se um local está livre ou não.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top