ddflash - criar mídia bootável do Linux e FreeBSD
Publicado por bruno (última atualização em 20/02/2020)
[ Hits: 1.171 ]
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 "$?"
Download do Banco de dados NCBI NT (DNA)
Editor de configurações para Tint2
Fazendo backup de uma pasta em arquivos separados
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
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (11)