Làm cách nào để liệt kê các khối dữ liệu của tệp trên Linux?


13

Theo tôi hiểu, mỗi tệp trên hệ điều hành giống Unix có số inode (có thể được xem bằng "ls -i") và mỗi inode là một danh sách các khối đĩa chứa dữ liệu thực của tệp.

Có lệnh Linux nào lấy tên tệp làm đối số của nó và in ra danh sách các khối đĩa mà tệp inode đó trỏ tới không?

PS Hệ thống tập tin trong câu hỏi là ext3.

Câu trả lời:


17

Bạn có thể sử dụng công cụ "gỡ lỗi" để xem thông tin tệp trên dòng lệnh hoặc tương tác. sử dụng:

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

hoặc là

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

ví dụ:

# 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

Lưu ý rằng đối số cho 'stat' không phải luôn luôn là / path / to / file. Sử dụng / path / to / file hoạt động cho các tệp trên hệ thống tệp gốc (được gắn tại /) nhưng không cho các đường dẫn được gắn trong hệ thống tệp khác. Trong những trường hợp đó, người ta có thể nhận được thông báo lỗi File not found by ext2_lookup. Vì vậy, tốt hơn là sử dụng ký hiệu inode cho đối số của stat. Sử dụng ls -iđể lấy số inode của một tệp, sau đó gọi gỡ lỗi với số đó trong '<>' thay vì / path / to / file. Ví dụ:# debugfs -R "stat <1234567>" /dev/sda2
ElazarR

@ElazarR Bạn có thể giải thích nhận xét đó? Tại sao path/to/filekhông nên làm việc trong mọi trường hợp? Điều khó hiểu với tôi là thông qua debugfs ..... /dev/fs_blockdevsự hiểu biết của tôi chỉ có một hệ thống tập tin được xem xét và tất cả các tệp trong hệ thống này có thể được truy cập thông qua đường dẫn của chúng hoặc qua nút inair, bạn muốn thể hiện điều gì?
nhân

@humanityANDpeace, trong trường hợp tệp nằm trong phân vùng (hệ thống tệp) nằm ngoài hệ thống tệp gốc, nghĩa là được gắn tại một số điểm gắn kết trong phân vùng gốc, thao tác ext2_lookup dường như không tìm thấy đường dẫn cụ thể trong thiết bị đã cho (vách ngăn). Điều này dẫn đến lỗi tôi đã đề cập. Ví dụ: nếu các thư mục / home của bạn được gắn kết từ / dev / sda5 trên hệ thống tập tin gốc (nằm trên một mệnh đề khác, ví dụ: / dev / sda3), thì debugfs -R "stat /home/myuser/foo.txt" /dev/sda5sẽ xảy ra lỗi. Nhưng gọi debugfs -R "stat /path/on/rootfs" /dev/sda3công trình.
ElazarR

Tôi nghĩ bạn cần sudo, nếu không một số tin nhắn không có ích sẽ được hiển thị.
Kedar Mhaswade

Và câu hỏi ngược lại: làm thế nào chúng ta có thể tìm ra tập tin nào sử dụng một khối nhất định?
Luis A. Florit

4

Nhìn vào cú pháp cho "debugfs", và cụ thể là lệnh "stat". Điều đó sẽ cho bạn thấy một danh sách các khối dữ liệu được sử dụng bởi một tệp. Bạn có thể truyền tham số cho "debugfs" với đối số "-f" để gọi nó từ tập lệnh.


4

Một cách đơn giản để có được danh sách các khối (mà không phải đọc từ phân vùng như trong debugfscâu trả lời) là sử dụng FIBMAPioctl. Tôi không biết bất kỳ lệnh nào để làm như vậy, nhưng nó rất đơn giản để viết một lệnh; một tìm kiếm nhanh trên Google đã cho tôi một ví dụ về việc sử dụng FIBMAP , chính xác những gì bạn muốn. Một lợi thế là nó sẽ hoạt động trên mọi hệ thống tập tin hỗ trợ bmaphoạt động, không chỉ ext3.

Một thay thế mới hơn (và hiệu quả hơn) là FIEMAPioctl, cũng có thể trả về thông tin chi tiết về phạm vi (hữu ích cho ext4).


3
hdparm --fibmap /path/to/filename

Tôi sẽ không làm việc trên zfs, nhưng sẽ trên ext4, btrfs, (v) fat, v.v.

man 8 hdparm :

--fibmapKhi được sử dụng, đây phải là cờ duy nhất được đưa ra. Nó yêu cầu một đường dẫn tệp làm tham số và sẽ in ra một danh sách các phạm vi thiết bị (phạm vi khu vực) bị chiếm bởi tệp đó trên đĩa. Số ngành được đưa ra dưới dạng số LBA tuyệt đối, được tham chiếu từ sector 0 của thiết bị vật lý ( không phải phân vùng hoặc hệ thống tệp). Thông tin này sau đó có thể được sử dụng cho nhiều mục đích khác nhau, chẳng hạn như kiểm tra mức độ phân mảnh của các tệp lớn hơn hoặc xác định các lĩnh vực thích hợp để cố tình làm hỏng trong quy trình kiểm tra tiêm lỗi.


1

Ít nhất trên một số máy linux ... "ls -s" có thể cung cấp những gì bạn đang tìm kiếm.

Chỉnh sửa: xấu của tôi, tôi thấy rằng bạn đang tìm kiếm một danh sách các khối, không phải là một số lượng của chúng.


-s hiển thị kích thước của tệp theo khối - tôi muốn có một danh sách thực tế về số khối.
mike

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.