Настоящее рабочее решение находится здесь https://bbs.archlinux.org/viewtopic.php?id=129872, а затем htop или mc работает по-прежнему!
Это два сценария, которые я использую для создания моста для qemu-kvm.
Сначала позвольте хосту стать IP-маршрутизатором.
Script ip-router.sh:
#!/bin/bash
internetinterface="eth0"
username=`whoami`
if [ "x$username" != "xroot" ] ; then
echo
echo "You must be root in order to run this script..."
echo
exit
fi
if [ "x$1" != "x" ] ; then
internetinterface="$1"
fi
if [ "x$1" == "xdel" ] || [ "x$2" == "xdel" ] ; then
disable="1"
else
disable="0"
fi
if [ "$disable" == "0" ] ; then
echo "Enabling IP forward and setting up masquerade NAT on interface $internetinterface"
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o $internetinterface -j MASQUERADE
else
echo "Disable IP forward and setting down masquerade NAT on interface $internetinterface"
echo 0 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -D POSTROUTING -o $internetinterface -j MASQUERADE
fi
Затем создайте интерфейс tun-tap и bridge с вашим интерфейсом по умолчанию (обычно с подключением к Интернету).
Сценарий create-qemu-bridged-tuntap.sh: [!d4 ]
#!/bin/bash
bridgename=br0
tapinterface=tap0
outinterface=eth1
if [ "x$1" != "x" ] ; then
outinterface="$1"
fi
ifaces=`awk -F: '{print $1}' /proc/net/dev | tail -n +3`
iffound="0"
for i in $ifaces
do
if [ "$outinterface" == "$i" ] ; then
iffound="1"
fi
done
if [ "$iffound" == "0" ] ; then
echo
echo "Can't find the output interface."
echo
exit 1
fi
outifaceip=`ifconfig | grep -A1 $outinterface | tail -1 | awk -F: '{print $2}' | awk '{print $1}'`
outifaceiptokens=`echo $outifaceip | awk -F \. '{print NF}'`
if [ "$outifaceiptokens" != "4" ] ; then
echo
echo "The selected output interface $outinterface doesn't seem to have a valid IP address."
echo
exit 1
fi
hostaddress="192.168.1.1"
guestaddress="192.168.1.95"
sudo tunctl -t $tapinterface
sudo brctl addbr $bridgename
sudo brctl addif $bridgename $tapinterface
sudo ip link set $bridgename up
sudo ip addr add $hostaddress/24 dev $bridgename
sudo route add -host $guestaddress dev $bridgename
sudo parprouted eth1 $bridgename
sudo ~/scripts/ip-router.sh $outinterface
Я ежедневно использую эти скрипты, поэтому они должны хорошо работать и для вас. Вам нужно будет установить какой-то пакет, чтобы все это работало. С помощью:
dlocate `which COMMAND`
вы можете видеть, какой пакет требуется для COMMAND. Например, чтобы увидеть, какой пакет требуется для brctl, просто запустите:
dlocate `which brctl`
, и у вас будет:
bridge-utils: /sbin/brctl
Используя тот же подход для всех команды в этих сценариях, вы должны (по крайней мере) запустить эту командную строку aptitude:
sudo aptitude install dlocate iproute parprouted iptables uml-utilities bridge-utils net-tools
Наконец, вы можете запустить основной скрипт (как обычный пользователь):
Запустив ip addr, вы увидите интерфейс br0 с IP-адресом 192.168.1.1, как указано внутри скрипта create-qemu-bridged-tuntap.sh:
#> ip addr
8: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 36:76:ee:d6:63:b2 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.1/24 scope global br0
Это host address, как видно по guest. И наоборот, гость будет иметь IP-адрес 192.168.1.95 (опять же, это можно легко изменить внутри основного скрипта).
Теперь, используя virt-manager, вам просто нужно настроить гостевой nic для использования br0 в качестве физического интерфейса.
Внутри guest вам просто нужно указать eth0 IP-адрес 192.168.1.95, и все должно работать нормально. [ ! d15]
Slackware13:~> ifconfig
eth0 Link encap:Ethernet HWaddr 52:54:00:F7:6A:78
inet addr:192.168.1.95 Bcast:192.168.1.255 Mask:255.255.255.0
Если поведение, которое вы видите, является хостом, может получить доступ к гостю, и гость может получить доступ к хосту, но гость не может получить доступ к другим машинам в сети или наоборот. Вероятно, брандмауэр хоста блокирует доступ. [ ! d0]
См. https://bugs.launchpad.net/ubuntu/+source/ufw/+bug/573461
В частности, этот раздел: «Последний шаг - отключить netfilter on мост:
# cat >> /etc/sysctl.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
EOF