Проблема
После очередного обновления пакетов:
sudo apt-get update && sudo apt-get upgrade
Ubuntu 14.04, корневой раздел которой был на lvm, перестала загружаться и стала выпадать в initramfs shell с сообщением Gave up waiting for root device.
На первый взгляд все просто.
Корневая файловая система работает на томе lvm и почему-то при старте не активируются тома lvm. Однако, кроме того, в консоли initramfs не вводятся символы, не виден мигающий курсор.
Опытным путем установлено, что причина неработоспособности клавиатуры в initramfs shell не в ядре (я пробывал установить и более новые и более старые версии с помощью chroot в LiveCD), не в клавиатуре (она работает в LiveCD).
Временно починить ввод в initramfs shell удалось с помощью добавления к строке запуска ядра параметра console. Для этого в меню grub идем в Advanced Options, выбираем строку с нужным ядром, жмем e и в конце строки linux дописываем:
console tty=1
или
console tty=2
И нажимаем F10.
В результате удалось загрузиться в initramfs shell и там появился курсор, однако вводимве символы были не видны.
Ну да ладно. Чтобы загрузить систему я выполнил:
lvm vgchange -ay
системы сказала что 2 тома Activated. Теперь делаем:
exit
И система грузится. Тепеь надо починить все как было. Я предположил, что дело в поврежденных скриптах initramfs и для тогт чтобы все поправить надо переустановить initramfs-tools, однако в моем случае переустановить его оказалось не так-то просто. Выполнение команды
sudo apt-get install --reinstall
и последующее пересоздание initrd результата не принесли. Удалить оказалось тоже невозможно, так как от этого пакета зависят многие другие (хз зачем он им). Для того чтобы точно переустановить initramfs-tools я отредактировал файлик /var/lib/dpkg/status. В нем нужно найти и удалить секцию пакета initramfs-tools (в результате apt будет думать, что пакета нет) а потом выполнить:
sudo apt-get -f install
При установке будут задаваться вопросы о замене текущий файликов, где я везде нажимал Y. Потом делаем:
update-initramfs -c -k all
и
reboot
Наконец-то система стала загружаться в нормальный initramfs shell, без необходимости указания console=tty1.
Дальнейшее гугление подсказало, что нужно создать или починить скрипт /usr/share/initramfs-tools/scripts/local-top/lvm2, который должен подготовить тома lvm к монтированию.
На моей системе его просто не было, хотя до определенного момента все работало.
Я создал этот скрипт и написал туда вот что:
#!/bin/sh lvm vgchange -ay
После этого собрал initramfs командой:
sudo update-initramfs -c -k all
И перезагрузился. Система загрузилась нормально. Дальнейшее выяснение привело меня сюда: https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1573982 И там написано, что причина такого глюка в обновлении lvm2.
lvm2 (2.02.133-1ubuntu8) xenial; urgency=medium * Drop debian/85-lvm2.rules. This is redundant now, VGs are already auto-assembled via lvmetad and 69-lvm-metad.rules. This gets rid of using watershed, which causes deadlocks due to blocking udev rule processing. (LP: #1560710) * debian/rules: Put back initramfs-tools script to ensure that the root and resume devices are activated (lvmetad is not yet running in the initrd). * debian/rules: Put back activation systemd generator, to assemble LVs in case the admin disabled lvmetad. * Make debian/initramfs-tools/lvm2/scripts/init-premount/lvm2 executable and remove spurious chmod +x Ubuntu delta in debian/rules. -- Martin Pitt <email address hidden> Wed, 30 Mar 2016 10:56:49 +0200
Discussion