ddflash - criar mídia bootável do Linux e FreeBSD

Publicado por bruno (última atualização em 20/02/2020)

[ Hits: 1.174 ]

Download ddflash




Utilitário para criar mídia bootável do Linux e FreeBSD com o comando "dd".

  



Esconder código-fonte

#!/usr/bin/env bash
#
# AUTOR: Bruno Chaves.
#
# INFO:
# Criador de mídia bootável para linux e freebsd.
# para as distribuições linux use arquivos .iso
# será criado com um comando similar a este:
#     dd if=imagem.iso of=/dev/sdx bs=4M status=progress conv=sync
#
# para freebsd use arquivos .img.xz
# será criado com um comando similar a este:
#     xz -dc FreeBSD-12.0-RELEASE-amd64-mini-memstick.img.xz > /dev/sdx
#
# NÃO informe número de partições para este programa, ex: /dev/sdx1
# USE apenas o dispositivo, ex: /dev/sdx (sem informar partição)
#
# REQUERIMENTOS:
# awk|gawk|mawk, bash, ser ("root") ou usar ("sudo").
#
# Para maior comodidade na execução você pode colocar este arquivo em um
# diretório incluso na variável $PATH por exemplo: 
# sudo cp -vu ddflash /usr/local/bin/ddflash; sudo chmod a+x /usr/local/bin/ddflash
#
#---------------------------------------------------#
# Instalando a última versão:
# sudo sh -c 'wget https://raw.githubusercontent.com/Brunopvh/ddflash/master/ddflash -O /usr/local/bin/ddflash'
# sudo chmod a+x /usr/local/bin/ddflash
#---------------------------------------------------#
# Github: https://github.com/Brunopvh/ddflash
#---------------------------------------------------#
#
VERSAO='2019-11-25'
#

function _c() { 
   [[ -z $2 ]] && { echo -e "\e[1;$1m"; return 0; } 
   [[ -z $2 ]] && { echo -e "\e[$2;$1m"; return 0; }
}

[[ $(id -u) == '0' ]] || { 
   echo "$(_c 31)==> Você não e [root]$(_c) saindo..." 
   exit 1
}

#------------------------------------------------------------#

# check cli.
function _check_cli_utils()
{
while [[ $1 ]]; do
    if [[ -x $(which "$1") ]]; then
        echo -en "\r"

    else
        echo -e "==> Instale o pacote: $(_c 32)$1 $(_c)"
        return 1
    fi
    shift
done
}

#------------------------------------------------------------#

# Requeriments
array_cli_utils=('awk' 'xz' 'dd' 'awk')

# Cli
_check_cli_utils "${array_cli_utils[@]}" || { 
   echo "$(_c 31)==> $(_c)A função: _check_cli_utils retornou [ERRO]"; exit "$?"; 
}

esp='-------------'

echo -e "$esp[ $(date) ]$esp"

#------------------------------------------------------------#

function usage()
{
cat <<EOF
Use: 
   $(basename $0) <device> <imagem.iso>

Ex: 
   $(basename $0) /dev/sdc debian.iso
   $(basename $0) /dev/sdc freebsd.img.xz

Opções:
     --help          Mostra este menu e sai.
     --version       Mostra versão e sai.
EOF
exit 0
}

#------------------------------------------------------------#

function _sn()
{
    read -p "$(_c 32)==> $(_c)Deseja prosseguir [$(_c 32)s$(_c)/$(_c 31)n$(_c)] ? : " SN
    if [[ "${SN,,}" == 's' ]]; then
        return 0
    else
        return 1
    fi
}

#------------------------------------------------------------#

# Arg 1
if [[ -z $1 ]]; then
    usage; exit 1

elif [[ "$1" == '--help' ]]; then
    usage; exit 0

elif [[ "$1" == '--version' ]]; then
    echo -e "$(basename $0) V${VERSAO}"; exit 0

fi

#------------------------------------------------------------#

# Umount
function _umount_device()
{
# $1 = device
# $2 = mount point

#eval umount -Rl "$2"
umount -A "$1"

if grep "$1" '/proc/mounts'; then
    return 1
else
    return 0
fi
}

#------------------------------------------------------------#

function _check_mount()
{
num_part=$(lsblk | grep "$(basename $pen)[0-9]" | wc -l)
mount_point_pen=$(grep "$pen" '/proc/mounts' | awk '{print $2}') # está variável não está mais em uso.

n="$num_part"

   while [[ "$n" != '0' ]]; do
      if grep -q "${pen}${n}" '/proc/mounts'; then
         echo -e "==> Desmontando: $(_c 32)${pen}${n} $(_c)"
         _umount_device "${pen}${n}"
      fi

      n="$(($n-1))"
      sleep 0.5
   done

   if grep -q "$pen" '/proc/mounts'; then
      echo "$(_c 31)==> A função: _umount_device retornou [ERRO] $(_c)"
      return 1

   else
      echo "$(_c 32)==> $(_c) $pen desmontado com sucesso"
      return 0

   fi
}


