FreeBSD RISCV 在QEME中实践-网络配置

在前一篇文章中,我们一起进行了FreeBSD RISCV 在QEME中实践

现在,让我们配置好网络吧!

先上结论:用默认配置启动即可,网络就加载好了,只是不能ping罢了。因为不能ping,以为网络没通,走了一些弯路。这个坑帮大家踩过,大家就放心走吧!

调试坎坷历程

一开始不知道默认网络配置好了,到处看文档找解决方案。

看官方wiki:riscv - FreeBSD Wiki

 当时就疑惑,wiki中给的Quick Start 快速上手例子,如果网不通,这个例子就是失败的啊!当然最后我们知道网络本身就是通的,这个快速上手例子就是一个成功的例子。但是当时不知道,于是继续看文档,选择了更复杂的组网模式:tap组网模式!

tap组网模式实践

首先加载tap 内核

# 加载分流器内核模块(如果未加载):kldload if_tuntap

FreeBSD13版本里应该是已经加载了,所以会提醒:kldload: can't load if_tuntap: module already loaded or in kernel

 配置网络

主机上的配置如下:

ifconfig tap0 create up
ifconfig bridge0 create up
ifconfig bridge0 addm em0 addm tap0 # em0 might depends of your ethernet devices# 删除配置的接口用destroy
ifconfig bridge0 destroy
ifconfig tap0 destroy

核心思想就是配置一个tap0分流端口,并把物理端口和tap0端口都放入一个桥(bridge0)里,让二者可以通信。 

配置出来效果如下:

tap0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500options=80000<LINKSTATE>ether 58:9c:fc:10:ff:acinet 192.168.0.247 netmask 0xffffff00 broadcast 192.168.0.255groups: tapmedia: Ethernet autoselectstatus: no carriernd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500ether 58:9c:fc:10:ff:c9inet 10.0.2.100 netmask 0xffffff00 broadcast 10.0.2.255inet 10.0.2.2 netmask 0xffffff00 broadcast 10.0.2.255inet 192.168.0.248 netmask 0xffffff00 broadcast 192.168.0.255id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0member: em0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>ifmaxaddr 0 port 1 priority 128 path cost 2000000member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>ifmaxaddr 0 port 10 priority 128 path cost 2000000member: wlan0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>ifmaxaddr 0 port 9 priority 128 path cost 370370groups: bridgend6 options=9<PERFORMNUD,IFDISABLED>

当然由于当时对tap口还不理解,实践中还手动多配置了一些ip地址,比如给bridge0口配置10.0.2 和192.168.0 两个网段。实际上这也是不需要的。

qemu启动命令里的网络设置

-netdev user,id=net0,ipv6=off,hostfwd=tcp::8022-:22

网络类型为user ,就是普通用户网络模式。这个模式配置简单,功能简单,效率低。 ostfwd=tcp::8022-:22表示将服务器的8022端口映射到QEMU虚拟机里的22端口。

-netdev tap,ifname=tap0,script=no,id=net0 -device virtio-net-device,netdev=net0

网络类型为tap,就是分流模式,可以组建任意网络突破,功能强大,效率高,要求对网络比较了解,配置难度大。而且tap模式还需要root账户权限,不适合传统FreeBSD的管理员习惯。

-netdev tap,ifname=tap0,script=no,id=net0 -device virtio-net-device,netdev=net0

网路这块一开始很困惑,因为一开始对qemu的网络拓扑不清楚,而且虚拟机里默认是无法ping通外面的,这样一直误以为网络不通,走了弯路。

后来看文档:Documentation/Networking - QEMU  

才知道客户机默认无法ping通外面。

运行qemu

第一个是默认网络,第二个是tap网络。

qemu-system-riscv64 -machine virt -m 2048M -smp 2 -nographic \-bios /usr/local/share/opensbi/lp64/generic/firmware/fw_jump.elf \-kernel /usr/local/share/u-boot/u-boot-qemu-riscv64/u-boot.bin \-drive file=FreeBSD-15.0-CURRENT-riscv-riscv64.raw,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \-netdev user,id=net0,ipv6=off,hostfwd=tcp::8022-:22 -device virtio-net-device,netdev=net0
qemu-system-riscv64 -machine virt -m 2048M -smp 2 -nographic -bios /usr/local/share/opensbi/lp64/generic/firmware/fw_jump.elf -kernel /usr/local/share/u-boot/u-boot-qemu-riscv64/u-boot.bin -drive file=FreeBSD-14.0-RELEASE-riscv-riscv64.raw,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -netdev tap,ifname=tap0,script=no,id=net0,ipv6=off,hostfwd=tcp::8022-:22 -device virtio-net-device,netdev=net0

