Unix服务器分区和文件系统布局

在互联网上有很多关于Unix服务器分区的矛盾信息,所以我需要一些关于如何进行的build议。

到目前为止,在我testing环境中的服务器上,我并不关心分区问题,而是configuration了一个单一的/另外一个交换分区。 这种分区scheme对于我们的生产服务器似乎不是一个好主意。 我在这里find了一个很好的起点,但在细节上似乎很模糊。


基本上我有一个服务器,我将运行一个基本的LAMP堆栈(Apache,PHP和MySQL)。 它将不得不处理file upload(高达2GB)。 该系统具有2TB RAID 1arrays。

我打算设置:

 / 100GB /var 1000GB (apache files and mysql files will be here), /tmp 800GB (handles the php tmp file) /home 96GB swap 4GB 

这听起来是否理智,还是我过分复杂的东西?

布置分区时要记住的一件事是失败模式。 通常这个问题的forms是:“分区x填满时会发生什么? 最亲爱的voretaq7带来了全面/造成任何难以诊断问题的情况。 我们来看一些更具体的情况。

如果分区存储日志已满,会发生什么情况? 你失去了审计/报告数据,有时被攻击者用来隐藏他们的活动。 在某些情况下,如果系统无法logginglogin事件,系统将不会对新用户进行身份validation。

/var已满时,基于RPM的系统会发生什么情况? 软件包pipe理器不会安装或更新软件包,并且根据您的configuration,可能会自动失败。

填写分区很容易,特别是当用户能够写入时。 为了好玩,运行这个命令,看看如何快速创build一个非常大的文件: cat /dev/zero > zerofile

除了填充分区之外,当您将位置放在不同的安装点上时,您还可以自定义安装选项。

/dev/未使用noexec挂载时会发生什么情况? 由于/dev通常被假定为由操作系统维护,并且只包含经常(有时仍然)用于隐藏恶意程序的设备。 离开noexec允许您启动存储在那里的二进制文件。

出于所有这些原因,更多的许多强化指南将讨论分区作为要执行的第一步之一。 实际上,如果你正在build立一个新的服务器,如何对磁盘进行分区几乎是你必须决定的第一件事情,而且往往是以后最难以改变的。 有一个名为互联网安全中心的小组,制作易读的configuration指南。 您可能会find您的特定操作系统的指南,并看到他们可能会说的任何细节。

如果我们看一下RedHat Enterprise Linux 6,推荐的分区scheme是这样的:

 # Mount point Mount options /tmp nodev,nosuid,noexec /var /var/tmp bind (/tmp) /var/log /var/log/audit /home nodev /dev/shm nodev,nosuid,noexec 

所有这些变化的原理是防止它们相互影响和/或限制在特定分区上可以完成的工作。 以/tmp的选项为例。 这就是说,没有设备节点可以在那里创build,没有程序可以从那里执行,并且set-uid位不能设置任何东西。 就其性质而言, /tmp几乎总是可写的,并且通常是只存在于内存中的特殊types的文件系统。 这意味着攻击者可以利用它作为一个简单的登台点来丢弃和执行恶意代码,然后崩溃(或者干脆重新启动)系统将清除所有的证据。 由于/tmp的function不需要任何function,我们可以轻松地禁用这些function并防止出现这种情况。

日志存储位置/var/log/var/log/audit被分割出来以帮助缓冲资源耗尽。 另外,当日志存储开始填满时,auditd可以执行一些特殊的事情(通常在更高的安全性环境中)。 通过将其放置在其分区上,此资源检测性能会更好。

为了更加详细,引用mount(8) ,这正是上面使用的选项:

