Как изменить параметр командной строки ядра "root" для переключения между разделами rootfs?

В настоящее время я работаю над фреймворком для обновления программного обеспечения swupdate. В качестве схемы обновления я выбрал подход двойного копирования. Для этого я установил Ubuntu 20.04 на целевое устройство и соответственно разбил его на разделы.

  • /dev / sda1 - / загрузка
  • /dev / sda2 - /
  • /dev / sda3 - / корень2
  • /dev / sda4 - / данные

В целях тестирования я создал образ корневой файловой системы из хост-системы (/dev / sda2) с помощью команды «dd». Я назначил образу новый UUID и метку с помощью команд «tune2fs» и «e2label».

      dd if=/dev/sda2 of=rootfs.img status=progress 

e2label rootfs.img root2

e2fsck -fy rootfs.img

tune2fs -U random rootfs.img

Для загрузки системы с вторичным разделом rootfs после успешного обновления необходим механизм координации между загрузчиком и агентом обновлений. Загрузчик должен гарантировать, какой раздел rootfs (A или B) загружен.

Ubuntu использует GRUB в качестве стандартного загрузчика. GRUB предоставляет «блок среды», который можно использовать для сохранения небольшого количества состояния. (/ Boot / grub / grubenv) Агент обновления «SWUpdate» имеет обработчик загрузчика для управления этим файлом. SWupdate может добавлять в этот файл переменные среды. SWupdate может вызывать сценарии до и после установки изображений. (До и после установки) Я написал сценарий bash, который считывает текущий раздел rootfs из командной строки ядра (/ proc / cmdline) и переменные среды из блока среды GRUB (/ boot / grub / grubenv), чтобы обновить раздел rootfs после процесса обновления с помощью файла конфигурации загрузчика по умолчанию (/ etc / default / grub), с которым загружается система.

      function get_UUID_of_current_boot_device() {
for i in `cat /proc/cmdline`; do
    case "$i" in
        root=*)
            ROOT="${i#root=}"
            ;;
    esac
done

}

Насколько я прочитал, для постоянного изменения параметров командной строки ядра требуемые параметры должны быть настроены в строке GRUB_CMDLINE_LINUX_DEFAULT или в строке GRUB_CMDLINE_LINUX. В моем сценарии я изменил эту строку так, чтобы переменная $ BOOT_DEVICE_UUID всегда была разделом rootfs, который должен быть загружен после перезагрузки.

      sed -i "s/\(GRUB_CMDLINE_LINUX *= *\).*/\1\"$BOOT_DEVICE_UUID\"/" /etc/default/grub;

К сожалению, это не сработало, я подумал, что значение существующей переменной root в командной строке будет заменено значением, которое я передал. Загрузчик должен каким-то образом выбрать через переменные среды, какой раздел Rootfs, содержащий систему Linux, должен быть загружен. Не мог бы кто-нибудь объяснить мне, в чем моя ошибка, и мог бы кто-нибудь дать мне конкретный пример по этой теме?

0 ответов

Другие вопросы по тегам