pip install ryu,但是需要python3.8版本,只能再安装一个,在本机上想安装多个版本的python并设置默认版本,建立一个软连接:sudo ln -sf /usr/bin/python3.8 /usr/bin/python3。
正常来说应该没什么问题,但是千万别轻易sudo unlink /usr/bin/python3。(本意是想让这个新装的指令改成python38,更好区分使用……)
本地的python感觉是炸了,主要问题就是apt_pkg包找不到:
larpsill4@larpsill4-VirtualBox:~$ ryu-manager
Traceback (most recent call last):
File "/usr/lib/command-not-found", line 28, in <module>
from CommandNotFound import CommandNotFound
File "/usr/lib/python3/dist-packages/CommandNotFound/CommandNotFound.py", line 19, in <module>
from CommandNotFound.db.db import SqliteDatabase
File "/usr/lib/python3/dist-packages/CommandNotFound/db/db.py", line 5, in <module>
import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
将python版本改为默认的3.10还是不行:
larpsill4@larpsill4-VirtualBox:~$ sudo update-alternatives --config python
有 2 个候选项可用于替换 python (提供 /usr/bin/python)。
选择 路径 优先级 状态
------------------------------------------------------------
0 /usr/bin/python3.10 2 自动模式
1 /usr/bin/python3.10 2 手动模式
* 2 /usr/bin/python3.8 1 手动模式
要维持当前值[*]请按<回车键>,或者键入选择的编号:0
update-alternatives: 使用 /usr/bin/python3.10 来在自动模式中提供 /usr/bin/python (python)
larpsill4@larpsill4-VirtualBox:~$ ryu-manager
Traceback (most recent call last):
File "/usr/lib/command-not-found", line 28, in <module>
from CommandNotFound import CommandNotFound
File "/usr/lib/python3/dist-packages/CommandNotFound/CommandNotFound.py", line 19, in <module>
from CommandNotFound.db.db import SqliteDatabase
File "/usr/lib/python3/dist-packages/CommandNotFound/db/db.py", line 5, in <module>
import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
一度觉得就是python的问题,OK,但是conda里面的python跟主机的是没有关系的,所以即使主机的炸了,conda里面的也不应该炸! 但是conda里也是apt_pkg包找不到。
吃完饭,重新启动虚拟机,按照解决安装Python版本出现No module named 'apt_pkg'问题 - 知乎再安装apt_pkg包,这次运行 ryu-manager 终于不是apt_pkg包的问题了,显示:
$ ryu-manager
Traceback (most recent call last):
File "/home/larpsill4/.local/bin/ryu-manager", line 5, in <module>
from ryu.cmd.manager import main
File "/home/larpsill4/.local/lib/python3.8/site-packages/ryu/cmd/manager.py", line 33, in <module>
from ryu.app import wsgi
File "/home/larpsill4/.local/lib/python3.8/site-packages/ryu/app/wsgi.py", line 109, in <module>
class _AlreadyHandledResponse(Response):
File "/home/larpsill4/.local/lib/python3.8/site-packages/ryu/app/wsgi.py", line 111, in _AlreadyHandledResponse
from eventlet.wsgi import ALREADY_HANDLED
ImportError: cannot import name 'ALREADY_HANDLED' from 'eventlet.wsgi' (/home/larpsill4/.local/lib/python3.8/site-packages/eventlet/wsgi.py)
这是eventlet库版本的问题了,
pip install eventlet==0.30.2
出现以下ERROR,根据提示安装ovs。
pip install ovs==2.6.0
再次运行 ryu-manager :
$ ryu-manager
Traceback (most recent call last):
File "/home/larpsill4/.local/bin/ryu-manager", line 5, in <module>
from ryu.cmd.manager import main
File "/home/larpsill4/.local/lib/python3.8/site-packages/ryu/cmd/manager.py", line 22, in <module>
from ryu.lib import hub
File "/home/larpsill4/.local/lib/python3.8/site-packages/ryu/lib/hub.py", line 30, in <module>
import eventlet
ModuleNotFoundError: No module named 'eventlet'
查询ryu和eventlet的位置,好像不对应。重新pip install ryu,再次运行 ryu-manager :
(netclass2) larpsill4@larpsill4-VirtualBox:~$ which ryu-manager
/home/larpsill4/miniconda3/envs/netclass2/bin/ryu-manager
(netclass2) larpsill4@larpsill4-VirtualBox:~$ ryu-manager
bash: /home/larpsill4/.local/bin/ryu-manager: 没有那个文件或目录
很神奇!! 直接整个地址当命令好了:
(netclass2) larpsill4@larpsill4-VirtualBox:~$ /home/larpsill4/miniconda3/envs/netclass2/bin/ryu-manager
loading app ryu.controller.ofp_handler
instantiating app ryu.controller.ofp_handler of OFPHandler
hub: uncaught exception: Traceback (most recent call last):
File "/home/larpsill4/miniconda3/envs/netclass2/lib/python3.8/site-packages/ryu/lib/hub.py", line 60, in _launch
return func(*args, **kwargs)
File "/home/larpsill4/miniconda3/envs/netclass2/lib/python3.8/site-packages/ryu/controller/controller.py", line 152, in __call__
self.server_loop(self.ofp_tcp_listen_port,
File "/home/larpsill4/miniconda3/envs/netclass2/lib/python3.8/site-packages/ryu/controller/controller.py", line 200, in server_loop
server = StreamServer((CONF.ofp_listen_host,
File "/home/larpsill4/miniconda3/envs/netclass2/lib/python3.8/site-packages/ryu/lib/hub.py", line 127, in __init__
self.server = eventlet.listen(listen_info)
File "/home/larpsill4/miniconda3/envs/netclass2/lib/python3.8/site-packages/eventlet/convenience.py", line 78, in listen
sock.bind(addr)
OSError: [Errno 98] Address already in use
最后是端口问题,查端口,杀死占用的进程。参考:
ryu-manager启动报错OSError: [Errno 98] Address already in use_ryumodmanager 无法启动-CSDN博客
安装ryu后,为什么出现下列[Errno 98] Address already in use问题?-CSDN博客
从早八到一点半,终于成功!
(netclass2) larpsill4@larpsill4-VirtualBox:~$ sudo lsof -i :6653
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ovs-testc 1008 root 3u IPv4 20364 0t0 TCP *:6653 (LISTEN)
(netclass2) larpsill4@larpsill4-VirtualBox:~$ kill -9 1008
bash: kill: (1008) - 不允许的操作
(netclass2) larpsill4@larpsill4-VirtualBox:~$ sudo kill -9 1008
(netclass2) larpsill4@larpsill4-VirtualBox:~$ /home/larpsill4/miniconda3/envs/netclass2/bin/ryu-manager
loading app ryu.controller.ofp_handler
instantiating app ryu.controller.ofp_handler of OFPHandler
总结:
- conda其实很好用,主机的python炸了也无所谓,建一个conda环境从0开始就好了(毕竟控制变量,不用担心之前操作的可能出错)。
- Linux的默认不要随便更改,网上多看点教程再动手,诸如 sudo unlink /usr/bin/python3 这种删除指令谨慎使用;别太相信GPT,重要的可能危险的指令先网上再搜索确认一下。
- 出现报错时,摘取报错的关键语句,直接搜索,有很大可能有教程。