ddflash - criar mídia bootável do Linux e FreeBSD
Publicado por bruno (última atualização em 20/02/2020)
[ Hits: 1.492 ]
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 "$?"
Compilando o apache2.2 com php5 e mysql5.1 no slackware
Backup de Repositórios Subversion
Iniciar nova instância do Firefox quando o mesmo não está respondendo
Nenhum comentário foi encontrado.
LazyDocker – Interface de Usuário em Tempo Real para o Docker
Instalando COSMIC no Linux Mint
Turbinando o Linux Mint: o poder das Nemo Actions
Inteligência Artificial no desenvolvimento de software: quando começar a usar?
[Resolvido] Algo deu errado ao abrir seu perfil
Usando o VNSTAT para medir o seu consumo de internet
Habilitando clipboard manager no ambiente COSMIC
Quando vocês pararam de testar distros? (8)
Quais licenças open source têm valor jurídico? (7)
Não estou conseguindo fazer funcionar meu Postfix na versão 2.4 no Deb... (1)









