Como criar um USB inicializável a partir de um ISO inicializável com a linha de comando no Linux?

50

Eu tenho um CD criado a partir de um arquivo ISO que eu uso para instalar uma versão personalizada do Ubuntu via plop linux.

O CD funciona bem, mas eu gostaria de usar uma unidade USB inicializável. Eu usei o comando dd para tentar criar o USB inicializável:

dd if=filename.iso of=/dev/sdb1 bs=4k

Agora isso copia os arquivos e torna o USB inicializável, mas recebo o erro "Sistema operacional ausente"

Alguma ideia?

xsdf
fonte
Você só tem acesso à linha de comando? Há interfaces como Unetbootin que o trabalho muito bem e rodar em Linux ..
painel
3
@dashboard Eu preferiria a linha de comando, pois está disponível em todas as máquinas Linux.
Xsdf
askubuntu.com/questions/116942/…
Ciro Santilli escreveu
@dashboard - As ferramentas da GUI nunca parecem funcionar bem para mim, e isso sempre acontece há muitos anos. Estou feliz em saber o método da linha de comando. Acho mais fácil e mais confiável. É muito menos frustrante!
MountainX

Respostas:

58

Ok, depois de alguma pesquisa, descobri uma solução, e eu passo a passo passo a passo. O problema era duplo.

  1. Conecte a unidade flash USB e determine o dispositivo em que está montado com o comando:

    sudo fdisk -l
    

    Desta vez, foi / dev / sdc1 para mim, então vou usar isso como meu exemplo.

  2. Montar o dispositivo

    umount /dev/sdc1
    
  3. Não tenho certeza se necessário, mas eu formatei a unidade no FAT32, apenas no caso

    sudo mkdosfs -n 'USB-Drive-Name' -I /dev/sdc -F 32
    
  4. Agora minha ISO estava usando isolinux e não syslinux. Eu sabia que funcionava com CDs, então descobri que precisava chamar o comando isohybrid, que permite que um ISO seja reconhecido pelo BIOS a partir de um disco rígido.

     isohybrid filename.iso
    

    Você pode descobrir mais sobre esse comando aqui , mas essa foi a causa da mensagem "Sistema operacional ausente" O primeiro problema foi corrigido, mas agora dizia "isolinux.bin estava ausente ou corrompido"

  5. O próximo passo é copiar o iso. Meu segundo problema estava aqui, onde eu estava copiando para a partição, sdc1, não para o dispositivo, sdc.

    sudo dd if=filename.iso of=/dev/sdc bs=4k
    

    Isso parece funcionar muito bem, mas no fórum em que obtive a última correção, foi recomendável fazer o seguinte antes de desconectar o dispositivo:

    sync
    sudo eject /dev/sdc
    
xsdf
fonte
3
Aqui está uma maneira de verificar o progresso do dd: unix.stackexchange.com/a/11264/13011 .
Nikos Alexandris
3
Fazendo uma suposição aqui, acho que o mkdosfscomando pode não ser necessário, pois o iso já possui um sistema de arquivos (provavelmente incluindo um MBR, não tenho certeza) que é copiado para o início do dispositivo de bloco. Cara, isohybridé um comando legal, não sabia disso!
Ehtesh Choudhury
11
para Windows 7 inicializável instalar USB, veja também superuser.com/questions/256869/...
cwd
7
O passo 3 é desnecessário; o ddcomando na etapa 5 obliterará o sistema de arquivos recém-criado com o conteúdo da ISO.
ewhac
Estou perto de 12 horas procurando esse mesmo problema até encontrar o seu post aqui e segui e pisei ... funcionou! (o passo 5 foi o meu problema também, eu não estou prono linux ainda, então obrigado)
Ismael
3

Esse é um problema comum nos pen drives USB da SanDisk, ou não formatados no FAT32.

Caso contrário, é certamente um problema com a ordem de partição do seu stick ou com o arquivo syslinux.cfg.

Shouvik Sayef
fonte
A unidade flash USB é da Verbatim. Eu reformatei o FAT32 apenas para ter certeza e ainda tenho o mesmo erro.
Xsdf
1

isohybridnem sempre funciona. Por exemplo, eu tinha um .iso no FreeDOS e o isohybrid não conseguiu encontrar alguns arquivos importantes lá (não sei se eles deveriam ter sido colocados lá pelo syslinux, que eu usei também, ou qualquer outra coisa). Eu proponho várias alternativas aqui.

