2009-11-04 64 views
3

在塊級別訪問ext3文件系統的最簡單方法是什麼?我不在乎文件或原始字節,我只需一次讀取FS塊。有沒有簡單的方法來做到這一點(在C)?或者,也許一個簡單的應用程序,其源可以調查靈感?我在網上找不到有用的教程,我有點害怕深入內核源代碼,以瞭解如何做到這一點。從ext3文件系統讀取塊?

+1

dd提供這樣的功能。據我記得你可以定義偏移量和長度等。 – Bobby

回答

2

是的,請參閱e2fsprogs。這提供了可用於使用ext2,ext3和ext4文件系統執行任何操作(!)的工具。它還包含一個庫接口,所以你可以做任何事情。

查看包含的debugfs,啓動它可能就足夠了。否則,請查看標題並編寫一些代碼。

1

的磁盤設備,並在他們的分區,使用起來就像是你需要成爲當然的根普通文件,你可以從閱讀(寫),例如:

head -c 2048 /dev/sda1 > first_2048_bytes 

+1

通常你會首先達到'dd',我認爲...... Linux並不在意,但傳統上阻塞設備只允許塊I/O。 – ephemient

+0

同意ephemient,dd是更好的工具。 –

+0

同意,只是認爲指出磁盤設備可以像普通文件一樣對待可能是有幫助的(這對我來說是一個驚喜,來自DOS幾年前......) –

4

如果你想要一個簡單的應用程序,那麼我建議你可以看看「dd」實用程序。我來作爲GNU Core Utility的一部分。它的來源可供下載。看看它的主頁,here
如果您想從C代碼實現相同的功能,請參閱以下代碼。希望這可以幫助你。 :)

#include <stdio.h> 
#include <linux/fs.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

#define SECTOR_NO 10 /*read 10th sector*/ 

int main() 
{ 
     int sector_size; 
     char *buf; 
     int n = SECTOR_NO; 

     int fd = open("/dev/sda1", O_RDONLY|O_NONBLOCK); 
     ioctl(fd, BLKSSZGET, &sector_size); 
     printf("%d\n", sector_size); 
     lseek(fd, n*sector_size, SEEK_SET); 

     buf = malloc(sector_size); 
     read(fd, buf, sector_size); 

     return 0; 
} 
+0

爲什麼O_NONBLOCK?除非打開一個特殊的設備(例如調制解調器),否則您會想要阻止某些忙碌或存在挑戰的事情,是的? –

+0

此外,內核中的bdev_logical_block_size()(通過由ioctl處理程序返回,實際上在您的示例中設置sector_size)將返回一個無符號短整數。 –

+0

@tinkertim是的,你是對的! –