[BASH] Script criador de USB Windows 10 Bootável para Linux (versão 0.4) - agora com detecção automática e outras funcionalidades

Recentemente tive que criar um usb bootável do Windows 10. Sei que existe programas e processos para este procedimento, mas achei que valia a pena fazer um pequeno script para isso.


versão 0.4

  • modificado o link do fórum
  • agora o awk mexe direto com o arquivo /proc/mounts
  • o script detecta se tem algum disco conectado na porta usb
  • detecta se o usb esta montado, se não estiver ele monta
  • mostra o disco que será montado, perguntando se quer continuar ou não
  • pega o tamanho do disco montado antes de continuar a cópia
  • o sudo agora só pergunta uma vez até que o script seja finalizado, independente do tempo de execução
  • o script aceita o crtl+c
  • caso não queira copitar e responda não, o script remove a montagem da imagem Windows10.iso e sai
  • agora trabalho com awk, lsblk, cut, sort e uniq

versão 0.3

  • apenas adicionado o link do fórum

versão 0.2

  • removido partes não necessárias
  • retirado sudo para cópia
  • adicionado comando para remover pasta do /mnt

Para o script funcionar, tenha certeza só exista uma partição no pen drive

O que fiz até o momento:

  1. Trabalha com a imagem do Windows10 montada na pasta /mnt
  2. Funciona com um ou mais driver removíveis. Caso exista mais de um o script pede para você escolher o usb
  3. Desmonta, formata e monta o pen drive coma label WINDOWS10
  4. Copia o conteúdo com o rsync, exibindo assim a porcentagem do progresso da cópia para o usb
  5. Ao finalizar, desmonta a imagem na pasta /mnt
  6. É utilizado o /dev/null para ocultar determinadas saídas de comandos. Se quiser pode ser retirado ( só remover &> /dev/null). Isso foi feito para deixar o processo de instalação mais limpo.
  7. O script está comentado
  8. Trabalha com /run/media
  9. Detecta se existe drive removível ou não
  10. Monta o drive se não estiver
  11. Mostra o drive selecionado que irá trabalhar
  12. Trabalha com sudo para algumas tarefas
  13. Captura o tamanho da partição selecionada

O nome deixei como criarusbwindows. Se quiser escolha outro nome.
Para chamar o script de modo fácil copie pare pasta /usr/local/bin/

sudo cp criarusbwindows /usr/local/bin/

Para funcionar de a permissão de executar

sudo chmod +x criarusbwindows

**Segue o script **

#!/bin/bash
# Cria usb bootável Windows 10
## versão 0.4
## https://plus.diolinux.com.br/t/22231

# Se teclar CTRL+C sair
  trap "exit" INT

# Função para pegar o tamanho do disco removível
pegartamanho(){
TAMANHO=`lsblk -n -r -o FSSIZE $DEVUSB`
}  
# Usar sudo com tempo infinito enquanto roda o script
  while :; do sudo -v; sleep 259; done &
  infiloop=$!
  
# Se não for root use o sudo
[ "$UID" != 0 ] && SU=sudo

# Texto de exibição antes de pedir senha sudo
  echo "O script precisa de permissão root para executar algumas tarefas na pastas /mnt e também na formatação do disco removível que será usado."

# Cria a pasta de ISO na /mnt
  $SU mkdir -p /mnt/ISO
  
# Monta uma imagem tipo CD/DVD na /mnt/ISO
echo "Montando imagem do Windows 10"
  $SU mount -o loop "$1" /mnt/ISO &> /dev/null

# Detecta o usb
# Conta as o número de montagens em /run/ de discos
CONTAGEM=`awk -e '$1 ~ /^\/dev/ && $2 ~ /^\/run/' /proc/mounts | wc -l `
# Se não existir montagem em /run
  if [[ "$CONTAGEM" == 0 ]]; then  
# DISCOUSADO (sem partição) e PARTICAO (com partição) 
     DISCOUSADO=`awk -F "/" '$2=="dev" && $1=="" {print $3}' /proc/mounts | cut -c-3 | sort | uniq`
     DISCONAOUSADO=`lsblk | awk -e '$1 ~ /^sd/ {print $1}' | grep -v "$DISCOUSADO"`
       if [[ -z "$DISCONAOUSADO" ]]; then 
          echo "Desmontando imagem do Windows 10 no /mnt"
          $SU umount /mnt/ISO 
          $SU rm -r /mnt/ISO
	  echo "Pronto."
          echo -e "[\e[1m Atenção: Nenhum disco removível inserido \e[0m]"
          exit 0
       else  
          PARTICAO=`lsblk -n -r -o NAME "/dev/$DISCONAOUSADO" | awk '$1~/s.*[[:digit:]]/'`
       fi
# Se tiver partição ou não
        if [[ -z "$PARTICAO" ]]; then                       
           NAOMONTADO="$DISCONAOUSADO"
        else
