#!/bin/bash
set -e
# === CONFIGURAÇÕES ===
USE_LVM="yes"
ENCRYPT_LVM="no"
SWAP_SIZE="4G"
EFI_SIZE="512M"
TIMEZONE="America/Sao_Paulo"
LANG="pt_BR.UTF-8"
# === FUNÇÕES ===
die() {
echo "ERRO: $1" >&2
exit 1
}
show_disks() {
echo -e "\nDiscos disponíveis:"
lsblk -d -o NAME,SIZE,MODEL,ROTA,TRAN,FSTYPE | awk 'NR==1 {print $0} NR>1 && !/loop/ {print $0}'
}
select_disk() {
while true; do
show_disks
read -p "Disco para instalar (ex: sda): " TARGET_DISK
if [ -b "/dev/$TARGET_DISK" ]; then
break
else
echo "Disco não encontrado!"
fi
done
}
calculate_sizes() {
local total_bytes=$(blockdev --getsize64 "/dev/$TARGET_DISK")
local suggested_root=$(echo "$total_bytes" | awk '{printf "%dG\n", $1/1024/1024/1024*0.7}')
read -p "Tamanho partição raiz (Padrão $suggested_root): " ROOT_SIZE
[ -z "$ROOT_SIZE" ] && ROOT_SIZE="$suggested_root"
}
check_boot_mode() {
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS"
}
partition_disk() {
local disk="/dev/$1"
local boot_mode="$2"
wipefs -a "$disk"
sgdisk --zap-all "$disk"
if [ "$boot_mode" = "UEFI" ]; then
sgdisk -n 1:0:+$EFI_SIZE -t 1:ef00 -c 1:"EFI System" "$disk"
sgdisk -n 2:0:0 -t 2:8e00 -c 2:"Linux LVM" "$disk"
EFI_PART="${disk}1"
LVM_PART="${disk}2"
else
sgdisk -n 1:0:+2M -t 1:ef02 -c 1:"BIOS Boot" "$disk"
sgdisk -n 2:0:0 -t 2:8e00 -c 2:"Linux LVM" "$disk"
LVM_PART="${disk}2"
fi
partprobe "$disk"
sleep 2
}
setup_lvm() {
local lvm_part="$1"
local encrypt="$2"
local vg_name="vg0"
if [ "$encrypt" = "yes" ]; then
cryptsetup luksFormat --type luks2 "$lvm_part"
cryptsetup open "$lvm_part" cryptlvm
lvm_part="/dev/mapper/cryptlvm"
fi
pvcreate "$lvm_part"
vgcreate "$vg_name" "$lvm_part"
lvcreate -L "$ROOT_SIZE" -n root "$vg_name"
[ "$SWAP_SIZE" != "0" ] && lvcreate -L "$SWAP_SIZE" -n swap "$vg_name"
lvcreate -l 100%FREE -n home "$vg_name"
}
format_filesystems() {
mkfs.ext4 -q /dev/vg0/root
mkfs.ext4 -q /dev/vg0/home
[ "$SWAP_SIZE" != "0" ] && mkswap /dev/vg0/swap && swapon /dev/vg0/swap
[ "$BOOT_MODE" = "UEFI" ] && mkfs.fat -F32 "$EFI_PART"
}
mount_filesystems() {
mount /dev/vg0/root /mnt
mkdir -p /mnt/home
mount /dev/vg0/home /mnt/home
if [ "$BOOT_MODE" = "UEFI" ]; then
mkdir -p /mnt/boot/efi
mount "$EFI_PART" /mnt/boot/efi
fi
}
copy_system() {
rsync -aAX --progress / /mnt --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found}
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /run /mnt/run
}
configure_system() {
# Usando aspas em 'EOF' para evitar que variáveis expandam antes do chroot
chroot /mnt /bin/bash <<'EOF_CHROOT'
set -e
ln -sf /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime
hwclock --systohc
echo "pt_BR.UTF-8 UTF-8" > /etc/locale.gen
locale-gen
# Hostname e Hosts (Escritos diretamente para evitar conflito de Heredoc)
echo "meu-pc" > /etc/hostname
echo "127.0.0.1 localhost meu-pc" > /etc/hosts
apt update
apt install -y grub2 lvm2 cryptsetup network-manager sudo
[ -d /sys/firmware/efi ] && apt install -y efibootmgr
# Gráfico de instalação do GRUB
if [ -d /sys/firmware/efi ]; then
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian
else
grub-install /dev/sda
fi
update-grub
# Criação de usuário simplificada para script automático
useradd -m -G sudo -s /bin/bash usuario
echo "usuario:senha" | chpasswd
systemctl enable NetworkManager
EOF_CHROOT
}
cleanup() {
umount -R /mnt 2>/dev/null || true
[ -b /dev/mapper/cryptlvm ] && cryptsetup close cryptlvm
}
# === EXECUÇÃO ===
[ "$(id -u)" -eq 0 ] || die "Use como root!"
select_disk
calculate_sizes
BOOT_MODE=$(check_boot_mode)
partition_disk "$TARGET_DISK" "$BOOT_MODE"
setup_lvm "$LVM_PART" "$ENCRYPT_LVM"
format_filesystems
mount_filesystems
copy_system
configure_system
cleanup
echo "Instalação concluída!"