domingo, 30 de abril de 2017

Transplantando instalação do XP para o VirtualBox

Pelos mais variados, às vezes absurdos, motivos, cacarecos com Windows XP ainda estão na ativa. Em geral, hardware cambaleante. Um provável meio de lidar com o abacaxi é passá-los para dentro de ambientes virtualizados. Sendo o VirtualBox gratuito, é a solução que usarei aqui.

Existem diversas ferramentas[1] para extrair o conteúdo do disco onde as velharias residem. O Symantec Ghost, o mais clássico dos programas para tal fim, suporta salvar diretamente em VMDK (VMware) desde a versão 11.5 e em VHD (Virtual PC, Hyper-V) desde a 12.

No entanto, usando a GUI do programa, não é possível salvar nesses formatos. Só permite fazê-lo no seu formato nativo GHO. Recorremos então à linha de comando.

O gdisk32 chamado sem argumentos nos dá os índices de cada dispositivo (estou rodando-o no Windows PE):

Disk  Partitions  Cylinders  Heads  Sectors  Mbytes  Model
  1        1        14593     255      63  114473.5  PH4-CE120
  2        1        38913     255      63  305245.3  WDC WD32 00BPVT-22JJ5T0 01

Com isso, acertamos src= nos comandos abaixo de acordo com a coluna "Disk".

VMDK:

ghost32 -clone,mode=create,src=1,dst=<unidade>:\caminho\imagem.vmdk -batch

Para salvar em VHD[2], basta mudar a extensão:

ghost32 -clone,mode=create,src=1,dst=<unidade>:\caminho\imagem.vhd -batch

Ambos formatos são suportados pelo VirtualBox. Prefiro VHD pois podemos montá-lo pelo Windows Explorer desde o 8. No 7, também é possível, porém sem a mesma praticidade, porque precisa ser feito via Gerenciamento de disco ou diskpart.

Agora, basta criar nova máquina virtual do tipo Windows XP (32-bit)[3] e usar a imagem VHD existente como disco. Detalhe importante! Até o XP, havia a salada de HALs! Caso o PC de origem use um dos HALs APIC (ACPI Uniprocessor PC ou ACPI Multiprocessor PC), você precisa marcar a opção "Habilitar o I/O APIC" nas propriedades, do contrário não iniciará:


Por fim, instale os Adicionais para Convidado.

Se você tiver imagens GHO, pode convertê-las para VMDK ou VHD usando o próprio Ghost:

ghost32 -clone,mode=restore,src=<unidade>:\caminho\imagem.gho,dst=<unidade>:\caminho\imagem.vmdk -batch
ghost32 -clone,mode=restore,src=<unidade>:\caminho\imagem.gho,dst=<unidade>:\caminho\imagem.vhd -batch


[1] O popular Disk2vhd é uma alternativa.
[2] VHD tem limite de ~2 TiB. O Ghost não suporta VHDX, formato mais novo, introduzido no Windows 8.1, sem a limitação. Nem faria diferença, pois igualmente não funciona no VirtualBox.
[3] Nem considerei o XP 64-bit pois é um Unicórnio. Em máquinas virtuais XP, o VirtualBox configura o controlador de disco IDE, que deve iniciar com qualquer instalação.

sexta-feira, 21 de abril de 2017

O útil blkdiscard

Todo mundo conhece o fstrim, que instrui o sistema de arquivos a avisar ao SSD quais blocos não está mais usando.

Digamos que temos uma partição e que desejamos apagar sua área por completo. Tradicionalmente, usaríamos algo como:

# dd if=/dev/zero of=/dev/sdxy bs=4k

Contudo, com SSDs, existe uma forma mais rápida e prática:

# blkdiscard -v /dev/sdxy

Esse comando usa a requisição BLKDISCARD da chamada de sistema ioctl() e nos entrega a área que compreende a partição /dev/sdxy zerada. Por usar o comando ATA TRIM, é rápido. Não funciona com discos rígidos. Neles, o kernel retorna erro e o comando avisa que não há suporte.

Ou seja, blkdiscard é análogo ao fstrim, porém trabalha no nível do dispositivo de bloco, não do sistema de arquivos. Pode ser usado no disco inteiro também (/dev/sdx).

[Atualização - 20/06/2017] Infelizmente, não é todo SSD que garante setores zerados depois de TRIM. Por isso não podemos depender do blkdiscard para limpar discos, partições. A saída é usar blkdiscard -z (abaixo) ou continuar com o dd.