#------------------------------------------------------------#

# Zerar $pen.
function _destroy_device()
{
# $1 = device
dd if=/dev/zero of="$1" bs=512 count=1 conv=sync 1> /dev/null

if [[ $? == '0' ]]; then
    return 0
else
    return 1
fi
}

#------------------------------------------------------------#

# flash_iso
function _flash_iso()
{
# $1 = device
# $2 = imagem

[[ ! -f "$2" ]] && { echo "$(_c 31)==> $(_c)Arquivo inválido: $2"; return 1; }

if dd if="$2" of="$1" bs=4M status=progress conv=sync; then
    return 0
else
    return 1
fi
}

#------------------------------------------------------------#

# flash_tar_xz
function _flash_xz()
{
# $1 = device
# $2 = imagem

[[ ! -f "$2" ]] && { echo "$(_c 31)==> $(_c)Arquivo inválido: $2"; return 1; }
# xz -dc FreeBSD-12.0-RELEASE-amd64-mini-memstick.img.xz > /dev/da0

if xz -dcv "$2" > "$1"; then
    return 0
else
    return 1
fi
}

#-------------------------- Execução ---------------------#

# Pen
if [[ $(ls "$1") ]]; then
    pen="$1"

else
   echo -e "$(_c 31)==> $(_c)Dispositivo inválido: $1"
   exit 1
fi

#------------------------------------------------------------#

# Iso/img
if [[ -z $2 ]]; then
    usage; exit 0

elif [[ -f "$2" ]]; then
    img="$2"

elif [[ ! -f "$2" ]]; then
    echo -e "$(_c 31)==> $(_c)Arquivo inválido: $2" 
   exit 1

fi

#------------------------------------------------------------#

# Tamanho do pen.
tam_pen=$(lsblk | grep -m 1 'sdb' | awk '{print $4}' | sed 's/\,/\./g')

# Tamanho do arquivo.
tam=$(du -hs "$img" | awk '{print $1}')

# Informações corretas ?
echo -e "==> Dispositivo USB: $pen [$tam_pen]"
echo -e "==> Imagem ISO: $img [$tam]"
_sn

[[ "$?" == '0' ]] || { echo -e "$(_c 31)==> $(_c)Saindo..."; exit 0; }

#------------------------------------------------------------#

# $pen está montado ?
[[ $(grep "$pen" '/proc/mounts') ]] && {
   while ! _check_mount; do 
      echo "$(_c 31)Função _check_mount retornou erro $(_c)"
      echo "==> Você pode $(_c 32)repetir $(_c)ou $(_c 32)sair $(_c): (r/s)"
      read -n 1 rs

      if [[ "${rs,,}" == 'r' ]]; then
         continue
      elif [[ "${rs,,}" == 's' ]]; then
         exit 1; break
      fi
   done
}

# Zera $pen.
echo -e "$(_c 31)==> $(_c)Zerar o dispositivo $pen" 
_sn
[[ "$?" == '0' ]] || { echo "$(_c 31)==> $(_c)Abortando..."; exit 0; }

_destroy_device "$pen"
[[ $? == '0' ]] || { echo "$(_c 31)==> $(_c)A função: _destroy_device retornou [ERRO]"; exit "$?"; }

sync

echo "$(_c 32)==> $(_c)Copiando midia: $img [$tam]"
echo "$(_c 32)==> $(_c)Dispositivo: $pen [$tam_pen]"

if [[ $(echo "$img" | grep '.iso') ]]; then
    _flash_iso "$pen" "$img"

elif [[ $(echo "$img" | grep '.img.xz') ]]; then
    _flash_xz "$pen" "$img"

else
    echo "$(_c 31)==> $(_c)Arquivo não suportado: $img"
    exit 1

fi


if [[ "$?" == '0' ]]; then
    echo -e "$(_c 35)==> $(_c)Operação finalizada com sucesso."

else
    echo -e "$(_c 31)==> $(_c)Operação encerrada com [ERRO]"

fi

exit "$?"

Scripts recomendados

Adicionando usuários

Descobrir se um número é par ou impar

Função que indica o estado do funcionamento do script

estoque.sh - Gerenciamento de estoque/almoxarifado

Identifica contatos do google que necessitam de ajustes para o nono digito telefonico


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts