Linux'ta bir dosyanın veri bloklarını nasıl listeleyebilirim?


13

Anladığım kadarıyla, Unix benzeri bir işletim sistemindeki her dosyanın bir inode numarası vardır ("ls -i" ile görüntülenebilir) ve her inode, bir dosyanın gerçek verilerini içeren disk bloklarının bir listesidir.

Bağımsız değişken olarak bir dosya adı alan ve bu dosyanın inode'unun işaret ettiği disk bloklarının listesini basan bir Linux komutu var mı?

PS Söz konusu dosya sistemi ext3'tür.

Yanıtlar:


17

Komut satırındaki veya interactivley'deki dosya bilgilerini görüntülemek için "debugfs" aracını kullanabilirsiniz. ya kullanın:

# debugfs /dev/<spartition>
# stat /path/to/file

veya

# debugfs -R "stat /path/to/file" /dev/<partition>

Örneğin:

# debugfs -R "stat /etc/passwd"  /dev/sda5
Inode: 435914   Type: regular    Mode:  0644   Flags: 0x0
Generation: 979004472    Version: 0x00000000
User:     0   Group:     0   Size: 1577
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x4a2d6f78 -- Mon Jun  8 23:07:20 2009
atime: 0x4a2d6f79 -- Mon Jun  8 23:07:21 2009
mtime: 0x4a2d6f78 -- Mon Jun  8 23:07:20 2009
Size of extra inode fields: 4
BLOCKS:
(0):1767438
TOTAL: 1

'Stat' argümanının her zaman / path / to / file olmadığını unutmayın. / Path / to / file kullanımı, kök dosya sistemlerindeki (/ dizinine monte edilmiş) dosyalar için çalışır, ancak diğer dosya sistemine monte edilen yollar için çalışmaz. Bu gibi durumlarda hata mesajı alınabilir File not found by ext2_lookup. Bu nedenle stat argümanı için inode gösterimini kullanmak daha iyidir. ls -iBir dosyanın inode numarasını almak için kullanın , ardından / path / to / file yerine '<>' içinde bu numara ile debugfs çağırın. Örneğin:# debugfs -R "stat <1234567>" /dev/sda2
ElazarR

@ElazarR Bu yorumu açıklayabilir misiniz? Neden path/to/fileher durumda çalışmaz? Benim için kafa karıştırıcı olan şey, anladığım kadarıyla debugfs ..... /dev/fs_blockdev, şimdiye kadar dikkate alınan tek bir dosya sistemi olması ve bu sistemdeki tüm dosyalara yollarından veya thaod inode aracılığıyla erişilebilmesidir, ne ifade etmek istediniz?
humanityANDpeace

@humanityANDpeace, bir dosyanın kök dosya sisteminin dışındaki bir bölümde (dosya sistemi) olması durumunda, yani kök bölümünün altındaki bir bağlama noktasına monte edilmesi durumunda, ext2_lookup işlemi verilen cihazın altında verilen yolu bulamıyor gibi görünüyor (bölme). Bu bahsettiğim hatayla sonuçlanır. Örneğin, / home klasörleriniz / dev / sda5 dizininden kök dosya sistemi (örneğin, / dev / sda3 gibi başka bir paritition'da) üzerine monte edilmişse debugfs -R "stat /home/myuser/foo.txt" /dev/sda5hataya neden olur. Ama debugfs -R "stat /path/on/rootfs" /dev/sda3işleri teşvik etmek .
ElazarR

Sanırım ihtiyacınız var sudo, aksi takdirde bazı yararsız mesajlar görüntülenecektir.
Kedar Mhaswade

Ve tersi soru: hangi dosyanın belirli bir bloğu kullandığını nasıl bulabiliriz?
Luis A. Florit

4

"Debugfs" sözdizimine ve özellikle "stat" komutuna bakın. Bu size bir dosya tarafından kullanılan veri bloklarının bir listesini gösterir. Parametreleri bir komut dosyasından çağırmak için "-f" bağımsız değişkeniyle "debugfs" öğesine iletebilirsiniz.


4

Blokların listesini almanın basit bir yolu ( debugfscevaplardaki gibi bölümü okumak zorunda kalmadan ) FIBMAPioctl kullanmaktır . Bunu yapmak için herhangi bir komut bilmiyorum, ama bir tane yazmak çok basit; hızlı bir Google araması bana tam olarak ne istediğinizi yapan bir FIBMAP kullanımı örneği verdi . Bir avantajı, bmapyalnızca ext3'ü değil , işlemi destekleyen herhangi bir dosya sisteminde çalışmasıdır.

Daha yeni (ve daha verimli) bir alternatif, FIEMAPioctl'dir, bu da uzantılar hakkında ayrıntılı bilgi de verebilir (ext4 için yararlıdır).


3
hdparm --fibmap /path/to/filename

Zfs üzerinde çalışmayacağım, ancak ext4, btrfs, (v) yağ vb.

man 8 hdparm :

--fibmapKullanıldığında, verilen tek bayrak bu olmalıdır. Parametre olarak bir dosya yolu gerektirir ve diskteki o dosyanın kapladığı aygıt uzantılarının (sektör aralıkları) bir listesini yazdırır. Sektör numaraları fiziksel aygıtın (sektöre 0 dan başvurulan mutlak LBA numaraları olarak verilmektedir değil bölme veya dosya sistemi). Bu bilgiler daha sonra, daha büyük dosyaların parçalanma derecesinin incelenmesi veya hata enjeksiyon test prosedürleri sırasında kasıtlı olarak bozulacak uygun sektörlerin belirlenmesi gibi çeşitli amaçlar için kullanılabilir.


1

En azından bazı linux makinelerde ... "ls -s" aradığınızı sağlayabilir.

Düzenleme: benim kötü, görüyorum blokların bir listesini değil, kendileri bir liste arıyorsunuz.


-s, bloklar halinde dosyanın boyutunu gösterir - blok numaralarının gerçek bir listesini istiyorum.
mike

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.