将 tmpfs 视为 grep 的设备

Treat tmpfs as a device for grep

我必须测试我的程序,它会从磁盘中完全删除文件及其内容。为了测试我做了以下事情:

  1. 创建一个包含一些已知字符串的文件。
  2. 我的程序删除了文件。
  3. 我在文件所在的磁盘上搜索字符串。为此,我让 grep 将磁盘视为一堆原始数据:
$ grep -a -o -c 'some_string_to_be_found' /dev/sda1

测试确实按预期工作(如果我手动删除文件,则找到字符串,如果我的程序删除它,则不会)。

问题是磁盘可能很大,所以需要很长时间才能完成测试。另外,磁盘的标签在不同的机器上可能会有所不同。

因此我想到了如何使用虚拟文件系统。使用 tmpfs 在 RAM 中创建磁盘:

pc:/mnt$ mkdir tmpfs
pc:/mnt$ chmod 777 tmpfs/
pc:/mnt$ mount -t tmpfs -o size=50M tmpfs /mnt/tmpfs/

create/fill/delete 一个文件,然后尝试找到它的内容,使用类似:

$ grep -a -o -c 'some_string_to_be_found' /dev/tmpfs

问题是它导致

grep: /dev/tmpfs: No such file or directory

所以问题是:是否可以将 tmpfs 用作设备,或者读取为虚拟文件系统分配的原始内存?

虽然我还没有找到如何将 tmpfs 视为设备的方法,但有一种方法可以解决我上面描述的任务(可能对某些人有用)。

我们将文件视为设备。算法如下:

  1. 创建指定大小的空文件:

     # touch storage_file
     # truncate -s 10M storage_file
    
  2. 在该文件中创建一个文件系统:

     # mkfs.ext4 storage_file
    
  3. 现在我们可以从该文件创建一个设备并将其作为普通磁盘安装:

     # losetup /dev/loop0 storage_file
     # mkdir /mnt/loopfs
     # mount -o loop /dev/loop0 /loopfs
    
  4. 就这些了。我们能够将文件视为设备。 Create/delete任意files/directories里面吧。 grep/dev/loop0 按预期工作,w/o 处理整个物理存储设备,仅在 storage_file 内爬行。