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

时间:2012-03-03 17:56:17

标签: linux-kernel virtual limit mount loopback

我想为我们正在开发的多用户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个测试客户端用于我们的应用程序,因此当前存在的循环设备的数量不能满足我的需求。我知道你可以分配多达256个循环设备直到内核版本2.6.23,并且限制(从版本2.6.24开始)在理论上不再存在,尽管我仍然有一些顾虑。

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

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

3 个答案:

答案 0 :(得分:2)

您所描述的想法实际上是手工完成的“逻辑卷管理”(LVM)。如果您使用LVM,您将获得“它是一个众所周知的标准”和“有良好的工具支持,包括在线调整大小等”的双重奖励。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

LVM为您添加了静态分割的硬盘空间,并在其上创建了文件系统。如果是ext4或xfs,则将免费的pv空间添加到lv中,并在分配给用户或组的快速设备上调整大小。不幸的是,如果你想减小尺寸(缩小),你必须离线这样做。首先,您必须减少未安装的文件系统大小,然后必须减小lv大小。但这有风险,因为如果你将lv降低到文件系统大小以下,那么fs将会被破坏。 xfs没有收缩功能,你只能增加它。

另一种方法是更高级的文件系统。这是linux上完全支持的btrfs,或者作为linux内核模块实现的zfs,而不是保险丝。使用这些文件系统,您可以创建逻辑子卷,并在运行中增加/减少最大可用空间。所有卷都可以使用自由空间。在那些文件系统中是不可能将爱人空间分配到子体积上的那个数据,那么fs损坏是不可能的。不幸的是zfs作为模块你必须独立编译,因为没有正式的分布式linux内核支持这个fs。但你可以检查 btrfs ,它的功能现在非常接近zfs,并且内核正式支持它。

顺便说一句。 loop基于主设备号为7的块设备(参见/ dev / loop *特殊块文件),并且有64个挂载点。也许这个数字更高,但我从未实现过。 这里有一些配方如何配置更多循环:http://www.tldp.org/HOWTO/CDServer-HOWTO/addloops.html。但我的朋友告诉我一些技巧,你可以手动添加更多的循环设备,它可以在飞行中使用mknod / dev / loop8 b 7 8,mknod / dev / loop9 b 7 9等,当然不需要更换模块。 conf文件或类似文件,并在临时udev文件系统上创建,所有其他循环都将丢失。