Escolar Documentos
Profissional Documentos
Cultura Documentos
Clayton Lobato
Copyright c 2016 Clayton Lobato
P UBLISHED BY P UBLISHER
DMICONSULTING . COM . BR
Este documento é de propriedade de Clayton Lobato, com uso restrito para treinamentos ministrados
pelo Autor. Como parte do Projeto HowIHowTo, este material tem por objetivo introduzir conceitos
e comandos básicos.
I Conceitos e comandos
1 Revisão de conceitos e comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1 Estrutura de armazenamento (espaço e inodes) 7
1.2 Estrutura de permissões (stick-bit, set user id, set group id) 11
1.3 Estrutura de permissões (stick-bit, set user id, set group id) 12
1.4 Empacotamento e compactação de arquivos (gz tgz) 24
1.5 Compilação e instalação de programas 26
1.6 Configuração do processo e inicialização dos daemons 30
1.7 Estrutura de logs 33
1.8 Definições de segurança da informação e tratamento no SO 40
2 Material Complementar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.1 Estrutura de Diretórios 44
2.2 RPM e DEB 55
2.3 Bootstraping 63
2.4 Control Centre: The systemd Linux init system 69
I
Conceitos e comandos
2 Material Complementar . . . . . . . . . . . . . . 43
2.1 Estrutura de Diretórios
2.2 RPM e DEB
2.3 Bootstraping
2.4 Control Centre: The systemd Linux init system
1. Revisão de conceitos e comandos
que armazenadas as informações de acesso aos arquivos como uma matriz simples no disco, com
todas as informações de diretório hierárquico, dentre ouras. Assim, o i-número é um índice nesta
matriz, o i-node é elemento selecionado da matriz. (A notação "i-"foi usada no manual 1a edição.)"
Sendo assim, podemos observar que os registros de INODE contém informações como:
a) O tamanho do arquivo em bytes;
b) ID do dispositivo (isso identifica o dispositivo que contém o arquivo);
c) O ID do usuário do proprietário do arquivo;
d) O ID do grupo do arquivo;
e) O modo de acesso do arquivo que determina o tipo de arquivo e como o dono do arquivo, seu
grupo, e outros podem acessá-lo;
f) Flags adicionais do sistema e do usuário para proteger ainda mais o arquivo (limitar o seu
uso e modificação);
g) Timestamps dizendo quando o próprio inode foi modificado pela última vez (ctime , o tempo
de modificação do inode), o conteúdo do arquivo da última modificação (mtime , tempo de
modificação) e do último acesso (atime,tempo de acesso);
h) A contagem da ligação dizendo quantos links físicos apontam para o inode;
i) Ponteiros para os blocos de disco que armazenam o conteúdo do arquivo.
Outra forma de observar o INODE e descrito em algumas literaturas de desenvolvimento do
File System é "a menor unidade de armazenamento dos arquivos no sistema. Cada um terá, por
padrão, cerca de 4K". Sendo assim, o INODE está ligado diretamente ao volume total do disco.
Vamos tentar comparar os sistema de armazenamento com um hotel. Sendo assim, podemos
determinar uma relação entre a capacidade total de hóspedes e o número de quartos existentes.
Complementar ao dito anteriormente, vamos relacionar a capacidade de alocação (número de
hóspedes) a regra geral se em um quarto já existir um hóspede, outro não poderá ocupar a mesma
acomodação.
Dessa maneira, fica fácil entendermos que existem duas formas de causar uma lotação no
hotel. A primeira é feita colocando em cada quarto, o número total de hóspedes ao mesmo tempo.
Assim, teríamos a lotação espacial do hotel. A segunda, é colocar em cada quarto, um hóspede
apenas.Dessa forma teríamos uma lotação por alocação.
Podemos então fazer uma analogia com os INODES ao estudo da volumetria e à capacidade de
funcionamento do sistema.
Mas o quê acontece quando a regra geral que havíamos comentado é aplicada e não alocamos
corretamente a capacidade de cada unidade ?
Se alocarmos um valor menor que 4K em cada INODE, dependendo da quantidade de arquivos
alocados, teremos a utilização total disponível. Mas qual a consequência para o sistema se isso
acontecer ?
Exercise 1.1 Execute o script abaixo e em seguida gere arquivos ocultos de 1K dentro do
diretório ocultos. Por fim, crie um usuário, de forma padrão. Qual o comportamento apresentado
pelo sistema e qual a sua causa ?
#! /bin/bash
echo 1 > arquivo
while read line; do
ls -lahR / » arquivo
done < arquivo
Na imagem 1.1b, ao lado direto, podemos observar o conflito dos conceitos. Ao usar o comando
para demonstrar o uso volumétrico do sistema, notamos que a informação apresentada é de 28%
para a unidade de armazenamento referente ao /home. Já com a utilização do comando para verificar
o uso dos INODES, podemos observar que a informação é de 100% de uso. Ou seja, apesar de
ainda termos espaço livre, não há mais possibilidade de alocação dos arquivos. Dessa forma,
ao tentarmos executar o comando adduser teste para criação de um novo usuário, a resposta é como
apresentada na terceira imagem da Fig. 1.1c.
1.2 Estrutura de permissões (stick-bit, set user id, set group id) 11
1.2 Estrutura de permissões (stick-bit, set user id, set group id)
12 Capítulo 1. Revisão de conceitos e comandos
1.3 Estrutura de permissões (stick-bit, set user id, set group id)
1. useradd
Descrição: Cria usuário no sistema
Exemplos:
#useradd clayton
#useradd -d /users/clayton clayton
#useradd -d -m /users/clayton clayton
#useradd -c “Clayton Lobato” clayton
1.3 Estrutura de permissões (stick-bit, set user id, set group id) 13
2. userdel
Descrição: “Apaga” um usuário do sistema.
Exemplos:
#userdel -f clayton
#userdel -r clayton #useradd clayton
3. passwd
Descrição: Define ou altera a senha de um usuário.
Exemplos:
#passwd -x 5 clayton
#passwd -w 3 clayton
#passwd -n 4 clayton
#passwd -d clayton
4. chsh
Descrição: Altera o shell do usuário.
Exemplos:
#chsh -s /bin/sh clayton
#chsh -l
5. chage
Descrição: Muda informações de expiração de senha do usuário.
7. chfn
Descrição: Altera informações de identificação do usuário.
9. groupdel
Descrição: Apaga grupo no sistema Exemplos:
#groupdel layer
10. gpasswd
Descrição: Administra o arquivo /etc/group.
12. chpasswd
Descrição: Atualiza a senha de usuários cadastrados no sistema a partir de um arquivo com o formato
usuário:senha.
Opções Descrição
-e Aguarda que as senhas sejam criptografadas.
Mapa 12 – Detalhamento de Opções do comando chpasswd.
13. id
Descrição: Exibe os ids dos usuários.
15. finger
Descrição: Exibe informações de usuários.
Para que um usuário seja válido no sistema, este precisa obrigatoriamente de um login, uid, gid, home,
shell e senha.
As senhas no GNU/Linux são definidas pelo comando passwd e armazenada em /etc/shadow. No arquivo
/etc/passwd, ao contrário do que se pensa, serão armazenadas apenas as informações da conta do usuário. Veja
na Figura 1.
Fig 1. – Informações da conta do usuário
Observe que temos 7 colunas divididas por : ( dois pontos ). Da esquerda para a direita, temos...
clayton login do usuário;
:x Indicação de senha;
:500 UID – User ID;
:500 gID – Group ID (nesse caso teremos o grupo principal do
usuário);
:Clayton Lobato Comment – Comentário, descrição do usuário;
:/home/clayton Diretório home do usuário;
:/bin/bash Shell do usuário.
Note que as senhas não estão presente no arquivo /etc/passwd. Para visualizarmos as senhas encriptadas,
exibiremos o arquivo /etc/shadow. Veja a figura 2.
1.3 Estrutura de permissões (stick-bit, set user id, set group id) 19
Fechando o conjunto de informações, para todo usuário criado, será criado um diretório home e nele
teremos os arquivos responsáveis pelo ambiente de interação dos usuários.
Durante o processo de criação do usuário foi dito que um grupo principal para o usuário foi criado. Mas...
Como funciona essa relação ?
Bem, no mundo GNU/Linux cada usuário, arquivo, processo tem relação com um grupo. Digite o comando
ls -l em sua console, veja o que aparece. . .
Para cada arquivo apresentado existe uma relação com um usuário e um grupo.
20 Capítulo 1. Revisão de conceitos e comandos
Para que se tenha acesso a um arquivo, é necessário ter permissão. Vamos entender essa relação analisando
umas das linhas exibidas acima.
drwxr-xr-x 2 root root 4096 Jan 1 2000 bin
Observe o grupo eduardo. Nele temos a descrição do grupo e o gid do mesmo, neste caso o número 501.
Já o grupo qmail, possui um membro chamado clayton, este um usuário. Trocando em miúdos...
A estrutura base do arquivo /etc/group é grupo:x:gid:membros
1.3 Estrutura de permissões (stick-bit, set user id, set group id) 21
Entendido como gerenciar usuários e grupos, o próximo passo será o gerenciamento de permissões de
acesso aos arquivos.
Tudo no GNU/Linux é um arquivo, e para cada arquivo definimos um nível de acesso, nível esse dividido em
leitura (read), escrita (write) e execução (execute), além das informações de dono e grupo. Alguns comandos são
usados para determinar um nível de permissão de acesso, o que chamo de NPA, além de determinar o dono e o
grupo do arquivo. Quando novos arquivos são criados no sistema, entra em ação o umask, o qual garante que que
determinados NPAs sejam usados como padrão, no processo de criação desses arquivos. No GNU/Linux teremos
dois padrões, 755 será usado como padrão para criação de diretórios e 644 para criação de arquivos.
Para alterarmos o valor do umask, usamos o seguinte mecanismo.
Detalhando a informação....
777 é o valor total permitido para os níveis de permissão de acesso. 027 será o decremento umask. O
resultado desse cálculo será o valor do NPA usado pelo sistema, nesse caso, 750 (Dono com permissão total, grupo
podendo ler e executar e outros sem nenhum tipo de acesso). Vejamos os comandos que nos permitem definir os
níveis de acesso, dono e grupo dos arquivos. Não usaremos os mapas aqui por conta da quantidade de informações
dos comandos.
16. chmod
Descrição: Gerencia os níveis de permissão de acesso dos arquivos.
Opções Descrição
-c Modo verbose, mostrando apenas as alterações feitas.
u Usuário.
g Grupo.
o Outros.
Opções Descrição
a Todas as camadas.
4 Leitura
2 Escrita
1 Execução
6 Leitura e Escrita
22 Capítulo 1. Revisão de conceitos e comandos
5 Leitura e Execução
3 Escrita e Execução
r Leitura
w Escrita
x Execução
rw Leitura e Escrita
rx Leitura e Execução
wx Escrita e Execução
1 Stick Bit
2 Set group ID
4 Set User ID
17. chown
Descrição: Define dono e grupo do arquivo.
Opções Descrição
-c Modo verbose, mostrando apenas as alterações feitas.
Opções Descrição
-f Não exibe mensagem caso haja erro na execução do comando.
1.3 Estrutura de permissões (stick-bit, set user id, set group id) 23
tar
Descrição: Empacota arquivos em um arquivo tarball.
Opções Descrição
COMMON OPTIONS
gzip
Descrição: Comprime ou expande arquivos.
Opções Descrição
-# --fast –best Determina o nível de compressão. -1 ou - - fast executa com uma taxa de
compressão menor, determinando uma ação mais rápida do comando e -9 ou
- - best determina ação mais demorada, com taxa de compressão maior.
bzip2
Descrição: a block-sorting file compressor, v1.0.3.
Opções Descrição
1. gcc
2. glibc
3. make 4. tar
5. bzip2
6. bunzip2
7. kernel-source
Após termos criado o ambiente necessário para a compilação, passamos então para o tratamento do
arquivo fonte. Aqui demonstraremos a instalação do SQUID com algumas particularidades.
Primeiro vamos desempacotar e descompactar o código fonte.
[root@clayton ~]# ls squid-2.6.STABLE3-20060916.tar.gz
squid-2.6.STABLE3-20060916.tar.gz
Observe o que o nosso pacote é do tipo tar.gz o que nos obriga a utilizar a linha de comando abaixo.
[root@clayton ~]# tar -zxvf squid-2.6.STABLE3-20060916.tar.gz
É importante observarmos esses detalhes para que não façamos confusão no hora de trabalhar. Existe a
possibilidade de termos códigos fonte do tipo tar.bz2, nesse caso usaríamos os parâmetros -jxvf junto ao comando
tar.
Após desempacotar e descompactar o arquivo fonte, precisamos compilar o programa. Veja abaixo:
[root@clayton]squid-2.6.STABLE3-20060916]#./configure --prefix=/usr --sysconfdir=/etc/squid --
libexecdir=/usr/lib/squid --infodir=/usr/share/info --mandir=/usr/share/man –enable-delay-pools -enable-useragent-
log --enable-cachemgr-hostname=clayton –enable-arp-acl --enable-default-errlanguage="Portuguese" --enable-
underscores --disable-htcp –disable-internal-dns --enable-cachedigests
checking for a BSD-compatible install... /usr/bin/install -c checking
whether build environment is sane... yes checking for gawk... gawk
checking whether make sets $(MAKE)... yes
executables... checking for suffix of object files... o checking whether we are using the GNU
C compiler... yes checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking whether gcc and cc understand -c and -o together... yes
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking for pkg-config... /usr/bin/pkg-config
Store modules built: ufs
Removal policies built: lru
Delay pools enabled
User-Agent logging enabled
Cachemgr default hostname set to clayton
.
.
.
config.status: creating helpers/ntlm_auth/fakeauth/Makefile config.status: creating
helpers/ntlm_auth/mswin_sspi/Makefile10 config.status: creating
helpers/ntlm_auth/no_check/Makefile config.status: creating
helpers/ntlm_auth/SMB/Makefile config.status: creating
helpers/ntlm_auth/SMB/smbval/Makefile config.status: creating
helpers/negotiate_auth/Makefile config.status: creating
helpers/negotiate_auth/mswin_sspi/Makefile config.status: creating
helpers/external_acl/Makefile config.status: creating
helpers/external_acl/ip_user/Makefile config.status: creating
helpers/external_acl/ldap_group/Makefile config.status: creating
helpers/external_acl/mswin_lm_group/Makefile config.status: creating
helpers/external_acl/session/Makefile config.status: creating
helpers/external_acl/unix_group/Makefile config.status: creating
helpers/external_acl/wbinfo_group/Makefile config.status: creating tools/Makefile
config.status: creating include/autoconf.h config.status: executing depfiles
commands
if gcc -DHAVE_CONFIG_H -I. -I. -I../include -I../include -I../include -Wall -g -O2 -MT
Array.o -MD -MP -MF ".deps/Array.Tpo" -c -o Array.o Array.c; \ then mv -f ".deps/Array.Tpo" ".deps/Array.Po";
else rm -f ".deps/Array.Tpo"; exit 1; fi if gcc -DHAVE_CONFIG_H -I. -I. -I../include -I../include -I../include -
Wall -g -O2 -MT
base64.o -MD -MP -MF ".deps/base64.Tpo" -c -o base64.o base64.c; \ then mv -f ".deps/base64.Tpo"
".deps/base64.Po"; else rm -f ".deps/base64.Tpo"; exit
1; fi if gcc -DHAVE_CONFIG_H -I. -I. -I../include -I../include -I../include -Wall -g -O2 -MT getfullhostname.o -MD -
MP -MF ".deps/getfullhostname.Tpo" -c -o getfullhostname.o getfullhostname.c; \ then mv -f
".deps/getfullhostname.Tpo" ".deps/getfullhostname.Po"; else rm -f
".deps/getfullhostname.Tpo"; exit 1; fi if gcc -DHAVE_CONFIG_H -I. -I. -I../include -I../include -I../include -Wall -g
-O2 -MT
hash.o -MD -MP -MF ".deps/hash.Tpo" -c -o hash.o hash.c; \ then mv -f ".deps/hash.Tpo" ".deps/hash.Po"; else
rm -f ".deps/hash.Tpo"; exit 1; fi if gcc -DHAVE_CONFIG_H -I. -I. -I../include -I../include -I../include -Wall -
g -O2 -MT
heap.o -MD -MP -MF ".deps/heap.Tpo" -c -o heap.o heap.c; \ then mv -f ".deps/heap.Tpo" ".deps/heap.Po"; else
rm -f ".deps/heap.Tpo"; exit 1; fi if gcc -DHAVE_CONFIG_H -I. -I. -I../include -I../include -I../include -Wall -
g -O2 -MT
html_quote.o -MD -MP -MF ".deps/html_quote.Tpo" -c -o html_quote.o html_quote.c; \ then mv -f
".deps/html_quote.Tpo" ".deps/html_quote.Po"; else rm -f
".deps/html_quote.Tpo"; exit 1; fi if gcc -DHAVE_CONFIG_H -I. -I. -I../include -I../include -I../include -Wall -g -O2
-MT
iso3307.o -MD -MP -MF ".deps/iso3307.Tpo" -c -o iso3307.o iso3307.c; \ then mv -f ".deps/iso3307.Tpo"
".deps/iso3307.Po"; else rm -f ".deps/iso3307.Tpo";
exit 1; fi if gcc -DHAVE_CONFIG_H -I. -I. -I../include -I../include -I../include -Wall -g -O2 -MT
md5.o -MD -MP -MF ".deps/md5.Tpo" -c -o md5.o md5.c; \
.
.
.
gcc -Wall -g -O2 -g -o cachemgr.cgi cachemgr__CGIEXT_-cachemgr.o -L../lib
-lmiscutil -lm -lbsd -lnsl make[2]: Leaving directory `/root/squid-2.6.STABLE3-
20060916/tools' make[1]: Leaving directory `/root/squid-2.6.STABLE3-
20060916/tools' make[1]: Entering directory `/root/squid-2.6.STABLE3-20060916'
make[1]: Nada a ser feito para `all-am'. make[1]: Leaving directory `/root/squid-
2.6.STABLE3-20060916'
Caso todos os passos acima tenham sido executados com sucesso, parabéns, você acaba de compilar o
squid. Agora basta configurar o serviço e colocá-lo em ação!
Basicamente o processo de compilação se faz em três etapas. O ./configure, caso haja junto ao fonte, o
make e o make install. Nunca devemos esquecer das bibliotecas e requisitos necessários, a ausência delas te
tomará um bom tempo de trabalho e alguns erros.
Algo importante é lembrar da necessidade de informar ao ./configure o local onde serão colocados os
arquivos, caso contrário, será criada uma estrutura no /usr/local com o nome do pacote em uso. No caso de nosso
exemplo o squid.
30 Capítulo 1. Revisão de conceitos e comandos
multinucleados.
Em http://www.diolinux.com.br/2014/02/a-diferenca-entre-systemd-e-upstart.
html#sthash.mXaeIrZk.dpuf, o autor descreve que "o Systemd abandona o uso de scripts
para a inicialização mesmo que possa chamar scripts para iniciar serviços e tenta retirar dos
scripts a "inteligência"de verificação de dependências, transferindo-a para outras instâncias, como
o barramento D-Bus, o autofs e os sockets de rede. O paralelismo, portanto, alcança seu maior
grau possível, muitas vezes deixando a cargo de subsistemas do kernel o encaminhamento de sinais
que farão cada serviço ser iniciado.O systemd lança mão do recurso de cgroups para catalogar
de forma automática e inescapável os PIDs dos processos iniciados por cada serviço, e assim
consegue garantir que, ao parar determinado serviço, todos os processos que tenham sido iniciados
por ele sejam terminados."
Em https://www.freedesktop.org/wiki/Software/systemd/, o systemd é
descrito como "um conjunto de blocos de construção básicos para um sistema Linux. Ele fornece
um gerente de sistema e serviço que é executado como PID 1 e começa o resto do sistema. systemd
fornece capacidades de paralelização agressivos, usa soquete e ativação de D-Bus para os serviços
de partida, oferece partida sob demanda de daemons, mantém o controle de processos usando
grupos de controle, suporta snapshotting e restauração do estado do sistema, mantém pontos
e implementos de montagem e automount uma lógica baseada em dependência transacional
elaborada controle de serviço. systemd suporta SysV e LSB scripts de inicialização e funciona
como um substituto para sysvinit. Outras partes incluem um daemon de registro, utilitários para
controlar a configuração básica do sistema, como o nome da máquina, data, local, mantém uma
lista de usuários conectados e recipientes em execução e máquinas virtuais, contas do sistema,
diretórios de tempo de execução e definições, e daemons para gerenciar rede simples configuração,
sincronização de tempo de rede, encaminhamento e resolução de nomes de log."
De forma geral, o systemd cria containers de administração dos daemons. Dessa forma,
podemos observar bem o conceito aplicado quando exibimos o status de execução do sytemd, o
qual apresentará a cadeia de processos em execução através de uma árvore. Observe topo da árvore,
qual o primeiro processo apresentado ?
Veja na lista apresentada no Cap. 2 - página 60, o init é o primeiro processo e continua sendo o
pai de todos os demais processos. Fica claro também o uso dos containers para carga dos demais
processos.
32 Capítulo 1. Revisão de conceitos e comandos
Entendidos as sintaxes iniciais para o uso do systemctl, entender como escrever os arquivos
units será o próximo passo. A sintaxe de arquivos unit do Systemd é inspirada por arquivos XDG
Desktop Entry Specification .desktop, que são por sua vez inspirado por arquivos do Microsoft
Windows ini. Os arquivos unit são carregados a partir de dois locais, sendo, de menor para o maior
/usr/lib/systemd/system/ : unidades fornecidas pelos pacotes instalados e /etc/systemd/system/ :
unidades instaladas pelo administrador do sistema. Abaxio temos um exemplo de arquivo de
configuração.
[Unit]
Description=MyApp
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox1
ExecStartPre=-/usr/bin/docker rm busybox1
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "while
true; do echo Hello World; sleep 1; done"
[Install]
WantedBy=multi-user.target
[Unit]
Description=System Logging Service
#After=docker.service
Requires=syslog.socket
Documentation=man:rsyslogd(8)
Documentation=http://rsyslog.com/doc/
[Service]
Type=notify
#TimeoutStartSec=0
#ExecStartPre=-/usr/bin/docker kill busybox1
#ExecStartPre=-/usr/bin/docker rm busybox1
#ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/sbin/rsyslogd -n
StandardOutput=null
Restart=on-failure
[Install]
WantedBy=multi-user.target
Alias=syslog.service
Programa Descrição
logwatch Analisador de log com saída bonita escrito em Perl
analog Analisador de log do servidor web
awstats Analisador de logs de servidor web poderoso e cheio de funcionalidades
sarg Gerador de relatórios de análises do squid
pflogsumm Resumidor de entradas do relatório do Postfix
squidview monitoriza e analisa ficheiros access.log do squid
rsyslogd considerados por muitos como servidor de alta performance para tratamento de logs
O primeiro passo é entender como o serviço funciona, objetivando a facilidade para o processo
de gerenciamento do mesmo. Existem várias formas de se instalar o pacote do rsyslog e apesar de
já estar instalado por padrão no na versão adotada para este treinamento, vamos fazer uma breve
revisão para instalação do mesmo. Para isso adotaremos observaremos a documentação oficial do
projeto. Sendo assim, primeiro passo devemos instalar os pacotes de dependência e para isso, baixe
os arquivos abaixo.
34 Capítulo 1. Revisão de conceitos e comandos
Libestr: http://libestr.adiscon.com/download/
Libee: http://www.libee.org/download/
Rsyslog: http://http://www.rsyslog.com/download/
Configure os pacotes para instalação correta. Use o configure com os parâmetros –libdir=/usr/lib
–includedir=/usr/include. Após a configuração do pacote a instalação segue conforme demonstrado
no Item ?? Compilação e instalação de programas.
Assim como foi feito para os demais pacotes, apresentados anteriormente, precisamos configurar
o MAKEFILE. Para o RSYSLOG, vamos definir o prefixo usado para a instalação com o /usr;
Dessa maneira, teremos –prefix=/usr. As próximas etapas siga a instalação normal pelo processo
de compilação.
O arquivo de configuração padrão do serviço é o rsyslog.conf. Auxiliar a este arquivo, te-
remos o diretório rsyslog.d, o qual será chamado para complementação da configuração. Ao
analisarmos o arquivo de log, apresentado abaixo, as primeiras linhas configuram as instâncias de
módulos.
1.7 Estrutura de logs 35
#################
#### MODULES ####
#################
###########################
#### GLOBAL DIRECTIVES ####
###########################
#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
#
# Set the default permissions for all log files.
#
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog
#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
36 Capítulo 1. Revisão de conceitos e comandos
###############
#### RULES ####
###############
#
# First some standard log files. Log by facility.
#
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
#cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
#
# Logging for the mail system. Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info -/var/log/mail.info
mail.warn -/var/log/mail.warn
mail.err /var/log/mail.err
#
# Logging for INN news system.
#
news.crit /var/log/news/news.crit
news.err /var/log/news/news.err
news.notice -/var/log/news/news.notice
#
# Some "catch-all" log files.
#
*.=debug;\
auth,authpriv.none;\
news.none;mail.none -/var/log/debug
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none -/var/log/messages
#
# Emergencies are sent to everybody logged in.
#
*.emerg :omusrmsg:*
#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
1.7 Estrutura de logs 37
#daemon,mail.*;\
# news.=crit;news.=err;news.=notice;\
# *.=debug;*.=info;\
# *.=notice;*.=warn /dev/tty8
# The named pipe /dev/xconsole is for the `xconsole' utility. To use it,
# you must invoke `xconsole' with the `-file' option:
#
# $ xconsole -file /dev/xconsole [...]
#
# NOTE: adjust the list below, or you'll go crazy if you have a reasonably
# busy site..
#
daemon.*;mail.*;\
news.err;\
*.=debug;*.=info;\
*.=notice;*.=warn |/dev/xconsole
38 Capítulo 1. Revisão de conceitos e comandos
O arquivo está configurado para uso suportar o sistema local, para suporte ao kernel. Observe
que os módulos imudp e imtcp estão desabilitados, assim como as referências de portas usadas
para conexão, o caso InputTCPServerRun 514.
Estas duas linhas descrevem qual protocolo e porta será usado pelo servidor para receber os
logs dos clientes. Dessa forma, podemos habilitar uma das opções para que as conexões sejam
possíveis. Normalmente, os servidores estarão usando o protocolo tcp.
Depois dessa configuração, os diretórios e arquivos são criado, seus níveis de permissão e a
definição do diretório padrão do sistema.
$IncludeConfig /etc/rsyslog.d/*.conf inclui o diretório complementar e todos os arquivos nele
contidos. Resumidamente podemos então definir os parâmetros de configuração da seguinte forma:
Facilidades
auth : Mensagens de segurança/autorização
authpriv : Mensagens de segurança/autorização (privativas)
cron : Serviços de agendamento (cron e at)
daemon : Outros serviços do sistema que não possuem facilidades
ftp : Serviço de ftp do sistema
kern : Mensagens do kernel
lpr : Subsistema de impressão
local0-7 : Reservados para uso local
mail : Subsistema de e-mail
news : Subsistema de notícias da USENET
security : Sinônimo para a facilidade auth
rsyslog : Mensagens internas geradas pelo syslog
user : Mensagens genéricas de nível do usuário
uucp : Subsistema de UUCP
*: Confere com todas as facilidades
Níveis
emerg : O sistema está inutilizável
alert : Uma ação deve ser tomada imediatamente para resolver o problema
crit : Condições críticas
err : Condições de erro
warning : Condições de alerta
notice : Condição normal, mas significante
info : Mensagens informativas
debug : Mensagens de depuração
*: Confere com todos os níveis
none : Nenhuma prioridade
error : Sinônimo para o nível err
panic : Sinônimo para o nível emerg
warn : Sinônimo para o nível warning
Há duas formas básicas de armazenamento dos logs. A primeira, registrar tudo em arquivos
dentro do diretório /va/log e a segunda gravar em bancos de dados. Como trataremos da primeira
opção, é importante que possamos entender o mecanismo de logrotate.
=========================================logrotate.conf
=========================================logrotate.d/rsyslog
/var/log/syslog /var/log/auth.log
{ /var/log/user.log
rotate 7 /var/log/lpr.log
daily /var/log/cron.log
missingok /var/log/debug
notifempty /var/log/messages
delaycompress {
compress rotate 4
postrotate weekly
invoke-rc.d rsyslog rotate > missingok
/dev/null notifempty
endscript compress
} delaycompress
sharedscripts
/var/log/mail.info postrotate
/var/log/mail.warn invoke-rc.d rsyslog rotate >
/var/log/mail.err /dev/null
/var/log/mail.log endscript
/var/log/daemon.log }
/var/log/kern.log
40 Capítulo 1. Revisão de conceitos e comandos
De forma bem direta, esta é a configuração que trata da volaticidade dos arquivos de log. Nela
é possível definir quanto tempo os arquivos serão mantidos.
Outro aspecto muito comentado sobre segurança em sistema operacional GNU/Linux é o uso
do SUDO. A grande parte das distribuições possuem o SUDO instalado nativamente. Porém, nem
todas estão com o serviço está habilitado. Mas qual o motivo de usar o SUDO ?
Usamos para que um usuário comum possa ter privilégio de outros usuários. Interessante não ?
Pode ser que sim, mas há grandes chances de haver problemas. Por usarmos a senha do usuário
corrente para escalonar os privilégios. Então, se estiver logado com o usuário scooby e quiser
escalonar privilégio para root, basta que seja executado o comando sudo su. Pronto, privilégio
escalonado. Não há muito o que ser feito, já que poucos administradores possuem conhecimento
e mesmo disposição para configurar um bom arquivo sudoers. Vamos focar então em algumas
possibilidades para contornar essa situação e fortalecer (hardenizar) o sistema.
Dentre várias possibilidades existentes, tenho observado o desenvolvimento e o amadurecimento
do GRSECURITY.
Grsecurity R é uma extensa melhoria de segurança para o kernel do Linux que o defende
contra uma ampla gama de ameaças de segurança através de controle de acesso inteligente, previne
contra explorações baseadas em corrupção de memória, e uma série de outros mecanismos de
hardening do sistema que geralmente não requerem nenhuma configuração. Pouco pretensioso em
falar mas, segundo o site oficial do projeto, "Apenas grsecurity fornece proteção contra zero-day e
outras ameaças avançadas que toma um tempo valioso dos administradores enquanto correções
de vulnerabilidade fazem o seu caminho para fora em distribuições e testes de produção. Isto é
possível por nosso foco na eliminação de classes de bugs inteiros e explorar vetores, em vez de a
eliminação de status-quo das vulnerabilidades individuais.". Trocando em miúdos, grsecurity é um
conjunto de correções para o kernel do Linux , com ênfase ao reforço da segurança. Sua aplicação
típica é em servidores e sistemas que aceitam conexões remotas de locais não confiáveis, tais como
sistemas que oferecem web acesso shell para seus usuários.
Um ponto interessante do grsecurity é que ele fornece um completo controle de acesso baseado
1.8 Definições de segurança da informação e tratamento no SO 41
em função do sistema (RBAC). RBAC se destina a restringir o acesso ao sistema além do que
normalmente é fornecido pelo listas de controle de acesso do Unix, com o objetivo de criar um
sistema totalmente com menos privilégios, onde os usuários e processos têm os privilégios mínimos
absolutos para trabalhar corretamente e nada mais. Desta forma, se o sistema for comprometida,
a capacidade de o intruso danificar ou o ganho de informação sensível sobre o sistema pode ser
drasticamente reduzida. RBAC funciona através de uma coleção de "regras". Cada regra pode ter
restrições individuais sobre o que pode ou não pode fazer, e essas regras e restrições formam uma
"política"que pode ser alterado conforme necessário.
Outro ponto é o tratamento do chroot. O grsecurity restringe chroot em uma variedade de
maneiras de prevenir uma variedade de vulnerabilidades, ataques de elevação de privilégios, e para
adicionar checagens adicionais. Dentre as modificações, podemos citar o não anexar memória
compartilhada fora do chroot e a negação do ptrace fora do chroot (independente de arquitetura).
Além disso, também reforçada a auditoria para o kernel Linux. Ele pode ser configurado para
auditar um grupo específico de usuários, auditoria montagens e desmontagens de dispositivos,
muda a hora e a data do sistema, chdir logging, entre outras coisas. Algumas dessas outras coisas
permite que o administrador também registre tentativas de recurso negadas, tentativas falhas de
fork e exec login com argumentos. Falando um pouco de fork, algo pouco conhecido pela maioria
dos administradores do sistema, faça o exercício abaixo e vamos debater um pouco.
Exercise 1.3 Execute a linha abaixo e debata sobre o resultado.
$ :(){ :|:& };:
Caminho confiável de execução é outra característica opcional que pode ser usado para impedir
que os usuários executam binários que não são de propriedade da raiz do usuário, ou que são
graváveis. Isso é útil para evitar que os usuários executem seus próprios binários maliciosos ou
acidentalmente executar binários do sistema que poderiam ter sido modificados por um utilizador
mal intencionado (sendo graváveis). Outro ponto é o hardening do caminho chroot trabalhando
com prisões. A jaula pode ser utilizada para isolar um processo em particular a partir do resto do
sistema, podendo minimizar o dano potencial para o serviço comprometido. No entanto, existem
maneiras de "romper"uma jaula. Dessa forma, grsecurity tenta evitar isso.
Caminho confiável ou canal confiável - é um mecanismo que fornece confiança de que o usuário
está se comunicando com o que destina-se a comunicar, garantindo que os atacantes não podem
interceptar ou modificar qualquer informação que está sendo comunicado.
Há também outros recursos que aumentam a segurança e impedem que os usuários adquiram
conhecimentos desnecessária sobre o sistema, como restringir os comandos dmesg e netstat para o
usuário root. Por fim, podemos listar alguns recursos adicionais, sendo:
a) Restrilções ao /proc para previnir vazamento de informações sobre proprietários de processos
b) Restrições aos links simbólicos e hardlink do / para prevenir execuções no /tmp
c) Restrições à hardlink para impedir que usuários acessem aos links físicos para arquivos que
não possuem
d) Restrições para nomeado ao FIFO / pipe
e) Restrições ao dmesg
f) Implementação aprimorada de Execução Caminho Confiável
g) Restrições de soquete com base em grupos
Para demonstrar um pouco de como as regras são criadas, veja o exemplo abaixo.
define objset1 {
/root/blah rw
/root/blah2 r
/root/blah3 x
42 Capítulo 1. Revisão de conceitos e comandos
define somename2 {
/root/test1 rw
/root/blah2 rw
/root/test3 h
}
Por fim, para que possamos entender o que está escrito acima, seguem as flags que podem ser
usadas para criação das políticas do grsecurity.
—————————————————————————————-
2. Material Complementar
44 Capítulo 2. Material Complementar
Capítulo 2 - Dispositivos de
armazenamento e estrutura de diretórios.
Antes de pensarmos em fazer qualquer tipo de interação junto ao sistema,
precisamos nos localizar. Duas informações são imprescindíveis:
1. Onde ficam armazenados os arquivos do sistema e para que serve cada
diretório do sistema;
2. Como podemos usar os dispositivos de armazenamento.
É muito comum que já se comece um material sobre sistema, instalando o mesmo.
Porém, vamos primeiro abordar a organização dos dados e dispositivos de
armazenamentos, haja vista que para instalarmos precisamos saber onde e como colocar
as informações no sistema.
Analisando de outra forma, como poderemos projetar nosso sistema para que os
serviços nele instalado sejam estáveis e confiáveis se não soubermos onde e como
organizar os arquivos ?
Imagine instalar um servidor DHCP, um servidor SAMBA e uma estação de
trabalho. Você seria capaz de descrever como seria organizado o sistema para que todas
as instalações fossem bem sucedidas ?
Não podemos pensar em ter a mesma organização para os três exemplos citados
anteriormente, haja visto que cada perfil terá características próprias.
Em grande parte dos materiais, encontraremos descrito que precisamos apenas de
duas partições para instalarmos o sistema. Uma seria descrita como swap e outra como /.
Não deixa de ser verdade. Para instalações menos criteriosas termos apenas duas
partições bastam. Mas se pensarmos em sistemas de produção, realmente teremos
problemas com essa estrutura.
Para cada instalação, o que determinará toda a estrutura do sistema será o conjunto
de aplicações que serão instalados. Não podemos pensar, por exemplo, em estruturas
iguais para uma instalação voltada de uma estação de trabalho e uma máquina que
iremos usar como servidor SAMBA. Cada perfil irá requerer uma organização própria dos
dispositivos de armazenamento.
Nesse capítulo, abordaremos aspectos relacionados a estrutura de diretórios,
organização dos dispositivos de armazenamento, suas limitações e como projetar a
instalação do GNU/Linux.
Estrutura de diretórios.
Algo que intriga a muitos iniciantes no GNU/Linux é a organização dos arquivos. O
fato de todo e qualquer arquivo estar submetido a um único ponto, o diretório /
(root), torna o entendimento da organização de arquivos um tanto confusa para muitos.
Em primeiro lugar, não devemos confundir o diretório / (root) com o diretório do usuário
root, o qual está localizado em /root (observe que ele é um sub-diretório do
diretório principal /), é comum esse tipo de confusão.
Outro detalhe que devemos observar aqui, é que cada diretório do sistema
GNU/Linux tem um papel específico. Conhecer a função de cada diretório é fundamental
para as tarefas administrativas.
É comum ouvirmos iniciantes reclamando que não sabem para onde foram as
aplicações instaladas no sistema e perderem um bom tempo para achar e identificar qual
o arquivo deverá ser usado. O primeiro passo para se ter uma vida mais tranqüila
no sistema é conhecer a estrutura a estrutura de diretórios. Dado o primeiro
passo, os outros serão bem mais simples.
Vamos ver um pouco da organização dos diretórios, veja o Mapa 3.1
Outro fato que chama a atenção e provoca sérios transtornos de entendimento para
novos administradores é a ausência de estruturas independentes de diretórios. Todos os
discos estarão “montados” em um diretório, abaixo do /. Em sistemas como o Windows,
cada partição terá uma estrutura de diretórios própria e será apresentada de forma
independente. No GNU/Linux isso não acontece.
No exemplo acima, temos um sistema IDE padrão sendo usado. Os dispositivos hda e
hdb têm partições primárias e lógicas, sendo que no primeiro, esgotamos as possibilidades
de partições primárias para iniciarmos as lógicas. No segundo, temos 3 partições primárias
e cinco partições lógicas.
Importante notar a nomenclatura das partições, observe que as partições lógicas
sempre iniciam com o identificador numérico 5. Os demais discos tem apenas partições
primárias.
Falamos em partes de discos, em organização “física” dos dispositivos. Além de
definir em quantas partes estará dividido o dispositivo é importante entender os tipos de
file-system, afinal é ele quem organizará os dados para que possamos acessar.
Considerando que memória RAM era mais valiosa que ouro, esse cálculo foi meio
abandonado quando o volume de memória RAM chegou aos patamares de 512 Megas.
Em sistemas normais, mais que 512 Megas de Swap é realmente desnecessário. Hoje
em dia, algumas literaturas indicam valores entre 256 a 512 MB, para sistemas com mais
de 512 de RAM, porém, na prática, o que determinará o quanto de SWAP deverá ser
instalado no sistema são as aplicações e necessidades impostas pelo cenário a ser
desenvolvido. Por isso, entendermos os motivos que nos levará a instalação de uma
máquina com o sistema GNU/Linux é fundamental.
Observe na figura acima que a partição estendida aparece destacada, veja ao lado
direito a descrição Extended e logo abaixo dela está a partição lógica.
Com a comando “m” teremos o help do fdisk, aqui encontraremos as opções para
uso do fdisk. Algumas opção serão apresentadas apenas no menu de uso avançado do
fdisk. Para acesso aos recursos avançados digite o comando “x” e em seguida o comando
“m”.
Muito cuidado ao usar o fdisk, para garantias de que o que foi feito realmente era a
ação desejada, sempre use o comando “p”, assim você acompanhará todo o processo.
Caso tenha dúvidas do que fazer, o comando “q” sempre será bem-vindo. Com ele
sairemos do prompt do fdisk sem salvar as alterações. Veja um exemplo na Fig 3.6
Faça o mesmo com as outras partições que deseja apagar, uma a uma.
Criaremos agora a nova partição. Para isso, usaremos o comando “n“. Algumas
informações serão solicitadas. Veja que no exemplo abaixo. O primeiro passo é definirmos
se a partição será ou não primária.
Em seguida, informamos o número da partição, defina o bloco inicial da partição.
Caso não saiba qual será o bloco inicial, use o valor definido pelo sistema. Por fim, informe
o tamanho da partição, exatamente como demonstrado no exemplo. Note que existe um
sinal + antes do tamanho e a letra M para determinarmos que o tamanho será em Megas.
comando “t “.
Será solicitado o número de uma partição, e em seguida o código do tipo do file
system. Com a opção “L“ teremos a lista de todos os file system suportados. Identifique o
file system que irá usar na partição e digite o código hexadecimal que está descrito ao
lado esquerdo da descrição na tabela apresentada.
Tendo uma visão geral do processo teremos. . .
Repita essa etapa para cada partição criada, assim, não teremos surpresas
desagradáveis nas próximas etapas do processo. Usando o comando “w“, salve e saia do
fdisk.
Para que todas as alterações sejam válidas, é interessante reiniciar o sistema.
Sistema reiniciado, vamos ao processo de formatação das partições criadas.
Instalação do GNU/LINUX
Partiremos agora para instalação do GNU/Linux. Usaremos o padrão de instalação
gráfica, por questões didáticas. Não usarei aqui nenhuma instrução avançada para a
instalação apesar de criar as partições e formatar os discos usando o fdisk para dar uma
base de como seria o preparo para instalação no slackware, por exemplo.
Detalhar cada processo de forma muito minuciosa, seria realmente complicado haja
vista que venho dizendo desde o início que para determinarmos uma organização para a
instalação precisamos entender as necessidades do ambiente a ser configurado. Por isso,
resolvi usar minhas aulas para discutirmos um pouco mais sobre o assunto, e acredite,
falamos muito sobre isso.
Para demonstrar a instalação, usaremos o Fedora como modelo. Respeitando as
características de cada distribuição, o processo é basicamente o mesmo. Vamos ao
processo de instalação.
Creio que seja interessante conhecer o equipamento que será usado, para poder
determinar características mais específicas ao sistema.
Pacotes RPM
Criado pela Red Hat, o Red Hat Package Manager (rpm) é o mais popular de todos os
gerenciadores de pacotes. Usá-lo é bem simples e um grande número de distribuições
adotou – o como sendo o gerenciador de pacotes. Dentre outras informações, temos nos
pacotes rpm:
O RPM também vem sendo criticado pela falta de consistência no nome e conteúdo
dos pacotes, o que pode dificultar o manejo automático de dependências. Entretanto, este
problema não ocorre apenas no formato RPM, mas é um problema na maioria das
distribuições que usam os pacotes RPM tais como o Red Hat, SuSE e Mandrake (Mandriva)
Linux.
Base de dados RPM
Atrás do gerenciador de pacotes está o banco de dados rpm. Ele consiste de uma
lista duplamente ligada que contêm todas as informações de todos os rpm instalados. O
banco da dados lista todos os arquivos que são criados ou modificados quando um usuário
instala um programa e facilita a remoção destes mesmos arquivos. Se o banco de dados
fica corrompido (o que acontece facilmente se o cliente de rpm é fechado subitamente), as
ligações duplas garantem que eles possa ser reconstruído sem nenhum problema. No
computadores com o sistema operacional RedHat instalado, este banco da dados se
encontra em /var/lib/rpm.
Agora que fomos apresentados aos pacotes rpm, vamos entender o comando rpm.
RPM
Descrição: RPM Gerenciador de Pacotes .rpm
Opções Descrição
Opções Gerais
--quiet Normalmente somente as mensagens de erro
serão apresentadas.
-v Mostra o detalhamento da execução do
comando.
-vv Imprime informações de debug da execução do
comando.
--rcfile FILELIST Informações de configuração de instalação do
pacote RPM. O padrão é ter as informações
separadas por dois pontos como no exemplo.
/usr/lib/rpm/rpmrc:/usr/lib/rpm/redhat/rpmrc:/etc/r
pmrc:~/.rpmrc.
--dbpath DIRECTORY Informa o caminho para a base RPM,
normalmente em /var/lib/rpm
--root DIRECTORY Informa o diretório usado, no qual encontraremos
a base para verificação de dependências dos
pacotes.
Opções de Instalação e upgrade
--aid Adiciona pacotes ajustando as necessidades de
operação.
--allfiles Instala ou atualiza todos os arquivos do pacote
mesmo que existam.
--excludedocs Não instala arquivo de manuais.
--force O mesmo que --replacepkgs, --replacefiles, e –
oldpackage.
Opções Descrição
-h, --hash Imprime o hash durante o processo de
instalação. Usado pelo modo verbose para
acompanhamento do processo.
--ignoresize Não checa se há espaços para instalação do
pacote.
--ignorearch Permite a instalação de pacotes mesmo se a
arquitetura dos binários e da máquina não sejam
combinantes.
--ignoreos Permite a instalação ou atualização de pacotes
mesmo que o sistema operacional dos binários e
do pacote não forem combinantes.
--includedocs Instala a documentação do pacote.
--justdb Atualiza o banco de pacotes mas não o sistema.
--nodigest Não verifica cabeçalhos do pacote ao ler.
--nosignature Não verifica assinaturas de cabeçalhos de
pacotes.
--nodeps Não verifica dependências após instalação ou
atualização de pacotes.
--noorder Não reordena os pacotes para a instalação. A
lista de pacotes normalmente será reordenada
para satisfazer dependências.
--prefix NEWPATH Redefine o caminho caminha dos pacotes no
processo de instalação.
--test Não instala os pacotes, apenas checa o nível de
conflito do mesmo.
ERASE OPTIONS
--allmatches Remove todas as versões de um pacote. Em caso
de múltiplos pacotes, uma mensagem de erro é
exibida.
--nodeps Não checa dependências na desinstalação de um
pacote.
QUERY OPTIONS
--qf|--queryformat QUERYFMT
-a, --all Pesquisa por todos os pacotes instalados.
-f, --file FILE Pesquisa pelos arquivos de um pacote instalado.
PACKAGE QUERY OPTIONS:
-c, --configfiles Lista somente os arquivos de configuração de um
pacote.
-d, --docfiles Lista somente os arquivo de manuais de um
pacote.
--filesbypkg Lista todos os arquivos relacionados a um
pacote.
-i, --info Lista informações do pacote.
Opções Descrição
--last Ordena a exibição dos pacotes, mostrando quais
foram os últimos instalados aos primeiros.
-l, --list Lista todos os arquivo de um pacote.
-R, --requires Lista as dependências de um pacote.
--scripts Lista os scripts usados na instalação e
desinstalação de um pacote.
-s, --state Mostra informações dos arquivos de um pacote,
informando se o mesmo está instalado,
desinstalado ou reinstalado.
Tabela 1– Detalhamento de Opções do comando rpm
Exemplos:
#rpm -qial samba
#rpm -ivh samba-3.0.9-1.i386.rpm
#rpm -e samba*.rpm
Pacotes DEB
Um outro padrão de pacotes existente no mundo linux é o desenvolvido pela
distribuição DEBIAN, os famosos pacotes .deb. Estudaremos nesse capítulo o comando
dpkg .
O primeiro passo que daremos será a localização das informações dos pacotes. O
dpkg mantém as informações basicamente em dois arquivos, /var/lib/dpkg/avliable e
/usr/lib/dpkg/status. O primeiro possui a lista de pacotes disponíveis e o segundo o status
dos pacotes.
DPKG
Descrição: Debian Gerenciador de Pacotes .deb
Opções Descrição
-E Não substitui um pacote de mesma
versão.
-G Sobrescreve um pacote existente, mesmo
de versões antigas.
-R Processa um conjunto de pacotes dentro
de um diretório.
-i Instala um pacote
-l Usa a chave de busca para lista os
pacotes que contenham referência a essa
chave.
-L Lista os arquivos instalados por um pacote
--print-avail nomepacote Lista um conjunto de informações
relacionadas ao pacote
Opções Descrição
--purge Remove todo o pacote
-r Remove todos os arquivos do pacote
menos os de configuração
-s Mostra o status do pacote
-S Procura por um arquivo nos pacotes
instalados.
--unpack Desempacota um pacote, porém não
instala
--configure Configura um pacote não instalado.
Tabela 5.1 – Detalhamento de Opções do comando dpkg
Exemplos:
#dpkg -s samba
#dpkg -i samba*.deb
#dpkg –purge samba
#dpkg -r samba
● linux2
State: running
Jobs: 0 queued
Failed: 0 units
Since: Dom 2016-03-27 02:57:18 BRT; 7h ago
CGroup: /
├─1 /sbin/init
├─system.slice
│ ├─avahi-daemon.service
│ │ ├─431 avahi-daemon: running [linux2.local
│ │ └─507 avahi-daemon: chroot helpe
│ ├─dbus.service
│ │ └─432 /usr/bin/dbus-daemon --system --address=systemd: --nofork
--nopidfile --systemd-activation
│ ├─ModemManager.service
│ │ └─420 /usr/sbin/ModemManager
│ ├─cron.service
│ │ └─415 /usr/sbin/cron -f
│ ├─nfs-common.service
│ │ ├─398 /sbin/rpc.statd
│ │ └─412 /usr/sbin/rpc.idmapd
│ ├─exim4.service
│ │ └─751 /usr/sbin/exim4 -bd -q30m
│ ├─wpa_supplicant.service
│ │ └─1339 /sbin/wpa_supplicant -u -s -O /run/wpa_supplicant
│ ├─aolserver4.service
│ │ └─508 /usr/sbin/aolserver4-nsd -u www-data -g www-data -b
127.0.0.1:80 -s main -t /etc/aolserver4/aolserver4.tcl
│ ├─accounts-daemon.service
│ │ └─1329 /usr/lib/accountsservice/accounts-daemon
│ ├─colord.service
│ │ └─1284 /usr/lib/colord/colord
│ ├─atd.service
│ │ └─418 /usr/sbin/atd -f
│ ├─systemd-journald.service
│ │ └─135 /lib/systemd/systemd-journald
│ ├─minissdpd.service
│ │ └─464 /usr/sbin/minissdpd -i 0.0.0.0
│ ├─udisks2.service
│ │ └─1249 /usr/lib/udisks2/udisksd --no-debug
│ ├─upower.service
│ │ └─1220 /usr/lib/upower/upowerd
│ ├─systemd-timesyncd.service
│ │ └─389 /lib/systemd/systemd-timesyncd
│ ├─packagekit.service
│ │ └─1288 /usr/lib/packagekit/packagekitd
│ ├─ssh.service
│ │ └─416 /usr/sbin/sshd -D
│ ├─systemd-logind.service
│ │ └─430 /lib/systemd/systemd-logind
│ ├─system-getty.slice
│ │ └─getty@tty2.service
│ │ └─1385 /sbin/agetty --noclear tty2 linux
│ ├─systemd-udevd.service
│ │ └─147 /lib/systemd/systemd-udevd
│ ├─polkitd.service
│ │ └─727 /usr/lib/policykit-1/polkitd --no-debug
│ ├─rpcbind.service
│ │ └─383 /sbin/rpcbind -w
│ ├─NetworkManager.service
│ │ ├─419 /usr/sbin/NetworkManager --no-daemon
│ │ └─921 /sbin/dhclient -d -q -sf /usr/lib/NetworkManager/nm-dhcp-
helper -pf /var/run/dhclient-eth0.pid -lf /var/lib/NetworkManager/dhclient-
3136dc59-0d3c-4713-ae09-f120fb79112a-eth0.lease -cf
2.2 RPM e DEB 61
/var/lib/NetworkManager/dhclient-eth0.conf eth0
│ ├─rsyslog.service
│ │ └─713 /usr/sbin/rsyslogd -n
│ └─acpid.service
│ └─716 /usr/sbin/acpid
└─user.slice
└─user-0.slice
├─session-1.scope
│ ├─ 723 /bin/login --
│ ├─ 843 -bash
│ ├─1114 /bin/sh /usr/bin/startx
│ ├─1136 xinit /etc/X11/xinit/xinitrc -- /etc/X11/xinit/xserverrc
:0 vt1 -auth /tmp/serverauth.QQRjMK0DS3
│ ├─1137 /usr/bin/X -nolisten tcp :0 vt1 -auth
/tmp/serverauth.QQRjMK0DS3
│ ├─1144 x-session-manager
│ ├─1175 /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-
session x-session-manager
│ ├─1178 /usr/bin/dbus-launch --exit-with-session x-session-
manager
│ ├─1180 /usr/bin/dbus-daemon --fork --print-pid 5 --print-
address 7 --session
│ ├─1183 /usr/lib/at-spi2-core/at-spi-bus-launcher
│ ├─1187 /usr/bin/dbus-daemon --config-file=/etc/at-
spi2/accessibility.conf --nofork --print-address 3
│ ├─1190 /usr/lib/at-spi2-core/at-spi2-registryd --use-gnome-
session
│ ├─1201 /usr/lib/gnome-settings-daemon/gnome-settings-daemon
│ ├─1206 /usr/bin/gnome-keyring-daemon --start --components=ssh
│ ├─1219 /usr/bin/pulseaudio --start
│ ├─1232 /usr/lib/gvfs/gvfsd
│ ├─1234 /bin/sh /usr/bin/start-pulseaudio-x11
│ ├─1236 /usr/bin/xprop -root -spy
│ ├─1240 /usr/lib/gvfs/gvfsd-fuse /run/user/0/gvfs -f -o
big_writes
│ ├─1247 /usr/lib/gvfs/gvfs-udisks2-volume-monitor
│ ├─1258 /usr/lib/gvfs/gvfs-gphoto2-volume-monitor
│ ├─1262 /usr/lib/gvfs/gvfs-mtp-volume-monitor
│ ├─1266 /usr/lib/gvfs/gvfs-goa-volume-monitor
│ ├─1269 /usr/lib/gnome-online-accounts/goa-daemon
│ ├─1276 /usr/lib/telepathy/mission-control-5
│ ├─1278 /usr/lib/gvfs/gvfs-afc-volume-monitor
│ ├─1283 /usr/bin/gnome-shell
│ ├─1301 /usr/lib/gnome-settings-daemon/gsd-printer
│ ├─1317 /usr/lib/gnome-shell/gnome-shell-calendar-server
│ ├─1321 /usr/lib/evolution/evolution-source-registry
│ ├─1340 zeitgeist-datahub
│ ├─1343 nm-applet
│ ├─1346 /usr/lib/tracker/tracker-store
│ ├─1350 /usr/bin/zeitgeist-daemon
│ ├─1351 /usr/lib/tracker/tracker-miner-fs
│ ├─1352 /usr/lib/tracker/tracker-miner-apps
│ ├─1358 /usr/lib/evolution/3.12/evolution-alarm-notify
│ ├─1364 /usr/lib/evolution/evolution-calendar-factory
│ ├─1365 /usr/lib/tracker/tracker-miner-user-guides
│ ├─1367 /usr/lib/tracker/tracker-extract
│ ├─1371 /usr/lib/i386-linux-gnu/gconf/gconfd-2
│ ├─1372 /usr/bin/python /usr/share/system-config-
printer/applet.py
│ ├─1377 /usr/lib/i386-linux-gnu/zeitgeist-fts
│ ├─1399 /bin/cat
│ ├─1488 /usr/bin/nautilus --gapplication-service
│ ├─1494 /usr/lib/gvfs/gvfsd-trash --spawner :1.11
/org/gtk/gvfs/exec_spaw/0
62 Capítulo 2. Material Complementar
2.3 Bootstraping
43
Após a etapa de boot da máquina, que é iniciado pela BIOS, o primeiro mecanismo
de interação que teremos junto ao sistema é o Boot Loader. No GNU/Linux temos dois Boot
Loaders, o GRUB ( GRand Unifying Bootloader ) e o LILO ( LInux LOader ). É de
responsabilidade dele fazer a chamada do kernel do sistema, por isso, se faz necessário o
entendimento do Boot Loader para um administrador de sistema.
Partiremos do GRUB.
#vim /boot/grub/grub.conf
diretório /boot/grub.
As opções mais usadas com o grub-install são :
--root-directory=DIR (Instala a imagem do GRUB em diretório que não seja o
raiz)
--recheck (Checa o arquivo /boot/grub/device.map. Útil quando retiramos ou
acrescentamos um novo disco no sistema)
O LILO foi o primeiro Bootloader usado pelas distribuições GNU/Linux. Por ser grande
para caber no setor de boot ou na MBR, o LILO foi dividido em duas partes.
A primeira é o motor de arranque e está na MBR ou setor de boot, sendo que a
segunda é a responsável pela interação com o usuário. Um dos aspectos mais
importantes do lilo é a configuração do mesmo. Vamos analisar o arquivo /etc/lilo.conf
boot=/dev/hda (Aqui definimos de qual disco será usado o setor de boot
do sistema)
map=/boot/map (Arquivos de mapas. Por padrão /boot/map)
install=/boot/boot.b (Arquivo de setor de boot)
prompt (Disponibiliza ao usuário um prompt de interação com o
LILO)
timeout=50 (Define o tempo de espera antes de iniciar o sistema)
image=/boot/vmlinuz (Caminho completo para a imagem que será carregada)
label=Linux (Nome de identificação da imagem)
root=/dev/hdb1 (Partição que deverá ser montada como root)
read−only (Apenas Leitura)
Para que possamos ter as alterações disponíveis no próximo boot do sistema, é
necessário usar a aplicação /sbin/lilo.
Uma variedade de distribuições agora passará usar o systemd, ao invés de sysvinit. O último dos
três grandes sistemas de inicialização promete acelerar a inicialização e não requer configuração
de dependência entre serviço de sistema explícito; como um efeito secundário, também elimina
algumas particularidades específicas da distribuição.
A seguinte descrição das ideias por trás da abordagem systemd foi publicado na revista alemã
c't 13/11e foi replicado em vários lugares antes de aparecer em The H Abrir.
Systemd também lida com várias tarefas que antes eram realizadas usando scripts específicos
de distribuição; como um efeito colateral, isso elimina várias diferenças de interface de usuário
e de configuração entre distribuições. Várias distribuições já usam systemd: Fedora (desde a
versão 15), o openSUSE 12.1 e Mandriva 2011; Mageia irá mudar com a versão 2. Systemd
também está incluído como uma opção no Arch Linux, Gentoo e Debian Testing; os
desenvolvedores de várias outras distribuições estão discutindo se a oferecê-lo como uma
opção ou mudar completamente.
Tarefas
Desde os primeiros dias do Unix, o processo init tem desempenhado um papel especial dentro
do sistema operacional porque ele é o primeiro processo a ser gerado pelo kernel. Todos os
outros processos são processos filhos do processo de inicialização, o que, por causa de sua
posição especial, é responsável pela configuração do userland. Isso inclui implementar os
sistemas de arquivos que são necessários para a operação do sistema e configurar a rede, bem
como o lançamento dos serviços e programas que são executados em segundo plano - incluindo
aqueles que permitem aos usuários fazer login no sistema.
Uma vez que o sistema está configurado, o processo init permanece no fundo, principalmente
em um estado ocioso. Ele se comunica com o kernel e serão informados de eventos como um
usuário pressionar Ctrl + Alt + Del. Assim como quando os usuários chamam comandos como
shutdown -r agora ou reinicialização, o número do processo 1 vai então iniciar tudo o que é
necessário para desligar corretamente o sistema.
Em Unix System V na década de 1980, essas tarefas foram tratadas pelo "sistema de inicialização
System V" simples, mas flexível. Na década de 1990, os desenvolvedores criaram uma nova
implementação deste sistema de inicialização e chamou-lhe sysvinit. A nova implementação
opera com lógica muito semelhantes e ainda é utilizado na maioria das distribuições hoje. No
entanto, o aumento do uso de Linux em dispositivos móveis, em PCs desktop, em TVs e em
muitos outros domínios mudou os requisitos para o processo init.
Abordagens
70 Capítulo 2. Material Complementar
Por um longo tempo, parecia que o sistema Upstart, um projeto que foi iniciado por um
desenvolvedor Canonical em 2006, seria o sucessor designado ao sysvinit de envelhecimento.
Inicialmente, ele só foi utilizado no Ubuntu, mas mais tarde também se tornou parte do Fedora
(versões 9 a 14) e Red Hat Enterprise Linux (família RHEL6). OpenSUSE experimentou com
Upstart ao desenvolver a versão 11.3, mas decidiu ficar com sysvinit naquela época. Upstart é
um sistema de inicialização orientada para o evento - que pode começar serviços em caso de
eventos como "rede está configurada" ou "dispositivo de rede está montada". A sua abordagem
é muito diferente da de SysV-init, e configurações existentes pode, portanto, só pode ser
migrado para modelo orientado a eventos do Upstart com grande dificuldade, se em tudo.
Systemd foi lançado em Abril de 2010; adota várias ideias de sistemas de inicialização anteriores
e combina-los com uma configuração uniforme e interface de administração. Systemd opera
como um serviço de fundo (daemon) e controla as tarefas de configuração do sistema
importantes, incluindo a inicialização do hardware e o início de processos do servidor. Os
desenvolvedores pensaram que seu nome é, adequadamente, uma reminiscência do termo
francês "système D", uma expressão que se refere a "pensar em seus pés" e descreve as
habilidades de resolução de problemas técnicos de alta velocidade, tais como aqueles indicados
pela ação TV herói MacGyver.
O caminho de volta
Uma característica do systemd é a sua ativação soquete, o que lhe permite iniciar serviços de
fundo em paralelo sem especificar explicitamente as dependências assim que o sistema básico
está configurado e os sistemas de arquivos locais foram montados. O aspecto inteligente é que
systemd própria cria as bases que são usados como vias de comunicação para os serviços que
estão a ser lançado, e depois entrega as tomadas ao longo dos serviços, enquanto o lançamento.
Os serviços de syslog e D-Bus são bons exemplos para ilustrar este conceito. Quando é iniciado,
D-Bus conecta à tomada de /dev/log eo usa para se comunicar com o daemon de log para que
este daemon pode escrever de status e mensagens de erro para o log do sistema, se necessário.
Portanto, as distribuições SysV-init única lançar D-Bus uma vez que o serviço de syslog é
totalmente funcional.
Systemd, por outro lado, cria /dev/log e, em seguida, lança Syslog e D-Bus, ao mesmo tempo;
todos os dados enviados para /dev/log por D-Bus antes Syslog está pronto será enviado a um
buffer. Originalmente, Systemd deixar o buffer alça do kernel; em versões Systemd atuais, o
"Journal" incluído log recurso cuida dessa tarefa.
Isso permite que systemd para iniciar Bluetooth, Avahi e outros serviços que se comunicam com
o daemon de log ou D-Bus, ao mesmo tempo que Syslog e D-Bus. Quando Avahi espera uma
resposta D-Bus, o processo para automaticamente naquele ponto e prontamente retomado
assim que a resposta chega da tomada. Deve D-Bus falhar ao iniciar, por qualquer motivo,
systemd aborta o início de Bluetooth e Avahi depois de algum tempo.
Apple usa o mesmo princípio no launchd, que foi introduzido com o Mac OS X 10.4 e também
faz parte do iOS; o sistema de inicialização é pensado para ser a principal razão para os tempos
de partida significativamente mais rápidos das últimas versões do Mac OS, por causa do
lançamento de serviços em paralelo faz uso mais eficiente da CPU disponível e E / S recursos.
Em distribuições típicas SysV-init, por outro lado, os serviços são lançados em uma ordem fixa -
Bluetooth e Avahi só são lançados uma vez D-Bus, que é iniciado após Syslog, está instalado e
funcionando. Mesmo o Bluetooth co-dependente e Avahi só começam em paralelo em poucas
2.4 Control Centre: The systemd Linux init system 71
distribuições SysV-init, por exemplo, em algumas versões do Debian e SUSE. Os distribuidores
especificar as informações de dependência exigida nos cabeçalhos dos scripts de inicialização.
Sob demanda
Desde systemd cria e mantém o soquete, pode relançar um serviço caiu sem causar os
programas que estão conectados à tomada de perder suas conexões. Isto torna mais fácil para
atualizar os componentes do sistema, porque o kernel vai tamponar o cliente solicita que recebe
da tomada durante a reinicialização, que simplesmente permite que o novo serviço para
assumir, onde o antigo parou.
Sockets também pode ser submetido a vários programas. Systemd usa esta opção para registrar
mensagens de status, mesmo antes do sistema de arquivos raiz foi montado como gravável.
Para este efeito, ele começa um serviço de log mínimo no início do processo de inicialização;
este serviço, em seguida, simplesmente grava todas as mensagens para o buffer de log do
kernel. O serviço mínimo é necessário porque os programas só podem enviar mensagens, se
algo está escutando em /dev/log; o mini serviço será encerrado assim que o servidor Syslog real
está pronto para arrancar. O servidor Syslog assume o soquete e escreve todas previamente
submetidas mensagens do buffer de log do kernel para o disco rígido; nenhuma mensagem será
perdida, o que permite que os sistemas para registrar eventos desde o primeiro momento eles
começam a arrancar.
Unidades
Systemd reconhece o tipo de unidade pelo nome do arquivo da unidade. Arquivos que terminam
em .serviço criar unidades de serviço; eles lidam com serviços que as distribuições SysV baseada-
init normalmente iniciar ou terminar usando scripts de inicialização. Unidades para montar e
desmontar sistemas de arquivos terminam em .mount; o sufixo será .automount se o montador,
um componente que se monta automaticamente sistemas de ficheiros em resposta a operações
de acesso, está envolvido. Unidades que terminam em .Path permitir systemd para monitorar
os arquivos e diretórios que são especificados no arquivo unidade através inotify; quando um
acesso acontece nesse caminho, systemd começará a unidade apropriada.
Arquivos de unidade que terminam em .socket criar um ou mais soquetes para ativação do
soquete. No entanto, eles realmente não iniciar os serviços relacionados; isto irá ser feito por
uma unidade de serviço que está associado com a unidade de suportes fêmea. Quando um
72 Capítulo 2. Material Complementar
pedido de ligação é recebido, systemd inicia o serviço que é definido lá, submetendo os sockets
abertos - de uma forma semelhante ao que veteranos Unix / Linux sabe de inetd.
Os arquivos da unidade que estão associados com systemd e os serviços estão localizados no /
lib / systemd / system / diretório; se um arquivo de nome idêntico existe no / etc / systemd /
system /, systemd irá ignorar o no diretório lib. Isto permite aos administradores para copiar e
personalizar um arquivo de unidade systemd sem correr o risco de que ele poderia ser
substituído durante a próxima atualização - isso pode acontecer em distribuições sysvinit se um
dos scripts de inicialização armazenada em /etc/rc.d/init.d/ foi modificado.
Systemd gera dinamicamente ele próprio certas unidades; Como resultado, essas unidades não
aparecem no sistema de arquivos, mas eles não aparecem na lista de unidade que pode ser
recuperada através systemctl. Por exemplo, uma unidade de dispositivo é gerada
automaticamente juntamente com o udev para determinados dispositivos (tais como mídia de
armazenamento, dispositivos PCI e ttys) que são marcados como TAG + = "systemd" nas regras
do udev. Semelhante ao soquete e unidade de serviço de combinação, outras unidades também
podem depender dessas unidades do dispositivo e iniciar automaticamente quando os
dispositivos que exigem que eles estão conectados. Este sistema também é usado para as
unidades .swap que são gerados automaticamente usando as informações no arquivo /etc/fstab
para configurar o espaço de troca, assim que o volume de permuta especificado aparece.
Systemd também gera unidades automáticas de montagem para vários outros dispositivos de
armazenamento que estão listados no arquivo /etc/fstab; portanto, a lista systemctl contém
mais unidades de montagem do que há arquivos da unidade de montagem.
Alvos
Arquivos que terminam em.TARGET definem grupos de unidades. Servem para chamar outras
unidades que são responsáveis por serviços, sistemas de arquivos ou outros componentes. Estas
funções permitem alvos de inicialização a serem definidos, que são equivalentes aos níveis de
execução SysV clássico. Por exemplo, a unidade multi-user.target inicia todos os serviços que
versões mais antigas do Fedora e openSUSE chamaria no nível de execução 3 - em outras
palavras, ele inicia completamente o sistema, mas sem lançar um gerenciador de login gráfico.
Este último aparece com a unidade graphical.target, tornando esta unidade o equivalente a nível
de execução 5 e o alvo padrão típico.
Quando o sistema é inicializado, systemd ativa uma unidade alvo default.target especial.
Normalmente, default.target só é usado como um alias para diferentes alvos, como
graphical.target ou multi-user.target. Alvos também pode construir ou dependem uns dos
outros; por exemplo, graphical.target vai esperar por multi-user.target para começar antes de
ser lançado a interface gráfica do usuário.
Sempre que necessário, a adição de "desejos" para os arquivos da unidade permite aos usuários
definir manualmente as dependências entre as unidades. Isso pode ser relevante para serviços
como o servidor web Apache, que espera um ambiente de rede totalmente configurada quando
é iniciado. Estes serviços devem depender do network.target. No entanto, serviços como o Avahi
ou Bind não exigem a dependência porque eles podem lidar corretamente com interfaces de
rede que aparecem ou desaparecem durante a execução.
2.4 Control Centre: The systemd Linux init system 73
Peças tradicionais
Por razões de compatibilidade, systemd também pode ser usado com System-V e LSB scripts de
inicialização. Esses scripts não são usados apenas para iniciar e parar serviços em distribuições
Linux com SysVinit; eles também trabalham com Upstart. Esses scripts de inicialização são
interpretados por um escudo e requerem parâmetros, tais como "start", "stop" ou "restart";
uma abordagem que tem existido desde os primeiros dias do sistema de inicialização System-V.
Grupos
Ao iniciar-los, systemd varas todos os serviços em um grupo de controle dedicado (cgroup), que
tem o nome do serviço. kernels modernos suportam esta tecnologia que isola os processos e
oferece controladores opcionais para refinar ainda mais a alocação de recursos de hardware.
Processos filhos herdam as propriedades do grupo. Isso permite que systemd para gerenciar
grupos de processos como unidades coerentes, por exemplo, para garantir que todos os
processos relacionados são interrompidos quando um serviço é desligado. Os administradores
também podem usar as interfaces cgroup normais para controlar a gama de recursos que está
disponível para um serviço; alocar manualmente processos não é mais necessário.
Abordagem ampla
Systemd inclui uma série de unidades que executam várias tarefas fundamentais durante a
inicialização do sistema. Algumas delas são dadas o mesmo formato de um serviço de fundo.
Por exemplo, quando necessário, a unidade de serviço fsck-root.service aciona uma verificação
do sistema de arquivos raiz antes de um sistema de arquivos gravável é montado por remount-
rootfs.service; hwclock-carga e hwclock-salvar ajustar o tempo para que a do relógio do sistema.
Em distribuições sysvinit e Upstart, estas e dezenas de tarefas semelhantes foram tratadas pelo
shell scripts, como /etc/rc.sysinit ou por um conjunto de pequenos scripts armazenados no
/etc/rcS.d/*. Esses scripts são altamente personalizada para cada família de distribuição e,
portanto, se comportam de forma muito diferente em Debian do que no Fedora ou openSUSE;
esta é a razão pela qual os usuários do Fedora e RHEL pode definir seus teclados em
/etc/sysconfig/keyboard, mas irá procurar em vão por este directório no Debian.
Muitas unidades Systemd iniciar programas em C que são pensados para ser mais rápido e mais
robusto do que os scripts shell que anteriormente desempenhadas essas tarefas. Ao integrar
estes serviços, systemd está tentando eliminar muitas das diferenças entre as distribuições. Isto
torna mais fácil para os desenvolvedores a fazer o seu trabalho, porque eles podem fornecer
arquivos de unidade para os seus serviços e saber que as coisas que esperar para ser incluído no
systemd. Incorporando scripts de inicialização Sys-V é muito mais difícil porque esses scripts
devem acomodar características específicas de distribuição.
74 Capítulo 2. Material Complementar
Detalhes
Outras informações básicas sobre as ideias por trás systemd, bem como o seu funcionamento e
utilização, podem ser encontradas nas páginas man Systemd - systemd e systemd.conf. Tais
páginas também existem para cada um dos tipos de unidades - por exemplo para systemd.unit
ou systemd.service. Homepage do Lennart Poettering oferece links para vários artigos que
explicam o plano de fundo do sistema de inicialização, por exemplo, a série "systemd para
desenvolvedores".