Proxmox [Mémo] Montage d'une partition d'un HDD/SSD en Passthrough dans un VM Proxmox

EVO

Administreur
Membre du personnel
25 Novembre 2019
8 219
1 576
278
/var/run/docker.sock
[Mémo] Montage d'une partition d'un HDD/SSD en Passthrough dans un VM Proxmox

/!\ Cela a était réalisé sous Proxmox 7

Ceci est plutot rapide, il vous faut identifier l'id de la partition que vous souhaitez monter dans la VM.
Pour cela, aller dans l'interface de Proxmox, dans l'onglet Disques :
4O2pztg.png


Repérer la partition que vous souhaitez monter dans votre VM, dans mon cas, c'est /dev/sda3

En SSH, sur l'hote Proxmox, j'utilise cette commande pour connaitre l'id de la partition ( PARTUUID ) :

lsblk -l -o NAME,PARTUUID /dev/sda3
( Il faut bien sur remplacer /dev/sda3 par le chemin de votre partition )

Cela va vous retourner ceci :
u6JmzWU.png

Le nom de la partition, et son PARTUUID

Maintenant, pour la monter dans une VM, c'est simple, toujours en ligne de commande sur l'hote, on utilise la commande :
qm set <id-VM> -scsi1 /dev/disk/by-partuuid/<PARTUUID>

<id-VM> est a remplacer par l'id de la VM a laquelle il faut monter cette partition
<PARTUUID> est a rempalcer par le PARTUUID de votre partition que nous avons déterminer juste avant
scsi1 est l'emplacement de montage, dans les vm proxmox scsi0 est le 1er emplacement, puis scsi1 , puis scsi2, ...

Exemple, je souhaite monter la partition 4f8a5387-522b-4cb9-a2c3-a390f657c713 dans la VM 102 a l'emplacement scsi1 :
qm set 102 -scsi1 /dev/disk/by-partuuid/4f8a5387-522b-4cb9-a2c3-a390f657c713
 
  • J'aime
Réactions: MilesTEG
Hello 👋🏻
@EVOTk hier j’ai suivi une méthode presque identique. Si ce n’est que j’ai eu dans l’ID des disques leur nom et numéro de série.
C’est ça que j’ai utilisé :

Le résultat est cependant identique à y’a méthode. Je ne sais pas si c’est aussi pérenne que la méthode via uuid mais l’avantage est que l’ID est plus parlant que l’uuid 😅
 
Pour ceux qui veulent, je me suis fait un petit script pour ajouter ou supprimer les disques dans une VM.
Le script est configuré pour trouver Windows11 et LinuxMint. Mais ça peut aisément se modifier ;)
Il faudra aussi chercher les ID des disques et les placer au bon endroit.

Attention cependant, il est écrit pour ZSH. Ça devrait fonctionner en bash, mais il faudra remplacer ça ${param1:l} par ça : ${param1,,}.
Et même chose pour le param2 : ${param2:l} par ça : ${param2,,}.

Bash:
#!/bin/zsh
# ╔══════════════════════════════════════════════════════════════════════════╗
# ║ Script pour monter les disques locaux dans les VM Proxmox                ║
# ╚══════════════════════════════════════════════════════════════════════════╝
# Source : https://pve.proxmox.com/wiki/Passthrough_Physical_Disk_to_Virtual_Machine_(VM)
#   Lister les disques par ID :
#       find /dev/disk/by-id/ -type l|xargs -I{} ls -l {}|grep -v -E '[0-9]$' |sort -k11|cut -d' ' -f9,10,11,12
#   sortie ->
#      /dev/disk/by-id/ata-WDC_WDS500G1B0A-00H9H0_170439801711 -> ../../sda
#      /dev/disk/by-id/wwn-0x5001b448b417884a -> ../../sda
#      /dev/disk/by-id/ata-WDC_WD1002FAEX-00Z3A0_WD-WCATR1291686 -> ../../sdb
#      /dev/disk/by-id/wwn-0x50014ee259db337e -> ../../sdb
#      /dev/disk/by-id/ata-Crucial_CT480M500SSD1_1351095EAB92 -> ../../sdc
#      /dev/disk/by-id/wwn-0x500a0751095eab92 -> ../../sdc
param1=$1
param2=$2
display_help() {
    echo "Usage: $(basename "$0") {Windows11|LinuxMint} {mount|unmount}" >&2
    echo
    echo "      {Windows11|LinuxMint} : VM to use, mandatory"
    echo "                           Windows11 or win11 or Win11 or windows11"
    echo "                           LinuxMint or linuxmint or mint or Mint"
    echo
    echo "      {mount|unmount} : which command to use, mandatory"
    echo "                           mount      to mount the local disks into the VM"
    echo "                           unmount    to unmount the local disks into the VM"
    echo
    exit 1
}
if [[ -z "${param1}" ]] || [[ -z "${param2}" ]]; then
    printf "Au moins un des paramètres est manquant.\n"
    display_help
