Como compilar quando a máquina não tem memória suficiente?

3

Eu tenho um VPS low-end que é configurado com um ZNC como um segurança IRC, e ele funciona muito bem, ele tem cerca de 128 MB de memória flash, o que não é suficiente para compilar um dos módulos que eu quero use znc-push .

Depois de tentar compilar em uma caixa virtual e enviar o arquivo, recebo um erro de "cabeçalho ELF inválido" quando tento carregar o módulo. Como posso compilar este módulo remotamente e depois enviá-lo? Ele tem memória suficiente para executá-lo, mas não o compila, procurei usar o distcc, mas não consigo encontrar nenhuma informação confiável sobre como usá-lo.

Além disso, tentei criar um arquivo de troca, mas isso não é permitido / possível com esse VPS.

    
por Kam 03.05.2017 / 18:01

2 respostas

5

Obviamente, essa máquina não possui recursos e não se destina a fins de desenvolvimento.

Para tais tarefas, você não pode compilar cegamente na arquitetura nativa do seu (Intel) Debian, que é claramente uma arquitetura alienígena / binários para o seu pequeno servidor.

Você precisa construir um toolchain cross-compiler (cross) em uma máquina remota / no Debian 7, que compila fontes gerando binários para a arquitetura de destino.

Normalmente, o toolchain cruzado pode ter etapas específicas para instalar e pode precisar de alguns ajustes para o seu ambiente.

A cross compiler is a compiler capable of creating executable code for a platform other than the one on which the compiler is running.

A cross compiler is necessary to compile for multiple platforms from one machine. A platform could be infeasible for a compiler to run on, such as for the microcontroller of an embedded system because those systems contain no operating system.

Como exemplo,

Como construir um compilador cruzado do GCC

Como outro exemplo, uma vez eu também configurei um compilador cruzado no Debian para o NetBSD / ARM; ou, por exemplo, se eu precisar de binários para o meu openwrt / MIPS de 32 bits, tenho que obter o ambiente de compilação cruzada que corresponda a uClib e MIPS de 32 bits - meu roteador baseado em MIPs tem apenas 96MB de RAM e 128MB (ou 256MB ?) de flash.

Falando nisso, alguns ambientes de roteadores embutidos / pequenos usam uClib ao invés de glibc para economizar espaço, já que o uClib é muito menor que glibc.

uClibc is a small C standard library intended for Linux kernel-based operating systems for embedded systems and mobile devices.

uClibc was mostly written from scratch,but has incorporated code from glibc and other projects.

uClibc is a wrapper around the system calls of the Linux kernel and μClinux. uClibc is much smaller than the glibc, the C library normally used with Linux distributions. While glibc is intended to fully support all relevant C standards across a wide range of hardware and kernel platforms, uClibc is specifically focused on embedded Linux. Features can be enabled or disabled according to space requirements.

Muitas vezes você também tem busybox substituindo e dando a você uma versão simples dos utilitários binários que você tem em um linux, por exemplo. Você perceberá que ls e find , por exemplo, são diferentes, menos poderosos e têm menos opções de uso.

BusyBox is software that provides several stripped-down Unix tools in a single executable file. It runs in a variety of POSIX environments such as Linux, Android,[7] and FreeBSD,[8] although many of the tools it provides are designed to work with interfaces provided by the Linux kernel. It was specifically created for embedded operating systems with very limited resources.

As diferenças também não acabam aqui. Em vez de Apache, você pode ter Luci; e em vez de OpenSSH, Dropbear SSH.

Dropbear is a relatively small SSH server and client. Dropbear is particularly useful for "embedded"-type Linux (or other Unix) systems, such as wireless routers.

Você também terá um kernel Linux muito reduzido, e não necessariamente a versão mais recente. Em algumas placas chinesas, também pode ser um pouco "hackeado" para suportar hardware não padrão, e você (e muitas vezes o fornecedor) não poderá recompilá-lo para versões mais recentes.

Eu tenho medo que você tenha que pesquisar um pouco mais sobre seu ambiente de pequena máquina; Eu também espero que esta resposta ajude você a perceber que não é esperado lidar com um Linux embarcado de todas as maneiras que você lida com um servidor Linux completo.

Como sempre, além de ter as ferramentas, é necessário entendê-las.

    
por 03.05.2017 / 18:26
0

Se você tiver espaço de armazenamento suficiente, poderá estender a RAM pela troca.

Para o Ubuntu:

  1. sudo fallocate -l 4G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile && sudo nano /etc/fstab
  2. Em seguida, adicione manualmente a seguinte linha ao / etc / fstab: /swapfile none swap sw 0 0
  3. reinicializar

Compile sem erros de RAM. Boa sorte!

    
por 10.10.2018 / 13:23