根据大家所见,服务器系统上 /tmp 的推荐配置是什么以及原因。多年来,我曾就这些观点进行过讨论,有时也存在基本的分歧。
以下是我看到的基本问题。有些人可能会建议将这些问题分成几个问题来问,但我认为如果这些信息都放在一个标题下,管理员可能会更容易理解。我相信这会很有用。
特别是对于 /tmp:
应该 ln -s /var/tmp /tmp 吗?
重启后是否应该保留 /tmp?
/tmp 是否应该位于真实的磁盘区域或允许基本上在 SWAP 区域(或 tmpfs)上实现?
/tmp 是否应与 /(根)磁盘位于不同的磁盘上?
您是否会将 /tmp 放置在与 / (根)磁盘不同的磁盘控制器上?
/tmp 的大小有什么经验法则吗?
系统启动时,您将如何管理 /tmp 空间?删除所有超过一定期限的文件?保留该区域,直到其达到最大期限的百分比?
是否应实施任何程序性项目来管理这一领域?
答案1
特别是对于 /tmp:
- 应该 ln -s /var/tmp /tmp 吗?
对于完整的内存磁盘映像(例如“实时启动 CD”),这可能是可以接受的,因为需要压缩 RAM 的每个字节。否则,除非您磁盘空间紧张,否则不行。/var 有其自己的特性,在执行系统维护时将 /tmp 与 /var/tmp 混合可能会产生意想不到的后果。它还增加了一个额外的依赖关系,即必须安装 /tmp 才能使 /var/tmp 正常运行;并非所有东西都需要 /tmp,您可能会遇到想要将其迁移到其他分区或驱动器但无法迁移的情况,因为您不想卸载 /var。
- 重启后是否应该保留 /tmp?
不。如果您将此作为一种一致的行为,那么您迟早会遇到问题。
- /tmp 是否应该位于真实的磁盘区域或允许基本上在 SWAP 区域(或 tmpfs)上实现?
当它被大量使用时,这是一个诱惑——“我们将 /tmp 放入 RAM 磁盘,它将加快访问速度,当系统重新启动/关闭时,就没有什么可清理的了”。但是,如果您正在考虑将临时空间实现为将被交换的 RAM 磁盘,那么我会考虑其他程序对系统的交换空间使用的影响。如果交换是作为系统处于危急状态并需要它时的一种“紧急溢出”形式,那么您最不希望看到的是交换空间被失控的进程占用,从而填充 /tmp,消耗内存,导致 VM 子系统面临交换到磁盘的压力。在交换活动和流入 RAM 磁盘的额外 I/O(这反过来可能会导致额外的页面调入以满足 seek() )之间,您的系统将很快受到 I/O 限制。
- /tmp 是否应与 /(根)磁盘位于不同的磁盘上?
最好是,是的,尽管这不是必需的。如果您大量使用它,或者有需要它的持续工作量,那么肯定是的。假设示例:将临时文件转储到 /tmp 的数据库将通过将 /tmp 引入单独的主轴(即驱动器)获得轻微的速度提升。
- 您是否会将 /tmp 放置在与 / (根)磁盘不同的磁盘控制器上?
如果您对可恢复性或者速度有要求,那么就应该考虑。
- /tmp 的大小有什么经验法则吗?
它应该能容纳您预期工作量的 2 倍。我的意思是,如果您的本地用户经常使用此空间,迟早会有人做一些愚蠢的事情并试图填满它。稍微超出一点将使您能够避免程序因临时文件填满剩余空间而停止的奇怪“问题”。
如果这是“通用服务”安装,其中服务器提供一个或多个网络服务,但不承载用户,那么这可能会偏低。如果这是多用户安装,那么这将偏高(是的,仍有地方接待实际用户而不仅仅是他们的网络服务)。
- 系统启动时,您将如何管理 /tmp 空间?删除所有超过一定期限的文件?保留该区域,直到其达到最大期限的百分比?
看看tmpwatch命令,我认为您会发现它非常适合您问题的这一部分。该命令只是删除超过一定时间(以小时为单位)的任何文件。根据文件填充的速度,您可以删除 30 天、45 天、90 天等文件。
- 是否应实施任何程序性项目来管理这一领域?
我建议如下:
- 所有文件都是暂时的,并且不能保证在重启后仍然存在。
- 超过 %age 的陈旧文件将在当地时间每晚午夜通过运行 tmpwatch 命令的 cron 作业被删除。
其余的则取决于您的具体需求。
答案2
很大程度上取决于您使用的特定应用程序负载。一些应用程序服务器(SunONE、旧版 Netscape 产品)会将几百到几千个文件写入 /tmp - 在这种情况下,您确实不希望它成为已安装的 ramdisk,而且也没有理由在重新启动之间保留它。
服务器变得越来越不通用,而越来越具有特殊用途——这种类型的问题(以及类似的“如何分区我的系统”的问题)实际上取决于你的装备。
我最近有一台服务器,大约 4 年后第一次重新启动 - 它在启动过程中卡住了,删除了 /tmp 中的所有文件 - 那里有太多垃圾,我花了一个小时才清理干净。如果你的机器不经常重新启动,定期清理它绝对是个好主意。
答案3
根据经验,我建议不要混合 /var/tmp 和 /tmp 目录。
原因是 /var(希望)是您的所有日志、缓存和服务数据(例如数据库)的驻留位置。通常,将 /var 放在单独的分区上是一个好主意,这样如果发生重大数据事件(例如大量日志记录或数据库写入),您的根分区和 /tmp 分区仍将有可用空间来可靠地运行。
例如,我刚从一个没有遵循此做法的站点回来(即所有内容都放在一个分区上),由于日志累积,整个系统瘫痪了。如果遵循合理的分区布局,/var 分区将耗尽空间,但服务器仍将保持响应。
答案4
我会考虑的一件事——参考你的最后一个问题——是使 /tmp noexec,nosuid——也就是说,没有可执行文件能够从 /tmp 运行,也没有 suid 二进制文件能够切换用户 ID。但是,这可能会影响某些程序,因此在完全依赖它之前请先进行测试——我认为 ssh 就是其中之一,但我忘了。
这是一项安全措施,可以提高您对 /tmp 的安全性。
还有一件事:很多用户会尝试使用 /tmp 作为永久临时存储:任何强制清理 /tmp 的操作都必须与用户教育一起进行:提醒他们 /tmp 是暂时的放置在那里的任何东西都可能随时消失。