#linux #linux-kernel #debian #u-boot #dd
#linux #linux-ядро #debian #u-boot #dd
Вопрос:
Как заменить содержимое раздела rootfs во время загрузки устройства?
Я использую pine64 (1 ГБ) с удаленной версией debian и начал писать сценарий сброса настроек, который заменит все файлы в разделе rootfs во время работы устройства? резидентный файл восстановления может быть файлом tar или img.
Я уже попробовал два подхода
- переместите раздел из образа в раздел на устройстве.
sudo dd if=pine-debian.img skip=*start of rootfs partition* seek=*start of rootfs partition* of=/dev/mmcblk0
- Извлеките сжатое содержимое в каталог / .
sudo tar -C / -zxvf pine-debian.tar.gz
После обоих подходов система может распознать любую команду, даже ls. Любая помощь будет оценена по поводу того, как решить эту проблему. как заменить содержимое fs во время работы устройства?
Ответ №1:
В идеале у вас должно быть два раздела, каждый с копией корневых файлов. Вы можете записать раздел, который в данный момент не используется dd
, а затем обновить конфигурацию загрузчика, чтобы указать на только что записанный раздел в качестве корневого. swupdate
поддерживает такой сценарий с двумя банками, но имеет встроенную поддержку только для U-Boot; если вы используете другой загрузчик, вам придется добавить скрипт для выполнения подкачки.
Если вам действительно нужно перезаписать на месте, прямая перезапись раздела невозможна, поскольку эта файловая система используется в данный момент. Распаковка также завершится неудачей, поскольку в настоящее время используются некоторые файлы, в частности libc. Вы могли бы попробовать добавить --unlink-first
опцию в команду untar, но я не уверен, что это работает.
Два других варианта:
- Вместо перезаписи полных корневых файлов используйте обновления пакетов Debian. У них есть сценарии до и после установки, чтобы сделать обновление безопасным.
- Для выполнения обновления перейдите на (временную, небольшую) корневую файловую систему в оперативной памяти. Эта корневая файловая система должна содержать только busybox и скрипт, который выполняет обновление. Вы можете либо убить все процессы, а затем выполнить pivot_root во временные корневые файлы, либо использовать
kexec --initrd=...
для загрузки в корневую файловую систему в оперативной памяти.