在现代Linux(2.6.30+内核)系统上,我可以创建(和安装)多少个循环设备



我想为我们正在开发的多用户web应用程序实现每个目录的配额。问题是……我们已经为任何客户端实现了一个文档管理器来存储他们自己的私人文档,但我们不想因为这个功能而耗尽空间,所以我们想为他们分配一个给定的限制。

由于在Linux中似乎不存在实现每个目录配额的标准方法(我知道,配额主要针对用户或组,但我们需要类似于Windows Server 2008 R2在每个目录的基础上处理配额的方式),我选择了使用"技巧"。我基本上是这样做的:

touch client1.ext3
dd if=/dev/zero of=./client1.ext3 bs=1024 count=16384
mkfs.ext3 ./client1.ext3
mount -o loop,rw ./client1.ext3 ./mountpoint

这只是一个代码示例,但这就是想法。。。我创建虚拟"卷",分配给我的客户,这样他们就可以存储自己的私人数据,如果他们需要更多,他们可以按存储数量付费。

我看到的"问题"是,我在我的/dev/层次结构中只看到8个循环设备,而我们目前有17个应用程序的测试客户端,所以目前存在的循环设备数量无法满足我的需求。我知道,在内核2.6.23版本之前,最多可以分配256个循环设备,而且理论上(从2.6.24版本开始)这个限制已经不存在了,尽管我仍然有一些担忧。

老实说,我觉得在/dev/层次结构中填充1000多个循环设备(在整个系统生命周期内根本不会卸载这些设备)是非常错误的,而且不是应该这样做的,但作为一个中期解决方案,它可能是可行的,所以我的问题是:

  • 一个单循环设备在分配时占用多少内存
  • 分配256+时系统是否崩溃或性能受损环路设备
  • 我可以动态增加环路设备的数量吗?或者
  • 如何在启动时预先定义可用环路设备的数量时间

您所描述的想法实际上是手工完成的"逻辑卷管理"(LVM)。如果你使用LVM,你会得到"这是一个众所周知的标准"one_answers"有很好的工具支持,包括在线调整大小等"的双重奖励。

在应用程序中而不是在操作系统中跟踪存储配额。像这样创建大量的环回文件系统将浪费大量的存储空间,性能会很差,扩展能力也会更差。

LVM为您添加了静态拆分的硬盘空间,并在其上创建了文件系统。如果是ext4或xfs,则将空闲的pv空间添加到lv中,并动态调整分配给用户或组的设备的大小。不幸的是,如果你想缩小(缩小),你必须离线进行。首先,您必须减小未安装的文件系统大小,然后必须减小lv大小。但这是有风险的,因为如果将lv减小到文件系统大小以下,则fs将被损坏。xfs没有收缩功能,你只能增加它。

另一种方法是更高级的文件系统。这是在linux上完全支持的btrfs,或者zfs实现为linux内核模块,而不是fuse。使用这些文件系统,您可以创建逻辑子卷,并随时增加/减少最大可用空间。可用空间对所有卷都是公用的。在那些文件系统中,不可能将情人空间分配到其上的数据的子卷中,那么fs损坏就不可能以这种方式发生。不幸的是,zfs作为模块必须独立编译,因为没有官方的分布式linux内核支持这个fs。但是您可以查看btrfs,它的功能现在非常接近zfs,并且它得到了内核的正式支持。

顺便说一句。loop基于主编号为7的块设备(请参阅/dev/loop*特殊块文件),并且有64个可用的装载点。也许这个数字更高,但我从来没有做到过。以下是如何配置更多循环的一些方法:http://www.tldp.org/HOWTO/CDServer-HOWTO/addloops.html。但是我的朋友告诉我一些技巧,你可以手动添加更多的循环设备,它将可以通过mknod/dev/lop8 b 7 8、mknod/dev/lop9 b 7 9等随时使用。当然,如果不更改modules.conf文件或类似文件,也不在临时udev文件系统上创建,所有额外的循环都将丢失。

相关内容

最新更新