跳转至

2023

Gem5

简介

  • GEM5是一款模块化的离散事件驱动全系统模拟器,由C++与python编写
  • 它结合了M5(多处理器模拟器)和GEMS(存储层次模拟器)中最优秀的部分,是一款高度可配置、集成多种ISA和多种CPU模型的体系结构模拟器。
  • M5是由Michigan大学开发的一款开源的多处理机模拟器,受到了业内的广泛关注,很多高水平论文都采用M5作为研究工具。
  • 另一方面,Wisconsin推出的GEMS能够对储存层次进行详细而灵活的模拟,包括对多种不同的cache一致性协议和互联模型的支持。
  • 目前的GEM5是M5和GEMS的一个紧耦合版本。
  • GEM5已经能够支持多种商用ISA,包括X86、ARM、ALPHA、MIPS、Power、SPARC等,并且能够在X86、ARM、ALPHA上加载操作系统。

可选配置(灵活性)

  • 灵活性是指gem5提供了多种CPU模型、系统模型以及存储器模型。
  • CPU模型:Atomic、Timing、In-order、O3(Out of Order)
    • AtomicSimple是最简单规模的模型,一个cycle完成一条指令的执行,memory 模型比较理想化,访存操作为原子性操作。适用于快速功能模拟。
    • TimingSimple模拟器也是无流水线的模拟,但是使用了存储器访问时序模型,用以统计存储器访问延迟。
    • In-Order模型是GEM5模拟的新特性,强调指令时序与仿真精度,流水级为默认五级流水:取值、译码、执行、访存、写回。并且模拟了cache部件、执行部件、分支预测部件等。
    • O3模拟器是流水级模拟,O3模拟器模拟了乱序执行和超标量执行的指令间依赖,以及运行在多CPU上的并发执行的多线程。
    • 默认7级流水:取值、译码、重命名、发射、执行、写回、提交。
    • 模拟了物理寄存器文件、IO、LSQ、ROB功能部件池等。
    • 主要参数为流水管道间延迟、硬件线程数、IQ/LSQ/ROB项数、FU延迟、物理寄存器重命名、分支预测、访存依赖预测等。
  • 系统模型:SE(System-call emulation)、FS(Full System)。
  • 存储模型:Classic、Ruby。
    • M5的Classic mode存储器是最简单的模型,它提供了简洁快速的可配置性。
    • GEMS的Ruby模型注重于精确度并且支持不同的cache一致性协议。
    • Ruby存储模型支持庞大阵列的互联拓扑,包括两个不同的网络模型:Simple网络与Garnet网络。
      • Simple网络对链路、路由延迟与链路带宽进行建模,但并不建模路由资源竞争与流控。
      • Garnet网络详细建模路由微架构,包括所有相关的资源竞争与流控时序。

基本模式

  • System Call Emulation (SE) Mode
  • In this mode, one only needs to specify the binary file to be simulated. This binary file can be statically/dynamically linked.
  • full-system mode
  • This mode simulates a complete system which provides an operating system based simulation environment.
  • very slow, rendering it impractical for deployment in real-world applications.
time ./build/ARM/gem5.fast configs/example/se.py --cmd=/home/shaojiemike/test/llvmVSgem5/MV/MV_gem5 -n 32 --cpu-type=O3CPU --l1d_size=64kB --l1i_size=16kB --caches
  • L1d cache是每个核单独64KB(原因见后图)。但其实默认cache结构是L2共享的

安装

  • 在源目录下运行scons build/<config>/<binary> 建立模拟器。
  • <config> gem5的配置文件,如ARMX86
  • <binary> 模拟器的类型,有如下
    • gem5.debug 有关闭了优化,使gdb一类的工具更易于调试;
    • gem5.opt有打开优化,但保留了调试输出和断言;
    • gem5.fast去除了调试工具;
    • gem5.prof用于与gprof共同使用
scons build/ARM/gem5.fast --debug=presub --verbose -j 32

输入参数

gem5 安装的默认配置

可选选项在./build/ARM/gem5.fast configs/example/se.py -h或者 configs/common/Options.py 中查看

常规的配置:

  • 多级cache
  • CPU
  • 频率,核数
  • 指令发射宽度
    • commitWidth, decodeWidth, dispatchWidth, fetchWidth, issueWidth,
    • renameWidth, squashWidth, wbWidth ,
  • 端口模型的部件类型以及个数
  • 内存

cache設置

  • 只指定大小是沒用的,需要在L1cache 前加上 “--caches”,在l2cache前加上 “--l2cache“。命令結果類似
  • 默认cache是没有开硬件预取HWP的,类型通过--list-hwp-types查看。可以指定L1L2cache的HWP类型,如--l1d-hwp-type=TaggedPrefetcher
build/X86/gem5.opt configs/example/se.py 
  --caches --l1d_size=32kB --l1i_size=32kB 
  --l2cache --l2_size=256kB 
  --l3_size=8192kB  # l3 在 se里是不生效的
  -c tests/test-progs/hello/bin/x86/linux/hello 

# 建议将L3大小并入L2来模拟cycle的下限
build/X86/gem5.opt configs/example/se.py 
  --caches --l1d_size=32kB --l1i_size=32kB 
  --l2cache --l2_size=256kB+8192kB
  -c tests/test-progs/hello/bin/x86/linux/hello

进阶配置:

  1. 多核模拟时,配置独占cache
  2. 增加共享L3
  3. 添加共享的L3cache,并将L2cache改为独立的

输出文件

运行完SE模式,默认会在指令路径下生成m5out文件夹,其中各文件大致含义如下:

  • config.ini或者config.json 运行指令的系统参数
  • Contains a list of every SimObject created for the simulation and the values for its parameters.
  • json格式的文件能比较好的理清config的重要设置
  • [system.cpu] 有CPU的具体设置
  • [system.mem_ctrls.dram] 有DRAM读取数据的具体设置
  • [system.membus] BUS的相关设置
  • stats.txt 模拟结果数据(具体的周期数等)
  • A text representation of all of the gem5 statistics registered for the simulation.
  • system.clk_domain.clock 1000 # Clock period in ticks (Tick)
  • system.cpu_clk_domain.clock 500 # Clock period in ticks (Tick)
  • fs/proc/lscpu 模拟系统配置(类似lscpu)
  • config.dot.* 模拟的系统结构
  • config.dot 是以文字展示
  • config.dot.pdfconfig.dot.svg 都是以图片表示aliyuncs1
  • config.dot.svg 能展示每个部件的细节参数 aliyuncs2

运行

参考博客, 如果se.py無法滿足要求,可以自己編寫脚本

CPU参数解释

各阶段发射宽度

commitWidth, decodeWidth, dispatchWidth, fetchWidth, issueWidth, renameWidth, squashWidth, wbWidth

下面是行数占比最大的几个部分

branchPred

  • BTBEntries

decoder

fuPool

  • fuction pool 类似乱序执行的端口模型,ARM下的O3模拟的fuPool如下 ARM-O3-fuPool

gem5 模拟器误差来源分析

运行真实周期数

  • 使用perf stat test.exe, 可参考本博客perf文章

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://blog.csdn.net/ivy_reny/category_6666068.html

