ddflash - criar mídia bootável do Linux e FreeBSD
Publicado por bruno (última atualização em 20/02/2020)
[ Hits: 1.480 ]
Utilitário para criar mídia bootável do Linux e FreeBSD com o comando "dd".
#!/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 "$?"
mPlayRecTv - assista e grave a programação da TV com MPlayer
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Como fazer a instalação do Samba
Como fazer a conversão binária e aplicar as restrições no Linux
Duas Pasta Pessoal Aparecendo no Ubuntu 24.04.3 LTS (21)
Formas seguras de instalar Debian Sid (13)
Malware encontrado em extensões do Firefox. (0)
Fiz uma pergunta no fórum mas não consigo localizar [RESOLVIDO] (21)









