As máquinas UNIX® executam e executam (e executam). Um sistema de desktop ou móvel pode ser deixado de lado por semanas, até meses, e o tempo de atividade do servidor pode se estender a um ano ou mais. De fato, se pudesse impedir falhas de hardware e a Mãe Natureza, um sistema UNIX ficaria em execução eternamente. Infelizmente, o hardware é imperfeito, a Mãe Natureza tem sua própria vontade, e o software sofre erros. O mecanismo precisa de substituição. Tempestades podem acontecer e acontecem. E os sistemas precisam de correções e reinicializações. Assim como a morte e os impostos, o tempo de inatividade é uma certeza.
No entanto, diferentemente da morte e dos impostos, é possível minimizar o tempo de inatividade. Uma manutenção do sistema proativa e regular e peças de reposição impulsionam a disponibilidade, assim como em um robusto datacenter repleto de capacidade de backup e conexões redundantes à Internet. Felizmente, também, a maioria dos aplicativos e bibliotecas pode ser atualizada continuamente e on demand usando ferramentas como rpm, Aptitude e yum.
Infelizmente, as atualizações do kernel—modificações para abranger vulnerabilidades e falhas no software do sistema principal—não são tão fáceis. Uma atualização do kernel é muito perturbante, exigindo um tempo de inatividade programado para interromper temporariamente todos os serviços em toda e qualquer máquina afetada. Embora essa manutenção seja necessária e vital, acompanhar as atualizações do kernel pode, contudo, tornar as operações algo parecido com um ioiô. A saber, as linhas de tempo na figura 1 mostram a frequência das atualizações críticas do kernel de um número de sistemas operacionais populares entre janeiro de 2009 e fevereiro de 2010. Cada ícone de ciclo representa uma reinicialização obrigatória (imagem cortesia da Ksplice, Inc.).
Figura 1. Frequência de atualizações do kernel por sistema operacional
Mas agora, é possível corrigir seu kernel enquanto ele é executado, eliminando a interrupção maciça causada por uma reinicialização. Em outras palavras, atualizações programadas não precisam mais de programação.
O Ksplice é um conjunto de ferramentas para corrigir o kernel in situ, enquanto está sendo executado—sem necessidade de reboot. Dado um kernel existente, seu código de origem e um ou mais arquivos diff unificados (um diff unificado é a forma canônica das correções do kernel), o Ksplice substitui o código do objeto existente e errôneo no kernel residente por um novo código do objeto. O Ksplice pode substituir código do programa e estruturas de dados. Melhor ainda, um kernel splice interrompe a operação normal do sistema por uma mera fração de milissegundo, deixando daemons, processos e conexões intactos.
Vamos ver rapidamente como o Ksplice funciona e aprender como usar suas ferramentas para manter um kernel atualizado. Há três maneiras de usar o Ksplice:
- GUI (Graphical user interface - Interface gráfica com o usuário)
- Utilitários de linha de comandos equivalentes de alto nível
- Ferramentas brutas do Ksplice (se você possui a origem do seu kernel)
Um usuário da versão Ubuntu 9.04 ou versão 9.10, por exemplo, pode fazer o download e instalar um aplicativo de apontar e clicar para escolher e aplicar as modificações no kernel. Todas as três variantes do Ksplice serão introduzidas aqui.
De forma sucinta, o Ksplice corrige um kernel em execução substituindo uma ou mais funções vulneráveis ou com falhas por implementações corretas e mais recentes. Para efetuar a substituição, a ferramenta repara uma imagem do kernel em execução com o código do objeto das novas funções e injeta um obstáculo para cada função existente para chamar seu novo correspondente. Praticamente o kernel inteiro permanece inalterado, exceto pelo novo código do objeto e algumas instruções para redirecionar as chamadas de função.
Além disso, o Ksplice pode afetar estruturas de dados, embora com um pouco de programação extra. O Ksplice pode executar código durante uma atualização para facilitar a alteração. O Ksplice também fornece um par de ganchos para executar a configuração e destruir o código imediatamente antes e imediatamente depois que o kernel é atualizado. Também é possível adicionar novas funções para aumentar o kernel; novas funções simplesmente não possuem correspondentes no kernel original.
É possível aplicar o Ksplice em praticamente qualquer kernel, mesmo aqueles que foram enviados antes do Ksplice ser
desenvolvido. Para unir um kernel, é preciso ter seu código de origem, o conjunto de correções
que você quer aplicar e um compilador capaz de isolar cada função e estrutura de dados
no kernel em sua própria seção no código do objeto. Por exemplo, o GCC (GNU Compiler Collection -
Coleção do Compilador GNU) fornece os sinalizadores -ffunction-sections
e -fdata-sections, respectivamente, para esses fins
exatos (Outros compiladores, como o Intel® C
Compiler, possuem capacidades semelhantes). Esse código do objeto "modular" é mais facilmente
manipulado pelo Ksplice. É necessário que o kernel em execução a ser corrigido não tenha sido compilado com as mesmas opções especiais.
O Ksplice se refere ao kernel compilado da fonte original como pré- kernel. O novo kernel construído a partir da origem corrigida é o pós- kernel. E o kernel em execução é apelidado de kernel de execução. O Ksplice falha se o pré não é o mesmo que o de execução—uma indicação clara de que o código de origem não corresponde ao kernel que está sendo executado. Exceto por essa condição especial, o Ksplice compara o pré ao pós e cada diferença se torna uma junção. Todas as junções são empacotadas em um arquivo de objeto único pronto para ser injetado no kernel.
O Ksplice usa o recurso stop_machine (ou seu equivalente,
dependendo da sua escolha de UNIX) para se preparar para unir código novo. Pense no
stop_machine como um sinal de tráfego; ele permite que uma única CPU
prossiga enquanto as outras ficam inativas. Depois de executar stop_machine,
o Ksplice analisa cada função marcada para substituição para determinar se ela está
ativa. Mesmo se um único ponteiro de instrução de encadeamento se referir a um código de função na
memória ou se uma única pilha de kernel de encaminhamento se referir a um endereço de retorno dentro da
função, a função é considerada ativa e não pode ser substituída. De outro modo,
a função é considerada inativa e é substituída. O Ksplice tenta repetidamente
fazer uma substituição, mas ele pode, no fim das contas, abandonar o esforço. Se isso acontece,
ele relata um erro e para.
A correção do kernel nunca foi tão fácil
Se você executar uma das distribuições mais populares de UNIX, o Ksplice não poderia ser mais fácil de usar. Os autores do Ksplice fornecem um aplicativo cliente customizado para a sua distribuição Linux. É possível manter seu kernel atualizado por uma taxa nominal de menos de 5 dólares por sistema por mês. É possível encontrar uma lista dos sistemas operacionais suportados no Web site do Ksplice (consulte Recursos). O software Ksplice software está disponível gratuitamente para Ubuntu 9.04 (Jaunty Jackalope) e Ubuntu 9.10.
Para fins de demonstração, este artigo usa Ubuntu 9.10 e une seu kernel. Para usar o
Ksplice em Ubuntu, é preciso fazer o download e instalar o Ksplice Uptrack cliente (consulte
Recursos para obter um link). O Uptrack gerencia as atualizações de kernel
sem reboot disponíveis para o seu sistema. É possível visualizar e instalar atualizações do Ksplice,
e você pode revisar alertas quando novas atualizações do kernel estiverem disponíveis. O software é
fornecido como pacote Debian. Também é possível fazer o download do software a partir da
linha de comando usando uma ferramenta como wget ou cURL.
A seguir, use gdebi para instalar o pacote. Se você ainda não
possui gdebi, é possível instalá-lo com o comando:
sudo apt-get install gdebi |
Se preferir um cliente gráfico, é possível instalar o Ksplice com o comando:
sudo gdebi-gtk ksplice-uptrack.deb |
gdebi instala o Uptrack e suas dependências, que incluem
kerneloops, a biblioteca YAML, Python e a biblioteca cURL
(veja a listagem 1).
Listagem 1. Instalação do Uptrack e suas dependências
$ wget http://www.ksplice.com/uptrack/dist/karmic/ksplice-uptrack.deb $ sudo gdebi ksplice-uptrack.deb Reading package lists: Done Reading state information: Done Reading state information: Done Reading state information: Done Reading state information: Done Requires the installation of the following packages: kerneloops curl libcurl3 python-yaml libyaml-0-1 Client for the Ksplice Uptrack service The Ksplice Uptrack service enables you to keep your system up to date and secure without rebooting it. This package contains the command-line and graphical Uptrack clients. Do you want to install the software package? [y/N]:y ... |
Depois que você aceitar os termos de serviço e que a instalação terminar, o Uptrack é iniciado automaticamente. O instalador também coloca um ícone do Ksplice —uma grande letra K na barra de tarefas—para acesso fácil. A figura 2 mostra o Uptrack Manager sendo ativado pela primeira vez em uma instalação limpa de Ubuntu 9.10. Para corrigir o kernel, clique em Install all updates.
Figura 2. Ativação do Uptrack Manager
Uma barra de progresso, mostrada na figura 3, mostra cada correção conforme é instalada. Corrigir o kernel leva apenas alguns minutos, mesmo quando um bom número de correções está pendente. E, é claro, nenhum reboot é necessário.
Figura 3. A barra de progresso do Ksplice
Quando concluído, o Uptrack Manager se atualiza para mostrar o novo estado do seu sistema,
como mostrado na figura 4. Uma marca de seleção verde indica que a correção nomeada
foi aplicada com sucesso e agora está ativa no seu kernel em execução. Clique em Check
para procurar correções adicionais do kernel disponíveis para seu sistema. Clique em Close para
liberar a janela. Não é necessário executar o uptrack-manager
como raiz; o software solicita uma senha de administrador antes de qualquer modificação
ser aplicada.
Figura 4. O estado atual do sistema no Uptrack Manager
É possível abrir o Uptrack Manager a qualquer momento com o comando uptrack-manager,
ou clicando no ícone K na barra de tarefas. O Ksplice é executado continuamente depois de ativado.
Se preferir, é possível configurar o Ksplice para aplicar correções no kernel em execução
automaticamente ou somente para alertar quando houver atualizações disponíveis. Por exemplo, para
escolher esta última opção, edite o arquivo /etc/uptrack/uptrack.conf e altere a linha
autoinstall para ler:
autoinstall = yes |
Além do gerenciador de atualização, o Uptrack Manager inclui três outros
utilitários de linha de comandos para mais praticidade. (Esses utilitários são diferentes das ferramentas
usadas para trabalhar com a origem do kernel diretamente, que são demonstradas na próxima
seção.) uptrack-upgrade instala as atualizações do kernel
mais recentes disponíveis, enquanto o uptrack-remove id remove a
atualização do kernel marcado com ID id. Se você digitar
uptrack-remove --all, uptrack-remove
limpa todas as atualizações instaladas. uptrack-show mostra um
inventário das atualizações que estão atualmente instaladas.
E é essencial lembrar que o Uptrack Manager não rouba o papel do gerente do pacote padrão da sua distribuição. Todas as alterações que o Ksplice faz são aplicadas no kernel em execução e só existem na memória. Portanto, todas as correções do Ksplice são perdidas no encerramento. Continue a atualizar seu kernel em disco com um procedimento de manutenção de software tradicional, como executar:
apt-get update; apt-get upgrade |
Execute-o como raiz regularmente ou quando sua distribuição informá-lo sobre novas atualizações de sistema. Manter o kernel atualizado no disco garante que seu sistema inicialize o melhor kernel disponível quando seu sistema eventualmente solicitar uma reinicialização.
Atualização de kernels customizados
O Uptrack Manager é uma opção prática para desktop e computadores de servidor baseados em kernels construídos e distribuídos por um fornecedor ou um projeto de uma comunidade. Ele não funcionará, no entanto, se o seu kernel for customizado e construído localmente, pois o Uptrack Manager não pode comparar seu kernel a um sistema operacional publicado e conhecido para gerar junções. No entanto, é possível usar utilitários "primitivos" do Ksplice para analisar correções públicas e criar suas próprias junções.
Descrever como construir um kernel está além do escopo deste artigo. Se você não está familiarizado com o processo, há instruções excelentes e um bom número de tutoriais satisfatórios espalhados pela Internet. Em vez disso, vamos focar as ferramentas que o Ksplice fornece e como prosseguir quando for capaz de construir algum kernel.
O Ksplice fornece um utilitário chamado ksplice-create para criar
junções de kernel. O comando requer duas entradas: um arquivo de caminho e toda a árvore de origem
do kernel em execução, incluindo quaisquer correções anteriores que já foram
aplicadas. Dados o código de origem atual e as correções, o Ksplice gera dois
kernels, como mencionado acima, e compara a revisão com seu original. O resultado
de ksplice-create é uma junção que pode ser aplicada com
ksplice-apply. É possível editar uma junção do kernel
com ksplice-remove.
Aqui está um exemplo (retirado do estudo acadêmico dos autores e usado com permissão expressa) que cria uma atualização para "prctl vulnerability", CVE-2006-2451, usando um arquivo de caminho chamado prctl e um diretório de origem do kernel ~/src:
$ ksplice-create --patch=prctl ~/src Ksplice update tarball written to ksplice-8c4o6u.tar.gz $ sudo ksplice-apply ./ksplice-8c4o6u.tar.gz Done! |
O comando anterior gera um tar de código do objeto, ksplice-8c4o6u.tar.gz, para ser corrigido no kernel. O segundo comando lê o tar, calcula as renovações necessárias e aplica a junção.
Vinte e quatro, sete, trezentos e sessenta e cinco
O Ksplice é uma tecnologia comprovada. De acordo com o ensaio original e o estudo técnico do autor, o Ksplice era capaz de corrigir o® kernel Linux dinamicamente com todas as correções funcionais e de segurança emitidas entre 2006 e 2008. Destas, mais de dois terços não requeriam código especial para atualizar o kernel. Das correções restantes, uma programação especial somava uma média de 17 linhas de código por correção.
O Linux foi escolhido para provar a abordagem do Ksplice. A origem do Linux é ampla e frequentemente verificada em busca de falhas e é corrigida várias vezes para lidar com os defeitos rapidamente. No entanto, o Ksplice pode ser prontamente adaptado a qualquer kernel cujo código de origem esteja disponível, incluindo BSD e Sun Solaris. O Ksplice também suporta processadores x86, x86_64 e ARM.
Aprender
-
Falando
UNIX: Verifique outras partes desta série.
-
Ksplice: Saiba mais sobre o Ksplice no site
de ferramentas.
-
Estudo técnico do Ksplice: Leia o
estudo técnico para saber mais sobre como o Ksplice funciona.
-
kernel.org: Encontre informações sobre o kernel Linux e
o archive do código de origem do kernel.
-
Vulnerabilidades e Exposições Comuns: Uma lista abrangente
de vulnerabilidades de computador está disponível no site CVE. Cada entrada no banco de dados
inclui uma breve descrição da vulnerabilidade ou exposição de segurança e
referências pertinentes.
-
Zona AIX e UNIX do developerWorks
: A zona AIX e UNIX fornece uma diversidade de informações relacionadas a
todos os aspectos de administração de sistemas AIX e expansão das suas habilidades em UNIX.
-
Iniciante em AIX e UNIX?
Visite a página Iniciante em AIX e UNIX para saber mais.
-
Livraria de
tecnologia: Navegue pela livraria de tecnologia para encontrar livros sobre este e outros
tópicos técnicos
Obter produtos e tecnologias
-
Ksplice Uptrack: Faça o download do software
Uptrack adequado para o seu sistema.
-
Github: O Github hospeda milhares de repositórios Git,
incluindo os arquivos com ponto pessoais de muitos usuários especialistas. Busque "arquivos com ponto" para encontrar
exemplos. (É possível saber mais sobre Git on-line e nos
Guias de Github.)
Discutir
-
Blogs do developerWorks: Confira
nossos blogs e entre na comunidade do developerWorks
.
- Siga o developerWorks no Twitter.
- Participe da comunidade do My developerWorks.
-
Participe dos® fóruns sobre AIX e UNIX:
- Fórum AIX
- Fórum AIX para desenvolvedores
- Gerenciamento de Sistemas em Cluster
- Fórum de Assistente de Suporte da IBM
- Fórum de Ferramentas de Desempenho
- Fórum de Virtualização
- Mais Fóruns sobre AIX e UNIX

Martin Streicher é desenvolvedor autônomo de Ruby on Rails e o editor-chefe anterior da Linux Magazine. Martin é Mestre em Ciência da Computação pela Purdue University e faz programação de sistemas do tipo UNIX desde 1986. Ele coleciona arte e brinquedos.