如何创建一个运行单个应用程序的 Linux 系统?

dsc*_*atz 19 linux

我正在尝试运行一个 Linux 应用程序,而我想要运行的只是这个关闭启动的应用程序。我需要网络,仅此而已(没有显示器、外围设备等)。我不想运行其他应用程序,以便我运行的应用程序具有 100% 的 CPU。这可能吗?

Cir*_*郝海东 18

最小的 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
Run Code Online (Sandbox Code Playgroud)

我们不能使用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"
Run Code Online (Sandbox Code Playgroud)

这将创建一个文件系统/init,其中包含我们的 hello world at ,这是内核将运行的第一个用户态程序。我们还可以向其中添加更多文件,d/并且/init在内核运行时可以从程序访问它们。

然后cd进入Linux内核树,照常build,在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"
Run Code Online (Sandbox Code Playgroud)

你应该看到一行:

FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR
Run Code Online (Sandbox Code Playgroud)

在模拟器屏幕上!请注意,它不是最后一行,因此您必须往上看。

如果静态链接它们,也可以使用 C 程序:

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
    sleep(0xFFFFFFFF);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和:

gcc -static init.c -o init
Run Code Online (Sandbox Code Playgroud)

您可以在带有 USB 的真实硬件上运行,/dev/sdX并且:

make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
Run Code Online (Sandbox Code Playgroud)

关于此主题的重要来源:http : //landley.net/writing/rootfs-howto.html它还解释了如何使用gen_initramfs_list.sh,这是来自 Linux 内核源代码树的脚本,可帮助自动化该过程。

下一步:设置 BusyBox,以便您可以与系统交互:https : //unix.stackexchange.com/questions/2692/what-is-the-smallest-possible-linux-implementation/203902#203902

在 Ubuntu 16.10、QEMU 2.6.1 上测试。


bak*_*ytn 1

有一些系统应用程序是必须运行的,当然,除了它们之外,您可以将其余的计算机资源专用于该应用程序。为了获得最低限度,您可以看看非常小的 Linux 发行版,例如 TinyCore Linux 等。

它还取决于应用程序本身,除了网络之外它还需要哪些服务等。

我认为如果您能提供更具体的信息,您会得到更详细的答复。

比如什么样的app之类的。