企业Linux系统的运维成为目前企业关注的重点。作为一种优秀的开源网络操作系统,如何充分利用Linux的工具并使用相应的方法来提高运维效率是非常重要的工作。在第一篇文章中,我们介绍了运维相关的4个应用工具的使用和实战,本文作为该专题的第二篇文章,将着重介绍运维过程中的重要原则和方法,包括如何避免产生问题以及如何解决系统问题的内容,以为企业Linux的实际运维提供有益参考。
Need to Know I:系统管理员与系统用户增强沟通
作为一个系统管理员的主要职责之一是与系统用户通信。当为维修系统而停机时,当上线一类新软件以及发布用户如何访问新的系统打印机时,需要发布公告。甚至可以开始充当一个地方小报的角色,让用户知道新员工、RIF、生日、公司野餐信息等。
不同的通信有不同的侧重点。例如,在两个月内的公司野餐的信息与将在五分钟内关闭系统的消息的敏感度是不一样的。为了满足这些不同的需求,Linux 提供了不同的通信方式。下面的列表描述和对比了最常用的方法。这些方法通常会提供给所有用户,除了当天消息通常只为具有 root 权限的用户保留外。
有如下工具(实用程序)可以增强系统管理员与系统用户的通信和沟通。
Write:使用 write 实用程序可以与在本地系统上登录的用户进行通信。例如,可以使用它来要求用户停止运行拖慢系统的程序,该用户可能会回复说:他将在三分钟内完成。用户还可以使用 write 来要求系统管理员挂载磁带或恢复文件。write 发送的消息可能不会出现在图形环境中。
IM:Empathy IM(Internet 消息 ; live.gnome.org/Empathy)实用程序使用 Google Talk、MSN、IRC、AIM、Facebook、雅虎、ICQ 以及其它协议,支持文本、语音、视频聊天和文件传输。使用时,可点击主菜单:Applications?Internet?Empathy Internet Messaging。IM 常见于许多工作场所,可以用它来联系 Red Hat 支持。
Wall:wall(write all)实用程序可以有效地与所有登录用户即时通信。此实用程序从标准输入获得输入,工作方式很像 write,只不过用户不能使用 wall 来只写回你一个人。当要关闭系统或在其它危机情况下,可使用 wall。没有登录的用户将无法得到消息。只有在危机情况下才可以使用 root 权限的用户身份运行 wall; 它会中断任何人在做的任何工作。wall 发送的消息可能不会出现在图形环境中。
Email:电子邮件用于与一个或多个系统和 / 或远程用户进行不太紧急的通信。发送邮件后,你必须愿意等待每个用户来阅读它。电子邮件可用于提醒忘了注销的用户,他们的帐单已逾期,或他们使用了太多的磁盘空间。与通过 write 收到的消息相反,用户可以轻松地永久存储通过电子邮件接收的消息记录,因此他们可以随时跟踪重要的细节。举例来说,使用电子邮件告知用户一个新的复杂操作过程,以便每个用户都可以保留一份信息副本,以供参考。
当日消息:用户每次在文本环境中登录时会看到当日消息,而当他们打开终端仿真器窗口时则不会看到。必要时,可以编辑 /etc/motd 文件以更改此消息。当日消息可以提醒用户将要进行的定期保养、新的系统功能或程序的更新信息。
Need to Know II:运维过程中可能产生的问题
即使是经验丰富的系统管理员也会犯错误,当然新的系统管理员犯的错误会更多。虽然可以通过细心阅读以及遵循软件文档的指示来降低出问题的可能性,但很多事情仍然会出问题。一个列表不管多长,都不可能是全面的,因为每天都会产生新的问题。本节将介绍一些常见技能,以避免问题的出现。
第一,执行定期备份:对一个系统管理员来说,没有什么比永远丢失重要信息更痛苦。如果本地系统支持多用户,有最近的备份可能是防止公共谴责的唯一保障。如果是单用户系统,当丢失一块硬盘或误删文件时,有最近的备份也肯定使你快乐。
第二,阅读和遵循指示 :软件开发人员提供了文档。即使已经安装了软件包,也要再次仔细阅读说明书。它们可能已有所改变,或者你可能记得不对。软件更改比书的修订更快速,因此没有任何说明书可以做到万无一失。所以,需要寻找最新的在线文档进行参考。/usr/share/doc 目录中有许多实用程序、库和软件包的相关信息。
当指示不明确时,需要寻求帮助:如果指示似乎不明确,尝试找到明确的指示。
最后,在关键文件中删除或误输信息:一个肯定会给自己带来恶梦的方式是执行命令。也许没有其它命令会使 Linux 系统无用的如此之快。唯一的办法是从安装介质启动以恢复已安装的系统,并从最近的备份中恢复丢失的文件。虽然这个例子描述的是一个极端的情况,许多文件都是系统正常运作的关键。删除这些文件之一或在其中的文件中误输信息,都几乎可以肯定会造成问题。例如如果直接编辑 /etc/passwd 文件,在某个字段中输入错误信息会导致一个或多个用户无法登录。此外,不要在 rm �C rf 中使用包含通配符的参数,输入命令后要暂停一下并阅读它,然后才按回车键。仔细检查所做的一切,在对关键文件进行编辑之前一定要为其制作一份副本。尤其值得注意:rm 与通配符一起使用时要小心。当必须在 rm 命令中使用包含通配符的参数(如 *)时,指定 i 选项以使 rm 在删除每个文件之前进行提示。或者,可以以相同的参数使用 echo 命令,以查看哪些文件将被删除。当使用 root 权限时,这种检查就显得尤为重要。
方法:运维过程中的实际问题解决方法
系统管理员的责任是保持系统安全和顺利运行。当用户遇到问题时,通常会找管理员帮助其回到正轨。本节建议的方法可以保持用户满意度和系统最佳性能。
“十步法”为用户解决无法登录问题
当用户无法在系统上登录时,根源可能是用户错误或系统的软硬件故障。下面的十个步骤可以帮助确定问题所在。
第一步:检查 /var/log 中的日志文件。/var/log/messages 文件收集系统错误、来自守护进程的消息以及其它重要信息。它可能会表明问题的原因或更多症状。另外,检查系统控制台。有时系统问题相关的消息不写入 /var/log/messages 中(例如一个完整的磁盘),而是显示在系统控制台上。
第二步:确定是否只有一个用户或一个用户的终端 / 工作站有问题或者是否问题更广。
第三步:确定该用户没有打开其 CAPS LOCK 键。
第四步:确保该用户的主目录存在,并且在 /etc/passwd 文件中有对应于该用户的条目。验证该用户拥有其主目录和启动文件,并且它们是可读的(而且该用户对其主目录有可执行权限的情况下)。确认在 /etc/passwd 中的该用户登录 shell 条目是准确的,并且存在指定的 shell。
第五步:如果用户忘记了自己的密码,则更改该用户的密码。
第六步:检查该用户的启动文件(.profile、.login、.bashrc 等)。该用户可能已对这些文件之一进行了编辑,并引入了禁止登录的语法错误。
第七步:检查终端或终端与计算机之间的数据线。尝试关闭终端或显示器,然后再重新打开。
第八步:当问题似乎比较广时,检查能否从系统控制台登录。确保系统未在单用户模式。如果无法登录,系统可能已崩溃,需要重新启动它,并执行任何必要的恢复步骤。
第九步:使用 df 来检查整个文件系统。如果 /tmp 文件系统或该用户的主目录已满,登录有时会以意想不到的方式失败。在某些情况下,可能能够登录到文本环境,但不能登录到图形环境。用户登录时启动的应用程序无法创建临时文件,或无法更新用户主目录中的文件时,登录过程本身可能会终止。
第十步:如果用户通过网络连接登录,需要重新启动该用户尝试使用的服务(例如 ssh)。并请确保两个系统上的时钟是同步的。当使用 HTTPS、ssh、LDAP 尤其是 kerberos 等加密登录方法时,时钟设置的时间不同可能会导致登录失败。还要请确保 DNS 正常工作。一些网络服务与名称解析的相关性比较强,包括反向查找(即名称解析问题会导致拖慢通过 ssh 的连接)。
加快系统运行速度
当系统由于不明原因运行缓慢时,也许是用户注销时没有关闭进程。此问题的表现包括很长的响应时间和很大的系统负荷,如使用 w 或 uptime 所示的数据大于 1.0。最好运行 top 以迅速找到流氓进程。使用 ps �C ef 可列出所有进程。在 ps �C ef 输出中要找的内容是大量的 TIME 列。例如,如果 Firefox 进程的 TIME 字段超过 100.0,这一进程有可能运行不正常。然而,如果该用户正在执行大量的 Java 工作,并且已经登录很长时间,这个值就可能是正常的。检查 STIME 字段以查看该进程启动的时间。如果该进程的运行时间比用户登录在线的时间还长,最好终止它。
当用户遇到问题,并在没有通知任何人的情况下离开无人值守的终端时,最好终止该用户拥有的所有进程。如果用户在控制台上运行 GUI,终止启动桌面环境的进程或窗口管理器本身。还要继续查找包括 gnome-session、startkde 或其它以 wm 结尾的进程名。通常窗口管理器既是第一个也是最后一个要运行的进程,并在用户注销时退出。如果终止窗口管理器不起作用,可尝试终止 X 服务器进程,这个进程通常列为 /usr/bin/Xorg。如果上述操作失败,当以该用户身份登录时,通过执行 kill �C 15 �C 1 命令或等效的 kill �C TERM �C 1 命令,可以终止用户拥有的所有进程。使用�C 1 替换进程 ID 以告诉 kill 来给该用户拥有的所有进程发送信号。例如,作为 root 可以输入以下命令:
# su zach -c 'kill -TERM -1' |
如果不能终止所有进程(有时 TERM 无法终止进程),可以使用 KILL 信号(�C 9)。下面这行一定会终止 Zach 拥有的所有进程,但不太友好:
# su zach -c 'kill -KILL -1' |
如果不包含 su zach �C c,这个命令将关闭系统。
掌握和查找打开的文件
lsof(列出打开的文件)实用程序会显示打开的文件名。其选项仅显示某些进程,只有一个进程的某些文件描述符,或只有某些网络连接(网络连接使用文件描述符,就像普通文件一样,lsof 也显示这些)。使用 ps �C ef 确定了可疑进程后,输入以下命令:
# lsof -s -p pid |
用可疑进程的进程 ID 替换 PID,lsof 会显示 PID 进程打开的文件描述符列表。�C s 选项显示所有打开文件的大小,�C p 选项则允许指定感兴趣的进程 PID 号(如果组合这些选项,则 lsof 不会运行)。文件大小信息用于确定该进程是否打开了一个非常大的文件。如果是这样,需要联系该进程的所有者,或者在必要情况下终止该进程。�C rn 选项表示每 n 秒重新显示一次 lsof 的输出。
保留机器日志以备审计
机器日志包含如表 1 所示的信息,可以帮助查找和修复系统问题。它用于记录日志中每个条目的日期和时间。避免仅把日志保留在计算机上,当系统关闭时,这将是最有用的。同时保留详细描述用户问题的电子邮件。一种策略是把邮件保存到你可以读取的单个文件或文件夹中。另一种方法是设立邮件别名,以便用户有问题时可以发送邮件到别名。这个别名就可以将邮件转发给你,还可以在归档文件中存储副本。
表 1 机器日志的分类
以下是 /etc/aliases 文件中条目的例子,可以设置这种类型的别名:
trouble: admin,/var/spool/mail/admin.archive |
发送到 trouble 别名的电子邮件将被转发到 admin 用户,并同时存储到 /var/spool/mail/admin.archive 文件中。
保持系统的运行安全
没有任何使用拨号线路或公共访问终端的系统是绝对安全的。不过,可以通过经常更改 root 密码并选择难以猜测的密码的方式,使系统尽可能安全。不要告诉任何绝对不需要知道 root 密码的人。还可以鼓励系统用户选择高难度密码,并定期对其进行更改。
密码
默认情况下,Fedora/RHEL 上的密码使用 MD5 哈希,这使得它们比使用 DES 加密的密码更难以破解。当然如果加密的密码很容易让人找到或猜到,则差别不大。system-config-authentication 实用程序允许指定一个本地密码哈希算法,可选择高级选项选项卡,并从 Password Hashing Algorithm 下拉框选择。
一个难以猜测的密码是别人认为不可能选择的密码。不要使用字典中的字、亲人、宠物、朋友的名字或外语单词。一个好的策略是选择一个短语,包含一些标点符号(例如,在它们之间放置 ^)、大小写混合,并用数字替换一些单词的字母。一个好密码的示例是 C&yGram5(candygrams)。理想情况下,可以使用 ASCII 字符的随机组合,但是这将很难记住。
可以使用几种密码破解程序,以找到选择弱密码的用户。这些程序的工作原理是反复哈希字典、短语、姓名和其它来源中的单词。如果哈希密码与程序的输出相匹配,则该程序发现了用户的密码。两个破解密码的程序是 crack(crack包)和 john(www.openwall.com/john;john 包)。这些和许多其它程序以及安全性提示可以从 CERT(www.cert.org,Computer Emergency Response Team 计算机应急反应小组)获得。
破解一个好密码需要大量的计算能力。密码破解程序一般首先看大写字母、小写字母和数字组成的字符集。当添加符号时,他们必须做更多的工作来破解密码。此外,密码越长,破解需要的计算能力就越多。密码足够长以便更难被破解,又要足够短以便容易记住。8-20 个字符通常是一个很好的长度。密码中要包含几个如 #、@ 和 % 这样的符号。如果时间太长以至于无法破解你的密码,做破解工作的人或机器就可能会转移到容易破解的帐户上。
Setuid 文件
确保只有具有 root 权限的用户才可以写入包含 root 拥有程序的文件,并运行在 setuid 模式(例如,passwd 和 su)。另外,确保用户不会把运行在 setuid 模式的程序以及 root 拥有的程序转移到挂载系统上。这些程序可以被用来绕过系统的安全性。防止用户拥有 setuid 文件的一项技术是使用 nosuid 标志来挂载,可以在 fstab 文件中的标志部分进行设置。
BIOS
许多机器中的 BIOS 可以提供一定程度的保护,防止未经授权的人试图修改 BIOS 或重新启动系统。设置 BIOS 时,可以查找 Security 部分。你也许可以添加一个 BIOS 密码。如果依赖 BIOS 密码,在锁定计算机的情况下,使用主板上的跳线,通常很容易复位 BIOS 密码。
root 的日志文件和邮件
用户经常给 root 和 postmaster 发送电子邮件来与系统管理员通信。如果没有把 root 的邮件转发给自己,记得定期检查 root 的邮件。使用 su 执行系统管理任务时,将不会收到到达 root 的提醒邮件。但是,可以使用 su �C c ‘ mail �C u root ’命令来查看 root 的邮件。
定期检查系统日志文件以发现问题证据。一些重要文件包括 /var/log/messages,其中记录了操作系统和一些应用程序的错误;/var/log/secure,其中包含了与系统安全性有关的消息 ; /var/log/maillog,其中包含邮件系统的错误;/var/log/cron,其中包含 crond 的消息。
logwatch 实用工具(logwatch 包)是一个用 Perl 编写的报表编写器,可发送有关日志文件的电子邮件报告。默认情况下,/etc/cron.daily/0logwatch 每天运行这个脚本并把其输出邮发给 root。 更多信息参阅 logwatch 手册页和脚本本身。
监控磁盘使用情况
系统可能迟早会用完磁盘空间。因此不要填满一个分区。当一个分区至少有 5 %至 30 %的剩余空间时,Linux 写入文件的速度会明显加快。如果一个分区的已使用空间超过其最大最优磁盘空间,就会降低系统性能。
碎片
当一个文件系统已满时,它会变得支离破碎。这类似于 DOS 碎片的概念,但这几乎是不明显的并通常罕见于现代 Linux 文件系统上,因为 Linux 文件系统的设计是耐碎片的。如果不把文件系统填满,可能永远也不用担心碎片问题。如果文件系统上没有空间了,则根本无法写入。
要检查文件系统碎片,要卸载该文件系统,并在其上运行 fsck; 在 ext2、ext3 和 ext4 文件系统上使用�C f 选项。 fsck 的输出包括一个文件系统碎片百分数。通过备份可以整理文件系统,首先使用 mkfs 做一个干净的空映像,然后恢复文件系统。使用哪个工具来执行备份和恢复并不重要。
报告
Linux 提供了几个程序,可以报告谁正在使用哪些文件系统的多少磁盘空间。可以参考 du、quota 和 df 手册页以及 find 实用程序手册页中的�C size 选项。除了这些实用程序,还可以使用磁盘配额系统管理磁盘空间。
快速增长的文件
增加文件系统上的可用空间量的四大策略是:压缩文件、删除文件、增大基于 LVM 的文件系统以及压缩目录。一些文件(如日志文件和临时文件)随着时间的推移会不可避免地增长。例如,核心转储文件占用了大量的空间,但很少需要。此外,用户偶尔运行的程序可能会意外产生巨大的文件。作为系统管理员,必须定期审查这些文件,使其不至失控。
如果一个文件系统很快耗尽空间(如在一个小时内,而不是几个星期或几个月内),首先弄清楚空间耗尽的原因。可使用 ps �C ef 命令来确定用户是否已经创建了失控的进程,并且生成了巨大的文件。评估 ps 的输出时,可寻找一个消耗了大量 CPU 时间的进程。如果这样的进程正在运行,并创建了大文件,那该文件将持续增长以致需要不断腾出空间。如果删除了这个巨大的文件,其占用的空间并不会被释放,除非终止该进程。此时需要尝试联系运行该进程的用户,并要求他终止该进程。如果联系不到该用户,请使用 root 权限自己终止该进程。
此外,还可以截断大的日志文件而不是删除它,虽然也可以使用 logrotate 来更好地处理这个常见情况。例如,如果由于系统守护进程的错误配置,使得 /var/log/messages 文件变得非常大,可以使用 /dev/null 来截断它:
# cp /dev/null /var/log/messages |
或
# cat /dev/null > /var/log/messages |
或无须派生新进程 ,
# : > /var/log/messages |
如果删除 /var/log/messages,必须重新启动 rsyslogd 守护进程。如果不重新启动 rsyslogd,将不会释放文件系统上的空间。
当没有任何进程消耗磁盘空间,而容量逐渐被用光时,就要找到不需要的文件,并将其删除。在删除之前可以使用 cpio、dump 或 tar 归档这些文件。可以安全地删除大部分已有几天未曾访问的 core 文件。以下命令行可执行这项功能,而不删除必要的 core 文件(如 /dev/core):
# find / -type f -name core|xargs file|grep 'B core file'|sed 's/:ELF.*//g'|xargs rm -f |
find 命令列出所有名为 core 的普通文件,并将该列表发送到 xargs,xargs 在列表中的每个文件上运行 file。file 实用程序显示一个字符串,其中包含 B core file(创建的核心转储文件)这类需要删除的文件。grep 命令从文件中过滤掉任何不包含此字符串的行。最后 sed 删除冒号后的一切,使所有留在行上的只是 core 文件的路径名 ; 然后 xargs 删除该文件。
为了腾出更多的磁盘空间,可仔细审查 /tmp 和 /var/tmp 目录中的旧临时文件并删除。对 /var/mail、/var/spool 和 /var/log 中的磁盘使用情况保持跟踪。
删除目录中未使用的空间
包含太多文件的目录通常效率不高。ext2、ext3 或 ext4 文件系统上的目录在哪一点上变得效率不高的原因不尽相同,但部分取决于它包含的文件的长度。最佳做法是保持目录相对较小。一个目录中最好包含较少的文件而不是几百个文件(或目录),多达数千个文件通常是很不好的做法。此外,Linux 为经常访问的文件使用了缓存机制,以加速从文件名查找其 inode 的进程。这种缓存机制仅支持最多 30 个字符的文件名,所以通常要避免访问文件名非常长的文件。当一个目录变得太大时,通常可以将其分解成几个较小的目录,将其内容移动到那些新目录。移动完该目录内容后,要确保删除原来的目录。
因为 Linux 目录不会自动收缩,删除目录中的文件也不会收缩该目录,即使它释放了所有的磁盘空间。因此,要删除未使用的空间,并使目录比较小,必须把所有文件复制或移动到一个新目录,并删除原目录。
下面的过程可删除未使用的目录空间。首先从大目录中删除所有不需要的文件,然后创建一个新的空目录,接下来把所有剩余文件从旧的大目录移动或复制到新的空目录中。记住不要忘了复制隐藏的文件。最后删除旧目录,并命名新目录。
# mkdir /home/max/new # mv /home/max/large/* /home/max/large/.[A-z]* /home/max/new # rmdir /home/max/large # mv /home/max/new /home/max/large |