Яку команду я використовую для перегляду блоку початку та кінця файлу у файловій системі?


10

Чи є якась команда, яка видасть початкові та кінцеві блоки будь-якого файлу?


1
який тип файлової системи: ext2,3,4; btrfs; xfs; zfs тощо ...?
BeowulfNode42

@ BeowulfNode42: ext4, ntfs, fat32 - це ті, з якими я часто маю справу ... тому бажано для цих трьох ...
точний

Питання слід вдосконалити (точніше): Моєю першою відповіддю була б якась програма, яка відкриває файл, зчитує перший блок, потім шукає останній блок і теж читає його. Отже, що таке "вихід" блоку? Вміст блоку, логічна адреса блоку (всередині файлу, всередині файлової системи, всередині розділу або всередині пристрою блоку) або фізична адреса блоку (стає цікавою, якщо диск є частиною якогось RAID або LVM). Відповіді здаються набагато кращими, ніж питання.
U. Windl

Відповіді:


16

hdparm

Я не на 100% впевнений, що це те, що ви шукаєте, але я вважаю, що ви можете це зробити за допомогою команди hdparm, зокрема, за допомогою її --fibmapперемикача.

витяг

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

Приклад

Скажімо, у нас є зразок файлу.

$ echo "this is a test file" > afile

Тепер, коли ми біжимо 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

Ще один приємний метод пошуку блоків початку та кінця файлу - це filefrag. Для отримання потрібного результату вам потрібно буде використовувати відповідні комутатори. Одним із перевагами цього інструменту hdparmє те, що будь-який користувач може його запустити, тому не sudoпотрібно. Вам потрібно буде використовувати -b512комутатор, щоб виводи відображалися в 512 байтових блоках. Також нам потрібно сказати, filefragщоб бути багатослівним.

Приклад

$ 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

налагодження

Третім методом отримання LBA файлів є використання debugfs. Цей метод вимагає трохи математики, але я вважав, що важливо показати, як можна конвертувати з розширених значень, про які повідомляють debugfsLBA, для тих, які можуть бути цікавими.

Отже, почнемо з inode файлу.

$ ls -i afile
6560281 afile

ПРИМІТКА. Ми також можемо використовувати ім'я файлу всередині, debugfsале для цієї демонстрації я буду використовувати замість цього inode.

Тепер давайте отримаємо statінформацію 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

Важлива інформація знаходиться в розділі розширень. Це фактично блоки файлової системи, які використовуються цим inode. Нам просто потрібно конвертувати їх у LBA. Це можна зробити за допомогою наступного рівняння.

ПРИМІТКА. Якщо припустити, що наша файлова система використовує розміри блоків 4k і що базове обладнання використовує 512 байтових одиниць, нам потрібно помножити виходи на 8.

beginning LBA = (BEGIN EXTENT) * 8
ending LBA    = (((ENDING EXTENT) + 1) * 8) - 1

Приклад

Отже, у нашому прикладі наша початкова та кінцева міри однакові, оскільки наш файл вміщується в одній мірі.

beginning LBA = 35304898 * 8             = 282439184
ending LBA    = ((35304898 + 1) * 8) - 1 = 282439191

Отже, наші LBA - це 282439184..282439191.

Список літератури


вони є деякими посиланнями ... спасибі за відповідь і посилання ...
точні

2
@hash - вони залишки мене, що намагаються знайти 2 інші методи визначення LBA. 8-). Я зараз пишу це як власний Q на сайті.
slm

@hash - я додав ще одну техніку, використовуючи filefrag.
slm

@hash - я додав ще одну техніку, використовуючи debugfs.
slm

я спробував filefragз доступними розмірами 1024 та 2048 .. debugfsз більшими розширеннями файлів : 0 - 12187 .. я знайду свій час і зрозумію .. це чудова допомога, дякую ...
точний

4

Номер сектора відносно блочного пристрою, що містить FS (не весь диск)

(Зверніть увагу, що hdparm --fibmapвідносно всього диска, а не для розділу або будь-якого іншого blockdev, що містить FS. Він також вимагає root.)

filefrag -eпрацює добре і використовує загальний та ефективний FIEMAPioctl , тому він повинен працювати майже на будь-якій файловій системі (включаючи часто дивні BTRFS, навіть для файлів, стислих BTRFS). Він повернеться до FIBMAP для файлових систем / ядер без підтримки FIEMAP.

$ 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

Якщо ви використовуєте xfs, то він xfs_bmapмає кращий вихід: Він показує вам, де є дірки, а filefragпросто має наступну міру, починаючи з наступного сектора. Він використовує блоки 512B, не те, що насправді блокує файлова система. (як правило, 4k в Linux). Він показує, в якій групі розподілу розміщено кожну міру, і як вона вирівнюється за межами смуги RAID.

$ 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є надлишковим при -vвикористанні, але я чомусь завжди друкую -vpl. -pl- це більш компактний вихід.


І те, filefragі xfs_bmapінше, щоб показати вам попередньо виділені розширення.

$ 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корисний лише в тому випадку, якщо потрібно номер сектора відносно всього жорсткого диска , а не в розділі, на якому ввімкнена файлова система. Він не працює над програмним RAID (або, мабуть, нічим іншим між файловою системою та жорстким диском). Для цього також потрібен корінь. Незважаючи на назву опції, вона фактично використовує, FIEMAPколи вона доступна (новіша ioctl-карта масштабу, а не стара повільна блокова карта ioctl).

# hdparm --fibmap ..../xpsp3.vdi
Unable to determine start offset LBA for device, aborting.

0

Отже, для заданого файлу ви хочете знати, які номери блоків дисків містять початок і кінець цього файлу.

налагодження (8) виглядає перспективно для ext2 / 3/4 FSes

stat (1), ls -i, lsof (8) надають номер inode, але не дуже багато про дискові блоки.

head / tail --bytes = 1024 корисний для вмісту файлів, але не для блоків диска.

dd (1) - це те, що ви хочете перевірити вміст блоку - будьте уважні до різниці між параметрами search = і skip = та уникайте = / dev / ..., якщо ви дійсно не хочете, щоб вихідний файл був пристроєм .


ні, це не те, що я мав на увазі ... номери блоків диска, якими я займаюся.
точне

0

hdparm --fibmapперелічить блоки, які займає файл. Зауважте, що вони можуть не бути суміжними, тому "початок і кінець" не має сенсу.


Я думаю, що перемикач, на який ви посилаєтесь, є --fibmap. Також потрібно вказати ім'я файлу без нього. Приклад: hdparm --fibmap afile.
slm

@slm, ой, так, друкарська помилка ... і я подумав, що очевидно, що потрібно назвати файл, про який йде мова.
psusi

Це було не до мене, поки я не спробував запустити його. До цього мого минулого досвіду роботи hdparmна цілому рівні приводу, ніколи не використовував його для файлів раніше.
slm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.