Freebsd 13 sob o bhyve

Virtualização

Welcome to FreeBSD
Welcome to FreeBSD

Esta página mostra a implementação de uma máquina virtual com o sistema operacional FreeBSD 13, usando o próprio FreeBSD 13 como um Host bhyve. Mais informações podem ser obtidas na página FreeBSD como um Host bhyve.

Carregar o hypervisor bhyve

$ sudo kldload vmm

Definir a interface de rede da máquina virtual

Deve ser criada uma interface tap para o dispositivo de rede na máquina virtual e uma interface de bridge entre a interface tap e a interface de rede física do computador re0.

$ sudo ifconfig tap0 create
$ sudo sysctl net.link.tap.up_on_open=1
net.link.tap.up_on_open: 0 -> 1
$ sudo ifconfig bridge0 create
$ sudo ifconfig bridge0 addm re0 addm tap0
$ sudo ifconfig bridge0 up
$ ifconfig bridge0
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	ether 58:9c:fc:10:84:6b
	id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
	maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
	root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
	member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
	        ifmaxaddr 0 port 3 priority 128 path cost 2000000
	member: re0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
	        ifmaxaddr 0 port 1 priority 128 path cost 200000
	groups: bridge
	nd6 options=9<PERFORMNUD,IFDISABLED>

Criar o disco da máquina virtual

Deve ser criado o arquivo que será usado como disco virtual da máquina convidada, especificando o tamanho e o nome do arquivo do disco virtual no sistema operacional hospedeiro:

$ truncate -s 32G freebsd13.img

Executar a máquina virtual

Vamos usar o script de exemplo para executar uma máquina virtual com o bhyve que vem com o FreeBSD 13. O script inicia a máquina virtual e a executa em um loop, para que ela seja reiniciada automaticamente se houver falha.

$ sudo sh /usr/share/examples/bhyve/vmrun.sh \
    -c 1                                     \
    -m 1024M                                 \
    -t tap0                                  \
    -d freebsd13.img                         \
    -i                                       \
    -I FreeBSD-13.0-RELEASE-amd64-dvd1.iso   \
    freebsd13

Instalação do sistema operacional no disco virtual

Com a tela de boas vindas mostrada no início da página aberta, vamos escolher a opção 1 (Enter) para carregar o sistema operacional em modo multiusuário, aceitar a opção Console type [vt100] dando Enter e, na janela de Boas Vindas (Welcome), vamos optar por instalar (Install) o FreeBSD.

Com a janela do FreeBSD Installer aberta, vamos configurar a máquina virtual através de uma série de menus:

  1. Seleção do mapa do teclado (Keymap Selection)
    • Vamos prosseguir com o mapa de teclado padrão
  2. Escolher o nome do hospedeiro (Set Hostname)
    • Vamos escolher freebsd13
  3. Escolher os componentes opcionais do sistema a serem instalados
    • Vamos escolher lib32, ports e src
  4. Particionamento do disco
    • Vamos escolher Auto UFS, todo o disco (Entire Disk), MBR DOS Partitions e finalizar com Finish
    • Na tela de confirmação vamos escolher a opção Commit
  5. Fornecer a senha para o usuário root
    • New Password:
    • Retype New Password:
  6. Configuração de rede
    • Aceitar a Interface vtnet0 VirtIO Networking Adapter
  7. Configurar IPv4?
    • Sim
  8. Usar DHCP para essa interface?
    • Sim
  9. Confgurar IPv6 para essa interface?
    • Sim
  10. Autoconfiguração do endereço (SLAAC)?
    • Sim
  11. Configuração de rede
    • OK
  12. Seletor de zona horária
    • Vamos escolher 2 - América Norte e Sul
  13. Escolher o país
    • 10 Brasil
  14. Escolher a zona horária do Brasil
    • 8 Brasil Sudeste
  15. A abreviatura -03 parece razoável?
    • Sim
  16. Data e hora
    • Pular
    • Pular
  17. Escolher os serviços inicializados junto com o sistema
    • sshd
  18. Endurecimento do sistema
    • Marcar 6 Limpar /tmp
    • Marcar 8 Desabilitar sendmail
    • OK
  19. Adicionar contas de usuários?
    • Sim
    • Username: halley
    • Full name: Halley
    • Uid (Leave empty for default):
    • Login group [halley]:
    • Login group is halley. Invite halley into other groups? []:
    • Login class [default]:
    • Shell (sh csh tcsh nologin) [sh]:
    • Home directory [/home/halley]:
    • Home directory permissions (Leave empty for default):
    • Use password-based authentication? [yes]:
    • Use an empty password? (yes/no) [no]:
    • Use a random password? (yes/no) [no]:
    • Enter password:
    • Enter password again:
    • Lock out the account after creation? [no]:
    • OK? (yes/no): yes
    • Add another user? (yes/no): no
  20. Configuração final
    • Exit
    • OK
  21. Abrir a shell para fazer modificações finais?
    • Não
  22. Completo
    • Reboot

