Table of Contents

OpenRC

O OpenRC é um sistema de gerenciamento de serviços baseado em dependências. Funciona com o programa init fornecido pelo sistema, normalmente /sbin/init.

Características

O OpenRC fornece uma série de recursos, como execução de initscript iniciada por hardware e suporte a cgroups, sem a necessidade de grandes alterações de layout.

Instalação

Dois Slackbuilds estão disponíveis em openrc, que contêm o sistema de inicialização OpenRC, e o openrc-services, que contém vários serviços para uso com o OpenRC.

Pós-instalação

Após a instalação, algumas etapas são necessárias para inicializar com o OpenRC.

Configure os serviços agetty

# main tty
ln -s /etc/openrc/init.d/agetty /etc/openrc/init.d/agetty.tty1
/sbin/rc-update add agetty.tty1 default
  
cp /etc/openrc/conf.d/agetty /etc/openrc/conf.d/agetty.tty1
echo 'agetty_options="--noclear"' >> /etc/openrc/conf.d/agetty.tty1

# additional ttys
for i in {2..6}; do
  ln -s /etc/openrc/init.d/agetty /etc/openrc/init.d/agetty.tty${i}
  /sbin/rc-update add agetty.tty${i} default
done

# serial tty (for servers)
ln -s /etc/openrc/init.d/agetty /etc/openrc/init.d/agetty.ttyS0
/sbin/rc-update add agetty.ttyS0 default

cp /etc/openrc/conf.d/agetty /etc/openrc/conf.d/agetty.ttyS0
echo 'agetty_options="--noclear"' >> /etc/openrc/conf.d/agetty.ttyS0

Atualizar parâmetros de inicialização

Adicione o seguinte aos seus parâmetros de inicialização (via /etc/lilo.conf para o lilo ou /etc/default/grub para o grub):

init=/sbin/openrc-init

Regenerar a configuração de inicialização ('lilo -v' ou 'grub-mkconfig -o /boot/grub/grub.cfg').

Habilitar o registro de inicialização

O principal arquivo de configuração do OpenRC é o /etc/openrc/rc.conf, e contém várias opções.

Uma opção comum que pode ser alterada é habilitar o log de inicialização configurando rc_logger=“YES”, desta forma, quaisquer erros encontrados através da inicialização podem ser registrados e examinados posteriormente (a localização padrão do log é /var/log/rc.log).

Na reinicialização

Na reinicialização, um é inicializado em uma linha de comando com apenas o mínimo de serviços habilitados.

Pode mostrar um aviso sobre o suporte obsoleto so arquivo /etc/mtab. Para corrigir:

# cp /etc/mtab /etc/mtab.bkp
# ln -snf /proc/self/mounts /etc/mtab

Também pode reclamar de falta do arquivo /etc/sysctl.conf que pode ser criado como:

# touch /etc/sysctl.conf

Ativando alguns serviços

Os serviços podem ser ativados como:

# rc-service add <service> <runlevel>

Eles podem ser desativados como:

# rc-service del <service> <runlevel>

Alguns serviços comuns que podem ser ativados:

# rc-update add dbus default
# rc-update add sysklogd default
# rc-update add dcron default
# rc-update add alsasound boot  # para desktop
# rc-update add consolekit default  # para desktop
# rc-update add sshd default  # para server

Os serviços habilitados no nível de execução atual podem ser consultados com:

$ rc-status

Serviços habilitados em todos os níveis de execução podem ser consultados com:

$ rc-update

Alguns serviços que são ativados por padrão para o runlevel sysinit incluí udev e udev-postmount.

Usuários que usam dmcrypt, lvm, ou mdraid podem adicionar os seguintes serviços respectivamente ao nível de execução boot:

# rc-update add dmcrypt boot        # dmcrypt
# rc-update add device-mapper boot  # lvm
# rc-update add lvm boot            # lvm
# rc-update add mdraid boot         # mdraid

Network

