AMARGO LIBS

ARCH INSTALL TEST

fevereiro 22, 2026

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