Как определить архитектуру ОС (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-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