https://blog.csdn.net/wyj7260/category_1301132.html

Synology terminal

配置开机启动项

编写脚本/var/services/homes/shaojiemike/wgReboot.sh

#!/bin/bash
ip ro add default via 222.195.90.254 dev eth0 table eth0-table
ip ro a 114.214.233.0/24 via 222.195.90.254 dev eth0  src 222.195.90.2 table main
wg-quick up wg1
ip ro d default via 222.195.90.254 dev eth0  src 222.195.90.2 table main
  • 执行权限chmod +x
  • 群晖WebUI -> 控制面板 -> 任务计划 -> 新增 -> 触发的任务
  • 选择Root、开机事件
  • bash /var/services/homes/shaojiemike/wgReboot.sh

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

Reboot Task

最简单/etc/rc.lo­cal

默认是不开启的,文件/etc/rc.lo­cal默认也不存在

开启/etc/rc.lo­cal功能

  • ubuntu18.04不再使用initd管理系统,改用systemd
  • systemd有rc-local的配置文件,只需链接到/etc/systemd/system目录下启动即可
  • ln -fs /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service

使用/etc/rc.lo­cal功能

touch /etc/rc.local
chmod 755 /etc/rc.local
vim /etc/rc.local
    eg. #!/bin/bash  echo "test rc " > /var/test.log

crontab @reboot

crontab -e
@reboot /home/user/test.sh

initd 启动管理系统

  • init.d目录包含许多系统各种服务的启动和停止脚本。它控制着所有从acpid到x11-common的各种事务。
  • 注意:ubuntu18.04不再使用initd管理系统,改用systemd

编写脚本

  • /etc/init.d目录下建立文件test
  • 按照README编写脚本
  • 赋予执行权限sudo chmod +x /etc/init.d/test

设置脚本启动

方法一:使用update-rc.d 命令将脚本放到启动脚本中去(debian中可以使用更新的insserv):

$ cd /etc/init.d
$ sudo update-rc.d test defaults 95

注:其中数字95是脚本启动的顺序号,按照自己的需要相应修改即可。在你有多个启动脚本,而它们之间又有先后启动的依赖关系时你就知道这个数字的具体作用了。更多说明建议看man update-rc.d。

方法二:手动在rc*.d中建立软连接

$ ls -s test ../rc5.d/S95test

rc*.d,*代表启动级别,在不同启动级别启动, K开头的脚本文件代表运行级别加载时需要关闭的, S开头的代表相应级别启动时需要执行, 数字代表顺序

卸载启动脚本的方法:

$ cd /etc/init.d
$ sudo update-rc.d -f test remove

手动调用脚本

/etc/init.d/test start
/etc/init.d/test stop
/etc/init.d/test restart

systemd 服务管理系统

使用sudo systemctl enable xxx

systemctl is-enabled servicename.service #查询服务是否开机启动
systemctl enable *.service #开机运行服务
systemctl disable *.service #取消开机运行
systemctl start *.service #启动服务
systemctl stop *.service #停止服务
systemctl restart *.service #重启服务
systemctl reload *.service #重新加载服务配置文件
systemctl status *.service #查询服务运行状态
systemctl --failed #显示启动失败的服务

systemctl 开机启动原理

  • Systemd 默认从目录/etc/systemd/system/读取配置文件。
  • 但是,里面存放的大部分文件都是符号链接,指向目录
  • /usr/lib/systemd/system/,真正的配置文件存放在那个目录。

systemctl enable命令用于在上面两个目录之间,建立符号链接关系。

> $ sudo systemctl enable [email protected]
# 等同于
$ sudo ln -s '/usr/lib/systemd/system/[email protected]' '/etc/systemd/system/multi-user.target.wants/[email protected]'
> 
* 如果配置文件里面设置了开机启动,systemctl enable命令相当于激活开机启动。 * 与之对应的,systemctl disable命令用于在两个目录之间,撤销符号链接关系,相当于撤销开机启动。
> $ sudo systemctl disable [email protected]
> 
* 配置文件的后缀名,就是该 Unit 的种类,比如sshd.socket。 * 如果省略,Systemd 默认后缀名为.service,所以sshd会被理解成sshd.service

把程序设置systemctl服务,并开机启动

进入目录/usr/lib/systemd/system,修改webhook.service

[Unit]
Description=Webhook receiver for GitHub

[Service]
Type=simple
ExecStart=/usr/local/bin/webhook

[Install]
WantedBy=multi-user.target
这里有几个模块: * [Unit] 区块:启动顺序与依赖关系。 * [Service] 区块:启动行为,如何启动,启动类型。 * [Install] 区块,定义如何安装这个配置文件,即怎样做到开机启动。

