Exame de imagens de disco com libguestfs
CAPA
Exame minucioso
Eryk Klucinski – sxc.hu
A libguestfs oferece um conjunto poderoso de ferramentas para
examinar imagens de discos em profundidade.
por Richard W. M. Jones
H
á mais ou menos um ano,
a Red Hat enfrentou um
problema com seu pacote
de aplicativos de gerenciamento de
virtualização. Seus usuários possuíam
uma crescente coleção de imagens
de disco de máquinas virtuais com
muitos gigabytes, mas as ferramentas
existentes para gerenciar esses arquivos imensos eram incrivelmente ruins.
Os usuários precisavam se conectar a um dispositivo NAS (NetworkAttached Storage) separado para fazer
novas imagens de disco, o que tornava o preparo de máquinas virtuais
um processo com muitos passos e
extremamente trabalhoso. O código do gerenciamento de armazenamento foi adicionado à biblioteca
de virtualização libvirt, portanto,
as ferramentas de gerenciamento
atuais podem preparar tudo automaticamente. Mas, e quanto ao exame
e ajuste de imagens de disco? Uma
ferramenta chamada kpartx oferecia
certa capacidade de modificar imagens de disco. Com uma conta de
root, o kpartx, confiança e um pouco de sorte, era possível visualizar e
ajustar imagens, mas essa opção pos-
Tabela 1: Ferramentas libguestfs
36
virt-cat
virt-install
virt-rescue
virt-clone
virt-list-filesystems
virt-resize
virt-convert
virt-list-partitions
virt-tar
virt-df
virt-ls
virt-top
virt-edit
virt-make-fs
virt-viewer
virt-image
virt-manager
virt-win-reg
virt-inspector
virt-pki-validate
virt-xml-validate
suía muitas ressalvas. Montar uma
máquina virtual pouco confiável no
host pode levar ao uso indevido do
usuário root. Os problemas também
aparecem quando o host falha. O
kpartx também possuía uma difícil
integração com scripts.
Pessoalmente, acho essa uma situação totalmente inaceitável. Uma
imagem de disco não é especial; é
simplesmente um arquivo comum.
Não é necessário executar um su
para o root para abrir um documento
de processador de texto, e o GIMP
não precisa criar nódulos de dispositivos em /dev quando uma imagem
é editada.
A libguestfs [1] resolve esses
problemas. É uma biblioteca segura que aceita scripts para acessar
e editar imagens de disco – sem a
necessidade de acesso no nível de
root. É também uma coleção de
ferramentas úteis para desempenhar
tarefas comuns, e vem com um shell
interativo. As ferramentas incluídas
com a libguestfs são direcionadas
http://www.linuxmagazine.com.br
libguestfs | CAPA
aos administradores. A biblioteca é
para programadores e o shell é para
quem faz hacks e scripts na linha
de comando.
Instalação
da libguestfs
Usuários do Fedora, do Red Hat Enterprise Linux (RHEL) e CentOS
contam com o método mais fácil
de instalação. No Fedora, é possível instalar a biblioteca, o shell e as
ferramentas apenas com:
# yum install \*guestf\*
No RHEL 5, no CentOS e outros
derivados do RHEL 5, é preciso instalar o repositório EPEL [2] e depois
executar o comando anterior. O
RHEL 6 já vem com a libguestfs.
Os usuários do Debian e do Ubuntu
podem conseguir algumas partes da
libguestfs seguindo o link na página
de FAQ da biblioteca [3]. Ainda há
procura por mantenedores para o
Ubuntu e outras distribuições.
A libguestfs pode usar o KVM
para aceleração de hardware. Para
habilitar esse recurso, digite chmod 666
/dev/kvm (essa alteração não resiste a
uma reinicialização, portanto, inclua
esse comando em /etc/rc.local).
As ferramentas
Com a libguestfs instalada, já dá
para ter uma ideia das ferramentas disponíveis (tabela 1), abrindo a
console e digitando virt- seguido da
tecla Tab (geralmente duas ou três
vezes). Cada uma dessas ferramentas
é totalmente documentada nas man
pages (exemplo: man virt -df). A libguestfs inclui duas ferramentas de
baixo nível: a guestfish, que oferece
acesso total à API libguestfs, o que
é muito útil para alteração de shell
scripts e tarefas não realizadas por
ferramentas de alto nível para administração de sistemas, enquanto que
o guestmount monta uma imagem de
Linux Magazine #70 | Setembro de 2010
disco em um diretório (figura 1). O
conjunto de ferramentas libguestfs
inclui também uma API para programadores, acessível com C, C++,
Perl, Python, Ruby, OCaml, Java,
Haskell e Mono (C#).
Como o nome sugere, a ferramenta virt-df é o equivalente virtual do
comando df. A execução desse comando mostra a utilização do disco
de todas as máquinas virtuais com
gerenciamento através da libvirt (é
preciso estar logado como root para
executar esse comando, a menos que
as permissões tenham sido alteradas
nos discos das máquinas virtuais para
que usuários, que não sejam o root,
possam lê-los). A saída do comando
virt-df é mostrada na listagem 1.
O virt-df pode ser usado em qualquer imagem de disco mais antiga,
independentemente de acesso root
(listagem 2).
Para planejar e prever quando
sua máquina virtual irá necessitar
de mais espaço em disco, o virt-df
é ótimo, particularmente porque é
possível executá-lo com um cron job
e orientar a saída para um formato
CVS para importação direta em planilhas e bancos de dados.
O que fazer com uma máquina
virtual que começa a ultrapassar sua
alocação de disco original? Utilize o
utilitário virt-resize nela (listagem 3).
Figura 1É possível usar guestmount
para montar uma imagem
guest em um diretório.
Nesse caso, o guestmount
montou um sistema de
arquivos Windows na
máquina host, o que pode
ser visto no Nautilus.
Caso haja uma máquina virtual
que não inicializa, é possível reparar
arquivos na imagem manualmente
através do virt-edit:
# virsh list --all
Id Name State
–––––––––––- Debian5x32 shut off
- Windows7x3 shut off
O comando:
virt-edit Debian5x32 /boot/grub/
menu.lst
Listagem 1: Conferir a utilização do disco
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
# virt-df
Filesystem 1K-blocks Used Available Use%
Debian5x32:/dev/debian5x32.home.annexia.org/home
2027920 35844 1889064 2%
Debian5x32:/dev/debian5x32.home.annexia.org/root
329233 81728 230507 25%
Debian5x32:/dev/debian5x32.home.annexia.org/tmp
170549 5663 156080 4%
Debian5x32:/dev/debian5x32.home.annexia.org/usr
2100444 298988 1694756 15%
Debian5x32:/dev/debian5x32.home.annexia.org/var
955480 202308 704636 22%
Debian5x32:/dev/vda1 233335 9546 211341 5%
Windows7x32:/dev/vda1 102396 24704 77692 25%
Windows7x32:/dev/vda2 8284156 7229712 1054444 88%
37
CAPA | libguestfs
Figura 2Acessar o registro em um guest Windows com o auxílio do virt-win-reg.
abre o arquivo no vi ou no $EDITOR. Outra opção para máquinas
virtuais que não inicializam é usar
o virt-rescue para obter um shell
de recuperação, que funciona como
um CD de recuperação. Não tente
usar o virt-edit ou o virt-rescue em
máquinas virtuais que estejam em
funcionamento (quadro 1).
O comando virt-cat oferece algumas opções simples para o monitoramento de máquinas virtuais, tais
como averiguar eventos suspeitos nos
arquivos de log. O script na listagem 4
usa o virt-cat para examinar contas
de root de backdoor nas contas de
visitantes do Linux.
Guestfish
Apesar de as ferramentas virt-* permitirem operações administrativas,
o poder da API libguestfs só está
disponível através do guestfish, o
shell interativo do sistema de arquivo guest. O guestfish possui quase
300 comandos, e os leitores ficarão
felizes em saber que só posso falar de
alguns dos mais comuns neste artigo.
Listagem 2: virt-df em uma imagem de disco
01
02
03
04
05
$ virt-df -h ~/disk.img
Filesystem Size Used Available Use%
/home/rjones/disk.img:/dev/vda1193.7M 21.6M 162.1M 12%
/home/rjones/disk.img:/dev/vg_f12x32/lv_root
5.2G 2.3G 2.6G 45%
Listagem 3: virt-resize
01
02
03
04
05
06
$ truncate -s 10G ~/enlarged.img
$ virt-resize ~/disk.img ~/enlarged.img--expand /dev/sda2
Summary of changes:
/dev/sda1: partition will be left alone
/dev/sda2: partition will be resized from 5.8G to 9.8G
/dev/sda2: content will be expanded using the‘pvresize’ method
Quadro 1: Atenção
Nunca use a libguestfs ou suas ferramentas no modo leitura/escrita em
uma imagem de máquina virtual que esteja em execução. O resultado será
certamente a corrupção do disco (as ferramentas tentam evitar que se acesse uma máquina virtual sendo executada, mas em alguns casos não conseguem detectar o problema). Muitas ferramentas possuem uma flag --ro
(read only), e o uso dessa flag é seguro, mesmo em máquinas virtuais ativas.
Essa flag é um bom modo de se obter informações sobre o estado de suas
máquinas virtuais. Algumas ferramentas não precisam de acesso de leitura/escrita e apenas abrem imagens no modo somente leitura, por isso não
precisam de uma flag especial: se houver dúvidas, confira a documentação.
38
É possível iniciar o guestfish em
uma imagem de disco já existente ou,
se preferir, criar uma nova imagem
de disco desde o início. A definição
de imagem de disco inclui disco rígido raw, CD ISOs, VFDs (floppy
virtual), formatos de compactação
como o qcow2, cartões SD e até
sistemas de arquivos – o guestfish
pode ler todos eles e pode escrever
em quase todos. Para iniciar o shell
do guestfish, digite guestfish. Para
criar uma imagem de disco de 100
megabytes, digite:
><fs> sparse test.img 100M
><fs> run
Então, faça uma partição e crie
um sistema de arquivos:
><fs> part-disk /dev/sda mbr
><fs> mkfs ext2 /dev/sda1
Para criação de um sistema de arquivos veja a listagem 5. O /dev/sda
não se refere ao host. No guestfish,
isso significa o primeiro disco anexado (test.img nesse caso).
Se essa imagem de disco for montada em uma máquina virtual, a
máquina virtual verá um sistema
de arquivos ext2 em uma partição
contendo o artigo. Para extrair o
conteúdo, use o comando cat do
guestfish:
$ guestfish --ro -a test.img -m /
dev/sda1 cat /article.txt
A flag –a adiciona a imagem do
disco, e a flag –m (mount) informa a
localização do sistema de arquivos
dentro da imagem ao guestfish.
Além disso, é possível usar o guestfish para examinar seus guests gerenciados pela libvirt. Isso é um pouco
mais complexo para os autores do
libguestfs, mas não para o usuário.
Uma imagem de disco é apenas
uma imagem de disco, mas uma máquina virtual sendo executada monta
http://www.linuxmagazine.com.br
libguestfs | CAPA
sistemas de arquivos da imagem de
disco de acordo com suas convenções, tais como montar /dev/sda1
em /boot e /dev/vg/lv_var em /var,
ou /dev/sda2 como C:\ no Windows.
Como saber como montá-los? A
libguestfs contém uma ferramenta
chamada virt-inspector que resolve
esse mapeamento com o uso de um
conjunto de regras e heurística. Tudo
que o usuário precisa fazer é fornecer a flag -i (Inspector) para que o
guestfish desempenhe uma função
similar (listagem 6).
Para saber quanto espaço (em kilobytes) está sendo usado por /var/log,
digite du /var/log. Para descobrir a
conta de root no arquivo de senhas,
digite grep ^root: /etc/passwd.
Para listar partições e volumes
lógicos, use
><fs> list-partitions
/dev/vda1
/dev/vda2
><fs> lvs
/dev/debian5x32.home.annexia.org/
home
/dev/debian5x32.home.annexia.org/
root
/dev/debian5x32.home.annexia.org/
swap_1
Listagem 4: Procurando contas root
01
02
03
04
05
06
07
08
09
10
11
12
#!/bin/sh # Get list of guests from libvirt.
guests=$(
virsh list --all | tail -n+3 | head -n-1 |
awk '{print $2}'
)
for n in $guests; do
virt-cat $n /etc/passwd |
awk -F: '$1 != "root" && $3 == 0 {
print "BACKDOOR ACCOUNT FOUND:", $1
}'
done
prefixo usado pelo Augeas para checar arquivos de configuração; não há
relação nenhuma com a biblioteca
libguestfs:
Assim como com um guest Linux,
é possível montar e examinar um
guest Windows:
><fs> aug-init / 0
><fs> aug-get /files/etc/apt/
sources.list/1/uri
http://ftp.uk.debian.org/debian/
><fs> aug-get /files/etc/apt/
sources.list/1/distribution
lenny
# guestfish --ro -i Windows7x32
><fs> ls /Windows/System32/drivers
| head -5
1394bus.sys
1394ohci.sys
AGP440.sys
AMDAGP.SYS
BrFiltLo.sys
A libguestfs tem um bom suporte para guests Windows também.
A figura 2 mostra como ler e escrever entradas de registro nos guests
Listagem 5: Artigo para ser enviado ao sistema de arquivos
><fs> vfs-type /dev/debian5x32.
home.annexia.org/swap_1
swap><fs> file /dev/debian5x32.
home.annexia.org/swap_1
Linux/i386 swap file (new style)
1 (4K pages) size 89087 pages
01
02
03
04
05
06
07
08
09
10
11
12
13
Para copiar os diretórios de /home
para um arquivo TAR local, digite:
Listagem 6: Determinando a flag Inspector
e para descobrir o que há nelas, use
><fs> tgz-out /home /tmp/home.
tar.gz
Com o editor de configuração
Augeas [4], é possível analisar o arquivo de configuração APT de um
guest Debian. Repare que /files é o
Linux Magazine #70 | Setembro de 2010
01
02
03
04
05
06
07
08
><fs> mount /dev/sda1 /
><fs> upload article.txt /article.txt
><fs> ll /
total 20
drwxr-xr-x 3 root root 1024 Apr 15 13:54 .
dr-xr-xr-x 19 root root 0 Apr 12 22:09 ..
-rw-r--r-- 1 root root 7028 Apr 15 13:54 article.txt
drwx–– 2 root root 12288 Apr 15 13:54 lost+found
><fs> sync
><fs> exit
$ ll test.img
-rw-rw-r--. 1 rjones rjones 104857600 Apr 15 13:54test.img
# guestfish --ro -i Debian5x32
><fs> less /boot/grub/menu.lst
# menu.lst - See: grub(8), info grub, update-grub(8)
# grub-install(8), grub-floppy(8),
# grub-md5-crypt, /usr/share/doc/grub
# and /usr/share/doc/grub-legacy-doc/.
[...]
39
CAPA | libguestfs
Listagem 7: Clonagem de máquinas virtuais
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh template="$1"
newimage="$2"
nameserver="$3"
hostname="$4"
dd if="$template" of="$newimage" bs=1M
echo > /tmp/network <<EOF
NETWORKING=yes
HOSTNAME=$hostname
EOF
guestfish -i "$newimage" <<EOF
write-file /etc/resolv.conf "nameserver $nameserver" 0
upload /tmp/network /etc/sysconfig/network
sync
EOF
rm /tmp/network
Windows usando o utilitário virtwin-reg.
Apesar de tudo isso ser muito divertido, o verdadeiro poder do guestfish está no seu uso em scripts. Na
listagem 7, usei o guestfish para clonar máquinas virtuais a partir de um
template, após o que, pude ajustar
as configurações do novo guest com
um script assim:
# cd /var/lib/libvirt/images
# /tmp/clone.sh oldguest newguest
192.168.1.1 U
newguest.example.com
# virt-install --import --file
newguest
O futuro
A API da libguestfs é compreensiva,
madura e bem testada. A equipe se
comprometeu com a manutenção
da compatibilidade API e ABI (binário), portanto, a única coisa a ser
feita em versões estáveis é adicionar
novas chamadas e comandos.
Uma tarefa que se apresenta é
expandir o sistema de ferramentas
administrativas, provavelmente com
algumas para acelerar o preparo de
40
novos guests, encolher guests automaticamente, oferecer um suporte
melhor ao Windows, suporte CIM no
virt-inspector, diagnósticos especializados de problemas nas máquinas
virtuais e verificação da integridade
de softwares instalados.
O projeto planeja atualizações do
virt-p2v e do virt-v2v. Uma maior
integração com outras ferramentas
de gerenciamento também consta
dos planos. No momento, é possível montar um sistema de arquivos
guest no host (usando o FUSE e o
comando guestmount). O próximo
passo é a integração com o virtmanager, assim, os usuários poderão
clicar em um botão para abrir o sistema de arquivos do guest. Outras
opções incluem a integração com
ferramentas de segurança, rootkits
e escaners de vírus, além de ferramentas de monitoração.
Empacotadores das comunidades
Ubuntu, Gentoo, e Mac OS X são
necessários (um port OS X já está
disponível, apenas precisa de ajustes
para ser lançada). Saiba que a libguestfs é difícil de compilar a partir da fonte e exige empacotadores
dedicados com muito tempo livre.
Algumas perguntas que todos
fazem: a libguestfs tem uma interface gráfica? Os usuários poderiam
se beneficiar de uma interface gráfica? As respostas são as seguintes:
Não, não há uma interface gráfica
e, sim, talvez os usuários fossem
beneficiados. É difícil imaginar
como seria uma interface gráfica
que combinasse com o poder do
guestfish. Seria uma interface gráfica grande e complexa, de fato. No
entanto, se alguém estiver disposto a se candidatar e começar este
projeto, iria receber muita ajuda e
incentivo da equipe. n
Mais informações
[1]Libguestfs: http://libguestfs.org
[2]EPEL: http://fedoraproject.org/wiki/EPEL
[3]FAQ Libguestfs: http:/ libguestfs.org/FAQ.html
[4]Augeas: http://augeas.net
Gostou do artigo?
Queremos ouvir sua opinião. Fale conosco em
[email protected]
Este artigo no nosso site:
http://lnm.com.br/article/3845
http://www.linuxmagazine.com.br
Download

Exame minucioso - Linux Magazine Online