Como as pastas criadas em / var / são executadas em cada reinicialização

60

No ubuntus recente (especificamente, o que mais me interessa é o 12.04) /var/runé o tmpfs, e, portanto, presumo que ele comece vazio a cada reinicialização.

No entanto, vejo algumas pastas, como /var/run/mysqldmuitas outras. Como essas pastas foram criadas em cada reinicialização? Existe alguma pasta de modelo que copiou para /var/run/(e se sim, qual script faz isso), ou cada pasta mkdiré editada separadamente, ou o quê?

EDIT:
Por favor, não responda que /var/runé persistente ou que /runé persistente. Porque não é.

Mesmo que seja assim no seu sistema, não é assim no dia 12.04.

Sandman4
fonte
Hmm, então eu vou ter 50 representantes. desperdiçado em uma das duas respostas que são ambos, obviamente, claramente errado ....
Sandman4
Alguém, por favor responda qualquer coisa sensata e você começa 50 rep :)
Sandman4

Respostas:

82

(Obrigado a @ Zulakis e uma resposta no Serverfault por apontar que essa resposta não acompanhou o desenvolvimento contínuo do Ubuntu.)

Com a adoção systemdda partir de 15,04 , existe agora um mecanismo centralizado para a criação de arquivos e diretórios temporários como estes. Um serviço que pretendam utilizar este método pode remover mkdircomandos em seu próprio script de inicialização e, em vez colocar um .confarquivo em /etc/tmpfiles.d, /run/tmpfiles.dou /usr/lib/tmpfiles.d, com os serviços do Ubuntu parecendo preferir a última opção. Por exemplo, meu sistema agora possui:

$ egrep -r /var/run /usr/lib/tmpfiles.d

/usr/lib/tmpfiles.d/var.conf:L /var/run - - - - ../run
/usr/lib/tmpfiles.d/sudo.conf:d /var/run/sudo 0711 root root
/usr/lib/tmpfiles.d/sudo.conf:D /var/run/sudo/ts 0700 root root
/usr/lib/tmpfiles.d/postgresql.conf:d /var/run/postgresql 2775 postgres postgres - -
/usr/lib/tmpfiles.d/sshd.conf:d /var/run/sshd 0755 root root
/usr/lib/tmpfiles.d/screen-cleanup.conf:d /var/run/screen 0775 root utmp

Os dmeios para criar um diretório, se ele ainda não existir, após esse é o caminho, e o restante são as permissões, o usuário e o grupo. Esses diretórios serão criados independentemente de o serviço correspondente ser iniciado.

Para documentação completa, consulte man tmpfiles.d.


RESPOSTA ANTIGA PRÉ-SISTEMA:

Parece que eles são criados dinamicamente por serviços individuais quando eles iniciam:

$ sudo egrep -r 'mkdir.*/var/run' /etc

/etc/init.d/ssh:        mkdir /var/run/sshd
/etc/init.d/bind9:      mkdir -p /var/run/named
/etc/init.d/timidity:    mkdir -p /var/run/timidity
/etc/init.d/bzflag:                mkdir -p /var/run/bzflag
/etc/init.d/dns-clean:mkdir /var/run/pppconfig >/dev/null 2>&1 || true
/etc/init/winbind.conf: mkdir -p /var/run/samba/winbindd_privileged
/etc/init/dbus.conf:    mkdir -p /var/run/dbus
/etc/init/ssh.conf:    mkdir -p -m0755 /var/run/sshd
/etc/init/libvirt-bin.conf:     mkdir -p /var/run/libvirt
/etc/init/cups.conf:    mkdir -p /var/run/cups/certs

Eu acredito que este é o único que lida com o mysqld:

[ -d /var/run/mysqld ] || install -m 755 -o mysql -g root -d /var/run/mysqld
/lib/init/apparmor-profile-load usr.sbin.mysqld

man install diz que o formulário -d "criará todos os componentes dos diretórios especificados".

Paulo
fonte
1
Isso nem sempre parece ser o caso: serverfault.com/questions/824393/…
Zulakis
Obrigado, @Zulakis. Fiz algumas edições e gostaria de saber se elas estão corretas com base na sua experiência com esse recurso.
Paul
1
Parece bom para mim! Obrigado por atualizar sua resposta :)
Zulakis 5/17
1
Voto positivo para o comando egrep -r. Procurando uma pesquisa na pesquisa de arquivos! :-)
Nick Woodhams
5

A nova /runpasta montada no tmpfs permite que programas como o udev, lvm e mdadm mantenham os dados de tempo de execução do initrd até o desligamento.

/var é um diretório padrão de qualquer sistema Linux / UNIX - significa "variável" e é um local em que muitos logs, alterações, mas também programam arquivos de configurações variáveis ​​e até mesmo alguns bancos de dados de configuração do sistema.

