如何将32位安装切换为64位安装?


54

我有一个在64位硬件上运行的32位Ubuntu安装。现在已经实现多体系结构,我想切换到64位,而不必重新安装操作系统。

这是该规范解决用户案例之一:

Shawn使用32位版本的Ubuntu安装了他的系统,但是他的硬件是64位的,他想切换。他手动安装了dpkg和apt的amd64版本,替换了i386版本并更改了默认使用哪种体系结构。然后他安装了amd64 ubuntu-minimal软件包;然后他安装了amd64 ubuntu-desktop软件包。随着时间的推移,其余的i386软件包将在升级时自动替换。

但是,当尝试按照此处的说明进行操作时,我找不到dpkg或apt的任何64位版本。

最终规范中是否以不同的方式实现了这个用户故事,还是我需要做一些不同的事情?

简而言之,如何将我的32位安装切换到64位?


3
我意识到这个问题已经在askubuntu.com/questions/5018/…上提出,但是那是在实施多体系结构之前,因此答案应该有所不同。
David Planella

Answers:


36

这种方法非常复杂,并且不可能永远导致您的所有软件包都是amd64版本而不是i386版本。只有实际收到升级的软件包才有可能在体系结构中进行更改,并且仅当没有其他未升级的软件包依赖于它们的i386体系结构时才可能更改。由于某些软件包在您的Ubuntu版本的整个支持周期中都不会收到任何更新,因此您可能永远不会拥有amd64使用这种技术的完整系统。此外,肯定没有官方支持这种方法。

建议您以新的64位安装代替现有的Ubuntu系统。

但是,如果你想尝试这种技术,你将不得不手动下载.deb文件dpkgapt。您可以dpkg在Ubuntu以及Launchpad的aptUbuntu页面上的上找到它们-展开“ Oneiric Ocelot”下的最新版本,将其标记为发行,安全和/或更新(但您可能不希望仅标记一个版本)建议和/或反向移植(如果有)。然后下载.deb标记为的文件amd64。具体来说,你要的文件是:这一个dpkg(和上市他人也一样,如果你已经安装了这些软件包)和这个这个这个这个这个apt

在对这些文件执行任何操作之前,应确保备份已安装的Ubuntu系统中的所有重要文档以及任何其他重要文件(例​​如音乐,电子书,视频),因为尝试此技术很可能会适得其反并使您的Ubuntu系统完全无法使用。

您可以通过以下方式安装所有这些软件包:将它们放在没有其他内容的文件夹中(假设该文件夹已被调用debs并且位于Downloads目录中),然后运行以下命令:

sudo dpkg -Ri ~/Downloads/debs

当然,一旦安装它们,它们将不会真正运行,因为它们的可执行文件是64位,而您的32位Ubuntu系统正在运行32位内核(仅运行32位可执行文件)。实际上,它们可能甚至没有完成安装,因为它们可能具有调用其不可运行的64位可执行文件的安装后脚本。

有多种尝试将64位内核安装到32位系统上的方法,但是它们都非常复杂,因此我建议您从64位Oneiric live CD(其本身运行64位)启动。内核),使用chroot进入已安装的Ubuntu系统,并使用最近安装的64位内核aptdpkg安装64位内核。

