Contents

找出何时安装Linux系统

1. 简介

了解 Linux 系统存在了多长时间有助于进行不同的诊断。例如,年龄和风险因素的数量之间通常存在直接联系,就像人类一样。另外,它是机器的一种标识符。

在本文中,我们研究了定义 Linux 系统年龄的方法。我们首先定义什么是 Linux 系统。之后,我们发现了检查硬件组件有多旧的方法。接下来,我们关注存储,探索分区和文件系统时代。最后,文件日期作为一种确定 Linux 系统日期的方法进行了讨论。

我们使用 GNU Bash 5.1.4 在 Debian 11 (Bullseye) 上测试了本教程中的代码。它应该适用于大多数 POSIX 兼容环境。

2. Linux系统

要了解某物的年龄,我们必须能够定义它。基本上,我们对 Linux 系统的定义是运行 Linux 发行版的任何硬件和软件组合

请注意,我们确实包括硬件,因为它可能是性能和故障的决定性因素。例如,如果我们有一个旧硬盘,再多的重装也无法避免坏块导致的数据问题。

此外,软件不限于操作系统。只是安装它并让系统单独放置不会导致“老化”。它更类似于冷冻食物,而不是烹饪和食用。

最后,提到的所有组件都可以有不同的年龄。考虑到这一点,我们将揭示如何分别检查每个人的年龄。这些方法的组合可能会产生比单独使用每一种方法更好的结果。

3. 硬件年代

硬件组件通常附有生产日期或序列号,包括:

  • 电脑外壳上的组装贴纸
  • 组件本身的制造商贴纸
  • 打印或打孔的时间戳
  • 电子元件上的日期代码

重要的是,序列号可以直接包含制造日期。他们有时也会通过在线参考引向一个人。

当然,我们可以尝试使用lsblk (List Block Devices)等工具从组件的控制器中获取序列号:

$ lsblk --nodeps --output name,serial
NAME SERIAL
sda  6a8430a1006660002099d400666f71fa
sdb

在这个例子中,我们使用存储组件。请注意,第二个驱动器似乎没有序列号。事实上,它确实如此,但消费级存储控制器通常为简单起见而忽略它。对于主板来说,这种遗漏的可能性较小,我们可以通过dmidecode 将其列为root:

# dmidecode --type 2
# dmidecode 3.2
Getting SMBIOS data from sysfs.
SMBIOS 2.7 present.
Handle 0x0200, DMI type 2, 9 bytes
Base Board Information
        Manufacturer: Dell Inc.
        Product Name: 01W066
        Version: A02
        Serial Number: ..QQ06660430D1D0.
        Asset Tag: Not Specified

使用参数为2的*–type* ( -t ) 标志,仅列出主板,但还有许多其他组件类型可用。

没有命令机制,任何组件都是无用的。例如,存储有控制器,而操作系统有用户。链接它们的是驱动程序,它允许我们使用和格式化我们的系统。

4. 分区和文件系统

让我们看看存储的顶级组织并探索从中提取日期的方法。

4.1. 分区

基本上,分区表将介质分成单独的容器。由于我们在Linux中至少要有一个分区,所以创建和格式化分区是安装时的第一个存储动作。

尽管 MBR 曾经有过,但在当前系统中**,MBR 和 GPT 都不 包含时间戳**。 不过,我们仍然有选择。

4.2. 文件系统

要使用分区,我们通常需要用文件系统 对其进行格式化。**格式化会留下痕迹,我们可以通过tune2fs **进行跟踪:

$ df --output=source / | tail --lines=1
/dev/sda1
$ tune2fs -l /dev/sda1 | perl -nwe 'print if /Filesystem created/;'
Filesystem created:       Mon Jun 06 00:06:56 2022

请注意,我们只对当前操作系统的活动分区感兴趣。为了找到它,我们在*/*上使用df 。之后,我们从它的块设备 中提取信息。

由于tune2fs中的限制,此方法仅适用于本机 Linux *ext**文件系统。重要的是,我们可以:

  • 将新文件系统应用于旧分区
  • 在旧文件系统上安装 Linux,无需格式化

由于这些可能的差异,我们可以转向其他年龄识别方法。虽然没有直接联系,但我们通常可以根据文件推断出系统的年龄。

5. 文件日期

在系统的生命周期中,数据是“当时”和“现在”之间的主要增量。考虑到这一点,我们可以使用介质上最旧文件的日期信息

$ find -type f -printf '%C+ %p\n' | sort | head --lines=1
2006-06-06+00:06:56.0000000000 ./host.conf

首先,我们使用find 来打印当前目录和下面目录中的所有文件路径。-printf标志允许我们以修改日期作为前缀,而不是创建日期 。在此之后,我们对列表进行排序并获得结果中的第一个条目。

当然,这种方法存在多个问题。让我们讨论其中的一些并提供解决方法。

5.1. 旧系统文件

即使是 Linux 内核本身也包含数千个文件。确实,其中有很多已经很久没有碰过了。库和其他系统文件的时间戳可以追溯到给定安装创建之前的年份

为了避免旧文件,我们可以使用在安装过程中创建的路径

# stat /var/log/installer/syslog
  File: /var/log/installer/syslog
  Size: 401666          Blocks: 791        IO Block: 4096   regular file
Device: 801h/2049d      Inode: 6660        Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-01-01 00:06:56.000666137 +0200
Modify: 2013-12-01 10:47:05.168579010 +0200
Change: 2013-12-01 10:47:05.176579010 +0200

在此示例中,我们使用stat 检查 Debian 安装程序日志的最后修改日期。由于该文件是一个日志,只能由 root 访问,我们可以相当确定它没有因任何其他原因而被更改。

并非所有文件都是这种情况。

5.2. 被篡改的文件

即使我们决定检查像/etc 这样的“活动”路径,我们也应该小心。例如,配置往往又长又复杂,这会提示复制和模板化。

在某些情况下,这可能会导致时间异常

# scp -p user@remote:/etc/hosts /etc/hosts
[...]

事实上,scp (安全复制)远程传输工具的*-p*(保留)标志会保留所有原始文件时间戳。这使得它们在我们的需求方面毫无用处。