Como posso salvar variáveis de ambiente no momento da inicialização, antes que o sistema de arquivos real tenha sido montado?
Eu sei que existe, /etc/environment
mas dentro do initramfs esse arquivo ainda não está acessível. Também pensei em escrever um arquivo para armazenar o valor, mas quando esse arquivo sai do sistema, ele é substituído após a montagem do sistema de arquivos real.
Ps: Só quero armazenar a variável para depois, não para lê-la na hora do boot
EDITAR APÓS A RESPOSTA
Aproximadamente:
- Crie um módulo do kernel (encontre ajudaaquielá) nomeadomod.ko
- Certifique-se de que o módulo seja utilizável durante o tempo de inicialização (incluindo-o dentro da imagem do kernel com initramfs-tools ou encontrando-o no sistema de arquivos)
- Adicione as seguintes linhas ao seu script
Se você não incluiu o módulo na imagem do kernel
insmod /path/to/mod.ko
Mais diretamente
echo "env_var=value" > /proc/name_of_your_process
onde name_of_your_process
está o nome dado dentro do __init
seu módulo (ao fazer entry = proc_create("name_of_your_process",0777,NULL,&my_fops);
)
Mais tarde, durante o processo de inicialização em um script
cat /proc/name_of_your_process
>> env_var=value
rmmod mod.ko
Responder1
Bem, a herança de ambiente regular (basta exportá-la...) funcionaria em teoria, mas... o problema é que, seja qual for o seuinitramfsestá começando provavelmente limpará o ambiente de propósito, já que isso geralmente é feito para garantir que nada de estranho esteja acontecendo. Deixar as variáveis de ambiente sem verificação pode ser um risco à segurança.
Eu sei que existe,
/etc/environment
mas dentro do initramfs esse arquivo ainda não está acessível.
A parte divertida sobreinitramfsé que você pode fazer o que quiser. A única limitação é a sua imaginação.
Você pode tornar o arquivo totalmente acessível. Montar, modificar, desmontar. Ou se você estiver usando um sistema de arquivos tradicional - sem somas de verificação - você pode até modificá-losemmontar qualquer coisa (ou pelo menos não no modo leitura-gravação). O mesmo truque que o GRUB usa para grubenv
.
Se você não quiser mexer no sistema de arquivos ou no armazenamento físico em geral, você pode configurar um disco RAM ou tmpfs ou dispositivo de loop ou ... existem inúmeras maneiras de o initramfs deixar algo para trás (geralmente você precisa fazer um esforço para limpar).
Responder2
Quando o initramfs limpa todos os arquivos que executaswitch_rootque excluirá todos os arquivos, EXCETO as pastas: /proc, /dev, /sys e /run. Pode ser possível criar um arquivo especial em uma dessas pastas, mas há truques envolvidos.
Ver:É possível criar um diretório e arquivo dentro de/proc/sys?
Sua opção mais fácil, é claro, é apenas adicionar um script para gravar a variável no sistema de arquivos depois que o sistema de arquivos raiz for carregado, mas antes da execução do init. Isso iria para o "fundo local". Existe algum motivo para você não poder fazer isso?
Responder3
É simples. Dê uma olhada no fstab. Em seguida, monte o dispositivo raiz e grave sua variável em um arquivo no dispositivo raiz montado. Aprendi isso com o kdump.