查找 Linux 系统是如何启动的

0x1*_*111 13 grub boot sysv systemd reboot

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

显然,它不使用 systemd :

PID 1 进程是bash。

ps -p 1 -o comm=
bash
Run Code Online (Sandbox Code Playgroud)

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

grub-install --version
-bash: grub-install: command not found
Run Code Online (Sandbox Code Playgroud)

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

看起来不是虚拟机。我检查了一些文件。它似乎在裸机上运行。但配置很小:顶部仅显示少数进程,并且在 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
Run Code Online (Sandbox Code Playgroud)

但:

runlevel
unknown
Run Code Online (Sandbox Code Playgroud)

并且 /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.
Run Code Online (Sandbox Code Playgroud)
sudo init 6
Couldn't find an alternative telinit implementation to spawn.
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)

谢谢。

sym*_*ean 8

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

最有可能是一个容器。

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

但你不会告诉我们是哪些。我很喜欢猜谜游戏。

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

从软件升级裸机很困难。

我倾向于认为使用了 SysV

SysV 上的 pid 1 是 init。

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

如何重新启动它?

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


Aus*_*arn 8

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

\n

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

\n

综上所述,鉴于 PID 1 是bash并且没有 fstab,它\xe2\x80\x99可能是一个容器。

\n
\n

其他一些快速说明:

\n
    \n
  • /etc/init.d不能可靠地指示 sysvinit。它实际上与 sysvinit 几乎没有任何关系,除了碰巧被使用 sysvinit 的 Debian 派生系统使用之外。它\xe2\x80\x99 也被其他一些符合 LSB 的服务管理系统和 OpenRC 使用,并且至少在某些 systemd 系统上它实际上包含仅调用适当systemctl命令的存根脚本。
  • \n
  • \xe2\x80\x98unminimize\xe2\x80\x99 是 Ubuntu 的东西。Ubuntu Server 版本可以选择安装一个超小型系统,该系统缺少通常只需要交互式会话所需的东西,以此为由 Terraform、Cockpit 或 MAAS 等工具(而不是通过远程)管理的系统提供更安全的基础。外壳会话。值得注意的是,许多 Ubuntu 容器都是使用这个基础来设置的,因为大小对于容器映像来说很重要,而且它\xe2\x80\x99s比正常的 Ubuntu 根文件系统小得多
  • \n
\n


Nik*_*nov 4

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

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

请注意,如果 bash 像这样运行,那么它已经作为root;运行了。即使没有 .您也可以对系统执行任何操作sudo。检查与whoami.