Mesmo com HDDs, pode ser útil em certos casos*, pois com a opção -z (--zeroout) faz o mesmo que o dd faria:

# blkdiscard -z -v /dev/sdxy

blkdiscard -z usa a requisição BLKZEROOUT da chamada de sistema ioctl().

Com -v, mostra um sumário ao término do processo.

Versão mínima requerida do kernel é 2.6.28 (BLKDISCARD) e 3.7 (BLKZEROOUT) e a ferramenta existe desde a versão 2.23 da suíte util-linux.


* Não recomendo rodá-lo em áreas grandes demais, maiores do que alguns gigabytes, de discos rígidos. Enquanto a chamada de sistema não retornar, o processo fica no estado uninterruptible sleep e não pode ser terminado manualmente.

sexta-feira, 7 de abril de 2017

quarta-feira, 5 de abril de 2017

Unity e Mir estão mortos

Ubuntu Unity is dead: Desktop will switch back to GNOME next year (Ars Technica)

Vão para a cova ao lado da ocupada pelo Upstart. Que descansem em paz. GNOME + Wayland a partir do Ubuntu 18.04 LTS.

Visto que são projetos cobertos por CLA, não é de estranhar que tenham morrido...

A divisão desnecessária causada pelo Mir tem um fim com esse anúncio. Tivesse a Canonical não despejado FUD sobre o Wayland quando iniciou sua aventura solo sem apoio comunitário, talvez hoje tivéssemos o protocolo Wayland em estágio de desenvolvimento mais avançado bem como melhores compositores.

domingo, 2 de abril de 2017

Autoconfiguração de proxy com NetworkManager + PACRunner

No NetworkManager 1.6, temos novidades na forma de lidar com configuração automática de proxies. Agora, o NM pode obter a configuração via WPAD (DHCP) e enviá-la ao PACRunner, outro daemon, ativado via D-Bus, que trata de processar o JavaScript recebido e responder às requisições dos clientes. Os proxies podem ser configurados de acordo com a interface, caso mais de uma exista.

Os clientes falam diretamente com o PACRunner usando sua interface via D-Bus, ou, para os que linkam a libproxy, uma biblioteca de compatibilidade provida pelo daemon faz o mesmo. Essa biblioteca substitui a libproxy original, sendo mais simples e eficiente. Trabalha apenas consultando-o via D-Bus.

O design está aqui: https://wiki.gnome.org/Projects/NetworkManager/Proxies

        +----------------+
        | NetworkManager |
        +----------------+
                |
                | D-Bus (org.pacrunner.Manager.CreateProxyConfiguration)
                v
        +----------------+         +-----------+
        |   PACRunner    | <---->  | v8, mozjs |
        +----------------+         +-----------+
            ^         ^
            |          \ D-Bus (org.pacrunner.Client.FindProxyForURL)
            |           +----------+
            |                       \
            |                        v
            |             +----------------------+
            |             |                      |
            |             |    libproxy.so do    |
            |             |      PACRunner       |
            |             |   (API compatível)   |
            |             |                      |
            |             +----------------------+
            |                        ^
            |                        | libproxy API (px_proxy_factory_get_proxies)
            |                        v
            |                  +-----------+
            |                  | Cliente 2 |
            |                  +-----------+
            |
            | D-Bus (org.pacrunner.Client.FindProxyForURL)
            v
      +-----------+
      | Cliente 1 |
      +-----------+

Nem tudo são flores

E se o cliente não conversar com o PACRunner via D-Bus nem linkar a libproxy? Daí restam as variáveis de ambiente, que são terrivelmente problemáticas com autoconfiguração de proxy e não são suportadas pelo PACRunner.

Arch e openSUSE não empacotam o PACRunner. Já a versão que está no Fedora é velha demais e é compilada com --disable-libproxy.

Bugs

NetworkManager 1.6.2 (última versão estável enquanto escrevo) não envia a configuração ao PACRunner (BGO#780558).

Ainda ruim

Autoconfiguração de proxy no GNU/Linux tem avançado a passos de tartaruga. O esqueleto de uma configuração funcional existe; os clientes, contudo, precisam parar de depender de variáveis de ambiente. Visto que a libproxy possui uma API simples, o ecosistema poderia padronizar nela a tarefa de lidar com proxies. Dos componentes básicos, a libcurl é usada por muitos códigos que acessam a internet. Precisaria ser a primeira a passar a usá-la (patch existe).