단일 애플리케이션을 실행하는 Linux 시스템을 작성하는 방법은 무엇입니까? 하나만 실행하려고합니다. 네트워킹이 필요하고 그게

Linux 응용 프로그램을 실행하려고하는데 부팅하려는 응용 프로그램 하나만 실행하려고합니다. 네트워킹이 필요하고 그게 전부입니다 (디스플레이, 주변 장치 등 없음). 실행중인 응용 프로그램이 CPU의 100 %를 갖도록 다른 응용 프로그램을 실행하고 싶지 않습니다. 이게 가능해?



답변

최소한의 initrd CPIO 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

우리는 sys_exit커널 패닉을 사용할 수 없습니다 .

그때:

mkdir d
as --64 -o init.o init.S
ld -o init d/init.o
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"

이것은 hello world at에서 파일 시스템을 생성하는데 /init, 이것은 커널이 실행되는 최초의 사용자 프로그램입니다. 또한 파일을 더 추가 d/할 수 /init있으며 커널이 실행될 때 프로그램 에서 액세스 할 수 있습니다 .

그런 다음 cdLinux 커널 트리에 빌드는 평소와 같이 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 프로그램을 정적으로 연결하면 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

USB가 켜진 상태에서 실제 하드웨어에서 실행할 수 있습니다 /dev/sdX.

make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX

이 주제에 대한 훌륭한 소스 : http://landley.net/writing/rootfs-howto.html 또한 gen_initramfs_list.sh프로세스를 자동화하는 데 도움이되는 Linux 커널 소스 트리의 스크립트 인 사용법도 설명합니다 .

다음 단계 : 시스템과 상호 작용할 수 있도록 BusyBox를 설정 하십시오.

Ubuntu 16.10, QEMU 2.6.1에서 테스트되었습니다.


답변

init=/path/to/myapp부트 로더에 정의 된 매개 변수로 커널을 시작할 수 있습니다 .


답변

키오스크 를 설정하려는 것 같습니다 . 인터넷에 관한 대부분의 가이드는 Firefox와 같은 웹 브라우저를 단일 응용 프로그램으로 사용합니다. 이 안내서 에서 아이디어를 살펴보십시오 .


답변

커널을 부팅 한 후 하나의 사용자 응용 프로그램 만 실행할 수 있습니다. 그러나 존재해야하는 다른 커널 관련 프로세스가 있기 때문에 CPU의 100 %가 아닙니다. 이는 일반적으로 무선 라우터와 같은 내장 Linux 장치에서 수행됩니다. 또한 다중 스레드 응용 프로그램에서이 작업을 수행 한 경험이 있습니다.

커널이 부팅되면 초기화 또는 시작 스크립트가 실행됩니다. 리눅스에 최대 읽기 실행 수준 및 초기화 과정. 사용중인 다양한 시작 구성표가 있으므로 구체적으로 지정할 수 없습니다. 그러나 Linux에서는 상황에 따라 실행할 응용 프로그램과 데몬을 정확하게 구성 할 수 있습니다. 루트에있는 시작 파일 이외의 수정이 필요한 파일은 / etc 에 있으며 특히 /etc/init.d에 있습니다.

BTW는 슈퍼 프로그래머가 아니거나 원격 GDB 서버를 실행하기 전에는 응용 프로그램에 대해 디버그 콘솔 (PC 콘솔 또는 직렬 포트)이 필요합니다. 이를 통해 세그먼트 오류, 버스 오류 및 어설 션 오류에 대한 알림을받을 수 있습니다. 따라서 “네트워킹”외에 “주변 장치”를 계획하십시오.


답변

실행해야하는 일부 시스템 응용 프로그램이 있으며 나머지 컴퓨터 리소스는 해당 응용 프로그램에 전용으로 사용할 수 있습니다. 최소한으로 TinyCore Linux와 같은 작은 Linux 배포판을 살펴볼 수 있습니다.

또한 응용 프로그램 자체, 네트워크 외에 필요한 서비스 등에 의존합니다.