ssh登录

 QEMU启动后就出现了login交互界面,可以直接用root登录,默认root没有密码。

在宿主主机也可以使用命令ssh 127.0.0.1 -p 8022 登录客户端。注意需要在虚拟机打开sshd服务,用命令:

service sshd onestart

还需要创建个普通账户方便登录,命令:adduser 

创建好用户之后就可以使用ssh登录了。

最终选择了user用户模式组网,就是因为它简单而且不需要root权限。

user用户组网模式实践

整个过程非常简单命令如下:

# 安装所需的软件包,root账户下
pkg install opensbi u-boot-qemu-riscv64 qemu glib# 以下都在个人用户下
# 下载映像
wget -c http://mirrors.ustc.edu.cn/freebsd/releases/VM-IMAGES/14.0-RELEASE/riscv64/Latest/FreeBSD-14.0-RELEASE-riscv-riscv64.raw.xz
# 解压映像
xz --decompress  FreeBSD-14.0-RELEASE-riscv-riscv64.raw.xz
# 扩展映像
truncate -s 10G FreeBSD-14.0-RELEASE-riscv-riscv64.raw# 启动qemu模拟器 2核 2G内存
qemu-system-riscv64 -machine virt -m 2048M -smp 2 -nographic -bios /usr/local/share/opensbi/lp64/generic/firmware/fw_jump.elf -kernel /usr/local/share/u-boot/u-boot-qemu-riscv64/u-boot.bin -drive file=FreeBSD-14.0-RELEASE-riscv-riscv64.raw,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -netdev user,id=net0,ipv6=off,hostfwd=tcp::8022-:22 -device virtio-net-device,netdev=net0

启动后尝试pkg安装软件

root登录后,发现系统里pkg都没有,需要上网下载安装,但是默认的地址,反正我这里是报错的。

尝试用ports安装pkg

下载ports

 fetch https://download.freebsd.org/snapshots/riscv/riscv64/14.1-PRERELEASE/ports.txz

解压ports

tar -xzvf ports.txz

当然如果解压目录没有到/usr/ports,可以手工挪一下位置。

编译安装pkg

root@freebsd:/usr/ports # cd ports-mgmt/pkg
root@freebsd:/usr/ports/ports-mgmt/pkg # make install clean

速度较慢,大约几个小时后,终于编译安装好了。但是pkg update还是报错:

Unable to update repository FreeBSD
Error updating repositories!
从网上查了下,发现目前大约是没有现成的pkg包,如果安装的话,就需要自己ports编译安装,或者交叉编译安装。

附录

qemu的拓扑图

Tap分流网络


分流网络后端使用主机中的分流网络设备。它提供了非常好的性能,可以配置为创建几乎任何类型的网络拓扑。不幸的是,它需要在主机中配置该网络拓扑,这往往因您使用的操作系统而异。一般来说,它还要求您具有root权限。

-netdev tap,id=mynet0

 怪不得当时普通用户配置tap的时候报错。

FreeBSD pkg 镜像配置

# To disable this repository, instead of modifying or removing this file,
# create a /usr/local/etc/pkg/repos/FreeBSD.conf file:
#
#   mkdir -p /usr/local/etc/pkg/repos
#   echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf
可惜现在没有riscv的镜像,别说镜像,我连主服务器上也没找到(主服务器直接给我解析到镜像了)

关于FreeBSD riscv qemu映像

riscv qemu映像放置在snapshot目录,这个目录国内大部分镜像站点都没有,或者即使有,里面也没有放映像文件。 所以只能从官方的几个站点找,下载速度慢。

FreeBSD pkg和 download网址

FreeBSD pkg网址:http://pkg.freebsd.org/

但是这个网址会自动解析到镜像:pkg0.kwc.FreeBSD.org 

这个pkg站里没有riscv的pkg 包

安装盘download网址:download.FreeBSD.org 

