2012-03-03 30 views
2

我想为我们正在开发的多用户Web应用程序实现每个目录的配额。问题是...我们已经为任何客户端实现了一个文档管理器来存储他们自己的私人文档,但是由于这个功能我们不想用尽空间,所以我们想给它们指定一个限制。我可以在现代Linux(2.6.30+内核)系统上创建(并挂载)多少个环路设备?

由于在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开始)在理论上不再存在,尽管我仍然有一些担忧。

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

  • 单个循环设备分配多少内存?
  • 系统崩溃或性能命中256+分配 循环设备?
  • 我可以动态增加循环设备的数量吗?或...
  • 如何在开机 时间预定义可用循环设备的数量?
+1

会创建一个组来拥有该目录并为其分配一个配额工作吗? – slezica 2012-03-03 17:59:21

+0

只需尝试一下,看看它是否有效。内存使用似乎并不是问题。 – Tobu 2012-03-03 18:02:32

+1

此外,这个重复。 LVM是一个好主意:http://serverfault.com/questions/100596/linux-quota-per-directory – Tobu 2012-03-03 18:04:50

回答

2

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

+0

是的......这正是我所寻找的......我仍然必须学习如何正确地管理逻辑卷,但是这节省了我的一天,所以我不必在系统中执行任何肮脏的技巧。 非常感谢! :) – 2012-03-04 19:22:07

1

跟踪应用程序中的存储配额,而不是在操作系统中。像这样创建大量的环回文件系统会浪费大量的存储空间,性能不佳并且规模越来越差。

+0

存储跟踪已经在我们的应用程序中实现,特别是在文档管理器中。问题在于Linux有一个配额的概念,它与我们想要/需要完成的任务不兼容(因此我对Windows Server 2008如何处理配额的评论,这正是我们需要的,但是在Linux服务器中)。 – 2012-03-03 18:49:02

0

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

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

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

相关问题