VirtualBox 共享文件夹的 inode 不足

VirtualBox 共享文件夹的 inode 不足

我正在尝试使用 Vagrant + VirtualBox 构建一个约克托基于项目。构建过程在开始编译之前中止,因为它对磁盘空间和 inode 进行了健全性检查。vboxfs挂载似乎只显示有 1k 个可用 inode(这是 Yocto 的 PANIC 阈值)

vagrant@vagrant-ubuntu-trusty-64:/vagrant$ df -ih
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sda1        2.5M   88K  2.5M    4% /
none             975K     2  975K    1% /sys/fs/cgroup
udev             974K   401  973K    1% /dev
tmpfs            975K   322  975K    1% /run
none             975K     1  975K    1% /run/lock
none             975K     1  975K    1% /run/shm
none             975K     2  975K    1% /run/user
vagrant          1000     0  1000    0% /vagrant

我可以将共享目录 rsync 到 VM 或签出代码,但这样会抵消 Vagrant 的优势。是否可以调整vboxfs挂载设置以使其拥有更多 inode?

编辑

修改配置文件以更改恐慌阈值似乎有效。实际上有两个检查级别。“STOP”级别和“ABORT”级别。默认情况下,“STOP”设置为 100,000 个 inode。将 STOP 和 ABORT 都更改为 999 个 inode 可使构建继续进行,但我不确定这是否会在以后导致其他问题。

答案1

不幸的是,没有简单的解决方案。该值被硬编码为src/VBox/Additions/linux/sharedfolders/utils.c

int sf_get_volume_info(struct super_block *sb, STRUCT_STATFS *stat)
{
    struct sf_glob_info *sf_g;
    SHFLVOLINFO SHFLVolumeInfo;
    uint32_t cbBuffer;
    int rc;

    sf_g = GET_GLOB_INFO(sb);
    cbBuffer = sizeof(SHFLVolumeInfo);
    rc = VbglR0SfFsInfo(&client_handle, &sf_g->map, 0, SHFL_INFO_GET | SHFL_INFO_VOLUME,
                        &cbBuffer, (PSHFLDIRINFO)&SHFLVolumeInfo);
    if (RT_FAILURE(rc))
        return -RTErrConvertToErrno(rc);

    stat->f_type        = NFS_SUPER_MAGIC; /* XXX vboxsf type? */
    stat->f_bsize       = SHFLVolumeInfo.ulBytesPerAllocationUnit;
    stat->f_blocks      = SHFLVolumeInfo.ullTotalAllocationBytes
                        / SHFLVolumeInfo.ulBytesPerAllocationUnit;
    stat->f_bfree       = SHFLVolumeInfo.ullAvailableAllocationBytes
                        / SHFLVolumeInfo.ulBytesPerAllocationUnit;
    stat->f_bavail      = SHFLVolumeInfo.ullAvailableAllocationBytes
                        / SHFLVolumeInfo.ulBytesPerAllocationUnit;
    stat->f_files       = 1000;
    stat->f_ffree       = 1000; /* don't return 0 here since the guest may think
                                 * that it is not possible to create any more files */
    stat->f_fsid.val[0] = 0;
    stat->f_fsid.val[1] = 0;
    stat->f_namelen     = 255;
    return 0;
}

当然,如果您愿意自己编译共享文件夹内核模块(应该非常容易),您可以轻松地将这些值更改为更高的值。

要构建内核模块,请下载适当的 VirtualBox 源代码树并在其根目录中运行以下命令:

./configure --only-additions

成功后(表示所有依赖项都已安装),您应该能够按照屏幕上的说明进行操作。不幸的是,我遇到了 GCC 错误,我明天会进一步调查。

相关内容