这个网址也是自动解析到日本了。

这个网址里有iso等FreeBSD的安装镜像,有 riscv的安装盘。

中科大镜像:https://mirrors.ustc.edu.cn/freebsd/releases/

 163镜像:https://mirrors.163.com/freebsd/

FreeBSD riscv pkg临时站:http://beefy7.nyi.freebsd.org/

 这个站连不上,不知道是不是废弃了。

 FreeBSD riscv支持相关文档

riscv - FreeBSD Wiki  QEMU网络配置:Documentation/Networking - QEMU

调试

执行kldload if_tuntap时报错:


kldload: can't load if_tuntap: module already loaded or in kernel

文心一言说:kldload: can't load if_tuntap: module already loaded or in kernel 这个错误表明 if_tuntap 模块已经加载到内核中了,或者它本身就是内核的一部分(也就是说,它是静态编译进内核的,而不是作为一个可加载模块)。 

qemu启动后默认路由是10.0.2.2 

Destination        Gateway            Flags     Netif Expire
default            10.0.2.2           UGS      vtnet0

虚拟机自己的ip是10.0.2.15
给bridge0 配置上10.0.2.2 ip ,竟然能ping通,能解析dns,但是无法上网。

能ping通10.0.2.2 但是无法ping通外网。

后来才明白,默认就是无法ping通外网,其实这时候网络已经通了。

为了qemu能上网,尝试-netdev tap,ifname=tap0

qemu-system-riscv64 -machine virt -m 2048M -smp 2 -nographic -bios /usr/local/share/opensbi/lp64/generic/firmware/fw_jump.elf -kernel /usr/local/share/u-boot/u-boot-qemu-riscv64/u-boot.bin -drive file=FreeBSD-14.0-RELEASE-riscv-riscv64.raw,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -netdev tap,ifname=tap0,script=no,id=net0 -device virtio-net-device,netdev=net0

但是报错:qemu-system-riscv64: -netdev tap,ifname=tap0,script=no,id=net0: could not open /dev/tap0: Permission denied


先搁置,去看文档,发现前面无法ping通是正常现象。

后来也从手册里看到了,使用tap的话,需要root账户,而我们使用的不是root账户,怪不得会报错Permission denied 。不习惯用root账户启动,所以放弃tap组网,还是使用user用户组网。

pkg update报错

Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/FreeBSD:14:riscv64/quarterly, please wait...
pkg: Error fetching http://pkg.FreeBSD.org/FreeBSD:14:riscv64/quarterly/Latest/pkg.txz: Not Found
A pre-built version of pkg could not be found for your system.
Consider changing PACKAGESITE or installing it from ports: 'ports-mgmt/pkg'.
直接去http://pkg.freebsd.org/

发现被重定向到日本的镜像了,而且该服务器里没有riscv64的相关软件(没有这个目录FreeBSD:14:riscv64),我晕。而且我找不到有riscv包的站.....

下载映像的网址这里有:download.FreeBSD.org

默认也是跑到日本镜像了,不过这里有snapshots/  ,也就是有riscv的版本。重新下载15的zfs版本试试:https://download.freebsd.org/snapshots/VM-IMAGES/15.0-CURRENT/riscv64/Latest/FreeBSD-15.0-CURRENT-riscv-riscv64-zfs.raw.xz

希望这个15版本里有pkg的地址。 15版本估计是zfs的缘故,无法成功启动。暂时放弃15版本。

尝试下载ports

fetch https://download.freebsd.org/snapshots/riscv/riscv64/14.1-PRERELEASE/ports.txz

解压 tar -xzvf ports.txz 

尝试用ports安装pkg

cd /usr/ports/ports-mgmt/pkg 

make install clean

ports编译安装pkg很慢

 riscv就是很慢的啦!

怪不得大家都会用交叉编译.....明天就学

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/671949.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

印度人Torque Minimum 方式的改进

1 局限性分析 印度人Torque Minimum 复现 上一篇文章分析了印度人那篇Torque Minimum文章的方法&#xff0c;他的方法存在一些局限性&#xff1b; 1&#xff1a;第一个就是6次转矩脉动的抑制&#xff0c;导致了较大的电流谐波畸变率&#xff1b; 2&#xff1a;第二个就是6次…

【C语言】整数,浮点数数据在内存中的存储

