quinta-feira, 15 de setembro de 2011

Usando o Windows PE 3.0 e o Ghost32 para criar um disco de restauração

Seguindo o tutorial sobre o uso do Ghost32 pela rede (Usando o Windows PE 3.0 para rodar o Ghost32 pela rede), aqui vai outro sobre como usar o Windows PE 3.0 para criar um disco de restauração automatizado.

Quem lembra daqueles CDs Quick Restore que vinham nos PCs Compaq? Pois o objetivo foi criar algo que fizesse a mesma coisa, usando o Windows PE 3.0, uma imagem do Ghost como base e tendo scripts para automatizar.

O Windows PE é o mesmo do tutorial anterior. Irei copiar a parte comum de lá.

- Baixe o Windows AIK do 7 em pt-BR. Não precisa gravar o DVD. Extraia o conteúdo do ISO com algum programa tipo 7-Zip, WinRAR, UltraISO, e instale:
O kit de Instalação Automatizada do Windows® (Windows AIK) para Windows® 7

- Inicie o prompt rodando-o como Administrador:
Iniciar -> Microsoft Windows AIK -> Prompt de Comando da Ferramentas de Implantação

Usarei como pasta de trabalho C:\PE

1 - Copie a árvore de arquivos para trabalhar com o Windows PE -- versão 32-bit.

copype.cmd x86 C:\PE

2 - Para remover a mensagem "Pressione qualquer tecla para inicializar pelo CD" quando iniciar o sistema, exclua o arquivo bootfix.bin.

del C:\PE\ISO\boot\bootfix.bin

3 - Monte a imagem do Windows PE.

dism /mount-wim /wimfile:C:\PE\winpe.wim /index:1 /mountdir:C:\PE\mount

4 - Instale o suporte a scripts VBScript e a WMI (Windows Management Instrumentation).

dism /image:C:\PE\mount /add-package /packagepath:"C:\Program Files\Windows AIK\Tools\PETools\x86\WinPE_FPs\winpe-scripting.cab"
dism /image:C:\PE\mount /add-package /packagepath:"C:\Program Files\Windows AIK\Tools\PETools\x86\WinPE_FPs\pt-br\winpe-scripting_pt-br.cab"
dism /image:C:\PE\mount /add-package /packagepath:"C:\Program Files\Windows AIK\Tools\PETools\x86\WinPE_FPs\winpe-wmi.cab"
dism /image:C:\PE\mount /add-package /packagepath:"C:\Program Files\Windows AIK\Tools\PETools\x86\WinPE_FPs\pt-br\winpe-wmi_pt-br.cab"

5 - Copie o Ghost32.

copy "C:\caminho\para\ghost32.exe" "C:\PE\mount\Windows\System32"

6 - Crie um arquivo de texto com o seguinte conteúdo, salve como letramidia.vbs

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colMidia = objWMIService.ExecQuery("Select * From Win32_LogicalDisk Where DriveType = '5' and VolumeName = 'GHOSTIMGDISC'")
If colMidia.Count = 0 Then
    Wscript.Echo "inexistente"
Else
    For Each objMidia in colMidia
        Wscript.Echo objMidia.DeviceID
    Next
End If

e copie-o.

copy "C:\caminho\para\letramidia.vbs" "C:\PE\mount\Windows\System32"

7 - Crie um arquivo de texto com o seguinte conteúdo, salve como limpa.txt

select disk 0
clean
exit

e copie-o.

copy "C:\caminho\para\limpa.txt" "C:\PE\mount\Windows\System32"

8 - Crie um arquivo de texto com o seguinte conteúdo, salve como startnet.cmd

@echo off
title DISCO DE RESTAURACAO
wpeinit
echo.
echo -------------------------------------------------------------------------------
echo ---------------------------- DISCO DE RESTAURACAO -----------------------------
echo -------------------------------------------------------------------------------
echo.
echo Retire qualquer dispositivo de armazenamento externo (pendrive, MP3 player,
echo cartao de memoria, HD externo) antes de continuar.
echo.
echo TODOS os dados do HD serao excluidos!
echo.
set resposta=
:resploop
set /p resposta=Quer continuar? (S/N)
if "%resposta%"=="" (goto resploop) else (if "%resposta%"=="s" (goto continuar) else (if "%resposta%"=="n" (goto retirardisco) else (goto resploop)))
:continuar
set midia=
for /f "delims=" %%a in ('cscript //nologo letramidia.vbs') do set midia=%%a
if "%midia%"=="inexistente" goto semmidia
cls
ghost32.exe -clone,mode=restore,src=%midia%\imagem.gho,dst=1 -sure -fx
if errorlevel 1 goto problema
cls
echo.
echo Completado com sucesso!
echo.
echo Retire o CD do drive.
goto fim
:problema
diskpart /s limpa.txt >nul 2>&1
cls
echo.
echo Aconteceu algum problema!
echo O HD ficara sem sistema operacional.
echo.
echo Retire o CD do drive.
goto fim
:semmidia
cls
echo.
echo Midia nao encontrada.
goto fim
:retirardisco
cls
echo.
echo Retire o CD do drive.
:fim
echo Pressione qualquer tecla para reiniciar.
pause >nul
exit