这是执行此操作的具体说明...但是请不要以此为代表的意思是可以的。我没有尝试过。(我已经从实时CD切换到已安装的Ubuntu系统,并执行了软件包管理和其他操作,但是我没有尝试这里建议的跨体系结构操作。)

  1. 在已安装的Ubuntu系统中,打开一个Terminal窗口(Ctrl+ Alt+ T)并运行mount | grep ' on / '(将其粘贴到Terminal中,然后按Enter)。您应该会看到类似的内容/dev/sda2 on / type ext4 (rw,errors=remount-ro,commit=0)。您感兴趣的部分是之前的设备名称on(在此示例中为/dev/sda2)。记住这一点,或写下来。

  2. 步骤1为您提供了/分区的设备名称。如果您有单独的/boot分区,则还需要知道该设备的设备名称。因此,在这种情况下,请运行mount | grep ' on /boot '。您会看到类似的信息/dev/sda1 on /boot type ext2 (rw)。记住或写下来。

  3. 从Oneiric amd64(即64位)实时CD引导,然后选择“尝试Ubuntu”而不是“安装Ubuntu”。

  4. 进入网络浏览器,并确保Internet连接正常运行。如果不是,请进行设置。

  5. 打开“终端”窗口并运行sudo mount /dev/sda2 /mnt/dev/sda2如果不同,请替换为在步骤1中获得的设备名称)。

  6. 如果您安装的系统具有单独的/boot分区,请运行sudo mount /dev/sda1 /mnt/boot/dev/sda1如果不同,请替换为在步骤2中获得的设备名称)。

  7. 现在,运行以下命令以chroot进入已安装的系统:

    sudo mount --bind /dev /mnt/dev  
    sudo chroot /mnt  
    mount -t proc none /proc  
    mount -t sysfs none /sys  
    mount -t devpts none /dev/pts  
    
  8. 运行ping -c 4 launchpad.net以查看chroot内部的Internet连接是否完全正常。您希望这样的事情:

    PING launchpad.net (91.189.89.223) 56(84) bytes of data.
    64 bytes from launchpad-net.banana.canonical.com (91.189.89.223): icmp_req=1 ttl=41 time=141 ms
    64 bytes from launchpad-net.banana.canonical.com (91.189.89.223): icmp_req=2 ttl=41 time=143 ms
    64 bytes from launchpad-net.banana.canonical.com (91.189.89.223): icmp_req=3 ttl=41 time=142 ms
    64 bytes from launchpad-net.banana.canonical.com (91.189.89.223): icmp_req=4 ttl=41 time=140 ms
    
    --- launchpad.net ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3003ms
    
  9. 相反,如果您无法发送或接收数据包,则必须在chroot中设置Internet连接。为此,请运行以下命令(离开chroot,将相关配置文件从实时CD系统复制到chroot,然后重新输入chroot):

    sudo cp /mnt/etc/resolv.conf /mnt/etc/resolv.conf.old  
    sudo cp /mnt/etc/hosts /mnt/etc/hosts.old  
    sudo cp /etc/resolv.conf /mnt/etc/resolv.conf  
    sudo cp /etc/hosts /mnt/etc/hosts
    

    通常,如果出现错误,您应该停止该过程,但是不要担心这四个命令中的第一个和/或第二个命令是否失败,但前提是失败的具体方式是告诉您/mnt/etc/resolv.conf(或/mnt/etc/hosts)不存在。

    chroot重新输入,然后重试:

    sudo chroot /mnt  
    ping -c 4 launchpad.net  
    
  10. 运行以下命令以使您的chroot环境完全可以使用:

    export HOME=/root  
    export LC_ALL=C  
    
  11. 如果您尚未安装.deb文件的64位版本dpkgapt,所以做了。如果您确实安装了它们但存在配置错误,请运行dpkg --configure -a以对其进行修复。(希望这能奏效……最好等到您进入实时CD环境后再尝试安装它们,以防dpkg引导进入已安装系统时安装64位系统dpkg处于无法使用的状态。)

  12. 使用dpkgapt安装了64位版本的之后,假设它们将自动安装64位程序包,您现在可以删除所有32位内核并安装64位内核。要删除32位内核,请运行dpkg -l | grep linux-。这列出了以开头的已安装软件包linux-。你在开始喜欢包更特别感兴趣linux-genericlinux-imagelinux-server,和/或linux-headers。删除这些文件,apt-get purge ...其中...用要删除的软件包的空格分隔的列表代替。

  13. 现在重新安装您删除的软件包。(实际上,对于在软件包名称中包含版本号的软件包,例如linux-image-3.0.0-13-generic,您只需要安装最新版本的软件包名称。)通过运行apt-get install ...where ...被替换为要安装的软件包的空格分隔的列表来执行此操作。。

  14. 更新引导加载程序配置,卸载某些设备,然后离开chroot:

    update-grub  
    umount /proc || umount -lf /proc  
    umount /sys  
    umount /dev/pts  
    exit  
    sudo umount mnt/dev  
    
  15. 如果您运行sudo cp /mnt/etc/resolv.conf /mnt/etc/resolv.conf.old并且它没有失败,那么现在运行sudo cp /mnt/etc/resolv.conf.old /mnt/etc/resolv.conf

  16. 如果您运行sudo cp /mnt/etc/hosts /mnt/etc/hosts.old并且它没有失败,那么现在运行sudo cp /mnt/etc/hosts.old /mnt/etc/hosts

  17. 如果您安装的系统具有单独的/boot分区,请卸载该分区:sudo umount /mnt/boot

  18. 卸载已安装系统的/分区:sudo umount /mnt

  19. 离开“终端”窗口(运行exit),然后重新引导(或关闭)实时CD系统并引导进入已安装的系统。

  20. 查看系统是否可用并运行64位内核(uname -m应该说体系结构是x86_64)。

