分类 默认分类 下的文章

云与虚拟化:实验3 搭建Docker私有仓库

实验要求

了解仓库,掌握搭建私有仓库的方法。

前置准备

要求实验主机能够连接外网,已经正确安装Docker(版本号19.03.12),并关闭防火墙和selinux。本实验各主机配置信息如表3-1所示。

表 3-1 各宿主机信息表

主机名IP地址节点角色
registry10.1.1.170/24私有仓库
node110.1.1.71/24客户端1
node210.1.1.59/24客户端2

先建立一个快照:

实验步骤

步骤1

registry主机上利用docker pull命令从Docker Hub拉取registry镜像,并通过docker images命令查看下载的registry镜像。

[root@localhost ~]# hostnamectl set-hostname registry
[root@registry ~]# docker pull registry
[root@registry ~]# docker images

步骤2

通过docker run命令启动一个registry容器,并挂载目录,利用容器提供私有仓库的服务,并通过docker ps命令查看registry容器是否运行。

[root@registry ~]# docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry
[c93669d06c5545b1f90fcb721bdb4da43b7add9fff7ede08b9e58822d1c235d1]
[root@registry ~]# docker ps -a
root@registry:/home/dayi# docker run -d -p 5000:5000 -v /opt/myregistry:/var/lib/registry registry
3469b41b2f69ec32f06eb5d004ba84141e3d7f499b6b343756c31b4a4879ca8d
root@registry:/home/dayi#

步骤3

执行命令

curl -X GET http://127.0.0.1:5000/v2/_catalog

命令,如果显示如下信息,表示目前仓库里还没有镜像,此时私有仓库已经创建和启动完毕了。

{"repositories":[]}
root@registry:/home/dayi# curl -X GET http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}
root@registry:/home/dayi# 

步骤4

拉取busybox镜像,修改tag名称后,上传到本地仓库中。

[root@registry ~]# docker pull busybox
[root@registry ~]# docker images
[root@registry ~]# docker tag busybox:latest 192.168.5.100:5000/busybox:latest
[root@registry ~]# docker images

步骤5

将镜像192.168.5.100:5000/busybox上传到本地仓库中。

[root@registry ~]# docker push 192.168.5.100:5000/busybox

步骤6

如果出现上述提示,表示本地仓库默认使用的是https协议进行上传。而当前采用是非https协议上传,可采用步骤6进行处理。修改/usr/lib/systemd/system/docker.service文件,在ExecStart参数后面添加--insecure-registry 192.168.5.100:5000。

[root@registry ~]# vi /usr/lib/systemd/system/docker.service
// 修改ExecStart参数,修改完后,内容如下
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.5.100:5000

保存退出,重启docker服务。

[root@registry ~]# systemctl daemon-reload
[root@registry ~]# systemctl restart docker

重启registry容器。

[root@registry ~]# docker restart c93669d06c55
root@registry:/home/dayi# docker run -d -p 5000:5000 -v /opt/myregistry:/var/lib/registry registry
4d5dacc0842c47f7308100362bba7e0ed67dca3503092ee07b09d7f6a7275144
root@registry:/home/dayi# docker push 10.1.1.170:5000/busybox
Using default tag: latest
The push refers to repository [10.1.1.170:5000/busybox]
Get "https://10.1.1.170:5000/v2/": http: server gave HTTP response to HTTPS client
root@registry:/home/dayi# 

步骤7

再次上传镜像192.168.5.100:5000/busybox到本地仓库。

[root@registry ~]# docker push 192.168.5.100:5000/busybox

root@registry:/home/dayi# docker push 10.1.1.170:5000/busybox
Using default tag: latest
The push refers to repository [10.1.1.170:5000/busybox]
Get "https://10.1.1.170:5000/v2/": http: server gave HTTP response to HTTPS client
root@registry:/home/dayi# vim /usr/lib/systemd/system/docker.service
root@registry:/home/dayi# vim /usr/lib/systemd/system/docker.service
root@registry:/home/dayi#  systemctl daemon-reload
root@registry:/home/dayi# systemctl restart docker
root@registry:/home/dayi# docker push 10.1.1.170:5000/busybox
Using default tag: latest
The push refers to repository [10.1.1.170:5000/busybox]
3d24ee258efc: Retrying in 1 second 

步骤8

在客户端1和客户端2上修改/usr/lib/systemd/system/目录下的docker.service文件,在ExecStart=/usr/bin/dockerd后面添加--insecure-registry 192.168.5.100:5000,保存后并重启docker服务。

--insecure-registry 10.1.1.170:5000

客户端1:

[root@localhost ~]# hostnamectl set-hostname node1
[root@node1 ~]# vi /usr/lib/systemd/system/docker.service
// 修改ExecStart参数,修改完后,内容如下
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.5.100:5000

保存退出,重启docker服务。