e copie-o, substituindo o existente.

copy "C:\caminho\para\startnet.cmd" "C:\PE\mount\Windows\System32"

9 - Desmonte a imagem.

dism /unmount-wim /mountdir:C:\PE\mount /commit

10 - Copie a imagem WIM para a árvore do ISO.

copy C:\PE\winpe.wim C:\PE\ISO\sources\boot.wim

11 - Crie o arquivo ISO.

oscdimg -u2 -lGHOSTIMGDISC -bC:\PE\etfsboot.com C:\PE\ISO "C:\caminho\para\disco_restore.iso"

Usado o sistema de arquivos UDF (-u2), para poder colocar arquivos maiores de 4GB, afinal uma imagem do Windows Vista/7 (ou mesmo do XP dependendo dos programas) pode ficar maior. Por padrão o oscdimg usa UDF 1.50.

E está pronto. Agora tudo se resume a injetar na raiz desse ISO de referência, usando o UltraISO ou similar, o arquivo com a imagem do Ghost que você tiver, tendo o cuidado de usar o nome imagem.gho, que é o nome que o script CMD busca. Só gravar num DVD depois.

Outro ponto importante é que o rótulo do disco (GHOSTIMGDISC) não pode ser alterado, pois o script que localiza a letra da unidade óptica baseia-se nele.

Não sou lá muito bom com scrips CMD (menos ainda com VBScript), mas pelos meus testes ficou razoável.

FUNCIONAMENTO

- Ao ser carregado, o Windows PE 3.0 carrega o script startnet.cmd. Depois de carregar o wpeinit, o script questiona se o usuário quer continuar. Respostas fora de s/n são ignoradas.

- Ao responder sim, o script letramidia.vbs, consultando a WMI por drives ópticos que tenham um volume com rótulo GHOSTIMGDISC, popula a variável %midia% com a letra da unidade óptica que contém o disco -- importante, pois a letra varia de acordo com as partições que existirem no HD. Se não for encontrada, retorna "inexistente" para o script CMD, que direciona para mensagem de erro/reiniciar. Do contrário, se a mídia for encontrada, roda o Ghost no modo automático (restore, que apaga tudo que tiver no disco e coloca a imagem no lugar), mostrando a interface do programa para termos o progresso da operação. Terminado o Ghost, avalia o errorlevel retornado por ele e, caso "1" (falha), roda o diskpart para limpar o HD (não é seguro deixar uma restauração capenga) e direciona para mensagem de erro/reiniciar. Do contrário, mostra mensagem de sucesso e pede para retirar a mídia e reiniciar.

- Respondendo não, aborta e avisa para retirar a mídia e reiniciar.

MIÚDOS

- A Microsoft não colocou o comando choice no console do Windows PE 3.0. Com ele teríamos um método mais profissional de questionar o usuário. A solução foi uma gambiarra com set /p.
- Não existe um meio nativo de determinar a letra da unidade que foi usada para carregar o Windows PE 3.0 quando usa-se mídia óptica. Com dispositivos USB existe este método, porém não funciona para drives ópticos. A solução foi consultar a WMI para caçar a letra da unidade (com o script letramidia.vbs).
- Como é um script CMD, se o usuário pressionar Crtl+C o abortará. Cruzemos os dedos para que ele não faça! hehehe
- Ao rodar wpeinit a rede é inciada via DHCP. Não tem utilidade para o disco aqui proposto, mas não fui atrás para ver se dá para desativar.
- Em PCs com mais de um HD, o primeiro HD do barramento será usado. Os demais não serão alterados.
- Fique a vontade para customizar. Provavelmente dê para fazer tudo em VBScript, que seria mais "elegante".

ATUALIZAÇÃO

Para atualizar para o Windows PE 3.1, baixe:

Windows® AIK (Kit de Instalação Automatizada) para Windows® 7 SP1

Esse é só um pacote de atualização, que precisa ser aplicado sobre o AIK anterior.

Extraia o conteúdo do arquivo waik_supplement_pt-br.iso usando o UltraISO, WinRAR, ou similar.

Abra o prompt de comando como Administrador e rode:

xcopy "C:\caminho\para\waik_supplement_pt-br" "C:\Program Files\Windows AIK\Tools\PETools" /ERDY

Recrie seu Windows PE e pronto. Windows PE 3.1, baseado no NT 6.1.7601, também conhecido por Windows 7 SP1 :)

Uma dica para quem quiser usar um arquivo batch para automatizar a criação do sistema: o comando copype.cmd x86 C:\PE, ao ser chamado por um batch, precisa ser chamado com call, do contrário o script é encerrado nele. Fica então, dentro do batch, call copype.cmd x86 C:\PE.

Um comentário:

  1. Muito bom seu post! Me ajudou muito.
    Precisava muito descobrir um jeito de criar uma ISO do Windows PE, mas para instalá-lo por Windows PE.
    Seu post foi muito útil!
    Um abraço!

    ResponderExcluir