跳转至

toLearn

User Kernel Mode

内核态

内核态是计算机系统中的一种特权模式,用于执行操作系统内核的代码和功能。与用户态相比,内核态具有更高的权限和更广泛的访问能力,可以执行一些用户态无法执行的关键任务和操作。下面是从用户态的角度上介绍内核态的功能:

  1. 系统调用(System Calls):内核态允许用户程序通过系统调用接口请求操作系统提供的服务和功能。用户程序可以通过系统调用请求文件操作、网络通信、内存管理等操作。当用户程序执行系统调用时,会触发从用户态切换到内核态的转换,以便内核在高权限下执行相应的操作。
  2. 资源管理:内核态负责管理计算机系统的各种资源,包括处理器、内存、磁盘、网络等。在内核态下,操作系统可以对这些资源进行分配、调度和释放,确保资源的有效利用和合理分配。
  3. 中断处理:当发生硬件中断或异常时,内核态负责处理中断并提供相应的服务。例如,当用户程序需要与设备进行交互时,内核可以响应设备的中断信号,进行数据传输、状态检查等操作。
  4. 进程管理:内核态负责创建、销毁和管理进程。它可以调度进程,分配和回收进程所需的资源,并在必要时进行进程间的通信和同步。
  5. 内存管理:内核态控制着计算机系统的内存分配和管理。它负责将物理内存分配给进程,并维护虚拟内存和物理内存之间的映射关系。内核还处理内存保护、页面置换、内存回收等任务。
  6. 设备驱动程序:内核态包含设备驱动程序,用于与硬件设备进行交互。它允许操作系统通过设备驱动程序来控制和管理硬件设备,如磁盘驱动程序、网络驱动程序等。
  7. 安全和权限管理:内核态能够执行与系统安全和权限相关的任务。它可以控制对系统资源的访问权限,并确保用户程序不能越权访问或修改关键数据和系统配置。

总的来说,内核态提供了操作系统核心功能的执行环境,拥有更高的权限和更广泛的访问能力,使得操作系统能够管理和控制计算机系统的各个方面,同时为用户程序提供必要的服务和保护。

代码位置

在Linux系统中,每个进程的虚拟地址空间中的高位部分通常被映射为内核空间,其中包含了内核态的代码和数据。这个区域通常被称为内核空间或内核页表。内核空间中的内容包括以下两类:

  1. 内核代码:内核代码是操作系统内核的实现,包括各种系统调用、设备驱动程序和核心功能的代码。这些代码用于提供操作系统的各种服务和功能,如文件系统操作、进程管理、内存管理、网络通信等。内核代码是所有进程共享的,因为它们代表了操作系统的核心部分,为所有进程提供服务。
  2. 共享内核数据结构:内核空间中还包含一些共享的内核数据结构,用于维护系统状态和资源管理。例如,进程调度器、内存管理数据结构、文件描述符表等。这些数据结构被多个进程共享,以便内核能够管理和控制系统资源的分配和使用。

除了以上共享的内容,内核空间还包含一些每个进程独有的部分,例如:

  1. 进程描述符(Process Descriptor):每个进程都有一个唯一的进程描述符,其中包含了进程的状态信息、上下文和其他与进程相关的数据。进程描述符存储在内核空间,每个进程都有自己独立的进程描述符。
  2. 用户栈和内核栈:每个进程都有自己的用户栈和内核栈。用户栈用于保存进程在用户态执行时的局部变量和函数调用信息,而内核栈用于保存进程在内核态执行时的上下文信息和函数调用。(内核函数也要嵌套调用)

总结起来,Linux进程的高位部分映射了内核空间,其中包含了内核代码、共享的内核数据结构以及每个进程独有的部分,如进程描述符和栈空间。这种映射允许进程与内核进行交互和访问操作系统的功能和服务。

如何共享

在内核中,代码共享并不是通过动态链接库(.so)的模式来实现的。内核态的代码通常被编译成内核模块或者直接编译进内核映像中,而不是作为独立的可加载库。因此,内核中的代码共享机制与用户空间中的动态链接库不同。

在内核中,代码共享是通过代码复用和内核模块的概念来实现的。内核模块是一种可以动态加载和卸载的代码和数据集合,它可以扩展内核的功能。内核模块可以包含新的设备驱动程序、文件系统、网络协议等,以便在需要时被加载到内核中运行。

