我正在尝试使用 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 错误,我明天会进一步调查。