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