После некоторых последних обновлений мой компьютер больше не загружается! Вот что я мог определить:
- Это очень недавний компьютер, предоставленный мне корпоративными ИТ. Он имеет новейший процессор Intel (поколение Skylake).
- На компьютере работает Ubuntu 16.04.
- Последний раз компьютер загружался правильно в марте. Вероятно, проблема связана с обновлением программного обеспечения или аппаратной ошибкой.
- У меня есть другой компьютер под управлением 16.04 с почти таким же установленным программным обеспечением (я использовал
apt-clone
), и он работает просто отлично. У него другое оборудование (также amd64, но другой процессор, другой графический процессор и т. Д.). - Ядро запускается, initrd работает правильно. Когда я загружаюсь с заставкой в графическом режиме, меня просят ввести пароль для моего тома dm-crypt, и последнее, что я вижу, это то, что он успешно смонтирован.
- Зависание происходит до того, как я получаю приглашение для входа в систему. Когда компьютер зависает, это трудно повесить. Даже Alt+ SysRqне отвечает. Процессор явно привязан на 100%, так как вентиляторы включаются на полную мощность.
- У меня все еще есть ядро, которое я запускал до перезагрузки. Когда я выбираю это ядро в меню Grub, я получаю такую же блокировку. Похоже, что это уже существующая ошибка в ядре, которая вызывается чем-то другим - но что?
- Если я отключаю заставку (удаляю
splash
изlinux
командной строки в Grub), я вижу, что запускается несколько служб, затем он блокируется. Я могу получить корневую оболочку, добавив
init=/bin/sh
вlinux
командную строку в Grub. Я могу даже пойти дальше, добавивsystemd.unit=basic.target systemd.shell
Это запускает ряд служб и запускает корневую оболочку на tty9.
- Если я запускаю
systemctl start multi-user.target
из этой корневой оболочки, компьютер зависает. Вероятно, проблема вызвана одной из этих служб. - Я побежал,
systemctl list-dependencies multi-user.target
чтобы посмотреть, какие услуги начинаются. Я вручную запустил перечисленные зависимости по очереди, и все началось просто отлично.
Таким образом, это похоже на аппаратную ошибку (поскольку она возникает на одном компьютере, но не на другом), которая вызывается каким-либо программным обеспечением. Но какое программное обеспечение? Поскольку компьютер зависает так сильно, я не могу получить журналы. Я даже не могу получить какой-либо полезный вывод на консоль.
Полезные методы отладки:
- Alt+ SysRq: магический ключ SysRq , позволяющий выполнять такие действия, как экстренная перезагрузка. Он обращается к ядру на очень низком уровне, поэтому он работает во всех случаях, кроме худших сбоев. В моем случае Alt+ SysRqне отвечает, что показывает, насколько глубоко происходит сбой.
- Чтобы изменить параметры загрузки, нажмите и удерживайте Shiftнесколько секунд после включения питания. Вам нужно нажать ее после того, как BIOS инициализирует клавиатуру, но до загрузки операционной системы. Это заставляет меню Grub появляться.
- В меню Grub нажмите, eчтобы отредактировать командную строку для пункта меню. Чтобы изменить параметры загрузки Linux, перейдите к строке, начинающейся с
linux
. В современной Ubuntu вы найдете старые ядра в разделе «Дополнительные параметры для Ubuntu». После внесения необходимых изменений в командную строку нажмите Ctrl+ xдля загрузки. Любые изменения, которые вы делаете здесь, предназначены только для этой загрузки, они не сохраняются на диск. - Некоторые полезные опции в
linux
командной строке:quiet nosplash
скрывает почти все загрузочные сообщения. Удалите их, чтобы получать сообщения на консоли во время загрузки, что необходимо для возможности диагностики проблем.recovery
дает вам корневую оболочку практически без служб. Вам нужно будет знать пароль пользователя root. Пункт меню «режим восстановления» использует это.init=/bin/sh
дает вам корневую оболочку без каких-либо служб. Чтобы возобновить нормальную загрузку, запуститеexec init
. На этом этапе вы можете передать параметры systemd, например,exec init --unit=basic.target
запустить init и несколько служб (обратите внимание, что это не запускает какой-либо способ входа в систему, поэтому лучше запустить оболочку на другой консоли). Обратите внимание, что корневая файловая система монтируется только для чтения; бежать,mount -o remount,rw /
чтобы иметь возможность писать в него.systemd.unit=basic.target
запускает очень простой набор услуг. Обратите внимание, что это не включает в себя любой способ войти! Вы можете сделать это по умолчанию, запустивsystemctl set-default basic.target
в корневом запросе. Чтобы восстановить исходную цель по умолчанию, запуститеsystemctl set-default graphical.target
(илиsystemctl set-default multi-user.target
для сервера без графического интерфейса).systemd.debug-shell
запускает корневую оболочку на tty9. Вы можете включить это для каждой загрузки, запустивsystemctl enable debug-shell
в приглашении root. Не забудьте отключить это после того, как вы решили проблему сsystemctl disable debug-shell
. Нажмите Alt+, F9чтобы переключиться на tty9.- Смотрите также Fedora Systemd советы , Arch Linux проблемы загрузки советы .