ddflash - criar mídia bootável do Linux e FreeBSD
Publicado por bruno (última atualização em 20/02/2020)
[ Hits: 1.586 ]
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 "$?"
Adicionar usuarios em lote com senha padrao
Registar automáticamente o dns de uma maquina no DNS via DHCP
Teste de atividade e funcionamento de portas através do Nmap
Verificação e otimização do banco de dados MySQL
Instalação do Nagios por script
Nenhum comentário foi encontrado.
O Journal no Linux para a guarda e consulta de logs do sistema
A evolução do Linux e as mudanças que se fazem necessárias desde o seu lançamento
Maquina modesta - a vez dos navegadores ferrarem o usuario
Fscrypt: protegendo arquivos do seu usuário sem a lentidão padrão de criptograr o disco
Sway no Arch Linux: configuração Inicial sem enrolação
Resolvendo o bloqueio do Módulo Warsaw no Arch Linux (Porta 30900)
Continuando meus tópicos anteriores (0)
Saída de loop após teste de if. (2)
Governo da França vai trocar Windows por Linux (9)
Warsaw não é reconhecido no Google Chrome 147.0.7727.55 [RESOLVIDO] (9)