内核模块的加载过程可以在运行时根据需要进行,而不需要重新编译整个内核。这样,多个进程可以共享同一个内核模块,从而实现内核代码的共享。当多个进程需要使用某个内核模块时,模块只需要加载一次,然后被多个进程共享调用。

值得注意的是,内核中的代码共享是在内核空间内部进行的,与用户空间的动态链接库不同,它不涉及用户进程的地址空间和加载机制。内核模块的共享是在内核内部完成的,不同进程间可以通过系统调用接口访问共享的内核模块提供的功能和服务。

总结起来,内核中的代码共享是通过内核模块的加载和运行机制来实现的,而不是像用户空间中的动态链接库那样。内核模块可以被多个进程共享调用,从而提供共享的内核功能和服务。

内核态与用户态切换

切换时机

内核态与用户态的切换通常由以下几种情况触发:

  • 系统调用(System Call):当用户程序通过系统调用请求操作系统提供的服务时,会触发从用户态到内核态的切换。这是最常见的切换方式。
  • 异常(Exception)和中断(Interrupt):当发生硬件中断、软件中断(如除零错误)、内存访问错误等异常情况时,CPU会切换到内核态来处理异常。这些异常可以是由程序错误、设备请求或其他条件引起的。
  • 外部事件:例如时钟中断、I/O 完成中断等,这些事件可能需要内核处理,因此会导致从用户态切换到内核态。

切换的细节

当进程从用户态切换到内核态,或者从内核态切换回用户态时,涉及到特权级的切换和上下文的保存与恢复。下面是内核态与用户态切换的一般细节:

  1. 特权级切换:内核态拥有更高的特权级别,因此从用户态切换到内核态时,CPU会从当前运行的用户模式切换到内核模式。这种切换会改变CPU的状态,包括特权级、堆栈和指令指针。

  2. 上下文保存与恢复:在切换到内核态之前,CPU会保存当前用户态下的进程上下文信息,包括程序计数器(PC)、寄存器的值、堆栈指针等。这些上下文信息保存在进程的内核栈中。

  3. 内核态执行:当切换到内核态后,CPU开始执行相应的内核代码,处理请求或异常。在内核态下,操作系统可以访问和操作系统的所有资源和功能,执行必要的操作。

  4. 上下文恢复与切换回用户态:当内核态的任务完成后,CPU会从内核栈中恢复之前保存的进程上下文信息。然后,CPU会将特权级切换回用户态,并从保存的程序计数器继续执行用户程序。

需要注意的是,内核态与用户态的切换涉及到CPU和操作系统的底层机制,具体细节可能会因操作系统的设计和架构而有所不同。上述描述是一般情况下的概述,不同的操作系统和处理器架构可能会有特定的实现细节。

开销来源

  1. 特权级切换
  2. 上下文保存与恢复
  3. 由于PTI的存在,内核维护了两套页表。切换到内核态时,可能需要切换内存地址空间的映射关系,例如将用户态的虚拟地址空间映射为内核态的地址空间。这可能涉及页表的切换和TLB(Translation Lookaside Buffer)的刷新,会带来一定的延迟和开销。

量化

内核态与用户态的切换时间在数百到数千个CPU周期之间

需要进一步的研究学习

暂无

遇到的问题

暂无

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

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

IPCC2022final

学到的一些亮点

总结反思

由于决赛是黑盒制度,没有排行榜,也不知道最终算分的例子是多大。我们优化着眼于自己找的清华的大例子,并行的占比在这部分很小。忽略了小例子里,占比比较高的部分的优化。结果最终赛题例子很小。

如果提前知道元素个数,并行对同一个数组的末尾添加元素可以并行,添加到指定位置之后再统一排序就行。比如山东大学,就是这里快了大约10ms,加上第一次排序快5ms。

比如信息中心(应该是第一名)的排序,用的是归并的基数排序

比如青海大学的优化:

还有高效的排序,怎么实现。类似

需要进一步的研究学习

CSR (压缩稀疏行存储) 矩阵和邻接表在表示图数据结构时,计算和访问性能有些差异:

  • CSR通过压缩行存储机制,可以大幅减少空间占用,节省内存。但索引算术运算负担重一些
  • 邻接表使用链表指针连接相邻节点,追踪任意一条边的开销很低。但总体占用内存空间更大。
  • CSR访问任意一个元素通过索引计算直接可以定位,兼具稠密和稀疏矩阵的特点。
  • 邻接表的边访问性能更好,通过指针直接遍历一个节点的所有相邻节点。
  • CSR的预处理时间较短,更易于向量化实现提高效率。
  • 邻接表更灵活,可表示加权图或处理动态变化的图。
  • CSR矩阵更易进行压缩和剪枝来优化存储,节省内存带宽。

