我有一个远程服务器,运行 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
cat /proc/cmdline
应该可以揭示为什么没有运行 init 服务;但是,这并不是决定性的。简单情况下,init=/bin/bash
内核命令行中会出现类似情况,但一般情况下,这是无法确定的。例如,如果 initramfs 中发生了一些交互,您将无法找到是哪一个,但您仍然可以发现使用了调试标志,因此使用了非标准的 initramfs 路径。此外,在这种情况下,检查 initramfs 映像中的 init 脚本可能会有所帮助。停止所有服务,卸载所有可能的文件系统,将其他所有内容重新挂载为只读,同步,然后
reboot -f
;查看这里。
注意,如果 bash 像这样运行,它已经作为 运行root
;即使没有 ,你也可以对系统进行任何操作sudo
。使用 进行检查whoami
。