审问 Linux 机器
前几天,一位客户打电话给我,要求我对他网络上的所有计算机执行硬件和软件清单。需要清点的机器不多,但我们需要收集关于每台机器的大量信息。客户是一家微软商店,所以我不得不处理大约平均比例的 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 密码,您可以远程完成所有这些操作,甚至可以使用脚本自动化它。看,我告诉过你这很容易!