所以简单来说,如果图更稠密,数据访问模式更随机,CSR可能会有些优势。如果需要频繁遍历边,图结构变化大,邻接表访问效率可能会更高一些。需要根据具体情况选择合适的表示。

遇到的问题

暂无

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

哎呀,你干嘛! 今年又~西巴了~,惜败了,应该是第三名左右。

参考文献

BitTorrent

BT简述

BitTorrent (简称 BT) 协议是和点对点(point-to-point)的协议程序不同,它是用户群对用户群(peer-to-peer, 或简写为 P2P) 传输协议, 它被设计用来高效地分发文件 (尤其是对于大文件、多人同时下载时效率非常高)。该协议基于HTTP协议,属于TCP/IP应用层。

将文件划分成多块(默认256Kb一块),每块可以从网络中不同的用户的BT客户端处并行下载。

BT 下载的文件都是别人上传给你的。
BT 下载速度均来自其他下载同一资源的用户上传速度。
上传的用户越多,你的下载速度越快,相反没用户上传你就没有下载速度。

比特彗星,包括其他 BT 软件(迅雷除外,迅雷不是会员会限速,高速通道下载提高的速度一部分就是接触限速后获得的)都不会限制下载速度。

BT分享规则

与迅雷不同,BT旨在“人人为我,我为人人”。用户和用户之间对等交换自己手中已有的资源。如果任何一方试图白嫖另外一方的资源,而自己不愿意上传自己的资源,那么那方就会被人视作吸血者而被踢出这个交换,下场是没有人会愿意和你交换数据,你的下载速度也就归零。

如果把上传速度限制为了10KB/s,10KB/s是BitComet上传最低限速,很大时候就这10KB会被包含DHT查询、向Tracker服务器注册,连接用户所产生的上传全部占满。在下载种子的时候,其他用户连上你是只能拿到1~2KB/s甚至一点都没有的。

现在的BT下载客户端都可以做到智能反吸血,所以基本想和交换数据的用户都把你当作Leecher(吸血鬼)Ban(封禁)处理了,故没有下载速度不足为奇。

一般来说,只要预留50KB/s的上传给其他网页浏览、聊天就可以了,在下载时应该尽量把上传留给那些和你交换资源的用户,这样才不会被他们视作你在吸血进而屏蔽你。

如果上传不足,就应该主动限制自己的下载速度,否则单位时间下载量远超过上传量反而会遭来更多的屏蔽,对下载速度提升更加不利。

BT基本流程

.torrent 种子文件本质上是文本文件,包含Tracker信息和文件信息两部分。Tracker信息主要是BT下载中需要用到的Tracker服务器的地址和针对Tracker服务器的设置。

  1. 下载时,BT客户端首先解析种子文件得到Tracker地址,然后连接Tracker服务器。
  2. Tracker服务器回应下载者的请求,提供下载者其他下载者(包括发布者)的IP。
  3. 下载者再连接其他下载者,根据种子文件,两者分别告知对方自己已经有的块,然后交换对方所没有的数据。
  4. 此时不需要其他服务器参与,分散了单个线路上的数据流量,因此减轻了服务器负担。
  5. 下载者每得到一个块,需要算出下载块的Hash验证码与种子文件中的对比,如果一样则说明块正确,不一样则需要重新下载这个块。这种规定是为了解决下载内容准确性的问题。

常规部署

  • 安装qBittorrent-nox, tmux下运行,在8080端口挂载WebUI
  • 安装qbittorrent, 用户运行qbittorrent, x11弹出应用窗口
  • 问题:
    • 怎么维持窗口?sudo XAUTHORITY=/home/qcjiang/.Xauthority qbittorrent
    • 关于写文件权限,如何写网络硬盘
    • node5 上传很快, 网络原因?种子原因?(不是,是因为网络硬盘,所以下载多少要占用多少上传)

docker部署

以qBit的docker为例,参考linuxsever的docker-compose如下:(qBit相对于Transmission有多线程IO的优势) 也可以使用其余docker镜像

