Если используется retain_initrd, может ли этот образ cpio быть доступен из пользовательского пространства?

Вопрос или проблема

По умолчанию ядро Linux освобождает память, которая использовалась для initramfs, после завершения его распаковки.

Если используется аргумент ядра retain_initrd, то kexec --reuseinitrd становится доступным, чтобы — как это подразумевает название — повторно использовать initrd, который был загружен ранее; что означает, что он по-прежнему удерживается в памяти ядра.

Поскольку initramfs состоит из серии сжатых архивов cpio, соединенных между собой, было бы полезно иметь возможность загрузиться в тот же initramfs, который использовался ранее, но с дополнительным архивом (добавление новых или других файлов), который может быть добавлен в начало или в конец.

Существует ли какой-либо стабильный, поддерживаемый способ для привилегированного/суперпользовательского аккаунта получить доступ к архиву cpio, с которым было загружено текущее ядро, если использовался retain_initrd? Или есть ли способ добавить файл в начало или в конец этого удерживаемого содержимого, а не заменять его при использовании kexec для загрузки нового содержимого initrd?

Да, в последних версиях ядра Linux, если вы используете retain_initrd, то сырой данные будут доступны по адресу /sys/firmware/initrd.

Смотрите патч, который это реализовал:
https://lore.kernel.org/lkml/[email protected]/

Ответ или решение

Да, использование параметра ядра retain_initrd позволяет пользователю с привилегиями (например, суперпользователю) получить доступ к cpio-образу, с которым было загружено текущее ядро. В современных версиях ядра Linux данные являются доступными по пути /sys/firmware/initrd.

Что такое retain_initrd?

По умолчанию ядро Linux освобождает память, использованную для initramfs, после завершения его распаковки. Параметр retain_initrd изменяет это поведение, позволяя ядру хранить initramfs в оперативной памяти после загрузки. Это открывает возможности для повторного использования существующего initramfs с помощью команды kexec, что особенно полезно, если необходимо модифицировать или добавить новые файлы в архив.

Доступ к содержимому initramfs

С введением патча, который можно найти по следующему ссылке, содержимое initramfs, загруженного с текущим ядром, можно просматривать через файловую систему в /sys/firmware/initrd. Это физически доступный путь, который позволяет привилегированному пользователю извлекать данные из initramfs.

Модификация или добавление к содержимому

Касательно вашего вопроса о возможности добавления или изменения содержимого initramfs, используя kexec, на данный момент ядро не предоставляет стандартного механизма для добавления файлов напрямую в ранее загруженные initrd. Однако, доступный архив в /sys/firmware/initrd можно извлекать, модифицировать и затем использоваь при следующем вызове kexec, создавая новый initramfs, который будет содержать как старое, так и новое содержимое.

Заключение

В заключение, использование retain_initrd действительно открывает возможности для доступа к cpio-образу из пользователя, но для модификации содержимого необходимо извлечь архив, внести изменения, а затем загрузить его с новыми параметрами при помощи kexec. Это является полезной функцией для ситуаций, когда необходимо оперативно обновлять или изменять окружение загрузки без необходимости полной перезагрузки системы.

Оцените материал
Добавить комментарий

Капча загружается...