# Caso exista partição
           NAOMONTADO="$PARTICAO"
        fi
# Montar partição
     udisksctl mount -b "/dev/$NAOMONTADO" &> /dev/null
     DEVUSB="/dev/$NAOMONTADO" 
     pegartamanho
     echo "USB não montada. A montagem será em /dev/$NAOMONTADO com $TAMANHO"
# Se existir 1 partição montada     
  elif [[ "$CONTAGEM" == 1 ]] ; then
     DEVUSB=`awk -e '$1 ~ /^\/dev/ && $2 ~ /^\/run/ {print $1}' /proc/mounts`
     pegartamanho
     echo "A partição que será usada é $DEVUSB  com $TAMANHO"
  else
# Detecta mais de uma montagem para usar
     echo "Informação extra"
     awk -e '$1 ~ /^\/dev/ && $2 ~ /^\/run/ {print $1 " -----> " $2 }' /proc/mounts  
     echo -e Informe o número do usb para ser usado:
     OPCOES=($(awk -e '$1 ~ /^\/dev/ && $2 ~ /^\/run/ {print $1}' /proc/mounts))
        select USBSELEC in "${OPCOES[@]}"
        do
          DEVUSB="$USBSELEC"
          pegartamanho
          echo "A partição que será usada é $DEVUSB  com $TAMANHO"
          break;
       done
  fi
  
# Pergunta se quer continuar na montagem seleciona
	while read -p "O disco ou partição está correto? [S/n]" RESP ; do
  	  if [[ $RESP = "" ]]; then
   	     RESP="S"; break
  	  elif [[ $RESP = [SsNn] ]]; then
   	     break
 	  fi
	done

# Se a reposta for sim, então continuar   
   if [[ $RESP = [Ss] ]]; then
# Desmonta e formata para FAT32
    echo "Desmontando para formatar"
udisksctl unmount -b "$DEVUSB" &> /dev/null
    echo "Formatando USB para FAT32"
    $SU mkfs.vfat -n WINDOWS10 "$DEVUSB" &> /dev/null
# Copia arquivos para o pen drive
# Montando unidade
    echo "Montando para copiar para a unidade"
    udisksctl mount -b "$DEVUSB" &> /dev/null
    MEDIA=`df | grep "$DEVUSB"| awk '{print $6}'`
# Copiando arquivos para o USB
    echo "Copiando para $MEDIA"
rsync -rtpl --info=progress2 /mnt/ISO/. "$MEDIA"
# Desmontar imagem iso
    echo "Desmontando imagem do Windows 10"
    $SU umount /mnt/ISO
    $SU rm -r /mnt/ISO
echo "Pronto."
# Se a reposta for não, desmontar e finalizar
  elif [[ $RESP = [Nn] ]]; then
    echo "Desmontando imagem do Windows 10 no /mnt"
    $SU umount /mnt/ISO
    $SU rm -r /mnt/ISO
    echo "Pronto."
  fi
# Finalizar tempo infinito do sudo
  kill "$infiloop"
exit 0

Inicia com a partição não montada

Quando finaliza respondendo não

Quando se tem mais de um drive ou partição USB

Quando não tem nenhum drive correndo USB ( ou correndo no /run/)

5 curtidas

A microsoft bem que podia empacotar o criador de mídia do Windows em appimage ou flatpak, iria agilizar demais esse processo pra quem usa alguma distro baseada no Ubuntu, porque o ppa do WoeUSB não funciona.

Legal parabéns cara!

Pra quem quer o WoeUSB no Lubuntu 20.04 faça:

wget -qO - "https://winunix.github.io/debian/public.key" | sudo apt-key add -
echo "deb https://winunix.github.io/debian focal main" | sudo tee /etc/apt/sources.list.d/winunix-focal.list
sudo apt update
sudo apt install woeusb

verão 0.2

  • removido partes não necessárias
  • retirado sudo para cópia
  • adicionado comando para remover pasta do /mnt

O que vai ser feito ainda

  1. Caso tenha só uma montagem de usb, mostrar qual está montado antes de executar o script.
  2. Detectar se o pen drive está montado, caso não esteja, montar antes de prosseguir.

editado

versão 0.3

  • apenas adicionado o link do fórum

Nova versão

versão 0.4

  • modificado o link do fórum
  • agora o awk mexe direto com o arquivo /proc/mounts
  • o script detecta se tem algum disco conectado na porta usb
  • detecta se o usb esta montado, se não estiver ele monta
  • mostra o disco que será montado, perguntando se quer continuar ou não
  • pega o tamanho do disco montado antes de continuar a cópia
  • o sudo agora só pergunta uma vez até que o script seja finalizado, independente do tempo de execução
  • o script aceita o crtl+c
  • caso não queira copitar e responda não, o script remove a montagem da imagem Windows10.iso e sai
  • agora trabalho com awk, lsblk, cut, sort e uniq