quarta-feira, 24 de abril de 2013

USB-ZIP - Emulando Zip Drive em Pendrive

Como emular um Zip Drive no pendrive. Possibilitando de Instalação via rede,repositório local e PXE.


Cenário

O modo correto para inicializar um computador com um drive externo é configurar o dispositivo de arranque na BIOS como USB-HDD.

A tecnologia USB Hard Drive Disk é basicamente um HD externo e uma interface USB 2.0, que permite atingir velocidades compatíveis com as dos discos internos. Os pendrivers modernos emulam os discos USB-HDD e também funcionam como disco de arranque.

A geometria dos pendrivers é arbitrária (C-H-S). A BIOS de computadores antigos, sem suporte para USB-HDD, pode fazer sua própria interpretação desses parâmetros gerando conflitos e erros, que impedem a inicialização por dispositivos USB-HDD.

Isso não é um problema em computadores modernos que reconhecem e se ajustam aos vários tipos de dispositivos USB de inicialização, como os discos USB-HDD, USB-FDD, USB-Zip e USB-CDROM. Computadores com BIOS novas podem usar uma grande variedade de dispositivos externos e permitem inicializar a partir desses dispositivos sem qualquer restrição relativa à geometria ou com a capacidade da unidade.

A tecnologia dos pendrivers legados é baseada em memória flash (USB-Flash) e eles são minidiscos de estado sólido sem partes mecânicas. Como sua capacidade é limitada (até 2 GB), eles podem funcionar satisfatoriamente como pequenos discos removíveis, mesmo em interfaces lentas como USB 1.1.

Esses pendrivers utilizam sistemas de arquivos legados como FAT16, ou 32, que são amplamente implementados e permitem o intercâmbio dos dados entre diferentes sistemas.

O dispositivo de inicialização é uma escolha feita pelo usuário e configurada no programa SETUP, que faz parte da BIOS. No SETUP, o usuário faz uma série de escolhas relacionadas com o processo de arranque do computador e outros ajustes no hardware. Essas informações são lidas pelo sistema operacional e utilizadas para configurar a máquina.

Computadores antigos (ou com BIOS bugadas, pois a opção USB-HDD não funciona - Award BIOS), não conseguem dar partida com pendrivers. Entretanto, a maioria das BIOS legadas oferece uma opção de arranque para dispositivos USB-Zip. Isso permite emular um Zip Drive em um pen drive e conseguir o arranque. 

Um SETUP moderno, normalmente, tem opções para dispositivos de arranque USB como os da figura 1:

Linux: USB-ZIP - Emulando Zip Drive em Pendrive

Zip Drive

Os usuários mais jovens podem perguntar o que é um Zip Drive.

Em meados de 1994, uma empresa chamada Iomega, lançou uma tecnologia de armazenamento, na forma de um "super-disquete", que tinha alta capacidade (100 e 250 MB) e velocidade muito superior a um disquete tradicional.

Vários fabricantes licenciaram a tecnologia Zip Drive da Iomega e tiveram relativo sucesso de vendas. Essa tecnologia foi rapidamente superada pelo CD-R e CD-RW com velocidade, preço e qualidade muito melhores para uso como mídia em cópias de segurança.

Por volta de 1998, uma falha no projeto dos discos ZIP genéricos levou a Iomega a responder um processo por perdas de dados, movido coletivamente pelos usuários americanos, e a tecnologia desapareceu em torno de 2003. 

Emulação

Se o usuário selecionar a opção USB-Zip no SETUP do computador e configurar a geometria do pendrive de modo idêntico à de um Zip Drive, ele consegue "enganar" a BIOS, que fará arranque no pendrive, "pensando" ser uma unidade de disco Zip.

É possível emular um Zip Drive de 250 MB em modo nativo. Todavia, o Zip Drive emulado no pendrive pode, com segurança, ter até a 1 GB ou 2 GB em alguns casos.

O truque consiste em ajustar o número de cabeças (heads) para 64 e o de setores (sectors) para 32, como era a geometria dos Zip Drivers de 100 e 250 MB. Mas, o pulo do gato aqui, é criar uma única partição na posição primária número 4 (sdx4), configurá-la como bootável e formatá-la como FAT16, como eram formatados os discos do Zip Drive.

