我们有一个 Ubuntu 服务器 vmware-instance,它似乎安装的是 64 位版本。
不幸的是,我们现在想将其移动到仅 32 位的主机,因此当前安装将无法运行。安装经过了相当大的调整,所以我真的非常希望转换当前安装,而不是进行全新安装。
是否有可靠的方法来获取所有内容的 32 位版本并转换内核,或者我应该完全放弃这个想法?
谢谢大家的帮助。
编辑:此 Linux 实例的主要目的是提供 CVS 存储库。经过仔细考虑,我们决定从 CVS 迁移到 git,而不是进行 64->32 位练习。
答案1
我认为没有简单、稳定、可靠、自动化的方法,因为它不需要经常使用,不值得花费大量时间进行开发和测试,而且手动执行可能比简单地从头开始重建 VM 的安装花费更长的时间。
不过,你可以在一定程度上加快重建速度,你可以通过运行以下命令来确保安装了所有相同的软件包
sudo dpkg --get-selections | grep '[[:space:]]install$' | \awk '{print $1}' > package_list
在旧虚拟机上,传输文件并运行
cat package_list | xargs sudo apt-get install
在新的虚拟机上。
然后将旧的 VM/etc/
树复制到新机器上(而不是直接/etc
将其放在临时位置),并使用diff
工具来查找需要转移的差异。不直接批量复制的原因/etc
是,某些 64 位/32 位软件包的默认配置可能存在细微差异,您可能至少需要查看这些差异,而不是在不知情的情况下进行快速复制。首先/etc/apt/sources.lst
需要有所不同。(即使这样做是为了将 32 位安装复制到另一个 32 位安装,我仍然不会直接复制/etc
- 像这样进行差异复制可以让您找到不再相关且应该清除的内容,以便清晰起见)
完成后,复制 /home 以重新获得任何用户特定的配置和数据,以及任何类似/var/www
从那里通过 HTTP 提供的文件等,您就基本完成了。
我使用上述方法将一个 32 位安装复制到另一个 32 位安装,但它应该在架构之间同样有效。您可能会发现某些软件包会导致命令apt-get
警告您找不到软件包。其中一些将是 32 位兼容软件包,显然不会出现在 32 位存储库中(只需将它们从软件包列表中删除并重新运行),而一些可能是明确命名了 32 位和 64 位软件包的软件包(在这种情况下,使用 packages.ubuntu.com 上的搜索找到正确的名称,编辑软件包列表,然后重新运行 apt-get)。
当然,这不会复制你没有从 Ubuntu 存储库安装的任何内容,因此你必须手动重做类似的事情,但除此之外,此过程可能会为您节省一些时间。此外,在运行 apt-get 之前,请确保新 VM 的 sources.list 启用了与旧 VM 相同的存储库,否则您将收到更多未找到软件包的问题apt-get
。
答案2
我知道 Ubuntu 中不仅内核是 64 位的。
由于之前没有进行过这种迁移,因此我不能肯定地说,但我觉得这个计划可能是最好的。尝试在实例的副本上将内核更改为 32 位,看看是否可行。然后尝试将其复制到另一台机器上。如果这不起作用,请重新安装 Ubuntu 并分批复制配置文件,看看是否有任何损坏。
如果第一种方法不起作用,第二种方法虽然非常复杂且耗时,但可能会节省您的调整时间。
答案3
最好的选择是重新安装。例如,查看我的 Ubuntu 64 位服务器上 binutils 包的详细信息:
smiller@corinne3:~$ dpkg-query -p binutils
Package: binutils
Priority: optional
Section: devel
Installed-Size: 10092
Maintainer: Ubuntu Core developers <[email protected]>
Architecture: amd64
Version: 2.20-0ubuntu2
Provides: elf-binutils
Depends: libc6 (>= 2.8), zlib1g (>= 1:1.1.4)
Suggests: binutils-doc (>= 2.20-0ubuntu2)
Conflicts: elf-binutils, gas, modutils (<< 2.4.19-1)
Size: 1660892
Description: The GNU assembler, linker and binary utilities
The programs in this package are used to assemble, link and manipulate
binary and object files. They may be used in conjunction with a compiler
and various libraries to build programs.
Original-Maintainer: Matthias Klose <[email protected]>
“Architecture: amd64”行表示该软件包被编译为 64 位二进制文件,在启动 32 位内核之前需要将其替换为 32 位版本。替换核心 libc6 库时会出现大问题,因为许多软件包都依赖于这些库。