O libvirt não tem nenhum controle de acesso do usuário sobre VMs individuais, então sua melhor opção é provavelmente escrever uma série de scripts wrapper em torno de virsh (um para reiniciar a VM, um para pará-lo, um para iniciá-lo, um para mude a imagem ISO, e o que mais você precisar), e então dê ao seu amigo sudo acesso a esses scripts a partir de sua conta de login.
Os scripts do wrapper devem ser escritos com valores codificados (por exemplo, para o nome da VM) e uma verificação cuidadosa de quaisquer dados fornecidos pelo usuário. por exemplo. Certifique-se de que, se ele fornecer um nome de arquivo de imagem ISO, ele seja, na verdade, uma imagem ISO e que tenha acesso de leitura a ele.
por exemplo. se a VM for chamada de "FriendVM", um script de reinicialização pode ter esta aparência:
#! /bin/sh # Script Name: Reboot-FriendVM.sh virsh reboot FriendVM
Dar a ele acesso sudo a esse script permitirá que ele reinicie APENAS aquela VM em particular. Ele executaria da seguinte forma: sudo Reboot-FriendVM.sh
Scripts de wrapper semelhantes em torno de 'virsh start', 'virsh destroy' são fáceis de extrapolar a partir disso. Um script para alterar a imagem ISO seria um pouco mais complicado e é deixado como um exercício para o leitor:)
Outra variação desta idéia, se você não quer escrever muitos pequenos scripts, é escrever um único script com um subconjunto restrito de recursos do virsh que funcionam apenas em sua VM e lhe dão acesso ao sudo. por exemplo. chame isso de rvirsh.
Essa é a maneira simples e minimalista, apenas o suficiente para fazer o trabalho sem frescuras.
Se você tiver mais tempo para gastar, também poderá procurar softwares de gerenciamento de virtualização como o openstack, o google's ganeti, o opennebula e outros. Eles fazem muito mais do que apenas adicionar o controle de acesso do usuário, e aprendê-los exigirá uma quantidade significativa de tempo e esforço.