Я закомментировал строку
echo LID0 >/proc/acpi/wakeup
в /etc/rc.local
.
Я не рекомендую использовать switch_root
для этой цели. На самом деле он предназначен только для использования initramfs для переключения с initramfs на настоящий корень и ни для каких других целей. Вы можете увидеть свидетельство этой специализированной цели в следующем предупреждении на его странице руководства:
WARNING: switch_root removes recursively all files and directories on
the current root filesystem.
Это так, чтобы память, используемая initramfs (которая является tmpfs), могла быть восстановлена после того, как initramfs переключится на настоящий корень. (Между прочим, причина, по которой он встроен в switch_root
, а не в сценарии оболочки initramfs, заключается в том, что это единственная возможность сделать это: после того, как старый корень больше не используется и пока двоичный файл все еще ненадолго цепляюсь за файловый дескриптор, который ссылается на него.) Вы действительно хотите switch_root
в rm -rf
вашу старую корневую файловую систему? Я предполагаю, что, может быть, вы не возражаете, так как вы все равно планируете переделать файловую систему после этого, но это не оптимально.
Кроме того, вы неправильно используете switch_root
: аргумент после / ramroot
должен быть командой для запуска (в новом корне), а не именем каталога. Но проблема не в этом.
Из справочной страницы mount (2) неясно, что именно является источником вашей ошибки EINVAL
, но я не удивлен, увидев ее сбой: поскольку ваш вариант использования не является ожидаемым для switch_root
, вероятно, он плохо протестирован и не поддерживается.Я предполагаю, что может быть что-то в старой файловой системе, которая все еще используется (имеет открытые ссылки на нее), что мешает работе монтирования MS_MOVE
.
Вы можете попробовать следующие вещи, чтобы увидеть, будут ли они работать, но я думаю, что есть большая вероятность, что ни один из них не будет:
sshd
для вашего подключения к машине). Вы, вероятно, сможете организовать сеанс SSH на машине, которая не зависит от старой корневой файловой системы, используя различные трюки chroot
после копирования всей инфраструктуры SSH-сервера в новую корневую файловую систему, но это будет гимнастикой. exec
, чтобы вызвать switch_root
. Он разработан, чтобы вызывать именно таким образом. Лучший способ сделать то, что вы пытаетесь сделать, - это использовать консоль машины и использовать настоящие initramfs для выполнения своей работы. Это, конечно, требует, чтобы у вас был рабочий консольный доступ к машине. Загрузитесь с чем-то вроде break = bottom
в командной строке ядра, и initramfs даст вам возможность делать то, что вам нужно, при работе под ramfs. Вы захотите скопировать необходимые инструменты в initramfs, прежде чем делать это.
В конце концов, если вы можете себе это позволить, гораздо проще и безопаснее делать это с помощью системы спасения. Я могу придумать веские причины использовать вышеупомянутый трюк break
для выполнения работы под initramfs (например, у вас есть удаленный доступ к последовательной консоли, но нет возможности вставить USB-ключ с системой аварийного восстановления и нет поддержки net -загрузка спасательной системы), но это опасно, если вы сделаете ошибку (вы потеряете доступ, и вам все равно понадобится поездка в центр обработки данных).