各系统共享网络的方法

windows 和 linux 共享网络给 qemu

Posted by Jerry Chen on September 11, 2022

写在前面

共享网络的方法:

  • 在主机上创建 tap0 虚拟网卡设备,给该设备共享网络;
  • qemu 使用主机上 tap0 的网络在虚拟机中创建 eth0 网卡设备;

参考资料:

Windows 共享网络

创建 tap0 设备

安装第一个 tap 设备的流程:

  1. 下载 TAP-Windows

    点这里下载 TAP-Windows 9.21.2

  2. 安装 TAP-Windows 和驱动

    按默认选项安装即可,安装过程会跳出驱动安装界面,点击安装

  3. 打开 “网络连接” 页面,会发现多出来了一个 “以太网 x” 的设备(驱动是 TAP-Windows Adapter V9),将其更名为 tap0

创建更多 tap 设备的流程:

  1. 输入 hdwwiz.exe 打开 “添加硬件” 页面

  2. 手动添加一个网络适配器设备,型号选择 “TAP-Windows Adapter V9”

  3. 打开 “网络连接” 页面,会发现多出来了一个 “以太网 x” 的设备(驱动是 TAP-Windows Adapter V9 #2)

卸载 tap 设备的流程:

  1. 打开 “设备管理器”,点击菜单栏 “查看” –> “显示隐藏的设备”;

  2. 找到网络适配器类别中的 “TAP-Windows Adapter V9”,点击右键 “卸载设备”;

    在弹出的窗口中点击 “卸载” 即可,如果后面不再需要用到 tap 设备可以先勾选 “尝试删除驱动”;

qemu 跑一个 armhf 的 debian

下载安装 windows qemu

  1. 下载 windows qemu 并安装;

    在这里下载

  2. 将 qemu 安装路径添加到用户环境变量 Path 中;

qemu 跑 armhf 的镜像

  1. 下载 3 个镜像文件到 “D:\armhf_sim”:

  2. qemu-img 调整 debian_wheezy_armhf_standard.qcow2 大小:

    1
    
    qemu-img resize "D:\armhf_sim\debian_wheezy_armhf_standard.qcow2" 32G
    
  3. powershell 执行 qemu 命令运行下载好的镜像:

    1
    2
    3
    4
    5
    6
    
    qemu-system-arm -M vexpress-a9 `
    -kernel "D:\armhf_sim\vmlinuz-3.2.0-4-vexpress" `
    -initrd "D:\armhf_sim\initrd.img-3.2.0-4-vexpress" `
    -drive if=sd,file="D:\armhf_sim\debian_wheezy_armhf_standard.qcow2" `
    -append "root=/dev/mmcblk0p2 console=ttyAMA0" `
    -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no
    

windows 上共享网络给 tap0

  1. 打开 “网络连接” 页面,在可以上网的适配器上右键 “属性”

  2. 在共享页面共享网络给 tap0:

    共享以后 tap0 设备的 IP 会自动变为 192.168.137.1/24(必须 tap0 在使用的情况下才会有 IP,即开启 qemu 的情况下);

qemu 虚拟机中设置 ip、默认网关、dns

  1. 登录根文件系统:

    用户名/密码为:root/root

  2. 设置 ip 和默认网关:

    1
    2
    3
    
    ip address flush dev eth0
    ip address add dev eth0 192.168.137.100/24
    ip route add default via 192.168.137.1 dev eth0
    
  3. 编辑 /etc/resolv.conf,内容如下:

    1
    2
    3
    
    domain mshome.net
    search mshome.net
    nameserver 192.168.137.1
    
  4. 尝试 ping baidu.com

Linux 共享网络

以下内容都是在 WSL2 环境中操作的,虚拟机上也测试过可用(改下网卡名称即可);

创建 tap0 设备

1
2
3
4
5
6
7
8
# 创建一个 tap0 设备
sudo ip tuntap add dev tap0 mode tap
# 开启 tap0 设备
sudo ip link set dev tap0 up

# 设置 tap0 ip 为 192.168.100.1/24
sudo ip address flush dev tap0
sudo ip address add dev tap0 192.168.100.1/24

qemu 跑一个 armhf 的 debian

安装 qemu-system-arm

1
sudo apt install qemu-system-arm

qemu 跑 armhf 的镜像

  1. 下载 3 个镜像文件:

    1
    2
    3
    
    wget https://people.debian.org/~aurel32/qemu/armhf/vmlinuz-3.2.0-4-vexpress
    wget https://people.debian.org/~aurel32/qemu/armhf/initrd.img-3.2.0-4-vexpress
    wget https://people.debian.org/~aurel32/qemu/armhf/debian_wheezy_armhf_standard.qcow2
    
  2. qemu-img 调整 debian_wheezy_armhf_standard.qcow2 大小:

    1
    
    qemu-img resize $PWD/debian_wheezy_armhf_standard.qcow2 32G
    
  3. qemu 命令运行下载好的镜像:

    1
    2
    3
    4
    5
    6
    
    qemu-system-arm -M vexpress-a9 \
    -kernel $PWD/vmlinuz-3.2.0-4-vexpress \
    -initrd $PWD/initrd.img-3.2.0-4-vexpress \
    -drive if=sd,file=$PWD/debian_wheezy_armhf_standard.qcow2 \
    -append "root=/dev/mmcblk0p2 console=ttyAMA0" \
    -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no
    

linux 上共享网络给 tap0

  1. 使能 ipv4 内核转发

    该命令在机器重启后失效,想要永久生效需要更改 /etc/sysctl.conf 配置;

    1
    2
    3
    
    su - root
    echo 1 > /proc/sys/net/ipv4/ip_forward
    exit
    
  2. 设置 NAT 转发

    1
    2
    3
    4
    5
    
    # [可选]清除掉所有的 iptables 规则
    sudo iptables -F
       
    # 将 192.168.100.0/24 网段数据转发到 eth0 上(出口网卡必须是能上网的接口)
    sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
    

    如果 ubuntu22.04 报 “Chain ‘MASQUERADE’ does not exist” 的问题,可以切换下 iptables 的版本为 “iptables-legacy”,配置命令是 sudo update-alternatives --config iptables

qemu 虚拟机中设置 ip、默认网关、dns

  1. 登录根文件系统:

    用户名/密码为:root/root

  2. 设置 ip 和默认网关:

    1
    2
    3
    
    ip address flush dev eth0
    ip address add dev eth0 192.168.100.100/24
    ip route add default via 192.168.100.1 dev eth0
    
  3. 编辑 /etc/resolv.conf,内容如下:

    1
    2
    
    search ""
    nameserver 8.8.8.8
    
  4. 尝试 ping baidu.com