Skip to content

Instantly share code, notes, and snippets.

@arvati
Last active July 21, 2026 00:17
Show Gist options
  • Select an option

  • Save arvati/c9d439a95ed27dee2059b4f27bb98995 to your computer and use it in GitHub Desktop.

Select an option

Save arvati/c9d439a95ed27dee2059b4f27bb98995 to your computer and use it in GitHub Desktop.
Script para criar disco bootável com exFAT automontável, GRUB Dual-Boot (Legacy+UEFI) e Debian Btrfs em LUKS2.
#!/usr/bin/env bash
# diagnostico_usb.sh - Diagnóstico de automount do Windows para drives USB/NVMe
set -euo pipefail
if [ "$EUID" -ne 0 ]; then
echo "[ERRO] Execute este script como root (sudo)."
exit 1
fi
DEVICE="${1:-}"
if [ -z "$DEVICE" ] || [ ! -b "$DEVICE" ]; then
echo "Uso: sudo $0 /dev/sdX (ou /dev/nvmeXn1)"
exit 1
fi
echo "======================================================"
echo " DIAGNÓSTICO DE AUTOMOUNT NO WINDOWS - $DEVICE"
echo "======================================================"
echo -e "\n[1] Verificando Tipo de Disco (Removível vs Fixo)..."
BUS_TYPE=$(lsblk -d -no TRAN "$DEVICE" 2>/dev/null || echo "Desconhecido")
RM_FLAG=$(cat "/sys/block/$(basename "$DEVICE")/removable" 2>/dev/null || echo "0")
echo " -> Tipo de transporte: $BUS_TYPE"
echo " -> Flag de Removível do Kernel: $RM_FLAG"
if [ "$RM_FLAG" -eq 0 ]; then
echo " [AVISO] O adaptador relata o NVMe como DISCO FIXO (Não Removível)."
echo " O Windows exige rigor máximo nos IDs e atributos das partições GPT."
fi
echo -e "\n[2] Analisando Tabela de Partições (fdisk / sgdisk)..."
fdisk -l "$DEVICE"
echo -e "\n[3] Verificando GUID e Atributos GPT com 'sgdisk'..."
if command -v sgdisk &>/dev/null; then
PART_NUMS=$(lsblk -ln -o PARTN "$DEVICE" | grep -v '^$' || true)
for p in $PART_NUMS; do
echo "--- Partição $p ---"
TYPE_GUID=$(sgdisk -i="$p" "$DEVICE" | grep "Partition GUID code" || true)
ATTRIBUTES=$(sgdisk -A="$p":show "$DEVICE" || true)
echo " $TYPE_GUID"
echo " Atributos: $ATTRIBUTES"
# Validação do GUID para Windows Basic Data
if echo "$TYPE_GUID" | grep -iq "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7"; then
echo " [OK] GUID é 'Microsoft Basic Data' (Requisito do Windows)."
elif echo "$p" | grep -q "1"; then
echo " [FALHA] A partição $p NÃO está como 'Microsoft Basic Data'! O Windows vai ignorar a partição exFAT."
fi
done
else
echo " [!] Instale 'gdisk' (sudo apt install gdisk) para verificação detalhada dos GUIDs."
fi
echo -e "\n[4] Testando Assinatura do Sistema de Arquivos exFAT..."
lsblk -f "$DEVICE"
echo -e "\n======================================================"
echo " RESUMO DOS MOTIVOS MAIS COMUNS DE FALHA NO WINDOWS:"
echo " 1. Partição exFAT não é a #1 no layout GPT/MBR."
echo " 2. O GUID no GPT não é 'Basic Data' (EBD0A0A2-B9E5-4433-87C0-68B6B72699C7)."
echo " 3. Atributo GPT 62 (Hidden) ou 63 (NoAutomount) está ativado."
echo "======================================================"

Como testar o arquivo .img gerado no QEMU?
Se você escolheu a Opção 2 (criar pendrive.img), pode testá-lo antes de gravar na mídia física usando estes dois comandos no Debian:

Para testar em Modo UEFI:

sudo apt install ovmf
qemu-system-x86_64 -m 2048 -hda pendrive.img -bios /usr/share/ovmf/OVMF.fd

