Estou desenvolvendo um dispositivo Linux embarcado. Criei com sucesso um arquivo InitramFS CPIO que é executado rapidamente após a inicialização. Agora, quero alterar a linha de comando inicial do kernel para incluir o parâmetro "quiet" para que eu possa inicializar ainda mais rápido.
No entanto, uma vez que a tela inicial é exibida no InitramFS, quero remover a opção silenciosa do kernel para que o restante da inicialização NÃO seja silencioso.
Como posso conseguir isso? Como posso reverter a opção de linha de comando "quiet" inicial do kernel depois de alcançar o InitramFS?
Obrigado.
Você não pode realmente alterar a linha de comando do kernel após a inicialização, mas o que você pode fazer é reproduzir os efeitos de configurar ou desarmar a
quiet
linha de comando por outros meios, o que deve realizar o que você deseja alcançar aqui.Resumindo, para aumentar a verbosidade quando você não quiser
quiet
mais, você pode usar este comando:E para emular o que
quiet
faz, é isso que você pode usar:Isso deve cuidar do lado do kernel da configuração... Mas às vezes o espaço do usuário também mudará o comportamento com base nessa opção do kernel. Por exemplo, o systemd analisará a
quiet
opção na linha de comando do kernel e agirá como seShowStatus=auto
fosse usado no/etc/systemd/system.conf
. Se você quiser reverter isso (para impor o padrão e ignorar aquiet
opção), edite esse arquivo de configuração e descomente aShowStatus=yes
linha lá, que deve cuidar disso.Pode haver outros sistemas no espaço do usuário que olhem para esta opção, então você pode precisar dar uma olhada neles para ver como eles se comportam e como reproduzir (ou desfazer) o comportamento da opção presente na linha de comando do kernel .
A seguir, um mergulho profundo nas fontes para explicar o comportamento da
quiet
opção no kernel e no systemd.O kernel analisa a
quiet
opção chamando aquiet_kernel()
função de inicialização , que faz:A
console_loglevel
pseudo-variável é na verdade o primeiro elemento doconsole_printk
array :O nível de log "quiet" é definido como 4 :
Algumas linhas abaixo, o nível de log padrão é definido por meio de uma configuração do kernel:
E essa configuração do kernel está definida em Kconfig.debug, ainda o padrão é 7 :
(Você pode querer verificar se seu kernel está usando a configuração padrão, em
/boot/config-*
ou em/proc/config.gz
.)E para mais detalhes sobre como usar
/proc/sys/printk
, veja a documentação do kernel . Mas, resumindo, é possível escrever apenas um único número, nesse caso apenas o primeiro elemento do array será atualizado, que é o que você deseja aqui.O systemd também analisará a linha de comando do kernel, procurando por entradas normalmente denominadas
systemd.*
, mas acontece que o systemd também reconhece aquiet
linha de comando do kernel e a usa para definir o ShowStatus:Neste caso, ele só irá definir se não foi definido anteriormente (
_SHOW_STATUS_UNSET
) e irá definir como "auto" (SHOW_STATUS_AUTO
.)Outra forma de definir o ShowStatus é através do arquivo de configuração :
Esta linha descreve a opção de configuração nomeada
ShowStatus=
na[Manager]
seção desystem.conf
. O analisador para esta opção usa a string "auto" (nesse caso, define comoSHOW_STATUS_AUTO
) ou recebe um booleano, que pode ser "yes", "true" ou "1" para habilitá-lo, ou "no", " false" ou "0" para desativá-lo.A documentação do systemd
--show-status=
também é bastante útil aqui. Ele também cita aShowStatus=
configuração (já que passar argumentos de linha de comando systemd diretamente nem sempre é fácil de fazer, atualizar um arquivo de configuração é definitivamente uma maneira mais direta de definir essa configuração.)Espero que você ache isso útil e que o ajude a obter a verbosidade correta para seu caso de uso específico!