Acontece que converter de extensões para LBAs é bastante simples, uma vez que você entende de onde os números estão vindo. A resposta do @StephaneChazelas foi fundamental para obter esse entendimento.
Saída original do debugfs
Usando o exemplo a seguir mencionado na pergunta.
$ sudo debugfs -R "stat <6560281>" /dev/mapper/fedora_greeneggs-home
debugfs 1.42.7 (21-Jan-2013)
Inode: 6560281 Type: regular Mode: 0664 Flags: 0x80000
Generation: 1999478298 Version: 0x00000000:00000001
User: 1000 Group: 1000 Size: 20
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 8
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x52be10c3:a640e994 -- Fri Dec 27 18:44:03 2013
atime: 0x52be0fdc:bbf41348 -- Fri Dec 27 18:40:12 2013
mtime: 0x52be0fe7:18a2f344 -- Fri Dec 27 18:40:23 2013
crtime: 0x52be0dd8:64394b00 -- Fri Dec 27 18:31:36 2013
Size of extra inode fields: 28
Extended attributes stored in inode body:
selinux = "unconfined_u:object_r:user_home_t:s0$ sudo tune2fs -l /dev/mapper/fedora_greeneggs-home | grep "Block size"
Block size: 4096
0" (37)
EXTENTS:
(0):35304898
Com as informações de extensões, podemos fazer os seguintes cálculos. Mas precisamos de uma informação adicional. O tamanho do bloco do sistema de arquivos subjacente. Você pode usar este comando para obtê-lo.
Tamanho do bloco
$ calc -d
; 35304898 * 8
282439184
;
Convertendo de extensões para LBAs
Portanto, a transformação de chave para reconhecer aqui é que os LBAs estão em unidades de 512 bytes e o comando debugfs
acima, que relatou o número de extensões, está relatando isso em 4096 blocos de bytes.
Então, 4096/512 = 8. Então, precisamos multiplicar as extensões por 8 para convertê-las em valores de LBA.
Assim, a seguinte matemática nos dará nosso LBA de início:
ending LBA = ( (extent + 1) * 8 ) - 1
Então, qual é o nosso final LBA? Para conseguir isso, precisamos reconhecer que nosso inode se encaixa dentro de um único bloco, de modo que sua extensão final é igual à sua extensão inicial. Para calcular o LBA final, podemos usar essa equação.
$ calc -d
; ( (35304898 + 1) * 8 ) - 1
282439191
Então, realizando este cálculo:
byte_offset begin_LBA end_LBA sectors
0 282439184 282439191 8
Confirmando os resultados
Olhando para a saída original hdparm
:
$ ls -i util-linux-2.19.tar.bz2
6559005 util-linux-2.19.tar.bz2
Nós vemos que as coisas combinam.
Outro exemplo
Apenas para ter certeza de que estamos certos, aqui está um arquivo maior como um segundo exemplo.
$ sudo debugfs -R "stat <6559005>" /dev/mapper/fedora_greeneggs-home
...
EXTENTS:
(0-1068):26473396-26474464
Aqui estão as extensões do inode.
$ calc -d
; 26473396*8
211787168
; (26474464+1)*8 - 1
211795719
Agora fazemos conversões de extensões para LBAs.
$ sudo hdparm --fibmap util-linux-2.19.tar.bz2
...
byte_offset begin_LBA end_LBA sectors
0 211787168 211795719 8552
E confirmamos.
$ sudo debugfs -R "stat <6560281>" /dev/mapper/fedora_greeneggs-home
debugfs 1.42.7 (21-Jan-2013)
Inode: 6560281 Type: regular Mode: 0664 Flags: 0x80000
Generation: 1999478298 Version: 0x00000000:00000001
User: 1000 Group: 1000 Size: 20
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 8
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x52be10c3:a640e994 -- Fri Dec 27 18:44:03 2013
atime: 0x52be0fdc:bbf41348 -- Fri Dec 27 18:40:12 2013
mtime: 0x52be0fe7:18a2f344 -- Fri Dec 27 18:40:23 2013
crtime: 0x52be0dd8:64394b00 -- Fri Dec 27 18:31:36 2013
Size of extra inode fields: 28
Extended attributes stored in inode body:
selinux = "unconfined_u:object_r:user_home_t:s0$ sudo tune2fs -l /dev/mapper/fedora_greeneggs-home | grep "Block size"
Block size: 4096
0" (37)
EXTENTS:
(0):35304898
E nós combinamos novamente.