6

在一台非常简单的 PC 上,我想用最简单的 bash 脚本替换 Ubuntu 12.04 /sbin/init 以使运行的进程数量最少。显然,没有 X,没有 USB,没有检测到新硬件,没有升级,没有 apt,“什么都没有”,我只需要一个带有基于 DHCP 的 Wi-Fi IP 地址的工作控制台(ssid、密码短语已经存储在 /etc /网络/接口)。就这样。目前,我已经尝试用这个来代替 /sbin/init:

#!/bin/sh
mount -o rw,remount /
mount -t proc none /proc
udevd --daemon
mkdir /run/network
ifup -a &
while [ 1 ]; do
    /sbin/getty -8 115200 tty1 vt100
done

它正在工作,因为我正在获取 IP 地址并且我可以登录但是:

  • A)在运行关机时,我得到“关机:无法关闭系统:”
  • B) control-c 在控制台中不起作用
  • C)登录后,我得到:“bash:无法设置终端进程组(-1):设备的ioctl不合适”
  • D) 登录后,我得到:“bash: no job control in this shell”

另外,我注意到所有用户空间进程都有一个“?” 运行 ps avx 时在 tty 列中。我该如何解决这些问题?我不想使用暴发户来真正控制在 PC 上启动的内容并拥有最低限度的最低要求。

4

2 回答 2

1

我最终使用了 Busybox init。伟大的小初始化...

于 2013-03-08T22:54:44.717 回答
1

您可以利用runlevels并根据您的问题runlevel 3是您想要使用的。

如果您有一些您不想启动的服务,您也可以为该运行级别关闭它们。

要启动runlevel 3,您只需将 boot 参数附加到引导加载程序中的内核:

<EXISTING_BOOT_CMD> 3

如果您的发行版使用systemd而不是sysvinit,则它们被称为targets. runlevel 3in的等价物systemd通常被命名为multi-user.target

在这种情况下,您需要传递的内核引导参数是systemd.unit=multi-user.target

<EXISTING_BOOT_CMD> systemd.unit=multi-user.target

另一种方法是,如果您不想接触引导加载程序:

systemctl enable multi-user.target
于 2013-03-08T23:26:18.423 回答