ddflash - criar mídia bootável do Linux e FreeBSD
Publicado por bruno (última atualização em 20/02/2020)
[ Hits: 1.043 ]
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 "$?"
Criação de unidades criptografadas
Liberar cliente SSH no firewall
Gerenciamento com firewalld no CentOS 7
Nenhum comentário foi encontrado.
Atenção a quem posta conteúdo de dicas, scripts e tal (2)
Criando um gateway de internet com o Debian
Configuração básica do Conky para mostrar informações sobre a sua máquina no Desktop
Aprenda a criar músicas com Inteligência Artificial usando Suno AI
Entendendo o que é URI, URL, URN e conhecendo as diferenças entre POST e GET
Ativando o Modo Noturno via Linha de Comando no GNOME/Wayland
Preparando pendrive com GNU/Linux [Corretamente!]
Instalando Google Chrome no Fedora 40
Habilitando a importação de senhas no Firefox
Como corrigir o erro do VirtualBox travar a máquina virtual em tela cheia
Notebuxo positivo vaio VJFE43F11X Something has gone seriously wrong... (9)
Como adicionar módulo de saúde da bateria dos notebooks Acer ao kernel... (35)
Tema escuro Codeblocks no Debian 12 LXqt ... (0)
Como faço pra um script ser executado apenas abrindo um terminal e dan... (9)