[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl restart docker

客户端2:

[root@localhost ~]# hostnamectl set-hostname node2
[root@node2 ~]# vi /usr/lib/systemd/system/docker.service
// 修改ExecStart参数,修改完后,内容如下
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.5.100:5000

保存退出,重启docker服务。

[root@node2 ~]# systemctl daemon-reload
[root@node2 ~]# systemctl restart docker

步骤9

在客户端node1和node2上拉取私有仓库中的busybox镜像。

[root@node1 ~]# docker pull 192.168.5.100:5000/busybox
[root@node1 ~]# docker images

[root@node2 ~]# docker pull 192.168.5.100:5000/busybox
[root@node2 ~]# docker images

node1

node2

云与虚拟化 1-2实验

步骤1

在可联网的主机上制作docker本地安装包。
yum -y install ntpdate yum-utils
ntpdate ntp.aliyun.com

步骤2

创建离线安装包
mkdir -p /opt/docker
chmod -R 777 /opt/docker

先启动一个centos容器

docker run -it --privileged -v /opt/docker:/opt/docker centos:7 bash

在容器里进入目录

cd /opt/docker

添加镜像源:

yum-config-manager --add-repo http://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

步骤 3

下载离线包到/opt/docker
# 下载依赖
yum install --downloadonly --downloaddir=/opt/docker yum-utils device-mapper-persistent-data lvm2 createrep

ls

# 安装仓库制作器?
yum install -y device-mapper-persistent-data lvm2 createrepo
yum makecache fast
yum install --downloadonly --downloaddir=/opt/docker/ docker-ce-18.03.0.ce

#下载KEY
cd /opt/docker/
yum install -y wget
wget https://download.docker.com/linux/centos/gpg

# 加入仓库数据
createrepo -pdo /opt/docker /opt/docker
createrepo --update /opt/docker

cd /opt/docker/
ll
tar -zcvf docker-local.tar.gz *

退出当前容器

CTRL+P+Q

删除容器,这里要一一对应。

docker ps -a 
docker stop 

docker stop 7ea
docker rm 7ea

步骤4 在离线的主机上安装docker

离线主机

1. 解压一个docker_c7

然后恢复到init的时候

2. 想法子把刚刚生成的/opt/docker/docker-local.tar.gz 复制出来,然后放到新的虚拟机上

我这里用了termius直接SFTP拖出来了
然后制作一个iso,linux的话直接用这个命令,windows用软碟通也可以。

yum install genisoimage
mkisofs -o centos_7_docker.iso /opt/docker/docker-local.tar.gz

3. 启动虚拟机安装

移除网络适配器,挂载iso

4. 开机安装

#版本号
uname -r        //查看Linux内核版本号
#步骤2:关闭防火墙,并查询防火墙是否关闭。
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

#步骤3:修改/etc/selinux目录下的config配置文件,设置SELINUX为disabled后,保存并退出。
setenforce 0
vi /etc/selinux/config
SELINUX=disabled                // 将SELINUX设置为disabled

步骤4:将centos的ISO镜像文件和docker-local.tar.gz文件上传到离线的主机,本任务将文件复制到/opt目录,并将centos的ISO镜像文件挂到/opt/centos目录,将docker-local.tar.gz文件解压到/opt/docker目录。

#因为文件在iso里,先挂载
mkdir -p /mnt/cd
#挂载磁碟
mount /dev/cdrom /mnt/cd
cd /mnt/cd
ls -al

#复制文件
mkdir -p /opt/docker /opt/centos

#k拷贝文件
cp docker_1.tgz /opt/docker

#解压文件
cd /opt/docker

tar -zxvf docker_1.tgz

image-20231019124636051

步骤5:配置docker-ce的yum源。

rm -ivf /etc/yum.repos.d/*.repo  // 删除原有的repo文件
vi /etc/yum.repos.d/docker-ce.repo
// 添加如下内容
[docker]
name=docker ce
baseurl=file:///opt/docker
gpgcheck=0
enabled=1
gpgkey=file:///opt/docker/gpg

[centos]
name=centos
baseurl=file:///opt/centos
gpgcheck=0
enabled=1
保存退出(:wq)

挂载centosDVD

下载镜像文件:

自动选地址:http://mirrors.cernet.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso

USTC:https://mirrors.ustc.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso

感觉齐工大的不是很快。

换碟

image-20231019125819247

umount /dev/cdrom
mount /dev/cdrom /opt/centos
ls /opt/centos

image-20231019130259356

继续:

yum clean all
步骤6:安装createrepo。
yum -y install deltarpm libxml2-python python-deltarpm createrepo
createrepo -d /opt/docker/repodata
yum clean all
yum makecache fast
步骤7:安装docker-ce,并检查docker-ce是否安装成功。
yum -y install docker-ce
systemctl start docker
systemctl enable docker 
docker version

image-20231019124743689

image-20231019124945753

image-20231019130432045

到此完成。

下面是失败的尝试过程

特权容器安装(失败)

忽略bia

这里直接启动centos:7 容器来安装,假装他是一个虚拟机,开的时候给特权容器。

启动一个特权容器

并且把主机的目录映射到容器里

docker run -it --privileged -v /opt/docker:/opt/docker centos:7 bash

执行命令

# 查看内核版本号
uname -r

# 关闭防火墙

systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

因为容器没有内核,这些命令可能会失败。

解压安装

看好在容器里再执行!(就是hostanme是一些字母)

这里原计划书解压目录有点问题

tar -zxvf /opt/docker/docker-local.tar.gz -C  /opt/docker
rm -ivf /etc/yum.repos.d/*.repo
vi /etc/yum.repos.d/docker-ce.repo

写入:
i 插入 wq保存

[docker]
name=docker ce
baseurl=file:///opt/docker
gpgcheck=0
enabled=1
gpgkey=file:///opt/docker/gpg

[centos]
name=centos
baseurl=file:///opt/centos
gpgcheck=0
enabled=1

安装

yum clean all


yum -y install deltarpm libxml2-python python-deltarpm createrepo
createrepo -d /opt/docker/repodata
yum clean all
yum makecache fast

这里失败了,估计是没内核的事情,但按理说应该可以成功。

云与虚拟化_实验1

实验1

下载使用虚拟机

然后快照回溯到init

网络:

推荐改为NAT模式:

开机就好啦

实验1 安装和使用Docker

登录名:

root
openstack

步骤1、2 关闭防火墙和SELinux

systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

# 关闭SELinux
setenforce 0
# i 进入输入模式,ESC+:wq 退出编辑模式
vi /etc/selinux/config

把SELINUX 改为:
SELINUX=disabled

步骤3 修改网卡配置信息

可能更简单方法

nmtui

改信息:

改成自动然后删掉IP

【俩ESC】
reboot

登录后输入

ip addr

这个就是IP地址啦

修改DNS

vi /etc/sysconfig/network-scripts/ifcfg-ens33

加入DNS1=114.114.114.114

重启下网络

测试与外网的连通性。

[root@node-a ~]# ping -c 4 www.sina.com.cn
PING ww1.sinaimg.cn.w.alikunlun.com (27.221.120.196) 56(84) bytes of data.
64 bytes from 27.221.120.196 (27.221.120.196): icmp_seq=1 ttl=128 time=1.07 ms
64 bytes from 27.221.120.196 (27.221.120.196): icmp_seq=2 ttl=128 time=0.348 ms
64 bytes from 27.221.120.196 (27.221.120.196): icmp_seq=3 ttl=128 time=0.553 ms
64 bytes from 27.221.120.196 (27.221.120.196): icmp_seq=4 ttl=128 time=0.449 ms

--- ww1.sinaimg.cn.w.alikunlun.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 4015ms
rtt min/avg/max/mdev = 0.348/0.606/1.074/0.279 ms
[root@node-a ~]#

SSH连接

在cmd里

ssh root@192.168.59.128 (这里是你的ip)

输入yes

4.更新yum仓库信息

yum -y update

5. 配置时间同步

yum –y install ntpdate
ntpdate ntp.aliyun.com

6 7 8. 安装docker

yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2

# 中科大镜像源
yum-config-manager --add-repo http://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

yum makecache fast

选择并且安装

yum list docker-ce --showduplicates | sort -r

安装

yum install –y docker-ce.x86_64 3:24.0.6-1.el7

11.开机自启、开机启动


systemctl start docker
systemctl enable docker

12. 查看docker进程

ps -ef | grep docker
docker version

[root@node-a ~]# ps -ef | grep docker
root       2024      1  0 15:29 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       2171   1452  0 15:30 pts/0    00:00:00 grep --color=auto docker
[root@node-a ~]# docker version
Client: Docker Engine - Community
 Version:           24.0.6
 API version:       1.43
 Go version:        go1.20.7
 Git commit:        ed223bc
 Built:             Mon Sep  4 12:35:25 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.6
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.7
  Git commit:       1a79695
  Built:            Mon Sep  4 12:34:28 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.24
  GitCommit:        61f9fd88f79f081d64d6fa3bb1a0dc71ec870523
 runc:
  Version:          1.1.9
  GitCommit:        v1.1.9-0-gccaecfc
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
[root@node-a ~]#

12.镜像加速器


vi /etc/docker/daemon.json

i 输入
ESC -> :wq 保存


{
  "registry-mirrors": ["https://x3n9jrcg.mirror.aliyuncs.com"]
}

13. 重启docker


[root@node-a ~]# systemctl daemon-reload
[root@node-a ~]#
[root@node-a ~]# systemctl restart docker
[root@node-a ~]#

14. 下载镜像以便于测试

docker run -dit -p 80:80 nginx:latest

打开网页测试:

实验1-2

1. 步骤1:在可联网的主机上制作docker本地安装包。

附录

删除全部容器

docker rm -f $(docker ps -aq)

-q 是ID

计算机组成原理-实验5

文章发布地址:

  1. https://type.dayiyi.top/index.php/archives/253/
  2. https://www.cnblogs.com/rabbit-dayi/p/17832279.html(更快,但是排版差一点)
  3. https://blog.dayi.ink/?p=109
  4. https://cmd.dayi.ink/H_paf5lXTb6E2Oi4xxPIYw?both (文章源站,国外CDN,比较慢)

ALU设计

只实现 + - and or 就可以啦。不用编码这么多。

这个 A、B、ALUOP是一个叫隧道的东西。

编码如下:

0 0 0 +
0 0 1 - 
0 1 0 and
0 1 1 or
1 0 0 x
1 0 1 ÷
1 1 0 比较 
1 1 1 移位

比较:

>时输出00000000
=时输出00000001
<时输出00000011

移位:

A - 二进制
B - 向左移动几位 (仅前三位有效)

模拟运算

加法

1+2 = 3

减法

2-1 = 1

AND运算

OR 运算

乘法运算

$1*2 = 2$

除法运算

$2/4 = 2$

比较运算

大于输出0

等于输出1

小于输出2

移位运算

设计汉字显示系统

0. 任务分解

0.1 什么是国标 GB2312-1980

1981-05-01实施 根据2017年第7号公告和强制性标准整合精简结论,自2017年3月23日起,该标准转化为推荐性标准,不再强制执行。
  • GB2312 就是那个跟UTF-8相互转换,直接暴力读取得到著名的“锟斤拷烫烫烫”。

https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=5664A728BD9D523DE3B99BC37AC7A2CC

由两个8位二进制组成一个位,16位二进制表示一个字符

总共94*94 的格子

  • 区位码=区号+位号[1-94,1-94]
  • 国标码=区位码+32[(1-94)+32,(1-94)+32]

0.2 分解

  • 设计一个汉字显示系统,可以显示一首诗。
  • 分解为以下子任务:

    1. 需要一个显示器来显示汉字。
    2. 需要一个驱动显示器的芯片。
    3. 需要进行地址和字符位置的对应。
    4. 需要一个字库来存储汉字的点阵信息。
    5. 需要一个计算器来将汉字的编码转换为区位码。
    6. 需要将诗句存储到ROM中。
    7. 需要一个触发器来不断计数,从ROM中读取下一个地址的诗句并显示。

1.先把计算机组成原理4的“阵列”画出来

因为是 8个16K 32 位寄存器,所以要这样画

10位是1KB(1024byte)

10位 * 2^4 = 16KB

2. 把ROM加载上数据

根据国标 GB2312-1980,设计一个包含所有汉字的字库。
每个汉字用一个16位的二进制数表示,总共有94*94个汉字。

将字库存储到ROM中。

  1. 找到这8个文件

  1. 然后找到你滴电路图!

点击加载数据

  1. 要对应好。
hz0 -> D1
hz1 -> D2
hz2 -> D3
hz3 -> D4
hz4 -> D5
hz5 -> D6
hz6 -> D7
hz7 -> D8

这样就把字库加载进来了。

其实就是把编码对应到点阵的译码器。

字库,没那么高级,就是把一个字符的在阵列上的哪个点给打印出来了。

这个电路的作用是,输入一个按区位码排列的字库中的序号,因为这个库只有

3. 封装

  1. 点这个

  1. 你要调整好这几个引脚顺序,第一个是D1 最下面一个是D8

对应的时候,点任意一个针脚,然后右下角会出现在原理图中的对应的位置:

  1. 然后你可以自己调一调,写点字什么的,就可以了。

4. 显示字的电路

  1. 先新建电路:

  1. 然后把他拖出来,画个电路图

5. 显示字

国标码
  1. 查表:

比如说你要显示这个"豆"

对应的是22区25

  1. 计算
  • A等于区
  • B等于该区第几个

$(A - 1) * 94 + (B-1)$

$(22-1)*94+(25-1)=1998$

这个1998就是第1998个字,对于编码来说,地址要顺序编码比较省空间,但是对于咱们来说,xx区xx个字比较符合我们的认知

  1. 转换为二进制:
>>> bin(int("1998",10))
'0b11111001110'
>>>

11111001110

具体的:

00011111001110
前导零补上,使总共14位
也可以倒着填进去

这就出来了。

你也可以这样

用这个信息与编码.exe来直接换

总之,咱们需要把A区第B个字符,换成区位码。

6. 计算器电路

也就是把区位码转换为第几个字。

把上述的计算过程自动化,也就是自动区位码。

考虑:输入一个数字,输出相应的区位码

而对于这些芯片的存储,咱们为了方便,直接导入,但会导致把两两个16e二进制读成一个32位进制。

6.1 问题

为了方便,我们直接在文本里存储2913,表示"江"这个字。

但是,存储到ROM中,再读出来会导致读出来的是16进制。

  • 2913 江
  • 读出来就是0x2913 而不是 0x29 和 0x13
  • 并且 这个2913是十进制下的意义。
  • 29表示29区,13表示第13个。

  • 但是我们读入的是0x2913(16进制下)这样就会出现问题。

6.2 如何分开

  • 考虑如何分开?
  • 其实很简单,先分成 0x29(16位二进制) 0x13(16位二进制),这一步用分离器即可。

为什么可以直接分?

0x29
00101001
观察一下,0x2对应0010,0x9 对应1001
是不是正好前8位和后八位!
  • 对于0x29

    • 再次分离 0x2(前8位) 和 0x9(后8位)
    • 然后 0x2*10 + 0x9 = 0x1d = 29(十进制)
  • 对于0x13

    • 同理,0x1 0x3
    • 0x1*10 +0x3 = 0xd = 13 (十进制)

6.3 具体实现

具体实现就简单啦。

把这个十六进制分开,分离一次,再加起来。

0x41
你要把这个0x41

然后再把它带入到AB运算一下即可。

最后的电路

输入29,13。输出2644

也就是输入区位码,输出在GB2312的第几个字。

6.4 更换数据

输入A 0x41
输入B 0x29

输出十进制下的3788

这里我分了两位出来,然后又合起来,计算

$4 * 10 + 1 = 41$(十进制)
$2 * 10 + 9 = 29$ (十进制)

这样先分开再合起来。

最后实现计算器电路:

跟指导书上是一个了。

7. 测试

输入0x410x29

输出"山"

8. 编码文字

我在干什么)

  • 直接编码出就来了。
  • 4129 是区位码 41区第29个字,要算出第几个字,但是我们的计算电路已经将这个过程实现完成。
  • 所以我们需要把古诗文转换为:区位码,区位码和区位码之间空格隔开即可。

<!--
因为区位码和汉字非常好转换,网上的工具也非常的多。

但是想要这个41和29就比较难了。

实际上,也不是那么需要这个41和29,只需要两个数按规定计算出来得出3788即可。

所以想法子把他转回来。

还记得计算公式吗?

$(A - 1) * 94 + (B-1) =RES$

AB的范围:

区位码把GB2312字符集分为94个区,每区含有94个位,共8836个码位,其中部分码位未安排字符。
  • $A \le 94$
  • $B \le 94$

很显然,这两个条件没法直接解方程。

这样就可以啦。

没法逆推就暴力,反正只需要结果是3788,实际上得到3788,A B 应该也是唯一的。你可以自己想一想,如果有解,则AB是唯一解。

ls = list(map(int,input().split()))
ans = []
def calc(res):
  # 遍历可能的A和B的值
  for A in range(1, 95):
    for B in range(1, 95):
      if (A - 1) * 94 + (B - 1) == res:
        print(f"A: {A}, B: {B}")
        return (A,B)
for i in ls:
  ans.append(calc(i))
print("ans:")
print(ans)
for i,v in enumerate(ans):
  if v==None:
    print("[error]:"+str(ls[i]))
    continue
  print("%02d%02d"%(v[0],v[1]),end=" ")

这样就可以把你好呀转换出来。

4002 2904 5342 0431 4002 2904 5342


-->

9. 江雪

注意,英文字符可能会转换失败!

《江雪》【唐】柳宗元,千山鸟飞绝,万径人踪灭。孤舟蓑笠翁,独钓寒江雪。

区位码:

0122 2913 4909 0123 0130 4438 0131 3388
5558 5210 0312 3907 4129 3681 2341 3088
0312 4582 3022 4043 5557 3580 0103 2534
5459 4382 8350 4644 0312 2232 2186 2614
2913 4909 0103 

如果字数比较多的话,要回车的话也挺麻烦的

写错了的脚本的部分,舍不得扔掉

ls = list(map(int,input().split()))
ans = []
for i in ls:
  if not 0000<=i<=9999:
    print("error_not4:"+str(ls[i]))
    continue
  ans.append((i//100,i%100))
print("----------------------------")
f = open("out_res","w")
f.write("v2.0 raw\n")
print("v2.0 raw")
cnt = 0
for i,v in enumerate(ans):
  cnt+=1
  if v==None:
    print("[error]:"+str(ls[i]))
    continue
  print("%02d%02d"%(v[0],v[1]),end=" ")
  f.write("%02d%02d "%(v[0],v[1]))
  if cnt==8:
    cnt = 0
    print()
    f.write("\n")
print()

然后把这个文件导入即可

另外,这种负的就是转换错了的,你输入的可能是英文

10.导入数据

11.效果

GIF:

12. 4字

有些时候,有人不是很喜欢玩原神(我自己也不玩),那样如何让我喜欢上玩原神呢?

一下来4个屏幕!

滚字

在计数器信号,每个显示器加1,然后这样,就可以滚字了。

GIF:

滚字-核舟记

明有奇巧人曰王叔远,能以径寸之木,为宫室、器皿、人物,以至鸟兽、木石,罔不因势象形,各具情态。尝贻余核舟一,盖大苏泛赤壁云。舟首尾长约八分有奇,高可二黍许。中轩敞者为舱,箬篷覆之。旁开小窗,左右各四,共八扇。启窗而观,雕栏相望焉。闭之,则右刻“山高月小,水落石出”,左刻“清风徐来,水波不兴”,石青糁之。船头坐三人,中峨冠而多髯者为东坡,佛印居右,鲁直居左。苏、黄共阅一手卷。东坡右手执卷端,左手抚鲁直背。鲁直左手执卷末,右手指卷,如有所语。东坡现右足,鲁直现左足,各微侧,其两膝相比者,各隐卷底衣褶中。佛印绝类弥勒,袒胸露乳,矫首昂视,神情与苏、黄不属。卧右膝,诎右臂支船,而竖其左膝,左臂挂念珠倚之——珠可历历数也。舟尾横卧一楫。楫左右舟子各一人。居右者椎髻仰面,左手倚一衡木,右手攀右趾,若啸呼状。居左者右手执蒲葵扇,左手抚炉,炉上有壶,其人视端容寂,若听茶声然。其船背稍夷,则题名其上,文曰“天启壬戌秋日,虞山王毅叔远甫刻”,细若蚊足,钩画了了,其色墨。又用篆章一,文曰“初平山人”,其色丹。通计一舟,为人五;为窗八;为箬篷,为楫,为炉,为壶,为手卷,为念珠各一;对联、题名并篆文,为字共三十有四。而计其长曾不盈寸。盖简桃核修狭者为之。嘻,技亦灵怪矣哉!

转换出来:

v2.0 raw
3587 5148 3870 3941 4043 5227 4585 4269 
5222 0312 3660 5052 3022 2071 5414 3630 
0312 4610 2512 4250 0102 3887 3583 0102 
4043 4679 0312 5052 5433 3681 4262 0102 
3630 4215 0312 5672 1827 5082 4238 4783 
4846 0312 2487 3063 3973 4412 0103 1902 
7461 5164 2643 5459 5027 0312 2439 2083 
4353 2326 1964 1758 5238 0103 5459 4255 
4618 1904 5228 1643 2354 5148 3870 0312 
2463 3141 2294 4282 4877 0103 5448 4889 
1908 5363 4610 1853 0312 8372 3781 2418 
5414 0103 3752 3110 4801 2016 0312 5583 
5150 2487 4336 0312 2518 1643 4140 0103 
3884 2016 2288 2559 0312 2181 3224 4764 
4591 4941 0103 1753 5414 0312 5282 5150 
3144 0116 4129 2463 5234 4801 0312 4314 
3468 4215 1986 0117 0312 5583 3144 0116 
3969 2371 4876 3220 0312 4314 1808 1827 
4843 0117 0312 4215 3964 8454 5414 0103 
2012 4523 5588 4093 4043 0312 5448 2275 
2558 2288 2264 8755 5363 4610 2211 3834 
0312 2380 5101 3051 5150 0312 3419 5417 
3051 5583 0103 4353 0102 2738 2518 5236 
5027 4254 3077 0103 2211 3834 5150 4254 
5420 3077 2243 0312 5583 4254 2407 3419 
5417 1719 0103 3419 5417 5583 4254 5420 
3077 3609 0312 5150 4254 5424 3077 0312 
4071 5148 4389 5179 0103 2211 3834 4754 
5150 5567 0312 3419 5417 4754 5583 5567 
0312 2487 4602 1864 0312 3868 3329 4705 
4764 1740 5363 0312 2487 5094 3077 2155 
5034 8162 5448 0103 2380 5101 3088 3264 
3554 3253 0312 4427 4856 3422 4073 0312 
2935 4255 1626 4251 0312 4181 3973 5175 
4353 0102 2738 1827 4284 0103 4652 5150 
4705 0312 5816 5150 1759 5407 2012 0312 
2288 4290 3868 5583 4705 0312 5583 1759 
2550 3678 5473 5048 5414 0110 0110 5473 
3141 3290 3290 4293 5018 0103 5459 4618 
2665 4652 5027 7314 0103 7314 5583 5150 
5459 5551 2487 5027 4043 0103 3051 5150 
5363 5521 8757 4986 3570 0312 5583 4254 
5048 5027 2666 3630 0312 5150 4254 3742 
5150 5426 0312 4084 4805 2684 5520 0103 
3051 5583 5363 5150 4254 5420 3849 3191 
4140 0312 5583 4254 2407 3415 0312 3415 
4147 5148 2688 0312 3868 4043 4251 2243 
4061 2837 0312 4084 4493 1872 4189 4027 
0103 3868 2012 1719 4152 5036 0312 5282 
4466 3591 3868 4147 0312 4636 5227 0116 
4476 3884 4041 4871 3979 4053 0312 5161 
4129 4585 5067 4269 5222 2406 3144 0117 
0312 4724 4084 4635 5567 0312 2519 2713 
3343 3343 0312 3868 4111 3611 0103 5154 
5135 5513 5334 5027 0312 4636 5227 0116 
1985 3829 4129 4043 0117 0312 3868 4111 
2104 0103 4508 2838 5027 5459 0312 4610 
4043 4669 0327 4610 2016 1643 0327 4610 
8372 3781 0312 4610 7314 0312 4610 3415 
0312 4610 2688 0312 4610 4254 3077 0312 
4610 3678 5473 2487 5027 0327 2252 3310 
0102 4466 3591 1802 5513 4636 0312 4610 
5554 2518 4093 4214 

字数有点多,加下位宽:


GIF:

瞬间显示--戒子篇

直接生成4个数据文件:

那样如何编码下字符?

没关系,在刚才的脚本上改一改

夫君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。夫学须静也,才须学也。非学无以广才,非志无以成学。淫漫则不能励精,险躁则不能治性。年与时驰,意与日去,遂成枯落,多不接世。悲守穷庐,将复何及!
def quwei_to_char(area, pos):
    byte1 = area + 0xA0
    byte2 = pos + 0xA0
    gb2312_bytes = bytes([byte1, byte2])
    return gb2312_bytes.decode('gb2312')

def split_input_to_files(input_codes):
    ans = []
    for code in input_codes:
        if not 0000 <= code <= 9999:
            print("error_not4:" + str(code))
            continue
        ans.append((code // 100, code % 100))

    # 按照位置分配汉字到不同的文件
    files_content = {1: "", 2: "", 3: "", 4: ""}
    for i, (area, pos) in enumerate(ans):
      file_number = (i % 4) + 1
      files_content[file_number] += "%02d%02d "%(area,pos)

    # 保存到文件
    for file_number in range(1, 5):
        with open(f"file_{file_number}.txt", "w", encoding='utf-8') as file:
          content = files_content[file_number]
          words = content.split()
          output = ""
          for i, word in enumerate(words):
            output += word + " "
            if (i + 1) % 8 == 0:  # 每8个单词添加一个换行符
              output += "\n"
          file.write("v2.0 raw\n")
          file.write(output)

# 测试
input_codes = [4126, 3927, 4421, 4527, 4633] # 一二三四五 的区位码
input_codes = list(map(int,input().split()))
print("待转换内容:")
for i in input_codes:
  print(quwei_to_char(i // 100,i % 100),end="")
split_input_to_files(input_codes)

然后自动生成数据文件

数据文件1:

v2.0 raw
2382 4848 4862 5052 2339 5052 2339 5052 
2382 5018 4907 4907 1837 4662 0103 1827 
0312 1827 0103 1959 4053 1941 2264 0103 
3414 2646 

数据文件2:

v2.0 raw
3093 0312 4177 4988 2113 3587 3694 5434 
4907 0312 5018 4662 0312 5052 5089 3660 
4753 3660 3674 0312 4005 3161 1827 1715 
0312 2816 

数据文件3:

v2.0 raw
5551 3018 0312 2134 1820 5430 3018 5222 
4875 1837 0103 5052 2339 1941 3494 3288 
5274 5446 5175 5066 0312 3468 2951 4256 
2911 0301 

数据文件4:

v2.0 raw
5414 5052 2883 0103 4662 0312 4662 0103 
3018 4875 2339 2567 5430 4907 5282 3011 
5282 4852 4217 5175 4376 0312 4232 3978 
2420 

加载数据:

GIF:

横过来;

有点..

GIF:

记得最后添加

XXX大学 XXX

姓。x名部分不放网上啦。

0xff:文件下载

https://p.dabbit.net/blog/pic_bed/sharex/_pn-2023-11-14-18-31-17_Quadrisectus_Masculine_Navajowhite.rar

协议分析11 RIP

更好的阅读体验:
  1. https://type.dayiyi.top/index.php/archives/248/
  2. https://blog.dayi.ink/?p=98
  3. https://www.cnblogs.com/rabbit-dayi/p/17826058.html
  4. https://cmd.dayi.ink/nKnLEJJuQACUW2qAPCjbAQ

让我R.I.P,吧,11个作业。

插电,开机

步骤和要求

1)选择样例中的RIPv1&v2,打开网络拓扑;(可以自己设计拓扑或在样例的基础上修改)
2)启动设备;
3)从任意路由器端口启动wireshark,捕获报文。
4)将其中的路由器端口shutdown,过一段时间再undo shutdown,观察RIP报文的变化。
2、分析其中的RIP报文。
四、实验报告
分别针对RIPv1和RIPv2,回答下面的问题:
1、验证RIP协议的版本、使用的传输层协议及端口号、各种定时器的设置时间等。
2、给出协议报文截图并进行分析RIP协议工作过程。
1)RIP定时更新过程
2)RIP发现拓扑结构变化后的更新过程
3)RIP慢收敛的过程
附华为相关配置命令:
rip split-horizon   配置水平分割 (RIP 2 默认打开)
rip poison-reverse  配置毒性逆转

实验过程:

好有目的性,好评

我这里找了AR1抓包

跟交换机的那个接口

开始抓包后

停止设备:

开机:

RIPV1


40多个估计差不多了

WOW

它把包,发到了FF:FF:FF:FF:FF:FF

然后就不管了。

请求包

Routing Information Protocol 
    Command: Request (1) # 命令:请求(1),表示这个RIP消息是一个请求,用于从其他路由器获取路由信息。
    Version: RIPv1 (1) # 版本:RIPv1(1)
Address not specified, Metric: 16 # 地址未指定,度量值为16,估计可以拿全部的包
    Address Family: Unspecified (0) # 地址族:未指定(0),表示这个请求不是针对特定类型的地址(如IP地址)。
    Metric: 16 # 度量值:16,距离无穷大

回应包

#udp包
User Datagram Protocol, Src Port: 520, Dst Port: 520
    Source Port: 520 #源端口
    Destination Port: 520 #目的端口
    Length: 52 #长度
    Checksum: 0x515f [unverified] #checksum
    [Checksum Status: Unverified]
    [Stream index: 0]
    [Timestamps]
    UDP payload (44 bytes)
    
Routing Information Protocol
    Command: Response (2) # 命令类型:回应(2)
    Version: RIPv1 (1) # 版本:RIPv1(1)
    IP Address: 10.0.1.0, Metric: 1 
        Address Family: IP (2) # 地址族:IP(2)
        IP Address: 10.0.1.0 # IP地址:10.0.1.0,具体的网络地址。
        Metric: 1 # 度量值:1
    IP Address: 10.0.14.0, Metric: 16
        Address Family: IP (2) # 地址族:IP(2)
        IP Address: 10.0.14.0 # IP地址:10.0.14.0,具体的网络地址。
        Metric: 16 # 度量值:16

1、验证RIP协议的版本、使用的传输层协议及端口号、各种定时器的设置时间等。

  • 版本:RIPV1
  • 传输层协议:UDP
  • 端口号:520
  • 计时器:差不多30s

如果想了解更多关于华为路由器的RIP协议配置和定时器设置,建议查阅华为路由器的官方文档或咨询华为技术支持。

sys
display rip

  • Update time(更新时间):30秒,表示每30秒发送一次更新的路由信息。
  • Age time(老化时间):180秒,表示当一条路由信息在180秒内没有收到更新时,将被视为过时并从路由表中删除。
  • Garbage-collect time(垃圾回收时间):120秒,表示在路由信息过时后,等待120秒后将其从路由表中删除。
  • Triggered updates sent(触发更新发送次数):2次,表示在发生路由变化时,会立即发送更新的路由信息。

2、给出协议报文截图并进行分析RIP协议工作过程。

已经分析啦

2、1)RIP定时更新过程

按时间推断差不多是30s一个。

  • 定期更新:RIP路由器每隔30秒向它的所有邻居发送完整的路由表。这被称为定时更新。这样做是为了维护网络中所有路由器的路由信息的最新状态。
  • 跳数计算:在更新的过程中,每经过一个路由器,跳数加一。RIP规定路由的最大跳数为15,超过15则认为目的地不可达。
  • 路由信息整合:当一个路由器接收到邻居路由器的路由表时,它会将这些信息与自己的路由表进行比较和整合,更新自己的路由表。

路由表

sys
dis ip routing-table

可以看到这4个是RIP更新的。

2、2)RIP发现拓扑结构变化后的更新过程

发现路由器寄了的时候,会直接广播相关的路由信息

当路由器又好了的时候,又广播可以了。目前距离是1:

  • 触发更新:当路由器发现拓扑变化(如某个路由变得不可达或有更好的路径)时,它会立即生成一个触发更新消息,而不是等待下一个定期更新。
  • 更新邻居:这个触发更新消息被发送给所有邻居路由器,通知他们有关这些变化。
  • 邻居路由器处理:接收到触发更新的路由器会立即更新其路由表,并可能触发它们自己的触发更新。
rip split-horizon   配置水平分割  (RIP 2 默认打开)
rip poison-reverse  配置毒性逆转

这两个命令没成功用上

2、3)RIP慢收敛的过程

计数到无穷:RIP使用计数到无穷的方法来解决路由环路问题。当路由器无法到达某个网络时,它会将该网络的跳数设置为16(认为是无穷大)。

慢速更新:由于RIP使用定期更新和触发更新,当网络拓扑发生变化时,这些信息需要一定时间才能传播到所有路由器。这导致RIP在适应网络变化方面相比较其他协议(如OSPF或EIGRP)较慢,这种现象被称为慢收敛。

霍尔定律:这种慢收敛可能导致临时的路由环路和不稳定,直到所有路由器的路由表都收敛到新的稳定状态。这个收敛过程可能需要几分钟的时间。

分割水平(Split Horizon)
定义:分割水平规则指出,路由器不应该将任何路由信息发送回它原来学习到该信息的接口。简而言之,就是“不要将信息发送回源头”。

毒性逆转(Poison Reverse)
定义:毒性逆转是分割水平的一个增强。当路由器通过一个接口学习到某个路由,且该路由变得不可达时,路由器会通过同一个接口宣告这个路由为“毒性”(即设置度量值为无穷大,通常为16)。

比如寄了就会直接拉到16:

而且速度蛮快的。

启动差不多40s

差不多重新建树大概20s,也挺慢

RIPV2

调到version2

4个都要

sys
rip
version 2

让R3寄掉

先看现在的路由表

然后让他寄掉(关机)

消失了。

再开机:

又回来了。

包:


这里还是1

下一个就是16了。

请求

Routing Information Protocol
    Command: Request (1)
    Version: RIPv2 (2) 
    Address not specified, Metric: 16
        Address Family: Unspecified (0)
        Route Tag: 0
        Netmask: 0.0.0.0
        Next Hop: 0.0.0.0
        Metric: 16 #这个还是16,剩下的都是0

回应

Routing Information Protocol 
    Command: Response (2) # 命令:响应(2)
    Version: RIPv2 (2) # 版本:RIPv2(2)

    IP Address: 10.0.3.0, Metric: 1 # IP地址:10.0.3.0,度量值:1。
        Address Family: IP (2) # 地址族:IP(2),表示该路由条目用于IP网络。
        Route Tag: 0 # 路由标签:0,通常用于区分不同来源的路由信息。
        IP Address: 10.0.3.0 # IP地址:10.0.3.0,标识目的网络的IP地址。
        Netmask: 255.255.255.0 # 网络掩码:255.255.255.0,用于确定网络地址的范围。
        Next Hop: 0.0.0.0 # 下一跳:0.0.0.0,表示直接连接的网络,不需要通过其他路由器。
        Metric: 1 # 度量值:1,表示到达该网络的跳数或成本,这里是最低成本。

    IP Address: 10.0.123.0, Metric: 16 
        Address Family: IP (2) # 地址族:IP(2),同上。
        Route Tag: 0 # 路由标签:0,同上。
        IP Address: 10.0.123.0 # IP地址:10.0.123.0,标识另一个目的网络。
        Netmask: 255.255.255.0 # 网络掩码:255.255.255.0,同上。
        Next Hop: 0.0.0.0 # 下一跳:0.0.0.0
        Metric: 16 # 度量值:16,不可达的标志。
Routing Information Protocol
    Command: Response (2)
    Version: RIPv2 (2)
    IP Address: 10.0.3.0, Metric: 1
        Address Family: IP (2)
        Route Tag: 0
        IP Address: 10.0.3.0
        Netmask: 255.255.255.0
        Next Hop: 0.0.0.0
        Metric: 1
    IP Address: 10.0.123.0, Metric: 1
        Address Family: IP (2)
        Route Tag: 0
        IP Address: 10.0.123.0
        Netmask: 255.255.255.0
        Next Hop: 0.0.0.0
        Metric: 1 #度量值

UDP部分:

User Datagram Protocol, Src Port: 520, Dst Port: 520
    Source Port: 520
    Destination Port: 520
    Length: 52
    Checksum: 0x0551 [unverified]
    [Checksum Status: Unverified]
    [Stream index: 4]
    [Timestamps]
    UDP payload (44 bytes)

1、验证RIP协议的版本、使用的传输层协议及端口号、各种定时器的设置时间等。

根据上面的信息:

  • 版本:2
  • 传输:UDP
  • 端口:520
sys
dis rip

  • 定时器设置时间:

    • 更新时间(Update time):30秒,
    • 老化时间(Age time):180秒
    • 垃圾收集时间(Garbage-collect time):120秒

2、给出协议报文截图并进行分析RIP协议工作过程。

已经分析啦

2、1)RIP定时更新过程

RIP使用周期性更新来维护其路由表。每隔30秒(更新时间),RIP路由器会向所有RIP邻居发送整个路由表。
从提供的数据包中可以看到,RIP响应(Response)消息被定期发送到多播地址224.0.0.9。
RIP拓扑变化后的更新过程:

2、2)RIP发现拓扑结构变化后的更新过程

当RIP路由器检测到路由信息变化时(例如,链路故障或新路由的添加),它会立即发送触发更新(triggered update)。
这些更新不遵循正常的30秒周期,而是立即发送,以快速传播拓扑变化信息。

2、3)RIP慢收敛的过程

RIP是一种距离向量路由协议,其收敛过程相对较慢。这是因为更新是周期性的,且每次只传播到相邻路由器。
在某些情况下,例如“计数到无穷”问题,这可能导致路由环路和不稳定。

ripv1 ripv2

  • 子网掩码支持:RIPv1不支持子网掩码,它假设所有网络都在相同的子网上。RIPv2增加了对子网掩码的支持,这允许更有效地处理不同大小的子网和超网
  • 多播更新:RIPv1使用广播来发送整个路由表到所有网络设备,这可能会导致网络上不必要的流量。RIPv2改进了这一点,采用多播地址224.0.0.9发送更新,减少了不必要的网络流量和负载。
  • 路由认证:RIPv2引入了简单的密码认证机制,这可以提高路由更新的安全性。
  • 路由标记(Route Tagging):RIPv2支持路由标记,这使得它可以与其他不同类型的路由协议(如OSPF或BGP)更好地集成。路由标记可以用来表示路由信息的来源。
  • 更好的可扩展性和灵活性:由于支持子网掩码和路由标记
  • 支持可变长度子网掩码(VLSM):与RIPv1只支持固定长度子网掩码(FLSM)相比,RIPv2的支持可变长度子网掩码对于IP地址的有效使用和网络规划非常重要。

文件下载

https://p.dabbit.net/ctf/实验11.rar