기계에 메모리가 부족할 때 어떻게 컴파일합니까?

기계에 메모리가 부족할 때 어떻게 컴파일합니까?

IRC 바운서로 ZNC가 설정된 저가형 VPS가 있고 훌륭하게 실행됩니다. 약 128MB의 플래시가 있는데 사용하려는 모듈 중 하나를 컴파일하기에는 충분하지 않습니다.znc-push.

가상 머신에서 파일을 컴파일하고 전송하려고 시도한 후 모듈을 로드하려고 하면 "잘못된 ELF 헤더" 오류가 발생합니다. 이 모듈을 원격으로 컴파일하고 전송하는 방법은 무엇입니까? 실행하기에 충분한 메모리가 있지만 컴파일되지 않습니다. distcc를 사용해 보았지만 사용 방법에 대한 신뢰할 수 있는 정보를 찾을 수 없습니다.

그리고 스왑 파일을 생성해 보았는데 이 VPS에서는 허용되지 않거나 불가능합니다.

답변1

분명히 그러한 기계에는 자원이 없으며 개발 목적에 적합하지 않습니다.

이런 종류의 작업을 위해 (인텔) 데비안의 기본 아키텍처를 맹목적으로 컴파일할 수는 없습니다. 이는 분명히 소규모 서버에 대한 외계인 아키텍처/바이너리입니다.

대상 아키텍처에 대한 바이너리를 생성하기 위해 소스 코드를 컴파일하는 원격 시스템/Debian 7에서 크로스 컴파일러(교차) 도구 체인을 구축해야 합니다.

종종 크로스 툴체인에는 특정 설치 단계가 있을 수 있으며 환경에 맞게 일부 조정이 필요할 수 있습니다.

크로스 컴파일러는 컴파일러가 실행 중인 플랫폼이 아닌 다른 플랫폼에 대해 실행 가능한 코드를 생성할 수 있는 컴파일러입니다.

하나의 시스템에서 여러 플랫폼용으로 컴파일하려면 크로스 컴파일러가 필요합니다. 이는 임베디드 시스템용 마이크로 컨트롤러와 같이 컴파일러가 실행되는 플랫폼에서는 실행 가능하지 않을 수 있습니다. 이러한 시스템에는 운영 체제가 포함되어 있지 않기 때문입니다.

예를 들어,

GCC 크로스 컴파일러를 빌드하는 방법

또 다른 예는 NetBSD/ARM용 Debian에서 크로스 컴파일러를 설정한 적이 있습니다. 예를 들어 openwrt/32비트 MIPS용 바이너리가 필요한 경우 uClib 및 32비트와 일치하는 크로스 컴파일 환경을 확보해야 했습니다. MIPS - 내 MIP 기반 라우터에는 96MB의 RAM과 128MB(또는 256MB)만 있습니까? ) 플래시.

그런데 일부 임베디드/소형 라우터 환경에서는유클립공간을 절약하기 위해 glibc 대신 uClib가 glibc보다 훨씬 작기 때문입니다.

uClibc는 임베디드 시스템 및 모바일 장치용 Linux 커널 기반 운영 체제용 소형 C 표준 라이브러리입니다.

uClibc는 대부분 처음부터 작성되었지만 glibc 및 기타 프로젝트의 코드를 통합합니다.

uClibc는 Linux 커널 및 μClinux 시스템 호출을 둘러싼 래퍼입니다. uClibc는 Linux 배포판에서 일반적으로 사용되는 C 라이브러리인 glibc보다 훨씬 작습니다. glibc는 다양한 하드웨어 및 커널 플랫폼에서 모든 관련 C 표준을 완벽하게 지원하도록 설계되었지만 uClibc는 특히 임베디드 Linux에 중점을 두고 있습니다. 공간 요구 사항에 따라 기능을 활성화하거나 비활성화할 수 있습니다.

당신도 여러 번바쁜 상자ls예를 들어, Linux에서 바이너리 유틸리티의 간단한 버전을 교체하고 제공하면 과 find가 다르고 덜 강력하며 작업할 수 있는 옵션이 더 적다는 것을 알게 될 것입니다 .

BusyBox는 단일 실행 파일에 여러 개의 컴팩트 Unix 도구를 제공하는 소프트웨어입니다. Linux, Android [7] 및 FreeBSD [8]와 같은 다양한 POSIX 환경에서 실행되지만, 제공되는 많은 도구는 Linux 커널에서 제공하는 인터페이스와 작동하도록 설계되었습니다. 리소스가 매우 제한된 임베디드 운영 체제를 위해 특별히 제작되었습니다.

차이점은 여기서 끝나지 않습니다. Apache가 없을 수도 있지만 OpenSSH 대신 Luci가 있습니다.물방울곰SSH.

Dropbear는 비교적 작은 SSH 서버이자 클라이언트입니다. Dropbear는 무선 라우터와 같은 "임베디드" 유형의 Linux(또는 기타 Unix) 시스템에 특히 유용합니다.

또한 최신 버전일 필요는 없지만 매우 간단한 Linux 커널을 갖게 됩니다. 일부 중국 마더보드에서는 비표준 하드웨어를 지원하기 위해 어떤 방식으로든 "해킹"될 수 있으며 사용자(및 종종 공급업체)가 새 버전에 맞게 다시 컴파일할 수 없습니다.

귀하의 소규모 시스템 환경에 대해 더 많은 조사가 필요하다는 점을 유감스럽게 생각합니다. 또한 이 답변이 귀하가 본격적인 Linux 서버와 같은 모든 방식으로 임베디드 Linux를 다루고 싶지 않다는 것을 깨닫는 데 도움이 되기를 바랍니다.

언제나 그렇듯이 도구를 갖추는 것 외에도 도구도 알아야 합니다.

답변2

저장공간이 충분하다면 스왑을 통해 RAM을 확장할 수 있습니다.

우분투의 경우:

  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 오류 없이 컴파일됩니다. 행운을 빌어요!

관련 정보