要使其正常工作,可能还需要安装其他软件包,例如ia32_libs和/或64位版本的libc6。对于其中的某些,在尝试安装64位版本的dpkg和/或时可能会通知您需要它们apt。对于其他人,可能不会收到通知。

(对于Chroot环境,并在chroot环境运行上面的说明基于在显著部分在此相关但不同的程序,也对一些Launchpad的答案我的帖子,特别是6号在这里和#6 在这里,特别感谢的指出64位dpkgapt可执行文件将无法在运行32位内核的系统上运行。)


2
这些二进制文件是否将在32位内核Eliah下运行?

@Caesium好电话。当然不是。我会编辑我的文章以指示如何运行64位内核...除了我不知道如何在32位Ubuntu系统上安装64位内核软件包(在64位硬件上运行, (当然)何时aptdpkg仍为32位,并且(大概)将拒绝安装64位内核软件包。(从源代码构建内核并使用交叉编译是可行的,但这非常复杂,我不想推荐它。我敢肯定有更好,更简便的方法。如果您知道的话,请放心编辑我或您的帖子或对此发表评论。)
Eliah Kagan

@Caesium实际上,我想我确实知道如何安装64位内核。我将尽快编辑我的帖子以反映这一点。完成后,如果您觉得我提出的技术可行,请随时将其复制和/或解释为答案...,或者,只要您答案中的信息和我的信息都不存在如果您的答案不在您的范围之内,则可以将我们的答案合并为一个答案。(这可能是您的答案,对我来说很好。您在发布之前先发表了一点。然后我删除了我的答案。)
Eliah Kagan

@Caesium编辑已完成;我期待你的评论。
伊利亚·卡根

哇,好工作:)在这一点上,您比我付出了更多的努力,所以我不会梦of以求地复制到我的答案中,您的信誉应该继续存在。它确实偏离了使用多体系结构技术的最初目标,但我仍然想知道它是否仍然有效:)猜猜我们将不得不等待原始海报:)
Cesium

25

如上所述,我做了:

echo foreign-architecture amd64 | sudo tee /etc/dpkg/dpkg.cfg.d/multiarch
sudo apt-get update
sudo apt-get install linux-image:amd64
sudo apt-get install gcc-multilib
sudo update-grub

有效。我可以在Ubuntu 12.04中运行带有64位内核的32位用户区。


5
这个答案令人震惊。我可以确认它仍然可以正常使用。一个区别是添加架构的过程已更改:请sudo dpkg --add-architecture amd64改用。如果您以其他方式这样做,它会大吼大叫。我需要执行此操作,以便可以从32位(以前)安装到64位安装,并且完全按预期工作,没有任何障碍。
Wug 2014年

我曾在Mint上尝试过此方法,但遇到了一些问题,您还有其他事情吗?详细信息:superuser.com/q/927830/150718
Hannibal Lecter博士