systemctl start nexus.service  #启动服务
systemctl enable nexus.service #设置开机启动
Loaded: loaded (/etc/systemd/system/webhook.service; enabled;这个enabled就是开机启动的意思

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://neucrack.com/p/91

Codeforces & Topcoder

简介

  • codeforces
  • Codeforces 是一家为计算机编程爱好者提供的在线评测系统
  • 该网站由俄罗斯 ITMO 大学(圣彼得堡国家信息技术、机械学与光学研究型大学)的一个团体创立并负责运营。
  • 在编程挑战赛中,选手有 2 个小时的时间去解决 5 道题,通过得分排名,选手可以看到实时的排名(Standing),也可以选择查看好友的排名,还可以看到某题有多少人通过等信息。
  • 在 cf,所有的用户根据在以往比赛中的表现被赋予一个 Rating 并冠以不同的头衔,名字也会以不同的颜色显示,比如 Expert 是蓝色,Master 是黄色。
  • 题目兼容并蓄,什么难度等级的题目都可以找到。
    • 并且题目很有意思,往往思维陷阱比较多,也就是思维题比较多。
    • 对于数据结构以及算法的考察相对弱一些,更多的时候往往是告诉你用什么算法你也不知道怎么做。
  • topcoder
  • TopCoder成立于2001年,它的客户包括Google、MS、YAHOO、Intel、 Motorola和SUN等世界上顶级的IT公司。每年TopCoder都会举办若干个编程竞赛和锦标赛,其总奖金金额高达几十万美元。她是你进入世界顶级的IT企业的捷径,TopCoder排名(程序设计,开发,算法)靠前的选手基本都成了知名公司追逐的对象。
  • 积分:tc的每个用户(handle)都有自己的积分,从0-3000+不等。成绩越好,分数越高 。
  • 积分与颜色的对应为:白色——未参赛(unrated);灰色——0899;绿色——9001199;蓝色——12001499;黄色——15002199;红色——2200+。另外排名最高的几个人在TC客户端中会变成红色靶子图标。现在,全世界有300人达到红色等级,日本有26人。3000 分以上者被称为target,全世界有18人,日本有3人,分别是:iwi(秋叶拓哉)、wata (岩田阳一)和lvrically;

topcoder vs codeforces

Codeforces: Another good platform with nice contests where you will get to learn new things that will improve your understanding of concepts. It's ratings don't matter to recruiters but the things you'll learn will help you during interviews and company's coding tests.

TOPCODER: This caters to every aspect of software develpment. They have both designing and development contest. Major companies provide Topcoder community to experment with their nw products or APIs. But if you want to mention it in your CV, your ratings should be above 1400 to impress a recruiter.

for average is CODEFORCES, for expert TOPCODER

竞赛说明

codeforces

  • 比赛举办频率
  • 第一种是Codeforces Rounds(常规比赛) 大约一周一两次,时长2小时。常规赛分为三个赛区:Div3、Div2和Div1。题目难度Div3 < Div2 < Div1。
  • 第二种是Educational Contests(教育性比赛) 大约每个月二到三次,时长2个小时。常规赛分为两个赛区:Div2和Div1。题目难度Div2 < Div1。
  • 比赛一般是两个小时的赛程,一共六道题目。(20分钟一题)
  • 新手能做出3道,rating就不会跌。
  • div 表示题目难度,数值越小难度越高,
  • div 1 要求参赛者的 Rating 大于 1900 。div2 平均难度在 Rating 1500.
  • Hack:当你通过某题目,可以查看同房间内其他通过该题的参赛者的代码。
  • 由于codeforces在比赛的时候只会测试一小部分数据,真正的测试集会放到赛后进行测试。所以在比赛中测试通过的代码,只是通过了小数据验证,很有可能有隐藏的问题没被发现。
  • 如果发现了bug,可以构造一份数据hack掉他的提交。
  • hack 成功,你获得 100 分奖励,别人的提交会被打回;hack 失败,减 50 分作为惩罚。
  • 一般后面题不会做的时候,又有时间的时候就去Hack

topcoder

  • 安装程序TopCoder Arena(竞技场,古罗马的斗兽场也是这个词),
  • TopCoder Arena是一个纯Java应用程序,它既是Applet也是应用程序,所以需要安装Java运行环境。
  • 相关软件的网址ContestAppletProd.jnlp(Java Web Start 方式安装)
  • 规则
  • 75分钟做完3道难度递增的题。(25 mins per problem)
  • 比赛分为两个division:Div I和Div II。
    • 积分<1200或者unrated(即注册但还没参加过比赛的)参加Div II,>=1200的参加Div I。
    • Div I的题要比Div II难许多。 一般DivII的最后一题和Div I的第一或第二题是一样的。
    • 无论是Div I或Div II。三道题目的Score一般为250, 500和1000左右,视每次的难度略有浮动。
  • 个人积分 (rating)的增减是根据你和别人在比赛中的score以及你们原来的rating决定的。tc 的提交结合了ICPC和IOI的特点,即只能交一次,必须过所有数据并且得分与用时相关。tc每周有一次Single Round Match(SRM),每年两次大的比赛TCOpen(有$)。
    • 评分是根据你完成的时间和所完成问题的难易决定的。
  • 比赛可分为三部分:Coding Phase, Challenge Phase和System Test Phase
    • 发送代码后,你就进入Challenge Phase了,Challenge Phase部分是让参赛者浏览分配在同一房间的其他参赛者的源代码,然后设法找出其中错误,并提出一个测试参数使其不能通过测试。如果某参赛者的程序不能通过别人或系统的测试,则该参赛者在此题目的得分将为0。
    • System Test Phase: 挑战结束后,TopCoder会测试每个参赛者的代码,如果你的代码产生了不正确的输出、异常终止和其它错误,你就不能得分。
  • 如果是多个回合比赛,每个小组中得分最高的三位参赛者将进入下一轮的比赛。他们将解决一些新的问题,最后总得分在前三名的选手将会得到现金奖励。
  • 参赛具体操作, 图文

other platform

codechef

Actual experience

codeforces

  1. 22:35PM - 01:05 AM

topcoder

  1. Contest time infomation is here.
  2. SRM 849 on September 28, 2023 at 11:00 AM - 1:00 PM EST(UTC-4). (00:00 AM - 2:00 AM UTC+8)
  3. hard to read due to the tiny font.
  4. maybe copy the problem to outside

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://blog.csdn.net/qiuzhenguang/article/details/5552122

https://zhuanlan.zhihu.com/p/540098105

cmake

导言

ipcc初赛的项目代码有些混乱,只是简单分类。想好好学习一下cmake和make。规范项目结构,优化编译运行流程,提高效率。

Docker On Win10

简介

  • WSL 2 是对WSL基础体系结构的一次重大改造,它使用虚拟化技术和 Linux 内核来实现其新功能。
  • docker是基于linux内核运行
  • WSL 2 加入了linux内核为docker在windows上运行铺平了道路

系统要求

开启虚拟化 + Hyper-V

  • BIOS开启虚拟化
  • 查看是否开启:任务管理器 -> 性能 -> CPU 虚拟化:开启
  • Control Panel(控制面板) -> Programs and Features(程序和功能) -> Turn Windows Features on or off(启用或关闭Widnows功能)勾选三项
  • Windows Hypervisor Platform(Windows虚拟机监控程序平台)
  • Hyper-V
  • 虚拟机平台
  • 管理员Powershell运行 bcdedit /set hypervisorlaunchtype auto
  • 重启

WSL 2

参考教程安装 WSL旧版 WSL 的手动安装步骤

# 查看当前版本
 wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         1

 wsl --set-version Ubuntu-20.04 2
正在进行转换,这可能需要几分钟时间。
操作成功完成。

E:/PowerShell via  v14.17.3 via 🐍 v3.9.7 took 59s
 wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2

docker on Windows

注意:用命令行运行来修改默认安装路径(重命名install.exe),参考教程

.\Docker.exe install --installation-dir="E:\commonSoftware\Docker"
安装完之后运行设置 * 开启开机启动 * 在Resources里修改image保存路径

使用问题

1: read-only file system

Error response from daemon: container df6ee73697883e8e09edd65404e1fcc19a2b4bfb49212c754a8b3ef9741d7bda: driver "overlay2" failed to remove root filesystem: unlinkat /var/lib/docker/overlay2/475c350b02589ce2cb5ef30f0619ed3aeaba409c56d87191b8cbbd00ef618fe3: read-only file system
需要管理员运行docker

C盘没空间

WSL还是超级占用C盘

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://blog.csdn.net/Antarctic_Bear/article/details/123489609

Linux Auto Run : crontab

导言

定时自动任务

crontab的使用

任务调度

Linux下的任务调度分为两类:系统任务调度和用户任务调度。

Linux系统任务是由 cron (crond) 这个系统服务来控制的,这个系统服务是默认启动的。用户自己设置的计划任务则使用crontab 命令。

crontab 命令

crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
  • -u user:用于设定某个用户的crontab服务;
  • file: file为命令文件名,表示将file作为crontab的任务列表文件并载入crontab;
  • -e:编辑某个用户的crontab文件内容,如不指定用户则表示当前用户;
  • -l:显示某个用户的crontab文件内容,如不指定用户则表示当前用户;
  • -r:从/var/spool/cron目录中删除某个用户的crontab文件。
  • -i:在删除用户的crontab文件时给确认提示。

crontab文件

  • crontab有2种编辑方式:
    • 直接编辑/etc/crontab文件,其中/etc/crontab里的计划任务是系统中的计划任务,
    • 通过crontab –e来编辑用户的计划任务;
      • 每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。
      • 所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
  • crontab中的command尽量使用绝对路径,否则会经常因为路径错误导致任务无法执行。
  • 新创建的cron job不会马上执行,至少要等2分钟才能执行,可从起cron来立即执行。
  • %在crontab文件中表示“换行”,因此假如脚本或命令含有%,需要使用\%来进行转义。

配置文件实例:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/
MAILTO=root # MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户
# * * * * * user-name command to be executed
@reboot /home/user/test.sh #可以实现开机自动运行
@reboot sleep 300 && /home/start.sh # 延时启动

@reboot 表示重启开机的时候运行一次。还有很多类似参数如下:

string             meaning
------          -----------
@reboot      Run once, at startup.
@yearly       Run once a year, "0 0 1 1 *".
@annually    (same as @yearly)
@monthly    Run once a month, "0 0 1 * *".
@weekly     Run once a week, "0 0 * * 0".
@daily        Run once a day, "0 0 * * *".
@midnight   (same as @daily)
@hourly      Run once an hour, "0 * * * *".
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |

*  */1  *  *  *  /etc/init.d/smb restart  # 每一小时重启smb

在以上各个字段中,还可以使用以下特殊字符:

  • *代表所有的取值范围内的数字,如月份字段为*,则表示1到12个月;
  • /代表每一定时间间隔的意思,如分钟字段为*/10,表示每10分钟执行1次。
  • -代表从某个区间范围,是闭区间。如2-5表示2,3,4,5
    • 组合:小时字段中0-23/2表示在0~23点范围内每2个小时执行一次。
  • ,分散的数字(不一定连续),如1,2,3,4,7,9

查看crontab的日志记录和状态

tail -f /var/log/cron观察查看cron运行日志(/var/log/cron.log),但是并未找到相关文件,原因是ubuntu默认没有开cron日志,执行命令:

sudo vim /etc/rsyslog.d/50-default.conf
找到cron.log相关行,将前面注释符#去掉,保存退出,重启rsyslog:
sudo  service rsyslog  restart
执行less -10 /var/log/cron.log再次查看cron运行日志,log出来了,提示如下信息:
No MTA installed, discarding output
原因是cron把屏幕输出都发送到email了,而当前环境并未安装email server,于是系统报错,解决方面就是不要直接向屏幕输出内容,而是重定向到一个文件。

cd /var/spool/mail/
less shaojiemike
service cron status # ubuntu

实例

夜间利用机器进行批量实验

如果Linux系统有时差,需要加8小时在0、3、6点。

0 0,3,6 * * * cd /home/t00906153/OpenSora/OpenSora_performance_test && git stash save "Stash before script run at $(date +"%Y-%m-%d %H:%M:%S")" && bash test/train_full_opensorav1_1.sh >> /home/t00906153/crontab.log 2>&1 && git stash pop && echo "Executed at $(date)" >> /home/t00906153/crontab.log

crontab on OpenWRT

# 1.编辑好脚本加入cron

crontab -e
* * * * * sh /root/tst.sh

# 2.创建cron初始化脚本 vi /etc/init.d/S60cron,添加下面内容

#!/bin/sh
#start crond
/usr/sbin/crond -c /etc/crontabs

# 修改权限
chmod 755 /etc/init.d/S60cron

# 3.手动启动crond
/etc/init.d/S60cron

# 4.查看crond任务
logread -e cron

# 5.重启crond
killall crond; /etc/init.d/S60cron

# 6.禁用crond日志 修改/etc/init.d/S60cron
/usr/sbin/crond -c /etc/crontabs -L /dev/null

运行push-IP脚本

git-push脚本

其他自动化方法

https://zhuanlan.zhihu.com/p/35402730

https://blog.csdn.net/qq_35440678/article/details/80489102

https://neucrack.com/p/91

开题缘由、总结、反思、吐槽~~

参考文献

https://www.linuxprobe.com/how-to-crontab.html

https://martybugs.net/wireless/openwrt/cron.cgi

Network InterConnect

不同带宽与距离的互连技术

System Area Network(系统域网):主机及外设 Local Area Network(局域网):以太网 Metropolitan Area Network(城域网):WiMax Wide Area Network(广域网):因特网,X.25

没有公网IP: FRP反向代理

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

如果在外地,需要访问单位或者家庭的内网:

用ipv6,通过VPN(wireguard)连接到我寝室的路由器,然后通过路由器上网,所以可以访问校内网络。

台式机不关机,用台式机的wireguard也可以访问。

参考文献

Family Wi-Fi

Wi-Fi

Wi-Fi是一个创建于IEEE 802.11标准的无线局域网技术。基于两套系统的密切相关,也常有人把Wi-Fi当做IEEE 802.11标准的同义术语。

Wi-Fi这个术语被人们普遍误以为是指无线保真(Wireless Fidelity),并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词,Wi-Fi还出现在ITAA的一个论文中。但事实上,Wi-Fi一词没有任何意义,也是没有全写的。

WiFi4/5/6

WIFI6 是802.11ax协议,支持2.4GHz和5GHz,支持更多的技术,更高的调制方式。比如 1. 调制模式方面,WiFi 6 支持 1024-QAM,高于 WiFi 5 的 256-QAM,数据容量更高,意味着更高的数据传输速度; 2. 此外,WiFi 6 加入了新的 OFDMA 技术,支持多个终端同时并行传输,有效提升了效率并降低延时,这也就是其数据吞吐量大幅提升的秘诀。 3. WiFi6通过更优质的Long DFDM Symbol发送机制,将每个信号载波发送时间从WiFi5的3.2μs提升到12.8μs,有效降低丢包率和重传率,使传输更加稳定。 4. WiFi6容量更大:多用户MU-MIMO技术允许电脑讯网时间多终端共享信道,使多台手机/电脑一起同时上网,从此前低效的排队顺序通过方式变成为“齐头并进”的高效方式。

各种网络及速率

无线路由器发展到现在有IEEE802.11b、IEEE802.11g、IEEE802.11a、IEEE802.11n、IEEE802.11ac标准,对应的无线速率分别是11Mbps、54 Mbps、150 Mbps、300Mbps、1Gbps。这里的无线速率指的是无线传输通过的最高速率。

这里拿300Mbps的无线路由器速率来说一下路由器的传输速度,300Mbps无线路由器指的是传输和接收最大能通过的速率,一般看到的只是传输的速度,也就是只能看到一半的速度,也就是150Mbps,这个是理论速率,但是在实际使用过程中由于环境的干扰,会有衰减。所以在实际使用过程中都只剩下110 Mbps左右。

WLAN

WLAN是Wireless Local Area Network的简称,指应用无线通信技术将计算机设备互联起来。

WLAN起步于1997年。当年的6月,第一个无线局域网标准IEEE802. 11正式颁布实施,为无线局域网技术提供了统一标准,但当时的传输速率只有1~2 Mbit/s。随后,IEEE委员会又开始制定新的WLAN标准,分别取名为IEEE802.11a和IEEE802. 11b。IEEE802. llb标准首先于1999年9月正式颁布,其速率为11 Mbit/s。经过改进的IEEE802. 11a标准,在2001年年底才正式颁布,它的传输速率可达到54 Mbit/s,几乎是IEEE802. llb标准的5倍。尽管如此,WLAN的应用并未真正开始,因为整个WLAN应用环境并不成熟。

目前使用最多的是802. 11n(第四代)和802. 11ac(第五代)标准,它们既可以工作在2.4 GHz频段也可以工作在5 GHz频段上,传输速率可达600 Mbit/s(理论值)。但严格来说只有支持802. 11ac的才是真正5G,现来在说支持2.4 G和5G双频的路由器其实很多都是只支持第四代无线标准,也就是802. 11n的双频,而真正支持ac 5G的路由最便宜的都要四五百元甚至上千元。

移动网络

4G与5G的区别

在有线介质上传播数据,想要高速很容易,实验室中,单条光纤最大速度已达到了26Tbps。

无线电磁波传播,才是瓶颈。

3/4/5G的频率

3G的四种标准和频段:CDMA2000、WCDMA、TD-SCDMA、WiMAX,1880MHz-1900MHz和2010MHz-2025MHz。

4G的频率和频段是:1880-1900MHz、2320-2370MHz、2575-2635MHz。

我国的5G初始中频频段,3.3-3.6GHz、4.8-5GHz两个频段。24.75-27.5GHz、37-42.5GHz高频频段正在征集意见。国际上主要使用28GHz进行试验

路由器

MAC地址20-6B-E7-DB-D7-33

WAN口与LAN口

WAN是英文Wide Area Network的首字母所写,即代表广域网;而LAN则是Local Area Network的所写,即本地网(或叫局域网)。WAN口主要用于连接外部网络,而LAN口用来连接家庭内部网络,两者主要会在标识上面有区别,此外大部分路由器的WAN口只有一个,LAN口则有四个或以上。

管理界面

根据路由器背面的提示登陆,可以修改Wi-Fi名称密码、限制设备上下行速率以及黑名单设备。(注意关闭clash代理

DHCP服务器

Dynamic Host Configuration Protocol动态主机配置协议是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。担任DHCP服务器的计算机需要安装TCP/IP协议,并为其设置静态IP地址、子网掩码、默认网关等内容。

采用DHCP方式对上网的用户进行临时的地址分配。也就是你的电脑连上网,DHCP服务器才从地址池里临时分配一个IP地址给你,每次上网分配的IP地址可能会不一样,这跟当时IP地址资源有关。

SSID

Service Set Identifier是指服务集标识。SSID技术可以将一个无线局域网分为几个需要不同身份验证的子网络,每一个子网络都需要独立的身份验证,只有通过身份验证的用户才可以进入相应的子网络,防止未被授权的用户进入本网络。

无线信道

信道,也称作通道或频段。无线信号是以某一频率传送数据的。2.4G频段的工作频率为2.4-2.4835GHz,这83.5MHz频带划分为13个信道,各信道中心频率相差5MHz,向上向下分别扩展11MHz,信道带宽22MHz。中国采用欧洲/ETSI标准,使用1-13信道。

频段带宽

20Mhz和40Mhz的区别,你可以想象成道路的宽度,宽度越宽当然同时能跑的数据越多,也就提高了速度。

20MHz对应的是65M带宽,穿透性相对较好,40MHz对应的是150M带宽,穿透性肯定不如20MHz 所以追求稳定的话就选择20MHz,近距离传输就可以选择40MHZ。

当然,无线网的“道路”是大家共享的,一共就这么宽(802.11 b/g/n的频带是 2.412Ghz ~ 2.472Ghz,一共60Mhz。像802.11a/n在中国可用的频带是5.745Ghz ~ 5.825Ghz,同样也是60Mhz),你占用的道路宽了,跑得数据多了,当然就更容易跟别人撞车,一旦撞车大家就都会慢下来,比你在窄路上走还要慢。

如图,原来挤一挤可以四个人同时用的,如果你用了40Mhz的话就只能两个人同时用了。所以哪个更好的问题和你多大的房子无关,最主要的是你附近有多少个人跟你一起上路的,用NetStumbler这种扫描软件可以很容易看清楚周围频带的占用情况,如果你附近没什么人用,那么恭喜你,用40Mhz来享受高速吧!如果周围“车辆”很多,那么你最好还是找一个车少点的“车道”,老老实实用20Mhz比较好。

NetStumbler

04年停止更新的软件,不支持我笔记本的网卡

Intel WIFI6 ax200 160MHz

11bgn mixed

无线协议: 11b..=网络速度运行在11b网络标准,11g..=网络速度运行在11g网络标准,11n..=网络速度运行在11n网络标准。

如果你不知道你的无线设备是什么级别,802.11b/g/n是最好的选择。如果只使用.11n,旧设备可能存在兼容性问题。当然,速度是支持N的最快方式,但是它必须与特定的设备相结合。

实际的情况是,无线局域网的实际传输速度只能达到产品标称最大传输速度的一半以下;比如802.11b理论最大速度为11M,通过笔者的测试,在无线网络环境较好的情况下,传输100MB的文件需要3分钟左右;而相同的环境,换为支持802.11g的产品,传输100MB的文件就只需要30秒左右。

150M的网络理论下载速率

150M 全写是 150Mbps,注意这里是小b,是位数。所以与MB的兆字节是不一样的,需要除8,加上一点损耗。150Mbps网络有15MB/s就不错了。

怎么判断网络是百兆还是千兆

  1. 通过路由器WAN口速率设置,10/100M自动协商

如果是有线PC的话,看网卡信息,如果连接速度是1G的就是千兆网络,如果100M 就是百兆。

第二种方法: 测试下载速度,如果下载速度能够达到12.5MB/s以上就是千兆(1000/8),反之就是百兆。

第三种方法: 看交换机上的速度灯,如果千兆灯亮就是千兆,百兆灯亮就是百兆。如图(绿灯千兆,黄灯百兆)

家里明显是加强的百兆网络。

全双工和半双工

区别是:1、全双工允许数据在两个方向上同时传输;2、半双工允许数据在两个方向上传输,但是同一时间数据只能在一个方向上传输,实际上是切换的单工。

同样是100M的链路,一条是全双工,另一条是半双工,如果两条链路上都进行单向通信的话,理论上是都可以达到100M的(注意:这里全双工也只有100M),但是如果两条链路都进行双向通信就不一样了,双向通信时,全双工的链路的吞吐量是200M(两个方向每个方向上都是100M),而半双工最大也只有100M。但是虽然全双工的最大吞吐量能够达到200M,但是他使用的最大带宽永远都是100M,你不可能将双向的200M变成单向的200M。

因此全双工的带宽=半双工的带宽,全双工的吞吐量=2×半双工的吞吐量。

WPA2-PSK

WPA/WPA2

WPA/WPA2是一种最安全的加密类型,不过由于此加密类型需要安装Radius服务器,因此,一般普通用户都用不到,只有企业用户为了无线加密更安全才会使用此种加密方式,在设备连接无线WIFI时需要Radius服务器认证,而且还需要输入Radius密码。

WPA-PSK/WPA2-PSK

WPA-PSK/WPA2-PSK是我们现在经常设置的加密类型,这种加密类型安全性能高,而且设置也相当简单,不过需要注意的是它有AES和TKIP两种加密算法。 1. TKIP:Temporal Key Integrity Protocol(临时密钥完整性协议),这是一种旧的加密标准。 2. AES:Advanced Encryption Standard(高级加密标准),安全性比 TKIP 好,推荐使用。

使用AES加密算法不仅安全性能更高,而且由于其采用的是最新技术,因此,在无线网络传输速率上面也要比TKIP更快。

CommView

软件首次运行时,会提示你安装一个特别的无线网卡驱动,这个驱动可以使你的无线网卡处在混杂模式,接收周围的任何无线报文。

软件启动时,无线网卡模式被改变,无线网络是无法使用的。

我虽然看不懂,但是我大受震撼。但是只能5分钟试运行

无线传输原理

比如,我在图书馆上网的时候,我的电脑并没有收到对面妹子的web请求包回复啊?无线数据包已经发送到你的无线网卡,但是你的网卡一看(主要受网卡驱动影响),不是我的请求数据包啊,于是丢弃了。

使用commview for wifi破解Windows无线网络WEP加密的密钥

需要进一步的研究学习

为什么comview里好多华为,是很多人开了手机热点吗?

Type – node type. Possible values are AP (for access points), STA (for stations in infrastructure mode) and AD HOC (for stations in ad hoc mode).

家庭网络改造

当前现状

  1. 套餐:公务员免费移动百兆套餐
  2. 网络设备:
  3. 光猫自带的wifi,最高只支持到wifi4 的2.4GHz
  4. 不支持ipv6的垃圾TP-link路由器

改进

  1. 将路由器更换为wifi6,直接跑满百兆(在学校里都能随便千兆的)

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

暑假回到家,把家里的WiFi弄一下

参考文献

https://www.zhihu.com/question/53878059

OpenWRT on router

OpenWRT Installation on router

原理

原理在路由器的两个flash(firmware和firmware1)的两个系统里,写入一个支持图形化OpenWRT的新系统

查看路由器型号是否支持

查看系统型号[^1]:路由器默认是魔改的openwrt的系统:

root@XiaoQiang:~# cat /etc/os-release
NAME="OpenWrt"
VERSION="18.06-SNAPSHOT"
ID="openwrt"
ID_LIKE="lede openwrt"
PRETTY_NAME="OpenWrt 18.06-SNAPSHOT"
VERSION_ID="18.06-snapshot"
HOME_URL="http://openwrt.org/"
BUG_URL="http://bugs.openwrt.org/"
SUPPORT_URL="http://forum.lede-project.org/"
BUILD_ID="unknown"
LEDE_BOARD="mediatek/mt7622"
LEDE_ARCH="aarch64_cortex-a53_neon-vfpv4"
LEDE_TAINTS="no-all glibc busybox"
LEDE_DEVICE_MANUFACTURER="OpenWrt"
LEDE_DEVICE_MANUFACTURER_URL="http://openwrt.org/"
LEDE_DEVICE_PRODUCT="Generic"
LEDE_DEVICE_REVISION="v0"
LEDE_RELEASE="OpenWrt 18.06-SNAPSHOT unknown"

刷入OpenWRT后:

root@ax6s:~# cat /etc/os-release
NAME="OpenWrt"
VERSION="22.03.2"
ID="openwrt"
ID_LIKE="lede openwrt"
PRETTY_NAME="OpenWrt 22.03.2"
VERSION_ID="22.03.2"
HOME_URL="https://openwrt.org/"
BUG_URL="https://bugs.openwrt.org/"
SUPPORT_URL="https://forum.openwrt.org/"
BUILD_ID="r19803-9a599fee93"
OPENWRT_BOARD="mediatek/mt7622"
OPENWRT_ARCH="aarch64_cortex-a53"
OPENWRT_TAINTS=""
OPENWRT_DEVICE_MANUFACTURER="OpenWrt"
OPENWRT_DEVICE_MANUFACTURER_URL="https://openwrt.org/"
OPENWRT_DEVICE_PRODUCT="Generic"
OPENWRT_DEVICE_REVISION="v0"
OPENWRT_RELEASE="OpenWrt 22.03.2 r19803-9a599fee93"

路由器开启dropbear

dropbear 是一种轻量级sshd服务

nvram set ssh_en=1  # 不是1也退出1
/etc/init.d/dropbear start # 脚本start段里增加了判断,稳定版不让启动直接退出
netstat -n # 查看22端口

修改/etc/dropbear/authorized_keys 来添加ssh公钥

Redmi-Ax6s实操

参考教程,和具体的视频

Step1: 打开 telnet access

  1. installing a beta version of the stock firmware (miwifi_rb03_firmware_stable_1.2.7_closedbeta.bin)上传文件安装

Step2: 获取密码,本地运行返回密码。<S/N>为产品序列号(可以在路由器下面的标签上找到序列号。)

#!/usr/bin/env python3
import sys
import hashlib

if sys.version_info < (3,7):
    print("python version is not supported", file=sys.stderr)
    sys.exit(1)

# credit goes to zhoujiazhao:
# https://blog.csdn.net/zhoujiazhao/article/details/102578244

salt = {'r1d': 'A2E371B0-B34B-48A5-8C40-A7133F3B5D88',
        'others': 'd44fb0960aa0-a5e6-4a30-250f-6d2df50a'}


def get_salt(sn):
    if "/" not in sn:
        return salt["r1d"]

    return "-".join(reversed(salt["others"].split("-")))


def calc_passwd(sn):
    passwd = sn + get_salt(sn)
    m = hashlib.md5(passwd.encode())
    return m.hexdigest()[:8]


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print(f"Usage: {sys.argv[0]} <S/N>")
        sys.exit(1)

    serial = sys.argv[1]
    print(calc_passwd(serial))

Step3: telnet到机器上(ssh不行). 密码为前面设置的(登录上去passwd把密码改简单)

XiaoQiang login: root
Password:


BusyBox v1.25.1 (2021-10-25 11:02:56 UTC) built-in shell (ash)

-----------------------------------------------------
    Welcome to XiaoQiang!
-----------------------------------------------------
$$$$$$\  $$$$$$$\  $$$$$$$$\      $$\      $$\        $$$$$$\  $$\   $$\
$$  __$$\ $$  __$$\ $$  _____|     $$ |     $$ |      $$  __$$\ $$ | $$  |
$$ /  $$ |$$ |  $$ |$$ |           $$ |     $$ |      $$ /  $$ |$$ |$$  /
$$$$$$$$ |$$$$$$$  |$$$$$\         $$ |     $$ |      $$ |  $$ |$$$$$  /
$$  __$$ |$$  __$$< $$  __|        $$ |     $$ |      $$ |  $$ |$$  $$<
$$ |  $$ |$$ |  $$ |$$ |           $$ |     $$ |      $$ |  $$ |$$ |\$$\
$$ |  $$ |$$ |  $$ |$$$$$$$$\       $$$$$$$$$  |       $$$$$$  |$$ | \$$\
\__|  \__|\__|  \__|\________|      \_________/        \______/ \__|  \__|


root@XiaoQiang:~# ls

Step4: 先备份, 路由器flash有若干分区,其中有一个分区存储路由器MAC地址、无线校准参数等。若损坏可能导致无线信号弱等问题。因此刷之前最好备份。

  1. 通过cat /proc/mtd,知道对应关系

    root@XiaoQiang:/tmp# cat /proc/mtd
    dev:    size   erasesize  name
    mtd0: 07f80000 00020000 "ALL"
    mtd1: 00080000 00020000 "Bootloader"
    mtd2: 00040000 00020000 "Config"
    mtd3: 00040000 00020000 "Bdata"
    mtd4: 00040000 00020000 "Factory"
    mtd5: 00040000 00020000 "crash"
    mtd6: 00040000 00020000 "crash_syslog"
    mtd7: 00040000 00020000 "cfg_bak"
    mtd8: 00400000 00020000 "kernel0"
    mtd9: 00400000 00020000 "kernel1"
    mtd10: 01a00000 00020000 "rootfs0"
    mtd11: 01a00000 00020000 "rootfs1"
    mtd12: 02600000 00020000 "overlay"
    mtd13: 01b80000 00020000 "obr"
    mtd14: 00c1c000 0001f000 "ubi_rootfs"
    mtd15: 021e8000 0001f000 "data"
    
  2. 备份,其中Factory中存储了EEPROM的数据

    cat /dev/mtd4 > Factory.dump
    cat /dev/mtd3 > Bdata.dump
    
    #on windows
    scp [email protected]:/tmp/factory.bin .
    scp [email protected]:/tmp/factory.bin .
    

Step5: 准备刷OpenWRT

  1. 路由器ssh终端,配置环境变量

    ```bash
    # nvram写入flash
    # Enable uart and boot_wait, useful for testing or recovery if you have an uart adapter!
    nvram set ssh_en=1
    # 设置串口打开,以便ssh失败时,硬件debug
    nvram set uart_en=1 
    nvram set boot_wait=on
    
    # Set kernel1 as the booting kernel
    nvram set flag_boot_success=1
    nvram set flag_try_sys1_failed=0
    nvram set flag_try_sys2_failed=0
    
    # Commit our nvram changes
    nvram commit
    ```
    
  2. 电脑本地准备传输可执行文件(开启了ssh服务,直接scp传上去即可)

    1. Rename the file openwrt-mediatek-mt7622-xiaomi_redmi-router-ax6s-squashfs-factory.bin you previously downloaded to your computer to factory.bin
    2. in the same directory where the file factory.bin is located, run the following command python -m http.server
  3. 路由器ssh终端,配置环境变量接受并运行

    cd /tmp
    wget http://<IP address of your computer>:8000/factory.bin
    mtd -r write factory.bin firmware
    
  4. 完成后重启,默认ip变成192.168.1.1

  5. 失败加上nvram set "boot_fw1=run boot_rd_img;bootm" 重来

WireGuard Server in OpenWRT

OpenWRT换软件安装源

修改/etc/opkg/distfeeds.conf的配置,参考

下面为x86软路由的源(由于是snapshot的安装不了,内核不匹配),如果是arm的需要看对应架构代号。

src/gz openwrt_core https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/targets/x86/64/packages
src/gz openwrt_base https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/base
src/gz openwrt_luci https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/luci
src/gz openwrt_packages https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/packages
src/gz openwrt_routing https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/routing
src/gz openwrt_telephony https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/telephony

比如ax6s

[root@ax6s ~]$ cat /etc/opkg/distfeeds.conf
src/gz openwrt_core https://downloads.openwrt.org/releases/22.03.2/targets/mediatek/mt7622/packages
src/gz openwrt_base https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/base
src/gz openwrt_luci https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/luci
src/gz openwrt_packages https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/packages
src/gz openwrt_routing https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/routing
src/gz openwrt_telephony https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/telephony

可以通过cat /etc/os-release查看, 上面的如下

root@OpenWrt:~# cat /etc/os-release
NAME="OpenWrt"
VERSION="SNAPSHOT" # snapshot是开发版的意思
PRETTY_NAME="OpenWrt SNAPSHOT"
VERSION_ID="snapshot"
BUILD_ID="r5636-25f88e06f"
OPENWRT_BOARD="x86/64"
OPENWRT_ARCH="x86_64"

[root@ax6s ~]$ cat /etc/os-release
NAME="OpenWrt"
VERSION="22.03.2"
PRETTY_NAME="OpenWrt 22.03.2"
VERSION_ID="22.03.2"
BUILD_ID="r19803-9a599fee93"
OPENWRT_BOARD="mediatek/mt7622"
OPENWRT_ARCH="aarch64_cortex-a53"

WireGuard安装服务端程序

  1. eSir精品小包固件下载地址(感谢esir的辛勤付出)
  2. 内置了wireguard(使用对等节点的公私钥加密)
  3. OpenWrt安装WireGuard命令(eSir精品小包已集成WireGuard,无需安装)

    opkg update
    opkg install luci-proto-wireguard luci-app-wireguard wireguard kmod-wireguard wireguard-tools
    reboot
    
    # x86
    opkg install wireguard luci-app-wireguard luci-i18n-wireguard-zh-cn wireguard-tools
    

WireGuard服务端设置

具体步骤
  1. 配置WG服务器端公私钥
  2. OpenWrt的luci界面配置服务器节点
  3. OpenWrt-网络-防火墙设置
    1. 如果OpenWrt做主路由,还需要在防火墙->通信规则中开放端口
    2. 假如是旁路由,需要设置端口转发
  4. 为每个客户端节点创建密钥
  5. OpenWrt->网络->接口,修改原本的WG0设置。修改Peers 1. 左下角更多选项选择预共享密钥,添加 2. 由于不能同时用,所以每个机器要单独配置,不能公用

WireGuard客户端设置

客户端模板文件test.conf

[Interface]
Address = 192.168.100.2 约定的IP
PrivateKey = cprivatekey文件内容 
DNS = 路由器IP


[Peer]
PublicKey = spublickey文件内容  

AllowedIPs = 0.0.0.0/0
//上面代表所有流量走WG。如果启用下面这行代码,表示只有192.168.2.0/24, 192.168.100.0/24这两个子网的IP走WireGuard
//逗号前是家庭局域网的IP段,后面是VPN的IP段
//AllowedIPs = 192.168.2.0/24, 192.168.100.0/24

PresharedKey=sharedkey内容
Endpoint = 公网IP(动态域名):端口号
PersistentKeepalive = 25

WireGuard配置匹配一览图

"[Interface] Address" is the address that gets assigned to the (virtual) network interface (e.g. wg0). 简单来说客户端和服务器端约定的相同的虚拟地址来通信。 注意防火墙放行端口 官方客户端软件下载

WireGuard常见问题

注意:如果连接不上

  1. 首先保证路由器有网,不是路由器下的电脑有网
  2. 上次师兄的电脑开了OpenVPN上网,导致路由器ipv6能ping通,但是不能上网
  3. 注意防火墙,一个是wan口允许某几个端口进来(wg连接请求)。另一个是wan能到wg,wg也能到wan,才能实现上网
  4. 至于和lan的关系,如果需要通过wg访问lan口下的设备(nas,电脑)再打开即可。

Clash in OpenWrt

  • 安装版本来自github
  • 但是由于DDNS会出问题,所以关闭了。(可以考虑2次wireguard蹭网和clash for linux)
  • BT,PT有时也会被代理,需要注意。

安装编译好的 IPK 文件(openwrt 的软件包)

安装依赖

#iptables
opkg update
opkg install coreutils-nohup bash iptables dnsmasq-full curl ca-certificates ipset ip-full iptables-mod-tproxy iptables-mod-extra libcap libcap-bin ruby ruby-yaml kmod-tun kmod-inet-diag unzip luci-compat luci luci-base

#nftables
opkg update
opkg install kmod-nft-tproxy

wget https://github.com/vernesong/OpenClash/releases/download/v0.45.59-beta/luci-app-openclash_0.45.59-beta_all.ipk
root@ax6s:/tmp# opkg install luci.ipk
Installing luci-app-openclash (0.45.59-beta) to root...
Configuring luci-app-openclash.
cfg117882

重启后出现

注意不会代理ping,所以ping不通的话,可以用curl来测试代理是否生效。https失败可以尝试http

安装问题

Collected errors:
 * check_data_file_clashes: Package dnsmasq-full wants to install file /etc/hotplug.d/ntp/25-dnsmasqsec
        But that file is already provided by package  * dnsmasq
 * check_data_file_clashes: Package dnsmasq-full wants to install file /etc/init.d/dnsmasq
        But that file is already provided by package  * dnsmasq
 * check_data_file_clashes: Package dnsmasq-full wants to install file /usr/lib/dnsmasq/dhcp-script.sh
        But that file is already provided by package  * dnsmasq
 * check_data_file_clashes: Package dnsmasq-full wants to install file /usr/sbin/dnsmasq
        But that file is already provided by package  * dnsmasq
 * check_data_file_clashes: Package dnsmasq-full wants to install file /usr/share/acl.d/dnsmasq_acl.json
        But that file is already provided by package  * dnsmasq
 * check_data_file_clashes: Package dnsmasq-full wants to install file /usr/share/dnsmasq/dhcpbogushostname.conf
        But that file is already provided by package  * dnsmasq
 * check_data_file_clashes: Package dnsmasq-full wants to install file /usr/share/dnsmasq/rfc6761.conf
        But that file is already provided by package  * dnsmasq
 * opkg_install_cmd: Cannot install package luci-app-openclash.

解决办法如下

opkg update
opkg remove dnsmasq && opkg install dnsmasq-full 

DDNS in OpenWRT

DDNS简介

Dynamic DNS: 根據網際網路的域名訂立規則,域名必須跟從固定的IP位址。但動態DNS系統為動態網域提供一個固定的名稱伺服器(Name server),透過即時更新,使外界使用者能夠連上動態使用者的網址。

cloudflare动态域名 或者阿里云动态域名的DDNS都是很好的选择。

定时脚本实现DDNS

[root@ax6s ~]$ cat ddns.sh
#!/bin/bash

Network=wan@eth0

Date=`echo $'\n\n' >> /tmp/ddns_ipv4`
Date=`echo "$(date)" >> /tmp/ddns_ipv4`
IPv4=`ip a|grep -A 2 ${Network}|sed -n '3p'|awk  '{print $2}' |sed -e 's/\/[0-9]*//'`
echo $IPv4 >> /tmp/ddns_ipv4
IPv6=`ip a|grep -A 4 ${Network}|sed -n '5p'|awk  '{print $2}' |sed -e 's/\/[0-9]*//'`
echo $IPv6 >> /tmp/ddns_ipv4

curl -v http://v6.sync.afraid.org/u/4TY5…………tKF/?address=${IPv6} 2>&1 >> /tmp/ddns_ipv4
curl -v http://sync.afraid.org/u/M8uh9Zf…………ryjxs/?address=${IPv4} 2>&1 >> /tmp/ddns_ipv4

修改crontab -e

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
4,9,14,19,24,29,34,39,44,49,54,59 * * * * sleep 11 ; /root/ddns.sh

OpenWRT 为局域网设备设置IPv6 DDNS

脚本围绕,打印邻居路由表命令

[root@ax6s ~]$ ip -6 neigh | grep 2c:f0:5d
2001:da8:d800:611:1818:61b6:6422:56a1 dev br-lan lladdr 2c:f0:5d:ac:1d:2c DELAY
2001:da8:d800:611:5464:f7ab:9560:a646 dev br-lan lladdr 2c:f0:5d:ac:1d:2c STALE
2001:da8:d800:611:4d13:ead8:9aaf:bfc4 dev br-lan lladdr 2c:f0:5d:ac:1d:2c REACHABLE
2001:da8:d800:611:a063:863f:caa3:4a73 dev br-lan lladdr 2c:f0:5d:ac:1d:2c STALE
2001:da8:d800:611:8c75:4f49:f9d0:42b6 dev br-lan lladdr 2c:f0:5d:ac:1d:2c STALE

新建 /usr/lib/ddns/dynamic_dns_iphelper.sh

#!/bin/sh

get_ip(){
    MAC=$1
    if [ "$MAC" = "" ]
    then
        exit 0
    fi
    IP=$(ip -6 neigh | grep -i $MAC | grep -v "fe80:" | grep -E "REACHABLE|STALE" | cut -d" " -f1 | grep -m 1 -E -o "([0-9a-fA-F]{1,4}(:?)){8}")
    if [ "$IP" = "" ]
    then
        IP=$(mac_to_ipv6_ll $MAC $(get_ip_prefix))
    fi
    echo $IP
}

mac_to_ipv6_ll() {
    PREFIX="fe80::"
    if [ "$#" = 2 ]; then
        PREFIX=$2
    fi
    IFS=':'; set $1; unset IFS
    echo "$PREFIX$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
}

get_ip_prefix() {
    IP_PREFIX=$(ip -6 addr | awk '{print $2}' | grep '::1' | grep -m 1 -E -o "([0-9a-fA-F]{1,4}(:?)){4}")
    echo $IP_PREFIX
}

if [ "$1" != "" ]; then
    echo `get_ip $1`
fi

新建 /usr/lib/ddns/getip_demo.sh

#!/bin/sh

. /usr/lib/ddns/dynamic_dns_iphelper.sh
# 遵循 EUI-64 的设备使用这个方式 可以获取到静态后缀的IPv6地址
# 00:00:00:00:00:00修改为目标设备的MAC地址
echo $(mac_to_ipv6_ll "00:00:00:00:00:00" $(get_ip_prefix))

# 或者
#!/bin/sh

. /usr/lib/ddns/dynamic_dns_iphelper.sh
# 00:00:00:00:00:00修改为目标设备的MAC地址
# 不遵循 EUI-64 的设备 可以获取到动态IPv6地址
echo `get_ip "00:00:00:00:00:00"`

脚本chmod +x就行

School Network

  • 根据学校的网络通各个端口的说明,0号端口没有经过NAT,登录之后获得公网ipv4。但是IPv4封了许多端口(至少ssh的22端口是不行的)
  • IPv6是直接可以ssh访问的。

参考文献

https://www.youtube.com/watch?v=F8z74oE71Gg&t=19s

https://xiumu.org/technology/openwrt-set-for-local-area-network-lan-equipment-ipv6-ddns.shtml