查找 Linux 系统的启动方式

查找 Linux 系统的启动方式

我有一个远程服务器,运行 Linux 5.19.0-41-generic x86_64,我正在尝试找出它是如何启动的。

显然,它不使用 systemd :

PID 1 进程是 bash。

ps -p 1 -o comm=
bash

显然,没有 GRUB,至少 /usr/sbin 中没有,并且

grub-install --version
-bash: grub-install: command not found

我猜测,启动时没有使用 GRUB。

它似乎不是虚拟机。我检查了一些文件。它似乎在裸机上运行。但配置很少:top 只显示少数进程,如果我需要更全面的功能,ssh 会提示我“取消最小化”。

我倾向于认为使用了 SysV:

ls /etc/init.d
apport          bluetooth  hwclock.sh  network-manager  procps                       rsync  udev
avahi-daemon    dbus       iwpmd       nfs-common       pulseaudio-enable-autospawn  saned  unattended-upgrades
binfmt-support  gdm3       kmod        pppd-dns         rpcbind                      ssh    x11-common

但:

runlevel
unknown

并且 /etc/inittab 不存在。

Q1:如何诊断启动的东西是什么。

Q2:如何重启?理想情况下,使用 systemd。

sudo reboot
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Failed to talk to init daemon.
sudo init 6
Couldn't find an alternative telinit implementation to spawn.
sudo shutdown -r now
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Failed to talk to init daemon.

谢谢。

答案1

PID 1 进程是 bash...没有 GRUB

最有可能是一个容器。

看起来不是虚拟机。我查了一些文件

但你不会告诉我们是哪一个。我确实喜欢猜谜游戏。

如果我需要更全面的功能,在 ssh 上系统会提示我“取消最小化”

从软件升级裸机很困难。

我倾向于认为 SysV 被使用

SysV 上的 pid 1 是 init。

您可以通过在 /proc/self/mountinfo 中查找“lxc”或“docker”来检查您是否在容器中运行

如何重启它?

如果shutdown -r不起作用,请与构建主机的人联系。

答案2

如果不询问管理系统的人员,您就无法最终确定这一点。

Linux 不会记录究竟是什么将执行权移交给了内核,因为没有办法从内核本身可靠地确定这一点(可以使用的任何机制都依赖于引导加载程序的配合)。实际上,还有一大堆大多数人从未想过的奇特可能性,例如 UML(内核在另一个 Linux 环境中作为用户进程运行,有点像虚拟机和容器之间的奇怪混合体)或 QEMU 的直接内核启动功能(QEMU 不是使用常规固件,而是初始化虚拟机,然后从主机系统加载内核本身,并将执行权直接移交给内核)。

尽管如此,假设 PID 1 是bash,并且没有 fstab,那么大概一个容器。


其他几点说明:

  • /etc/init.d并不能可靠地表明 sysvinit。它实际上几乎与 sysvinit 无关除了碰巧被使用 sysvinit 的 Debian 派生系统使用之外。它还被其他一些符合 LSB 的服务管理系统和 OpenRC 使用,并且至少在某些 systemd 系统上它实际上包含仅调用相应命令的存根脚本systemctl
  • “取消最小化”是 Ubuntu 独有的功能。Ubuntu Server 版本可以选择安装一个极简系统,该系统缺少通常仅用于交互式会话所需的东西,以便为通过 Terraform、Cockpit 或 MAAS 等工具而不是通过远程 shell 会话管理的系统提供更安全的基础。值得注意的是,许多 Ubuntu 容器都是使用此基础设置的,因为大小对于容器映像非常重要,而且它很多比一般的 Ubuntu 根文件系统要小。

答案3

  1. cat /proc/cmdline应该可以揭示为什么没有运行 init 服务;但是,这并不是决定性的。简单情况下,init=/bin/bash内核命令行中会出现类似情况,但一般情况下,这是无法确定的。例如,如果 initramfs 中发生了一些交互,您将无法找到是哪一个,但您仍然可以发现使用了调试标志,因此使用了非标准的 initramfs 路径。此外,在这种情况下,检查 initramfs 映像中的 init 脚本可能会有所帮助。

  2. 停止所有服务,卸载所有可能的文件系统,将其他所有内容重新挂载为只读,同步,然后reboot -f;查看这里

注意,如果 bash 像这样运行,它已经作为 运行root;即使没有 ,你也可以对系统进行任何操作sudo。使用 进行检查whoami

相关内容