Bagaimana cara daftar blok data file di Linux?

13

Seperti yang saya pahami, setiap file pada sistem operasi mirip Unix memiliki nomor inode (yang dapat dilihat dengan "ls -i"), dan setiap inode adalah daftar blok disk yang berisi data aktual suatu file.

Apakah ada perintah Linux yang menggunakan nama file sebagai argumennya dan mencetak daftar blok disk yang ditunjuk oleh inode file tersebut?

PS Filesystem yang dimaksud adalah ext3.

mikrofon
sumber

Jawaban:

17

Anda bisa menggunakan alat "debugfs" untuk melihat info file di baris perintah atau interaktivitas. baik digunakan:

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

atau

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

sebagai contoh:

# 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
katriel
sumber
Perhatikan bahwa argumen untuk 'stat' tidak selalu / path / ke / file. Menggunakan / path / ke / file berfungsi untuk file pada sistem file root (dipasang pada /) tetapi tidak untuk path yang dipasang pada sistem file lainnya. Dalam kasus-kasus itu, orang mungkin mendapatkan pesan kesalahan File not found by ext2_lookup. Jadi lebih baik menggunakan notasi inode untuk argumen stat. Gunakan ls -iuntuk mendapatkan nomor inode file, lalu aktifkan debugfs dengan nomor itu di '<>' alih-alih / path / ke / file. Misalnya:# debugfs -R "stat <1234567>" /dev/sda2
ElazarR
@ ElazarR Bisakah Anda menjelaskan komentar itu? Mengapa path/to/filetidak bekerja dalam semua kasus? Yang membingungkan bagi saya adalah bahwa melalui debugfs ..... /dev/fs_blockdevpemahaman saya hanya ada satu filesystem yang dipertimbangkan, dan semua file di dalam sistem ini dapat diakses baik melalui jalurnya atau melalui inode, apa yang ingin Anda ungkapkan?
humanityANDpeace
@humanityANDpeace, dalam kasus di mana file berada di partisi (filesystem) yang berada di luar sistem file root, yaitu, dipasang di beberapa titik mount di bawah partisi root, operasi ext2_lookup tampaknya gagal menemukan jalur yang diberikan di bawah perangkat yang diberikan (partisi). Ini menghasilkan kesalahan yang saya sebutkan. Sebagai contoh, jika folder / home Anda di-mount dari / dev / sda5 di atas filesystem root (yang ada di paritition lain, mis., / Dev / sda3), maka debugfs -R "stat /home/myuser/foo.txt" /dev/sda5menghasilkan kesalahan. Tapi memohon debugfs -R "stat /path/on/rootfs" /dev/sda3berhasil.
ElazarR
Saya pikir Anda perlu sudo, jika tidak, beberapa pesan tidak membantu akan ditampilkan.
Kedar Mhaswade
Dan pertanyaan sebaliknya: bagaimana kita bisa mengetahui file mana yang menggunakan blok yang diberikan?
Luis A. Florit
4

Lihatlah sintaks untuk "debugfs", dan secara khusus perintah "stat". Itu akan menampilkan daftar blok data yang digunakan oleh file. Anda dapat mengirimkan parameter ke "debugfs" dengan argumen "-f" untuk memanggilnya dari skrip.

Evan Anderson
sumber
4

Cara sederhana untuk mendapatkan daftar blok (tanpa harus membaca dari partisi seperti pada debugfsjawaban) adalah dengan menggunakan FIBMAPioctl. Saya tidak tahu perintah apa pun untuk melakukannya, tetapi sangat mudah untuk menulisnya; pencarian Google cepat memberi saya contoh penggunaan FIBMAP , yang melakukan apa yang Anda inginkan. Satu keuntungannya adalah ia akan bekerja pada sistem file apa pun yang mendukung bmapoperasi, bukan hanya ext3.

Alternatif yang lebih baru (dan lebih efisien) adalah FIEMAPioctl, yang juga dapat mengembalikan informasi terperinci tentang luasan (berguna untuk ext4).

CesarB
sumber
3
hdparm --fibmap /path/to/filename

Saya tidak akan bekerja pada zfs, tetapi akan pada ext4, btrfs, (v) fat, dll

man 8 hdparm :

--fibmapSaat digunakan, ini harus menjadi satu-satunya bendera yang diberikan. Ini memerlukan jalur file sebagai parameter, dan akan mencetak daftar perangkat yang diperluas (rentang sektor) yang ditempati oleh file tersebut pada disk. Nomor sektor diberikan sebagai angka LBA absolut, yang dirujuk dari sektor 0 perangkat fisik ( bukan partisi atau sistem file). Informasi ini kemudian dapat digunakan untuk berbagai tujuan, seperti memeriksa tingkat fragmenasi file yang lebih besar, atau menentukan sektor yang sesuai untuk sengaja rusak selama prosedur pengujian injeksi kesalahan.

ChewbaccaKL
sumber
1

Setidaknya pada beberapa mesin linux ... "ls -s" mungkin memberikan apa yang Anda cari.

Sunting: saya salah, saya melihat bahwa Anda sedang mencari daftar blokir sendiri, bukan jumlah mereka.

pengguna10357
sumber
-s menunjukkan ukuran file dalam blok - saya ingin daftar nomor blok yang sebenarnya.
Mike
-2

e2fsck -b 32768 / dev / hda1 saya merasa Anda dapat mencoba ini atau jika Anda mencari lebih banyak docx pada saat yang sama Anda dapat memeriksa berikut

http://www.linux-tutorial.info/modules.php?name=MContent&pageid=97

Rajat
sumber
Perintah itu menjalankan pemeriksaan filesystem, mengambil 32768 sebagai superblock cadangan. Bukan itu yang dia minta.
James Broadhead