互联网上有很多关于 Unix 服务器分区的矛盾信息,所以我需要一些关于如何进行的建议。
到目前为止,在我们测试环境中的服务器上,我并不真正关心分区,我配置了一个单一的单体/
加上一个交换分区。这种分区方案对于我们的生产服务器来说似乎不是一个好主意。我在这里找到了一个很好的起点,但在细节上似乎很模糊。
基本上我有一台服务器,我将在其上运行基本的 LAMP 堆栈(Apache、PHP 和 MySQL)。它将必须处理文件上传(最多 2GB)。该系统有一个 2TB RAID 1 阵列。
我打算设置:
/ 100GB
/var 1000GB (apache files and mysql files will be here),
/tmp 800GB (handles the php tmp file)
/home 96GB
swap 4GB
这听起来理智吗,还是我把事情复杂化了?
布置分区时要记住的一件事是故障模式。通常这个问题的形式是:“当分区x填满时会发生什么?” 最亲爱的 voretaq7 提出了一个完整的情况,
/
导致许多难以诊断的问题。让我们看一些更具体的情况。如果您的分区存储日志已满,会发生什么情况? 您会丢失审计/报告数据,有时会被攻击者用来隐藏他们的活动。在某些情况下,如果无法记录新用户的登录事件,您的系统将不会对新用户进行身份验证。
基于 RPM 的系统在
/var
满时会发生什么? 包管理器不会安装或更新包,并且根据您的配置,可能会静默失败。填充分区很容易,尤其是当用户能够写入时。为了好玩,运行这个命令,看看你能多快地制作一个相当大的文件:
cat /dev/zero > zerofile
.它不仅限于填充分区,当您将位置放置在不同的挂载点上时,您还可以自定义它们的挂载选项。
/dev/
没有安装时会发生什么noexec
? 由于/dev
通常假定由操作系统维护并且仅包含设备,因此它经常(有时仍然)用于隐藏恶意程序。离开noexec
允许您启动存储在那里的二进制文件。由于所有这些以及更多原因,许多强化指南将讨论分区作为要执行的首要步骤之一。事实上,如果您正在构建一台新服务器,如何对磁盘进行分区几乎是您必须决定的第一件事,而且通常也是最难在以后更改的。有一个名为Internet 安全中心的组织,它制作大量易于阅读的配置指南。您可能会找到针对您的特定操作系统的指南,并查看他们可能会说的任何细节。
如果我们看一下 RedHat Enterprise Linux 6,推荐的分区方案是这样的:
所有这些更改背后的原则是防止它们相互影响和/或限制可以在特定分区上执行的操作。以选项
/tmp
为例。也就是说,不能在那里创建设备节点,不能从那里执行任何程序,也不能在任何东西上设置 set-uid 位。就其本质而言,/tmp
它几乎总是世界可写的,并且通常是一种只存在于内存中的特殊类型的文件系统。这意味着攻击者可以将其用作一个简单的中转点来放置和执行恶意代码,然后崩溃(或简单地重新启动)系统将清除所有证据。由于 的功能/tmp
不需要任何这些功能,我们可以轻松禁用这些功能并防止出现这种情况。日志存储位置
/var/log
和/var/log/audit
被分割以帮助缓冲它们免受资源耗尽。此外,auditd 可以在其日志存储开始填满时执行一些特殊操作(通常在更高安全性环境中)。通过将其放在其分区上,此资源检测性能更好。更详细地说,引用
mount(8)
,这正是上面使用的选项:从安全的角度来看,这些都是非常好的选择,因为它们允许您对文件系统本身进行保护。在高度安全的环境中,您甚至可以将
noexec
选项添加到/home
. 这将使您的标准用户更难编写用于处理数据的 shell 脚本,比如分析日志文件,但它也会阻止他们执行提升特权的二进制文件。另外,请记住 root 用户的默认主目录是
/root
. 这意味着它将在/
文件系统中,而不是在/home
.根据系统工作负载的不同,您为每个分区提供的确切数量可能会有很大差异。我管理过的典型服务器很少需要人员交互,因此
/home
分区根本不需要很大。这同样适用于/var
因为它倾向于存储经常创建和删除的相当短暂的数据。但是,Web 服务器通常/var/www
用作其游乐场,这意味着它也需要位于单独的分区上或/var/
需要变大。过去,我推荐以下内容作为基线。
这些需要根据系统的目的以及您的环境的运行方式进行审查和调整。我还建议使用 LVM 而不是分配整个磁盘。如果需要,这将允许您轻松地增长或添加分区。
忽略底层 RAID 阵列(有关 RAID 阵列级别以及何时使用它们的更多详细信息,请参阅此问题),让我们专注于您要问的核心问题:
“我应该如何布置我的 Unix 服务器的文件系统?”
一个巨大的
/
分区有什么问题?正如您在问题中指出的那样,许多 Linux 发行版(尤其是像 Ubuntu 这样的“桌面”发行版)使用非常简单的文件系统布局:
/
和[swap]
.这个方案的优点是简单——它非常适合 DOS/Windows 用户,他们习惯于将“硬盘驱动器”作为一个大的整体容器 (
C:\
) 在他们的家庭 PC 中转储东西,而且你不必担心关于文件系统上空间不足的问题——只要确保您保持在磁盘容量以下,并且一切(至少理论上)都很好。单文件系统方案有几个缺点 - 最常被提及的缺点是当根文件系统填满时(到拒绝启动的程度),并且如果一切都在写入
/
(根) ,Unix 系统往往会做出非常糟糕的反应一个任性的程序或用户可以破坏整个系统。单个大型文件系统也很容易在系统崩溃和随后的文件系统损坏的情况下完全丢失。
上述问题,加上强烈的组织意识,是 Unix 服务器通常具有多个文件系统的原因。
你如何分解 Unix 文件系统?
所以希望您确信拥有多个文件系统是有意义的。现在的问题是如何将系统分解为逻辑块,以及如何决定每个逻辑块获得多少空间?
答案是您知道并了解您的操作系统将把什么放在哪里。这种理解的起点是
hier
手册页。大多数 Unix 系统都带有(man hier
来自 linux 系统和man hier
BSD 系统),加上您对要安装的代码的本地知识将指导您创建合理的分区布局。我将在这里描述一个通用的分区方案,但是应该始终修改这个方案以满足您的特定需求。
一个通用的 Unix 分区方案
特殊文件系统
像这样分割文件系统的做法是从没有软件突袭的时代开始的,磁盘驱动器很小,所以你必须使用其中的几个,因此,唯一的方法就是把文件系统分解并将不同的目录放在不同的驱动器上。它的另一个历史原因是您可以轻松卸载分区并将
dump
其用于备份,这是 root 无法做到的。如今,该工具已基本失宠,甚至可以用于根目录上的 LVM 快照。几乎没有理由再这样做了。剩下这样做的唯一原因是,例如,如果您想要防止
/tmp
填满整个磁盘。这个原因现在已经无关紧要了,因为向用户提供一般的 shell 访问权限已经被搁置了,而且现在服务器运行专用服务,例如 Web 或邮件服务器。由于您没有能够运行任意命令的随机用户,因此您通常不必担心他们会试图填满您的文件系统(即使您这样做了,您也有磁盘配额来阻止它)。
至于使用什么 raid 级别,您需要记住 raid 的主要目的不是保护数据(这就是备份的目的),而是保持正常运行时间。如果你
/tmp
装上 raid0,那么你的服务器仍然会宕机,如果其中一个磁盘出现故障,你就必须去修理它。您可能还想使用 raid10 而不是 raid1,这样您也可以获得更好的性能。不分解文件系统的一个很好的理由是,如果分配错误,尽管其他地方有足够的可用空间,但最终文件系统的一部分可能已满。纠正这个问题可能很困难,除非您使用 LVM 并留下一些未分配的空间。
当磁盘空间不足时会生成很多分区信息。因此,在许多情况下,您会看到相对较小的分区。所需的分区大小因服务器使用情况而异。变化最大的往往是
/tmp
、/var
、home
、/opt
和/srv
。/usr
趋于合理和稳定的大小。空间/
可以包括任何或所有其他分区及其空间要求。大小实际上取决于您在系统中执行的操作。我会增加
swap
并安装/tmp
在tmpfs
. 然后,您/tmp
将使用交换作为后备存储,但使用可用的内存。您的尺寸/tmp
看起来非常大,但会处理未清理的中止上传。我会考虑将 MySQL 文件移动到
/srv
. 这是磁盘层次结构中相对较新的级别。如果您不知道您的最终要求,请考虑使用 LVM 并扩展您的分区作为填充。
根据您的体系结构 - 您可能不想实际使用 /tmp,因为它在每次重新启动后都会被清除。如果您的站点处理上传的最终处理,将其更改为另一个位置(通过 php.ini)可能是个好主意;您可以在其中将其设置为任何挂载点。
如前所述,强烈建议使用 LVM 并根据需要递增。
我还强烈建议为 MySQL 数据创建一个专用分区(您仍然可以将其挂载在 /var/lib/mysql 下)。