Unix: Conceitos
Unix: Conceitos
O Kernel
O Kernel do Unix (e de virtualmente qualquer outro sistema operacional) possui um papel de que convém ter noções, a fim de se poder compreender melhor o funcionamento do sistema, realizar diagnósticos e procedimentos administrativos como adição de componentes de hardware. Algum conhecimento do papel do kernel é importante também para se ter uma noção mais clara do uso de arquivos especiais e do diretório /proc.
O Kernel ordinariamente reside no filesystem como um outro arquivo qualquer. No Linux, ele é em geral o arquivo /vmlinuz ou /boot/vmlinuz, ou ainda /boot/vmlinuz-2.0.36. Ele é um programa, ainda que um pouco diferente dos programas de aplicação como o /bin/ls. O kernel é carregado e posto em execução no boot da máquina, e a sua execução somente se encerra com o shutdown.
De forma simplificada, o seu papel é num primeiro momento reconhecer o hardware e inicializar os respectivos drivers. Em seguida ele entra num estado administrativo onde funciona como intermediário entre as aplicações e o hardware. Por exemplo, quando uma aplicação necessita alocar mais memória, ela solicita isso ao kernel. É o kernel que distribui o tempo de CPU aos vários processos ativos. É ele que habitualmente realiza a entrada e saída de dados nas diferentes portas de comunicação.
É por isso que a adição de hardware novo a uma máquina pode requerer a substituição ou ao menos a reconfiguração do kernel. Os kernels mais recentes do Linux oferecem vários mecanismos de configuração que os tornam sobremaneira flexíveis, a ponto de ser rara a necessidade de substituição do kernel. Os dois mecanismos fundamentais de se configurar a operação do kernel é a passagem de parâmetros no momento do boot (realizada pelo LILO) e a carga de módulos, feita manualmente ou por mecanismos automáticos como o kerneld.
O diálogo entre as aplicações e o kernel realiza-se fundamentalmente através dos system calls, que são serviços que o kernel oferece, como por exemplo, read(2). Os devices special files são maneiras de se referir ao kernel os dispositivos físicos ou lógicos com que se pretendem operar, por exemplo, a primeira porta serial ou a segunda unidade de CD, ou o disco principal do sistema. Neles, o importante não é o nome, mas sim os números de dispositivo, ou mais precisamente o major e o minor device numbers. Device special files são criados através do comando mknod, ou através de interfaces mais amigáveis, como o comando MAKEDEV.
Os sistemas Unix-like mais recentes oferecem um outro mecanismo de comunicação com o kernel, que é o filesystem /proc. As entradas desse filesystem são pseudo-arquivos cujo conteúdo reflete o estado atual de inúmeras estruturas de dados internas do kernel. Assim, um programa de aplicação passa a poder comunicar-se com o kernel através dos mecanismos ordinários de leitura e escrita de arquivos.
Em muitos casos a comunicação entre as aplicações e o kernel é intermediada por bibliotecas, principalmente a libc. Elas oferecem serviços de mais alto nível que os system calls do kernel, tornando mais simples o trabalho de programação.
Procedimentos de boot e o init
O boot do Unix consiste inicialmente na carga e execução do kernel. Em seguida, é disparado o processo init, que segue as instruções do arquivo /etc/inittab, que portanto é o ponto de partida para tudo o que se pretenda configurar durante o procedimento de disparo de processos ao longo do boot.
O inittab não é um script como o AUTOEXEC.BAT, mas uma lista de ações, algumas delas de valor permanente para todo o curso da operação do sistema. Cada linha válida representa um processo que o init deve disparar. O termo respawn significa que, além de disparar, o init deverá monitorar o processo e, se porventura ao longo da operação do sistema ele for encerrado, o init deverá redispará-lo.
Via de regra as linhas do inittab referem-se ou à chamada de scripts de configuração inicial do sistema, que são executados apenas uma vez, ou aos processos de controle de login no sistema, que são redisparados sempre que ocorre um logout. O inittab inclui ainda o conceito de runlevel, o que cria a flexibilidade de se poder inicializar a máquina em um de vários possíveis modos de operação. Na prática, costuma haver três modos principais, o single-user, utilizado para manutenção, um gráfico e um não gráfico.
Quanto aos scripts de configuração (normalmente são os arquivos e/ou diretórios /etc/rc.*, dependendo da plataforma a mecânica de disparo deles pode ser bastante complexa. Note que cada runlevel pode disparar ou deixar de disparar alguns scripts, a fim de estabelecer o modo de operação desejado. Em quase todas as versões mais recentes do Linux essa mecânica segue o padrão dos diretórios /etc/rc.d/rcN.d, onde N é cada um dos runlevels. O conteúdo desses diretórios são links para cada um dos scripts de ativação ou desativação de serviços básicos (interfaces de rede, servidor de email, etc), com números embutidos nos nomes dos links, a fim de definir a ordem em que devem ser processados.
Diretórios Principais do Sistema
No Unix não há o conceito de nomes de drives, como C:, mas todos os paths partem de uma raiz comum, o root directory “/”. Quando a máquina possui vários discos diferentes (ou ao menos várias partições diferentes de um mesmo disco), cada uma delas em geral corresponderá a uma subárvore do filesystem, como /usr, /var ou ainda nomes não standard como /disco2, que são chamados de seus pontos de montagem. O comando mount executado sem parâmetros listará os diferentes dispositivos físicos montados (discos locais e remotos e suas partições) e a subárvore correspondente a cada um deles. A tabela que indica todas essas montagens é o arquivo /etc/fstab. Apesar de algumas pequenas diferenças de plataforma para plataforma, os diretórios principais do sistema são:
/bin
/sbin
/etc
/home
/lib
/proc
/tmp
/usr
Binários básicos, como sh e ls.
Binários básicos de administração do sistema.
Arquivos de configuração do sistema e scripts de boot.
Os diretórios dos usuários residem aqui.
Bibliotecas básicas.
Estado corrente do sistema e dos processos.
Arquivos temporários.
Demais binários e bibliotecas.
O termo básico aplicado acima aos diretórios /bin e /lib tem significado principalmente essenciais para o boot e operação mínima do sistema. A separação desses elementos básicos, em contraposição aos que são deixados no /usr, deve-se a razões práticas, principalmente para facilitar a organização de redes de máquinas compartilhando subárvores de diretório. De fato, é comum que o diretório /usr ao invés de estar replicado em todas as máquinas da rede esteja residindo fisicamente num único disco, e sendo compartilhado por todas as máquinas.
O Kernel
O Kernel do Unix (e de virtualmente qualquer outro sistema operacional) possui um papel de que convém ter noções, a fim de se poder compreender melhor o funcionamento do sistema, realizar diagnósticos e procedimentos administrativos como adição de componentes de hardware. Algum conhecimento do papel do kernel é importante também para se ter uma noção mais clara do uso de arquivos especiais e do diretório /proc.
O Kernel ordinariamente reside no filesystem como um outro arquivo qualquer. No Linux, ele é em geral o arquivo /vmlinuz ou /boot/vmlinuz, ou ainda /boot/vmlinuz-2.0.36. Ele é um programa, ainda que um pouco diferente dos programas de aplicação como o /bin/ls. O kernel é carregado e posto em execução no boot da máquina, e a sua execução somente se encerra com o shutdown.
De forma simplificada, o seu papel é num primeiro momento reconhecer o hardware e inicializar os respectivos drivers. Em seguida ele entra num estado administrativo onde funciona como intermediário entre as aplicações e o hardware. Por exemplo, quando uma aplicação necessita alocar mais memória, ela solicita isso ao kernel. É o kernel que distribui o tempo de CPU aos vários processos ativos. É ele que habitualmente realiza a entrada e saída de dados nas diferentes portas de comunicação.
É por isso que a adição de hardware novo a uma máquina pode requerer a substituição ou ao menos a reconfiguração do kernel. Os kernels mais recentes do Linux oferecem vários mecanismos de configuração que os tornam sobremaneira flexíveis, a ponto de ser rara a necessidade de substituição do kernel. Os dois mecanismos fundamentais de se configurar a operação do kernel é a passagem de parâmetros no momento do boot (realizada pelo LILO) e a carga de módulos, feita manualmente ou por mecanismos automáticos como o kerneld.
O diálogo entre as aplicações e o kernel realiza-se fundamentalmente através dos system calls, que são serviços que o kernel oferece, como por exemplo, read(2). Os devices special files são maneiras de se referir ao kernel os dispositivos físicos ou lógicos com que se pretendem operar, por exemplo, a primeira porta serial ou a segunda unidade de CD, ou o disco principal do sistema. Neles, o importante não é o nome, mas sim os números de dispositivo, ou mais precisamente o major e o minor device numbers. Device special files são criados através do comando mknod, ou através de interfaces mais amigáveis, como o comando MAKEDEV.
Os sistemas Unix-like mais recentes oferecem um outro mecanismo de comunicação com o kernel, que é o filesystem /proc. As entradas desse filesystem são pseudo-arquivos cujo conteúdo reflete o estado atual de inúmeras estruturas de dados internas do kernel. Assim, um programa de aplicação passa a poder comunicar-se com o kernel através dos mecanismos ordinários de leitura e escrita de arquivos.
Em muitos casos a comunicação entre as aplicações e o kernel é intermediada por bibliotecas, principalmente a libc. Elas oferecem serviços de mais alto nível que os system calls do kernel, tornando mais simples o trabalho de programação.
Procedimentos de boot e o init
O boot do Unix consiste inicialmente na carga e execução do kernel. Em seguida, é disparado o processo init, que segue as instruções do arquivo /etc/inittab, que portanto é o ponto de partida para tudo o que se pretenda configurar durante o procedimento de disparo de processos ao longo do boot.
O inittab não é um script como o AUTOEXEC.BAT, mas uma lista de ações, algumas delas de valor permanente para todo o curso da operação do sistema. Cada linha válida representa um processo que o init deve disparar. O termo respawn significa que, além de disparar, o init deverá monitorar o processo e, se porventura ao longo da operação do sistema ele for encerrado, o init deverá redispará-lo.
Via de regra as linhas do inittab referem-se ou à chamada de scripts de configuração inicial do sistema, que são executados apenas uma vez, ou aos processos de controle de login no sistema, que são redisparados sempre que ocorre um logout. O inittab inclui ainda o conceito de runlevel, o que cria a flexibilidade de se poder inicializar a máquina em um de vários possíveis modos de operação. Na prática, costuma haver três modos principais, o single-user, utilizado para manutenção, um gráfico e um não gráfico.
Quanto aos scripts de configuração (normalmente são os arquivos e/ou diretórios /etc/rc.*, dependendo da plataforma a mecânica de disparo deles pode ser bastante complexa. Note que cada runlevel pode disparar ou deixar de disparar alguns scripts, a fim de estabelecer o modo de operação desejado. Em quase todas as versões mais recentes do Linux essa mecânica segue o padrão dos diretórios /etc/rc.d/rcN.d, onde N é cada um dos runlevels. O conteúdo desses diretórios são links para cada um dos scripts de ativação ou desativação de serviços básicos (interfaces de rede, servidor de email, etc), com números embutidos nos nomes dos links, a fim de definir a ordem em que devem ser processados.
Diretórios Principais do Sistema
No Unix não há o conceito de nomes de drives, como C:, mas todos os paths partem de uma raiz comum, o root directory “/”. Quando a máquina possui vários discos diferentes (ou ao menos várias partições diferentes de um mesmo disco), cada uma delas em geral corresponderá a uma subárvore do filesystem, como /usr, /var ou ainda nomes não standard como /disco2, que são chamados de seus pontos de montagem. O comando mount executado sem parâmetros listará os diferentes dispositivos físicos montados (discos locais e remotos e suas partições) e a subárvore correspondente a cada um deles. A tabela que indica todas essas montagens é o arquivo /etc/fstab. Apesar de algumas pequenas diferenças de plataforma para plataforma, os diretórios principais do sistema são:
/bin
/sbin
/etc
/home
/lib
/proc
/tmp
/usr
Binários básicos, como sh e ls.
Binários básicos de administração do sistema.
Arquivos de configuração do sistema e scripts de boot.
Os diretórios dos usuários residem aqui.
Bibliotecas básicas.
Estado corrente do sistema e dos processos.
Arquivos temporários.
Demais binários e bibliotecas.
O termo básico aplicado acima aos diretórios /bin e /lib tem significado principalmente essenciais para o boot e operação mínima do sistema. A separação desses elementos básicos, em contraposição aos que são deixados no /usr, deve-se a razões práticas, principalmente para facilitar a organização de redes de máquinas compartilhando subárvores de diretório. De fato, é comum que o diretório /usr ao invés de estar replicado em todas as máquinas da rede esteja residindo fisicamente num único disco, e sendo compartilhado por todas as máquinas.
Comentários