|
#!/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 |
|
|