Tiny Spark get dazzling some day. 目录 1. 整数在内存中的存储1.1 原码、反码、补码1.1 大小端存储1.2.1 字节序分类1.2.2 判断字节序 2. 浮点数在内存中的存储2.1 浮点数的存储形式2.2 浮点数的 “ 存 ”2.2.1 S2.2.2 E2.2.3 F 2.3 浮点数的 “ 取 ”2.3.1 S2.3.2 E、F 3. 浮…

爱普生S2D13V52快速实现车载显示屏高分辨率显示系统

随着时代的发展&#xff0c;汽车驾驶位前中央的显示屏承担的功能也越来越多&#xff0c;从一开始仅仅是显示仪表盘的信息&#xff0c;再到作为显示屏辅助倒车&#xff0c;再到如今和一块平板一样可公认娱乐&#xff0c;显示屏的大小有些时候成为了一辆车够不够好的体现。随着汽…

【前端】HTML基础(3)

文章目录 前言一、HTML基础1、表格标签1.1 基本使用1.2 合并单元格 2、列表标签2.1 无序列表2.2 有序列表2.3 自定义列表 3、 表单标签2.1 form标签2.2 input标签2.3 label标签2.4 select标签2.5 textarea标签 4、无语义标签5、HTML特殊字符 前言 这篇博客仅仅是对HTML的基本结…

Apache POI入门学习

Apache POI入门学习 官网地址 excel中使用到的类读取excel表格内容表格内容maven依赖方式一测试结果 方式二测试结果 向excel中写入数据方式一方式二方式三测试结果 从 Excel 工作表中的公式单元格读取数据测试结果 Excel 工作表中写入公式单元格从受密码保护的Excel中读取数据…

2024年03月 Scratch 图形化(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共18题,共50分) 第1题 运行程序后,角色一定不会说出的数字是?( ) A:2 B:4 C:6 D:8 答案:A 程序中随机数的取值最小为 2,最大为 20 ,那么随机数加上 2 之后的结果的最小值为 4 ,最大值为 22 。所…

查看微信小程序主包大小

前言 略 查看微信小程序主包大小 在微信开发者工具右上角找到“详情->基本信息” 查看微信小程序主包构成 通过微信开发者工具中的“代码依赖分析”工具查看

第十三章 计算机网络

这里写目录标题 1.网络设备2.协议簇2.1电子邮件(传输层)2.2地址解析(网际层)2.3DHCP(动态主动配置协议)2.4URL(统一资源定位器)2.5IP地址和子网掩码 1.网络设备 物理层&#xff1a;中继器&#xff0c;集线器(多路中继器) 数据链路层&#xff1a;网桥&#xff0c;交换机(多端口…

Java常用5大集合类详解(实战)

文章目录 1、Collection1.1 iterator 迭代器 2、List 有序集合2.1 ArrayList ⭐2.2 LinkedList2.3 Queue 3、Set 无序集合3.1 HashSet ⭐3.2 TreeSet3.3 LinkedHashSet 4、Map 键值集合4.1 HashMap ⭐4.2 TreeMap / LinkedHashMap 5、工具类5.1 Collections5.2 Arrays 【拓展】…

多组间比较散点图+误差棒(自备)

目录 数据 计算四分位值 作图 数据 rm(list ls()) library(ggplot2) library(dplyr) library(ggpubr) library(reshape2) library(tidyverse)data <- iris##鸢尾花数据集 dat <- data[,c(5,1)]#单个数据进行分析 计算四分位值 #根据分组计算四分位及中位数 dat1 …

SegFix:预测边界和预测方向来修正边界

论文标题&#xff1a;SegFix: Model-Agnostic Boundary Refinement for Segmentation 论文地址&#xff1a;https://arxiv.org/pdf/2007.04269.pdf 代码地址&#xff1a;https://github.com/openseg-group/openseg.pytorch 两种loss监督 八种方向变回归问题为分类问题 代码地…

GitOps介绍

基础设施即代码 IaC 在理解 GitOps 之前&#xff0c;需要先理解什么是基础设施即代码。 基础设施即代码&#xff08;Infrastructure as Code&#xff0c;简称IaC&#xff09;是一种软件工程实践&#xff0c;它将基础设施的管理和配置过程像管理代码一样进行版本控制、自动化和…