如何将基于Debian的32位(x86)系统转换为64位


36

我有一个在64位处理器上运行的32位系统。如何在不重新安装的情况下将其转换为全64位?我在某处看到由于新的Multiarch框架,它是可行的。


5
我对这个问题的答案很感兴趣。我在具有64位功能的计算机上拥有32位系统(现在已有6年以上的历史了,但目前仍在使用)。我最初在2007年安装此机器时使用32位的唯一原因是因为我想在其上运行32位应用程序。使用新的多体系结构,如果我理解正确,则可以轻松地在64位计算机上安装32位应用程序。因此,将其转换为64位微调会很好,但是我不知道这样做会有多困难。@bahamat关于使用VM的建议听起来不错。如果我成功进行了转换,我将在此处回答。
Faheem Mitha


关于非盟的类似问题:askubuntu.com/q/5018/178596
Wilf

Answers:


8

TL; DR:可行,但复杂。我在底部概述了一个替代方案。

现在进行详细说明,并加一点盐,因为我可能没有采取最佳方法:

这是可能的,这是我过去两晚所做的工作: 有一个Wiki条目描述了没有多体系结构支持的老式方法。这对于修复损坏的包装很有帮助。

要迁移您的基本系统,请执行以下操作

$ dpkg --print-architecture
i386
# dpkg --add-architecture amd64
$ dpkg --print-foreign-architectures
amd64
# apt-get update
# apt-get download gcc-4.6-base:amd64 libgcc1:amd64 libc6:amd64 \
          libselinux1:amd64 zlib1g:amd64 libbz2-1.0:amd64 dpkg:amd64
# dpkg -i gcc-4.6-base*.deb libgcc*.deb libc*.deb libselinux*.deb \
          libbz2*.deb zlib*.deb dpkg*.deb
$ dpkg --print-architecture
amd64
$ dpkg --print-foreign-architectures
i386

然后,您的某些软件包为amd64,但大多数仍为i386。apt-get upgrade将照顾一些软件包,apt-get -f install将修复一些错误,但仍然大多数软件包将保留i386。如果您想解决这个问题,请跳过棘手的部分;)

使用dpkg --get-selections | grep :i386将返回您所有的包,您仍然需要迁移它们。

我的下一个想法是:

