Como posso determinar a arquitetura do sistema operacional (32 ou 64 bits) a partir de um arquivo em um disco?

Como posso determinar a arquitetura do sistema operacional (32 ou 64 bits) a partir de um arquivo em um disco?

Infelizmente minha mobo estragou e tenho que construir uma nova máquina do zero. Não me lembro se carreguei originalmente a versão de 32 ou 64 bits do sistema operacional, (K)ubuntu 14.04.

Se eu montar o HDD existente, há algum arquivo que possa examinar para determinar a arquitetura do sistema operacional? Precisa ser algo mais do que a presença de um executável ou biblioteca de 64 bits, pois essas não são formas confiáveis ​​de determinar o sistema operacional em execução.

Não consigo executar uname -aporque este é um disco montado e não um sistema operacional em execução.

Responder1

É trivial determinar se o sistema operacional host tem um kernel de 32 ou 64 bits executando:

uname --machine

Uma saída i386significa 32 bits e x86_64significa 64 bits.

É menos trivial, mas ainda viável, determinar se um aplicativo é compilado para a arquitetura i386 ou amd64, mas nenhum deles indicará a arquitetura do kernel. Mesmo a verificação /sbin/initnão é tecnicamente suficiente, uma vez que o programa init pode ser personalizado durante a inicialização.

A única maneira infalível de determinar a arquitetura do kernel é inicializá-lo. Felizmente, isso pode ser feito facilmente usando qemu.

Comece abrindo um terminal e navegando até /booto disco rígido. Você encontrará uma ou mais imagens de kernel compactadas no formato:

vmlinuz-[versão]-[tipo]

Por exemplo, estou vmlinuz-3.19.0-21-genericpresente /bootna minha máquina. Agora, supondo que você tenha oqemu-sistema-x86Instale qemu-system-x86pacote instalado, execute o seguinte comando, substituindo o nome do arquivo quando apropriado:

qemu-system-i386 -kernel <path_to_kernel>

Se você vir uma parede de texto rolando e eventualmente entrar em pânico (porque o FS raiz está faltando), você instalou um kernel de 32 bits. Se, em vez disso, você receber um erro semelhante ao exibido abaixo, você tem um kernel de 64 bits (que não inicializa em uma CPU x86).

insira a descrição da imagem aqui

Responder2

Concordo que em geral a mera presença de um determinado tipo de executável ou biblioteca não é útil porque é possível ter objetos de mais de uma arquitetura instalados, mas existem alguns executáveis ​​dos quais você só pode ter um. file /mnt/usr/bin/dpkg(substituindo /mntpor onde você montou seu sistema de arquivos) informará se o gerenciador de pacotes principal é de 32 ou 64 bits, o que é um indicador preciso do resto do sistema, a menos que você esteja no meio de uma migração local de um para o outro - você certamente saberia se estivesse!

Responder3

Observe a organização dos diretórios a partir da raiz do seu disco rígido antigo, este método é análogo a procurar os diretórios "Arquivos de Programas" e "Arquivos de Programas (x86)" se for um sistema operacional Windows.

No Linux, se for de 64 bits, você verá os diretórios "lib32" e "lib64", enquanto se for de 32 bits, você encontrará apenas o diretório lib (não me lembro agora se haveria um diretório lib32 também).

Se você não confia no método sugerido ou precisa de mais garantias, o comando “file” parece promissor. Olhando para a resposta do @ColinWatson, pessoalmente, acho que /sbin/init é um candidato melhor, mas qualquer um desses arquivos (dpkg ou init) corresponderá ao arco do Kernel.

Por exemplo, a execução de file /sbin/initfornecerá uma saída como esta:

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

Basta substituir o caminho para /sbin/init pelo ponto de montagem adequado da sua partição raiz antiga, se for agora /media/oldroot, o caminho completo se tornará/media/oldroot/sbin/init

informação relacionada