fi
case ${param1:l} in
    windows11 | w11 | win11)
        mv_to_configure="Windows11"
        ;;
    linuxmint | mint)
        mv_to_configure="LinuxMint"
        ;;
    *)
        printf "\nAucun paramètre fourni.\nIl faut indiquer quelle VM lancer :\n"
        printf "    - Windows11\n"
        printf "    - LinuxMint\n"
        exit 1
        ;;
esac
printf "\nScript pour monter/démonter des disques locaux dans la machine virtuelle %s choisie.\n" "${mv_to_configure}"
printf "Récupération de l'ID de la VM %s...\n" "${mv_to_configure}"
VMID=$(sudo qm list | grep "Windows11" | awk -F " " '{print $1}')
printf "VM %s - ID = '%d'\n" "${mv_to_configure}" ${VMID}
case ${param2:l} in
    mount)
        printf "Ajout des disques suivants à la VM %s...\n" "${mv_to_configure}"
        case $mv_to_configure in
# ~~~~~~~~~ ⬇︎ Zone à modifier ⬇︎ ~~~~~~~~~ #
            Windows11)
                # ../../sdb : Le disque DATA 1To
                sudo qm set ${VMID} -scsi2 /dev/disk/by-id/ata-WDC_WD1002FAEX-00Z3A0_WD-WCATR1291686
                # ../../sdc : Le disque SSD-JEUX-M500
                sudo qm set ${VMID} -scsi3 /dev/disk/by-id/ata-Crucial_CT480M500SSD1_1351095EAB92
                # ../../sdd : Le disque SSD-BX300
                sudo qm set ${VMID} -scsi4 /dev/disk/by-id/ata-CT240BX300SSD1_1736E1021ABB
                # ../../sdf : Le disque SSD-JEUX-M4
                sudo qm set ${VMID} -scsi5 /dev/disk/by-id/ata-M4-CT128M4SSD2_000000001142031C80D3
                # ../../sde : Le disque Data-1To-TEMP
                sudo qm set ${VMID} -scsi6 /dev/disk/by-id/ata-WDC_WD10EADS-65L5B1_WD-WCAU47671540
                # ../../sda : Le disque Windows 10
                sudo qm set ${VMID} -scsi7 /dev/disk/by-id/ata-WDC_WDS500G1B0A-00H9H0_170439801711
                ;;
            LinuxMint)
                printf "Pas encore implémenté...\n"
                exit 0
                ;;
# ~~~~~~~~~ ⬆︎ Zone à modifier ⬆︎ ~~~~~~~~~ #
            *)
                printf "\nErreur fatale #Mount. Vérifier le code du script.\n"
                exit 1
                ;;
        esac
        ;;
    unmount)
        printf "Suppression des disques suivants de la VM %s...\n" "${mv_to_configure}"
        case $mv_to_configure in
