mirror of
https://github.com/arthur-pbty/arch-custom-iso.git
synced 2026-08-01 20:28:05 +02:00
Compare commits
6
Commits
f553441c26
...
293d7b0ee4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
293d7b0ee4 | ||
|
|
3c03bbf848 | ||
|
|
3b64dbe5f8 | ||
|
|
c77747ef7b | ||
|
|
5f51ee7a63 | ||
|
|
7c1a06fdd2 |
@@ -0,0 +1,50 @@
|
||||
name: Build and Test Custom Arch ISO
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
pull_request:
|
||||
branches: [ "main" ]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build-iso:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: archlinux:latest
|
||||
options: --privileged
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
pacman -Syu --noconfirm
|
||||
pacman -S --noconfirm archiso git sudo base-devel fakeroot
|
||||
|
||||
- name: Create builder user
|
||||
run: |
|
||||
useradd -m -G wheel -s /bin/bash builder
|
||||
echo "builder ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
|
||||
|
||||
- name: Run ISO build script
|
||||
run: |
|
||||
chown -R builder:builder .
|
||||
sudo -u builder bash ./build.sh
|
||||
|
||||
- name: Verify ISO creation
|
||||
run: |
|
||||
if [ -f out/*.iso ]; then
|
||||
echo "ISO successfully built!"
|
||||
ls -lh out/*.iso
|
||||
else
|
||||
echo "ISO build failed: No ISO file found in out/ directory."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Upload ISO artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: arch-custom-iso
|
||||
path: out/*.iso
|
||||
retention-days: 7
|
||||
@@ -13,6 +13,15 @@ work/
|
||||
*.img
|
||||
*.fs
|
||||
|
||||
# --- AJOUTS POUR LE HORS-LIGNE ---
|
||||
# Dossiers temporaires de compilation (créés par build.sh)
|
||||
offline_cache/
|
||||
aur_build/
|
||||
|
||||
# Le cache des paquets générés dans l'arborescence de l'ISO (GROS FICHIERS)
|
||||
airootfs/root/offline_cache/
|
||||
# ---------------------------------
|
||||
|
||||
# Editor
|
||||
.vscode/
|
||||
.idea/
|
||||
|
||||
@@ -39,7 +39,7 @@ Run build script:
|
||||
|
||||
```bash
|
||||
chmod +x build.sh
|
||||
sudo ./build.sh
|
||||
./build.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -216,7 +216,7 @@ hl.config({
|
||||
|
||||
hl.config({
|
||||
input = {
|
||||
kb_layout = "fr",
|
||||
kb_layout = "__KB_LAYOUT__", -- MARQUEUR REMPLACÉ PAR LE SCRIPT BASH
|
||||
kb_variant = "",
|
||||
kb_model = "",
|
||||
kb_options = "",
|
||||
@@ -256,7 +256,7 @@ local mainMod = "SUPER" -- Sets "Windows" key as main modifier
|
||||
hl.bind(mainMod .. " + Return", hl.dsp.exec_cmd(terminal))
|
||||
local closeWindowBind = hl.bind(mainMod .. " + W", hl.dsp.window.close())
|
||||
-- closeWindowBind:set_enabled(false)
|
||||
hl.bind(mainMod .. " + M", hl.dsp.exec_cmd("command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch 'hl.dsp.exit()'"))
|
||||
hl.bind(mainMod .. " + M", hl.dsp.exec_cmd("command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit"))
|
||||
hl.bind(mainMod .. " + F", hl.dsp.exec_cmd(fileManager))
|
||||
hl.bind(mainMod .. " + T", hl.dsp.window.float({ action = "toggle" }))
|
||||
hl.bind(mainMod .. " + SPACE", hl.dsp.exec_cmd(menu))
|
||||
@@ -271,10 +271,14 @@ hl.bind(mainMod .. " + down", hl.dsp.focus({ direction = "down" }))
|
||||
|
||||
-- Switch workspaces with mainMod + [0-9]
|
||||
-- Move active window to a workspace with mainMod + SHIFT + [0-9]
|
||||
-- CORRECTION : Utilisation des keycodes (code:10 à code:19) pour que ça marche sur AZERTY/QWERTY
|
||||
for i = 1, 10 do
|
||||
local key = i % 10 -- 10 maps to key 0
|
||||
hl.bind(mainMod .. " + " .. key, hl.dsp.focus({ workspace = i}))
|
||||
hl.bind(mainMod .. " + SHIFT + " .. key, hl.dsp.window.move({ workspace = i }))
|
||||
local keycode = 9 + i -- 10=1, 11=2, 12=3 ... 18=9, 19=0
|
||||
local key_str = "code:" .. keycode
|
||||
|
||||
-- Utilisation de exec_cmd pour éviter les erreurs d'API (workspace est une table, pas une fonction)
|
||||
hl.bind(mainMod .. " + " .. key_str, hl.dsp.exec_cmd("workspace " .. i))
|
||||
hl.bind(mainMod .. " + SHIFT + " .. key_str, hl.dsp.exec_cmd("movetoworkspace " .. i))
|
||||
end
|
||||
|
||||
-- Example special workspace (scratchpad)
|
||||
|
||||
+65
-110
@@ -88,7 +88,6 @@ print_grid_menu() {
|
||||
done
|
||||
}
|
||||
|
||||
# Fonction pour échapper les caractères spéciaux JSON (Remplace jq)
|
||||
json_escape() {
|
||||
local s="$1"
|
||||
s="${s//\\/\\\\}"
|
||||
@@ -260,10 +259,7 @@ run_configurator() {
|
||||
done
|
||||
disk=$(echo "${DISKS[$((PAGE - 1))]}" | awk '{print $1}')
|
||||
|
||||
# --- 5. ENCRYPTION (FORCE ACTIVÉ) ---
|
||||
local encrypt_installation="true"
|
||||
|
||||
# --- JSON GENERATION (100% BASH PUR) ---
|
||||
# --- 5. JSON GENERATION ---
|
||||
local pw_esc="\"$(json_escape "$password")\""
|
||||
local hash_esc="\"$(json_escape "$password_hash")\""
|
||||
local user_esc="\"$(json_escape "$username")\""
|
||||
@@ -416,53 +412,60 @@ if [[ $(tty) == "/dev/tty1" ]]; then
|
||||
echo "Installing base system..."
|
||||
install_base_system
|
||||
|
||||
# --- 0. CONFIGURATION HORS-LIGNE ---
|
||||
ISO_CACHE="/root/offline_cache"
|
||||
# On monte le cache dans un dossier à part pour ne pas saturer la RAM
|
||||
CHROOT_OFFLINE_DIR="/mnt/opt/offline_cache"
|
||||
|
||||
if [[ -d "$ISO_CACHE" && -n "$(ls -A $ISO_CACHE/*.pkg.tar.zst 2>/dev/null)" ]]; then
|
||||
echo ">>> Mode HORS-LIGNE activé : Utilisation du cache de l'ISO"
|
||||
mkdir -p "$CHROOT_OFFLINE_DIR"
|
||||
mount --bind "$ISO_CACHE" "$CHROOT_OFFLINE_DIR"
|
||||
else
|
||||
echo ">>> Mode EN-LIGNE : Cache de l'ISO non trouvé, téléchargement depuis internet."
|
||||
fi
|
||||
|
||||
# --- 1. INSTALLATION PACKAGES OFFICIELS ---
|
||||
clear
|
||||
echo "Installing Neovim, Ghostty and Hyprland..."
|
||||
echo "Installing packages (Offline or Online)..."
|
||||
|
||||
EXTRA_PACKAGES=(
|
||||
"neovim"
|
||||
"ghostty"
|
||||
"hyprland"
|
||||
"xdg-desktop-portal-hyprland"
|
||||
"git"
|
||||
"yazi"
|
||||
"dolphin"
|
||||
"rofi"
|
||||
"waybar"
|
||||
"wiremix"
|
||||
"impala"
|
||||
"bluetui"
|
||||
"btop"
|
||||
"cava"
|
||||
"fastfetch"
|
||||
"obsidian"
|
||||
"obs-studio"
|
||||
"lazygit"
|
||||
"docker"
|
||||
"docker-buildx"
|
||||
"docker-compose"
|
||||
"lazydocker"
|
||||
"mpv"
|
||||
"prismlauncher"
|
||||
"rust"
|
||||
"chromium"
|
||||
"bat"
|
||||
"base-devel"
|
||||
"cmake"
|
||||
"nodejs"
|
||||
"npm"
|
||||
"pnpm"
|
||||
"python"
|
||||
"python-pip"
|
||||
"curl"
|
||||
"wget"
|
||||
"unzip"
|
||||
"neovim" "ghostty" "hyprland" "xdg-desktop-portal-hyprland"
|
||||
"git" "yazi" "dolphin" "rofi" "waybar" "wiremix" "impala"
|
||||
"bluetui" "btop" "cava" "fastfetch" "obsidian" "obs-studio"
|
||||
"lazygit" "docker" "docker-buildx" "docker-compose" "lazydocker"
|
||||
"mpv" "prismlauncher" "rust" "chromium" "bat" "base-devel"
|
||||
"cmake" "nodejs" "npm" "pnpm" "python" "python-pip"
|
||||
"curl" "wget" "unzip"
|
||||
)
|
||||
|
||||
# On dit à pacman d'utiliser le disque dur pour écrire, et le dossier /opt/offline_cache pour LIRE les paquets pré-téléchargés
|
||||
if [[ -d "$CHROOT_OFFLINE_DIR" ]]; then
|
||||
arch-chroot /mnt pacman -S --noconfirm --cachedir /var/cache/pacman/pkg --cachedir /opt/offline_cache "${EXTRA_PACKAGES[@]}"
|
||||
else
|
||||
arch-chroot /mnt pacman -S --noconfirm "${EXTRA_PACKAGES[@]}"
|
||||
fi
|
||||
|
||||
# --- 2. CONFIGURATION TTY AUTO-LOGIN ---
|
||||
# --- 2. INSTALLATION PACKAGES AUR (HORS-LIGNE) ---
|
||||
clear
|
||||
echo "Installing pre-compiled AUR packages..."
|
||||
for pkg in visual-studio-code-bin subtui-bin localsend-bin; do
|
||||
# On cherche le nom exact du fichier depuis l'hôte
|
||||
PKG_PATH=$(ls ${CHROOT_OFFLINE_DIR}/${pkg}*.pkg.tar.zst 2>/dev/null | head -n 1)
|
||||
|
||||
if [[ -n "$PKG_PATH" ]]; then
|
||||
echo ">>> Installation de $pkg"
|
||||
# On enlève "/mnt" du chemin pour que ça corresponde au point de vue du chroot
|
||||
CHROOT_PKG_PATH="${PKG_PATH#/mnt}"
|
||||
|
||||
# On passe le chemin exact (sans étoile) à pacman
|
||||
arch-chroot /mnt pacman -U --noconfirm "$CHROOT_PKG_PATH"
|
||||
else
|
||||
echo ">>> $pkg non trouvé, ignoré."
|
||||
fi
|
||||
done
|
||||
|
||||
# --- 3. CONFIGURATION TTY AUTO-LOGIN ---
|
||||
echo "Configuring TTY auto-login for $username..."
|
||||
|
||||
mkdir -p /mnt/etc/systemd/system/getty@tty1.service.d
|
||||
@@ -472,12 +475,9 @@ ExecStart=
|
||||
ExecStart=-/sbin/agetty --autologin $username --noclear %I \$TERM
|
||||
EOF
|
||||
|
||||
# --- 3. LANCEMENT AUTOMATIQUE DE HYPRLAND (sans casser le chroot) ---
|
||||
# --- 4. LANCEMENT AUTOMATIQUE DE HYPRLAND ---
|
||||
echo "Configuring auto-start Hyprland..."
|
||||
|
||||
# On garde .bash_profile mais on ajoute une garde anti-chroot
|
||||
cat > "/mnt/home/$username/.bash_profile" << 'EOF'
|
||||
# Ne pas démarrer Hyprland si on est dans un chroot archinstall
|
||||
if [ -f /.arch-chroot ] || [ -n "$INSTALLING" ]; then
|
||||
return 0 2>/dev/null || exit 0
|
||||
fi
|
||||
@@ -487,75 +487,30 @@ fi
|
||||
EOF
|
||||
chown 1000:1000 "/mnt/home/$username/.bash_profile"
|
||||
|
||||
# --- 4. PRÉPARATION DU RUNTIME DIR pour paru (Rust) ---
|
||||
echo "Preparing XDG_RUNTIME_DIR for user $username..."
|
||||
|
||||
USER_UID=$(awk -F: -v u="$username" '$1==u{print $3}' /mnt/etc/passwd)
|
||||
USER_GID=$(awk -F: -v u="$username" '$1==u{print $4}' /mnt/etc/passwd)
|
||||
|
||||
# Crée le répertoire runtime standard systemd DANS le chroot
|
||||
mkdir -p "/mnt/run/user/${USER_UID}"
|
||||
chown "${USER_UID}:${USER_GID}" "/mnt/run/user/${USER_UID}"
|
||||
chmod 700 "/mnt/run/user/${USER_UID}"
|
||||
|
||||
# --- 5. INSTALLATION DE PARU (sans su -, avec sudo -u) ---
|
||||
clear
|
||||
echo "Installing paru (AUR Helper)..."
|
||||
|
||||
# Évite su - (login shell) → utilise sudo -u avec env propre
|
||||
arch-chroot /mnt \
|
||||
sudo -u "$username" \
|
||||
XDG_RUNTIME_DIR="/run/user/${USER_UID}" \
|
||||
HOME="/home/$username" \
|
||||
bash -c '
|
||||
set -e
|
||||
cd /tmp
|
||||
rm -rf paru
|
||||
git clone https://aur.archlinux.org/paru.git
|
||||
cd paru
|
||||
makepkg -si --noconfirm --needed
|
||||
cd /tmp
|
||||
rm -rf paru
|
||||
'
|
||||
|
||||
echo "paru installed successfully!"
|
||||
|
||||
# --- 6. INSTALLATION PACKAGES AUR ---
|
||||
clear
|
||||
echo "Installing AUR packages..."
|
||||
|
||||
AUR_PACKAGES=(
|
||||
visual-studio-code-bin
|
||||
subtui-bin
|
||||
localsend-bin
|
||||
)
|
||||
|
||||
arch-chroot /mnt \
|
||||
sudo -u "$username" \
|
||||
XDG_RUNTIME_DIR="/run/user/${USER_UID}" \
|
||||
HOME="/home/$username" \
|
||||
bash -c "
|
||||
set -e
|
||||
paru -S --noconfirm --needed ${AUR_PACKAGES[*]}
|
||||
"
|
||||
|
||||
echo "AUR packages installed successfully!"
|
||||
|
||||
# --- 6. COPIE DES DOTFILES ---
|
||||
# --- 5. COPIE DES DOTFILES & INJECTION CLAVIER ---
|
||||
clear
|
||||
echo "Copying custom .config files..."
|
||||
# On vérifie si le dossier .config existe bien à côté du script sur l'ISO
|
||||
if [[ -d ".config" ]]; then
|
||||
# On le copie dans le home de l'utilisateur sur le disque dur
|
||||
cp -r .config "/mnt/home/$username/"
|
||||
# On s'assure que l'utilisateur est bien le propriétaire (1000:1000 est le 1er user par défaut)
|
||||
chown -R 1000:1000 "/mnt/home/$username/.config"
|
||||
echo "Dotfiles copied successfully!"
|
||||
|
||||
# On cherche dynamiquement le fichier .lua contenant le marqueur dans tout le dossier hypr
|
||||
HYPRLAND_CONF=$(grep -rl "__KB_LAYOUT__" "/mnt/home/$username/.config/hypr/" 2>/dev/null | head -n 1)
|
||||
|
||||
if [[ -n "$HYPRLAND_CONF" ]]; then
|
||||
# Utilisation de | comme délimiteur pour sed pour éviter les erreurs de parsing
|
||||
sed -i "s|__KB_LAYOUT__|${keyboard}|g" "$HYPRLAND_CONF"
|
||||
echo "Hyprland keyboard set to: $keyboard in $HYPRLAND_CONF"
|
||||
else
|
||||
echo "No .config folder found next to the script, skipping."
|
||||
echo "ERREUR: Marqueur __KB_LAYOUT__ introuvable dans les configs Hyprland !"
|
||||
fi
|
||||
|
||||
# --- REBOOT AUTOMATIQUE ---
|
||||
chown -R 1000:1000 "/mnt/home/$username/.config"
|
||||
echo "Dotfiles configured successfully!"
|
||||
else
|
||||
echo "No .config folder found, skipping."
|
||||
fi
|
||||
|
||||
# --- REBOOT ---
|
||||
echo "Installation finished! Rebooting in 3 seconds..."
|
||||
sleep 3
|
||||
reboot
|
||||
|
||||
@@ -1,37 +1,110 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Si l'utilisateur a oublié de mettre sudo, on redémarre le script avec sudo
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "Le build nécessite les droits administrateur (sudo). Redémarrage..."
|
||||
exec sudo bash "$0" "$@"
|
||||
fi
|
||||
|
||||
set -e
|
||||
|
||||
ISO_NAME="arch-custom-iso"
|
||||
# On récupère le nom de l'utilisateur normal (pas root) pour makepkg
|
||||
BUILD_USER="${SUDO_USER:-root}"
|
||||
|
||||
# ==============================================================================
|
||||
# LES LISTES DE PAQUETS
|
||||
# ==============================================================================
|
||||
EXTRA_PACKAGES=(
|
||||
"neovim" "ghostty" "hyprland" "xdg-desktop-portal-hyprland"
|
||||
"git" "yazi" "dolphin" "rofi" "waybar" "wiremix" "impala"
|
||||
"bluetui" "btop" "cava" "fastfetch" "obsidian" "obs-studio"
|
||||
"lazygit" "docker" "docker-buildx" "docker-compose" "lazydocker"
|
||||
"mpv" "prismlauncher" "rust" "chromium" "bat" "base-devel"
|
||||
"cmake" "nodejs" "npm" "pnpm" "python" "python-pip"
|
||||
"curl" "wget" "unzip"
|
||||
)
|
||||
|
||||
AUR_PACKAGES=(
|
||||
"visual-studio-code-bin"
|
||||
"subtui-bin"
|
||||
"localsend-bin"
|
||||
)
|
||||
|
||||
# ==============================================================================
|
||||
# PROCESSUS DE BUILD
|
||||
# ==============================================================================
|
||||
|
||||
echo "====================================="
|
||||
echo " Building Arch Linux ISO"
|
||||
echo " Project: $ISO_NAME"
|
||||
echo " Build lancé par l'utilisateur: $BUILD_USER"
|
||||
echo "====================================="
|
||||
|
||||
# Check archiso
|
||||
if ! command -v mkarchiso &> /dev/null; then
|
||||
echo "[ERROR] archiso is not installed"
|
||||
echo "Run: sudo pacman -S archiso"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Clean previous build
|
||||
echo "[1/3] Cleaning previous build..."
|
||||
rm -rf work out
|
||||
echo "[1/5] Cleaning previous build..."
|
||||
rm -rf work out offline_cache
|
||||
|
||||
# Build ISO
|
||||
echo "[2/3] Building ISO..."
|
||||
# --- TÉLÉCHARGEMENT DES PAQUETS OFFICIELS ---
|
||||
echo "[2/5] Downloading Official Packages for offline cache..."
|
||||
# On utilise /tmp pour éviter tout problème de permissions dans le Home
|
||||
TMP_CACHE="/tmp/archiso_cache_$$"
|
||||
mkdir -p "$TMP_CACHE"
|
||||
sudo pacman -Sy --noconfirm
|
||||
|
||||
# On télécharge (-w) sans installer, dans le dossier temporaire
|
||||
sudo pacman -Sw --noconfirm --cachedir "$TMP_CACHE" "${EXTRA_PACKAGES[@]}" || true
|
||||
|
||||
# On crée le vrai dossier de cache et on déplace les paquets
|
||||
mkdir -p offline_cache
|
||||
cp "$TMP_CACHE"/*.pkg.tar.zst offline_cache/ 2>/dev/null || true
|
||||
rm -rf "$TMP_CACHE"
|
||||
|
||||
# --- COMPILATION DES PAQUETS AUR ---
|
||||
echo "[3/5] Building AUR Packages for offline cache..."
|
||||
mkdir -p aur_build
|
||||
|
||||
for pkg in "${AUR_PACKAGES[@]}"; do
|
||||
echo " -> Building AUR package: $pkg"
|
||||
cd aur_build
|
||||
rm -rf "$pkg"
|
||||
git clone "https://aur.archlinux.org/${pkg}.git" --depth 1
|
||||
|
||||
# CRUCIAL : On donne les droits à l'utilisateur NORMAL pour que makepkg accepte de tourner
|
||||
chown -R "$BUILD_USER":"$BUILD_USER" "$pkg"
|
||||
cd "$pkg"
|
||||
|
||||
# CRUCIAL : On lance makepkg EN TANT QU'UTILISATEUR NORMAL (pas de -s pour éviter de reboucler sur sudo)
|
||||
sudo -u "$BUILD_USER" makepkg -d -f --noconfirm --needed
|
||||
|
||||
# On déplace le paquet compilé dans notre cache
|
||||
mv *.pkg.tar.zst ../../offline_cache/
|
||||
cd ../..
|
||||
done
|
||||
rm -rf aur_build
|
||||
|
||||
# --- INJECTION DANS L'ISO ---
|
||||
echo "[4/5] Injecting offline cache into ISO skeleton..."
|
||||
mkdir -p airootfs/root/offline_cache
|
||||
cp offline_cache/*.pkg.tar.zst airootfs/root/offline_cache/
|
||||
rm -rf offline_cache
|
||||
|
||||
# --- CRÉATION DE L'ISO ---
|
||||
echo "[5/5] Building ISO (this will take a while)..."
|
||||
sudo mkarchiso -v .
|
||||
|
||||
# Check result
|
||||
if [ -f out/*.iso ]; then
|
||||
echo "[3/3] Build successful!"
|
||||
echo ""
|
||||
echo "====================================="
|
||||
echo " Build successful!"
|
||||
echo " ISO located in: out/"
|
||||
echo "====================================="
|
||||
else
|
||||
echo "[ERROR] ISO not found in out/"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "====================================="
|
||||
echo "Done."
|
||||
echo "====================================="
|
||||
Reference in New Issue
Block a user