我正在尝试运行一个 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 发行版。
此外,这也取决于应用程序本身,除了网络之外它还需要什么服务等等。
我认为如果您可以提供更具体的信息,您将得到更详细的答复。
比如什么样的应用程序等等。