ddflash - criar mídia bootável do Linux e FreeBSD
Publicado por bruno (última atualização em 20/02/2020)
[ Hits: 1.406 ]
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 "$?"
Protegendo arquivos contra acessos simultâneos
Mantenha seu relógio ajustado 2.0
Script que gera um relatório diário do sistema!!!
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Instalação dualboot Windows 11 e Debian 13 (28)
Ubunto não reconhece rede ethernet (3)
Preciso recuperar videos *.mp4 corrompidos (13)









