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

Acabo de tener problemas para citar y ejecutar la siguiente línea de comando en la clave ExecStartde un archivo de unidad de servicio:

IFS=$'\n'; f=($(ls $HOME/bk.d/DuckieTV*.backup | tail -n +2)); echo "${f[@]}"

Lo citaré usando las reglas de cotización de systemd y luego explicaré lo que aprendí en el proceso. Parece complicado porque esperamos que siga las reglas de cotización de los shells POSIX, pero de hecho es aún más simple. Aquí está la directiva ExecStart, correctamente citada

ExecStart=/bin/bash -c 'IFS=$$\'\\n\'; f=($$(ls ${HOME}/bk.d/DuckieTV*.backup | tail -n +2)); echo \"$${f[@]}\"'

o

ExecStart=/bin/bash -c "IFS=$$\'\\n\'; f=($$(ls ${HOME}/bk.d/DuckieTV*.backup | tail -n +2)); echo \"$${f[@]}\""

Entonces, las reglas de cotización:

  1. Encierre la cadena que se tratará como un único argumento, ya sea entre comillas simples(' ')o comillas dobles(" "). Se tratan de la misma manera, no importa cuál elija, siempre que la cotización de cierre sea la misma que la cotización de apertura
  2. Escanea la cadena de izquierda a derecha, reemplazando ' con \' , " con \" y $ con $$

Si desea que systemd realice la sustitución de variables, no incluya $ , pero systemd no trata $var y ${var} como el mismo. Ambos se reemplazan por el valor de entorno de var , pero la división de palabras será diferente en cada caso :con $var , después de reemplazar el valor de var , las palabras se dividirán en espacios en blanco, mientras que con ${var} no habrá división de palabras. Efectivamente, systemd trata $var como lo haría un shell POSIX, pero trata ${var} como un shell POSIX trataría "$var" .

1
31.05.2019, 23:22
2 ответа

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

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

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

0
28.01.2020, 00:10

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

0
16.10.2020, 16:16

Теги

Похожие вопросы