rss
twitter
    Seja Livre você Também!! :)

quarta-feira, 31 de outubro de 2012

Usando pipes e redirecionamentos no linux



Uma das características mais interessantes de sistemas baseados em Unix, como o linux, é a possibilidade de juntar diversos comandos em um só e poder enviar a saída para um arquivo. Vamos aprender a fazer isso usando pipes e redirecionamentos.
Entre as características do linux, talvez a mais interessante seja a noção de que tudo é um arquivo. Até mesmo dispositivos de hardware são encarados pelo sistema como sendo arquivos.

Da mesma forma, saídas e entradas de programas de modo texto também são vistos como arquivos.

Quando um programa é iniciado, o shell (no nosso caso o bash) coloca a sua disposição arquivos especiais, o chamado Standard Input/Output ou stdio, em português entrada e saída padrão.

Standard I/O
O stdio é formado por três arquivos especiais, são eles:

Standard Input (stdin) – Este arquivo descreve o local de onde o programa vai ler a entrada de dados, geralmente é associado ao teclado.

Standard Output (stdout) – É o local para onde o programa vai enviar a saída (informações, mensagens de sucesso, etc.), quase sempre é o terminal onde o programa foi iniciado.

Standard Error (stderr) – Funciona basicamente da mesma forma que o stdout, mas é exclusivo para a saída de mensagens de erro. Também é geralmente associada ao terminal.

Stdout e stderr são separados porque é comum que as mensagens de erro sejam processadas de maneira diferente das mensagens comuns.

Pipes
Como vimos acima, tudo no linux é visto como sendo um arquivo, inclusive a saída e entrada de dados de programas. Usando essa idéia, podemos juntar diversos comandos por meio de um pipe (em portugês algo como “cano” ou “tubo”), passando a saída de um comando para a entrada de outro. Isso facilita muito o trabalho e pode agilizar tarefas que, sem isso seriam praticamente impossíveis ou pelo menos impraticáveis.

Vamos a um exemplo:

Digamos que você queira analisar as mensagens de inicialização da sua máquina em um paginador, como o less. Você faria assim:

[root@MadMax] # dmesg | less

Dessa forma, o comando dmesg envia sua saída para a entrada do comando less.

Outro exemplo:

[root@MadMax] # ps aux | grep httpd

Com esse comando você exibe na tela todos os processos do httpd (servidor web) ativos na sua máquina.

E se você quisesse somente os PIDs? Simples:

[root@MadMax] # ps aux | grep httpd | awk {'print $2'}

Bom, estes são exemplos simples, mas a partir do momento que você se acostumar com a idéia, vai achar diversas funções para isso.

Este processo é gerenciado pelo shell e é transparente para o usuário.

Redirecionamentos
Às vezes é extremamente interessante enviar a saída de um comando para um arquivo, para poder analisar posteriormente. Isso é feito usando redirecionamentos.

Um exemplo:

[root@MadMax] # ls -la > file1

dessa forma, a listagem do diretório vai ser gravada em um arquivo, ao invés de ser exibida na tela.

o redirecionador ‘>’ cria um arquivo novo vazio e sobrescreve o arquivo se ele já existir, para adicionar o texto no final de um arquivo existente, use ‘>>’

[root@MadMax] # ls -la >> file1

a listagem será salva no final do arquivo ‘file1′. Se o arquivo não existir, será criado.

Note que o redirecionador ‘>’ envia apenas stdout, para enviar stderr, usamos ’2>’.

É importante saber que o shell vai criar o arquivo antes de executar o comando, ou seja, os pipes e redirecionamentos são analisados antes da execução dos comandos. Por isso temos que tomar cuidado com comandos como esse:

[root@MadMax] # grep 'felipe' arquivo > arquivo

isto nunca deve ser feito, pois o arquivo seria sobreposto por um arquivo vazio, resultando na perda de tudo que havia no arquivo. O correto seria usar um arquivo intermediário para guardar a saída do grep e depois renomeá-lo:

[root@MadMax] # grep 'felipe' arquivo > arquivo2

[root@MadMax] # mv arquivo2 arquivo

Estes são os redirecionadores usados no bash, outros shells podem ter sintaxes bem diferentes.

Da mesma forma, podemos ler a entrada de um comando de um arquivo:

[user@MadMax] $ mail -s "novo arquivo" felipe < novoarquivo

Assim o conteúdo do arquivo novoarquivo é enviado para o usuário felipe por email. Normalmente o comando mail espera que você digite a mensagem no terminal.

Os redirecionadores e seus significados:
cmd > arquivo e

cmd 1> arquivo – envia stdout para arquivo

cmd 2> arquivo – envia stderr para arquivo

cmd > arquivo 2>&1 – envia stdout e stderr para arquivo

