Herhangi bir dosyanın başlangıç ve bitiş bloklarını çıktılayacak herhangi bir komut var mı?
Herhangi bir dosyanın başlangıç ve bitiş bloklarını çıktılayacak herhangi bir komut var mı?
Yanıtlar:
Aradığın şey olduğundan% 100 emin değilim, ancak hdparm
özellikle --fibmap
anahtarı ile komutu kullanarak bunu yapabileceğine inanıyorum .
alıntı
--fibmap
When used, this must be the only option given. It requires a
file path as a parameter, and will print out a list of the block
extents (sector ranges) occupied by that file on disk. Sector
numbers are given as absolute LBA numbers, referenced from sector
0 of the physical device rather than from the partition or
filesystem. This information can then be used for a variety of
purposes, such as examining the degree of fragmenation of larger
files, or determining appropriate sectors to deliberately corrupt
during fault-injection testing procedures.
This option uses the new FIEMAP (file extent map) ioctl() when
available, and falls back to the older FIBMAP (file block
map) ioctl() otherwise. Note that FIBMAP suffers from a 32-bit
block-number interface, and thus not work beyond 8TB or 16TB.
FIBMAP is also very slow, and does not deal well with
preallocated uncommitted extents in ext4/xfs filesystems, unless a
sync() is done before using this option.
Diyelim ki örnek bir dosyamız var.
$ echo "this is a test file" > afile
Şimdi koştuğumuzda hdparm
.
$ sudo hdparm --fibmap afile
afile:
filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors
0 282439184 282439191 8
Bir dosyanın başlangıç ve bitiş bloklarını bulmak için başka bir güzel yöntem filefrag
. İstenilen çıkışı elde etmek için uygun anahtarları kullanmanız gerekir. Bu aracın bir tarafı hdparm
, herhangi bir kullanıcının onu çalıştırabilmesidir, bu yüzden sudo
gerekli değildir. -b512
Anahtarları, çıktıların 512 baytlık bloklar halinde görüntülenmesi için kullanmanız gerekir . Ayrıca filefrag
ayrıntılı olmamız gerektiğini de söylemeliyiz .
$ filefrag -b512 -v afile
Filesystem type is: ef53
File size of afile is 20 (8 block of 512 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 7: 282439184.. 282439191: 8: eof
afile: 1 extent found
Bir dosyanın LBA'larını almak için üçüncü bir yöntem kullanmaktır debugfs
. Bu yöntem biraz matematik gerektirecektir, ancak debugfs
meraklı olanlar için rapor edilen uzantı değerinden LBA'lara nasıl dönüştüğünü göstermenin önemli olduğunu düşündüm .
Şimdi dosyanın inode'u ile başlayalım.
$ ls -i afile
6560281 afile
NOT: İçinde dosyanın adını da kullanabiliriz, debugfs
ancak bu gösterim için inode kullanacağım.
Şimdi inode hakkında stat
bilgi edelim debugfs
.
$ 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: 0x52bff8a1:a9f08020 -- Sun Dec 29 05:25:37 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
Önemli bilgiler içerik bölümünde yer almaktadır. Bunlar aslında bu inode tarafından kullanılan dosya sistemi bloklarıdır. Onları sadece LBA'ya dönüştürmemiz gerekiyor. Bunu aşağıdaki denklemle yapabiliriz.
NOT: Dosya sistemimizin 4k blok boyutları kullandığını ve temeldeki donanımın 512 bayt birim kullandığını varsayarsak, örnekleri 8 ile çarpmamız gerekir.
beginning LBA = (BEGIN EXTENT) * 8
ending LBA = (((ENDING EXTENT) + 1) * 8) - 1
Örneğimizde, dosyamız tek bir boyuta sığdığı için başlangıç ve bitiş boyutlarımız aynıdır.
beginning LBA = 35304898 * 8 = 282439184
ending LBA = ((35304898 + 1) * 8) - 1 = 282439191
Yani LBA'larımız 282439184..282439191.
filefrag
.
debugfs
.
filefrag
1024 ve 2048 kullanılabilir blok boyutlarıdebugfs
ile denedim .. daha büyük bir dosya uzantısı ile: 0 - 12187 .. ben zaman ayırın ve anlayacağım .. Bu çok büyük bir yardım, teşekkürler ...
( hdparm --fibmap
Tüm diske göreli olduğuna dikkat edin, bölüme veya diğer blockdevlerin FS'ye sahip olduğu her şeye değil. Kök gerektirir.)
filefrag -e
iyi çalışır ve genel ve verimli FIEMAP
ioctl kullanır , bu yüzden hemen hemen her dosya sisteminde (genellikle garip BTRFS dahil, BTRFS sıkıştırılmış dosyalar için bile) çalışmalıdır. FIEMAP desteği olmayan dosya sistemleri / çekirdekler için FIBMAP'e geri dönecektir.
$ filefrag xpsp3.vdi # some old sparse disk image I had lying around
xpsp3.vdi: 110 extents found
$ filefrag -e xpsp3.vdi
Filesystem type is: 58465342
File size of xpsp3.vdi is 5368730112 (1310726 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 5: 1322629241..1322629246: 6:
1: 13.. 13: 1322620799..1322620799: 1: 1322629247:
2: 15.. 47: 1323459271..1323459303: 33: 1322620800:
...
160: 899498.. 915839: 1325792977..1325809318: 16342: 1325725438:
161: 1307294.. 1307391: 1323938199..1323938296: 98: 1325809319: last
xpsp3.vdi: 110 extents found
Eğer xfs kullanıyorsanız, o zaman xfs_bmap
daha güzel bir çıktı var: Bir filefrag
sonraki aşama daha sonraki bir sektörde başlarken, deliklerin nerede olduğunu gösterir . 512B blokları kullanır, dosya sistemi blok boyutu gerçekte ne olursa olsun. (genellikle Linux'ta 4k). Her bir kapsamda hangi ayırma grubunun olduğunu ve RAID şerit sınırlarına nasıl hizalandığını gösterir.
$ xfs_bmap -vvpl xpsp3.vdi # the extra -v prints a key to the flags
xpsp3.vdi:
EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL FLAGS
0: [0..47]: 10581033928..10581033975 13 (83912..83959) 48 01111
1: [48..103]: hole 56
2: [104..111]: 10580966392..10580966399 13 (16376..16383) 8 01010
3: [112..119]: hole 8
...
322: [10458352..10459135]: 10591505592..10591506375 13 (10555576..10556359) 784 01111
323: [10459136..10485807]: hole 26672
FLAG Values: # this part is only here with -vv
010000 Unwritten preallocated extent
001000 Doesn't begin on stripe unit
000100 Doesn't end on stripe unit
000010 Doesn't begin on stripe width
000001 Doesn't end on stripe width
-l
kullanıldığında gereksizdir -v
, ancak bir nedenle her zaman yazarım -vpl
. -pl
daha kompakt çıktıdır.
filefrag
ve xfs_bmap
sen kapsamlarını İlk ayırma gösteriyor.$ fallocate --length $((1024*1024*8)) prealloced_file
$ filefrag -e prealloced_file
Filesystem type is: 58465342
File size of prealloced_file is 8388608 (2048 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 2047: 1325371648..1325373695: 2048: last,unwritten,eof
prealloced_file: 1 extent found
$ xfs_bmap -vvpl prealloced_file
prealloced_file:
EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL FLAGS
0: [0..16383]: 10602973184..10602989567 13 (22023168..22039551) 16384 10010
FLAG Values:
010000 Unwritten preallocated extent
001000 Doesn't begin on stripe unit
000100 Doesn't end on stripe unit
000010 Doesn't begin on stripe width
000001 Doesn't end on stripe width
$ dd if=/dev/zero of=prealloced_file conv=notrunc bs=4k count=10 seek=10000
40960 bytes (41 kB) copied, 0.000335111 s, 122 MB/s
$ xfs_bmap -vpl prealloced_file
prealloced_file:
EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL FLAGS
0: [0..16383]: 10602973184..10602989567 13 (22023168..22039551) 16384 10010
1: [16384..79999]: hole 63616
2: [80000..80895]: 10603013120..10603014015 13 (22063104..22063999) 896 00111
# oops, wrote past EOF and extended the file, instead of in the middle of the preallocated extent
$ dd if=/dev/zero of=prealloced_file conv=notrunc bs=4k count=10 seek=100
40960 bytes (41 kB) copied, 0.000212986 s, 192 MB/s
$ xfs_bmap -vpl prealloced_file
prealloced_file:
EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL FLAGS
0: [0..16383]: 10602973184..10602989567 13 (22023168..22039551) 16384 10010
1: [16384..79999]: hole 63616
2: [80000..80895]: 10603013120..10603014015 13 (22063104..22063999) 896 00111
# If you check *right away*, XFS's delayed allocation hasn't happened yet.
# FIEMAP on xfs only reflects allocations, which lag behind completed writes. fsync first if you need it, IIRC.
$ xfs_bmap -vpl prealloced_file
prealloced_file:
EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL FLAGS
0: [0..799]: 10602973184..10602973983 13 (22023168..22023967) 800 10111
1: [800..879]: 10602973984..10602974063 13 (22023968..22024047) 80 01111
2: [880..16383]: 10602974064..10602989567 13 (22024048..22039551) 15504 11010
3: [16384..79999]: hole 63616
4: [80000..80895]: 10603013120..10603014015 13 (22063104..22063999) 896 00111
$ filefrag -e prealloced_file
Filesystem type is: 58465342
File size of prealloced_file is 41000960 (10010 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 99: 1325371648..1325371747: 100: unwritten
1: 100.. 109: 1325371748..1325371757: 10:
2: 110.. 2047: 1325371758..1325373695: 1938: unwritten
3: 10000.. 10111: 1325376640..1325376751: 112: 1325373696: last,eof
prealloced_file: 2 extents found
hdparm --fibmap
Eğer bir sektör numarası istiyorsanız sadece yararlıdır tüm sabit sürücüye göre , değil bölüm içinde dosya sistemi üzerindedir. Yazılım RAID'inde (veya dosya sistemi ile sabit disk arasında muhtemelen başka bir şey) çalışmaz. Ayrıca kök gerektirir. Seçeneğin adına rağmen, aslında kullanılabilir FIEMAP
olduğunda kullanır (eski yavaş blok harita ioctl değil, daha yeni kapsam haritası ioctl).
# hdparm --fibmap ..../xpsp3.vdi
Unable to determine start offset LBA for device, aborting.
Dolayısıyla, belirli bir dosya için, hangi disk bloğu numaralarının o dosyanın başlangıcını ve sonunu içerdiğini bilmek istersiniz.
debugfs (8) ext2 / 3/4 FS için umut verici görünüyor
stat (1), ls -i, lsof (8) inode numarasını sağlar, ancak disk blokları hakkında başka bir şey yapmaz.
head / tail --bytes = 1024 dosya içeriği için kullanışlıdır, ancak disk blokları için kullanılmaz.
dd (1) blok içeriğini incelemek istediğiniz şey olacaktır - seek = ve skip = parametreleri arasındaki farka dikkat edin ve çıktı dosyasının gerçekten bir cihaz olmasını istemiyorsanız = / dev / ... 'den kaçının .
hdparm --fibmap
bir dosyanın kapladığı blokları listeler. Bunların bitişik olmayabileceğini unutmayın, bu nedenle "başlangıç ve bitiş" anlamlı değildir.
--fibmap
. Ayrıca, bir dosya adı belirtmeniz gerekir. Örnek: hdparm --fibmap afile
.
hdparm
tam bir sürücü düzeyinde idi, daha önce hiç dosya için kullanmamıştı.