Сохранить переменную из initramfs (во время загрузки)

Сохранить переменную из initramfs (во время загрузки)

Как сохранить переменные среды во время загрузки до того, как будет смонтирована реальная файловая система?

Я знаю, что есть, /etc/environmentно в initramfs этот файл пока недоступен. Я также думал о том, чтобы написать файл для хранения значения, но когда этот файл выходит из системы, он переопределяется после монтирования реальной файловой системы

P.S. Я просто хочу сохранить переменную на будущее, а не считывать ее во время загрузки.

ИЗМЕНИТЬ ПОСЛЕ ОТВЕТА

Примерно :

  • Создайте модуль ядра (найти помощьздесьитам) названныймод.ко
  • Убедитесь, что модуль можно использовать во время загрузки (включив его в образ ядра с помощью initramfs-tools или найдя его в файловой системе)
  • Добавьте следующие строки в ваш скрипт

Если вы не включили модуль в образ ядра

insmod /path/to/mod.ko

Иначе напрямую

echo "env_var=value" > /proc/name_of_your_process

где name_of_your_processуказано имя внутри __initвашего модуля (при выполнении entry = proc_create("name_of_your_process",0777,NULL,&my_fops);)

Затем позже, во время процесса запуска в скрипте

cat /proc/name_of_your_process
>> env_var=value
rmmod mod.ko

решение1

Ну, обычное наследование окружения (просто экспортируйте его...) работало бы в теории, но... проблема в том, что независимо от вашегоinitramfsзапускается, вероятно, очистит среду намеренно, так как это обычно делается, чтобы убедиться, что не происходит ничего странного. Оставить переменные среды без проверки может быть угрозой безопасности.

Я знаю, что он есть, /etc/environmentно в initramfs этот файл пока недоступен.

Самое интересное оinitramfsв том, что вы можете делать все, что захотите. Единственное ограничение — ваше воображение.

Вы можете полностью сделать файл доступным. Монтировать, изменять, размонтировать. Или, если вы используете традиционную файловую систему - без контрольных сумм - вы можете даже изменить егобезмонтируя что угодно (или по крайней мере не в режиме чтения-записи). Тот же трюк GRUB использует для grubenv.

Если вы не хотите возиться с файловой системой или физическим хранилищем в целом, вы можете настроить RAM-диск, tmpfs или устройство loop или... существует бесчисленное множество способов, которыми initramfs может что-то оставить после себя (обычно вам придется приложить усилия, чтобы это очистить).

решение2

Когда initramfs очищает все файлы, он запускаетсяswitch_rootчто удалит все файлы, КРОМЕ папок: /proc, /dev, /sys и /run. Возможно, удастся создать специальный файл в одной из этих папок, но тут есть свои хитрости.

Видеть:Можно ли создать каталог и файл внутри /proc/sys?

Самый простой вариант, конечно, просто добавить скрипт для записи переменной в файловую систему после загрузки корневой файловой системы, но до запуска init. Это будет в "локальный-дно"папка. Есть ли причина, по которой вы не можете этого сделать?

решение3

Это просто. Взгляните на fstab. Затем смонтируйте корневое устройство и запишите переменную в файл на смонтированном корневом устройстве. Я узнал об этом из kdump.

Связанный контент