如何从磁盘上的文件确定OS体系结构(32位或64位)?

可悲的是我的主板坏了,我必须从头开始构建一台新机器。 我不记得我是否最初加载了32位或64位版本的操作系统,(K)ubuntu 14.04。

如果我挂载现有的HDD,我可以检查一个文件以确定操作系统架构吗? 需要的不仅仅是64位可执行文件或库的存在,因为这些不是确定正在运行的操作系统的可靠方法。

我无法运行uname -a因为这是一个挂载的磁盘,而不是正在运行的操作系统。

通过运行来确定主机操作系统是否具有32位或64位内核是微不足道的:

 uname --machine 

i386的输出表示32位, x86_64表示64位。

它不是那么简单,但仍然可以确定是否为i386或amd64架构编译应用程序,但这些都不会指示内核的体系结构。 甚至检查/sbin/init在技​​术上也不够,因为init程序可以在引导时自定义。

确定内核架构的唯一简单方法是实际启动它。 幸运的是,这可以使用qemu轻松完成。

首先打开终端并导航到硬盘驱动器上的/boot 。 您将在表单中找到一个或多个压缩内核映像:

  vmlinuz- [版本] - [类型] 

例如,我的机器上的/boot存在vmlinuz-3.19.0-21-generic 。 现在,假设你有qemu-system-x86 安装qemu-system-x86 安装包,运行以下命令,在适当的地方替换文件名:

 qemu-system-i386 -kernel  

如果你看到一个文本墙滚动并最终发生恐慌(因为缺少根FS),你已经安装了一个32位内核。 如果您收到类似于下面显示的错误,则您有一个64位内核(不能在x86 CPU上启动)。

在此处输入图像描述

我同意,一般来说,仅存在某种可执行文件或库是没有用的,因为它可能安装了多个体系结构的对象,但是有一些可执行文件只能有一个。 file /mnt/usr/bin/dpkg (在你安装文件系统的地方替换/mnt )将告诉你核心包管理器是32位还是64位,这是系统其余部分的准确指示,除非你在从一个到另一个的就地迁移的中间 – 你肯定知道你是不是!

从旧硬盘的根目录查看目录组织,此方法类似于查找“程序文件”和“程序文件(x86)”目录(如果它是Windows操作系统)。

在Linux中,如果是64位,你会看到“lib32”和“lib64”目录,而如果32位你只会遇到lib目录(我现在还不记得是否会有一个lib32目录)。

如果您不信任建议的方法,或需要更多保证,“file”命令看起来很有希望。 亲眼看看@ColinWatson的答案,我认为/ sbin / init是一个更好的候选者,但是这些文件中的任何一个(dpkg或init)都会与内核arch相匹配。

例如, 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