1) Instale outro gerenciador de inicialização, como o GRUB. É explicado aqui :

"Suponha que a primeira partição do seu pendrive é o FAT32 e sua partição é / dev / sdy1" (eu tinha grub2no meu Fedora Core, então mudei um pouco os comandos):

# mkdir -p /mnt/usb ; mount /dev/sdy1 /mnt/usb
# grub2-install --target=i386-pc --recheck --debug --boot-directory=/mnt/usb/boot /dev/sdy
# grub2-mkconfig -o /mnt/usb/boot/grub2/grub.cfg

# optional, backup config files of grub.cfg
# mkdir -p /mnt/usb/etc/default
# cp /etc/default/grub /mnt/usb/etc/default
# cp -a /etc/grub.d /mnt/usb/etc

# sync; umount /mnt/usb

2) O wiki do FreeDOS oferece um método composto com GRUB e syslinux aqui (embora eu não entenda como eles foram lançados grub>- eu não conseguia inicializar a partir do usb até esse estágio).

3) Aqui está uma postagem que pode ser útil - diz 'Enquanto os arquivos command.com, kernel.sys, syslinux.cfg, ldlinux.sys e fat32lba.bss estiverem na raiz da unidade, o MBR e a inicialização setor não são reescritos, a unidade deve permanecer inicializável. '

4) Aqui é explicado como gerar um arquivo .iso inicializável com um gerenciador de inicialização syslinux. Eles nem usam iso-híbrido. Infelizmente isso não me ajudou (talvez por causa do syslinux).

5 *) Use um programa do Windows via wine. Eu tentei o rufus, no entanto, isso não funcionou, não foi possível encontrar o dispositivo.

Eu aviso que, infelizmente, não consegui resolver esse problema, meu dispositivo não foi inicializado, mas espero que isso possa ser útil para outras pessoas (também para aqueles que desejam instalar não um linux no usb). A imagem usb gerada pelo chtaube funcionou para mim, então acho que esses métodos estão corretos.

UPD: O terceiro método realmente funciona (com uma correção para um arquivo de instalação personalizado).

UPD2: (links fixos). O problema com isohybridfoi provavelmente porque as versões do isolinux.bin no iso e no meu sistema eram diferentes. Recompilou o iso usando genisoimagecomo sugerido aqui :

genisoimage -l -r -J -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -c isolinux/boot.cat -o fd11new.iso fd11new

Também houve alguns problemas, eles foram resolvidos pelo método aqui antes da genisoimage:

cp /boot/extlinux/*.c32 fd11new/isolinux/
extlinux --install /boot/isolinux

== end UPD2 ==

Yaroslav Nikitenko
fonte
2º: freedos.sourceforge.net/wiki/index.php/USB#Linux_2 Você pode adicionar esses links à postagem se o sistema confiar em você mais do que eu. O StackOverflow já me conhece bem, então por que esse problema no superusuário? Também tive problemas ao postar isso, não me mostrou que minha resposta já foi postada.
Yaroslav Nikitenko
Parece que o superusuário conta os links por suas referências, ou seja, se eu vincular duas vezes a um mesmo recurso, será contado. Isto parece ser um inseto. Uma solução alternativa no UPD veio de spiderbird.com/tag/fat32lba-bss
Yaroslav Nikitenko
Todos os links nos comentários foram corrigidos. Deixo-os aqui para mostrar quantos problemas essa política traz.
Yaroslav Nikitenko
0

Você pode usar o bootisoutilitário , que faz exatamente isso, com segurança:

bootiso -d /dev/sdb filename.iso

O bootiso verifica se o dispositivo selecionado /dev/sdbestá conectado via USB e falha se não, o que é uma grande vantagem de segurança. Ele também detectará automaticamente o dispositivo USB se houver exatamente uma unidade USB conectada ao seu sistema, veja-a em ação:

Se você deseja instalar o gerenciador de inicialização syslinux para contornar os problemas mencionados por @xsdf, use a -bopção:

 bootiso -b -d /dev/sdb filename.iso

Para instalá-lo:

curl -L https://rawgit.com/jsamr/bootiso/latest/bootiso -O
chmod +x bootiso
Jules Randolph
fonte