# apt-get install `dpkg --get-selections \
  | grep i386 \
  | awk {'gsub(/:i386/, ":amd64"); print $1'}`

但是事实证明这是一个坏主意:有些软件包在amd64中不可用(例如libc6-i686),apt-get会引起混淆,并且两个版本中都会安装很多软件包。需要进行大量的体力劳动。

更加困难:可以替换一些必要的软件包,以便始终安装要安装的二进制文件,但是有些软件包将必须被删除并重新安装,例如,我在tar中遇到了这个问题。我在另一个系统上安装了软件包,通过提取了软件包ar p package.deb data.tar.gz | tar zx,然后通过scped提取了文件scp -r ./* root@other_computer:/,因此二进制文件再次可用。冲洗并重复操作,scped文件将被覆盖。

我会怎么做

每当切换系统时,我都会执行以下操作:

备份/home/etc(也许/var/usr/local一些其他文件,你变了/root,......,情况因人而异)。

使用获取安装包的列表,dpkg --get-selections > packagelist并复制结果文件packagelist

然后干净地重新安装Debian,再次创建所有用户,可能还有角色等。

使用重新安装所有软件包dpkg --set-selections < packagelist; apt-get -f install

复制回备份的目录,文件,您大体上已完成。

这种方法的一个缺点:所有软件包(包括库)都将标记为手动安装,因此当不再依赖任何软件包时,它们将不会被卸载。


1
“我该怎么办” ...,伙计,我确定OP无需重新安装即可询问:/
Braiam

@Braiam OP最有可能希望这样做而无需重新安装。我只是在报告我的个人经历。替代途径对我来说更简单,也许在转换系统时我犯了一些错误。
Residuum

6
要标记自动安装的软件包,您可能曾经用于apt-mark showauto导出自动安装的列表并apt-mark auto在新安装中对其进行标记。
Adrien Clerc

感谢您写下您的经验。“如果您要解决这个问题,那么请跳过棘手的部分;)”如果我的目标只是能够开发软件x86_64,而不关心我的系统软件包是否未以最佳方式使用64位处理器,该怎么办? ?我也在运行32位操作系统。我想我第一次安装时以为我的处理器是32位的:(
jberryman 2015年

7

这里的其他答案表明,尽管从理论上讲这是可能的,但它非常复杂,可能不值得付出努力。但是,如果保持$HOME不变,则可以进行全新安装,并使过程相对轻松。

一般过程将是

  1. 备份已安装软件包列表和自动安装软件包列表。

    dpkg --get-selections '*' > package.list
    apt-mark showauto >auto.list
    

    请注意,您可能还想从使用multiarch安装的任何软件包名称中删除体系结构

    dpkg --get-selections '*' | sed -e 's/:\(i386\|amd64\)//' > package.list
    
  2. 如果您/home是一个单独的分区,只需确保在安装过程中不要格式化它。如果它不在单独的分区上,请进行备份以备后用:

    tar cvzf home_backup.tgz $HOME/
    
  3. 安装新系统后,请安装缺少的软件包

    sudo dpkg --set-selections < package.list 
    sudo apt-get update
    sudo apt-get dist-upgrade
    sudo apt-mark auto $(cat auto.list)
    
  4. 还原您的$ HOME。复制tgz文件并将其解压缩到$ HOME目录中:

    tar xvzf home_backup.tgz
    

您可能还想看看Mint提供的工具来简化此过程。它们都应该也可以在Ubuntu上安装。


4

从理论上讲这是可能的,但可能是危险的。当前的Debian multiarch支持multiarch库,但不支持二进制文件。就是这样。

该系统主要从中了解其自身的体系结构dpkg-architecture(这实际上是一个perl脚本,但它提取并显示了arch信息),该体系结构还声称能够设置该体系结构。


警告:我还没有尝试过!


粗略的过程是:

  1. 安装所有库的multiarch变体(最重要的是libgcc1
  2. 使用dpkg-architecture -aamd64改变你的弓(注意,这可能会抱怨GCC)
  3. 下载并上演所有必需的组件(请参阅下一个)
  4. 强制安装dpkg和依赖项的amd64变体
  5. 强制安装基本基础系统软件包(包括apt-get和内核)的amd64变体(注意,可能会抱怨很多)
  6. 重启
  7. 大概用 apt-get

这些步骤基于我对Debian的设计的了解,该设计在过去12年中几乎完全在Linux发行版中使用debtakeover过(包括以前使用过的)以及我将采用的方法。因此,请您自担风险。尝试执行步骤4后,您的系统可能随时无法使用。步骤4和5的替代方法可能debbootstrap

最重要的是,我强烈建议您在虚拟机上尝试此操作,然后再执行您关心的任何事情。

祝你好运,愿力量与你同在


3

这不是问题的答案,但是可能很难将所有软件包从x86升级到amd64,但是您至少可以轻松地安装amd64内核软件包,这至少将允许您运行64位应用程序以及虚拟机和容器(这可能足以满足您的需求)。

只需使用安装amd64 linux-image软件包dpkg -i --force-architecture


1
--force-architecture不需要,并且可以通过apt在i386上安装amd64内核。
jordanm 2012年

3

那里有很多手册,但是几乎没有手册显示出真正的期望。我是在Debian Wheezy笔记本电脑上写的,我刚刚完成了从32位到64位的升级,它确实可以工作。

我遵循了以下指示,它们对于您将要面对的实际情况非常准确:

http://blog.zugschlus.de/archives/972-How-to-amd64-an-i386-Debian-installation-with-multiarch.html

建议您在整个过程中始终为系统供电,除非确保已迁移了所有内容并且已删除的所有内容都已重新安装(尤其是必不可少的软件包),否则不要重新启动系统,否则您将无法使系统再次运行。


1
有趣的是阅读了实际涉及的内容,但是阅读了之后,我认为最好重新安装。谢谢。
Faheem Mitha 2013年

该链接对我不起作用-资源是否已移动?
Toby Speight

哦,是的,您看到日期了吗?我在2013年写道,六年之内东西经常在网上消失。可悲的是,网络仍然没有非常基本的功能:在单击链接之前先显示断开的链接。
nigratruo

1

按照使用awk的想法,我最终使用:

dpkg --get-selections \               # get the list
 | grep -v deinstall \                # throw away deselected packages
 | grep ':i386' \                     # get the i386 arch packages
 | sed 's/install//g' \               # drop 'install' to get list
 | sed 's/:i386/:amd64/g' \           # replace i386 with amd64
 | while read package; do \           # iterate over the result
      apt-get -yf install $package; \ # install each one and fix dependencies
   done

我不得不运行几次。dpkg --get-selections只是按字母顺序排列的列表,因此顶部需要底部包装的包装将被传递。如果要查看要安装的数量,请dpkg --get-selections | grep amd64 | wc -lwhile循环内执行。


-1

我对此事经验不足,但我确实相信您说对了,即使用多体系结构从32转换为64应该是正确的。尽管我对新系统的支持程度持谨慎态度。

这是我阅读的讨论此问题的文档之一,也许对您有所帮助:https : //wiki.ubuntu.com/MultiarchSpec

注意第三个用户故事。这是围绕同一主题的另一个链接:https : //help.ubuntu.com/community/MultiArch

即使在Debian和Ubunutu之间可能有点不同,但这是一个核心功能。我想Ubuntu和Debian会紧密合作,以使这种结构在Ubuntu退出并做自己喜欢的事情之前发挥作用。

祝好运!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.