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

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

[ Hits: 1.171 ]

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

Cálculo de raiz quadrada

Servidor HTTP em Bash

Download do Banco de dados NCBI NT (DNA)

Editor de configurações para Tint2

Fazendo backup de uma pasta em arquivos separados


  

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