Installer Windows 10 à côté de Linux, en dual-boot natif, sans clé USB.
English — linwin installs Windows 10 as a native dual-boot from Linux, without a USB drive. It creates the partitions in unallocated space (or shrinks a Btrfs root online), copies the installer to a temporary partition that replaces the USB stick, installs Windows unattended, adds the Intel RST/VMD and Wi-Fi/Ethernet drivers, then adds Windows to GRUB, systemd-boot, Limine or rEFInd. Works on any distribution (Ubuntu, Debian, Fedora, Arch, openSUSE…). Quick start:
git clone https://github.com/2Deathadder/linwin.git && cd linwin && sudo ./linwin install && linwin check. English overview: https://2deathadder.github.io/linwin/en/. The manual below is in French.
linwin fait de la place sur le disque, y copie l'installeur Windows, démarre dessus une seule fois, puis remet Linux en premier et ajoute Windows au menu de démarrage. Tout se fait depuis Linux, avec une interface graphique ou en ligne de commande. L'installation peut être entièrement automatique : Windows s'installe, crée ton compte et revient tout seul sous Linux.
⚠️ linwin modifie la table de partitions du disque qui contient Linux. Il est conçu pour être prudent (chaque étape est vérifiée avant la suivante), mais fais une sauvegarde de tes données avant de commencer et garde le chargeur branché pendant les opérations.
- Compatibilité
- Installation de linwin
- Avant de commencer
- Utilisation avec l'interface graphique
- Utilisation en ligne de commande
- D'où vient la place pour Windows ?
- Pilotes ajoutés automatiquement
- Après l'installation
- Désinstaller Windows (annulation)
- Dépannage
- Fonctionnement détaillé et sécurité
- Référence des commandes
| Exigence | Pourquoi |
|---|---|
| Processeur x86-64 (Intel ou AMD 64 bits) | l'installeur Windows 10 x64 |
| Démarrage en UEFI 64 bits (pas en BIOS/Legacy/CSM) | l'installeur est lancé par une entrée UEFI à usage unique |
| Disque en GPT, secteurs de 512 octets | Windows en UEFI exige le GPT |
Partition EFI montée (/boot/efi, /efi ou /boot) |
Windows y installe son gestionnaire de démarrage |
Windows est installé sur le disque qui porte la partition EFI.
linwin check dit en quelques secondes si ton PC convient.
linwin est un script bash et fonctionne sur toutes les distributions courantes. Les outils manquants s'installent automatiquement avec le gestionnaire de paquets :
| Gestionnaire | Distributions |
|---|---|
pacman |
Arch, Manjaro, EndeavourOS, CachyOS, Omarchy… |
apt |
Debian, Ubuntu, Linux Mint, Pop!_OS, elementary… |
dnf / yum |
Fedora, RHEL, AlmaLinux, Rocky… |
zypper |
openSUSE |
xbps |
Void |
apk |
Alpine |
emerge |
Gentoo |
| Élément | Pris en charge |
|---|---|
| Chargeur de démarrage | GRUB, systemd-boot, Limine, rEFInd (sinon : menu de démarrage UEFI du PC) |
| Système d'init | systemd et OpenRC (finalisation automatique) ; autres : finalisation à lancer à la main |
| Chiffrement | LUKS (la passphrase est demandée si Linux doit être réduit) |
Les distributions immuables (Fedora Silverblue/Kinoite, etc.) ne permettent
pas d'installer les outils à la volée : linwin indique lesquels ajouter avec
rpm-ostree install.
Elle demande GTK 4, libadwaita 1.5 ou plus récent et PyGObject :
| Distribution | Paquets |
|---|---|
| Arch et dérivées | python-gobject gtk4 libadwaita |
| Debian 13+, Ubuntu 24.04+ | python3-gi gir1.2-gtk-4.0 gir1.2-adw-1 |
| Fedora 40+ | python3-gobject gtk4 libadwaita |
| openSUSE Tumbleweed | python3-gobject typelib-1_0-Adw-1 typelib-1_0-Gtk-4_0 |
Elle utilise pkexec (polkit) pour les étapes qui demandent les droits root.
Sur un système plus ancien (Debian 12, Ubuntu 22.04…), utilise la ligne de
commande : elle fait exactement la même chose.
Debian, Ubuntu et dérivées : télécharge le paquet .deb de la
dernière version, puis :
sudo apt install ./linwin_*_all.debToutes distributions :
git clone https://github.com/2Deathadder/linwin.git
cd linwin
sudo ./linwin install # ou : sudo make installinstall copie linwin dans /usr/local/lib/linwin (propriété de root, non
modifiable par ton utilisateur), crée les commandes linwin et linwin-gui
dans /usr/local/bin et ajoute linwin au menu des applications.
Pourquoi cette copie ? Les étapes lancées en root n'exécutent jamais un fichier que ton utilisateur pourrait modifier : sinon, n'importe quel programme de ta session pourrait le changer puis attendre que tu tapes ton mot de passe. Si tu modifies le script, relance
sudo ./linwin install(l'interface le propose d'elle-même).
-
Sauvegarde tes données importantes.
-
Branche le chargeur : linwin refuse de modifier le disque sur batterie.
-
Télécharge l'ISO de Windows 10 (64 bits) :
linwin isoessaie de la télécharger chez Microsoft. Si Microsoft refuse (protection anti-robot, fréquente), ouvre https://www.microsoft.com/software-download/windows10ISO depuis Linux : la page propose directement l'ISO. Choisis Windows 10 (multi-edition ISO), ta langue, puis 64-bit Download. -
Vérifie la compatibilité :
linwin check
Tu y vois le disque choisi, la place disponible, le chargeur détecté, les cartes réseau et le contrôleur de stockage.
-
Licence : si le PC a été vendu avec Windows, la licence est dans le firmware (
checkl'indique). Choisis alors l'édition Famille (Home) : Windows s'activera tout seul. Sinon, tu activeras Windows avec ta propre clé.
Lance linwin depuis le menu des applications (ou linwin-gui).
La fenêtre montre :
- Cette machine : système, disque de Windows, place disponible, partition EFI, contrôleur VMD, cartes réseau, licence, alimentation.
- Réglages : image ISO (bouton Choisir…), taille de Windows en Gio, partitionnement prévu (déplie la ligne pour le détail), pilote VMD (automatique par défaut).
- Installation sans intervention : active Zéro intervention, choisis l'édition, le nom du compte Windows et son mot de passe (facultatif).
- Étapes : chacune se débloque quand la précédente est faite.
| Étape | Ce qu'elle fait |
|---|---|
| 1. Préparer le disque | crée les partitions de Windows (tape OUI pour confirmer ; passphrase LUKS si Linux doit être réduit) |
| 2. Copier l'installeur | formate la partition WINSETUP, y copie l'ISO, ajoute les pilotes et les réponses automatiques |
| 3. Démarrer l'installeur | programme un démarrage unique sur l'installeur, puis propose de redémarrer |
| 4. Installer Windows | automatique (20 à 40 min) ou guidé, voir ci-dessous |
| 5. Finaliser | automatique au retour sous Linux en mode sans intervention ; sinon, clique Finaliser |
Une barre de progression en bas de la fenêtre indique l'avancement et le temps restant, et le journal affiche tout ce que fait linwin. Si tu fermes la fenêtre pendant une opération, elle continue ; rouvre l'application pour la suivre.
Après le redémarrage, ne touche à rien : l'installeur repère la partition Windows à l'octet près, installe Windows dessus et nulle part ailleurs, crée ton compte local, ouvre une première session, puis redémarre sous Linux. linwin finalise alors tout seul au démarrage.
Si la partition n'est pas reconnue avec certitude, l'installeur bascule par sécurité en mode manuel (voir ci-dessous).
Dans l'installeur Windows :
- Je n'ai pas de clé de produit si tu n'en as pas, puis choisis l'édition.
- Type d'installation : Personnalisée.
- Sélectionne uniquement la partition indiquée par linwin (taille choisie, « Windows »), clique Formater si demandé, puis Suivant. Ne supprime ni ne formate aucune autre partition.
- Si aucun disque n'apparaît (contrôleur Intel VMD) : Charger un pilote →
Parcourir →
WINSETUP\$WinPEDriver$\vmd.
Une fois Windows installé, reviens sous Linux (menu de démarrage UEFI : F8, F11 ou F12 selon le PC) et clique Finaliser.
Le même parcours, étape par étape :
linwin check # compatibilité et place disponible
linwin plan --size 100G # ce qui va être fait (ne modifie rien)
sudo linwin prepare --size 100G # crée les partitions
sudo linwin stage --iso ~/Downloads/Win10_22H2_French_x64v1.iso \
--edition Home --user moi --password-stdin
sudo linwin boot # démarrage unique sur l'installeur
sudo reboot
# … Windows s'installe et revient sous Linux …
sudo linwin finish # automatique en mode sans intervention- Sans
--editionni--user, l'installation est manuelle (voir §4). --password-stdinlit le mot de passe Windows sur l'entrée standard (une ligne vide = pas de mot de passe) :printf 'MonMotDePasse\n' | sudo linwin stage --iso … --edition Pro --user moi --password-stdin- Les commandes root se relancent toutes seules avec
sudosi besoin. - Si
prepareannonce que le noyau n'a pas pu relire la table de partitions, redémarre puis continue avecstage: ce n'est pas une erreur.
linwin cherche la place sur le disque de la partition EFI, dans cet ordre :
- Espace non alloué (mode
free) : si une zone libre d'un seul tenant suffit (taille de Windows + 8 Gio pour l'installeur + 16 Mio), les partitions y sont créées. Aucune partition existante n'est modifiée. Fonctionne quel que soit le système de fichiers de Linux. - Réduction de Linux (mode
shrink) : si la racine est en Btrfs (même chiffrée avec LUKS), linwin la réduit à chaud, puis réduit LUKS, puis la partition, chaque étape étant vérifiée avant la suivante. Il garde au moins 20 Gio libres dans Btrfs.
--mode free ou --mode shrink impose l'une ou l'autre.
Racine en ext4, XFS ou LVM sans espace libre : ces systèmes ne peuvent pas être réduits pendant que Linux tourne. Libère d'abord de l'espace non alloué (par exemple en réduisant une partition avec GParted depuis un système live), puis relance linwin : il utilisera cet espace.
Partitions créées :
| Partition | Taille | Rôle |
|---|---|---|
| MSR | 16 Mio | réservée par Windows |
| Windows | celle choisie (32 Gio minimum, 64+ conseillés) | le système Windows (C:) |
| WINSETUP | 8 Gio | joue le rôle de la clé USB ; supprimée à la fin, son espace est rendu à C: |
Windows 10 n'a pas de pilote pour beaucoup de matériels récents. linwin les ajoute à l'installeur :
- Contrôleur de stockage Intel VMD/RST : sans lui, l'installeur ne verrait
pas le SSD. linwin utilise le pilote Intel RST 20.2.6.1025 (téléchargé chez
Intel, empreintes vérifiées) pour les contrôleurs de 12e à 14e génération et
Core Ultra, sinon le pilote du catalogue Microsoft Update. Rien à changer dans
le BIOS. Un autre pilote :
--vmd-driver DOSSIER. - Cartes réseau (Ethernet et Wi-Fi), tous fabricants : pour chaque carte,
linwin cherche dans le catalogue Microsoft Update le pilote Windows 10
64 bits le plus récent qui déclare cette carte, vérifie son empreinte SHA-1
publiée par Microsoft, puis l'ajoute. Windows contrôle ensuite lui-même sa
signature. Tu as ainsi le réseau dès le premier démarrage, donc Windows Update.
Désactivable avec
--no-net-drivers.
Le Bluetooth et les autres périphériques sont installés ensuite par Windows Update.
sudo linwin drivers(ou le bouton Copier du groupe Pilotes dans l'interface) copie les pilotes
réseau sur C:. Sous Windows, double-clique sur C:\linwin\installer-pilotes.cmd
et accepte la demande d'administrateur.
- Choisir Windows : dans le menu de ton chargeur (GRUB, systemd-boot, Limine ou rEFInd). Sinon : menu de démarrage UEFI du PC (F8, F11 ou F12). linwin réaffiche le menu de GRUB ou de systemd-boot s'il était masqué.
- Linux reste le choix par défaut.
- En mode sans intervention, linwin a déjà réglé côté Windows : horloge en UTC
(l'heure reste juste entre les deux systèmes), démarrage rapide et hibernation
désactivés (ils verrouillent les partitions), pas de chiffrement automatique du
disque. En installation manuelle,
finishaffiche les commandes à lancer. - Activation : automatique avec la licence du firmware en édition Famille ; sinon, Paramètres → Activation.
sudo linwin cancel(ou Annuler l'installation dans l'interface) fonctionne à n'importe quelle étape, même une fois Windows installé :
- retire les entrées de démarrage de Windows et de l'installeur, et Windows du menu du chargeur ;
- supprime les partitions créées par linwin (Windows et tout son contenu) ;
- en mode
shrink, rend l'espace à Linux (partition, LUKS et Btrfs agrandis à chaud) ; en modefree, l'espace redevient non alloué.
Avant d'agir, linwin vérifie que chaque partition à supprimer est bien la sienne (numéro, type et position enregistrés) ; au moindre doute, il s'arrête sans rien toucher. Le gestionnaire de démarrage de Windows n'est supprimé que si aucun autre Windows n'est présent.
Si linwin demande de redémarrer (code de sortie 3), redémarre puis relance
sudo linwin cancel.
| Problème | Solution |
|---|---|
Linux a démarré en mode BIOS |
active l'UEFI dans le firmware ; linwin ne gère pas le mode Legacy |
pas assez de place |
choisis une taille plus petite, ou libère de l'espace non alloué (§6) |
l'ordinateur est sur batterie |
branche le chargeur |
partition EFI introuvable |
monte-la (/boot/efi, /efi ou /boot) |
| Microsoft refuse le téléchargement de l'ISO | télécharge-la à la main (§3) |
| Le noyau n'a pas relu la table de partitions | redémarre, puis passe à l'étape suivante |
| L'installeur ne voit aucun disque | contrôleur VMD : Charger un pilote → WINSETUP\$WinPEDriver$\vmd ; ou fournis un pilote avec --vmd-driver |
| L'installeur a démarré en mode manuel | la partition n'a pas été reconnue avec certitude : installe sur la partition indiquée (§4). Le journal est dans WINSETUP\linwin.log |
| Windows absent du menu de démarrage | menu UEFI du PC (F8, F11, F12) ; avec GRUB : sudo update-grub (ou grub-mkconfig -o …) |
impossible de monter … Windows n'est pas complètement arrêté |
sous Windows, en administrateur : powercfg /h off, puis redémarre vers Linux |
| Pas de réseau sous Windows | sudo linwin drivers (§7) |
| Linux a démarré au milieu de l'installation de Windows | rien à faire : linwin relance Windows pour qu'il termine. En manuel, finish refuse tant que Windows n'a pas fini (finish --force pour passer outre) |
| Le menu GRUB reste caché | linwin ajoute /etc/default/grub.d/99-linwin.cfg (Debian, Ubuntu) ou modifie /etc/default/grub ; relance sudo update-grub si besoin |
| L'interface demande libadwaita 1.5 | utilise la ligne de commande |
Pour tout autre souci, le journal de l'interface (ou la sortie de la commande)
indique l'étape et la raison exacte. linwin status donne l'état complet en JSON.
- Démarrage unique :
bootcrée une entrée UEFI versWINSETUPet la programme enBootNext: le PC démarre une seule fois dessus, puis reprend son ordre normal. - Installation sans intervention : l'installeur Windows (WinPE) lance un
script qui charge le pilote de stockage, cherche le disque dont une partition
commence exactement au bon octet, puis lance
setup.exeavec un fichier de réponses qui n'autorise que cette partition. Au premier démarrage, Windows installe les pilotes réseau, supprimeWINSETUP, étend C:, efface les copies du fichier de réponses (le mot de passe y est encodé) et redémarre sous Linux. - Finalisation : un service (systemd ou OpenRC) lance
linwin finish --autoau démarrage de Linux tant que l'installation est en cours, puis se retire. Il ne finalise que lorsque Windows a réellement terminé son installation (état lu dansWindows\Setup\State\State.ini). Si Linux démarre avant (firmware qui n'a pas suivi l'ordre de démarrage), il relance Windows pour qu'il termine, trois fois au plus. - Numérotation des partitions : l'installeur Windows compte les partitions dans leur ordre physique sur le disque, pas par numéro d'entrée GPT. linwin calcule ce rang, et répare l'entrée UEFI de Windows si celui-ci y a écrit un mauvais numéro de partition EFI (cas des tables qui ne sont pas dans l'ordre du disque).
- Prudence : la table de partitions d'origine est sauvegardée dans
/var/lib/linwin/ptable-before.sfdisk; les signatures existantes ne sont jamais effacées lors des redimensionnements ; une seule opération à la fois (verrou) ; chaque réduction est vérifiée avant la suivante. - Téléchargements : ISO chez Microsoft, pilote RST chez Intel (empreintes SHA-256 épinglées), pilotes réseau depuis le catalogue Microsoft Update (SHA-1 publié par Microsoft, puis contrôle de signature par Windows).
Fichiers utilisés :
| Chemin | Contenu |
|---|---|
/usr/local/lib/linwin/ |
copie de confiance de linwin (root:root) |
/var/lib/linwin/state |
état de l'installation en cours (state.done une fois finie) |
/var/lib/linwin/ptable-before.sfdisk |
sauvegarde de la table de partitions |
/run/linwin.log |
sortie de l'opération en cours |
~/.config/linwin/gui.json |
réglages de l'interface |
linwin [--progress] <commande> [options]
install installe une copie root:root dans /usr/local/lib/linwin
check compatibilité du PC, place disponible, chargeur, pilotes
status état complet en JSON
plan --size 100G partitionnement prévu (ne modifie rien)
iso [--lang French] télécharge l'ISO Windows 10 22H2 dans ~/Downloads
prepare --size 100G crée MSR + Windows + WINSETUP (root)
[--stage-size 8G] [--mode free|shrink] [--yes] [--key-stdin]
stage --iso FICHIER copie l'installeur sur WINSETUP (root)
[--vmd-driver DOSSIER] [--no-net-drivers]
[--edition Home|Pro|Education --user NOM [--password-stdin]]
boot démarre l'installeur au prochain redémarrage (root)
finish [--force] nettoyage + Windows dans le menu du chargeur, une fois
l'installation de Windows terminée (root)
drivers copie les pilotes réseau sur un Windows déjà installé (root)
cancel [--yes] [--key-stdin] supprime Windows et rend l'espace (root)
--version affiche la version
--key-stdin lit la passphrase LUKS sur l'entrée standard ; --yes saute la
confirmation OUI.
linwin est un logiciel libre distribué sous licence GNU GPL version 3 ou ultérieure : tu peux l'utiliser, l'étudier, le modifier et le redistribuer, à condition que les versions modifiées restent sous la même licence. Il est fourni sans aucune garantie.
linwin n'est affilié ni à Microsoft ni à Intel. Windows est une marque de Microsoft Corporation. Utilisation à tes propres risques : sauvegarde d'abord.