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