除Wug的更改外,您还需要linux-image-generic:amd64在Ubuntu 16.04 上使用。即使没有最后两个命令,它也可以正常工作。
qznc

6

虽然问题类似于“ 是否可以从32位安装升级到64位安装”?(如果您没有阅读它,那么我鼓励您尝试一下。那里提供的答案很好。)我还建议阅读以下链接:

为了获得更好的性能,我应该安装32位还是64位?

如何将32位安装切换为64位安装?

32位和64位之间有什么区别,我应该选择哪个?

是否可能:是

很简单:不!

如果您的问题是内存问题,那么您应该知道Ubuntu 32 Bit可以读取4GB以上的RAM(最大64 GB)。因此,将最新的Ubuntu 32位版本与具有32位或64位体系结构的计算机一起使用并增加RAM不会是一个问题。它只会读取额外的RAM并开始工作。


5

这些答案有些过时了。现在在Debian Wiki为Debian记录了交叉分级,但是仍然不建议使用。

现在可以从那里描述的那样轻松地从其他体系结构安装内核,但是新的“ apt”将无法识别以前体系结构的软件包,因此其所有前端都可能报告许多损坏的软件包。这要么需要将所有依赖关系更改为其他体系结构,要么将apt和dpkg还原为32位。

因此,最好的方法可能是首先保存的结果dpkg --get-selections,从中删除:i386,然后将每个依赖项的amd64软件包下载到缓存:

apt-get --download-only install perl:amd64 python3:amd64 python3-gi:amd64 xorg:amd64...

最好情况下,解决依赖项可能很慢且很耗时。


5

这些说明使您的系统使用64位内核启动,但不会更改大多数userland程序。

使用64位CPU升级系统后,我还想在32位14.04.2 Ubuntu(代号:Trusty)上安装64位内核。为此,我以root用户身份输入了以下命令:

dpkg --add-architecture amd64   
apt-get update
apt-get install linux-generic-lts-utopic:amd64

笔记:

  1. 默认情况下,这可能会删除32位内核,因为它是可信任的(默认情况下),该内核附带了更新的内核(来自utopic的内核),请参见14.04发行说明。在这种情况下,您当前的内核与要安装的64位内核冲突,因此被删除。如果您不喜欢这个主意,则可以尝试使用较旧的64位内核软件包“ linux-generic-lts-trusty:amd64”。

  2. “ --add-architecure”命令是必不可少的。没有它,软件包系统将不支持来自不同体系结构的软件包,请参见Multiarch-HowTo

  3. 要查看对apt-get系统有什么影响,请使用-Vs启用“详细仿真模式” 的选项运行它。这将打印所有要安装和删除的软件包。

  4. 系统是否使用新内核引导取决于grub配置。以root用户update-grub身份运行,以使grub更新并打印当前的引导配置。默认情况下,列表中的第一个映像将被引导。

  5. 要选择其他内核映像,我GRUB_HIDDEN_TIMEOUT=0从删除了该行/etc/default/grub并以root用户 身份运行update-grub。在启动时,您现在可以选择其他内核(您有10秒钟的时间可以敲击任何键,否则grub将继续使用默认内核)。

  6. 票数最高的答案是2011年,我认为这已经过时了。Multiarch使您可以毫不费力地在同一台计算机上安装来自多种体系结构的库软件包。


这是一个很好的简单建议,几乎在14.10(Utopic)上对我有用(但是我做了apt-get install linux-generic:amd64,对实验来说不一定很重要)!如果我通过“ rescue”启动选项,系统将运行,但是X不使用nouveau视频驱动程序和其他东西。如果我正常启动,启动会在某个时候中断,然后系统会重新启动。(但是第一次,我能够成功启动。)我不确定在“正常”启动过程中视频驱动程序是否出问题还是其他原因。
imz-伊万·扎哈拉里舍夫(Ivan Zakharyaschev)2015年

