Оказывается, преобразовывает от степеней до LBAs, на самом деле довольно просто, после того как Вы понимаете, куда числа прибывают из. ответ @StephaneChazelas' был очень важен для получения этого понимания.
Используя следующий пример, который был упомянут в вопросе.
$ 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\000" (37)
EXTENTS:
(0):35304898
С информацией о степенях мы можем сделать следующие вычисления. Но нам нужна одна дополнительная информация. Размер блока базовой файловой системы. Можно использовать эту команду для получения его.
$ sudo tune2fs -l /dev/mapper/fedora_greeneggs-home | grep "Block size"
Block size: 4096
Так ключевое преобразование для распознавания вот то, что LBAs находятся в 512-байтовых единицах и вышеупомянутом debugfs
управляйте, чтобы сообщил о количестве степеней, сообщает это в 4 096-байтовых блоках.
Так, 4096/512 = 8. Таким образом, мы должны умножить степени на 8 для преобразования их в значения LBA.
Таким образом, следующая математика даст нам наше начало LBA:
$ calc -d
; 35304898 * 8
282439184
;
Таким образом, каков наш конечный LBA? Для получения этого, мы должны распознать, что наш inode соответствует в единственном блоке, таким образом, его конечная степень совпадает с его степенью начала. Для вычисления конечного LBA, мы можем использовать это уравнение.
ending LBA = ( (extent + 1) * 8 ) - 1
Так выполнение этого вычисления:
$ calc -d
; ( (35304898 + 1) * 8 ) - 1
282439191
Рассмотрение оригинала hdparm
вывод:
byte_offset begin_LBA end_LBA sectors
0 282439184 282439191 8
Мы видим тот вещи соответствие.
Только для проверки мы являемся правильными, вот больший файл как 2-й пример.
$ ls -i util-linux-2.19.tar.bz2
6559005 util-linux-2.19.tar.bz2
Вот степени inode.
$ sudo debugfs -R "stat <6559005>" /dev/mapper/fedora_greeneggs-home
...
EXTENTS:
(0-1068):26473396-26474464
Теперь мы делаем преобразований от степеней до LBAs.
$ calc -d
; 26473396*8
211787168
; (26474464+1)*8 - 1
211795719
И мы подтверждаем.
$ sudo hdparm --fibmap util-linux-2.19.tar.bz2
...
byte_offset begin_LBA end_LBA sectors
0 211787168 211795719 8552
И мы соответствуем снова.
filefrag
и debugfs
сообщите о смещении, выраженном в количестве блоков файловой системы.
Для получения смещения в количестве 512-байтовых единиц необходимо умножиться размером блока в 512-байтовых единицах. На ext4 FS размер блока часто 4k, таким образом, необходимо умножиться на 8.
С filefrag
, можно также использовать a -b 512
опция получить смещение в 512-байтовых единицах.
Можно получить размер блока с stats
команда в debugfs
, или со статистикой GNU:
stat -fc%s /mount/point
(или любой файл в той файловой системе).
Отметьте это hdparm
утилита жесткого диска, она попытается дать смещение в диске в противоположность блочному устройству, на котором смонтирована файловая система (предполагающий, что блочное устройство действительно находится на диске так или иначе). Это только прокладывает себе путь для разделов (путем добавления содержания /sys/class/block/the-block-device/start
к фактическому смещению), и md RAID 1 устройство, но не другой возможно диск поддержал типы блочного устройства как устройства картопостроителя устройства, другие уровни RAID, dmraid устройства, цикл, nbd... Также обратите внимание что более старые версии hdparm
полагавшийся FIBMAP ioctl, который ограничен, в каком блочном устройстве это может быть использование на, в то время как более новые версии используют FIEMAP как filefrag
.
Так, например, если Вы имеете ext2
файловая система на /dev/sda1
.
# hdparm --fibmap /file/in/there
/file/in/there:
filesystem blocksize 1024, begins at LBA 2048; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors
0 109766 109767 2
Можно получить те два сектора (но отметить, что файл, вероятно, использует только часть его):
dd skip=109766 count=2 if=/dev/sda # not /dev/sda1
В то время как с filefrag
или debugfs.
# filefrag -v /file/in/there
Filesystem type is: ef53
Filesystem cylinder groups is approximately 12
File size of /file/in/there is 87 (1 block, blocksize 1024)
ext logical physical expected length flags
0 0 53859 1 merged,eof
Вы получаете его от фактического блочного устройства:
dd bs=1024 skip=53859 count=1 if=/dev/sda1
filefrag -b512 -v ..
говорит "physical_offset: 211787168.. 211795719" они приравнялись бы к LBAs? Это, кажется, танцует джайв с тем же файлом с hdparm --fibmap
, 211787168.. 211795719. Если я отбрасываю -b512 -v
и используйте определение 1024 и попытайтесь к mult. 8, 26473396⋅8.. 26474464⋅8, я добираюсь 211787168.. 211795712, который близок, но немного прочь. Я думаю, что 2-е значение должно быть (26474465⋅8)-1 = 211795719, не уверено почему все же.
– slm♦
29.12.2013, 08:47