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

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

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

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

3 ответа

Решение

Определить, имеет ли 32-разрядное или 64-разрядное ядро ​​операционная система хоста, достаточно:

uname --machine

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

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

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

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

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

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

qemu-system-i386 -kernel <path_to_kernel>

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

введите описание здесь

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

Посмотрите на организацию каталогов из корня вашего старого жесткого диска, этот метод аналогичен поиску каталогов "Program Files" и "Program Files (x86)", если это Windows OS.

В 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

Другие вопросы по тегам