ddflash - criar mídia bootável do Linux e FreeBSD
Publicado por bruno (última atualização em 20/02/2020)
[ Hits: 1.231 ]
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 "$?"
Adicionando "automagicamente" usuários
SCRIPT PARA INSTALAÇÃO DE PROGRAMAS NO LINUX
Nenhum comentário foi encontrado.
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Muitas dificuldades ao instalar distro Linux em Notebook Sony Vaio PCG-6131L (VPCEA24FM)
Slackpkg+ (Slackpkg Plus) está de volta!
Como dividir duas janelas igualmente e lado-a-lado na sua tela
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Minha rede tem um espaço invisível que não dá pra digitar o nome da re... (1)
Pedagogia no brasil não passa de alfabetização por m4sturbação mental ... (2)
compilação samba 4.22 rock linux 9.5 (3)
Erro de segmentação «Segmentation fault (core dumped)» ao retornar obj... (7)