A maioria das coisas /vardeve ser devidamente eliminada e regulada pelo sistema. Seus arquivos de troca por memória virtual também vivem, /varentão não mexa com isso. /var/runtambém possui muitas informações de status e parâmetros de daemans de processo em execução ativa.

Este diretório contém dados de informações do sistema que descrevem o sistema desde que ele foi inicializado. Os arquivos nesse diretório devem ser limpos (removidos ou truncados, conforme apropriado) no início do processo de inicialização. Os programas podem ter um subdiretório de /var/run; isso é recomendado para programas que usam mais de um arquivo de tempo de execução.

Bem, uma vez que /var/runé montado como tmpfs. Isso significa que está totalmente vazio quando a máquina é inicializada e deve ser assim para impedir que coisas como daemons não sejam iniciadas por causa de um arquivo PID restante.

Os scripts de inicialização geralmente criam os diretórios necessários antes de usá-los. Se você deseja armazenar um arquivo PID, coloque-o /var/rundiretamente ou crie um diretório antes de criar o arquivo PID. Não é um local para armazenar dados que precisam permanecer lá durante as reinicializações.

Fontes: Nome do caminho e Linux System Administrator's Guide

Mitch
fonte
5

Para qualquer um que se deparar com esse segmento, porque você está procurando uma solução para configurar um aplicativo para que ele crie o diretório /var/runpara que ele possa armazenar seu arquivo meia ou pid ou qualquer outra coisa ... aqui está um exemplo. Me deparei com esse tópico porque queria armazenar o arquivo de meias do MySQL /var/run/mysqld. Então, depois que me deparei com esse tópico, comecei a procurar nos /etc/initarquivos exemplos. O dbus foi bom. E, eu vim com esta configuração de inicialização do mysql:

start on runlevel [2345] 
stop on runlevel [!2345] 
expect daemon 

pre-start script 
    mkdir -p -m0755 /var/run/mysqld 
    chown mysql:mysql /var/run/mysqld 
end script 

exec /etc/init.d/mysql start 
pre-stop exec /etc/init.d/mysql stop 

A parte do script de pré-inicialização fez o truque.

dcarrith
fonte
2

No entanto, vejo algumas pastas, como / var / run / mysqld e várias outras. Como essas pastas foram criadas em cada reinicialização? Existe alguma pasta de modelo que copiou para / var / run / (e, se for, qual script faz isso) ou cada pasta é separada separadamente ou o quê?

Conforme definido no Padrão de Hierarquia de Arquivos, o /var/runou /runé usado para armazenar dados voláteis de tempo de execução.

Todas as pastas e arquivos criados lá são gerenciados pelo respectivo programa que criou os arquivos. Não existe uma pasta de modelo copiada; todo programa pode usar essa pasta para armazenar informações voláteis. Os dados armazenados são perdidos quando o sistema é reiniciado.

Uma coisa comum para usar a /runpasta é armazenar os piddaemons em execução, arquivos de marcadores que contêm o número do processo. Eles são usados ​​principalmente para os scripts de início / parada que você pode encontrar, por exemplo, em/etc/init.d/

Espero que isso tenha esclarecido as coisas!

br

ortang
fonte
1

Sua suposição não está absolutamente correta. O local da /varpasta é negociável - ou seja, você pode usar uma partição ou volume alternativo para localizar a /varpasta. Independentemente de onde a /varpasta está localizada, a /var/runpasta é um link simbólico para a /runpasta e seu conteúdo permanece após a reinicialização, embora muitos arquivos /runsejam gerados ou modificados na inicialização pelos serviços iniciados durante a inicialização. Portanto, são os serviços - como mysqld- que solicitam o carregamento de arquivos no /var/rundiretório e são configurados para criar subdiretórios se eles não existirem atualmente.

douggro
fonte
1
Criei algumas pastas em / var / run e elas desapareceram após a reinicialização. (especificamente em 12.04)
Sandman4
Também vemos aqui que / var / run é realmente tmpfs askubuntu.com/questions/57297/...
Sandman4
-2

douggro está absolutamente certo, / var / run é montado como tmpfs e / var / run é um link simbólico para / run que é persistente durante as reinicializações; portanto, qualquer coisa que entre / execute também aparecerá em (e permanecerá) / var / corre.

Portanto, qualquer serviço de inicialização como o mysqld, que é um daemon iniciado no momento da inicialização, que cria arquivos em / run, também terá arquivos visíveis em / var / run (link simbólico para / run remember). Se você deseja criar um arquivo que persistirá durante uma reinicialização em / var / run, crie-o em / run e, em seguida, reinicie.

espero que isso responda sua pergunta.

nisshh
fonte
3
Você está enganado ou está usando configurações não padrão. Verifique você mesmo. montar | grep / run .... tmpfs em / tmpfs digitar run
Steven K
1
"Se você deseja criar um arquivo que persistirá durante uma reinicialização em / var / run, crie-o em / run e depois reinicie." Isso não é correto. tmpfsé volátil e as mudanças são perdidas.
ortang