하나의 프로그램만 실행하는 나만의 "사용자 정의" Linux 배포판을 만드는 방법은 다음과 같습니다.XBMC 이 사진.
답변1
단계별 최소 초기화 Hello World 프로그램
종속성 없이 Hello World를 컴파일하고 무한 루프로 끝납니다. init.S
:
.global _start
_start:
mov $1, %rax
mov $1, %rdi
mov $message, %rsi
mov $message_len, %rdx
syscall
jmp .
message: .ascii "FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n"
.equ message_len, . - message
종료 시스템 호출을 사용할 수 없습니다. 그렇지 않으면 커널이 충돌하고 init를 정상적으로 종료하는 유일한 방법은 다음과 같습니다.reboot
시스템 호출을 사용하여 시스템 전원 끄기.
그 다음에:
mkdir d
as --64 -o init.o init.S # assemble
ld -o d/init init.o # link
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"
/init
그러면 커널이 실행할 첫 번째 사용자 모드 프로그램인 hello world를 사용하여 파일 시스템이 생성됩니다 . 또한 더 많은 파일을 추가하고 커널이 실행되는 동안 d/
프로그램에서 해당 파일에 액세스할 수 있도록 할 수도 있습니다./init
그런 다음 cd
Linux 커널 트리로 이동하여 평소와 같이 빌드하고 QEMU에서 실행합니다.
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git checkout v4.9
make mrproper
make defconfig
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -initrd "$ROOTFS_PATH"
다음 줄이 표시됩니다.
FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR
에뮬레이터 화면에서! 이것이 마지막 줄이 아니므로 더 자세히 살펴보아야 합니다.
C 프로그램을 정적으로 링크하는 경우에도 사용할 수 있습니다.
#include <stdio.h>
#include <unistd.h>
int main() {
printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
sleep(0xFFFFFFFF);
return 0;
}
그리고:
gcc -static init.c -o init
동적 연결을 위해서는 동적 링커 실행 파일을 설정해야 하며, 그 중 가장 일반적인 것은 C 표준 라이브러리(예: glibc)의 일부입니다.
USB를 사용하여 실제 하드웨어에서 실행할 수 /dev/sdX
있으며 다음을 수행할 수 있습니다.
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
이 주제에 대한 중요한 출처:기술 팁: initramfs 사용 방법 landley.com |gen_initramfs_list.sh
또한 프로세스 자동화에 도움이 되는 Linux 커널 소스 트리의 스크립트인 이를 사용하는 방법도 설명합니다 .
Ubuntu 16.10, QEMU 2.6.1에서 테스트되었습니다.
다음 단계
다음으로 해야 할 일은 설정입니다.바쁜 상자, 다음 항목도 참조하세요.가장 작은 Linux 구현은 무엇입니까?
BusyBox는 POSIX-y 셸을 포함한 기본 POSIX-y CLI 유틸리티를 구현하므로 대화식으로 시스템을 보다 쉽게 실험할 수 있습니다.
개인적으로 지금 시점에서는루트 구축, 소스에서 모든 것을 자동으로 빌드하고 루트 파일 시스템을 생성하는 놀라운 스크립트 세트입니다.
이에 대해 매우 상세하고 자동화된 도우미를 업로드했습니다.https://github.com/cirosantilli/linux-kernel-module-cheat
답변2
나는 어두운 숲으로 이어지는 정원 길인 LFS를 건드리지 않을 것입니다.
Arch와 같은 초기 설치 또는 Ubuntu Server와 같은 헤드리스 버전을 제어할 수 있는 배포판으로 시작하십시오. 이것의 목적은 공간을 절약하는 것이 아니라 init 구성의 복잡성을 제한하는 것입니다. 헤드리스 배포부터 시작하여 실행하려는 애플리케이션에 GUI가 필요한 경우 init로 끝나지 않고도 필요한 것을 추가할 수 있습니다. GUI 로그인(디스플레이 관리자 또는 DM이라고도 함)과 그에 맞는 완전한 데스크탑 환경을 시작합니다.
그런 다음 구성 방법을 알고 싶습니다.시스템 초기화귀하의 목적을 위해 - init 없이는 살 수 없다는 점에 유의하십시오. 이는 아마도 귀하의 목표를 달성하는 가장 좋은 방법일 것입니다. 현재 대부분의 Linux 배포판에서 사용되는 초기화 시스템은 다음과 같습니다.체계.
여기서 요점은 시작 시 init가 수행하는 작업을 최소화하는 것입니다. 이는 집중하려는 응용 프로그램을 지원하기 위해 최소한의 소프트웨어를 실행하는 시스템을 만드는 방법입니다. 이것은 기본적으로 서버를 설정하는 방법입니다. BTW, 그래서 일반적인 작업입니다(적어도 유용하지는 않지만 실제로 "단 하나의" 사용자 영역 프로세스를 실행할 수는 없습니다).
실행하려는 응용 프로그램이 GUI 프로그램인 경우(GUI 응용 프로그램에는 X 서버가 필요하기 때문에 응용 프로그램을 실행할 수 없는 이유에 대한 좋은 예입니다) ~/.xinitrc
이 프로그램과 유사한 응용 프로그램을 가질 수 있습니다.
#!/bin/sh
myprogram
그러면 귀하의 프로그램 startx
만 실행되며 바탕 화면을 변경하거나 다른 프로그램을 시작할 수 없습니다. 부분적으로는 창 관리자나 데스크탑 환경이 없기 때문입니다(따라서 창 프레임이나 제목 표시줄도 없습니다).
답변3
프로그래밍에 대해 조금 알고 있고 처음부터 만들고 싶다면 LFS, 즉 Linux from Scratch를 사용할 수 있습니다.http://www.linuxfromscratch.org/
ubutnu를 사용자 정의하려면 ubunt-builder를 사용하고, rpm 기반으로 사용하려면 SUSE-Studio를 사용하고, Suse studio를 사용하면 suse linux를 사용자 정의할 수 있습니다.
건배
답변4
당신이 물어봐야 할 것은 당신의 "프로젝트"에 필요한 것이 무엇인지, 그리고 당신이 가지고 있는 자원이 무엇인지입니다.
여러 라이브러리와 지원 바이너리가 필요한 경우 "일반" Linux 배포판(Debian 또는 유사한 배포판)을 사용하고 부팅 프로세스를 약간 조작하는 것이 더 나을 것입니다.
더 좁은 범위의 지원 콘텐츠가 필요하지만 여전히 다른 커널 모듈이나 사용자 공간 지원 비트를 사용하는 네트워킹이나 다양한 하드웨어에 대한 지원이 필요하고 일반 배포의 디스크 공간 오버헤드를 원하지 않는 경우 다음을 살펴보는 것이 좋습니다. 임베디드 배포판(빌드루트 또는 유사) 또는 처음부터 Linux 접근 방식(유지 관리 문제가 될 수 있음)
비모듈식 커널이 제공할 수 있는 것만 필요하고 다른 것은 필요하지 않다면 커널에서 직접 바이너리를 실행하는 것이 아마도 작동할 것이며 가장 가벼운 솔루션일 것입니다.