---
version: "2.1"
services:
  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    container_name: qbittorrent
    environment:
      - PUID=0 # 这里是root 如果想以其他用戶A修改文件,可以改成其他用户的UID。通過id A 查看
      - PGID=0
      - TZ=Etc/UTC
      - WEBUI_PORT=8080
    volumes:
      - /addDisk/DiskNo4/qBit:/config
      - /addDisk/DiskNo4/bt:/downloads

    network_mode: host
    restart: unless-stopped

默认账号 admin 默认密码 adminadmin 然后通过webUI http://222.195.72.218:8080/管理。

忘记密码处理

修改对应配置文件,

如果不想网络通过wireguard,而是本地可以如下设置

同一台机器实现两个账号做种

  • 思路:两个docker,同一个网络出口
  • 問題:
  • qBit要有权限写文件
  • 两个docker兼容性:
    • WebUI有bug,不一定会显示。重启刷新即可
    • 其次有一个docker会没有网络。
    • 这是由于端口随机错误导致的,会导致下面连接状态显示火焰。换端口刷新即可解决。
  • 关于封号
  • 由于国内环境下载一般都是大内网。同一个网络出去应该没有问题。
  • 大多数做种是通过ipv6,会被检测出同一个机器多个账户做种,导致封号
  • 还有关于盒子刷上传,一方面通过速度,另一方面由于盒子的ip是固定的,所以会被检测出重复导致封号。

测速

  1. 先用 https://www.speedtest.net 测速
  2. 考虑热门种子测试 http://releases.ubuntu.com/19.10/ubuntu-19.10-desktop-amd64.iso.torrent
  3. 没通过代理能找到的用户变少,速度也变慢了。
  4. 如果跑不到网络上限,可能和软件设置有关

上传速度

m站刷上传的时候,发现基本都是对方基本都是通过ipv6下载 uTP是一种基于UDP的协议,它可以根据网络拥塞情况自动调节传输速度,从而减少对其他网络应用的影响。

BT连接是一种基于TCP的协议,它可以保证数据的完整性和可靠性,但是可能会占用较多的网络带宽和资源。

在qBittorrent中,标志U K E P分别表示以下含义:

U:表示你正在上传数据给对方,或者对方正在从你那里下载数据。
K:表示对方支持uTP协议,即基于UDP的传输协议。
E:表示对方使用了加密连接,即通过加密算法保护数据的安全性。
P:表示对方使用了代理服务器或VPN服务,即通过第三方网络隐藏自己的真实IP地址。

PT设置

  • 虽然说PT下载,客户端要关闭DHT,PeX, LSD。
  • 但是其实种子是默认关闭的,无序额外设置,北洋和M站一样。

基本概念

Tracker

收集下载者信息的服务器,并将此信息提供给其他下载者,使下载者们相互连接起来,传输数据。

种子

指一个下载任务中所有文件都被某下载者完整的下载,此时下载者成为一个种子。发布者本身发布的文件就是原始种子。

做种

发布者提供下载任务的全部内容的行为;下载者下载完成后继续提供给他人下载的行为。

分享率

上傳資料量 / 下傳資料量的比率,是一種BT的良心度,沒實際作用.(一般为了良心,至少大于1)

长期种子

BitComet的概念,相对于种子任务的上传能够控制。

长效种子就是你不开启任务做种,只要你启动了比特彗星,软件挂后台,当有其他用户也是用比特彗星下载你列表里的存在的文件时候就会被认为是长效种子 。

DHT

.DHT全称叫分布式哈希表(Distributed Hash Table),是一种分布式存储方法。在不需要服务器的情况下,每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整个DHT网络的寻址和存储。新版BitComet允许同行连接DHT网络和Tracker,也就是说在完全不连上Tracker服务器的情况下,也可以很好的下载,因为它可以在DHT网络中寻找下载同一文件的其他用户。

类似Tracker的根据种子特征码返回种子信息的网络。

在BitComet中,无须作任何设置即可自动连接并使用DHT网络,完全不需要用户干预。

用户交换Pex

Peer Exchange (PEX), 每个peer客户端的用户列表,可以互相交换通用。可以将其理解为“节点信息交换”。前面说到了 DHT 网络是没有中心服务器的,那么我们的客户端总不能满世界去喊:“我在下载这个文件,快来连我吧.”(很大声)。所以就通过各个 BT 客户端自带的节点去同步路由表实现 DHT 网络连接。

