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


29

关于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

这听起来很理智,还是我使事情复杂化了?


1
您的最终目标是什么?您到底想完成什么?
Scott Pack

9
无论您决定加倍努力,我建议使用LVM定义分区,然后保守地分配空间,从而留出一些未分配的磁盘空间。然后,当您决定在某处需要更多空间时,只需扩展LV和文件系统即可。
ktower 2012年

Answers:


33

布置分区时要记住的一件事是故障模式。通常,该问题的形式为:“当分区x填满时会发生什么?” 亲爱的voretaq7提出了这种情况,这完全/导致了许多难以诊断的问题。让我们看一些更具体的情况。

如果您的分区存储日志已满怎么办? 您会丢失审核/报告数据,有时攻击者会使用它们来隐藏其活动。在某些情况下,如果系统无法记录新用户的登录事件,则该系统将不对其进行身份验证。

如果基于RPM的系统/var已满,会发生什么? 程序包管理器将不会安装或更新程序包,并且根据您的配置,可能会静默失败。

填充分区很容易,尤其是当用户能够写入分区时。为了娱乐起见,请运行以下命令,并查看您可以很快地创建一个很大的文件:cat /dev/zero > zerofile

它不仅可以填充分区,而且当您将位置放置在不同的安装点时,您还可以自定义其安装选项。

/dev/不安装时会发生什么noexec 由于/dev通常假定由OS维护并且仅包含设备,因此经常(有时仍然)用来隐藏恶意程序。noexec不用担心,您可以启动在那里存储的二进制文件。

由于所有这些原因,还有更多的强化指南将讨论将分区作为要执行的第一步。事实上,如果你正在建设一个新的服务器如何对磁盘进行分区是非常接近完全第一,你的事情必须决定,并且往往是最困难后的变化。有一个名为“ Internet安全中心”的小组,负责产生易于阅读的配置指南。您可能会找到适合您的特定操作系统的指南,并查看他们可能会说的任何细节。

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

# 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为例。这就是说,无法在该处创建任何设备节点,也不能在该处执行任何程序,并且set-uid位不能设置在任何对象上。就其本质而言,/tmp几乎总是可写的,并且通常是仅存在于内存中的一种特殊类型的文件系统。这意味着攻击者可以将其用作删除和执行恶意代码的简单切入点,然后崩溃(或简单地重新启动)系统将清除所有证据。由于的功能/tmp不需要任何功能,因此我们可以轻松禁用这些功能并避免这种情况。

日志存储位置,/var/log并经过/var/log/audit切割以帮助缓冲它们,避免资源耗尽。此外,当审计的日志存储开始填满时,它们可以执行一些特殊的操作(通常在更高安全性的环境中)。通过将其放在其分区上,此资源检测性能会更好。

更加冗长,引用起来mount(8),这正是上面使用的选项:

noexec不允许在已安装的文件系统上直接执行任何二进制文件。(直到最近,仍可以使用/lib/ld*.so / mnt / binary这样的命令来运行二进制文件。此技巧自Linux 2.4.25 / 2.6.0起失败。)

nodev 请勿解释字符或阻止文件系统上的特殊设备。

nosuid不允许set-user-identifier或set-group-identifier位生效。(这似乎很安全,但实际上如果安装了suidperl(1)则相当不安全。)

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

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

您给每个分区的确切数量可能会因系统工作负载而有很大差异。我管理的典型服务器很少需要人与人之间的交互,因此/home分区根本不需要很大。这同样适用,/var因为它倾向于存储经常创建和删除的临时数据。但是,Web服务器通常将/var/www其用作游乐场,这意味着该服务器也需要位于单独的分区上,或者/var/需要变大。

过去,我建议将以下内容作为基准。

# 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

需要根据系统的目的以及您的环境如何进行检查和调整。我还建议使用LVM并避免分配整个磁盘。如果需要,可以轻松扩展或添加分区。


1
noexec观察通常是一个重要的观察点-挂载/tmpnoexec标志以避免恶意用户通过浏览器安全漏洞上传rootkit 被认为是一种好习惯。/home通常也安装类似的命令,nosuid因为没有理由让setuid二进制文件存在。Re:/dev并且noexec,在许多(尽管不是全部)现代系统/dev上,通常都是devfs文件系统,根本不允许用户创建/存储常规文件(在FreeBSD上,它返回“ Operation not supported”,在Ubuntu上,udev挂载的文件系统/dev允许您创建常规文件。 )。
voretaq7 2012年

