Rss

  • youtube
  • linkedin
  • google

Como diminuir o tamanho de discos virtuais VMDK – parte 3

Se desejar ler a parte 1 deste tutorial, clique aqui.
Se desejar ler a parte 2 deste tutorial, clique aqui.

No item anterior fizemos uma clonagem de um disco com uma única partição. Nas próximas linhas vou mostrar como clonei um disco com uma única partição primária e uma lógica para duas partições primárias e uma lógica com um ponto de montagem para o swap que originalmente estava em um arquivo.

NOTA: Utilizei como fonte esse site, para resolver problemas com a inicialização do novo disco. Faça como eu, sempre cite suas fontes.

Usando como base as informações da parte 1 deste tutorial, adicionaremos um novo disco à máquina virtual.

No meu caso, o disco primário possui 40 GB e vou substituir por um menor, de 20 GB. Isso realmente não é necessário, visto que como usamos alocação dinâmica, não importa muito o tamanho virtual total e sim o tamanho real utilizado.

Novo disco criado

Novo disco criado

Inicie sua máquina normalmente. “Vire homi”, como diz o cara do Linux que fica aqui do meu lado (torne-se root, se ainda não o for), e use o comando fdisk -l para verificar sua existência, da mesma forma como descrita na parte 2.

Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0004f229

Dispositivo Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        5222    41430016   8e  Linux LVM

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

(...outras informações dos discos...)

Lembre-se que a ordem em que o disco se encontra no barramento (IDE no exemplo acima) influencia diretamente no caminho de dispositivo a ser utilizado no Linux. Como no meu exemplo eu substitui um disco existente no IDE Secundário Master, e há apenas um disco no IDE Primário, esse disco apareceu como sendo /dev/sdb.

Meu disco Primário possui duas partições (/dev/sda1 e /dev/sda2) sendo uma física e uma lógica (ver itens em ciano).
Decidi criar quatro partições no novo disco. Uma para o /boot de 256 MB, uma para o / com 10 GB, uma para o /var com 6 GB e uma de swap com os aproximadamente 4 GB restante. Não vou entrar em detalhes do porque dessa estrutura, mas vai dar uma ideia das possibilidades que se tem com essa clonagem.
Segue a lista de comandos que utilizei para criar o disco. Os comandos estão em amarelo.

[root@Address21 marcos.regis]# fdisk /dev/sdb

Comando (m para ajuda): n
Comando - ação
   e   estendida
   p   partição primária (1-4)
p
Número da partição (1-4): 1
Primeiro cilindro (1-2610, default 1): 1
Last cilindro, +cilindros or +size{K,M,G} (1-2610, default 2610): +256M

Comando (m para ajuda): n
Comando - ação
   e   estendida
   p   partição primária (1-4)
p
Número da partição (1-4): 2
Primeiro cilindro (35-2610, default 35): <Enter>
Using default value 35
Last cilindro, +cilindros or +size{K,M,G} (35-2610, default 2610): +4G

Comando (m para ajuda): n
Comando - ação
   e   estendida
   p   partição primária (1-4)
p
Número da partição (1-4): 3
Primeiro cilindro (1341-2610, default 1341): <Enter>
Using default value 1341
Last cilindro, +cilindros or +size{K,M,G} (1341-2610, default 2610): +10G

Comando (m para ajuda): n
Comando - ação
   e   estendida
   p   partição primária (1-4)
p
Selected partition 4
Primeiro cilindro (2125-2610, default 2125): <Enter>
Using default value 2125
Last cilindro, +cilindros or +size{K,M,G} (2125-2610, default 2610): <Enter>
Using default value 2610

Comando (m para ajuda): a
Número da partição (1-4): 1

Digite w para gravar as alterações e sair. Digite fdisk -l para ver como ficou a estrutura.

[root@Address21 ~]# fdisk -l /dev/sdb

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x83da856d

Dispositivo Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1          34      273073+  83  Linux
/dev/sdb2              35         557     4200997+  83  Linux
/dev/sdb3             558        1863    10490445   83  Linux
/dev/sdb4            1864        2610     6000277+  83  Linux

Formatando as partições.

Use o comando mkfs.ext4 para formatar as partições /dev/sdb1, /dev/sdb3 e /dev/sdb4 em ext4.

Depois use o comando mkswap /dev/sdb2 para formatar a partição reservada para o swap.

Clonando os dados.

O primeiro passo é montar as partições. Vou usar o diretório /mnt como raiz e criarei cada um dos 3 diretórios onde serão montados as três partições. Segue a lista de comandos

[root@Address21 ~]# mkdir /mnt/boot
[root@Address21 ~]# mkdir /mnt/var
[root@Address21 ~]# mkdir /mnt/raiz
[root@Address21 ~]# mount /dev/sdb1 /mnt/boot/ 
[root@Address21 ~]# mount /dev/sdb4 /mnt/var/ 
[root@Address21 ~]# mount /dev/sdb3 /mnt/raiz/

Agora é hora de clonar todo o sistema:

[root@Address21 ~]# rsync -avHX --exclude="/mnt" --exclude="/var" --exclude="/boot" / /mnt/raiz/

ATENÇÃO! Tenha cuidado com a recursividade. No exemplo acima, estou pedindo para não sincronizar o próprio /mnt evitando um loop infinito. Dei umount /database para que ele copie o diretório apenas e não seu conteúdo, pois o outro sistema precisará dele. No caso do /database será necessário criar este diretório dentro do /mnt com as mesmas permissões. Então, se houver unidades montadas em diretórios que continuarão nessas unidades, ou você as desmonta antes da sincronização ou adiciona uma exclusão e depois recria o diretório. A primeira opção é a mais indicada.

