ddflash - criar mídia bootável do Linux e FreeBSD
Publicado por bruno (última atualização em 20/02/2020)
[ Hits: 1.174 ]
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 "$?"
Descobrir se um número é par ou impar
Função que indica o estado do funcionamento do script
estoque.sh - Gerenciamento de estoque/almoxarifado
Identifica contatos do google que necessitam de ajustes para o nono digito telefonico
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Arch Linux - Guia para Iniciantes (2)
Problemas ao instalar o PHP (11)
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)