1. 序章

Linuxシステムがどのくらいの期間使用されているかを知ることは、さまざまな診断に役立ちます。 たとえば、人間の場合と同様に、年齢と危険因子の数の間には直接的な関連があることがよくあります。 これとは別に、これはマシンの一種の識別子です。

この記事では、Linuxシステムの時代を定義する方法について説明します。 Linuxシステムとは何かを定義することから始めます。 その後、ハードウェアコンポーネントの古さを確認する方法を見つけます。 次に、ストレージに焦点を当て、パーティションとファイルシステムの時代を探ります。 最後に、ファイルの日付について、Linuxシステムの日付を記入する手段として説明します。

このチュートリアルのコードは、GNU Bash5.1.4を使用したDebian11(Bullseye)でテストしました。 ほとんどのPOSIX準拠環境で機能するはずです。

2. Linuxシステム

何かの時代を理解するには、それを定義できなければなりません。 基本的に、 Linuxシステムの定義は、Linuxディストリビューションを実行するハードウェアとソフトウェアの任意の組み合わせです。

ハードウェアはパフォーマンスと障害の決定的な要因になる可能性があるため、ハードウェアが含まれていることに注意してください。 たとえば、古いハードディスクがある場合、再インストールしても、不良ブロックによるデータの問題を防ぐことはできません。

さらに、ソフトウェアはオペレーティングシステムに限定されません。 インストールしてシステムをそのままにしておくだけでは、「経年劣化」は発生しません。 それは、料理して食べるのではなく、食品を冷凍することに似ています。

最後に、言及されているすべてのコンポーネントは、異なる年齢を持つことができます。 それを考慮して、それぞれが何歳であるかを個別に確認する方法を明らかにします。 これらの方法を組み合わせると、それぞれを単独で使用するよりも良い結果が得られる可能性があります。

3. ハードウェア時代

ハードウェアコンポーネントには、多くの場合、製造日またはシリアル番号が物理的に添付されています

  • コンピュータの船体に貼られたアセンブリステッカー
  • コンポーネント自体のメーカーステッカー
  • 印刷またはパンチされたタイムスタンプ
  • 電子部品の日付コード

重要なのは、シリアル番号に製造日を直接含めることができるということです。 また、オンラインリファレンスを介して1つにつながることもあります。

もちろん、 lsblk (リストブロックデバイス)などのツールを使用して、コンポーネントのコントローラーからシリアル番号を取得することもできます。

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

この例では、ストレージコンポーネントを使用します。 2番目のドライブにはシリアル番号がないように見えることに注意してください。 実際にはそうですが、消費者向けのストレージコントローラーは簡単にするためにそれを省略していることがよくあります。 この省略は、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

–type -t )フラグと 2 の引数を使用すると、マザーボードのみが一覧表示されますが、他にも多くのコンポーネントタイプを使用できます。

コマンドメカニズムがないと、どのコンポーネントも役に立ちません。 たとえば、ストレージにはコントローラーがあり、オペレーティングシステムにはユーザーがいます。 それらをリンクするのはドライバーであり、これによりシステムの使用とフォーマットが可能になります。

4. パーティションとファイルシステム

ストレージのトップレベルの編成を見て、そこから日付を抽出する方法を探りましょう。

4.1. パーティション

基本的に、パーティションテーブルはメディアを別々のコンテナに分割します。 Linuxには少なくとも1つのパーティションが必要なので、それを作成してフォーマットすることが、インストール時の最初のストレージアクションです。

ある時点で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 (保存)フラグは、すべての元のファイルのタイムスタンプを保存します。 これは私たちのニーズの観点からそれらを役に立たなくします。

6. 概要

この記事では、Linuxシステムの古さを確認する多くの方法を検討しました。 ハードウェアから、パーティションやファイルシステム、そして単一のファイルに至るまで。

結論として、方法とファイルの選択に注意を払えば、特定のシステムの誕生日に誤った日付が表示される可能性を低くすることができます。