名校课程推荐 | MIT《CS 实用工具课程》-机器内省

机器内省

机器有时会发生故障,你会想知道它为什么会这样。有些工具可以帮你找出原因。

但首先,我们要确保你能进行自我检查。通常,系统内省要求你拥有某些权限,比如是一个组的成员(比如power用于关闭)。Root用户是终极权限,他们几乎可以做任何事。你可以通过sudo允许用户执行root命令(但要小心)。

什么问题?

如果发生故障,首先要看的是故障发生时的状况,为此,我们就需要查看日志。

日志通常存储在/var/log,现在还是有很多存储在这里。通常每个程序有一个文件/文件夹。通过grep或者less找到它们。

还有一个内核日志,可以通过dmesg命令查看。它之前是一个开放的纯文本文件,现在通常需要通过dmesg获取。

最后,还有"系统日志",你的所有日志消息越来越多地存放于此。在大多数(虽然不是全部)Linux系统中,日志是由systemd管理的,它是"系统守护进程",控制所有在后台运行的服务(目前还有更多)。如果你是root用户,或者是admin/wheel组中的一员,可以通过journalctl工具查看该日志。

journalctl中,你应该特别注意这些标签:

  • -u UNIT:只显示与指定systemd服务相关的信息

  • --full:不能截断长行(这点很蠢)

  • -b:只显示最近启动的消息(也可以参见-b -2

  • -n100:只显示最后100个项目

目前是什么状况?

如果有什么地方出了问题,或者你只是想了解你系统的目前状态,有很多工具可以检查当前正在运行的系统:

首先是top,还有它的改良版htop,它们会显示系统当前正在运行的进程的各种统计数据,CPU、内存使用情况、进程树等等。有很多快捷方式,t对于启用树视图尤其有用。你还可以用patree(+ -p表示包含PIDs)查看进程树。如果你想知道这些程序在做什么,通常需要跟踪它们的日志文件,通过journalctl -fdmesg -w以及 tail -f

有时,你希望更多地了解系统上正在使用的资源。dstat在这方面非常出色。它为许多不同子系统(如I/O、联网、CPU利用率、上下文切换等)提供实时资源使用指标,可以通过man dstat命令查看。

如果磁盘空间不足,你需要了解两个主要的实用程序:dfdu。前者显示系统上所有分区的状态(使用-h进行尝试),而后者度量你提供给它的所有文件夹的大小,包括它们的内容(参见-h-s)。

要弄清楚你打开了哪些网络连接,可以使用ssss -t将显示所有打开的TCP连接。ss -tl将显示系统上的所有监听(即服务器)端口。-p还将包含使用该连接的进程,-n将提供原始端口号。

系统配置

配置系统的方法有很多,我们要介绍两种非常常见的方法:联网和服务。你系统上的大多数应用程序会告诉你如何在它们的manpage中配置它们,通常会涉及到在/etc(系统配置目录)中编辑文件。

如果想要配置你的网络,可以使用ip命令。它的参数形式有点奇怪,但ip help command功能比较强大。ip addr会显示有关网络接口及其配置的信息(IP地址等),ip route显示如何将网络流量路由到不同的网络主机。网络问题通常可以通过ip工具完全解决,还有iw,它会管理无线网络接口。Ping是检查故障程度的一个便捷工具,尝试ping一个主机名(google.com),一个外部IP地址(1.1.1.1),以及内部IP地址(192.168.1.1或默认gw)。你也可以通过/etc/resolv.conf检查你的DNS设置(主机名如何解析为IP地址)。

如今,为了配置服务,你几乎必须与systemd交互,无论好坏。你系统上的大多数服务都会有一个systemd服务文件,界定一个systemd单元。这些文件定义启动服务时要运行什么命令、如何停止它、在哪里记录信息等。它们通常不太难读,你可以在/usr/lib/systemd/system/中找到它们中的大多数。你也可以在/etc/systemd/system中定义你自己的。

一旦有了systemd服务,就可以使用systemctl命令与之交互。systemctl enable UNIT会设置服务在启动时启用(disable会删除它),start, stoprestart会执行你所期望的操作。如果出现错误,systemd会通知你,然后你可以使用journalctl -u UNIT查看应用程序的日志。你还可以使用systemctl status来查看所有系统服务的运行状况。如果你感觉启动比较慢,这可能是由于一些缓慢的服务,你可以使用systemd-analyze(尝试用blame)找出是哪一个。

练习

研究locatedmidecodetcpdump/bootiptablesproc的功能

客服