当前位置: 首页>>技术教程>>正文


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

ubuntuer 技术教程 , 去评论

问题描述

我有一个在64位硬件上运行的32位Ubuntu安装。既然是multi-arch has been implemented,我想切换到64位而无需重新安装操作系统。

这是user stories addressed by the spec之一:

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

但是,当试图按照那里的说明,我找不到任何64位版本的dpkg或apt。

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

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

最佳解决办法

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

您将使用well-advised替换现有的Ubuntu系统,使用新的64位安装。

但是,如果您希望尝试此技术,则必须手动下载dpkgapt.deb文件。您可以在Ubuntu的dpkg和Launchpad上的Ubuntu页面的apt中找到它们 – 展开标记为发布,安全性和/或更新的“The Oneiric Ocelot”下的最新版本(但您可能不需要版本仅标记建议和/或后退,如果有的话)。然后下载标记为amd64.deb文件。具体来说,您需要的文件是:这个文件用于dpkg(以及其他列出的,如果您安装了这些软件包)和thisthisthis以及thisthis用于apt

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

您可以通过将所有这些包放在一个不包含任何其他内容的文件夹中来安装所有这些包(假设该文件夹名为debs并位于Downloads目录中),然后运行此命令:

sudo dpkg -Ri ~/Downloads/debs

当然,一旦你安装它们,它们就不会真正运行,因为它们的可执行文件是64位而你的32位Ubuntu系统运行的是32位内核(它只运行32位可执行文件)。事实上,他们甚至可能没有完成安装,因为他们可能有post-install脚本调用他们不可运行的64位可执行文件。

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

以下是执行此操作的具体说明……但请不要将此视为我说它会起作用。我没试过这个。 (我已经从live CD中安装了已安装的Ubuntu系统并执行了包管理和其他操作,但我没有尝试过这里建议的cross-architecture操作。)

  1. 在已安装的Ubuntu系统中,打开终端窗口(Ctrl + Alt + T)并运行mount | grep ' on / '(将其粘贴到终端并按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位)live CD引导并选择”Try Ubuntu”而不是”Install Ubuntu”。

  4. 进入Web浏览器并确保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以查看Internet连接是否在chroot内完全正常工作。你希望这样的事情:

    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,将相关配置文件从live 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. 运行这些命令以使您的chrooted环境完全可以使用:

    export HOME=/root  
    export LC_ALL=C  
    
  11. 如果尚未为64位版本的dpkgapt安装.deb文件,请立即执行。如果您确实安装了它们但有配置错误,请运行dpkg --configure -a来修复它们。 (希望这样可行……最好等到安装它们直到你进入实时CD环境,以防在启动安装系统时安装64位dpkg使dpkg处于不可用状态。 )

  12. 安装了64位版本的dpkgapt,假设它们将自动安装64位软件包,您现在可以删除所有32位内核并安装64位内核。要删除32位内核,请运行dpkg -l | grep linux-。这将列出以linux-开头的已安装软件包。您对以linux-genericlinux-imagelinux-server和/或linux-headers开头的软件包更感兴趣。使用apt-get purge ...删除这些文件,其中...将替换为您要删除的软件包的space-separated列表。

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

  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),然后重新启动(或关闭)Live CD系统并启动到已安装的系统。

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

您可能需要安装其他软件包,例如ia32_libs和/或64位版本的libc6,以实现此功能。对于其中一些,在尝试安装64位版本的dpkg和/或apt时,可能会通知您需要它们。对于其他人,您可能不会被告知。

(以上关于chrooting和在chrooted环境中操作的说明主要基于this related but different procedure以及我的一些Launchpad Answers帖子,特别是#6 here和#6 here。特别感谢Caesium指出64位dpkgapt可执行文件不能在运行32位内核的系统上运行。)

次佳解决办法

如上所述,我做了:

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位用户空间。

第三种解决办法

虽然问题类似于Is it possible to “upgrade” from a 32bit to a 64bit installation?(如果你没有看过它我鼓励你试试。答案提供的很好。)我还建议阅读以下链接:

For better performance should I install 32-bit or 64-bit?

How can I switch a 32-bit installation to a 64-bit one?

What are the differences between 32-bit and 64-bit, and which should I choose?

有可能:是的

这很简单:不!

如果您的问题是内存,那么您应该知道Ubuntu 32位可以读取超过4GB的RAM(最高64 GB)。因此,使用最新的Ubuntu 32 Bit版本与具有32位或64位架构的计算机并放入更多RAM将不会成为问题。它只会读取额外的RAM并工作。

第四种办法

这些答案有点过时了。 Cross-grading现已在the Debian wiki上为Debian记录,但仍不建议使用。

从其他架构安装内核现在就像在那里描述的那样简单,但是新的’apt’将无法识别以前架构中的软件包,因此其所有front-ends都可能会报告大量已损坏的软件包。这要么需要将所有依赖项更改为其他体系结构,要么将apt和dpkg恢复为32位。

所以最好的方法可能是首先保存dpkg --get-selections的结果,从中剥离:i386,并为每个依赖项下载一个amd64包到缓存中:

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

充其量它可能很慢并且time-consuming解析依赖关系。

第五种办法

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

使用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 Release Notes。在这种情况下,您当前的内核与64位内核to-be-installed冲突,因此被删除。如果你不喜欢这个想法,你可能想要尝试旧的64位内核包”linux-generic-lts-trusty:amd64″。

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

  3. 要查看apt-get将对您的系统执行的操作,请使用选项-Vs运行它,该选项启用“详细模拟模式”。这将打印要安装和删除的所有包。

  4. 使用新内核进行系统引导是否取决于grub配置。以root用户身份运行update-grub以进行grub更新并打印当前的引导配置。列表中的第一个图像将作为默认值启动。

  5. 为了选择不同的内核映像,我从/etc/default/grub中删除了行GRUB_HIDDEN_TIMEOUT=0,并以root用户update-grub运行。在启动时,您现在可以选择一个不同的内核(您有10秒钟可以点击任何键,否则grub将继续使用默认内核)。

  6. 得票率最高的答案来自2011年,在我看来毫无希望地过时了。 Multiarch允许您在同一台计算机上安装来自多个体系结构的库包,而不需要太多麻烦。

第六种办法

也许,当我遇到同样的问题时,这将起作用,这是我打算做的事情:

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

第七种办法

是的,foreign-architecture系列对于安装任何cross-arch软件包绝对至关重要。但在那之后,像其他几个用户一样提到:

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

这应该就是这样做的……

第八种办法

我的Ubuntu 16.04 Xenial的配方,在freshly-installed 32位Ubuntu VM上测试,带有标准系统和SSH服务器,但没有GUI:

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文件中保存的列表可用于满足您的任何进一步需求。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1462.html,未经允许,请勿转载。