Para testar em Modo Legacy BIOS:

qemu-system-x86_64 -m 2048 -hda pendrive.img

Se tudo inicializar conforme o esperado na imagem, você pode gravar o pendrive.img diretamente no seu NVMe USB a qualquer momento rodando:

sudo dd if=pendrive.img of=/dev/sdX bs=4M status=progress conv=fsync
#!/usr/bin/env bash
# criar_multiboot_debian.sh - Script completo para criar Pendrive/NVMe ou Arquivo .IMG
# com exFAT automontável, GRUB Dual-Boot (Legacy+UEFI) e Debian Btrfs em LUKS2.
set -euo pipefail
# --- VERIFICAÇÃO DE ROOT ---
if [ "$EUID" -ne 0 ]; then
echo -e "\e[31m[ERRO] Este script precisa ser executado como root (sudo).\e[0m"
exit 1
fi
echo -e "\e[32m
===================================================================
CRIADOR DE MULTIBOOT DEBIAN (NVMe/USB + LUKS2 + BTRFS + EXFAT)
===================================================================\e[0m"
# --- INSTALAÇÃO DE DEPENDÊNCIAS ---
echo -e "\n[1/8] Instalando dependências no host..."
apt-get update -qq
apt-get install -y -qq debootstrap gdisk parted exfatprogs cryptsetup btrfs-progs \
dosfstools grub-pc-bin grub-efi-amd64-bin kpartx qemu-utils > /dev/null
# --- MENU DE SELEÇÃO DE MÍDIA ---
echo -e "\nEscolha o destino da instalação:"
echo "1) Dispositivo Físico (ex: /dev/sdX ou /dev/nvme0n1)"
echo "2) Arquivo de Imagem de Disco (pendrive.img)"
read -p "Opção [1 ou 2]: " MODO_DESTINO
TARGET_DEV=""
IS_LOOP=0
IMG_FILE="pendrive.img"
if [ "$MODO_DESTINO" == "2" ]; then
read -p "Tamanho da imagem em GiB (ex: 32, 64): " IMG_SIZE
echo -e "\nCriando arquivo de imagem $IMG_FILE com ${IMG_SIZE}GiB..."
qemu-img create -f raw "$IMG_FILE" "${IMG_SIZE}G"
# Associa a imagem a um dispositivo de loopback
TARGET_DEV=$(losetup --find --show "$IMG_FILE")
IS_LOOP=1
echo "Imagem associada ao dispositivo loopback: $TARGET_DEV"
else
read -p "Digite o caminho do dispositivo (EX: /dev/sdX): " TARGET_DEV
if [ ! -b "$TARGET_DEV" ]; then
echo -e "\e[31m[ERRO] Dispositivo inválido: $TARGET_DEV\e[0m"
exit 1
fi
echo -e "\n\e[31mATENÇÃO: TODOS OS DADOS EM $TARGET_DEV SERÃO DESTRUÍDOS!\e[0m"
read -p "Confirma a formatação? (digite 'SIM'): " CONFIRM
if [ "$CONFIRM" != "SIM" ]; then
echo "Operação cancelada."
exit 1
fi
fi
# --- SENHA DO LUKS2 ---
echo -e "\n"
read -sp "Defina a SENHA para a partição criptografada (LUKS2): " LUKS_PASS
echo
read -sp "Confirme a SENHA: " LUKS_PASS_CONFIRM
echo
if [ "$LUKS_PASS" != "$LUKS_PASS_CONFIRM" ]; then
echo -e "\e[31m[ERRO] As senhas não coincidem!\e[0m"
[ $IS_LOOP -eq 1 ] && losetup -d "$TARGET_DEV"
exit 1
fi
# --- PARTICTIONAMENTO GPT ---
echo -e "\n[2/8] Limpando e Particionando o Disco (Alinhamento 32MB)..."
wipefs --all --force "$TARGET_DEV"
sgdisk --clear "$TARGET_DEV"
# P1: exFAT (32 GiB - Dados automontável no Windows) -> GUID Microsoft Basic Data
sgdisk -n 1:65536:+32G -t 1:EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 -c 1:"DATA_EXFAT" "$TARGET_DEV"
# P2: BIOS Boot (2 MiB) -> GRUB Legacy
sgdisk -n 2:0:+2M -t 2:21686148-6449-6E6F-744E-656564454649 -c 2:"BIOS_BOOT" "$TARGET_DEV"
# P3: EFI System Partition (512 MiB FAT32) -> GRUB UEFI
sgdisk -n 3:0:+512M -t 3:C12A7328-F81F-11D2-BA4B-00A0C93EC93B -c 3:"EFI_BOOT" "$TARGET_DEV"
# P4: Debian LUKS2 + Btrfs (Restante do disco)
sgdisk -n 4:0:0 -t 4:8309 -c 4:"DEBIAN_LUKS" "$TARGET_DEV"
# Garantir ausência de atributos de ocultação na P1
sgdisk -A 1:clear:62 "$TARGET_DEV" || true
sgdisk -A 1:clear:63 "$TARGET_DEV" || true
# Mapeia partições
if [ $IS_LOOP -eq 1 ]; then
partprobe "$TARGET_DEV"
kpartx -av "$TARGET_DEV"
LOOP_NAME=$(basename "$TARGET_DEV")
P1="/dev/mapper/${LOOP_NAME}p1"
P2="/dev/mapper/${LOOP_NAME}p2"
P3="/dev/mapper/${LOOP_NAME}p3"
P4="/dev/mapper/${LOOP_NAME}p4"
else
partprobe "$TARGET_DEV"
sleep 2
if [[ "$TARGET_DEV" =~ "nvme" ]]; then
P1="${TARGET_DEV}p1"; P2="${TARGET_DEV}p2"; P3="${TARGET_DEV}p3"; P4="${TARGET_DEV}p4"
else
P1="${TARGET_DEV}1"; P2="${TARGET_DEV}2"; P3="${TARGET_DEV}3"; P4="${TARGET_DEV}4"
fi
fi
# --- FORMATAÇÃO E CRIPTOGRAFIA ---
echo -e "\n[3/8] Formatando Partições..."
mkfs.exfat -n "DATA_NVME" "$P1"
mkfs.vfat -F 32 -n "EFI_BOOT" "$P3"
echo -e "\n[4/8] Criando Contêiner LUKS2 e Subvolume Btrfs..."
echo -n "$LUKS_PASS" | cryptsetup luksFormat --type luks2 --batch-mode "$P4" -
echo -n "$LUKS_PASS" | cryptsetup open "$P4" target_luks -
mkfs.btrfs -f -L "DEBIAN_ROOT" /dev/mapper/target_luks
# Criar subvolume @
MOUNT_TEMP=$(mktemp -d)
mount /dev/mapper/target_luks "$MOUNT_TEMP"
btrfs subvolume create "$MOUNT_TEMP/@"
umount "$MOUNT_TEMP"
rmdir "$MOUNT_TEMP"
# Estrutura de Montagem da Instalação
TARGET_DIR=$(mktemp -d)
mount -o subvol=@ /dev/mapper/target_luks "$TARGET_DIR"
mkdir -p "$TARGET_DIR/boot/efi"
mount "$P3" "$TARGET_DIR/boot/efi"
# --- DEBOOTSTRAP ---
echo -e "\n[5/8] Baixando e Instalando Debian Basico (pode demorar alguns minutos)..."
debootstrap \
--arch=amd64 \
--components=main,contrib,non-free,non-free-firmware \
--include=linux-image-amd64,firmware-linux,firmware-realtek,firmware-iwlwifi,initramfs-tools,grub-efi-amd64-bin,grub-pc-bin,cryptsetup,btrfs-progs,dosfstools,exfatprogs,sudo,network-manager,locales,nano \
bookworm \
"$TARGET_DIR" \
http://deb.debian.org/debian/
# --- CONFIGURAÇÃO DIRETA DOS ARQUIVOS EM /etc/ (SEM CHROOT) ---
echo -e "\n[6/8] Configurando fstab, crypttab e grub no novo sistema..."
UUID_LUKS=$(blkid -s UUID -o value "$P4")
UUID_BTRFS=$(blkid -s UUID -o value /dev/mapper/target_luks)
UUID_EFI=$(blkid -s UUID -o value "$P3")
# /etc/crypttab
cat <<EOF > "$TARGET_DIR/etc/crypttab"
target_luks UUID=$UUID_LUKS none luks
EOF
# /etc/fstab
cat <<EOF > "$TARGET_DIR/etc/fstab"
UUID=$UUID_BTRFS / btrfs defaults,subvol=@ 0 0
UUID=$UUID_EFI /boot/efi vfat umask=0077 0 2
EOF
# /etc/default/grub
cat <<EOF > "$TARGET_DIR/etc/default/grub"
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=\`lsb_release -i -s 2>/dev/null || echo Debian\`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="cryptdevice=UUID=$UUID_LUKS:target_luks root=/dev/mapper/target_luks rootflags=subvol=@"
GRUB_ENABLE_CRYPTODISK=y
EOF
# --- AJUSTE DE PERMISSÕES DOS ARQUIVOS EM /etc ---
chown root:root "$TARGET_DIR/etc/crypttab" "$TARGET_DIR/etc/fstab" "$TARGET_DIR/etc/default/grub"
chmod 600 "$TARGET_DIR/etc/crypttab"
chmod 644 "$TARGET_DIR/etc/fstab" "$TARGET_DIR/etc/default/grub"
# Define o caminho dentro do diretório do target
CUSTOM_GRUB_FILE="$TARGET_DIR/etc/grub.d/40_custom"
# 1. Escreve o conteúdo do menu customizado
cat << 'EOF' > "$CUSTOM_GRUB_FILE"
#!/bin/sh
exec tail -n +3 $0
# Este arquivo é um script executável que adiciona entradas personalizadas ao grub.cfg
menuentry "Carregar ISO Live do Debian (Loopback)" {
set isofile="/debian-live.iso"
search --no-floppy --file $isofile --set=root
loopback loop $isofile
linux (loop)/live/vmlinuz boot=live findiso=$isofile components quiet splash
initrd (loop)/live/initrd.img
}
menuentry "Reboot (Reiniciar a Máquina)" {
reboot
}
menuentry "Poweroff (Desligar a Máquina)" {
halt
}
EOF
# 2. Ajusta o Proprietário/Grupo para root:root
chown root:root "$CUSTOM_GRUB_FILE"
# 3. Define a Permissão 755 (Essencial para o update-grub executar o script)
chmod 755 "$CUSTOM_GRUB_FILE"
# Definir senha do root no sistema gerado
echo "root:root" | chpasswd --root "$TARGET_DIR"
# --- INSTALAÇÃO DO BOOTLOADER (VIA CHROOT RAPIDO) ---
echo -e "\n[7/8] Instalando GRUB2 Dual-Boot (Legacy BIOS + UEFI)..."
for d in /dev /dev/pts /proc /sys /run; do mount --bind $d "$TARGET_DIR$d"; done
# --- EXECUÇÃO NO CHROOT RAPIDO ---
chroot "$TARGET_DIR" /bin/bash -c "
update-initramfs -u -k all
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Debian --removable
grub-install --target=i386-pc '$TARGET_DEV'
update-grub
"
# --- DESMONTAGEM E LIMPEZA ---
echo -e "\n[8/8] Finalizando e desmontando tudo com segurança..."
umount -R "$TARGET_DIR"
rm -rf "$TARGET_DIR"
cryptsetup close target_luks
if [ $IS_LOOP -eq 1 ]; then
kpartx -dv "$TARGET_DEV"
losetup -d "$TARGET_DEV"
echo -e "\e[32m
===================================================================
SUCESSO! A imagem foi gerada em: $PWD/$IMG_FILE
Você pode testá-la via QEMU executando:
qemu-system-x86_64 -m 2048 -hda $IMG_FILE -bios /usr/share/ovmf/OVMF.fd
===================================================================\e[0m"
else
echo -e "\e[32m
===================================================================
SUCESSO! Seu dispositivo físico $TARGET_DEV está pronto!
- Partição 1 (exFAT) será automontada pelo Windows.
- Suporte a boot em BIOS Antigas (Legacy) e novas (UEFI).
- Debian instalado com Btrfs criptografado via LUKS2.
===================================================================\e[0m"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment