После некоторых последних обновлений мой компьютер больше не загружается! Вот что я мог определить:
- Это очень недавний компьютер, предоставленный мне корпоративными ИТ. Он имеет новейший процессор 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 проблемы загрузки советы .