当机器内存不够时如何编译?

当机器内存不够时如何编译?

我有一个低端 VPS,设置了 ZNC 作为 IRC 保镖,它运行得很好,它有大约 128 MB 的闪存,这不足以编译我想要使用的模块之一znc-push

尝试在虚拟机上编译并发送文件后,当我尝试加载模块时,出现“无效的 ELF 标头”错误。如何远程编译这个模块然后发送过来?它有足够的内存来运行它,但不会编译它,我已经研究过使用 distcc,但我找不到任何关于如何使用它的可靠信息。

另外,我尝试创建交换文件,但此 VPS 不允许/不可能这样做。

答案1

显然这样的机器没有资源,并且不适合开发目的。

对于此类任务,您不能在(Intel)Debian 的本机架构中盲目编译,这对于您的小型服务器来说显然是一个陌生的架构/二进制文件。

您需要在远程计算机/Debian 7 中构建一个交叉编译器(cross)工具链,该工具链编译源代码,为目标架构生成二进制文件。

通常,交叉工具链可能有特定的安装步骤,并且可能需要针对您的环境进行一些调整。

交叉编译器是一种能够为编译器运行平台以外的平台创建可执行代码的编译器。

要从一台机器为多个平台进行编译,需要交叉编译器。编译器运行的平台可能不可行,例如嵌入式系统的微控制器,因为这些系统不包含操作系统。

举个例子,

如何构建 GCC 交叉编译器

另一个例子,我曾经在 Debian 中为 NetBSD/ARM 设置了一个交叉编译器;或者例如,如果我需要 openwrt/32 位 MIPS 的二进制文件,我必须获得与 uClib 和 32 位 MIPS 匹配的交叉编译环境 - 我的基于 MIPs 的路由器只有 96MB 的 RAM 和 128MB(或 256MB) ?)的闪光灯。

说到这一点,一些嵌入式/小型路由器环境使用uClib而不是 glibc 以节省空间,因为 uClib 比 glibc 小得多。

uClibc 是一个小型 C 标准库,适用于嵌入式系统和移动设备的基于 Linux 内核的操作系统。

uClibc 大部分是从头开始编写的,但合并了来自 glibc 和其他项目的代码。

uClibc 是 Linux 内核和 μClinux 系统调用的包装器。 uClibc 比 Linux 发行版通常使用的 C 库 glibc 小得多。虽然 glibc 旨在完全支持跨各种硬件和内核平台的所有相关 C 标准,但 uClibc 特别专注于嵌入式 Linux。可以根据空间要求启用或禁用功能。

很多时候你也有忙碌盒替换并为您提供 Linux 中二进制实用程序的简单版本,例如,您会注意到lsfind是不同的,功能较弱并且可供使用的选项较少。

BusyBox 是一个在单个可执行文件中提供多个精简 Unix 工具的软件。它运行在各种 POSIX 环境中,例如 Linux、Android[7] 和 FreeBSD[8],尽管它提供的许多工具旨在与 Linux 内核提供的接口配合使用。它是专为资源非常有限的嵌入式操作系统而创建的。

差异还不止于此。你可能没有 Apache,而是 Luci;而不是 OpenSSH,水滴熊SSH。

Dropbear 是一个相对较小的 SSH 服务器和客户端。 Dropbear 对于“嵌入式”类型的 Linux(或其他 Unix)系统特别有用,例如无线路由器。

您还将拥有一个非常精简的 Linux 内核,而且不一定是最新版本。在一些中国主板上,它也可能在某种程度上被“黑客攻击”以支持非标准硬件,并且您(通常还有供应商)将无法为新版本重新编译它。

恐怕您需要对您的小型机器环境进行更多研究;我还希望这个答案能够帮助您认识到,您并不希望以处理成熟 Linux 服务器的所有方式来处理嵌入式 Linux。

一如既往,除了拥有工具之外,还必须了解它们。

答案2

如果你有足够的存储空间,你可以通过交换来扩展RAM。

对于Ubuntu:

  1. sudo fallocate -l 4G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile && sudo nano /etc/fstab
  2. 然后手动将以下行添加到 /etc/fstab :/swapfile none swap sw 0 0
  3. 重启

编译没有 RAM 错误。祝你好运!

相关内容