Como posso executar um script no momento da inicialização, quando os discos são montados?

1

Nota: Não estou perguntando sobre a execução de um serviço (ou qualquer outro) quando a inicialização estiver concluída (eu sei como fazer isso).

Antecedentes

O sistema é inicializado a partir de um SDCard, que possui o sistema completo. Anexado a ele é um disco USB externo ou um SSD SATA - ou, em alguns casos, nada. Eu quero "terceirizar" algumas "coisas" para o meio externo, incluindo, e. /var/log , se esse meio estiver disponível. Se não estiver disponível, o cartão SD "interno" deve ser usado. (E se você se pergunta: sim, é um pequeno computador de placa única).

Problema

Obviamente, antes do início do processo de inicialização, a estrutura de diretório usual já deve estar presente. A montagem de sistemas de arquivos (de /etc/fstab ) é feita pelo kernel antes disso. Seguindo o exemplo de /var/log (que não é o único a ser tratado) e uma unidade externa montada como /mnt/external quando presente:

Como posso colocar /var/log (por exemplo, via symlink) em /mnt/external se a unidade estiver presente, mas colocá-la abaixo, por exemplo, /mnt/local caso contrário - de maneira segura e limpa?

    
por Izzy 18.08.2015 / 21:26

2 respostas

0

Sei que você "não está perguntando sobre a execução de um serviço", mas infelizmente a natureza da pergunta exige que você coloque seu script em um serviço e conecte-o ao local correto logo após os discos serem montados.

Concordo que você não está executando um serviço, mas o script contido nesse serviço não precisa continuar sendo executado. Tudo o que você precisa da inicialização do Linux é acionar / ligar no momento correto e sair depois de fazer a configuração correta.

Eu acredito que uma vez que você tenha superado esse obstáculo, você poderá terminar o resto, mas me avise se precisar de mais informações.

    
por 20.08.2015 / 03:16
0

O local correto para fazer isso parece ser um dos seguintes:

  • /etc/init.d/checkroot-bootclean.sh : executado quando a partição raiz ( / ) é montada, mas antes de outras partições se tornarem disponíveis. Este é provavelmente o local mais apropriado para o caso descrito, uma vez que os alvos dos links simbólicos de outros sistemas de arquivos estão no local antes de serem montados - e especialmente, por exemplo. um /var/log terceirizado estaria lá quando o sistema começar a gravar logs
  • /etc/init.d/mountall-bootclean.sh : executado quando todos os sistemas de arquivos locais são montados. É onde, por exemplo /tmp será limpo - mas aqui não tenho certeza se os registros já precisam estar acessíveis.

Idealmente, nosso roteiro seria colocado "entre os dois". E dependendo do sistema, pode haver outros lugares.

No Debian (e derivadas, como no meu caso) há /etc/init/mountall.conf onde o material de montagem está configurado:

# This helper mounts filesystems in the correct order as the devices
# and mountpoints become available.

Este chama mountall para cuidar da "ordem correta", então alguns detalhes podem ser encontrados em man mountall - mas infelizmente nem isso nem /usr/share/doc/mountall/* dá detalhes sobre como se conectar. Emitindo um find para mountall mostrou mais alguns arquivos para mim, mas nada me deu mais pistas - então, a menos que eu aprenda outra coisa, os dois locais acima seriam os "ganchos atuais".

Antes de perguntar: Não, colocar um "script de inicialização" em /etc/rc.X (ou o equivalente com o que for usado em vez do SYS-V) não funcionaria - já que a montagem é feita pelo kernel antes do início do processo init , e essas montagens precisam estar lá antes que o sistema comece a escrever, por exemplo registra no disco.

    
por 20.08.2015 / 10:21