Por que a minha alteração na configuração do blockdev não é executada a partir do rc.local na reinicialização?

1

Eu sou (provavelmente obviamente) um usuário de Linux relativamente novo, então eu já estou me preparando para a enxurrada de "por que você não está fazendo dessa maneira ..." comentários. Eu adoraria ouvi-los ... mas eu também realmente gostaria de entender fundamentalmente por que isso não está funcionando como está.

Os detalhes:

  • Estou executando o CentOS 7 +
  • Estou tentando modificar os valores de leitura antecipada em minhas configurações de blockdev (para um servidor de banco de dados)
  • Consigo implementar as alterações a partir da linha cmd, mas não consigo persistir após a reinicialização.
  • Sim, eu tenho reinicializado. Muito.
  • Em uma tentativa de persistir as alterações, modifiquei o arquivo rc.local.
  • O arquivo rc.local está sendo implementado assim:

    #!/bin/bash
    touch /var/lock/subsys/local
    /sbin/blockdev --setra 128 /dev/sda
    /sbin/blockdev --setra 128 /dev/dm-1
    /sbin/blockdev --setra 128 /dev/dm-0
    
por DCaugs 04.12.2015 / 21:35

2 respostas

4

Esqueça sobre rc.local .

Você está usando o CentOS 7. Você tem o systemd. /etc/rc.local é um mecanismo de compatibilidade com versões anteriores no systemd, porque é um mecanismo de compatibilidade com versões anteriores para um mecanismo que era ele mesmo um mecanismo de compatibilidade no System 5 rc . E como mostrado pela confusão na questão AskUbuntu com hiperlink abaixo, usar /etc/rc.local pode dar errado. Então, faça uma unidade de serviço apropriada.

Primeiro, crie uma unidade de serviço de modelo . Por exemplo, vamos chamá-lo de /etc/systemd/system/[email protected] :

[Unit]
Documentation=https://unix.stackexchange.com/questions/247436/
Description=Set custom read-ahead on storage device %I
BindsTo=dev-%i.device

[Service]
Type=oneshot
ExecStart=/sbin/blockdev --setra 128 /dev/%I

Providencie para que a unidade de serviço seja iniciada pelo gerenciador de dispositivos plug-and-play (udev) quando os dispositivos apropriados chegarem. Sua regra, que você terá que adaptar às suas necessidades específicas, será parecida com:

SUBSYSTEM=="block", ACTION=="add|change", KERNEL=="sd[a-z]", ENV{SYSTEMD_WANTS}="custom-readahead@%k"

A configuração SYSTEMD_WANTS faz com que o udev inicie o serviço nomeado - uma instanciação do modelo no dispositivo %k . Este serviço, então, executa blockdev .

Aparentemente, há outra maneira de fazer isso, que depende da capacidade do udev de definir essas configurações diretamente. Para isso, você não precisa da unidade de modelo systemd nem dos serviços instanciados. Em vez disso, simplesmente instrua o udev diretamente em sua regra:

SUBSYSTEM=="block", ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{bdi/read_ahead_kb}="128"

Observe a diferença entre == e = .

Não há rc.local envolvido em qualquer lugar, de qualquer forma.

Leitura adicional

por 05.12.2015 / 16:16
1

No CentOS 7, o rc.local não é executável por padrão.

Executar: chmod + x /etc/rc.d/rc.local

Para ativá-lo.

    
por 27.07.2016 / 03:45