ディスク上のファイルから OS アーキテクチャ (32 ビットまたは 64 ビット) を判別するにはどうすればよいですか?

ディスク上のファイルから OS アーキテクチャ (32 ビットまたは 64 ビット) を判別するにはどうすればよいですか?

残念ながら、マザーボードが壊れてしまい、新しいマシンを一から作らなければなりません。最初に OS (K)ubuntu 14.04 の 32 ビット版と 64 ビット版のどちらをロードしたかは覚えていません。

既存の HDD をマウントする場合、OS アーキテクチャを判別するために調べることができるファイルはありますか? 64 ビット実行可能ファイルまたはライブラリの存在だけでは、実行中の OS を判別する信頼できる方法ではないため、それ以上のものが必要です。

uname -aこれはマウントされたディスクであり、実行中の OS ではないため、実行できません。

答え1

次のコマンドを実行すると、ホスト オペレーティング システムに 32 ビット カーネルと 64 ビット カーネルのどちらがあるかを簡単に確認できます。

uname --machine

の出力はi38632 ビットを意味し、x86_64は 64 ビットを意味します。

アプリケーションが i386 または amd64 アーキテクチャ用にコンパイルされているかどうかを判断するのは簡単ではありませんが、それでも実行可能です。ただし、どちらもカーネルのアーキテクチャを示すものではありません。init/sbin/initプログラムは起動時にカスタマイズできるため、確認するだけでも技術的には十分ではありません。

カーネルのアーキテクチャを判別する唯一の確実な方法は、実際にカーネルを起動することです。幸いなことに、これは を使って簡単に行うことができますqemu

まず、ターミナルを開いて/bootハード ドライブに移動します。次の形式で 1 ​​つ以上の圧縮されたカーネル イメージが見つかります。

vmlinuz-[バージョン]-[タイプ]

例えば、私のマシンにはvmlinuz-3.19.0-21-generic存在しています。/bootqemu システム x86qemu-system-x86 をインストールするパッケージがインストールされている場合は、適切なファイル名を置き換えて次のコマンドを実行します。

qemu-system-i386 -kernel <path_to_kernel>

長いテキストがスクロールして、最終的にパニックになる場合 (ルート FS が見つからないため)、32 ビット カーネルがインストールされています。代わりに、以下に示すようなエラーが表示される場合は、64 ビット カーネルがインストールされています (x86 CPU では起動しません)。

ここに画像の説明を入力してください

答え2

一般的に、特定の種類の実行可能ファイルまたはライブラリが存在するだけでは役に立たないことに同意します。複数のアーキテクチャのオブジェクトをインストールすることは可能ですが、そのうちの 1 つしかインストールできない実行可能ファイルもあります。 file /mnt/usr/bin/dpkg(/mntファイルシステムをマウントした場所に置き換えてください) は、コア パッケージ マネージャーが 32 ビットか 64 ビットかを示します。これは、一方から他方へのインプレース移行の途中でない限り、システムの残りの部分の正確な指標になります。そうであれば、確実にわかります。

答え3

古いハード ディスクのルートからディレクトリの構成を確認します。この方法は、Windows OS の場合に「Program Files」および「Program Files (x86)」ディレクトリを探す方法に似ています。

Linux では、64 ビットの場合は「lib32」および「lib64」ディレクトリが表示されますが、32 ビットの場合は lib ディレクトリのみが表示されます (lib32 ディレクトリもあったかどうかは今は覚えていません)。

提案された方法を信頼できない場合、またはさらに保証が必要な場合は、「file」コマンドが有望です。@ColinWatson の回答を見ると、個人的には /sbin/init の方が良い候補だと思いますが、これらのファイル (dpkg または init) はいずれもカーネル アーキテクチャと一致します。

たとえば、 を実行するとfile /sbin/init次のような出力が得られます。

/sbin/init: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24

/sbin/initへのパスを古いルートパーティションの適切なマウントポイントに置き換えるだけです。現在/media/oldroot、フルパスは次のようになります。/media/oldroot/sbin/init

関連情報