O Zip Drive de 100 MB tinha 96 cilindros e o de 250 MB tinha 239. Quando estiver emulando um disco Zip em seu pendrive, limite o número de cilindros em até 1024, para evitar limitações de arranque de BIOS e bootloaders legados. Devido a essa limitação do cilindro 1024 (vai de 0 até 1023), o tamanho máximo de um Zip emulado é 1 GiB.

  1024 C * 64 H * 32 S * 512 B = 1.024 ^ 3 = 1 GiB

Você pode trabalhar fora do padrão com pendrivers maiores que 1 GB, desde que as cabeças e setores sejam definidos em 64 e 32. O número de cilindros pode exceder a 1024, mas o tamanho da unidade não poderá passar de 2 GB, pois FAT16 não saberá lidar com isso!

Eu testei com pendrivers de 1, 2 e 4 GB, e somente o um pendrive de 2 GB "bootou" como USB-Zip em uma ASUS P4S533-X. Mas, 1 GB é suficiente para arrancar o vmlinuz (2,4 MB) e o initrd.gz (6 MB) da instalação HD-MEDIA, e ainda manter a ISO Debian Netinstall (252 MB).

A figura 2 elenca os códigos hexadecimais de tipos de partição e seus tamanhos máximos como eram reconhecidos pelo MS-DOS e Windows 95/98 naquela época.

Tenha paciência em relação à velocidade, pois estamos emulando a tecnologia de formatação do MS-DOS 4.0!

Linux: USB-ZIP - Emulando Zip Drive em Pendrive

Preparação do pendrive

Neste momento, vamos preparar um pendrive para funcionar como se fosse um Zip Drive.

Ele será preparado para instalação de um Debian 7 com imagem Netinstall. Para a preparação, você precisa de um GNU/Linux qualquer que esteja funcionando. Acredito que até com um LiveCD seja possível fazer a preparação.

* Aviso: este tutorial tem passos que se forem seguidos errados, podem destruir o sistema instalado. Cuidado e atenção!

mkdiskimage

O utilitário mkdiskimage, no Debian, faz parte do pacote "syslinux-common", é um script Perl, que tem como função criar uma imagem que simula um disco rígido em branco no padrão DOS. Esse script facilita a criação da emulação de Zip Drive, pois possui opções para isso.

# dpkg -S /usr/bin/mkdiskimage
syslinux-common: /usr/bin/mkdiskimage

# file -i /usr/bin/mkdiskimage
/usr/bin/mkdiskimage: text/x-perl; charset=us-ascii


A sintaxe de mkdiskimage, é:

  mkdiskimage [ -doFMz4 ] [ -i id ] file|device cyl head sect

A imagem pode ser criada em arquivo (file) ou diretamente no dispositivo (device), e terá o tamanho definido pelos parâmetros C-H-S. No tutorial mostro como criar diretamente no pendrive, por ser mais fácil. Se quiser criar em arquivo, use um dispositivo /dev/loopx para montar e depois copie com o comando dd para o dispositivo (* Isso não foi testado!).

Parâmetros opcionais são de mkdiskimage:
  • -4 :: Usa a quarta entrada da tabela de partições. Padrão para criar discos do tipo Zip Drive. Exemplo:/dev/sdx4.
  • -z :: Força a geometria de um Zip Drive. Significa "heads=64" e "sect=32".
  • -i ID :: Define um identificador de tipo de partição na tabela da MBR.
  • -d :: Adiciona um cabeçalho DOSEMU.
  • -M :: O argumento para cilindros, dado em MB.
  • -F :: Define a formatação em FAT32. Para Zip Driver, o padrão parece ser automaticamente definido como FAT16. Não altere isso!

Exemplo para um pen drive Kingston de 1 GB ou 981 MiB:

# mkdiskimage -4 /dev/sdb 900 64 32

# fdisk -l /dev/sdb
Disk /dev/sdb: 1007 MB, 1007681536 bytes
64 heads, 32 sectors/track, 961 cylinders, total 1968128 sectors
Units = setores of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x63047827

Dispositivo Boot      Start       End      Blocks   Id  System
/dev/sdb4    *         32     1843199      921584    6  FAT16


Observe que, automaticamente, foi criada uma partição em /dev/sdb4 que ocupou todo o espaço do dispositivo baseado no layout C-H-S de 960/64/32, especificado pelo usuário. O código hexadecimal do tipo de dispositivo é 0x06 - FAT16 padrão MS-DOS 4.0 (conforme figura 2).

* Dica: se quiser, pode deixar o argumento de número de cilindros para ser preenchido automaticamente. Basta informar o valor como zero (0) e o sistema usará todo o espaço do pendrive. Em um pendrive de 2 GB, isso funcionou muito bem!