事实证明,视频驱动程序和X与我使用amd64内核的崩溃/重启无关(统计上)。到目前为止,这只是一个谜-bugs.launchpad.net/ubuntu/+source/upstart/+bug/1495116
IMZ -伊万Zakharyaschev

2

也许,当我面临同样的问题时,这将起作用,这正是我计划要做的:

获取64位版本的操作系统,安装到分区中,从32位安装中完全复制文档和其他内容后,安全复制所有内容后,您可以格式化驱动器的其余部分并使用它。


2

是的,外部体系结构对于安装任何跨体系结构软件包绝对至关重要。但是之后,请像其他几个用户所述:

sudo apt-get update
sudo apt-get install linux-image:amd64
sudo apt-get install linux-modules:amd64
sudo init 6 #reboot into new kernel
sudo apt-get install apt:amd64
sudo apt-get install ubuntu-desktop:amd64

那应该就做...


你尝试了吗?它并没有真正起作用,一旦它开始由其amd64同行取代dpkg和perl,我就会遇到问题
Janus Troelsen 2014年

2

我的Ubuntu 16.04 Xenial食谱已在带有标准系统和SSH服务器但没有GUI的新安装的32位Ubuntu VM上进行了测试:

sudo -s
dpkg --get-selections > pkg1
dpkg --add-architecture amd64
apt update
apt install linux-image-generic:amd64 thermald 

(否则它将安装Thermald:amd64并无法在32位内核下重新启动它)

reboot

用64位内核重启后:

sudo -s
unset LANG
apt install apt:amd64 apt-utils:amd64

输入“是的,按照我说的做!” 当被询问时,它将是安全的

mkdir /tmp/upgrade 
cd /tmp/upgrade
pkgs() { dpkg -l | awk '$4=="'$1'"{print $2}' | awk -F: '{print $1}' | sort -u
}
apt download $(comm -23 <(pkgs i386) <(pkgs amd64))
while ls *amd64*deb
do dpkg -i *amd64*deb
   dpkg -l | awk '$1=="ii" && $4=="amd64" {print $2}' | awk -F: '{print $1}' |
   while read a
   do [ -f ${a}_*amd64*deb ] && rm ${a}_*amd64*deb
   done
done

在上面的循环中,我们将删除已成功安装的.deb文件,并在dpkg列表中将其显示为“ ii”状态。

我们需要重复dpkg -i运行,因为它不会在第一次尝试后就成功

reboot

现在,使用64位内核和用户空间,可以删除其余的i386软件包:

dpkg --purge $(dpkg -l | awk '$4=="i386"{print $2}')

您已保存在pkgs1文件中的列表,可用于进一步的需求。


那是种魔术,但是它帮助我通过远程PC上的SSH进行了32到64位的转换。
user271872 '18

1

好问题。除了您引用的用户故事以外,我一直在寻找麻烦,我找不到有关如何执行此操作的任何详细信息。所有文档都表明,它仅适用于已经在64位操作系统上运行32位应用程序。

但是,如果您愿意尝试,可以尝试以下方法(摘自[1]我的链接)

 echo foreign-architecture amd64 | sudo tee /etc/dpkg/dpkg.cfg.d/multiarch
 sudo apt-get install linux-image:amd64

我认为您必须首先使用amd64内核,因为32位内核将无法运行任何64位二进制文​​件。但是,64位二进制文​​件应该运行32位二进制文​​件(如果已安装ia32-libs?)。

如果安装并引导了64位内核,则可以从那里安装apt:amd64,然后按照先前引用的用户故事,ubuntu-minimal,ubuntu-desktop等进行操作。

在安装apt:amd64之后,我认为您可以删除外部体系结构行,因为在那一点上您已经进行了切换。

免责声明:我没有要测试的32位系统,所以这都是猜测。祝好运!

[1] https://wiki.ubuntu.com/OneiricOcelot/TechnicalOverview/Beta1#Improved_handling_of_32-bit_compatibility_on_amd64_systems


1

尚不支持交叉升级(升级到其他体系结构)。

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.