switch_root дает недопустимый аргумент

Я закомментировал строку

echo LID0 >/proc/acpi/wakeup

в /etc/rc.local .

2
29.01.2017, 23:35
1 ответ

Я не рекомендую использовать 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 . Он разработан, чтобы вызывать именно таким образом.
  • Используйте файловую систему tmpfs вместо ext2. Для того, что вы пытаетесь сделать, нет причин использовать файловую систему ext2 поверх ramdisk. С таким же успехом вы можете просто использовать tmpfs (как это делает initramfs).

Лучший способ сделать то, что вы пытаетесь сделать, - это использовать консоль машины и использовать настоящие initramfs для выполнения своей работы. Это, конечно, требует, чтобы у вас был рабочий консольный доступ к машине. Загрузитесь с чем-то вроде break = bottom в командной строке ядра, и initramfs даст вам возможность делать то, что вам нужно, при работе под ramfs. Вы захотите скопировать необходимые инструменты в initramfs, прежде чем делать это.

В конце концов, если вы можете себе это позволить, гораздо проще и безопаснее делать это с помощью системы спасения. Я могу придумать веские причины использовать вышеупомянутый трюк break для выполнения работы под initramfs (например, у вас есть удаленный доступ к последовательной консоли, но нет возможности вставить USB-ключ с системой аварийного восстановления и нет поддержки net -загрузка спасательной системы), но это опасно, если вы сделаете ошибку (вы потеряете доступ, и вам все равно понадобится поездка в центр обработки данных).

2
27.01.2020, 22:10

Теги

Похожие вопросы