Após a máquina virtual reiniciar, entre no modo multiusuário, aceite a console tipo vt100 na tela de Boas Vindas, escolha a opção Shell e, na linha de comando, digite poweroff, como mostrado abaixo:

When finished, type 'exit' to return to the installer.
# poweroff
Shutdown NOW!
poweroff: [pid 614]
# 
System shutdown time has arrived
May 22 06:52:24  shutdown[614]: power-down by root:
...

Iniciar a máquina virtual

$ sudo sh /usr/share/examples/bhyve/vmrun.sh \
    -c 1                                     \
    -m 4096M                                 \
    -t tap0                                  \
    -d freebsd13.img                         \
    freebsd13

Entrar no modo multiusuário e fazer login como root.

Coleção de Ports

A Coleção de Ports é um conjunto de arquivos usados para compilar e instalar aplicativos no FreeBSD, e é chamado de port.

Obtenção da Coleção de Ports

root@freebsd13:~ # portsnap fetch
Looking up portsnap.FreeBSD.org mirrors... 4 mirrors found.
Fetching public key from ipv4.aws.portsnap.freebsd.org... done.
Fetching snapshot tag from ipv4.aws.portsnap.freebsd.org... done.
Fetching snapshot metadata... done.
Fetching snapshot generated at Fri May 21 21:23:35 -03 2021:
41ab6bdf335b8988d29e5fce7088e5633f4962ca237d3e          90 MB 2884 kBps    32s
Extracting snapshot... done.
Verifying snapshot integrity... done.
Fetching snapshot tag from ipv4.aws.portsnap.freebsd.org... done.
Fetching snapshot metadata... done.
Updating from Fri May 21 21:23:35 -03 2021 to Sat May 22 05:05:28 -03 2021.
Fetching 5 metadata patches... done.
Applying metadata patches... done.
Fetching 0 metadata files... done.
Fetching 63 patches. 
(63/63) 100.00%  done.                                  
done.
Applying patches... 
done.
Fetching 1 new ports or files... done.

root@freebsd13:~ # portsnap extract

Atualização do sistema operacional

root@freebsd13:~ # pkg update
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/FreeBSD:13:amd64/quarterly, please wait...
Verifying signature with trusted certificate pkg.freebsd.org.2013102301... done
Installing pkg-1.16.3...
Extracting pkg-1.16.3: 100%
Updating FreeBSD repository catalogue...
Fetching meta.conf: 100%    163 B   0.2kB/s    00:01    
Fetching packagesite.txz: 100%    6 MiB   3.3MB/s    00:02    
Processing entries: 100%
FreeBSD repository update completed. 30369 packages processed.
All repositories are up to date.

root@freebsd13:~ # pkg upgrade
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
Updating database digests format: 100%
Checking for upgrades (1 candidates): 100%
Processing candidates (1 candidates): 100%
Checking integrity... done (0 conflicting)
Your packages are up to date.

Instalação do editor nano

root@freebsd13:~ # pkg install nano
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 3 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        gettext-runtime: 0.21
        indexinfo: 0.3.1
        nano: 5.5

Number of packages to be installed: 3

The process will require 3 MiB more space.
713 KiB to be downloaded.