noexec不允许在安装的文件系统上直接执行任何二进制文件。 (直到最近才有可能使用像/lib/ld*.so / mnt / binary这样的命令来运行二进制文件,这个技巧从Linux 2.4.25 / 2.6.0开始就失败了。

nodev不要在文件系统上解释字符或阻塞特殊设备。

nosuid不允许设置用户标识符或设置组标识符位生效。 (这看起来很安全,但是如果安装了suidperl(1),实际上是非常不安全的。)

从安全angular度来看,这些是非常好的select,因为它们可以让你保护文件系统本身。 在高度安全的环境中,您甚至可以将noexec选项添加到/home 。 这会使标准用户更难以编写用于处理数据的shell脚本,比如说分析日志文件,但是也会阻止他们执行提升权限的二进制文件。

另外,请记住,root用户的默认主目录是/root 。 这意味着它将在/文件系统中, 而不是/home

您给每个分区的数量可能因系统工作量而异。 我pipe理的典型服务器很less需要人员交互,因此/home分区不需要非常大。 这同样适用于/var因为它倾向于存储经常被创build和删除的临时数据。 但是,Web服务器通常使用/var/www作为其操场,这意味着要么需要在单独的分区上,要么/var/需要变大。

在过去,我build议以下为基准。

 # Mount Point Min Size (MB) Max Size (MB) / 4000 8000 /home 1000 4000 /tmp 1000 2000 /var 2000 4000 swap 1000 2000 /var/log/audit 250 

这些需要根据系统的目的以及您的环境如何运行来进行审查和调整。 我也build议使用LVM并分配整个磁盘。 这将允许您轻松地增长或添加分区,如果这样的事情是必需的。

忽略底层RAIDarrays( 有关RAIDarrays级别以及何时使用它们的更多详细信息,请参阅此问题 ),让我们专注于您所问的核心问题:
“我应该如何布置我的Unix服务器的文件系统?


一个巨人/分区有什么问题?

正如你在你的问题中提到的那样,很多Linux发行版(特别是像Ubuntu这样的“桌面”发行版)使用一个非常简单的文件系统布局: /[swap]

这种scheme具有简单的优点 – 对于习惯了家庭电脑的DOS / Windows用户来说,使用“硬盘驱动器”作为一个巨大的整体容器( C:\ )不得不担心文件系统上的空间不足 – 只要确保你保持在磁盘的容量之下,一切都(至less在理论上)是好的。

单文件系统scheme虽然有几个缺点,但是最经常被提到的缺点是,当根文件系统填满(到拒绝引导的时候)时,Unix系统往往反应非常糟糕,如果一切都写到/ (root )一个任性的程序或用户可以把整个系统拿下来。
单个大文件系统也容易在系统崩溃和随后的文件系统损坏的情况下完全丢失。

上面的问题以及强烈的组织意识是Unix服务器通常具有多个文件系统的原因。


你如何分解Unix文件系统?

所以希望你确信拥有多个文件系统是有道理的。 现在的问题是如何将系统分解成逻辑块,以及如何确定每个系统有多less空间?
答案是你知道并理解你的操作系统将放在哪里。 理解的起点是hier手册页。 大多数Unix系统都提供了( 来自Linux系统的人员和来自BSD系统的人员 ),加上你对当前正在安装的代码的本地知识将会引导你创build一个合理的分区布局。

我将在这里描述一个通用的分区scheme,但是这个scheme应该随时修改以满足您的特定需求。

一般Unix分区scheme

 / The "root partition", /, does not usually need to be very large. It holds the basic items needed to boot the system, mount other filesystems and get you to a running, usable, multi-user environment. It's also what is available to you when you bring up the system in single-user ("recovery") mode. The contents of / should not change or grow substantially over time. NOTE: Anything that doesn't go on one of the other partitions described below will wind up taking space on the root partition (/). /var The /var filesystem holds variable data -- log files, email, and on some systems databases (like MySQL or Postgres) store their data files here. `/var` should be "Big Enough" to hold all the data you intend to cram into it. I generally advise 10GB for systems that won't have a database or email server (just logs). If you are building a database or mail server you should obviously make `/var` larger, or carve out separate filesystems for the database/mail data. /usr The /usr filesystem holds "userland" programs, data, manual pages, etc. This is where things like the Firefox browser binary live. On systems that will have a lot of large user applications this filesystem may be very large (100GB or more), and on stripped-down servers it may be relatively small. A good rule of thumb is that the /usr filesystem should be twice as large as you need it to be in order to fit your initial installation of programs. /home The /home filesystem holds user home directories, and on desktop systems is the largest and most prone to filling up. When you download files from the internet, create spreadsheets, store a music library, etc. that data is stored in your home directory, and it adds up fast. It's important to allow enough room under /home for the "accumulated junk" you will gather over time, even on servers -- ad-hoc tarball backups, package files you copied over to install, and the like. 

特殊文件系统

 /tmp and /var/tmp The temporary scratch space (/tmp) is "special" -- on most Unix systems the contents of /tmp are cleared on reboot, and on many modern systems /tmp is a special "tmpfs" (RAM) filesystem for better performance. /var/tmp is usually "persistent temporary files" (like vi recovery files), and is not cleared on reboot The same general rule applies as for all other filesystems: Make sure your temporary scratch filesystems are big enough to hold the stuff you want to put in them. [swap] Swap Space is used by the kernel when you are running low on RAM -- The old general rule of thumb was to have at least twice as much swap as you did RAM, however on modern systems it's usually sufficient to have "enough" swap -- 2GB is a practical lower limit, and an amount between half the installed RAM and the total installed RAM is usually adequate. On modern systems with relatively huge RAM pools (12G and up) it is probably not practical to use the system if it's swapping heavily enough to warrant the old "Twice the installed RAM" rule. 

像这样刻录文件系统的做法是从没有软件突袭和磁盘驱动器很小的时代开始的,所以你必须使用其中的几个,因此,唯一的办法是打破文件系统并把不同的目录放在不同的驱动器上 其他的历史原因是,你可以轻松地卸载一个分区并将其dump为备份,这是你无法用root做的。 这个工具在很大程度上已经不受青睐,甚至可以在根目录上用于LVM快照。

没有理由再这样做了。 关于这样做的唯一原因是,如果你想,例如,防止/tmp填满整个磁盘。

这个原因现在在很大程度上是不相关的,因为提供一般shell访问的用户已经走到了一边,而现在的服务器运行专用的服务,比如web或邮件服务器。 既然你没有随机的用户能够运行任意的命令,你通常不需要担心他们试图填满你的文件系统(甚至当你做了,你有磁盘配额来阻止)。

至于使用什么raid级别,你需要记住raid的主要目的不是保护数据(这是备份的目的),而是保持正常运行时间。 如果你把/tmp放在raid0上,那么你的服务器仍然会closures,如果其中一个磁盘发生故障,你将不得不去修复它。 你也可能想用raid10而不是raid1,这样你的performance也会更好。

不打破文件系统的一个很好的理由是,如果分配错误,尽pipe在其他地方有足够的可用空间,但是可能会导致部分文件系统已满。 纠正这可能是困难的,除非您使用LVM并留下一些未分配的空间。

当磁盘空间不足时,生成了很多分区信息。 因此,您会看到很多情况下相对较小的分区。 所需的分区大小因服务器使用情况而异。 variables最多的是/tmp/varhome/opt/srv/usr往往是一个合理和稳定的大小。 空间可以包括任何或所有的其他分区和空间要求。 大小确实取决于你在做什么系统。

我会在tmpfs上增加swap和mount /tmp 。 你/tmp将使用交换作为后备存储,但使用内存可用。 你的/tmp的大小看起来非常高,但是会处理没有被清理的中止上传。

我会考虑将MySQL文件移动到/srv 。 这在磁盘层次结构中是一个相对较新的层次。

如果您不知道自己的最终需求,请考虑使用LVM并将分区扩展为填充。

取决于你的架构 – 你可能不想实际使用/ tmp,因为每次重启后它都被清除。 如果您的网站处理上传的最终处理,将其更改为另一个位置(通过php.ini)可能是一个想法; 在其中你可以使它成为任何挂载点。

如前所述,强烈build议使用LVM并根据需要进行增量。

我也强烈推荐一个专用的MySQL数据分区(你仍然可以把它挂载到/ var / lib / mysql下)。