Se estiver usando ethernet via DHCP, o serviço dhcpcd pode ser habilitado:

# rc-update add dhcpcd default

Se estiver usando wi-fi em laptops, o serviço NetworkManager ou wicd pode ser habilitado; o serviço dhcpcd pode ser habilitado. A combinação de dhcpcd e wpa_supplicant (junto com um frontend como wpa_gui ou wpa_cli) também pode ser usada como uma alternativa leve.

Uma rede estática pode ser configurada editando /etc/openrc/conf.d/network.

Gerenciador de Tela

Para inicializar em um gerenciador de exibição gráfica, pode editar o arquivo /etc/openrc/conf.d/xdm para especificar o gerenciador de exibição, e o serviço xdm pode ser habilitado:

# rc-update add xdm default

Se estiver usando um laptop, o serviço acpid também pode ser habilitado.

Migrando serviços habilitados existentes

Para verificar os serviços habilitados existentes, o seguinte código pode ser usado:

for file in /etc/rc.d/*; do
  if [ -x "${file}" ]; then
    echo "enabled ${file}"
  fi
done

Para esses serviços, os serviços OpenRC correspondentes podem ser habilitados, por exemplo:

# rc-update add acpid default
# rc-update add cgmanager default
# rc-update add gpm default
...

Todos os serviços presentes podem ser consultados via:

$ rc-update -v

Configuração

Os serviços OpenRC estão presentes no diretório /etc/openrc/init.d, e os arquivos de configuração correspondentes estão presentes em /etc/openrc/conf.d

Alguns arquivos de configuração comuns incluem:

/etc/openrc/conf.d/modules    # módulos a serem carregados na inicialização
/etc/openrc/conf.d/hostname   # nome do host do sistema
/etc/openrc/conf.d/keymaps    # mapa de teclado do console

Gestão de serviços

Os serviços podem ser iniciados/interrompidos/reiniciados como:

# rc-service <service> <action>

Por exemplo,

# rc-service sshd start

Desligar/Reiniciar

Para desligar ou reiniciar, será necessário usar openrc-shutdown. Para desligar de um ambiente de desktop usando ConsoleKit2, verifique o PR.

Note

Os arquivos ck-system-stop e ck-system-restart no PR pode ser salvos em /usr/local/sbin/poweroff e /usr/local/sbin/reboot respetivamente. Isso permite usar os comandos poweroff e reboot como antes.

Troubleshooting

Neste momento, apenas um subconjunto dos serviços incluídos foi testado, portanto, alguns deles podem não funcionar corretamente.

Se algum serviço não funcionar, tente o sistema fornecido em /etc/rc.d (se estiver disponível).

mysqld

Experimente adicionar as seguintes linhas ao arquivo /etc/my.cnf

[mysqld]
user = mysql
basedir = /usr
datadir = /var/lib/mysql
pid-file = /run/mysql/mysql.pid
socket = /var/run/mysql/mysql.sock

Lidar com serviços interrompidos

Às vezes, o OpenRC relata o status de um serviço como “travado”. O processo pode ter morrido ou seu arquivo pid desapareceu/mudou.

Se alguém tentar iniciar um serviço travado, `rc-service` reporta:

Então, tenta-se parar antes de começar de novo.

No entanto, em algumas situações, o serviço não pára. Isso leva a um impasse em que não se pode interromper o serviço nem iniciá-lo. Para esses casos:

# rc-service <service> zap
* Manually resetting <service> to stopped state

zap redefine o estado do serviço, permitindo-nos reiniciá-lo.

openrc-init

Desde a versão 0.25, OpenRC fornece openrc-init que pode ser usado para inicializar o sistema.

Isso permite alternar entre OpenRC e outros sistemas init, por exemplo sysvinit, apenas alterando os parâmetros de inicialização.

Para obter mais informações, consulte o Gentoo wiki.

Migrando do /etc/init.d para /etc/openrc/init.d

O OpenRC 0.39+, fornecido via SBo, altera o diretório de serviço e configuração para /etc/openrc em vez do /etc.

Isso está sendo feito para manter uma maior compatibilidade com a instalação do Slackware por padrão.

Os serviços existentes precisarão ser migrados, detalhes abaixo sobre como isso pode ser feito.

1. Instalar openrc-0.39.2 e openrc-services-20181107

Esses pacotes enviam os arquivos de configuração e serviço em /etc/openrc.

2. Migrar serviços existentes

Isso envolve 4 etapas:

# migrar serviços existentes
for service in /etc/init.d/*; do
  svcname=$(basename "$service")
  if [ ! -e "/etc/openrc/init.d/${svcname}" ]; then
    if [ -f "/etc/init.d/${svcname}" ] && grep -q openrc "/etc/init.d/${svcname}"; then
      cp -v "/etc/init.d/${svcname}" "/etc/openrc/init.d/${svcname}"
    elif [ -L "/etc/init.d/${svcname}" ]; then
      # check if symlink is of a service
      service_target=$(readlink -f "$service")
      service_target_name=$(basename "$service_target")
      if [ $(dirname "$service_target") = "/etc/init.d" ]; then
        ln -sv "/etc/openrc/init.d/${service_target_name}" "/etc/openrc/init.d/${svcname}"
      fi
    fi
  fi
done

# habilitar serviços existentes
for runlevel in /etc/runlevels/*; do
  for service in ${runlevel}/*; do
    svcname=$(basename "$service")
    rvlname=$(basename "$runlevel")
    if [ ! -e /etc/openrc/runlevels/${rvlname}/${svcname} ] && [ -e /etc/openrc/init.d/${svcname} ]; then
      ln -sv /etc/openrc/init.d/${svcname} /etc/openrc/runlevels/${rvlname}/${svcname}
    fi
  done
done

# verificar mudanças de configuração
for file in /etc/conf.d/*; do
  filename=$(basename "$file")
  extension="${filename##*.}"
  if [ "$extension" = orig ] || [ "$extension" == new ]; then
    continue  # dont need to check extra
  fi
  if [ -e "/etc/conf.d/${filename}" ] && [ -e "/etc/openrc/conf.d/${filename}" ]; then
    diff -Nupr "/etc/conf.d/${filename}" "/etc/openrc/conf.d/${filename}"
  fi
done
# arquivo de configuração principal
diff -Nupr /etc/rc.conf /etc/openrc/rc.conf

# verificar alterações locais.d
for file in /etc/local.d/*; do
  filename=$(basename "$file")
  if [ ! -e "/etc/openrc/local.d/${filename}" ]; then
    cp -v "/etc/local.d/${filename}" "/etc/openrc/local.d/${filename}"
  elif [ -e "/etc/local.d/${filename}" ] && [ -e "/etc/openrc/local.d/${filename}" ]; then
    # show changes
    diff -Nupr "/etc/local.d/${filename}" "/etc/openrc/local.d/${filename}"
  fi
done

As alterações de configuração encontradas acima podem ser atualizadas manualmente ou copiadas e coladas em um novo local.

3. Verifique e reinicie

Verifique se rc-status está mostrando todos os serviços (pode mostrá-los como interrompidos).

Reinicialize e verifique se as coisas estão funcionando como esperado, faça as alterações necessárias.

Os arquivos e pastas antigos podem ser renomeados (ou removidos).

mv /etc/init.d /etc/init.d-openrc-bkp
mv /etc/conf.d /etc/conf.d-openrc-bkp
mv /etc/local.d /etc/local.d-openrc-bkp
mv /etc/runlevels /etc/runlevels-openrc-bkp
mv /etc/rc.conf /etc/rc.conf-openrc.bkp

Finalmente, qualquer mudança feita no sistema Slackware padrão pode ser revertida:

mv /etc/init.d-bkp /etc/init.d

Veja também

Wikipedia

Gentoo Wiki

Github

User guide

LQ thread

openrc-services repo

Sources