【问题标题】:Read blocks from an ext3 filesystem?从 ext3 文件系统读取块?
【发布时间】:2009-11-04 23:54:15
【问题描述】:

在块级别访问 ext3 文件系统的最简单方法是什么?我不关心文件或原始字节,我只需要一次读取 FS 一个块。有没有一种简单的方法可以做到这一点(在 C 中)?或者也许是一个简单的应用程序,我可以从它的来源中寻找灵感?我在网上找不到可用的教程,我有点害怕深入内核源代码来了解如何去做。

【问题讨论】:

  • dd 提供了这样的功能。据我记得你可以定义偏移量和长度等。

标签: linux ext3


【解决方案1】:

如果您想要一个简单的应用程序,那么我建议您可以查看“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;
}

【讨论】:

  • 为什么选择 O_NONBLOCK?除非打开特殊设备(即调制解调器),否则您会想要打开以阻止繁忙或存在挑战的事情,是吗?
  • 此外,内核中的 bdev_logical_block_size()(在您的示例中实际上通过由 ioctl 处理程序返回来设置扇区大小)返回一个无符号短整数。
  • 仍然是最佳答案。正是因为这个原因,“dd”在 UNIX 诞生之初就已经存在,它非常有用,是如何管理块开发操作的一个很好的例子。
  • @tinkertim 是的,bdev_logical_block_size() 返回 unsigned short 但 ioctl 返回 int,我可以在 blkdev_ioctl() 函数的 BLKSSZGET 案例中看到 put_int,因此在用户代码中使用 int 是安全的。
  • @vinit dhatrak:现在你是对的! :) 如果 FD 确实有效,我开始思考 ioctl() 不会返回签名的 errno。咖啡不够。
【解决方案2】:

是的,请参阅e2fsprogs。这提供了可用于对 ext2、ext3 和 ext4 文件系统执行任何操作(!)的工具。它还包含一个库接口,因此您可以执行任何其他操作。

查看包含的调试文件,这可能足以让您开始。否则,请检查标题并编写一些代码。

【讨论】:

    【解决方案3】:

    磁盘设备和其中的分区就像您可以读取(和写入)的常规文件一样,例如:

    head -c 2048 /dev/sda1 > first_2048_bytes
    

    你当然需要是 root。

    【讨论】:

    • 我认为通常你会先找到dd... Linux 不在乎,但传统上块设备只允许块 I/O。
    • 同意ehemient,dd是更好的工具。
    • 同意,只是认为指出磁盘设备可以像普通文件一样处理可能会有所帮助(这让我感到惊讶,几年前来自 DOS...)
    • DOS 允许您将LPT1 之类的设备也视为常规文件;)实际上,Linux 允许您在块设备上进行字节对齐的查找/读取/写入,但大多数其他 UNIX 禁止这样做,所以它们不能真正被视为普通文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    相关资源
    最近更新 更多