Вопрос или проблема
Предположим, что у вас есть только удаленный доступ (SSH) к встроенному устройству на Linux, и цель — обновить ОС до новой версии. Устройство имеет только один раздел, но используется явно меньше 50% пространства, и у устройства есть около 256 МБ ОЗУ для работы. Как это можно сделать? Я думаю, что решение, вероятно, будет включать tempfs и pivot_root.
Вот моя смутная идея о том, как это сделать:
- загрузить новую структуру rootfs в каталог на устройстве
- смонтировать tempfs в ОЗУ и скопировать необходимые системные ресурсы, чтобы система продолжала работать, пока идет работа над rootfs
- сменить root на tempfs с помощью pivot_root или chroot или обоих, не совсем уверен
- скопировать структуру rootfs из загруженного каталога, чтобы заменить старую
- перезагрузиться в новую версию ОС
Теперь я думаю, что это звучит слишком просто, чтобы действительно работать. Можете ли вы, пожалуйста, указать ошибки в моем плане и сказать, что я упустил, или, еще лучше, дать подсказки, как сделать это правильно? У кого-нибудь есть опыт в таком деле?
chroot изменит только корневую директорию текущего процесса, поэтому изменение остальной части раздела, скорее всего, приведет к завершению работы системы (а следовательно, и вашего текущего процесса).
То же самое справедливо для pivot_root:
pivot_root перемещает корневую файловую систему текущего процесса в директорию put_old и делает new_root новой корневой файловой системой.
Когда мне нужно было обновить корневую файловую систему Raspberry Pi, я подключил к ней USB-накопитель и загрузился с него. Временная файловая система работала нормально, и я мог изменить “реальную” корневую файловую систему, не удаляя SD-карту. (Raspberry Pi было трудно достать, но я мог вставить USB-накопитель).
Не могу придумать подходящего способа “загрузиться” только в RAM-диск, так как инициальный запуск системы все равно идет с носителя. Вспомните все Live CD Linux, которые требуют постоянно вставленного CD-диска, хотя большая часть системы уже находится в ОЗУ.
Если вы можете перепартицировать вашу файловую систему, вы могли бы установить “новую” операционную систему на второй раздел и отметить его как активный и загрузочный.
- Перепартицировать файловую систему для второго раздела (для новой ОС)
- Отметить новый раздел как активный и загрузочный
- Форматировать новый раздел
- Установить новую ОС (или временную) на второй раздел
- Обновить загрузчик (grub, LILO, …) для загрузки с нового (второго) раздела
- перезагрузить
- Удалить содержимое первого раздела
- Установить новую ОС на первый раздел
- Обновить загрузчик (grub, LILO, …) для загрузки с первого раздела
- перезагрузить
- Удалить содержимое второго раздела
- Удалить второй раздел
- Изменить размер первого раздела на полную емкость
Изменять размер во время работы сложно, но этот сайт утверждает, что это может быть возможно. Он утверждал (в 2007 году!), что для этой операции ему потребовалось 2 ГБ ОЗУ…
Ответ или решение
Обновление корневой файловой системы (FS) на встраиваемом Linux-устройстве с удаленным доступом — это серьёзная задача, требующая тщательного планирования и понимания процесса. В данной ситуации, когда у устройства всего один раздел, ограниченные ресурсы RAM (256 МБ) и нет возможности физического доступа, необходимо подобрать подходящую стратегию.
Анализ и подходы
Ваша концепция использования pivot_root
и chroot
для изоляции системных процессов на временной файловой системе, вероятно, не приведет к желаемому результату из-за ограничений этих инструментов. Оба утилиты изменяют корневую файловую систему только для текущего процесса и его дочерних процессов, что может вызвать нестабильность или крах системы при замене корневой FS.
Возможность использования tempfs
Tempfs может помочь в создании временной среды. Однако, использование только RAM для хранения всех необходимых компонентов может быть ограничено объемом доступной памяти (256 МБ).
Подход с USB-накопителем
Один из участников упомянул успешное использование USB-накопителя для подобной задачи. Это разумный подход, позволяющий загрузиться с временной среды и провести обновление без вмешательства в текущую корневую FS.
Предложение по шагам
-
Подготовка внешнего носителя:
- Подготовьте USB-накопитель (или другой внешний носитель) с минимальной средой Linux, которая поддерживает подключение и управление разделами. Скопируйте файлы новой операционной системы на этот носитель.
-
Подключение USB-устройства:
- Подключите USB-устройство к встраиваемому устройству и убедитесь, что BIOS/UEFI или загрузчик поддерживают загрузку с внешнего носителя.
-
Обновление системы через внешнюю загрузку:
- Загрузитесь с USB-устройства.
- Переформатируйте и перепишите корневую файловую систему на имеющемся внутреннем накопителе.
- Обновите bootloader для загрузки новой операционной системы.
-
Реструктуризация разделов (если необходимо):
- Если структура разделов позволяет, вы можете создать второй временный раздел для новой операционной системы, чтобы минимизировать простои.
-
Устранение временных компонентов:
- После успешного обновления и загрузки с основной файловой системы, удалите временные файлы и ОС с внешнего устройства.
Важные моменты
- Резервное копирование: Перед выполнением любых операций с файловой системой, крайне важно создать резервные копии всех критичных данных.
- Риск и мониторинг: Будьте готовы к возможным сбоям и имейте план аварийного восстановления в случае проблем при обновлении.
Заключение
Ваша идея хороша, но требует некоторых доработок для соответствия ограничениям встроенной системы. Использование дополнительного носителя для временной загрузки — это наилучший способ минимизации рисков и обеспечения стабильности при обновлении корневой файловой системы. Обеспечение должной документированности процесса и тестирования на подобной среде также будет содействовать успешному обновлению.