我正在尝试通过 mtd 和 nandsim 从目录“root”创建一个包含单个卷的 btrfs 文件系统。
在我的根目录中有一些令牌文件和目录,并成功创建并挂载了文件系统:
sudo modprobe mtdblock
sudo flash_erase /dev/mtd0 0 0
sudo mkfs.btrfs -m single -s 2048 -r root /dev/mtdblock0
世界上一切都好。现在,我添加根目录的实际内容:一些元数据文件,以及每个 2k 的不到 128k 的二进制文件。当我再次尝试相同的方法时,mkfs.btrfs 失败并显示“错误:无法将输出文件清零”。
在里面源代码,如果对 pwrite64() 的任一调用失败,则第 407 行的违规方法将失败。我不明白为什么这会失败,除非系统调用对其允许的总体大小有一些限制?
也就是说,在具有充足 RAM 和磁盘空间的系统上,我的设备只有 256MB——这似乎不太可能。
有人能指出我正确的方向吗?我是否错过了一些关键步骤?
如果重要的话,我在 Bionic 18.04 内核 4.15.0-99-generic 上使用 btrfs-progs v4.15.1
答案1
-r
当我尝试使用或选项预填充 BTRFS 文件系统时,我遇到了同样的错误--rootdir
。就我而言,问题是 rootdir 中的文件在添加所有大小后大于我尝试写入 BTRFS 文件系统的块设备。使用 rootdir 选项时,mkfs.btrfs
将 rootdir 中的所有文件大小相加,然后在给定的块设备/文件中的该位置写入零字节。当给定 I 设备并且写入超出设备末尾时,将会发生错误,并显示所描述的错误消息“错误:无法将输出文件清零”。给定文件而不是块设备,这通常不是问题,因为文件的大小将调整为最大写入位置的位置的大小。在这种情况下,错误消息可以得到极大的改善,这里有一个github问题为了这。
因此,我会du -hs --apparent-size root
验证该数字是否小于 /dev/mtdblock0 的大小。
此外,您的flash_erase
调用似乎关闭了,因为它需要一个起始块和要擦除的块数。您要擦除的块数设置为 0。