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

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

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

答案1

最小 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 subdir
as --64 -o init.o init.S
ld -o subdir/init init.o
cd subdir
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"

这将创建一个包含我们的 hello world 的文件系统/init,这是内核将运行的第一个用户空间程序。我们还可以添加更多文件,内核运行时程序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

您可以在带有 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 以便您可以与系统交互:https://unix.stackexchange.com/questions/2692/what-is-the-smallest-possible-linux-implementation/203902#203902

在 Ubuntu 16.10、QEMU 2.6.1 上测试。

答案2

您可以使用init=/path/to/myapp引导加载程序中定义的参数启动内核。

答案3

听起来你正在尝试建立一个互联网上的大多数指南都专注于像 Firefox 这样的网络浏览器作为唯一运行的应用程序。看看本指南寻找想法。

答案4

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

此外,这也取决于应用程序本身,除了网络之外它还需要什么服务等等。

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

比如什么样的应用程序等等。

相关内容