2
@ voretaq7:是的,/tmp用作跳垫非常有趣,因为它一直都在那儿,几乎从来没有被锁定过。
Scott Pack

谢谢您的建议。我将检查noexec,因为它可以提高安全性!
布祖特2012年

12

忽略底层RAID阵列(有关RAID阵列级别以及何时使用它们的更多详细信息,请参阅此问题),让我们集中讨论您所问的核心问题:
“我应该如何布置Unix服务器的fileystem?”


一个巨大的/分区怎么了?

正如您在问题中指出的那样,许多Linux发行版(特别是Ubuntu之类的“ Desktop”发行版)都使用非常简单的文件系统布局:/[swap]

此方案具有简单性的优点-对于习惯将家用计算机使用“硬盘驱动器”作为一个大的整体容器(C:\)的DOS / Windows用户来说非常有用,您可以将其倒入其中,而不必担心关于文件系统空间不足的问题-只需确保您留在磁盘的容量之内,并且一切(至少从理论上来说)都很好。

但是,单文件系统方案有几个缺点-最常被提及的缺点是,当根文件系统填满(直到拒绝引导)以及所有内容都写入/(根)时,Unix系统往往会做出非常糟糕的反应。一个任性的程序或用户可以删除整个系统。
在系统崩溃和随后的文件系统损坏的情况下,单个大型文件系统也容易造成全部损失。

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


您如何分解Unix文件系统?

因此,希望您确信拥有多个文件系统是有意义的。现在的问题是,如何将系统分解为逻辑块,以及如何确定每个系统获得多少空间?
答案是您知道并了解您的操作系统将放置在什么位置。理解的起点是hier手册页。大多数Unix系统都带有(man hier从Linux系统,并man hier从BSD系统),并加了代码的本地知识,你安装会做会引导您创建一个健全的分区布局。

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

通用Unix分区方案

/
    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.

2
您列出的两个原因在今天已经过时了。ext [234]为root保留了一些空间,并且不允许用户程序全部使用它,因此系统不会因空间不足而出现问题,并且所有现代文件系统都使用日记功能,因此它们不会在以后损坏崩溃
psusi 2012年

2
@psusi如果root用户是写填充磁盘的文件的用户(通常是日志文件),那么为root用户保留的空间(通常是文件系统大小的5-10%)对您没有帮助。仅仅因为记录了日志文件系统,就始终可以防止损坏-日志记录可以提高鲁棒性,但是不能保证安全性(尤其是如果您偶然发现了文件系统/日志记录代码中未发现的错误并限制了日志记录,这也是不正确的) -ReiserFS人士可以从该文件系统的早期讲述一些很棒的故事)。
voretaq7 2012年

2
完好无损,/usr或者/var如果/损坏则无济于事。同样,/如果/home损坏,完整无损也不会有多大帮助。您最终不得不从任一方式从备份还原。除非您正在运行新的/不稳定的fs,更不用说这种故障是百万分之一。
psusi 2012年

4

像这样分割文件系统的做法是从没有软件袭击,磁盘驱动器很小的日子开始的,所以您必须使用其中的几个,因此,唯一的方法就是将文件系统分解并将不同的目录放在不同的驱动器上。另一个历史原因是,您可以轻松卸载分区并dump进行备份,而根分区无法做到这一点。如今,该工具已大失所望,可以在LVM快照甚至根目录上使用。

几乎没有理由再这样做。剩下要做此操作的唯一原因是,例如,要防止/tmp填满整个磁盘。

如今,这个原因在很大程度上是无关紧要的,因为向用户提供常规外壳访问的权限已经过去了,并且如今服务器运行专用的服务,例如Web或邮件服务器。由于您没有随机的用户可以运行任意命令,因此通常无需担心他们试图填充文件系统(即使您这样做了,您也可以通过磁盘配额来停止它)。