# ~~~~~~~~~ ⬇︎ Zone à modifier ⬇︎ ~~~~~~~~~ #
            Windows11)
                # ../../sdb : Le disque DATA 1To
                sudo qm unlink ${VMID} --idlist scsi2
                # ../../sdc : Le disque SSD-JEUX-M500
                sudo qm unlink ${VMID} --idlist scsi3
                # ../../sdd : Le disque SSD-BX300
                sudo qm unlink ${VMID} --idlist scsi4
                # ../../sdf : Le disque SSD-JEUX-M4
                sudo qm unlink ${VMID} --idlist scsi5
                # ../../sde : Le disque Data-1To-TEMP
                sudo qm unlink ${VMID} --idlist scsi6
                # ../../sda : Le disque Windows 10
                sudo qm unlink ${VMID} --idlist scsi7
                ;;
            LinuxMint)
                printf "Pas encore implémenté...\n"
                exit 0
                ;;
# ~~~~~~~~~ ⬆︎ Zone à modifier ⬆︎ ~~~~~~~~~ #
            *)
                printf "\nErreur fatale #UnMount. Vérifier le code du script.\n"
                exit 1
                ;;
        esac
        ;;
esac

TO-DO : faire une recherche automatique des disques disponibles et demander à l'utilisateur s'il veut les ajouter, un par un.
 
Bonjour,
Je proposes mon petit script pour l'attribution de matériel depuis un petit menu:



1689245739241.png


Menu L:
1689245755793.png


Menu 1: Sélectionner la VM qui sera édité.
1689245782673.png

Menu 2: Il faut indiquer un N° de sata libre sur la VM (Sata0 et Sata1 étant consommé, je prendrai le 3.
1689245802412.png
1689245861788.png


Menu 3: Voir le résultat du menu L, je pourrais prendre sda, sda1 etc
1689245917773.png

Menu 4: Répondre par add pour ajouter un Disque ou remove pour supprimé le Disque.
Dans le cas de la suppression, il faut choisir le Sata correspondant dans le menu 2.
1689245978808.png

Menu A:
Ceci permet d'appliquer la configuration.


Par défaut le menu affiche le résultat dans la parenthèse, dans mon cas on voit ceci:
- VM choisit: 100
- N° de sata: 3 (Sata3)
- Disque: /dev/sda (Disque complète et par une partition)
- Action: ADD (Ajout d'un disque)

Il manque plus qu'à faire Appliquer via le menu A et le tour est jouer.
Eteindre la VM, vérifier la configuration de la VM puis de l'allumer et sera bon.
Pour le retour en arrière choisir dans le menu 4 (Indiquer : remove) puis Menu 4.

1689246107764.png
 
Dernière édition:
  • J'aime
Réactions: MilesTEG
Hello 👋🏻
J’ai trouvé comment passer certaines options en ligne de commande pour l’ajout de disque dans une vm.

Bash:
sudo qm set ${VMID} -scsi3 /dev/disk/by-id/ata-Crucial_CT480M500SSD1_1351095EAB92,backup=0,discard=on,cache=writeback,ssd=1
1690109744506.png
Je me pose la question de certaines options de montage.
Déjà le cache : j’ai vu sur le net qu’en write back il y avait plus de performances.
Mais y-a-t’il des risques ?

Pour le ssd émulation , ça n’est que pour un ssd donc là c’est clair.

Que fait l’option discard ?
Et IO Thread ?
Est-ce que ces options doivent être activées ?
Et enfin le async IO ? Sur quoi le mettre si c’est indispensable ?

Merci pour vos conseils 😊
 
Bonjour,

Pour les options supplémentaire, je sais pas. Je suis d'accord que le Write Back est un bon option sur les performances.
 
Voilà ce que j'ai mis pour le moment :
1690235468201.png
(c'est pour un SSD, pour un HDD c'est la même chose sauf SSD emulation qui est désactivée).
 
As tu trouvés pour le IO Thread car j'ai pas réussi à comprendre.
Il permet de placer le processus I/O de chaque disque dans un processus a part plutot que dans le processus "natif".

Cela améliore les performances globale en I/O sur une VM, mais c'est aussi en fonction des besoins, le mieux c'est d'essayer :D