Sobre o mapeamento de blocos de arquivos emmc

Sobre o mapeamento de blocos de arquivos emmc

Localizei com sucesso um arquivo no sistema de arquivos ext4. Por exemplo, o bloco inicial de 4k do arquivo "cíclico.txt" é 105441. Mas quando ele o lê diretamente do cartão emmc, o primeiro bloco emmc não está lá, mas foi alterado para 5168904. Eu apenas procuro em toda a memória emmc para obter isso, mas é muito lento. Como obter a localização real diretamente? Posso usá-lo apenas para uma operação de apagamento seguro posterior? Muito obrigado!!!

Responder1

Os números de bloco usados ​​​​por ext4 --- que você pode encontrar usando o comando "stat" do debugfs ou "filefrag -v" são números de bloco lógicos de 4k. Ou seja, estão em unidades de 4k, relativamente ao início da partição.

Se você usar um programa como fdisk ou gdisk, ele iniciará a partição em setores de 512 bytes.

Então aqui está um exemplo. Suponha que você queira encontrar a localização de /boot/vmlinuz-4.19.0-2-amd64. (Que, usando o comando "df /boot/vmlinuz-4.19.0-2-amd64", descobrimos que está localizado em /dev/nvme0n1p4 como o sistema de arquivos /boot.) Você pode descobrir os números dos blocos lógicos que estão em use várias maneiras:

  • filefrag -v /boot/vmlinuz-4.19.0-2-amd64
  • debugfs -R "extensões vmlinuz-4.19.0-2-amd64" /dev/nvme0n1p4
  • debugfs -R "stat vmlinuz-4.19.0-2-amd64" /dev/nvme0n1p4

Com qualquer um desses mecanismos, descobriremos que o arquivo está usando os números de bloco 60416-61680.

Para descobrir onde eles estão em relação ao início de /dev/nvme0n1p4, multiplique esses números de bloco por 4096 se desejar deslocamentos de bytes ou por 8 se desejar em unidades de setores de 512 bytes.

Se você quiser onde eles estão em relação ao início do dispositivo (por exemplo, /dev/nvme0n1 neste caso), você pode procurar pelo comando:

  • gato /sys/block/nvme0n1/nvme0n1p4/start

Ou você pode usar o comando gdisk e imprimir a tabela de partições. Em ambos os casos, isto lhe dará a localização inicial da partição "p4" em unidades de setores de 512 bytes.

Nota final: Às vezes as pessoas dirão números LBA quando estão falando sobre números de setor 512 usados ​​pelo kernel Linux, mas você precisa ter um pouco de cuidado. Do ponto de vista do dispositivo de armazenamento, LBA significa Logical Block Addresses e está em unidades de qualquer tamanho de bloco lógico que o dispositivo de armazenamento considere. Historicamente, para a maioria dos dispositivos, o tamanho dos dispositivos de bloco lógico de quase todos os dispositivos de armazenamento era de 512 bytes. Houve exceções, como o IBM Mainframe DASD, que tinha um tamanho de setor de 2.048 bytes, mas 512 era o padrão efetivo. Com dispositivos de armazenamento modernos, existem alguns "HDDs de formato avançado", por exemplo, que usam tamanho de bloco lógico de 4k, e se você conectar um analisador SATA entre a CPU e o HDD, verá solicitações de E/S sendo enviadas em unidades de números LBA de 4k. No entanto, o kernel do Linux assume na camada de dispositivo de bloco que todos os números estão em unidades de setores de 512 bytes, mesmo que isso possa não ser verdade no nível do driver de dispositivo. A maioria de nós não terá analisadores de barramento SCSI ou SATA em seu ambiente de trabalho, então essa distinção provavelmente não importará muito, a menos que você esteja depurando ou escrevendo um driver de dispositivo para um adaptador de barramento host. Portanto, não há nenhum dano real ao usar a terminologia "LBA" ao se referir a setores de 512 bytes. Isso é feito com muita frequência, e se você se preocupar apenas com as coisas da perspectiva do kernel do Linux e de seus utilitários de espaço de usuário, não haverá nenhum dano. No entanto, existem pessoas que gostam de ser meticulosos com essas coisas, e se você é o tipo de pessoa que gosta de acreditar que é moralmente superior, apontando quando as pessoas deveriam usar KiB em vez de KB, agora você conhece outra maneira de fazer isso. ser irritante e minucioso. :-)

informação relacionada