Как определить архитектуру ОС (32-битную или 64-битную) по файлу на диске?

Как определить архитектуру ОС (32-битную или 64-битную) по файлу на диске?

К сожалению, моя материнская плата сломалась, и мне пришлось собирать новую машину с нуля. Я не помню, какую версию ОС я изначально загрузил — 32- или 64-битную, (K)ubuntu 14.04.

Если я монтирую существующий HDD, есть ли файл, который я могу проверить, чтобы определить архитектуру ОС? Должно быть что-то большее, чем наличие 64-битного исполняемого файла или библиотеки, поскольку это ненадежные способы определения работающей ОС.

Я не могу запустить, uname -aтак как это смонтированный диск, а не работающая ОС.

решение1

Определить, имеет ли хостовая операционная система 32-битное или 64-битное ядро, легко, выполнив:

uname --machine

Вывод i386означает 32-бит, а x86_64означает 64-бит.

Менее тривиально, но все еще возможно определить, скомпилировано ли приложение для архитектуры i386 или amd64, но ни один из них не укажет архитектуру ядра. Даже проверка /sbin/initтехнически недостаточна, поскольку программа init может быть настроена во время загрузки.

Единственный надежный способ определить архитектуру ядра — это фактически загрузить его. К счастью, это можно легко сделать с помощью qemu.

Начните с открытия терминала и перехода на /bootжесткий диск. Вы найдете один или несколько сжатых образов ядра в форме:

vmlinuz-[версия]-[тип]

Например, у меня есть vmlinuz-3.19.0-21-genericpresent /bootна моей машине. Теперь, предположим, у вас естьqemu-система-x86Установить qemu-system-x86пакет установлен, выполните следующую команду, заменив имя файла там, где это необходимо:

qemu-system-i386 -kernel <path_to_kernel>

Если вы видите стену текста, прокручивающуюся мимо, и в конце концов впадаете в панику (потому что корневая файловая система отсутствует), вы установили 32-битное ядро. Если вместо этого вы получаете ошибку, похожую на показанную ниже, у вас 64-битное ядро ​​(которое не загрузится на процессоре x86).

введите описание изображения здесь

решение2

Я согласен, что в целом само по себе наличие определенного вида исполняемого файла или библиотеки бесполезно, поскольку можно установить объекты более чем одной архитектуры, но есть некоторые исполняемые файлы, из которых можно установить только один. file /mnt/usr/bin/dpkg(заменив /mntна то место, куда вы смонтировали свою файловую систему) вы узнаете, является ли основной менеджер пакетов 32- или 64-разрядным, что является точным индикатором остальной части системы, если только вы не находитесь в процессе миграции с одного на другой на месте — вы бы наверняка это знали, если бы это было так!

решение3

Посмотрите на структуру каталогов в корне вашего старого жесткого диска. Этот метод аналогичен поиску каталогов «Program Files» и «Program Files (x86)», если это ОС Windows.

В 64-разрядной версии Linux вы увидите каталоги «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

Связанный контент