Um problema de qualquer desenvolvedor, em especial os que tem que lidar com tecnologias como Yocto ou máquinas escravo para compilar software é como mapear de forma transparente uma pasta local dentro da máquina virtual.

Muito frequentemente esse problema desemboca em soluções complexas quando não meia boca, como instalar e configurar SAMBA, NFS ou mesmo SSHFS. E se a pessoa utiliza algo como VirtuaBox, o plugin de guest additions.

Está em hospedeiro Linux, com KVM e virt-manager? A solução já está no próprio kernel do Linux e se chama 9p, um protocolo e sistema de arquivos desenvolvido para o Plan 9.

Hospedeiro

Sem mais delongas, aos passos:

1 - Na janela de configuração da maquina virtual no virt-manager, vá em “Adicionar Hardware”, e selecione “Sistema de arquivos”.

2 - No “Caminho de Origem”, selecione a pasta local do hospedeiro que deseja compartilhar com o hóspede.

3 - No “Caminho de Destino”, coloque um nome aleatório (não exatamente um caminho) que seja que o 9p chame o caminho de origem selecionado. Mo screenshot de exemplo, chama-se “projects”.

Add hardware virt-manager

Hóspede

No lado do hospedeiro está pronto, execute a máquina a virtual, os próximos passos são no hóspede:

1 - Crie uma pasta qualquer ao qual você irá montar o caminho de origem configurado no hospedeiro (ex. mkdir /mnt/projects)

2 - Monte a pasta com o seguinte comando:

mount -t 9p -o version=9p2000.L -o trans=virtio projects /mnt/projects

O comando deve ser dado em sudo (ou doas) dependendo de seu sistema. Muito importante que a pasta mapeada em seu hospedeiro tenha as permissões de escrita no mesmo usuário e/ou grupo que seu qemu esteja sendo executado pelo virt-manager, ou terá problemas de permission denied.

3 - Pronto, a pasta já deve estar disponível no hóspede na maquina virtual.

Mount 9p command done

Mais simples impossível, e sem ter de instalar “guest additions” ou coisas do tipo no hóspede.

Montar no boot da VM

Supondo que esteja em um Linux com Systemd, que infelizmente se tornou o padrão nos sistemas Linux hoje em dia, é possível ativar a montagem no boot da seguinte forma:

1 - Crie o um arquivo de unidade mount para o systemd em /etc/systemd/system (ex. /etc/systemd/system/mnt-projects.mount) com o seguinte conteúdo, modifique para seu caso de uso.

Lembre-se que o systemd EXIGE que o nome do arquivo de mount tenha um padrão senão ele não é aceito. Por exemplo, se seu ponto de montagem for /mnt/projects, é OBRIGATÓRIO o nome do arquivo ser mnt-projects.mount.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[Unit]
Description=Mount 9p Projects Folder
ConditionPathExists=/mnt/projects

[Mount]
What=projects
Where=/mnt/projects
Type=9p
Options=version=9p2000.L,trans=virtio

[Install]
WantedBy=multi-user.target

Neste exemplo acima, o What é a label definida no virt-manager para o ponto de montagem, e o Where é onde será montado.

2 - Ative o arquivo, e caso não tenha erros, inicie ele:

sudo systemctl enable mnt-projects.mount
sudo systemctl start mnt-projects.mount

Se tudo ocorreu certo, sua pasta já deve estar montada, caso não, é possível verificar o que ocorreu com systemctl status, por exemplo:

fbugno@armbiancomserver:/etc/systemd/system$ sudo systemctl status mnt-projects.mount
 mnt-projects.mount - Mount 9p Projects Folder
     Loaded: loaded (/etc/systemd/system/mnt-projects.mount; enabled; vendor preset: enabled)
     Active: active (mounted) since Sun 2022-11-06 02:15:30 UTC; 7min ago
      Where: /mnt/projects
       What: projects
      Tasks: 0 (limit: 9405)
     Memory: 12.0K
        CPU: 1ms
     CGroup: /system.slice/mnt-projects.mount

Nov 06 02:15:30 armbiancomserver systemd[1]: Mounting Mount 9p Projects Folder...
Nov 06 02:15:30 armbiancomserver systemd[1]: Mounted Mount 9p Projects Folder.

Muito bem, mas agora vamos colocar isso para montar no boot no sistema.

3 - Crie em /etc/systemd/system um arquivo de unidade automount. (ex. /etc/systemd/system/mnt-projects.automount):

1
2
3
4
5
6
7
8
[Unit]
Description=Automount for the 9p projects folder

[Automount]
Where=/mnt/projects

[Install]
WantedBy=multi-user.target

Bem simples, onde o Where é o ponto de montagem que foi designado no Where do arquivo anterior.

4 - Ative ele no system:

sudo systemctl enable mnt-projects.automount

E é isso! Se você é como eu, admirador de sistemas BSD, sem duvida foi uma experiência horrorosa e não intuitiva, mas Linux hoje em dia é isso. Teste se está correto reiniciando o sistema.