Pular para o conteúdo

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

Utilitário para criar mídia bootável do Linux e FreeBSD com o comando "dd".
bruno brunopvh
Hits: 1.609 Categoria: Shell Script Subcategoria: Avançado
  • Download
  • Nova versão
  • Indicar
  • Denunciar

Descrição

Utilitário para criar mídia bootável do Linux e FreeBSD com o comando "dd".
Download ddflash Enviar nova versão

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 "$?"

Script de Inventário

Sincronização entre Servidores de Impressão

Automatizador de instalação de flatpaks

Listando usuários em um grupo

Shell Script Avançado

Nenhum comentário foi encontrado.

Contribuir com comentário

Entre na sua conta para comentar.