审问 Linux 机器

作者:Mike Diehl

前几天,一位客户打电话给我,要求我对他网络上的所有计算机执行硬件和软件清单。需要清点的机器不多,但我们需要收集关于每台机器的大量信息。客户是一家微软商店,所以我不得不处理大约平均比例的 Windows XP 和 Vista,以及一些 Windows 95、98 和 ME 机器,仅供参考。

于是我就出发了,手里拿着一份 Excel 电子表格。我亲自访问了每台机器。对于每台机器,我想要网络配置、工作组配置和硬件配置。我们还想知道安装了哪些软件以及正在使用哪些驱动程序。能够确定正在使用哪些 USB 设备是加分项。

不用说,这是一项乏味的工作。某些数据,例如网络配置,在每个平台上都可以在同一个地方找到,即命令行。其他信息只能在各种控制面板中找到,并且它们因平台而异。

诚然,如果我更精通 Windows,事情可能会更容易一些。但这让我想到了。如果我在 Linux 商店工作,我该如何完成这项工作?我可以收集多少信息?我会在哪里查找?这会有多难?

事实证明,Linux 将大部分此类信息保存在相当标准化的位置。其余信息,例如已安装的软件,只需几个特定于平台的命令即可获得。

我喜欢告诉人们“在 Linux 中一切都更容易”。这种说法源于我发现自己不需要“寻找”我需要完成任务的正确菜单或 GUI 小部件。当然,我正在展示一种基于多年 Linux 经验形成的偏见。但在本文结束时,我希望您能看到仅用几个命令来审问一台机器是多么容易。

现在让我们开始吧。

首先,我们需要获取完整的网络配置。一旦我们登录,我们就会在 shell 提示符中看到机器的主机名。我们可以使用 “cat /etc/resolv.conf” 快速查看 DNS 配置。在继续之前,我们将简单地验证 DNS 配置看起来是否正确。然后我们将使用 “ifconfig -a” 获取网络接口列表以及它们的 IP 和 MAC 地址。

eth0      Link encap:Ethernet  HWaddr 00:17:31:64:B0:BD
         inet addr:10.0.1.56  Bcast:10.0.1.255  Mask:255.255.255.0
         inet6 addr: fe80::217:31ff:fe64:b0bd/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:127554145 errors:255 dropped:0 overruns:0 frame:255
         TX packets:84151845 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:3916476961 (3735.0 Mb)  TX bytes:4229971584 (4034.0 Mb)
         Interrupt:16 Base address:0x6000

lo        Link encap:Local Loopback
         inet addr:127.0.0.1  Mask:255.0.0.0
         inet6 addr: ::1/128 Scope:Host
         UP LOOPBACK RUNNING  MTU:16436  Metric:1
         RX packets:68839 errors:0 dropped:0 overruns:0 frame:0
         TX packets:68839 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0
         RX bytes:2933412 (2.7 Mb)  TX bytes:2933412 (2.7 Mb)

由此,我们可以收集以太网接口的 IP 地址以及 MAC 地址。我们将忽略环回接口。

我们可以快速查看路由表,以确保使用 “route -n” 命令时没有任何异常情况。

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         10.0.1.1        0.0.0.0         UG    0      0        0 eth0

默认网关 10.0.1.1 看起来是正确的,所以我们继续。

好吧,这就是网络配置,但这台机器是什么类型的呢?我们可以从 /proc 文件系统收集大量信息。例如,我们可以使用 “cat /proc/cpuinfo” 命令找出安装了什么类型的 CPU。

processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 35
model name      : AMD Athlon(tm) 64 X2 Dual Core Processor 4200+
stepping        : 2
cpu MHz         : 2200.000
cache size      : 512 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm
3dnowext 3dnow pni lahf_lm cmp_legacy ts fid vid ttp
bogomips        : 4425.38