# mkdiskimage -4 /dev/sdx 0 64 32

SYSLINUX

A técnica consiste em instalar um bootloader chamado SYSLINUX, baseado em sistemas de arquivos DOS (FAT16 ou FAT32). Esse sistema facilita bastante a instalação de uma distribuição GNU/Linux e está presente nas mídias de instalação de muitas distribuições.

A instalação de SYSLINUX coloca um código de arranque na MBR e um arquivo chamado "ldlinux.sys" na raiz do dispositivo. Isso permite dar sequência ao processo de arranque.

O arquivo "syslinux.cfg" indicará um kernel (vmlinuz) e um "initrd.gz", igual ao modo que LILO ou GRUBfazem. Observe que os nomes de arquivos aqui são do tipo DOS (8.3) e são case insensitive, pois estamos em FAT16 (lembre-se disso!).

* Atenção: se durante o processo de boot o usuário teclar Shift ou Alt, um prompt no estilo LILO - boot: será apresentado. Isso permite passagem de parâmetros para o kernel sem editar "syslinux.cfg". Mas, esses argumentos podem ser inseridos no arquivo, de modo permanente do mesmo modo que opções "append" do LILO.

A preparação de um disco com SYSLINUX é tão fácil quanto parece, basta preparar um disco com formatação do tipo DOS (FAT16 ou FAT32) e executar a instalação de SYSLINUX.

A sintaxe variará um pouco, dependendo do sistema hospedeiro (DOS, XP ou GNU/Linux), então, consulte o manual para os detalhes. No Debian, o pacote se chama "syslinux". Antes de instalar SYSLINUX é preciso montar o dispositivo ou a imagem em arquivo.

* Atenção: observe como seu pendrive é identificado no sistema. Se errar o nome do dispositivo neste ponto, pode destruir uma instalação!

# mount -t vfat -o rw /dev/sdx4 /mnt/pen
# syslinux --install /dev/sdx4
# ls -l /mnt/pen #Confirme a presença do arquivo ldlinux.sys


HD-MEDIA

O Debian disponibiliza uma imagem de instalação para uso em pendrives, netbooks e partições de recuperação (Rescue).

Como neste artigo estamos utilizando uma versão testing, o endereço e o nome da imagem pode mudar. Procure no Google por "Debian HD-MEDIA", para obter um endereço atualizado.
Para uma instalação modo texto, pegue os arquivos "initrd.gz" e "vmlinuz". Para uma instalação modo gráfico, pegue esses mesmos arquivos na pasta "gtk". Obviamente, maiores e mais pesados. Copie para o dispositivo em /mnt/pen.

O arquivo "initrd.gz" pode ser descompactado e copiado como initrd. Neste caso, basta mudar o nome quando necessário. Eu mantenho como "initrd.gz" para evitar dúvidas!

Netinstall

As imagens Netinstall do Debian permitem instalação de um sistema básico (ideal para servidores sem interface gráfica) a partir de pequenas imagens (até 252 MB). A instalação é basicamente via rede e é necessário acesso à Internet ou um repositório local.

A imagem Netinstall pode ser obtida em:
Para arquitetura X86_32, pode ser obtida aqui:
Copie para o /mnt/pen como "wheezy.iso", pois estamos em FAT16.

syslinux.cfg

Prepare o arquivo "syslinux.cfg" do seguinte modo com seu editor de textos preferido:

#======================
default Netinstall
timeout 200
prompt 1
LABEL Netisntall
KERNEL vmlinuz
APPEND initrd=initrd.gz
#======================


Seu diretório deve ter os seguintes arquivos:

# ls -lh
total 261M
-rwxr-xr-x 1 root root 6,0M Abr 17 11:24 initrd.gz
-r-xr-xr-x 1 root root  32K Abr 17 11:23 ldlinux.sys
-rwxr-xr-x 1 root root  217 Abr 17 12:22 syslinux.cfg
-rwxr-xr-x 1 root root 2,4M Abr 17 11:24 vmlinuz
-rwxr-xr-x 1 root root 252M Abr 17 11:24 wheeze.iso


Desmonte o pendrive e configure a BIOS para o dispositivo de inicialização do tipo USB-Zip e teste. Aguarde a continuação deste artigo para automatizar a instalação do Debian Wheezy


Nenhum comentário:

Postar um comentário