Как узнать, как была загружена система 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 не использовался при запуске.
Кажется, это не виртуальная машина. Я проверил некоторые файлы. Похоже, что он работает на голом металле. Но конфигурация минимальна: вверху отображается всего несколько процессов, а по 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: как диагностировать с чем загрузилась вещь.
В2: как его перезагрузить? В идеале использовать 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.
Спасибо.
2 ответа
Вы не можете окончательно определить это, не спросив человека, управляющего системой.
Linux не записывает, что именно передало выполнение ядру, потому что нет способа надежно определить это из самого ядра (любой используемый механизм зависит от сотрудничающего загрузчика). И на самом деле существует множество экзотических возможностей, о которых большинство людей даже не задумываются, таких как UML (ядро работает как пользовательский процесс в другой среде Linux, что-то вроде странного гибрида между виртуальной машиной и контейнером) или прямое ядро QEMU. функциональность загрузки (вместо обычной прошивки QEMU просто инициализирует виртуальную машину, а затем загружает само ядро из хост-системы и передает выполнение непосредственно ядру).
Тем не менее, учитывая, что PID 1bash
и нет fstab, это, вероятно , контейнер.
Еще пара быстрых замечаний:
-
/etc/init.d
не является достоверным признаком сисвинита. На самом деле он не имеет почти ничего общего с sysvinit, за исключением того, что он используется системами, производными от Debian, которые используют sysvinit. Он также используется некоторыми другими LSB-совместимыми системами управления сервисами, а также OpenRC и, по крайней мере, в некоторых системах systemd, он фактически включает сценарии-заглушки, которые просто вызывают соответствующиеsystemctl
команды. - «Развернуть» — это особенность Ubuntu. Версия Ubuntu Server имеет возможность установки сверхминимальной системы, в которой отсутствуют вещи, обычно необходимые только для интерактивных сеансов, как способ обеспечить более безопасную базу для систем, которые управляются с помощью таких инструментов, как Terraform, Cockpit или MAAS, а не удаленно. сеансы оболочки. Примечательно, что многие контейнеры Ubuntu настраиваются с использованием этой базы, поскольку размер имеет (большое значение) для образов контейнеров и намного меньше, чем обычная корневая файловая система Ubuntu.
cat /proc/cmdline
должен показать, как случилось, что служба инициализации не была запущена; однако это не является окончательным. Простые случаи будут иметь что-то вродеinit=/bin/bash
в командной строке ядра, но в общем случае это определить невозможно. Например, если какое-то взаимодействие произошло внутри initramfs, вы не сможете определить, какое именно, но вы все равно сможете узнать, что использовался флаг отладки, поэтому использовался нестандартный путь initramfs. Кроме того, в этом случае может оказаться полезным изучение сценария инициализации в образе initramfs.Остановите все службы, отключите все возможные файловые системы, перемонтируйте все остальное как доступное только для чтения, синхронизируйте и затем
reboot -f
; Смотри сюда.
Обратите внимание, что если bash запускается таким образом, он уже работает какroot
; вы можете сделать что-нибудь с системой даже безsudo
. Проверить сwhoami
.