Comment répertorier les blocs de données d'un fichier sous Linux?


13

Si je comprends bien, chaque fichier sur un système d'exploitation de type Unix a un numéro d'inode (qui peut être affiché avec "ls -i"), et chaque inode est une liste de blocs de disque qui contiennent les données réelles d'un fichier.

Existe-t-il une commande Linux qui prend un nom de fichier comme argument et affiche la liste des blocs de disque vers lesquels l'inode de ce fichier pointe?

PS Le système de fichiers en question est ext3.

Réponses:


17

Vous pouvez utiliser l'outil "debugfs" pour afficher les informations sur les fichiers sur la ligne de commande ou interactivley. soit utiliser:

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

ou

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

par exemple:

# 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

Notez que l'argument pour 'stat' n'est pas toujours / chemin / vers / fichier. L'utilisation de / path / to / file fonctionne pour les fichiers sur les systèmes de fichiers racine (montés sur /) mais pas pour les chemins montés sur un autre système de fichiers. Dans ces cas, on peut obtenir le message d'erreur File not found by ext2_lookup. Il est donc préférable d'utiliser la notation inode pour l'argument de stat. Utilisez ls -ipour obtenir le numéro d'inode d'un fichier, puis appelez debugfs avec ce numéro dans '<>' au lieu de / path / to / file. Par exemple:# debugfs -R "stat <1234567>" /dev/sda2
ElazarR

@ElazarR Pouvez-vous expliquer ce commentaire? Pourquoi path/to/filene devrait pas fonctionner dans tous les cas? Ce qui me debugfs ..... /dev/fs_blockdevdéroute, c'est que via il n'y a dans ma compréhension qu'un seul système de fichiers en considération, et tous ces fichiers à l'intérieur de ce système sont accessibles via leur chemin ou via leur inode, qu'avez-vous voulu exprimer?
humanityANDpeace

@humanityANDpeace, dans le cas où un fichier se trouve dans une partition (système de fichiers) qui est en dehors du système de fichiers racine, c'est-à-dire monté à un certain point de montage sous la partition racine, l'opération ext2_lookup semble échouer à trouver le chemin donné sous le périphérique donné (cloison). Il en résulte l'erreur que j'ai mentionnée. Par exemple, si vos dossiers / home sont montés à partir de / dev / sda5 sur le système de fichiers racine (qui se trouve sur une autre partition, par exemple, / dev / sda3), cela debugfs -R "stat /home/myuser/foo.txt" /dev/sda5entraîne une erreur. Mais invoquer des debugfs -R "stat /path/on/rootfs" /dev/sda3œuvres.
ElazarR

Je pense que vous en avez besoin sudo, sinon un message inutile s'affichera.
Kedar Mhaswade

Et la question inverse: comment savoir quel fichier utilise un bloc donné?
Luis A. Florit

4

Regardez la syntaxe de "debugfs", et en particulier la commande "stat". Cela vous montrera une liste des blocs de données utilisés par un fichier. Vous pouvez passer des paramètres à "debugfs" avec l'argument "-f" pour l'appeler à partir d'un script.


4

Un moyen simple d'obtenir la liste des blocs (sans avoir à lire depuis la partition comme dans les debugfsréponses) est d'utiliser l' FIBMAPioctl. Je ne connais aucune commande pour le faire, mais il est très simple d'en écrire une; une recherche rapide sur Google m'a donné un exemple d'utilisation de FIBMAP , qui fait exactement ce que vous voulez. Un avantage est qu'il fonctionnera sur n'importe quel système de fichiers qui prend en charge l' bmapopération, pas seulement ext3.

Une alternative plus récente (et plus efficace) est l' FIEMAPioctl, qui peut également renvoyer des informations détaillées sur les extensions (utiles pour ext4).


3
hdparm --fibmap /path/to/filename

Je ne travaillerai pas sur zfs, mais sur ext4, btrfs, (v) fat, etc.

man 8 hdparm :

--fibmapLorsqu'il est utilisé, ce doit être le seul indicateur donné. Il nécessite un chemin de fichier comme paramètre et imprimera une liste des extensions de périphérique (plages de secteurs) occupées par ce fichier sur le disque. Les numéros de secteur sont donnés sous forme de nombres LBA absolus, référencés à partir du secteur 0 du périphérique physique ( pas la partition ou le système de fichiers). Ces informations peuvent ensuite être utilisées à diverses fins, telles que l'examen du degré de fragmentation de fichiers plus volumineux ou la détermination de secteurs appropriés à corrompre délibérément pendant les procédures de test d'injection de pannes.


1

Au moins sur certaines machines Linux ... "ls -s" pourrait fournir ce que vous cherchez.

Edit: mon mauvais, je vois que vous cherchez une liste des blocs eux-mêmes, pas un nombre d'entre eux.


-s montre la taille du fichier en blocs - je veux une liste réelle des numéros de blocs.
Mike

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.