Proceed with this action? [y/N]: y
[1/3] Fetching nano-5.5.txz: 100%  542 KiB 554.8kB/s    00:01    
[2/3] Fetching indexinfo-0.3.1.txz: 100%    6 KiB   5.7kB/s    00:01    
[3/3] Fetching gettext-runtime-0.21.txz: 100%  166 KiB 169.9kB/s    00:01    
Checking integrity... done (0 conflicting)
[1/3] Installing indexinfo-0.3.1...
[1/3] Extracting indexinfo-0.3.1: 100%
[2/3] Installing gettext-runtime-0.21...
[2/3] Extracting gettext-runtime-0.21: 100%
[3/3] Installing nano-5.5...
[3/3] Extracting nano-5.5: 100%

Permissão para o usuário criado executar comandos de superusuário

O sudo permite que os usuários executem comandos como superusuário, ou como outro usuário, após serem cadastrados no arquivo sudoers.

Abaixo vemos como cadastrar o usuário criado para utilizar o sudo, após a instalação do pacote sudo:

root@freebsd13:~ # pkg install sudo
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        sudo: 1.9.6p1

Number of packages to be installed: 1

The process will require 6 MiB more space.
1 MiB to be downloaded.

Proceed with this action? [y/N]: y
[1/1] Fetching sudo-1.9.6p1.txz: 100%    1 MiB   1.4MB/s    00:01    
Checking integrity... done (0 conflicting)
[1/1] Installing sudo-1.9.6p1...
[1/1] Extracting sudo-1.9.6p1: 100%

# nano /usr/local/etc/sudoers
...
##
## User privilege specification
##
root ALL=(ALL) ALL
halley ALL=(ALL) ALL
...

Além de cadastrar um usuário específico, também pode ser cadastrado um grupo novo ou existente para que os usuários deste grupo executem comandos como superusuário.

Configuração de rede da máquina virtual

Abaixo está mostrada a configuração de rede da máquina virtual e testes de comunicação:

root@freebsd13:~ # ifconfig
vtnet0: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80028<VLAN_MTU,JUMBO_MTU,LINKSTATE>
        ether 00:a0:98:1d:42:ab
        inet6 fe80::2a0:98ff:fe1d:42ab%vtnet0 prefixlen 64 scopeid 0x1
        inet 192.168.100.112 netmask 0xffffff00 broadcast 192.168.100.255
        media: Ethernet autoselect (10Gbase-T <full-duplex>)
        status: active
        nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet 127.0.0.1 netmask 0xff000000
        groups: lo
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>

root@freebsd13:~ # ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=117 time=585.111 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=622.135 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=567.770 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=117 time=539.382 ms
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 539.382/578.599/622.135/29.971 ms

root@freebsd13:~ # ssh halley@192.168.100.105
The authenticity of host '192.168.100.105 (192.168.100.105)' can't be established.
ECDSA key fingerprint is SHA256:gv2FhNHvXImv02hAoriw9H3jb0h2hj7bu58WHrvkvlM.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.105' (ECDSA) to the list of known hosts.
Password for halley@bsd:
Last login: Sat May 22 06:37:03 2021 from :0
FreeBSD 13.0-RELEASE (GENERIC) #0 releng/13.0-n244733-ea31abc261f: Fri Apr  9 04:24:09 UTC 2021

Welcome to FreeBSD!

halley@bsd:~ $ ^D
Connection to 192.168.100.105 closed.

Desligar a máquina virtual

root@freebsd13:~ # poweroff
Shutdown NOW!
poweroff: [pid 78541]
root@freebsd13:~ #                                                                                
*** FINAL System shutdown message from root@freebsd13 ***                    

System going down IMMEDIATELY                                                  

                                                                               

System shutdown time has arrived
May 22 03:43:53 freebsd13 shutdown[78541]: power-down by root: 
Stopping cron.
Stopping sshd.
Stopping devd.
Writing entropy file: .
Writing early boot entropy file: .
Terminated
.
May 22 03:43:53 freebsd13 syslogd: exiting on signal 15
Waiting (max 60 seconds) for system process `vnlru' to stop... done
Waiting (max 60 seconds) for system process `syncer' to stop... 
Syncing disks, vnodes remaining... 1 0 done
Waiting (max 60 seconds) for system thread `bufdaemon' to stop... done
Waiting (max 60 seconds) for system thread `bufspacedaemon-0' to stop... done
Waiting (max 60 seconds) for system thread `bufspacedaemon-1' to stop... done
All buffers synced.
Uptime: 1h8m48s
acpi0: Powering system off

* * *