Пока рано валить на тех поддержку.
Опус про VM. Написан собственноручно (хотя и копи-пасты есть) и для себя, т.е. для собственного применения, только IP поменял.
Про подъем сети на бриджах где-то в середине.
Лишнее выкидывать не стал. Выходные длинные, будет скучно, можно почитать...
Только сам не запутайся.
Код: Выделить всё
Мне, как тому китайцу, вечно не хватает мозгов.
И чтобы в четыредесятый раз судорожно не ловить покемонов в манах я сразу добавил макрос:
ee /root/.cshrc
alias bh echo "bhyve - hypervisor of FreeBSD, vm - manager from ports /usr/ports/sysutils/vm-bhyve"
Но, это лично для меня, т.к. я вечно ошибаюсь в написании этой команды (bhyve),
особенно по утру в понедельник, достало...
Основная стартовая инструкция для нас:
https://www.freebsd.org/doc/handbook/virtualization-host-bhyve.html
http://www.gsp.com/cgi-bin/man.cgi?section=8&topic=vm
Правда, все не так просто, когда хочется сразу делать под себя.
И лично меня она запутала окончательно, при попытке добится своей, конкретной, конфигурации.
Либо получить простую, управляемую, повторяемость.
Когда начинаешь с ноля новую область познаний и так не легко, т.к. нет понимания "что да как".
В BIOS основной железки находим, проверяем, включаем VT-d и Virt I/O или что у нас там еще есть.
Ставим стандарным образом систему на будущую хост-машину.
Проверим, что есть на ней Интернет, т.е. имена резолвятся, файлы скачиваются.
Например так:
fetch https://svnweb.freebsd.org/base/release/10.3.0/README
fetch: https://svnweb.freebsd.org/base/release/10.3.0/README: size of remote file is not known
README 24 kB 37 MBps 00m00s
Ок. Работает.
Вообще:
192.168.1 - просто внутренняя сетка
192.168.1.1 - главнюк, смотрит в Интернет, никаких бриджей нет.
192.168.1.207 - машинка несет на себе bhyve
192.168.2 - сетка от всех VM машин которые крутятся внутри bhyve (клиенты)
192.168.3 - сетка от всех машин НА которых крутятся хосты bhyve с бриджами (сервера)
главнюк
ifconfig
em0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 9000
description: LAN1 loc
options=4219b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,WOL_MAGIC,VLAN_HWTSO>
ether 00:25:90:3a:6a:90
inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
inet 192.168.6.1 netmask 0xffffff00 broadcast 192.168.6.255
inet 192.168.4.1 netmask 0xffffff00 broadcast 192.168.3.255
inet 192.168.2.1 netmask 0xffffff00 broadcast 192.168.2.255
inet 192.168.3.1 netmask 0xffffff00 broadcast 192.168.3.255
nd6 options=49<PERFORMNUD,IFDISABLED,NO_RADR>
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
em1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
description: WAN1 Internet
options=4219b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,WOL_MAGIC,VLAN_HWTSO>
ether 00:06:29:99:7f:8b
inet 10.10.10.10 netmask 0xfffffff0 broadcast 10.10.10.10.79
nd6 options=49<PERFORMNUD,IFDISABLED,NO_RADR>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
em2: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
description: LAN2 loc
options=4219b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,WOL_MAGIC,VLAN_HWTSO>
ether 00:25:90:3a:6a:92
inet 192.168.222.2 netmask 0xffffff00 broadcast 192.168.222.255
nd6 options=49<PERFORMNUD,IFDISABLED,NO_RADR>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
em3: flags=8c02<BROADCAST,OACTIVE,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=4219b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,WOL_MAGIC,VLAN_HWTSO>
ether 00:25:90:3a:6a:93
nd6 options=49<PERFORMNUD,IFDISABLED,NO_RADR>
media: Ethernet autoselect
status: no carrier
ipfw0: flags=8801<UP,SIMPLEX,MULTICAST> metric 0 mtu 65536
nd6 options=49<PERFORMNUD,IFDISABLED,NO_RADR>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x8
inet 127.0.0.1 netmask 0xff000000
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
tunnel inet 10.10.10.10 --> 100.100.100.101
inet 192.168.1.1 --> 192.168.231.1 netmask 0xffffff00
nd6 options=9<PERFORMNUD,IFDISABLED>
options=1<ACCEPT_REV_ETHIP_VER>
хост bhyve
ifconfig
em0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=42098<VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,VLAN_HWTSO>
ether 18:03:73:c6:f5:f6
inet 192.168.1.207 netmask 0xffffff00 broadcast 192.168.1.255
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect (100baseTX <half-duplex>)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
inet 127.0.0.1 netmask 0xff000000
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
groups: lo
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 02:de:c8:e6:e7:00
inet 192.168.2.2 netmask 0xffffff00 broadcast 192.168.2.255
nd6 options=9<PERFORMNUD,IFDISABLED>
groups: bridge
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 4 priority 128 path cost 2000000
member: em0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 1 priority 128 path cost 2000000
tap0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
description: vmnet-vm1-0-public
options=80000<LINKSTATE>
ether 00:bd:55:e5:f6:00
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect
status: active
groups: tap
Opened by PID 1158
bridge1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
description: vm-public
ether 02:de:c8:e6:e7:01
nd6 options=1<PERFORMNUD>
groups: bridge
id 00:00:00:00:00:00 priority 0 hellotime 2 fwddelay 15
maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
root id 00:00:00:00:00:00 priority 0 ifcost 0 port 0
клиент bhyve
ifconfig
vtnet0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80028<VLAN_MTU,JUMBO_MTU,LINKSTATE>
ether 58:9c:fc:02:7c:42
inet 192.168.2.10 netmask 0xffffff00 broadcast 192.168.2.255
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet 10Gbase-T <full-duplex>
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
inet 127.0.0.1 netmask 0xff000000
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
groups: lo
После установки пропишем, проверим, поправим:
ee /etc/rc.conf
hostname="bhv-srv1"
ifconfig_em0="inet 192.168.1.207 netmask 255.255.255.0"
defaultrouter="192.168.1.1"
sshd_enable="YES"
ntpd_enable="YES"
# rv
# 2017-07-12 17:17
# https://www.freebsd.org/doc/handbook/virtualization-host-bhyve.html
cloned_interfaces="bridge0 tap0"
ifconfig_bridge0="addm em0 addm tap0"
gateway_enable="YES"
vm_enable="YES"
vm_dir="/usr/vm"
#vm_list="vm1 vm2 vm3"
vm_list="vm1"
vm_delay="35" # in seconds between, default 5
# bhyve
# bhyvectl
# bhyveload
# /usr/home/user/usr/src/share/examples/bhyve/vmrun.sh
# /usr/ports/sysutils/vm-bhyve
#
ee /etc/sysctl.conf
# rv
# 2017-07-12 17:17
# https://www.freebsd.org/doc/handbook/virtualization-host-bhyve.html
net.link.tap.up_on_open=1
ee /boot/loader.conf
# rv
# 2017-07-12 17:17
# https://www.freebsd.org/doc/handbook/virtualization-host-bhyve.html
vmm_load="YES"
nmdm_load="YES"
if_bridge_load="YES"
if_tap_load="YES"
ee /etc/resolv.conf
search simple.loc
nameserver 192.168.1.1
Загрузим модуль vmm
kldload vmm
ifconfig tap0 create
sysctl net.link.tap.up_on_open=1
ifconfig bridge0 create
ifconfig bridge0 addm em0 addm tap0
Выругался:
ifconfig: BRDGADD tap0: File exists
но em0 добавил!!!
Мораль ставь em0 (т.е. физический интерфейс) всегда первым!
ifconfig bridge0 up
Сам bhyve по штатной https://www.freebsd.org/doc/handbook/virtualization-host-bhyve.html конечно можно быстро запустить.
Только потом с этим неудобно работать. В том смысле, что лично в моей голове "кеш" маленький,
а нужно слишко много помнить "о чем некий параметр" иначе дело швах.
В итоге вроде подобрал для себя вариант как упростить эту задачу.
И весьма не дурно в этом помогает /usr/ports/sysutils/vm-bhyve.
Вообще, "штатная" алгоритмика и "vm-bhyve" кардинально отличается (в моей голове) и, лично меня как пользователя,
это сильно сбило с толку.
Хотя я понимаю, что на самом деле vm-bhyve работает по штатному принципу. Нашел это в скриптах и логах.
Впоследствии этот момент можно будет подглядеть в логе созданной VM.
ee /usr/vm/vm1/vm-bhyve.log
Jul 13 10:33:01: booting
Jul 13 10:33:01: bhyveload -c /dev/nmdm0A -m 256M -e autoboot_delay=3 -d /usr/vm/.iso/FreeBSD-11.0-RELEASE-amd64-disc1.iso vm1
Jul 13 10:33:04: [bhyve options: -c 1 -m 256M -AHP -U 1d8d3f24-679d-11e7-8be1-180373c6f5f6]
Jul 13 10:33:04: [bhyve devices: -s 0,hostbridge -s 31,lpc -s 4:0,virtio-blk,/usr/vm/vm1/disk0.img -s 5:0,virtio-net,tap1,mac=58:9c:fc:02:7c:42]
Jul 13 10:33:04: [bhyve console: -l com1,/dev/nmdm0A]
Jul 13 10:33:04: [bhyve iso device: -s 3:0,ahci-cd,/usr/vm/.iso/FreeBSD-11.0-RELEASE-amd64-disc1.iso]
Jul 13 10:33:04: starting bhyve
Но о создании VM ниже.
Итак, установим порт для упрощения обслуживания VM
cd /usr/ports/sysutils/vm-bhyve
make install
(check Internet on host, ipfw on gateway too)
Кажется эту строчку нужно править внутри самой vm. Проверить(!)
ee /etc/ttys
ttyu0 "/usr/libexec/getty 3wire" xterm on secure
Хотя на страничке https://www.freebsd.org/doc/handbook/virtualization-host-bhyve.html
написано "Note: Beginning with FreeBSD 9.3-RELEASE and 10.1-RELEASE the console is configured automatically."
Т.е. мол, начиная с 9.3 и 10.1 этот момент конфигурируется автоматически.
И таки, да. Это точно внутри VM.
rehash
Определим/создадим путь где будут лежать все VM
mkdir -p /usr/vm
Проинициализируем, т.к. в rc.conf мы уже прописались, то можно из любого каталога сделать:
vm init
Вообще в мане рекомендуется делать это каждый раз после каких-либо телодвижений, т.е. написано:
init
This should be run once after each host reboot before running any
other vm commands. The main function of the init command is as
follows:
o Load all necessary kernel modules if not already loaded
o Set tap devices to come up automatically when opened
o Create any configured virtual switches
После инита создаются каталоги:
/usr/vm/.config
/usr/vm/.iso
/usr/vm/.templates
Последний почему-то пустой.
Сразу исправим этот момент:
ls /usr/ports/sysutils/vm-bhyve/work/stage/usr/local/share/examples/vm-bhyve/
cp /usr/ports/sysutils/vm-bhyve/work/stage/usr/local/share/examples/vm-bhyve/* /usr/vm/.templates
Скачаем нужный дистрибутив на хост-машину:
cd /usr/vm/.iso
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/11.0/FreeBSD-11.0-RELEASE-amd64-disc1.iso
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/11.0/CHECKSUM.SHA256-FreeBSD-11.0-RELEASE-amd64
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/11.0/CHECKSUM.SHA512-FreeBSD-11.0-RELEASE-amd64
По ману можно из любого каталога выполнить закачку еще и так:
vm iso ftp://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/10.1/FreeBSD-10.1-RELEASE-amd64-disc1.iso
все будет уложено именно в /usr/vm/.iso , т.е. как прописано в ee /etc/rc.conf
Красиво и логично.
Теперь сети.
Для меня это оказалось очень проблемным, въехать, как это настраивать.
Особенно как перестраивать и добиваться правильной работы.
Смотрим:
vm switch list
NAME TYPE IDENT VLAN NAT PORTS
т.е. чисто, интерфейсов нет, сетей нет, населена роботами...
vm switch create public
vm switch add public em0
/usr/local/sbin/vm: ERROR: failed to add member to the virtual switch
##########################################################################
https://www.freebsd.org/doc/handbook/network-bridging.html
# ifconfig bridge create
# ifconfig bridge0 addm fxp0 addm fxp1 up
# ifconfig fxp0 up
# ifconfig fxp1 up
##########################################################################
(https://github.com/churchers/vm-bhyve)
(If you just want to bridge guests to your physical network, add the appropriate real interface to the switch.
Obviously you will need to replace em0 here with the correct interface name on your system:
# vm switch add public em0)
##########################################################################
https://github.com/churchers/vm-bhyve/issues/146
Generally you want to put the host ip on the bridge. So says FreeBSD handbook too:
If the bridge host needs an IP address, set it on the bridge interface, not on the member interfaces.
https://www.freebsd.org/doc/handbook/network-bridging.html
I recommend setting up the bridge manually, and telling vm-bhyve to simply use it (bridge import).
Here is an example rc.conf snippet, based on what I use (mac is set specifically on bridge to avoid it changing when I reboot)":
cloned_interfaces="bridge0 tap0"
# add a dummy tap just to keep this from happening
# https://github.com/churchers/vm-bhyve/issues/105
ifconfig_bridge0="ether 96:3d:4b:f1:79:7a addm igb0 addm tap0 up"
ifconfig_bridge0_alias0="inet 192.168.1.1/24"
ifconfig_igb0="up"
ifconfig_tap0="description 'dummy-tap' up"
Then in vm/.config/system.conf, after a vm switch import public bridge0:
switch_list="public"
bridge_public="bridge0"
$ vm switch list
NAME TYPE IDENT VLAN NAT PORTS
public manual bridge0 n/a n/a n/a
##########################################################################
Основной скрипт:
ee /usr/local/sbin/vm
По свичу:
ee /usr/local/lib/vm-bhyve/vm-switch
И вообще, в портах уже
https://svnweb.freebsd.org/ports/head/sysutils/vm-bhyve/
версия - 1.1.8
fetch https://svnweb.freebsd.org/base/release/10.3.0/README
fetch https://svnweb.freebsd.org/ports/head/sysutils/vm-bhyve/Makefile\?view=co
fetch https://svnweb.freebsd.org/ports/head/sysutils/vm-bhyve/distinfo\?view=co
fetch https://svnweb.freebsd.org/ports/head/sysutils/vm-bhyve/pkg-descr\?view=co
fetch https://svnweb.freebsd.org/ports/head/sysutils/vm-bhyve/pkg-message\?view=co
fetch https://svnweb.freebsd.org/ports/head/sysutils/vm-bhyve/pkg-plist\?view=co
ln -s /usr/local/share/certs/ca-root-nss.crt /etc/ssl/cert.pem
##########################################################################
!!! ЧИТАТЬ ВНИМАТЕЛЬНО !!!
https://github.com/churchers/vm-bhyve/wiki/Virtual-Switches
ee /usr/local/lib/vm-bhyve/vm-switch
##########################################################################
Форум от автора скрипта:
https://forums.freebsd.org/threads/52014/
Интересная вешь у него написана:
Вопрос: Ok I just gave it the command, and now the error is gone and the other dirs are created.
One more question, do I need the cloned_interfaces="brigde0 tap0" lines in /etc/rc.conf?
Or is the vm switch create public command taking care of that?
Thanks for your time.
---
Ответ: You don't need to create any bridges or other interfaces manually.
The switch commands create bridge interfaces (and this is done automatically by vm-bhyve on boot). Tap devices are created dynamically when you start a virtual machine
---
Windows is supported in bhyve, but it's a bit hacky. As there's no graphical output you need to create an unattended installation ISO for Windows, then let that run and install Windows blind*. Once installed, the Windows serial console provides enough functionality to find out the guests IP address, at which point you can RDP directly to the guest. (The bhyve Windows instructions provide information to create a Windows install that has RDP enabled by default and gets an IP address via DHCP).
*I say blind but you can actually see a lot of what is happening during install via the Windows serial console.
##########################################################################
https://github.com/churchers/vm-bhyve/issues/105
Please find two strings 'ifconfig "${_id}" description "vm-${_switch}" up' in the /usr/local/lib/vm-bhyve/vm-switch and put
ifconfig "${_id}" priority 0
before.
Но это другое, интересен кусок:
ee /usr/local/lib/vm-bhyve/vm-switch
__switch_add_member(){
local _switch="$1"
local _member="$2"
local _id
[ -z "${_switch}" -o -z "${_member}" ] && __usage
__switch_auto "${_switch}"
__switch_get_ident "_id" "${_switch}"
[ -z "${_id}" ] && __err "unable to locate virtual switch ${_id}"
__switch_configure_port "${_switch}" "${_id}" "${_member}"
__rc_append_string ".config/switch" "ports_${_switch}" "${_member}"
}
##########################################################################
https://github.com/churchers/vm-bhyve/issues/25
Add support for manually configured bridges to vm switch
Just to add, if you are currently using your configuration from above, I would empty out the $vm_dir/.config/switch file if you haven't already.
On reboot the host will run vm init, which will create bridge interfaces for any switches listed in the configuration, which in you case will end up with 2 bridges for each switch, as you're creating them manually in /etc/rc.conf.
With the switch configuration file empty, vm-bhyve will not attempt to create any bridges automatically, but it should still happily find your manual bridges when starting guests.
=============
I've added support for this and a new command to 'import' existing bridge interfaces. Assuming you have cleared out any existing virtual switches, you should be able to run the following:
vm switch import lan bridge0
vm switch import wan bridge1
This will add the bridges to vm-bhyve configuration, and will assign the relevant description so we can find them when starting guests. It also causes the description to be added on boot, so users don't need to manually assign the vm-bhyve label to the bridge.
These show up in vm switch list as "manual" switches. The idea being that this is for instances when you want to manage your own bridge. As such, we error out if you try and run one of the add, remove, vlan or nat functions on it.
If the destroy command is used, it remove the interface description and vm-bhyve configuration, but leaves the bridge intact.
##########################################################################
Смотрим снова:
vm switch list
NAME TYPE IDENT VLAN NAT PORTS
public auto bridge1 - - -
т.е. все-таки бридж добавился И очень хорошо, что тип "auto".
Manual имеет существенные ограничения, читаем ман.
ifconfig
em0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=42098<VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,VLAN_HWTSO>
ether 18:03:73:c6:f5:f6
inet 192.168.1.207 netmask 0xffffff00 broadcast 192.168.1.255
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect (100baseTX <half-duplex>)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
inet 127.0.0.1 netmask 0xff000000
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
groups: lo
tap0: flags=8902<BROADCAST,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80000<LINKSTATE>
ether 00:bd:51:de:ff:00
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect
status: no carrier
groups: tap
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 02:de:c8:e6:e7:00
nd6 options=9<PERFORMNUD,IFDISABLED>
groups: bridge
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: em0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 1 priority 128 path cost 200000
bridge1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
description: vm-public
ether 02:de:c8:e6:e7:01
nd6 options=1<PERFORMNUD>
groups: bridge
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
Вроде "не то" с сеткой, потом до-разобраться.
Для создания файла машины есть команда:
vm create [-t template] [-s size] name
Выше мы копировали темплейты, они лежат в /usr/vm/.templates
Не трудно догадаться, что дефолтный - default.conf
Можно скопировать, подправить и использовать его.
Создаем дефолтную VM машинку (256Мб RAM):
vm create -s 16G vm1
---После создания VM
О темплайтах нужно расписать отдельно.
Бриджи, будь они не ладны.
С первого захода не получилось по ману.
На заметку почитать скрипт:
/usr/share/examples/netgraph/ether.bridge
Но что замечено, если совсем швах, то содержимое двух файлов дает многое для понимания, просветления.
Речь о ee /usr/vm/.config/switch
switch_list="public"
ports_public="em0"
В нем отсутствовала строка: ports_public="em0"
А без нее vm switch list
NAME TYPE IDENT VLAN NAT PORTS
public auto bridge1 - - em0
ЕСЛИ НЕ РИСУЕТ em0 в графе PORTS.
Без этого сеть не работает.
Нужно проверить м.б. он появляется после перезагрузки?
и cat /usr/vm/vm1/vm1.conf
guest="freebsd"
loader="bhyveload"
cpu=1
memory=256M
network0_type="virtio-net"
network0_switch="public"
network0_device="tap0"
disk0_type="virtio-blk"
disk0_name="disk0.img"
uuid="1d8d3f24-679d-11e7-8be1-180373c6f5f6"
network0_mac="58:9c:fc:02:7c:42"
Но он (этот файлик) появится позже (? точно ? Да, точно!) после создания VM.
Еще, тоже интересный, файлик:
cat /usr/vm/vm1/console
com1=/dev/nmdm0B
Укажем какой дистрибутив подключен для инсталляции:
vm install vm1 FreeBSD-11.0-RELEASE-amd64-disc1.iso
ничего не выводит, тишина, подождать (время на загрузку с образа диска), делаем снова:
vm console vm1
Рисует "Connected" и тишина, жмыкаем h
(на самом деле любую клавишу, можно ентер).
(This uses cu() so press ~+Ctrl-D to exit)
(or ~. to exit)
О! Вводим
login: root
# bsdinstall
Выбор делаем на отдельном стрелочном кейпаде и табом.
И очень аккуратно, терминальные клавиши по дефолту очень не удобно работают.
Точнее совсем неудобно работают...
На выборе языка ловим:
---------------------------Error-----------------------------¬
¦ kbdcontrol: setting keymap: Inappropriate ioctl for device ¦
+------------------------------------------------------------+
¦ < OK > ¦
L-------------------------------------------------------------
Inappropriate ioctl for device
reboot (хост-машины)
Вообще все плохо.
Коннект к vm потерян, напрочь.
В BIOS поменял порт COM1 на COM2.
Ни фига.
Тут осенила мысль:
Похоже она (новая VM) начала грузиться из файла но, т.к. установка не прошла - грузиться особо нечему - висим...
Тогда делаем так:
vm stop vm1
vm install vm1 FreeBSD-11.0-RELEASE-amd64-disc1.iso
vm console vm1
h
login: root
# bsdinstall
На этот раз все пошло нормально.
Устанавливаемся как обычно.
vm1.bhyve.loc
192.168.2.10
в конце
reboot
vm console vm1
Получили доступ к загрузившейся VM.
На главном роутере добавить новые сетки ee /etc/rc.conf:
-route add -net 192.168.2.10/32 192.168.1.1
-и в ee /etc/rc.conf
-route_bhyve1="-net 192.168.2.10/32 192.168.1.1"
-static_routes="bhyve1"
для серверов с VM
ifconfig_em0_alias2="inet 192.168.3.1 netmask 255.255.255.0"
для самих VM
ifconfig_em0_alias2="inet 192.168.2.1 netmask 255.255.255.0"
Добавим их на лету
ifconfig em0 inet alias 192.168.2.1
ifconfig em0 inet alias 192.168.3.1
Поменяем правила в IPFW.
Во-первых изменяется диверт
С divert 8668 ip from 192.168.1.0/24 to any out via em1
на divert 8668 ip from 192.168.1.0/24,192.168.2.0/24,192.168.3.0/24 to any out via em1
Исходящий остается прежним
divert 8668 ip from any to 10.10.10.10 in via em1
Для того чтобы это сделать на лету был применен небольшой трюк:
ipfw -d show | grep div
10550 355185 20742916 divert 8668 ip from 192.168.1.0/24 to any out via em1
10600 38800509 41611682501 divert 8668 ip from any to 10.10.10.10 in via em1
ipfw -q -N add 10552 divert natd all from 192.168.1.0/24,192.168.2.0/24,192.168.3.0/24 to any out via em1
ipfw delete 10550
Надо натинг только для конкретных ИП:
ipfw -q -N add 10554 divert natd all from 192.168.1.0/24,192.168.2.0/24,192.168.3.10/32 to any out via em1
Это позволило не перезагружать машину и не разрывать связь с Интернет.
На удаленке работало несколько человек, смотрелся фильм на ноутбуке, интернет-радио играло, подключены другие сети через ракун2.
Никто ничего не заметил. Красота.
Хотя как себя почувствует sendmail после таких сетевых "добавок", это еще вопрос...
Поправим скрипт с правилами.
У меня их: ipfw show|wc -l
880
т.е. вроде не так много...
ee /etc/fw-script.conf
intvmnet="192.168.2.0/24"
intvmsrvnet="192.168.3.0/24"
${fw} add divert natd all from ${intnet},${intvmnet},${intvmsrvnet} to any out via ${extif}
${fw} add divert natd all from any to ${extip} in via ${extif}
...
#
${fw} add allow tcp from 192.168.1.207 1024-65535 to any 20,21,80,92,443
${fw} add allow tcp from any 20,21,80,92,443 to 192.168.1.207 1024-65535
${fw} add allow tcp from any 1024-65535 to 192.168.1.207 1024-65535
${fw} add allow tcp from 192.168.1.207 1024-65535 to any 1024-65535
#
# net for VM
${fw} add allow icmp from 192.168.2.10 to any
${fw} add allow icmp from any to 192.168.2.10
${fw} add allow udp from 192.168.2.10 1024-65535 to 192.168.1.1 53
${fw} add allow udp from 192.168.1.1 53 to 192.168.2.10 1024-65535
${fw} add allow udp from 192.168.1.1 53,1024-65535 to 192.168.2.10 53,1024-65535
${fw} add allow udp from 192.168.2.10 53,1024-65535 to 192.168.1.1 53,1024-65535
${fw} add allow udp from 192.168.2.10 123 to 192.168.1.1 123
${fw} add allow udp from 192.168.1.1 123 to 192.168.2.10 123
${fw} add allow tcp from 192.168.2.10 1024-65535 to any 20,21,80,92,443
${fw} add allow tcp from any 20,21,80,92,443 to 192.168.2.10 1024-65535
${fw} add allow tcp from any 1024-65535 to 192.168.2.10 1024-65535
${fw} add allow tcp from 192.168.2.10 1024-65535 to any 1024-65535
#
# net for hosts VM
${fw} add allow icmp from 192.168.3.10 to any
${fw} add allow icmp from any to 192.168.3.10
${fw} add allow udp from 192.168.3.10 1024-65535 to 192.168.1.1 53
${fw} add allow udp from 192.168.1.1 53 to 192.168.3.10 1024-65535
${fw} add allow udp from 192.168.1.1 53,1024-65535 to 192.168.3.10 53,1024-65535
${fw} add allow udp from 192.168.3.10 53,1024-65535 to 192.168.1.1 53,1024-65535
${fw} add allow udp from 192.168.3.10 123 to 192.168.1.1 123
${fw} add allow udp from 192.168.1.1 123 to 192.168.3.10 123
${fw} add allow tcp from 192.168.3.10 1024-65535 to any 20,21,80,92,443
${fw} add allow tcp from any 20,21,80,92,443 to 192.168.3.10 1024-65535
${fw} add allow tcp from any 1024-65535 to 192.168.3.10 1024-65535
${fw} add allow tcp from 192.168.3.10 1024-65535 to any 1024-65535
...
правила таблицы 24
...
А вручную так:
ipfw -q -N add 17969 allow tcp from 192.168.2.10 1024-65535 to any dst-port 20,21,80,92,443
ipfw -q -N add 18019 allow tcp from any 20,21,80,92,443 to 192.168.2.10 dst-port 1024-65535
ipfw -q -N add 18069 allow tcp from any 1024-65535 to 192.168.2.10 dst-port 1024-65535
ipfw -q -N add 18119 allow tcp from 192.168.2.10 1024-65535 to any dst-port 1024-65535
ipfw -q -N add 18120 allow icmp from 192.168.2.10 to any
ipfw -q -N add 18122 allow icmp from any to 192.168.2.10
#
ipfw -q -N add 17970 allow udp from 192.168.2.10 1024-65535 to 192.168.1.1 53
ipfw -q -N add 18030 allow udp from 192.168.1.1 53 to 192.168.2.10 1024-65535
ipfw -q -N add 17932 allow udp from 192.168.1.1 53,1024-65535 to 192.168.2.10 53,1024-65535
ipfw -q -N add 18032 allow udp from 192.168.2.10 53,1024-65535 to 192.168.1.1 53,1024-65535
#
ipfw -q -N add 17972 allow udp from 192.168.2.10 123 to 192.168.1.1 123
ipfw -q -N add 18034 allow udp from 192.168.1.1 123 to 192.168.2.10 123
ipfw show 17969 18019 18069 18119 18120 18122 17970 18030 17932 18032 17972 18034
Дадим доступ к BIND
ee /var/named/etc/namedb/named.conf
acl "trusted-dns" {
192.168.2.1;
192.168.3.1;
};
acl "vhost-dns" {
192.168.2.10;
192.168.3.10;
};
/etc/rc.d/named reload
Если не резолвится посмотрим лог
ee /var/named/var/log/named-security.log
Теперь смотрим настройки на хост-машине
Настроим внутри VM
ee /etc/rc.conf
clear_tmp_enable="YES"
syslogd_flags="-ss"
hostname="vm1.bhyve.loc"
keymap="ru.koi8-r.kbd"
ifconfig_vtnet0="inet 192.168.2.10 netmask 255.255.255.0"
defaultrouter="192.168.2.2"
local_unbound_enable="NO"
#local_unbound_enable="YES"
sshd_enable="YES"
ntpd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"
linux_enable="YES"
#EOF
По факту должны только linux_enable="YES" дописать и unbiund закомментировать, но о нем ниже.
Установим софт внутри VM
pkg version -v
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:11:amd64/quarterly, please wait...
pkg: Error fetching http://pkg.FreeBSD.org/FreeBSD:11:amd64/quarterly/Latest/pkg.txz: No address record
A pre-built version of pkg could not be found for your system.
Consider changing PACKAGESITE or installing it from ports: 'ports-mgmt/pkg'.
cd /usr/ports/ports-mgmt/pkg
make install
kldload linux
cd /usr/ports/net/boinc-client
make config
------------------------- boinc-client-7.2.33_6 ---------------------------¬
¦ -----------------------------------------------------------------------¬ ¦
¦ ¦+[x] CLIENT Build BOINC client ¦ ¦
¦ ¦+[x] LINUX Accept Linux science applications ¦ ¦
¦ ¦+[ ] MANAGER Build BOINC manager GUI ¦ ¦
¦ ¦+[x] NLS Native Language Support ¦ ¦
¦ ¦+[ ] SKINS Install more skins for BOINC manager ¦ ¦
¦ ¦+[x] USER Create/check BOINC client user and directory ¦ ¦
¦ ¦+[ ] X11 Build graphics API ¦ ¦
¦ ¦-------------------- Command line options in script ------------------¦ ¦
¦ ¦+[ ] NO_GUI_RPC Disable GUI RPC and socket (breaks boinc_curses) ¦ ¦
¦ ¦+[x] NO_NET_INFO Do not send host address and name to servers ¦ ¦
¦ L----------------------------------------------------------------------- ¦
+--------------------------------------------------------------------------+
¦ < OK > <Cancel> ¦
L---------------------------------------------------------------------------
make install
===> NOTICE:
The boinc-client port currently does not have a maintainer. As a result, it is
more likely to have unresolved issues, not be up-to-date, or even be removed in
the future. To volunteer to maintain this port, please create an issue at:
https://bugs.freebsd.org/bugzilla
More information about port maintainership is available at:
https://www.freebsd.org/doc/en/articles/contributing/ports-contributing.html#maintain-port
===> Found saved configuration for boinc-client-7.2.33_6
===> boinc-client-7.2.33_6 depends on file: /usr/local/sbin/pkg - found
=> boinc-client-7.2.33.tar.xz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch http://distcache.FreeBSD.org/local-distfiles/rene/boinc-client-7.2.33.tar.xz
================================================
===> Found saved configuration for boinc-client-7.2.33_6
===> boinc-client-7.2.33_6 depends on file: /usr/local/sbin/pkg - found
=> boinc-client-7.2.33.tar.xz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch http://distcache.FreeBSD.org/local-distfiles/rene/boinc-client-7.2.33.tar.xz
fetch: http://distcache.FreeBSD.org/local-distfiles/rene/boinc-client-7.2.33.tar.xz: No address record
=> Attempting to fetch http://distcache.us-east.FreeBSD.org/local-distfiles/rene/boinc-client-7.2.33.tar.xz
fetch: http://distcache.us-east.FreeBSD.org/local-distfiles/rene/boinc-client-7.2.33.tar.xz: No address record
=> Attempting to fetch http://distcache.eu.FreeBSD.org/local-distfiles/rene/boinc-client-7.2.33.tar.xz
fetch: http://distcache.eu.FreeBSD.org/local-distfiles/rene/boinc-client-7.2.33.tar.xz: No address record
=> Attempting to fetch http://distcache.us-west.FreeBSD.org/local-distfiles/rene/boinc-client-7.2.33.tar.xz
fetch: http://distcache.us-west.FreeBSD.org/local-distfiles/rene/boinc-client-7.2.33.tar.xz: No address record
=> Attempting to fetch http://distcache.FreeBSD.org/ports-distfiles/boinc-client-7.2.33.tar.xz
fetch: http://distcache.FreeBSD.org/ports-distfiles/boinc-client-7.2.33.tar.xz: No address record
=> Couldn't fetch it - please try to retrieve this
=> port manually into /usr/ports/distfiles/ and try again.
*** Error code 1
Stop.
make[1]: stopped in /usr/ports/net/boinc-client
*** Error code 1
Stop.
make: stopped in /usr/ports/net/boinc-client
Заглючил unbound , на ровном месте...
Ключевое слово "No address record", т.е. "вдруг" пропало распознавание DNS адресов.
С какого перепугу?
Пробуем:
ping distcache.FreeBSD.org
ping: cannot resolve distcache.FreeBSD.org: Host name lookup failure
Перезапуск
/etc/rc.d/local_unbound restart
Пробуем:
ping distcache.FreeBSD.org
ping: cannot resolve distcache.FreeBSD.org: Host name lookup failure
Выключаем его нафиг!
/etc/rc.d/local_unbound stop
ee /etc/rc.conf
local_unbound_enable="NO"
#local_unbound_enable="YES"
ee /etc/resolv.conf
#nameserver 127.0.0.1
#options edns0
nameserver 192.168.1.1
ping distcache.FreeBSD.org
PING distcache.geo.FreeBSD.org (77.88.40.109): 56 data bytes
О! IP получен, значит заработало...
Продолжаем теперь уже спокойно...
make install
Ок.
Готово.