cmd > arquivo1 2> arquivo2 – envia stdout para arquivo1 e stderr para arquivo2

cmd < arquivo – recebe stdin de arquivo

cmd >> arquivo e

cmd 1>> arquivo – adiciona stdout ao final de arquivo

cmd 2>> arquivo – adiciona stderr ao final de arquivo

cmd >> arquivo 2>&1 – adiciona stdout e stderr ao final de arquivo

cdm1 | cmd2 – Envia stdout de cmd1 para cmd2

cmd1 2>&1 | cmd2 – Envia stdout e stderr de cmd1 para cmd2


(http://brunotorres.net/pipes-redirecionamentos)

sexta-feira, 14 de setembro de 2012

LILO


LILO, ou LInux LOader, é um dos loader de boot Linux mais comuns. O LILO pode ser instalado no MBR da unidade de disco rígido inicializável ou no registro de boot de partição de uma partição. Também é possível instalá-lo em dispositivos removíveis, como disquetes, CDs ou chaves USB. Será uma boa ideia praticar em um disco flexível ou chave USB se ainda não estiver familiarizado com LILO, como em nossos exemplos.
Durante a instalação do Linux, normalmente você especificará LILO ou GRUB como gerenciador de boot. Se escolher GRUB, LILO não poderá estar instalado. Caso ainda não tenha instalado o pacote, será preciso instalá-lo. Também é recomendável instalar o pacote lilo-doc para obter a documentação adicional e mais exemplos. Daqui em diante, consideraremos que você já tenha o pacote LILO instalado.
Configure o LILO usando um arquivo de configuração, que geralmente é /etc/lilo.conf. É possível usar o comando liloconfig(normalmente disponível em /usr/sbin) para gerar um arquivo de configuração inicial e, em seguida, editá-lo conforme necessário. O arquivo de configuração na Listagem 1 foi gerado dessa forma. O arquivo é razoavelmente bem anotado, e as man pages para lilo e lilo.conf fornecerão ajuda adicional. Este é um típico arquivo de configuração LILO que pode ser usado em um sistema de boot duplo com Windows e um ou mais sistemas Linux.

Listagem 1. Exemplo de /etc/lilo.conf

# Originally generated by liloconfig - modified by Ian Shields

# This allows booting from any partition on disks with more than 1024
# cylinders.
lba32

# Specifies the boot device (floppy)
boot=/dev/fd0

# Specifies the device that should be mounted as root.
# If the special name CURRENT is used, the root device is set to the
# device on which the root file system is currently mounted. If the root
# has been changed with  -r , the respective device is used. If the
# variable ROOT is omitted, the root device setting contained in the
# kernel image is used. It can be changed with the rdev program.
root=/dev/sda7

# Bitmap configuration for /boot/coffee.bmp
bitmap=/boot/coffee.bmp
bmp-colors=12,,11,15,,8
bmp-table=385p,100p,1,10
bmp-timer=38,2,13,1

# Enables map compaction:
# Tries to merge read requests for adjacent sectors into a single
# read request. This drastically reduces load time and keeps the map
# smaller. Using COMPACT is especially recommended when booting from a
# floppy disk.
compact

# Install the specified file as the new boot sector.
# LILO supports built in boot sectors, you only need
# to specify the type, choose one from 'text', 'menu' or 'bitmap'.
# new: install=bmp      old: install=/boot/boot-bmp.b
# new: install=text     old: install=/boot/boot-text.b
# new: install=menu     old: install=/boot/boot-menu.b or boot.b
# default: 'menu' is default, unless you have a bitmap= line
# Note: install=bmp must be used to see the bitmap menu.
# install=menu
install=bmp

# Specifies the number of _tenths_ of a second LILO should
# wait before booting the first image.  LILO
# doesn't wait if DELAY is omitted or if DELAY is set to zero.
# delay=20

# Prompt to use certain image. If prompt is specified without timeout,
# boot will not take place unless you hit RETURN. Timeout is in tenths of
# a second.
prompt
timeout=200

# Enable large memory mode.
large-memory

# Specifies the location of the map file. If MAP is
# omitted, a file /boot/map is used.
map=/boot/map

# Specifies the VGA text mode that should be selected when
# booting. The following values are recognized (case is ignored):
#   NORMAL  select normal 80x25 text mode.
#   EXTENDED  select 80x50 text mode. The word EXTENDED can be
#     abbreviated to EXT.
#   ASK  stop and ask for user input (at boot time).
#     use the corresponding text mode. A list of available modes
#     can be obtained by booting with  vga=ask  and pressing [Enter].
vga=normal

# Defines non-standard parameters for the specified disk.
#disk=/dev/sda
# bios=0x80

# If you are using removable USB drivers (with mass-storage)
# you will need to tell LILO to not use these devices even
# if defined in /etc/fstab and referenced in /proc/partitions.
# Adjust these lines to your devices:
#
# disk=/dev/sda inaccessible
# disk=/dev/sdb inaccessible

# These images were automagically added. You may need to edit something.

image=/boot/vmlinuz-2.6.31-14-generic
 label="Lin 2.6.31-14"
 initrd=/boot/initrd.img-2.6.31-14-generic
 read-only

image=/boot/vmlinuz-2.6.31-20-generic
 label="Lin 2.6.31-20"
 initrd=/boot/initrd.img-2.6.31-20-generic
 read-only

image=/boot/memtest86+.bin
 label="Memory Test+"
 read-only

# If you have another OS on this machine (say DOS),
# you can boot if by uncommenting the following lines
# (Of course, change /dev/sda1 to wherever your DOS partition is.)
other=/dev/sda6
        label="Fedora 8"

 other=/dev/sda1
   label="Windows XP"


Testaremos nossa configuração criando um disquete de boot, então especificamos boot=/dev/fd0, ao lado da parte superior do arquivo. Também aumentamos o tempo limite de prompt para 20 segundos (200 incrementos de um décimo de segundo) e acrescentamos uma segunda "outra" entrada ao carregamento em cadeia do loader de boot na partição Fedora 8 (/dev/sda6). O LILO permite apenas um comando root em um arquivo de configuração, por isso pode inicializar várias imagens a partir da partição root, mas precisa fazer o carregamento em cadeia para outro loader de boot a fim de inicializar uma imagem de uma instalação diferente, como Fedora 8 (/dev/sda6) ou Windows XP (/dev/sda1) em nosso exemplo.
Use o comando lilo, localizado em /sbin/lilo, para escrever um registro de boot de estágio 1 e criar um arquivo de mapa (/boot/map) usando informações de configuração, como no exemplo acima, normalmente localizadas em /etc/lilo.conf. Existem alguns usos auxiliares que mencionaremos depois.
Agora, se formatarmos um disco flexível com um sistema de arquivos Linux como ext2, podemos executar o comando lilo (/sbin/lilo) para criar um disco flexível inicializável. Nossa saída é mostrada na Listagem 2. Observe que o comando lilo tem cinco níveis de detalhamento. Especifique um -v extra para cada nível. Esse exemplo foi criado usando lilo -v -v.

Listagem 2. Criando um disco flexível inicializável com lilo
LILO version 22.8, Copyright (C) 1992-1998 Werner Almesberger
Development beyond version 21 Copyright (C) 1999-2006 John Coffman
Released 19-Feb-2007, and compiled at 10:52:38 on Aug 25 2009
Running Linux kernel 2.6.31-14-generic on i686
Ubuntu

raid_setup returns offset = 00000000  ndisk = 0
 BIOS   VolumeID   Device
Reading boot sector from /dev/fd0
pf_hard_disk_scan: ndevs=1
  0800  54085408  /dev/sda
device codes (user assigned pf) = 0
device codes (user assigned) = 0
device codes (BIOS assigned) = 1
device codes (canonical) = 1
mode = 0x03,  columns = 80,  rows = 25,  page = 0
Using BITMAP secondary loader
Calling map_insert_data
Secondary loader: 19 sectors (0x3800 dataend).
Warning: The boot sector and map file are on different disks.
bios_boot = 0x00  bios_map = 0x80  map==boot = 0  map S/N: 54085408
Mapping bitmap file /boot/coffee.bmp
Calling map_insert_file
Compaction removed 592 BIOS calls.
Bitmap: 603 sectors.
BIOS data check was okay on the last boot

Boot image: /boot/vmlinuz-2.6.31-14-generic
Setup length is 26 sectors.
Compaction removed 7452 BIOS calls.
Mapped 7601 sectors.
Mapping RAM disk /boot/initrd.img-2.6.31-14-generic
Compaction removed 14696 BIOS calls.
RAM disk: 14930 sectors.
Added Lin_2.6.31-14 *

Boot image: /boot/vmlinuz-2.6.31-20-generic
Setup length is 26 sectors.
Compaction removed 7468 BIOS calls.
Mapped 7617 sectors.
Mapping RAM disk /boot/initrd.img-2.6.31-20-generic
Compaction removed 14704 BIOS calls.
RAM disk: 14938 sectors.
Added Lin_2.6.31-20

Boot image: /boot/memtest86+.bin
Setup length is 4 sectors.
Compaction removed 243 BIOS calls.
Mapped 254 sectors.
Added Memory_Test+

Boot other: /dev/sda6, loader CHAIN
Pseudo partition start: 43198848
Compaction removed 0 BIOS calls.
Mapped 6 (4+1+1) sectors.
Added Fedora_8

Boot other: /dev/sda1, on /dev/sda, loader CHAIN
Compaction removed 0 BIOS calls.
Mapped 6 (4+1+1) sectors.
Added Windows_XP

 BIOS   VolumeID   Device
  80    54085408    0800
Writing boot sector.
/boot/boot.0200 exists - no boot sector backup copy made.
Map file size: 336896 bytes.
RAID device mask 0x0000
One warning was issued.


Agora, temos nosso disquete LILO inicializável. Se LILO encontrar um erro, talvez você veja uma mensagem de erro, e o setor de boot não será gravado. A mensagem dará uma ideia sobre o que precisa ser corrigido.
Se usarmos o disquete que acabamos de criar e reinicializarmos a máquina, veremos um prompt semelhante ao da Figura 1. Observe o cronômetro de contagem regressiva na parte superior da tela, que está fazendo uma contagem regressiva iniciada em 20 segundos (200 décimos de segundo). Se nenhuma opção for feita dentro de 20 segundos, a opção destacada (a primeira, ou Lin_2.6.31-14 neste caso) é automaticamente inicializada.

Figura 1. Tela de boot do LILO
É possível usar as teclas de seta para mover-se para cima e para baixo na lista de seleção. A Figura 2 mostra como selecionar o kernel Lin_2.6.31-20 mais recente, que é a segunda entrada. Observe que o valor do cronômetro não é mais exibido. Pressione Enter para fazer o boot deste kernel.

Figura 2. Selecionando outro destino de boot com LILO
Quando tiver testado seu disquete de boot, altere a entrada boot=/dev/fd0 no seu arquivo lilo.conf para instalar o LILO no MBR ou em um registro de boot de partição. Por exemplo, boot=/dev/sda instalará o LILO no registro de boot mestre de sua primeira unidade de disco rígido.
Agora, você já teve uma introdução ao LILO e ao seu arquivo de configuração. É possível substituir algumas opções de configuração da linha de comando lilo. Você encontrará mais informações na man page do lilo usando o comando man liloouman lilo.conf. Você encontrará informações ainda mais abrangentes no guia do usuário PostScript instalado com o pacote lilo ou lilo-doc. Isso deve ser instalado no seu diretório de documentação, mas o local exato pode variar de acordo com o sistema. A única forma de localizar o arquivo é filtrar a lista de pacotes por meio de grep. A Listagem 3 mostra isso para o sistema Ubuntu 9.10 baseado em Debian que estamos usando neste exemplo.

Listagem 3. Localizando o guia do usuário LILO com dpkg

ian@pinguino:~$ dpkg -L lilo-doc | grep "ps"
/usr/share/doc/lilo-doc/user.ps.gz
/usr/share/doc/lilo-doc/tech.ps.gz


O comando correspondente em um sistema baseado em RPM como o Fedora seria: rpm -ql lilo-doc | grep "ps"
Comandos auxiliares LILO
O LILO possui vários comandos auxiliares:
lilo -q
Exibe informações do arquivo de mapa.
lilo -R
Define o lilo para fazer boot automaticamente o sistema especificado somente no próximo reboot. Isso é muito conveniente para o reboot automático de sistemas remotos.
lilo -I
Exibe informações sobre o caminho de um kernel.
lilo -u
Desinstala o lilo e restaura o registro de boot anterior.
Quando LILO inicializar um sistema Linux, você poderá fornecer parâmetros adicionais no momento do boot. Por exemplo, se a inicialização gráfica não estiver funcionando, você poderá fazer o boot no modo 3 ou no modo de usuário único para recuperação. Se você selecionar uma entrada e pressionar a tecla TAB, verá uma janela de terminal que foi pré-preenchida com o nome da sua etiqueta, como mostra a Figura 3. Qualquer texto que você digitar depois do nome da etiqueta será passado ao kernel. Por exemplo, em nosso exemplo, você selecionaria o sistema Ubuntu mais recente simplesmente movendo-se uma linha para baixo e, em seguida, pressionando TAB. Se você não selecionar um nome primeiro, pode ser necessário digitar o nome completo especificado na etiqueta. É possível ver por que as etiquetas que são mais sucintas que nossos exemplos podem ser uma boa ideia: digitar Lin_2.6.31.20 não é fácil.

Figura 3. Adicionando parâmetros de kernel com LILO


Na Figura 3, adicionamos "single" aos parâmetros de boot para indicar que queremos inicializar no modo de usuário único para fazer algum tipo de recuperação do sistema. Consulte a seção Recuperação para obter mais informações sobre como usar parâmetros de boot.
Lembre-se também de que com o LILO, é necessário executar o comando lilo sempre que você atualizar o arquivo de configuração (/etc/lilo.conf). Execute também o comando lilo se adicionar, mover ou remover partições ou efetuar qualquer outra alteração que possa invalidar o loader de boot gerado.

http://www.ibm.com/developerworks/br/library/l-lpic1-v3-102-2/