#!/usr/bin/env bash set -Eeuo pipefail if (( EUID != 0 )); then echo "Lance ce script avec sudo." >&2 exit 1 fi if (( $# != 1 )); then printf 'Usage : %s /dev/nvmeXnY\n' "$0" >&2 exit 2 fi readonly DISK="$(readlink -f "$1")" readonly MOUNT_ROOT="/mnt" [[ -b "$DISK" ]] || { echo "Périphérique invalide : $DISK" >&2; exit 1; } if findmnt -rn "$MOUNT_ROOT" >/dev/null 2>&1; then echo "$MOUNT_ROOT est déjà monté. Démonte-le avant de continuer." >&2 exit 1 fi if lsblk -nr -o MOUNTPOINTS "$DISK" | grep -q '/'; then echo "Le disque ou une de ses partitions est monté. Abandon." >&2 lsblk -o NAME,MODEL,SIZE,FSTYPE,MOUNTPOINTS "$DISK" exit 1 fi lsblk -o NAME,MODEL,SIZE,TRAN,FSTYPE,MOUNTPOINTS "$DISK" printf '\nCette opération efface entièrement %s.\n' "$DISK" read -rp "Tape exactement ERASE $DISK : " confirmation [[ "$confirmation" == "ERASE $DISK" ]] || { echo "Annulé."; exit 0; } part_suffix="" [[ "$DISK" =~ [0-9]$ ]] && part_suffix="p" readonly EFI_PART="${DISK}${part_suffix}1" readonly ROOT_PART="${DISK}${part_suffix}2" wipefs -af "$DISK" parted -s "$DISK" mklabel gpt parted -s "$DISK" mkpart ESP fat32 1MiB 1025MiB parted -s "$DISK" set 1 esp on parted -s "$DISK" mkpart ARCH btrfs 1025MiB 100% partprobe "$DISK" udevadm settle mkfs.fat -F 32 -n EFI "$EFI_PART" mkfs.btrfs -f -L ARCH "$ROOT_PART" mount "$ROOT_PART" "$MOUNT_ROOT" btrfs subvolume create "$MOUNT_ROOT/@" btrfs subvolume create "$MOUNT_ROOT/@home" btrfs subvolume create "$MOUNT_ROOT/@log" btrfs subvolume create "$MOUNT_ROOT/@pkg" umount "$MOUNT_ROOT" readonly OPTS="rw,relatime,ssd,discard=async,space_cache=v2" mount -o "$OPTS,subvol=@" "$ROOT_PART" "$MOUNT_ROOT" mkdir -p "$MOUNT_ROOT"/{boot,home,var/log,var/cache/pacman/pkg,.snapshots} btrfs subvolume create "$MOUNT_ROOT/.snapshots" mount -o "$OPTS,subvol=@home" "$ROOT_PART" "$MOUNT_ROOT/home" mount -o "$OPTS,subvol=@log" "$ROOT_PART" "$MOUNT_ROOT/var/log" mount -o "$OPTS,subvol=@pkg" "$ROOT_PART" "$MOUNT_ROOT/var/cache/pacman/pkg" mount -o "$OPTS,subvol=@/.snapshots" "$ROOT_PART" "$MOUNT_ROOT/.snapshots" mount "$EFI_PART" "$MOUNT_ROOT/boot" printf '\n[+] Disque préparé et monté sous %s\n' "$MOUNT_ROOT" lsblk -o NAME,SIZE,FSTYPE,LABEL,MOUNTPOINTS "$DISK"