Dosya sistemindeki bir dosyanın başlangıç ​​ve bitiş bloğunu görmek için hangi komutu kullanırım?


10

Herhangi bir dosyanın başlangıç ​​ve bitiş bloklarını çıktılayacak herhangi bir komut var mı?


1
hangi dosya sistemi türü: ext2,3,4; btrfs; XFS; zfs, vs ...?
BeowulfNode42

@ BeowulfNode42: ext4, ntfs, fat32 sık sık uğraştığım şeyler ... bu yüzden tercihen bu üç için ...
kesin

Soru geliştirilmelidir (daha kesin): İlk cevabım dosyayı açan, ilk bloğu okuyan, sonra son bloğa giden ve bunu da okuyan bir program olurdu. Peki bir bloğun "çıktısı" nedir? Bloğun içeriği, bloğun mantıksal adresi (dosyanın içinde, dosya sisteminin içinde, bölümün içinde veya blok aygıtının içinde) veya bloğun fiziksel adresi (disk bazı RAID veya LVM'nin bir parçasıysa ilginç olur). Cevaplar sorudan çok daha iyi görünüyor.
U. Windl

Yanıtlar:


16

hdparm

Aradığın şey olduğundan% 100 emin değilim, ancak hdparmözellikle --fibmapanahtarı 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.

Misal

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

filefrag

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 sudogerekli değildir. -b512Anahtarları, çıktıların 512 baytlık bloklar halinde görüntülenmesi için kullanmanız gerekir . Ayrıca filefragayrıntılı olmamız gerektiğini de söylemeliyiz .

Misal

$ 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

debugfs

Bir dosyanın LBA'larını almak için üçüncü bir yöntem kullanmaktır debugfs. Bu yöntem biraz matematik gerektirecektir, ancak debugfsmeraklı 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, debugfsancak bu gösterim için inode kullanacağım.

Şimdi inode hakkında statbilgi 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

Misal

Ö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.

Referanslar


Bu şunlardır bazı bağlantılar ... cevap ve bağlantılar için teşekkürler ...
kesin

2
@hash - LBA'ları belirlemek için başka 2 yöntem bulmaya çalışan kalıntılarım. 8-). Şu an sitede kendi Q'um olarak yazıyorum.
slm

@hash - kullanarak başka bir teknik ekledim filefrag.
slm

@hash - kullanarak başka bir teknik ekledim debugfs.
slm

filefrag1024 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 ...
kesin

4

FS'yi tutan blok cihaza göre sektör numarası (tüm diski değil)

( hdparm --fibmapTü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 -eiyi çalışır ve genel ve verimli FIEMAPioctl 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

XFS'in okunur

Eğer xfs kullanıyorsanız, o zaman xfs_bmapdaha güzel bir çıktı var: Bir filefragsonraki 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

-lkullanıldığında gereksizdir -v, ancak bir nedenle her zaman yazarım -vpl. -pldaha kompakt çıktıdır.


Hem filefragve xfs_bmapsen 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 --fibmapEğ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 FIEMAPolduğ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.

0

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 .


hayır demek istediğim bu değil ... diskin blok numaraları ilgimi çekiyor.
kesin

0

hdparm --fibmapbir dosyanın kapladığı blokları listeler. Bunların bitişik olmayabileceğini unutmayın, bu nedenle "başlangıç ​​ve bitiş" anlamlı değildir.


Sanırım bahsettiğiniz anahtar bu --fibmap. Ayrıca, bir dosya adı belirtmeniz gerekir. Örnek: hdparm --fibmap afile.
slm

@slm, ayy, evet, yazım hatası ... ve söz konusu dosyayı adlandırmanızın bariz olduğunu düşündüm.
psusi

Çalıştırmayı denemeden benim için değildi. Bugüne kadar benim geçmiş deneyimim hdparmtam bir sürücü düzeyinde idi, daha önce hiç dosya için kullanmamıştı.
slm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.