-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstep3_virtualization_setup.sh
More file actions
208 lines (177 loc) · 6.76 KB
/
step3_virtualization_setup.sh
File metadata and controls
208 lines (177 loc) · 6.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#!/bin/sh
# Step 3: Virtualization Setup Script
# This script installs and configures KVM/QEMU and libvirt
# Run this script after step2_desktop_setup.sh and a system reboot
# Couleurs pour les messages
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Fonction pour afficher les messages
print_message() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Vérifier si l'utilisateur est root
if [ "$(id -u)" -ne 0 ]; then
print_error "Ce script doit être exécuté en tant que root"
exit 1
fi
# Charger les informations de détection
if [ -f /etc/alpine_vm_setup/hardware_info ]; then
. /etc/alpine_vm_setup/hardware_info
print_message "Informations de détection chargées"
print_message "CPU détecté: $CPU_TYPE"
if [ "$HAS_NVIDIA" = "true" ]; then
print_message "Carte graphique NVIDIA détectée"
fi
if [ -n "$USERNAME" ]; then
print_message "Utilisateur: $USERNAME"
fi
else
print_error "Informations de détection non trouvées. Exécutez d'abord step1_base_setup.sh"
exit 1
fi
# Installation des paquets pour KVM/QEMU
print_message "Installation des paquets pour KVM/QEMU..."
apk add qemu qemu-img qemu-system-x86_64 qemu-modules
apk add libvirt libvirt-daemon libvirt-client
apk add virt-manager virt-viewer
apk add dbus dbus-openrc polkit
apk add bridge-utils
apk add ovmf
apk add iptables ebtables dnsmasq
print_success "Paquets pour KVM/QEMU installés"
# Configuration des services
print_message "Configuration des services..."
rc-update add dbus default
rc-update add libvirtd default
print_success "Services configurés"
# Création des répertoires pour les VM
print_message "Création des répertoires pour les VM..."
mkdir -p /mnt/vm/images
mkdir -p /mnt/vm/xml
mkdir -p /mnt/vm/nvram
mkdir -p /mnt/vm/vbios
print_success "Répertoires pour les VM créés"
# Configuration pour le passthrough matériel
print_message "Configuration pour le passthrough matériel..."
# Modification de GRUB pour activer IOMMU
if [ -f /etc/default/grub ]; then
if [ "$CPU_TYPE" = "intel" ]; then
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT=".*"/GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"/g' /etc/default/grub
elif [ "$CPU_TYPE" = "amd" ]; then
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT=".*"/GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"/g' /etc/default/grub
fi
update-grub
print_message "GRUB configuré pour IOMMU"
else
print_warning "Fichier GRUB non trouvé, configuration manuelle requise pour IOMMU"
# Alternative pour les systèmes sans GRUB (comme Alpine avec syslinux)
if [ -f /etc/update-extlinux.conf ]; then
if [ "$CPU_TYPE" = "intel" ]; then
sed -i 's/default_kernel_opts=".*"/default_kernel_opts="quiet intel_iommu=on iommu=pt"/g' /etc/update-extlinux.conf
elif [ "$CPU_TYPE" = "amd" ]; then
sed -i 's/default_kernel_opts=".*"/default_kernel_opts="quiet amd_iommu=on iommu=pt"/g' /etc/update-extlinux.conf
fi
update-extlinux
print_message "Extlinux configuré pour IOMMU"
fi
fi
# Configuration des modules pour le passthrough
cat > /etc/modules << EOF
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
EOF
print_success "Modules pour le passthrough configurés"
# Configuration de libvirt pour le passthrough
mkdir -p /etc/libvirt/hooks
cat > /etc/libvirt/hooks/qemu << EOF
#!/bin/bash
GUEST=\$1
OPERATION=\$2
if [ "\$GUEST" = "win11-intel" ] || [ "\$GUEST" = "win11-amd" ] || [ "\$GUEST" = "popos" ]; then
if [ "\$OPERATION" = "start" ]; then
echo "Préparation du passthrough pour \$GUEST"
# Ajouter ici des commandes spécifiques pour le passthrough
elif [ "\$OPERATION" = "stopped" ]; then
echo "Nettoyage après arrêt de \$GUEST"
# Ajouter ici des commandes de nettoyage
fi
fi
EOF
chmod +x /etc/libvirt/hooks/qemu
print_success "Libvirt configuré pour le passthrough"
# Script pour identifier et configurer le passthrough GPU
cat > /usr/local/bin/setup-gpu-passthrough << EOF
#!/bin/sh
# Script pour identifier et configurer le passthrough GPU
# Identifier les GPU disponibles
echo "GPUs disponibles :"
lspci -nn | grep -i "VGA\|3D\|Display"
# Demander à l'utilisateur de choisir un GPU
echo "Entrez l'identifiant du GPU à passer en passthrough (ex: 01:00.0) :"
read -r GPU_ID
# Obtenir le vendor:device ID
VENDOR_DEVICE=\$(lspci -nn | grep \$GPU_ID | grep -o "\[....:...." | tr -d '[]')
VENDOR=\$(echo \$VENDOR_DEVICE | cut -d':' -f1)
DEVICE=\$(echo \$VENDOR_DEVICE | cut -d':' -f2)
# Créer le fichier de configuration VFIO
echo "options vfio-pci ids=\$VENDOR:\$DEVICE" > /etc/modprobe.d/vfio.conf
# Mettre à jour les fichiers XML
sed -i "s/<address domain=\"0x0000\" bus=\"0x01\" slot=\"0x00\" function=\"0x0\"\/>/<address domain=\"0x0000\" bus=\"\$(echo \$GPU_ID | cut -d':' -f1)\" slot=\"\$(echo \$GPU_ID | cut -d':' -f2 | cut -d'.' -f1)\" function=\"\$(echo \$GPU_ID | cut -d'.' -f2)\"\/>/" /mnt/vm/xml/win11-amd.xml
# Extraire le VBIOS si NVIDIA
if lspci -nn | grep -i nvidia | grep -q \$GPU_ID; then
echo "GPU NVIDIA détecté, extraction du VBIOS..."
echo "Cette opération nécessite un redémarrage."
echo "Après le redémarrage, exécutez : extract-nvidia-vbios \$GPU_ID"
fi
echo "Configuration du passthrough GPU terminée. Redémarrez pour appliquer les changements."
EOF
chmod +x /usr/local/bin/setup-gpu-passthrough
# Script pour extraire le VBIOS NVIDIA
cat > /usr/local/bin/extract-nvidia-vbios << EOF
#!/bin/sh
# Script pour extraire le VBIOS NVIDIA
if [ -z "\$1" ]; then
echo "Usage: \$0 <GPU_ID>"
echo "Exemple: \$0 01:00.0"
exit 1
fi
GPU_ID=\$1
VBIOS_PATH="/mnt/vm/vbios/nvidia.rom"
echo "Extraction du VBIOS pour le GPU \$GPU_ID..."
echo 1 > /sys/bus/pci/devices/0000:\$GPU_ID/rom
cat /sys/bus/pci/devices/0000:\$GPU_ID/rom > \$VBIOS_PATH
echo 0 > /sys/bus/pci/devices/0000:\$GPU_ID/rom
echo "VBIOS extrait et sauvegardé dans \$VBIOS_PATH"
EOF
chmod +x /usr/local/bin/extract-nvidia-vbios
# Ajout de l'utilisateur aux groupes de virtualisation
if [ -n "$USERNAME" ]; then
print_message "Ajout de l'utilisateur $USERNAME aux groupes de virtualisation..."
addgroup "$USERNAME" libvirt
addgroup "$USERNAME" kvm
print_success "Utilisateur $USERNAME ajouté aux groupes de virtualisation"
fi
# Finalisation
print_message "Installation de la virtualisation terminée !"
print_message "Redémarrez le système puis exécutez le script step4_vm_setup.sh"
# Demande de redémarrage
print_message "Voulez-vous redémarrer maintenant ? (o/n)"
read -r REBOOT
if [ "$REBOOT" = "o" ] || [ "$REBOOT" = "O" ]; then
print_message "Redémarrage du système..."
reboot
fi