本地用户发现

LSD(LPD)就是本地网络资源,内网下载,没什么几把用的东西,可能学校等私有网络好使

ISP

網絡業務提供商(Internet Service Provider,簡稱ISP),互聯網服務提供商,即向廣大用户綜合提供互聯網接入業務、信息業務、和增值業務的電信運營商。

反吸血机制

基本原理

  1. 根据流量: 默认设置为120秒,持续对某个peer产生上传,并且从该peer用户获取的下载流量没有超过1KB文件(1024字节)大小,即拉黑该peer,预警颜色为黄色,合法为绿色,红色为封禁。
  2. 可组合检测指定客户端进行反吸血,比如说指定屏蔽qbittorrent、utorrent等吸血客户端选择(可多选客户端,可对下载任务和做种任务生效)
  3. 可组合检测客户端连接端口号进行反吸血,比如说指定屏蔽15000迅雷X版本客户端等吸血端口(可多选端口号,可对下载任务和做种任务生效)
  4. 可组合检测客户端连接peer_id标志符进行反吸血屏蔽,例如屏蔽XL0018客户端等吸血标志符(可多选标志符,可对下载任务和做种任务生效)

高级设置

bittorrent.anti_leech_min_byte
设定反吸血保护流量:要求对方在指定时间(秒)内需要上传的最少流量(byte), 取值范围:1-10000。

bittorrent.anti_leech_min_stable_sec
设定反吸血保护时间:指定与对方连接多长时间(秒)后开始检查流量(byte),取值范围:1-10000。

常见问题

需要软件开着吗?

需要

原文件改名或者移动,还会上传吗?

文件下载后不能移动,不能删除,不能重命名(但可以在软件内改)。 一但BT 软件找不到文件,或删除了任务,就无法做种上传了。

晚上避免上传

可以在Bitcomet高级设置里设置时段限速

对硬盘损害大吗?

分享上传也需要频繁读取硬盘。

以Bitcomet为例,该软件就是通过磁盘缓存技术减小频繁随机读写对硬盘的损伤。

磁盘缓存就是利用物理内存作为缓冲,将下载下的数据先存放于内存中,然后定期的一次性写入硬盘,以减少对硬盘的写入操作,很大的程度上降低了磁盘碎片。

因为通常我们设置内存(磁盘缓存)为每任务XX兆,意味着,这个缓冲区可以存放数兆甚至几十兆的“块”,基本上可以杜绝碎片了。

现在BT软件都是自动设置缓存的,它是根据你物理内存的大小分配的。

注意设置

  1. 设置了“反吸血”,应对迅雷
  2. 校园网设置9,不限制P2P
  3. 国内各省份不同运营商限速策略(QOS)

需要进一步的研究学习

路由器下载?

参考文献

UnimportantView: Film & TV(Anime) Works Rating

如何评价影视剧(动漫作品)

我一向的观点是现实生活已经投入了很多时间体验了,影视剧(动漫作品)肯定要是看现实中没有的。这导致的第一个问题就是既然不存在,你怎么让观众相信呢?

  • 真实的氛围感
  • 真实的细节特效
  • 真实的演员反映和期望中的样子

如何评价对影视剧(动漫作品)角色的喜爱程度

  • 喜欢一个角色往往是没有什么理由的,虽然要追求格物致知。但是将最感性的情感拿来分析是不是有点无情呢?

  • 初印象的美好(40)

  • 外貌美(15):
    • 不一定要完美,但是要有特点,
    • 可以接受有缺陷,但是其一般要具有意义来完善人物塑造。
  • 可爱俏皮(5)
    • 可以拉进距离感
  • 性格好(乐观、勇敢、坚毅、聪明)(10)
    • 角色不可能不经历挫折,乐观还是要一点
    • 但是白给的老好人不行,还是要有基础原则的
    • 可以出发点很低(一开始比较恶劣,自闭),为角色后续成长留下了空间
  • 强烈独特独立的个性魅力、个人行为准则坚定(10)
    • 额外固执但是专情
    • 病娇(特别爱一个人),想守护妹妹的想法
    • 厌世,缺爱
  • 角色剧情行事逐渐展示出来的
  • 真实感(反差,与观众拉近距离) (20)
    • 平时严酷,但也会含羞
    • 总是公正,但也会偏私
  • 悲剧色彩,激发了同情心(共情)(0~30)
    • 努力却依旧失败、正义行事却危机四伏、爱而不得、无所谓付出。一哭 +10
    • 美好的东西被摧毁总是令人扼腕痛心,令人印象深刻。+10
    • 失去美好的未来
    • 刀人:刀友情,刀亲情 +10
  • 共鸣?观众随角色一同成长(40)
    • 如果观众一开始有一样的疑惑,(10)
    • 然后和角色一起寻找答案 (10)
    • 最后坚定的相信自己找到的 (20)

