Вопрос или проблема
По умолчанию ядро 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
. Это является полезной функцией для ситуаций, когда необходимо оперативно обновлять или изменять окружение загрузки без необходимости полной перезагрузки системы.