Trong khi trả lời câu hỏi U & L này có tiêu đề: Tôi sử dụng lệnh nào để xem khối bắt đầu và kết thúc của một tệp trong hệ thống tệp? , Tôi đã cố gắng tìm hiểu xem có thể xác định LBA của tệp bằng cách sử dụng inode không.
Câu trả lời của tôi xác định rằng tôi có thể sử dụng hdparm
như một phương pháp để tìm LBA:
$ 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
Nhưng tôi đã tò mò nếu có một số phương pháp sử dụng inode của tập tin để lấy LBA; mà không sử dụng hdparm
.
Tôi nghĩ rằng có thể có một phương pháp thay thế trốn trong các công cụ filefrag
, stat
, debugfs
, và tune2fs
nhưng trêu chọc nó ra được eluding tôi.
Bất cứ ai cũng có thể nghĩ đến các lựa chọn thay thế?
Đây là một số nghiên cứu của tôi cho đến nay có thể hữu ích cho những người đủ can đảm để cố gắng trả lời điều này.
filefrag
Tôi nghi ngờ bạn có thể sử dụng công cụ filefrag
để thực hiện, cụ thể là sử dụng kết quả từ công -e
tắc của nó , có lẽ bằng cách thực hiện một số tính toán để đạt được điều đó mà tôi không quen thuộc.
đầu ra mẫu
$ filefrag -e afile
Filesystem type is: ef53
File size of afile is 20 (1 block of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 35304898.. 35304898: 1: eof
afile: 1 extent found
inodes
Một phương pháp tiềm năng khác mà tôi nghi ngờ có thể có tiềm năng là sử dụng thông tin inode của tệp, trực tiếp hoặc thông qua một số phép toán phức tạp được ghi lại kém trên các interwebs.
Thí dụ
Đầu tiên chúng ta tìm ra inode của tập tin. Chúng ta có thể làm điều này bằng cách sử dụng stat
lệnh hoặc ls -i
.
chỉ số
$ stat afile
File: ‘afile’
Size: 20 Blocks: 8 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 6560281 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ saml) Gid: ( 1000/ saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-12-27 18:40:12.788333778 -0500
Modify: 2013-12-27 18:40:23.103333073 -0500
Change: 2013-12-27 18:44:03.697317989 -0500
Birth: -
ls -i
$ ls -i
6560281 afile
Với thông tin inode trong tay, giờ đây chúng ta có thể mở hệ thống tệp mà tệp này cư trú bằng cách sử dụng công cụ , debugfs
.
GHI CHÚ: Để xác định hệ thống tệp, một tệp nằm trong đó bạn có thể sử dụng lệnh df <filename>
.
Bây giờ nếu chúng ta chạy debugfs
và chạy lệnh, stat <inode #>
chúng ta có thể nhận được một danh sách các phạm vi có chứa dữ liệu của tệp này.
$ 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: 0x52be0fdc:bbf41348 -- Fri Dec 27 18:40:12 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
Bây giờ chúng tôi có các thông tin về phạm vi ở trên và đây là nơi tôi bị lạc và không biết cách tiến hành.
filefrag -b512 -v ..
nói "vật lý_offset: 211787168 .. 211795719" thì những điều này sẽ tương đương với các LBA? Điều này dường như jive với cùng một tập tin vớihdparm --fibmap
, 211787168..211795719. Nếu tôi thả-b512 -v
và sử dụng def. 1024, và cố gắng để nhiều. trước 8, 26473396⋅8..26474464⋅8, tôi nhận được 211787168..211795712, gần nhưng hơi tắt. Tôi nghĩ giá trị thứ 2 phải là (26474465⋅8) -1 = 211795719, không chắc tại sao.