举例

  • 星野爱(113)
  • 外貌(5):不是特别感冒的形象
  • 可爱俏皮(2)
  • 乐观性格(6):演出也有时迷茫,却为了孩子开朗了起来
  • 独特和自我(10): 厌世,缺爱让人同情
  • 真实感(20):以谎言编织的怀孕偶像,是最大的反差
  • 悲剧色彩(30):
    • 想学会爱,但是到死还在努力
    • 失去了与孩子们的未来
    • 刀母爱
  • 共鸣与成长(40)
    • 疑惑: 不会爱的人怎么办
    • 寻找:以谎言代替
    • 结论:谎言也是我努力传达爱意的方式。但唯独我爱你们,这句话……绝对不是谎言
  • 亚斯娜(100)
  • 外貌(15):理想的人妻
  • 可爱俏皮(5)
  • 乐观性格(10):理想的姐姐人妻性格,爱你管你又不太束缚你
  • 独特和自我(10): 为了Kirito 愿意牺牲自己
  • 真实感(20):平时严酷,但也会含羞
  • 悲剧色彩(10):
    • 刀爱情, 差一点失去Kirito
  • 共鸣与成长(30)
    • 疑惑: 在虚拟世界里,存在的意义是什么
    • 寻找:寻找虚拟世界“红莫罗”的东西
    • 结论:这份感情与相遇的经历是真实的(10,结论不够动容)
  • 爱莉希雅Elysia(125)
  • 外貌(15):理想的人妻2
  • 可爱俏皮(10) 与芽衣打情骂俏,甜齁了(摸角)。额外加分+5
  • 乐观性格(10):理想的姐姐人妻性格,
  • 独特和自我(10): 真我 ~ 人之律者
  • 真实感(20):平时严酷,但也会含羞(神之子却爱上了人类)
  • 悲剧色彩(30):
    • 出生无知的律者,努力爱人类,却不被理解
    • 反而为人类牺牲
    • 本世代对抗侵蚀之律者,最终数据还被删除
  • 共鸣与成长(30)
    • 疑惑: 凡事任凭心意而为,自由自在,与副首领的身份格格不入的往事乐土的少女是谁
    • 寻找:寻找前世的真相与少女的秘密
    • 结论:即使往事乐土不存在了,但只要这份记忆还在,你就永远还在。愿时光永驻此刻(10,结论不够动容)
  • 光与焰(120)
  • 外貌(15):两个人各有特点
  • 可爱俏皮(5)
  • 乐观性格(10):理想的姐姐人妻性格,
  • 独特和自我(10): 光傲娇 焰体贴
  • 真实感(25):光性格上与焰完全相反,非常要强,不擅长表达自己的感情,但本性其实很温柔,内心很脆弱。
    • 高质量CG的游戏,真实沉浸感额外加分+5
  • 悲剧色彩(20):
    • 被坏人利用,虽然不愿意,但是伤害了世界,
    • 喜欢lex,最后还是牺牲了自己(lex,你一个人也没关系了吧!)
  • 共鸣与成长(35)
    • 疑惑: 无意间结实的少女
    • 寻找:寻找世界的真相与少女的秘密
    • 结论:即使有前世的经历。但是愿意忘记悲伤的过去。从现在开始彼此守护(15,结论不够动容)
  • 评价模板
  • 外貌(15):理想的人妻
  • 可爱俏皮(5)
  • 乐观性格(10):理想的人妻性格
  • 独特和自我(10):
  • 真实感(20):
  • 悲剧色彩(30):
    • 失去了
  • 共鸣与成长(40)
    • 疑惑:
    • 寻找:
    • 结论:

需要进一步的研究学习

暂无

遇到的问题

暂无

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

看了星野爱之后,我又emo了

参考文献

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

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