processor       : 1
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 35
model name      : AMD Athlon(tm) 64 X2 Dual Core Processor 4200+
stepping        : 2
cpu MHz         : 2200.000
cache size      : 512 KB
physical id     : 0
siblings        : 2
core id         : 1
cpu cores       : 2
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm
3dnowext 3dnow pni lahf_lm cmp_legacy ts fid vid ttp
bogomips        : 4422.96

正如您所看到的,我正在使用 AMD Athlon 64 (4200+),它有 2 个内核。您甚至可以看到 Linux 检查了多年来发现的一些 Intel/AMD CPU 错误,以及一些已经发展出来的特殊指令集,例如 MMX 或 3dnow。

我们可以通过查看 /proc/kcore 的大小来确定安装了多少内存,使用 “ls -lah /proc/kcore” 命令,它将以人类友好的格式打印文件大小。

-r-------- 1 root root 897M Oct 15 12:31 /proc/kcore

我们将把 897M 向上舍入到 1G,因为内核使用了一些已安装的内存。

如果能够找出安装了哪些硬件而无需打开机箱,那就太好了。这就像使用 lspci 命令一样容易。

00:00.0 Memory controller: nVidia Corporation CK804 Memory Controller (rev a3)
00:01.0 ISA bridge: nVidia Corporation CK804 ISA Bridge (rev a3)
00:01.1 SMBus: nVidia Corporation CK804 SMBus (rev a2)
00:02.0 USB Controller: nVidia Corporation CK804 USB Controller (rev a2)
00:02.1 USB Controller: nVidia Corporation CK804 USB Controller (rev a3)
00:04.0 Multimedia audio controller: nVidia Corporation CK804 AC'97 Audio
Controller (rev a2)
00:06.0 IDE interface: nVidia Corporation CK804 IDE (rev f2)
00:07.0 IDE interface: nVidia Corporation CK804 Serial ATA Controller (rev f3)
00:08.0 IDE interface: nVidia Corporation CK804 Serial ATA Controller (rev f3)
00:09.0 PCI bridge: nVidia Corporation CK804 PCI Bridge (rev a2)
00:0a.0 Bridge: nVidia Corporation CK804 Ethernet Controller (rev a3)
00:0b.0 PCI bridge: nVidia Corporation CK804 PCIE Bridge (rev a3)
00:0c.0 PCI bridge: nVidia Corporation CK804 PCIE Bridge (rev a3)
00:0d.0 PCI bridge: nVidia Corporation CK804 PCIE Bridge (rev a3)
00:0e.0 PCI bridge: nVidia Corporation CK804 PCIE Bridge (rev a3)
00:18.0 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron]
HyperTransport Technology Configuration
00:18.1 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron]
Address Map
00:18.2 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] DRAM
Controller
00:18.3 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron]
Miscellaneous Control
05:06.0 VGA compatible controller: nVidia Corporation NV34 [GeForce FX 5200]
(rev a1)

正如您所看到的,我的系统主板上有一个 nVidia GeForce FX 5200 显卡和 nVidia CK804 AC'97 声卡。您还可以看到我有 USB。稍后会详细介绍。并非每个 Linux 发行版都默认安装 lspci;但是,您应该在每次构建新机器时都这样做。

有时您会被要求修复硬件问题,其中设备似乎无法正常工作。声卡是典型的例子,问题通常是由 IRQ 冲突或与另一个繁忙设备(如硬盘驱动器或网络接口)共享 IRQ 引起的。我们可以使用 “cat /proc/interrupts” 命令来了解哪些中断正在被什么设备使用

          CPU0       CPU1
 0:  220186162   56790290   IO-APIC-edge      timer
 1:          0          2   IO-APIC-edge      i8042
 8:          1          1   IO-APIC-edge      rtc
 9:          0          0   IO-APIC-fasteoi   acpi
 12:          0          4   IO-APIC-edge      i8042
 14:    1375087    2345774   IO-APIC-edge      ide0
 15:    9971601         12   IO-APIC-edge      ide1
 16:  173144676  152683932   IO-APIC-fasteoi   ohci_hcd:usb2, eth0
 17:          0          0   IO-APIC-fasteoi   libata, NVIDIA nForce Audio
 18:          0          0   IO-APIC-fasteoi   libata
 19:     242148     231918   IO-APIC-fasteoi   ehci_hcd:usb1
 20:   93937183   75701777   IO-APIC-fasteoi   nvidia