보다 구체적인 정보를 제공 할 수 있다면보다 자세한 답변을 얻을 수있을 것입니다.

어떤 종류의 앱 등


답변

Linux 커널, 네트워킹 및 응용 프로그램 이외의 것을 정말로 원한다면 유일한 방법은 다음과 같습니다.

  • 응용 프로그램을 커널 모듈로 만들어야합니다. 디버그되고 테스트가 잘되었는지 확인하십시오. 이 커널 모듈은 설정된 인터페이스 IP 주소와 같은 사용자 공간을 통해 일반적으로 수행되는 모든 것들과 그 좋은 것들을 초기화해야합니다.
  • make menuconfig사용자 정의 커널 을 다운로드 및 구성 ( )하고 시스템 실행 및 네트워킹과 관련이없는 모든 기능을 제거해야합니다. 레이어 차단을 비활성화하고 싶습니다 make menuconfig. 최근 커널에서이 작업을 수행하는 방법을 모르겠습니다 .
  • 그런 다음 모듈을 커널에 포함시켜야 모듈이로드 가능한 모듈이 아닌 커널의 일부로 포함됩니다. 위 단계에서로드 가능한 모듈을 비활성화 할 수 있습니다. 커널 모듈을 만들기에 충분한 C / C ++를 알고 있다면 이것은 쉬울 것입니다.
  • 패닉하지 init않는 커널의 모든 부분을 수정 하지 않거나 1 개의 추가 사용자 공간 프로세스로 살 준비를해야합니다.

커널 모듈이 프로세스를 만들 수 있다는 것을 알고 있습니다. 간단한 ps aux시스템은 일반적인 시스템에서 많은 것을 보여줍니다 (모두 괄호 안에 있음). 아마도 모듈이 커널 프로세스를 생성하기를 원할 것입니다. 커널 생성 프로세스 이외의 모든 프로세스를 제거하려면 스레드 [ kthreadd], 전원 관리 [ pm], 이벤트 계층 [ events] 및 기타 를 비활성화해야 합니다.


보다 실용적인 커널 + 1 사용자 공간 프로세스 설정을 원한다면 가능합니다.

리눅스는 커널 명령 행 옵션을 가지고 있습니다 init=-이것은 커널이 로딩을 마치면 시작할 것입니다. 프로그램은 root=initrd로 (또는 부트 로더가로드 한 ) 지정된 루트 장치에 있어야합니다 .

이 프로그램이 종료되면 Linux가 패닉 상태가되므로 종료하지 마십시오.

SO를 리눅스의 많은 현대 분포는 설정을 가지고 init하는 initrd에서 프로그램이 시작하기 전에, 몇 가지 추가 사용자 공간의 초기화를 수행 /sbin/init하거나 /sbin/systemd. 여기서 배포판이 무엇을하는지 (Debian에 대한 정보는 여기에 있음 ) 알아 내고 최종 “핸드 오프”프로그램을 지정할 수있는 곳을 찾아야합니다. 거기서부터 init또는 대신에 응용 프로그램을 시작하도록 지시 할 수 있습니다 systemd.

systemd빌드 /dev, 호스트 이름 설정 및 기타 사항과 같은 많은 기본 기능을 관리 하므로 융통성이 있으면 systemd단일 프로세스를 생성 하도록 구성 하고 대신 실패하면 다시 시작하는 것이 좋습니다. 내가 실수하지 않으면 기본적으로 단일 사용자 또는 복구 모드 에서이 작업을 수행합니다. 쉘을 시작합니다.

2 개의 프로세스 ( systemd및 프로그램)가 실행 되지만 프로그램이 종료되거나 충돌하면 시스템이 패닉 상태가되지 않습니다.

“netinst”설치는 커널, 셸 및 몇 가지 서비스를 제외하고는 많이 실행되지 않습니다. 또는 OpenWRT / LEDE를 고려하십시오. 기본적으로 Luci를위한 웹 서버가 있고 다른 서비스를 결합하지만 쉽게 비활성화됩니다.