至于要使用的RAID级别,您需要记住,RAID的主要目的不是保护数据(这是备份的目的),而是维护正常运行时间。如果您/tmp使用raid0,则服务器仍将关闭,并且如果其中一个磁盘出现故障,则必须修理它。您可能还想使用raid10而不是raid1来获得更好的性能。

不破坏文件系统的一个很好的理由是,如果分配错误,尽管其他地方有很多可用空间,但最终可能会导致部分文件系统已满。除非使用LVM并留出一些未分配的空间,否则更正此操作可能很困难。


4
有很多理由继续以传统方式完善Unix文件系统。如果没有这样做的理由,我们应该已经停止-系统管理员不THAT附着于神秘的传统:)
voretaq7

1
@ voretaq7,然后命名。如果不能,那么盲目假设必须存在是愚蠢的。
psusi 2012年

1
那些不愿提出实际反对意见,而不是盲目模仿传统观点的人,应该相信。
psusi 2012年

2
通过填充来防止/ var / log占用所有内容。限制损坏到文件系统。简化备份-无论是快照还是装载遍历规则,人们通常都希望按不同的时间表进行备份。简化映像/升级。允许选择与任务相关的基于文件系统的性能。
杰夫·费兰德

1
@JeffFerland,充其量是将/ var / log放在其自己的分区上的最佳理由,但对于其他几个分区则不是这样。除非您仍在使用dump,否则备份fs的不同部分不需要将这些部分放在不同的分区上。升级不在乎一种方式。成像也不是做事的好方法。
psusi 2012年

3

当磁盘空间不足时,会生成许多分区信息。结果,在许多情况下,您将看到相对较小的分区。所需分区大小取决于服务器使用情况。变化最大的往往是/tmp/varhome/opt,和/srv/usr往往大小合理且稳定。的空间/可以包括任何其他分区或所有其他分区及其空间要求。大小调整实际上取决于您正在执行的系统。

我会增加swap,并安装/tmptmpfs/tmp然后,您将使用swap作为后备存储,但使用可用的内存。您的文件/tmp看起来非常大,但可以处理未清理的中止上传。

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

如果您不了解自己的最终要求,请考虑使用LVM并扩展分区作为填充。


小心地增加交换-进行“足够”的交换是很好的,但是如果交换过多,则永远不要使用它(因为在交换的时候,系统性能太痛苦了)。我想说的是,问题中提出的4G对于LAMP堆栈来说可能“足够”了-如果您使用4G交换(实际上是对数据进行分页和进出),您可能还会在电话中大喊大叫,因为网站很慢:)
voretaq7

1
@ voretaq7如果用于活动程序,则大小交换无关紧要。将它用于tmpfs(大文件被写到磁盘,而小文件保留在内存中)是对swap的合理使用。目的是将每个文件放在其他位置时,它可以节省将每个文件写入磁盘的时间。我建议增加交换空间,因为似乎需要很大的/tmp空间。
BillThor 2012年

为什么不使用常规文件进行交换?它们不是像专用交换分区一样快了很长时间吗?
克里斯·史密斯

@ChrisSmith常规文件应与专用分区几乎一样快,但在磁盘上可能不连续,从而导致I / O分离请求。这可以通过剥离来弥补。另外,意外删除交换文件相对容易。重新启动系统后,删除的文件将不再可见,因为它将不再具有交换空间。
BillThor 2012年

@BillThor这是正确的-如果您正在使用tmpfs并且希望将swap作为后备存储,则您应该具有“足够的”交换以满足tmpfs的需求,以及系统的适当储备。(这不是我通常想到的,因为我使用的唯一系统tmpfs被配置为不执行交换操作,因为它具有RAM余量,并且我将临时空间用于快速创建/删除的小文件:)
voretaq7

2

根据您的体系结构-您可能不希望实际使用/ tmp,因为它在每次重新启动后都会被清除。如果您的站点处理最终的上载,则可以将其更改为另一个位置(通过php.ini);您可以在其中将其设为任何挂载点。

如前所述,强烈建议使用LVM并根据需要递增。

我还强烈建议为MySQL数据提供一个专用分区(您仍然可以将其挂载在/ var / lib / mysql下)。


通常,最好假设/tmp以后可能不存在文件-以后使您免于令人不愉快的意外:-)
voretaq7 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.