Clonando os outros itens restantes.

[root@Address21 ~]# rsync -avHX /boot/ /mnt/boot/
[root@Address21 ~]# rsync -avHX /var/ /mnt/var/

Depois de tudo devidamente sincronizado, é hora de configurar o boot loader e o fstab que é usado para montar as partições automaticamente. No meu caso estou usando o grub legacye então vou mostrar o que fazer para ele inicializar corretamente o disco.
Primeiro ajustaremos o fstab. Use o comando blkid para que sejam exibidos os UUIDs de suas novas partições.

[root@Address21 marcos.regis]# blkid
/dev/sda1: UUID="6eb6217d-f881-47c9-89b7-6eb9f7507295" TYPE="ext4"
/dev/sda2: UUID="TM0qy8-z9HK-c7B5-xGSk-Q11N-oF7S-ysS2MT" TYPE="LVM2_member"
/dev/mapper/VolGroup-lv_root: UUID="097a9d08-afad-401d-af65-92a4c587a2e5" TYPE="ext4"
/dev/mapper/VolGroup-lv_swap: UUID="b7e866d5-831b-4ee8-b65d-be2589214a35" TYPE="swap"
/dev/sdc1: UUID="ca034463-5421-4e17-ade2-c7fe2c07a461" TYPE="ext4"
/dev/sdb1: UUID="3174f1da-cd36-4bd3-8311-9945a886060c" TYPE="ext4"
/dev/sdb2: UUID="85b39ded-49aa-4109-b238-02e573acebf5" TYPE="swap"
/dev/sdb3: UUID="f63a1b02-a3c3-4409-ad4e-38ee1f8de9f5" TYPE="ext4"
/dev/sdb4: UUID="947eb986-f639-41fe-a5eb-be4b373dc9ef" TYPE="ext4"

De posse das informações, edite o arquivo /mnt/raiz/etc/fstab para que fique aproximadamente como o abaixo.

tmpfs               /dev/shm                tmpfs   defaults        0 0
devpts              /dev/pts                devpts  gid=5,mode=620  0 0
sysfs               /sys                    sysfs   defaults        0 0
proc                /proc                   proc    defaults        0 0
UUID="ca034463-5421-4e17-ade2-c7fe2c07a461" /database ext4 defaults 0 0

UUID="3174f1da-cd36-4bd3-8311-9945a886060c" /boot   ext4    defaults  1 2
UUID="f63a1b02-a3c3-4409-ad4e-38ee1f8de9f5" /       ext4    defaults  1 1
UUID="947eb986-f639-41fe-a5eb-be4b373dc9ef" /var    ext4    defaults  1 1
UUID="85b39ded-49aa-4109-b238-02e573acebf5" swap    swap    defaults  0 0

Agora temos que editar as configurações do grub para que ele saiba onde que está a imagem do kernel.
Esta foi a parte mais complexa pois mesmo usando o dd para copiar o bootloader, eu não obtive sucesso. O que funcionou para mim foi desmontar /mnt/boot e o /mnt/var e com chroot mudar o raiz do sistema para o /mnt/raiz/, remontando o /boot na raiz. Segue os comandos utilizados:

[root@Address21 ~]# umount /mnt/boot
[root@Address21 ~]# umount /mnt/var
[root@Address21 ~]# chroot /mnt/raiz
[root@Address21 ~]# umount /boot 

O último comando acima pode dar um erro informando que o /boot não está montado. Apenas ignore e verifique, com o comando mount se não há nenhum /boot montado.


# mkdir /boot


# mount /dev/sdb1 /boot
-- (Usando o Grub para instalar o bootloader) --


# grub
Probing devices to guess BIOS drives. This may take a long time.

GNU GRUB version 0.97 (640K lower / 3072K upper memory)

[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename.]
grub> find /grub/grub.conf
find /grub/grub.conf
(hd0,0)
(hd1,0)
grub> root (hd1,0)
root (hd1,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd1)
setup (hd1)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd1)"... 27 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd1) (hd1)1+27 p (hd1,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit
quit

Depois, desmontamos o /boot e saímos do chroot.


# umount /boot


# exit]
exit

Agora é hora de remontar o /boot para editar o grub.conf

Com um editor abra o arquivo /mnt/boot/grub/grub.conf e substitua o valor de root para o UUID de sua partição /.
No meu caso, a parte a ser modificada está assim

title CentOS (2.6.32-431.29.2.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.29.2.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=pt_BR.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-431.29.2.el6.x86_64.img

e ficará assim

title CentOS (2.6.32-431.29.2.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.29.2.el6.x86_64 ro root=UUID=f63a1b02-a3c3-4409-ad4e-38ee1f8de9f5 rd_NO_LUKS LANG=pt_BR.UTF-8 rd_NO_MD rd_NO_LVM SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rhgb quiet
        initrd /initramfs-2.6.32-431.29.2.el6.x86_64.img

Salve as edições. Desmonte os pontos /mnt/boot e /mnt/var, remova tudo que estiver dentro dos diretórios /mnt/raiz/var e /mnt/raiz/boot, desligue o sistema, modifique o disco Primário de sua Máquina Virtual e inicie novamente para ver se tudo funcionou.

Até a próxima.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.