NMI:          0          0
LOC:  276981218  276986794
ERR:          0
MIS:          0

我们可以使用 “fdisk -l /dev/?d?” 命令快速评估我们的硬盘驱动器配置。

Disk /dev/hda: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

  Device Boot      Start         End      Blocks   Id  System
/dev/hda1               1          13      104391   83  Linux
/dev/hda2              14          76      506047+  82  Linux swap / Solaris
/dev/hda3              77        3812    30009420   83  Linux
/dev/hda4            3813       38913   281948782+  83  Linux

Disk /dev/hdb: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

  Device Boot      Start         End      Blocks   Id  System
/dev/hdb1               1       30401   244196001   83  Linux

Disk /dev/hdc: 251.0 GB, 251000193024 bytes
255 heads, 63 sectors/track, 30515 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

  Device Boot      Start         End      Blocks   Id  System
/dev/hdc1               1       30515   245111706   83  Linux

在这里您可以看到我有 3 个 IDE 驱动器。在命令行中使用 “?” 通配符可以使速度更快。

顺便说一句,如果您想知道 /dev/hda 是什么类型的硬盘驱动器,您可以使用以下命令询问:“cat /proc/ide/hda/model”

我在机器上运行此命令的结果是 “WDC WD3200JB-00KFA0”,这表明我的 /dev/hda 是 Western Digital Caviar 320Gb。在这种情况下,Google 是您的朋友。

说到硬盘驱动器,我们可以通过查看 /proc/filesystems 文件来确定我们的系统支持哪些文件系统。结果是直观的,所以我将其留给读者作为练习。

如果内核配置为支持它,则 /proc/config.gz 文件是一个压缩文件,其中包含当前运行内核的配置。一旦解压缩,此文件适合用作 Linux 内核源代码树根目录中找到的 .config 文件。通过捕获此文件,您可以重现并更改当前内核配置。

当然,Linux 内核中的许多设备驱动程序都作为动态加载的模块加载。我们可以使用 lsmod 命令确定哪些驱动程序以这种方式加载。

Module                  Size  Used by
nvidia               7096684  48
vboxdrv                66928  0

有时,驱动程序需要另一个驱动程序才能运行。这种情况将在 “Used by” 列中指示。

还记得早些时候我说我们会因为识别插入 USB 端口的设备而获得奖励积分吗?我们可以使用 lsusb 命令轻松做到这一点。

Bus 001 Device 001: ID 0000:0000
Bus 002 Device 002: ID 413c:1002 Dell Computer Corp. Keyboard Hub
Bus 002 Device 004: ID 413c:2002 Dell Computer Corp. SK-8125 Keyboard
Bus 002 Device 001: ID 0000:0000

最后,我们需要获取已安装软件的列表。基于 RPM 的发行版使用 “rpm -qa” 命令为我们提供此信息。我不使用 Debian,但我被告知您可以使用 “dpkg -l” 命令来获取已安装软件包的列表。在 Gentoo 下,我将使用 “emerge --pretend --emptytree world” 或安装 qpkg 工具。

至此,我们几乎了解了关于这台机器的所有信息。Linux 内核还有其他秘密,我鼓励您在 /proc 和 /sys 文件系统中探索以找到它们。

虽然其中一些命令需要 root 权限,但它们都不需要 GUI、鼠标,甚至不需要物理访问机器。如果您有登录名和 root 密码,您可以远程完成所有这些操作,甚至可以使用脚本自动化它。看,我告诉过你这很容易!

加载 Disqus 评论