更改文件夹名称
112
Article/Studyroad/vivado_ip.md
Normal file
@@ -0,0 +1,112 @@
|
||||
# Vivado使用乘法器、除法器IP核实现乘除取余仿真
|
||||
### 环境
|
||||
Vivado 20.2
|
||||
## 添加并配置IP核
|
||||
1. 打开vivado,找到对应IP核,如下图
|
||||

|
||||
2. 先双击除法器IP核进入配置页面,如下图
|
||||

|
||||

|
||||
除法器配置默认即可,点击OK;后弹出界面,点击Generate
|
||||
如下图即配置完成
|
||||

|
||||
3. 配置乘法器IP核
|
||||

|
||||
上图使用十六位有符号数与十六位无符号数进行运算
|
||||

|
||||
上图输出32位,间隔一个周期得到结果(电脑性能不佳可适当增加)
|
||||
4. 如下图即配置完成
|
||||

|
||||
## 添加并编写仿真代码文件
|
||||
1. 选择一个文件夹,创建例如ipcore_test.v文件
|
||||
2. 添加文件到vivado
|
||||

|
||||

|
||||
找到自己创建的.v文件路径并添加
|
||||
3. 完成如下图
|
||||

|
||||
4. 复制示例代码
|
||||

|
||||
双击打开.veo 示例代码文件
|
||||

|
||||
复制上图红框中的代码到自己的仿真文件,如下图(我这是外部编辑器,vivado自带编辑器同理)
|
||||

|
||||
上图的module与endmodule需要自己添加
|
||||
如下图,可以看到,除法器IP核在你自己的代码文件之下,表示被正确调用
|
||||

|
||||
乘法器同理,打开.veo文件复制代码
|
||||

|
||||

|
||||
示例代码复制完成后如下图,这里我更改了实例名称(u_ 开头,不改没影响)
|
||||

|
||||
5. 最后自己补全仿真代码,我这里这样写
|
||||
```verilog
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
module tb_ipcore_test();
|
||||
reg clk; //时钟变量
|
||||
reg signed [15:0] A; //有符号因数数据
|
||||
reg unsigned [15:0] B; //无符号因数数据
|
||||
wire signed [31:0] P; //乘法器结果
|
||||
|
||||
reg dividend_tvalid; //被除数有效使能,高为有效,低为无效
|
||||
reg signed [15:0] dividend_tdata; //被除数数据
|
||||
reg divisor_tvalid; //除数有效使能,高为有效,低为无效
|
||||
reg signed [15:0] divisor_tdata; //除数数据
|
||||
wire dout_tvalid; //输出电平,高为正确输出,低为错误输出
|
||||
wire [31:0] dout_tdata; //除法器结果
|
||||
wire signed [15:0] quotient; //商
|
||||
wire signed [15:0] remainder; //余数
|
||||
|
||||
|
||||
mult_gen_0 u_mult_gen_0 (
|
||||
.CLK(clk), // input wire CLK
|
||||
.A(A), // input wire [15 : 0] A
|
||||
.B(B), // input wire [15 : 0] B
|
||||
.P(P) // output wire [31 : 0] P
|
||||
);
|
||||
|
||||
div_gen_0 u_div_gen_0 (
|
||||
.aclk(clk), // input wire aclk
|
||||
.s_axis_divisor_tvalid(divisor_tvalid), // input wire s_axis_divisor_tvalid
|
||||
.s_axis_divisor_tdata(divisor_tdata), // input wire [15 : 0] s_axis_divisor_tdata
|
||||
.s_axis_dividend_tvalid(dividend_tvalid), // input wire s_axis_dividend_tvalid
|
||||
.s_axis_dividend_tdata(dividend_tdata), // input wire [15 : 0] s_axis_dividend_tdata
|
||||
.m_axis_dout_tvalid(dout_tvalid), // output wire m_axis_dout_tvalid
|
||||
.m_axis_dout_tdata(dout_tdata) // output wire [31 : 0] m_axis_dout_tdata
|
||||
);
|
||||
assign quotient = dout_tdata[31:16]; //除法器16位余数模式,高16位是商,低十六位是余数
|
||||
assign remainder = dout_tdata[15:0];
|
||||
always #5 clk = ~clk; //10ns周期时钟
|
||||
|
||||
initial begin
|
||||
clk = 0;
|
||||
|
||||
A = 16'h7FFF;
|
||||
B = 16'hFFFF;
|
||||
dividend_tvalid = 1;
|
||||
dividend_tdata = 16'h7FFF;
|
||||
divisor_tvalid = 1;
|
||||
divisor_tdata = 16'hFFFF;
|
||||
#300;
|
||||
|
||||
A = 16'h8001;
|
||||
B = 16'h0001;
|
||||
dividend_tvalid = 1;
|
||||
dividend_tdata = 16'h8001;
|
||||
divisor_tvalid = 1;
|
||||
divisor_tdata = 16'hFFFF;
|
||||
#300;
|
||||
|
||||
$finish;
|
||||
end
|
||||
endmodule
|
||||
```
|
||||
|
||||
6. 结果分析
|
||||
选中除B之外的所有变量,调整为有符号的十进制,B调整为无符号的十进制数
|
||||

|
||||
下图可以看到,乘法器得到数据(一开始),在第一个周期得到结果,除法器得到数据,在第二十个周期得到结果
|
||||

|
||||
|
||||
|
||||
BIN
Article/Studyroad/vivado_ip_img/IPCore01.png
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore02.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore03.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore04.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore05.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore06.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore07.png
Normal file
|
After Width: | Height: | Size: 143 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore08.png
Normal file
|
After Width: | Height: | Size: 178 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore09.png
Normal file
|
After Width: | Height: | Size: 217 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore10.png
Normal file
|
After Width: | Height: | Size: 148 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore11.png
Normal file
|
After Width: | Height: | Size: 146 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore12.png
Normal file
|
After Width: | Height: | Size: 196 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore13.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore14.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore15.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore16.png
Normal file
|
After Width: | Height: | Size: 176 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore17.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore18.png
Normal file
|
After Width: | Height: | Size: 125 KiB |
BIN
Article/Studyroad/vivado_ip_img/IPCore19.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
48
Article/Technology/Debian从零开始使用pnpm部署项目.md
Normal file
@@ -0,0 +1,48 @@
|
||||
## 安装nodejs22+环境
|
||||
### 使用使用 NodeSource
|
||||
首先,添加 NodeSource 的 PPA(个人包存档)
|
||||
```shell
|
||||
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
|
||||
```
|
||||
然后安装nodejs
|
||||
```shell
|
||||
apt-get install -y nodejs
|
||||
```
|
||||
### 使用n管理器
|
||||
如果你想使用 n 管理器安装最新版本,可以先安装 n
|
||||
```shell
|
||||
npm install -g n
|
||||
```
|
||||
然后使用 n 安装 Node.js 22
|
||||
```shell
|
||||
n 22
|
||||
```
|
||||
### 验证安装
|
||||
安装完成后,可以通过以下命令验证 Node.js 是否安装成功
|
||||
```shell
|
||||
node -v
|
||||
```
|
||||
## 安装pnpm
|
||||
### 若已安装npm
|
||||
版本不确定
|
||||
```shell
|
||||
npm install -g pnpm
|
||||
```
|
||||
### 使用独立脚本安装(不用安装nodejs)
|
||||
Windows PowerShell
|
||||
```shell
|
||||
Invoke-WebRequest https://get.pnpm.io/install.ps1 -UseBasicParsing | Invoke-Expression
|
||||
```
|
||||
在POSIX系统上
|
||||
```shell
|
||||
curl -fsSL https://get.pnpm.io/install.sh | sh -
|
||||
# 或者使用
|
||||
# wget -qO- https://get.pnpm.io/install.sh | sh -
|
||||
```
|
||||
安装特定的版本
|
||||
在运行安装脚本之前,你可以选择设置环境变量 PNPM_VERSION 来安装特定版本的 pnpm
|
||||
```shell
|
||||
curl -fsSL https://get.pnpm.io/install.sh | env PNPM_VERSION=<version> sh -
|
||||
```
|
||||
|
||||
|
||||
71
Article/Technology/MarkdownTest.md
Normal file
@@ -0,0 +1,71 @@
|
||||
# 这是一级标题
|
||||
|
||||
## 这是二级标题
|
||||
|
||||
### 这是三级标题
|
||||
|
||||
- 无序列表项1
|
||||
- 无序列表项2
|
||||
- 嵌套无序列表项
|
||||
- 无序列表项3
|
||||
|
||||
1. 有序列表项1
|
||||
2. 有序列表项2
|
||||
3. 有序列表项3
|
||||
|
||||
**加粗文本**
|
||||
|
||||
*斜体文本*
|
||||
|
||||
***加粗斜体文本***
|
||||
|
||||
~~删除线文本~~
|
||||
|
||||
==高亮文本1==
|
||||
|
||||
<mark>高亮文本2</mark>
|
||||
|
||||
^上角标^ 角标 ~下角标~
|
||||
|
||||
<u>下划线</u>
|
||||
|
||||
- [ ] 代办
|
||||
|
||||
- [x] 已办
|
||||
|
||||
|
||||
|
||||
> 这是一段引用内容
|
||||
> 引用内容可以换行
|
||||
|
||||
>>引用嵌套
|
||||
|
||||
行内公式: $f(x)=a-b$
|
||||
|
||||
公式:
|
||||
$$
|
||||
f(x)=a-b
|
||||
$$
|
||||
|
||||
| 表头1 | 表头2 | 表头3 |
|
||||
|-------|-------|-------|
|
||||
| 内容1 | 内容2 | 内容3 |
|
||||
| 内容4 | 内容5 | 内容6 |
|
||||
|
||||
[链接文字](https://example.com)
|
||||
|
||||
`单行代码`
|
||||
|
||||
```python
|
||||
# 多行代码块
|
||||
def hello\_world():
|
||||
print("Hello, World!")
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
分割线以上是测试内容
|
||||
|
||||
分割线以下也是测试内容
|
||||
|
||||

|
||||
2
Article/Technology/NFC_Card.md
Normal file
@@ -0,0 +1,2 @@
|
||||
# 前言
|
||||
最近迷上了三角洲
|
||||
30
Article/Technology/docker的容器和镜像的删除操作.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# Docker容器和镜像的删除操作
|
||||
## 容器和镜像的关系
|
||||
简单来说,镜像是文件,容器是进程。
|
||||
容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件。
|
||||
docker利用容器来运行应用:docker容器是由docker镜像创建的运行实例。
|
||||

|
||||
### 删除镜像的操作步骤
|
||||
#### 一、停止正在运行的镜像创建的容器
|
||||
查看正在运行的容器
|
||||
```shell
|
||||
docker ps
|
||||
```
|
||||
停止对应容器
|
||||
```shell
|
||||
docker stop xxx
|
||||
```
|
||||
xxx 是 docker ps 命令出来的容器 CONTAINER ID 的前三位
|
||||
删除对应的容器
|
||||
```shell
|
||||
docker rm xxx
|
||||
```
|
||||
查看镜像
|
||||
```shell
|
||||
docker images
|
||||
```
|
||||
同理,yyy 是 docker images 命令出来的镜像 IMAGE ID 的前三位
|
||||
删除对应的镜像
|
||||
```shell
|
||||
docker rmi yyy
|
||||
```
|
||||
5
Article/Technology/navidrome.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# 启用用户界面中的转码配置
|
||||
ND_ENABLETRANSCODINGCONFIG = true
|
||||
|
||||
# 配置ffmpeg路径
|
||||
FFmpegPath = "/usr/bin/ffmpeg"
|
||||
166
Article/Technology/在ARM架构的Ubuntu中使用Docker Compose部署MTPhotos.md
Normal file
@@ -0,0 +1,166 @@
|
||||
# 在ARM架构的Ubuntu中使用Docker Compose部署MTPhotos
|
||||
## 前言
|
||||
之前,我总是使用1panel面板的Docker进行图形化的操作,直到有一天,我遇到了一个需要三个镜像配合的项目——MTPhotos
|
||||
为什么会使用mtphotos呢,我以前都是使用老电脑装飞牛OS当作NAS使用,但是飞牛OS哪哪都挺好,就是不支持vivo的动态图片,相册里的动态图片是一张jpg一段MP4,看得我脑阔痛;而且用X86的核显老电脑安装飞牛OS,视频转码压根跑不动,如此一来,偌大个飞牛就只用来当云相册用有点心疼电费,我就把目光投向了角落的Nanopi-R5S
|
||||
好在[友善官方](https://wiki.friendlyelec.com/wiki/index.php/NanoPi_R5S/zh "友善官方R5S中文文档")一直在更新R5S的各种固件,有OpenWRT有Ubuntu,有Debian,甚至还有Proxmox的固件,我就准备用Ubuntu装个MTPhotos来试试
|
||||
## 准备工作
|
||||
### 将R5S刷入ubuntu-noble-core固件
|
||||
线刷方便得鸭皮,没有 USBA-A 的线材也可以使用卡刷,具体看上方友善官方文档
|
||||
### 装个m.2硬盘进去当docker的镜像盘
|
||||
mtphotos有三个镜像文件,需要七八个G
|
||||
### 安装个[Mobaxtrem汉化版](https://github.com/RipplePiam/MobaXterm-Chinese-Simplified "Mobaxtrem汉化版GitHub仓库")方便文件传输和SSH连接
|
||||
SSH用户是 pi 密码也是
|
||||
## 正式开始部署
|
||||
### 初始化Ubuntu
|
||||
首先当然是Linux初始化套路
|
||||
登录切root用户(懒得加sudo),密码是 pi
|
||||
```shell
|
||||
sudo -i
|
||||
```
|
||||
#### 改时区
|
||||
```shell
|
||||
timedatectl set-timezone Asia/Shanghai
|
||||
```
|
||||
#### 换源
|
||||
Ubuntu 24.04 换源方式有变
|
||||
```shell
|
||||
vim /etc/apt/sources.list.d/ubuntu.sources
|
||||
```
|
||||
用 # 注释掉之前的所有内容,添加如下内容
|
||||
```shell
|
||||
Types: deb
|
||||
URIs: http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/
|
||||
Suites: noble noble-updates noble-security
|
||||
Components: main restricted universe multiverse
|
||||
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
|
||||
```
|
||||
X86架构不需要添加 URIs 条目后的 -ports
|
||||
#### 更新
|
||||
```shell
|
||||
apt update && apt upgrade -y
|
||||
```
|
||||
### 挂载m.2硬盘
|
||||
安装 curl 和 fdisk
|
||||
```shell
|
||||
apt install curl fdisk -y
|
||||
```
|
||||
查看当前m.2硬盘路径
|
||||
```shell
|
||||
fdisk -l
|
||||
```
|
||||
格式化硬盘
|
||||
```shell
|
||||
mkfs.ext4 /dev/nvme0n1
|
||||
```
|
||||
/dev/nvm10n1 是上一步查看到的对应的m.2硬盘路径
|
||||
|
||||
获取硬盘UUID
|
||||
```shell
|
||||
blkid /dev/nvme0n1
|
||||
```
|
||||
创建挂载文件夹
|
||||
```shell
|
||||
mkdir /nvme
|
||||
```
|
||||
编辑自动挂载文件
|
||||
```shell
|
||||
vim /etc/fstab
|
||||
```
|
||||
格式如下
|
||||
```shell
|
||||
UUID=xxxx /nvme ext4 defaults 0 0
|
||||
```
|
||||
xxxx 为 blkid /dev/nvme0n1 命令获取的 UUID="xxxx" 的内容
|
||||
|
||||
重启
|
||||
```shell
|
||||
reboot
|
||||
```
|
||||
### 安装并启动Docker和Docker compose
|
||||
更新包管理工具
|
||||
```shell
|
||||
apt-get update
|
||||
```
|
||||
使用官方一键安装脚本配合阿里云镜像一键安装
|
||||
```shell
|
||||
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
|
||||
```
|
||||
启动并查看运行状态
|
||||
```shell
|
||||
service docker start
|
||||
docker version
|
||||
docker compose version
|
||||
systemctl status docker
|
||||
```
|
||||
### 配置Docker镜像加速和镜像存放路径
|
||||
```shell
|
||||
vim /etc/docker/daemon.json
|
||||
```
|
||||
按 I 进入编辑模式,配置如下
|
||||
```shell
|
||||
{
|
||||
"registry-mirrors": ["https://docker.xuanyuan.me","https://docker.1panel.live"],
|
||||
"data-root": "/nvme/docker"
|
||||
}
|
||||
```
|
||||
按 Esc 退出编辑模式,输入 :wq 保存并退出
|
||||
重载daemon.json文件
|
||||
```shell
|
||||
systemctl daemon-reload
|
||||
systemctl restart docker
|
||||
```
|
||||
### 如果一切顺利,那么该安装mtphotos了
|
||||
创建个目录
|
||||
```shell
|
||||
mkdir /opt/mtphotos
|
||||
```
|
||||
进入
|
||||
```shell
|
||||
cd /opt/mtphotos
|
||||
```
|
||||
创建并编辑docker-compose.yaml文件
|
||||
```shell
|
||||
vim docker-compose.yaml
|
||||
```
|
||||
按 I 进入编辑模式并填入以下内容
|
||||
```yaml
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
mtphotos:
|
||||
image: registry.cn-hangzhou.aliyuncs.com/mtphotos/mt-photos:arm-latest
|
||||
container_name: mtphotos
|
||||
restart: unless-stopped
|
||||
network_mode: host
|
||||
volumes:
|
||||
- /opt/mtphotos/config:/config
|
||||
- /nvme/mtphotos/upload:/upload
|
||||
environment:
|
||||
- TZ=Asia/Shanghai
|
||||
- LANG=C.UTF-8
|
||||
dns:
|
||||
- 114.114.114.114
|
||||
depends_on:
|
||||
- mtphotos_ai
|
||||
- mtphotos_face_api
|
||||
mtphotos_ai:
|
||||
image: registry.cn-hangzhou.aliyuncs.com/mtphotos/mt-photos-ai:arm-latest
|
||||
container_name: mtphotos_ai
|
||||
restart: unless-stopped
|
||||
network_mode: host
|
||||
environment:
|
||||
- API_AUTH_KEY=mt_photos_ai_extra
|
||||
mtphotos_face_api:
|
||||
image: crpi-gcuyquw9co62xzjn.cn-guangzhou.personal.cr.aliyuncs.com/devfox101/mt-photos-insightface-unofficial:arm-latest
|
||||
container_name: mtphotos_face_api
|
||||
restart: unless-stopped
|
||||
network_mode: host
|
||||
environment:
|
||||
- API_AUTH_KEY=mt_photos_ai_extra
|
||||
```
|
||||
按 Esc 退出编辑模式,输入 :wq 保存并退出
|
||||
拉取运行
|
||||
```shell
|
||||
docker compose up -d
|
||||
```
|
||||
## 如果一切顺利,那么到此结束
|
||||
9
Article/Technology/安装AD2025学习版.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# 安装Altium Designer 25.4.2 Build 15 (x64)学习版
|
||||
### 确认文件
|
||||
打开Altium Designer 25.4.2 Build 15 (x64).rar压缩包;确认里面有 !Lic 文件夹和 Installer.Exe安装程序, !Lic 文件夹中应有四个 .alf 证书文件和一个shfolder.dll文件以及一个Lic.rar压缩包(防误删备份)。
|
||||
### 安装AD
|
||||
进入解压出的Altium Designer 25.4.2 Build 15 (x64)文件夹,右键以管理员身份运行Installer.Exe安装程序;记住安装的路径,完成安装后退出AD25程序。
|
||||
### 添加学习补丁
|
||||
进入开始解压出的Altium Designer 25.4.2 Build 15 (x64)文件夹,打开 !Lic 文件夹,复制shfolder.dll和AD25_Pro.alf文件到AD25安装文件夹(没改路径一般是 C:\Program Files\Altium\AD25;内有X2.EXE文件)。
|
||||
### 添加证书文件
|
||||
打开AD25程序,点击右上角人形图标(Not Signed In)右边的三角形,出现菜单选项选择Licenses选项,点击 Add License -> Add Standalone License File,选择AD25安装路径下粘贴的AD25_Pro.alf文件。
|
||||
112
Article/Technology/通过SSH密钥连接LINUX服务器.md
Normal file
@@ -0,0 +1,112 @@
|
||||
# SSH舍弃密码,拥抱密钥
|
||||
## 前提条件
|
||||
使用**ROOT**用户(个人喜好)、客户端使用Windows PowerShell终端、服务端使用Debian12+或是Ubuntu24+
|
||||
## 客户端操作
|
||||
### 创建密钥对
|
||||
随便在哪按 WIN + X 再按 I 打开PowerShell终端
|
||||
进入用户的.ssh文件夹
|
||||
```shell
|
||||
cd ~\.ssh
|
||||
```
|
||||
创建密钥对,使用椭圆加密算法,相比RSA更加短小精悍
|
||||
```shell
|
||||
ssh-keygen -t ed25519
|
||||
```
|
||||
输出Enter file in which to save the key,是对密钥对进行命名,我这里输入test
|
||||
之后输出Enter passphrase (empty for no passphrase),是对私钥进行加密,输入私钥的密码(不会显示),不设置就按Enter跳过
|
||||
然后确认密码,依旧按Enter跳过
|
||||
出现一个方框图形,表示创建成功
|
||||
之后 ~\.ssh 文件夹中会出现一个 test 私钥文件和一个 test.pub 公钥文件
|
||||
至此,客户端的操作暂时结束
|
||||
|
||||
## 服务端操作
|
||||
### 上传公钥至服务器
|
||||
#### 创建实例阶段
|
||||
在创建实例阶段,如阿里云服务器,可以在**管理设置-登录凭证**中选择密钥对;**登录名**选择root;**密钥**对选择右边创建密钥对
|
||||
创建密钥对界面,密钥对名称随意;创建类型选择导入已有密钥对,
|
||||
在客户端Windows电脑中进入 ~\.ssh文件夹中,找到第一步创建的test.pub,用任意编辑器打开后,复制其内容到公钥内容框中,标签键随意,
|
||||
然后回到实例创建页面,在密钥对选择刚刚创建的密钥对即可
|
||||
#### 已有服务器
|
||||
使用SSH密码登录到服务器,切换到ROOT用户
|
||||
```shell
|
||||
sudo -i
|
||||
```
|
||||
##### 复制公钥到服务器
|
||||
进入/root/.ssh文件夹
|
||||
```shell
|
||||
cd /root/.ssh
|
||||
```
|
||||
创建或编辑 authorized_keys 文件
|
||||
```shell
|
||||
vim authorized_keys
|
||||
```
|
||||
按 I 进入编辑模式,将公钥内容复制进去
|
||||
按 Esc ,输入 :wq 保存并退出
|
||||
|
||||
##### 编辑SSH-SERVER配置文件
|
||||
进入/etc/ssh文件夹
|
||||
```shell
|
||||
cd /etc/ssh
|
||||
```
|
||||
编辑sshd_config文件
|
||||
```shell
|
||||
vim sshd_config
|
||||
```
|
||||
同样按 I 进入编辑模式,并确保下列三个参数如下
|
||||
```shell
|
||||
PermitRootLogin yes #允许使用ROOT用户登录
|
||||
PubkeyAuthentication yes #使用密钥对
|
||||
PasswordAuthentication no #禁用密码
|
||||
```
|
||||
按 Esc 退出编辑模式,输入 :wq 保存并退出
|
||||
##### 重启SSH-SERVER服务
|
||||
一般使用
|
||||
```shell
|
||||
systemctl restart sshd
|
||||
```
|
||||
不行就试试
|
||||
```shell
|
||||
service ssh restart
|
||||
```
|
||||
##### **不要断开SSH连接,防止配置有问题连接不上**
|
||||
## 使用密钥对进行连接
|
||||
### 直接连接
|
||||
新开一个PowerShell终端
|
||||
```shell
|
||||
ssh -i ~/.ssh/test root@192.168.21.5
|
||||
```
|
||||
输出 Enter passphrase for key 提示输入私钥密码(输入的内容不会显示),之前没设置就直接按 Enter ;不出意外就可以连接上了
|
||||
### 编辑config文件进行简便连接
|
||||
**注意:** 只用使用Windows的终端才能简便连接,使用mobaxterm等ssh软件这个配置是没用的
|
||||
在Windows客户端中,进入 ~\.ssh 文件夹
|
||||
|
||||
```shell
|
||||
cd ~\.ssh
|
||||
```
|
||||
使用记事本编辑config文件
|
||||
```shell
|
||||
noteapd config
|
||||
```
|
||||
格式如
|
||||
```shell
|
||||
Host test
|
||||
HostName 192.168.21.5
|
||||
IdentityFile ~/.ssh/test
|
||||
User root
|
||||
```
|
||||
如果端口不是22,则需要加上端口,如ssh使用222端口
|
||||
```shell
|
||||
Host test
|
||||
HostName 192.168.21.5
|
||||
IdentityFile ~/.ssh/test
|
||||
Port 222
|
||||
User root
|
||||
```
|
||||
保存
|
||||
然后在PowerShell终端中就可以进行简便连接如
|
||||
```shell
|
||||
ssh test
|
||||
```
|
||||
这里的test是 config 文件 Host 后的字符,可以用Emoji表情
|
||||
**注意:** 在使用SSH密钥对克隆GitHub或是其他git相关网站时,Host最好设置为网站的域名,你问为什么?时间的教训罢了~
|
||||
## 至此教程结束
|
||||
30
Article/Technology/飞牛搭配mtphotos使用passnet内网穿透服务优雅快速的分享照片访问.md
Normal file
@@ -0,0 +1,30 @@
|
||||
## 依旧前言
|
||||
### 瞎比比
|
||||
博主在八月下旬去川西耍了一耍(小环线自驾游),也是拍了很多照片,用之前的arm搭建的mtphotos实现图片备份跟共享的还是非常舒服的,但是呢,博主用的是ipv6的网络,朋友们使用流量呢还是很顺滑的,就是连上wifi后呢基本就不行了,现在大部分wifi呢依旧只提供ipv4,而且博主用的还是ddns,众所周知呢,国内服务器没有备案呢是用不了80跟443一类的标准端口的,所以博主跟朋友们分享的链接后面跟了个端口看着就非常的不优雅,正好飞牛和零刻联合出了个小NAS,正好就能解决博主之前的一大堆问题,废话不多说下面是正文。
|
||||
### 准备和费用
|
||||
1. 飞牛NAS一台(高级内网穿透权益可有可无)
|
||||
2. 域名(如博主的顶级域名一年几十块)(依旧可有可无)
|
||||
3. mtphotos(免费试用一个月后续3元一个月,买断118元)(更新频率高,主要是可以支持vivo的动态图片)
|
||||
4. passnet内网穿透服务(优雅的关键,一月最便宜的是20Mbps速度,50GB流量6块钱,它可以提供域名,就是不那么自由)
|
||||
|
||||
## 正式开始
|
||||
### 实现方案
|
||||
博主使用的方案呢是mtphotos通过挂载飞牛相册备份文件夹路径,而不是单独再使用文件夹来存放照片;这样只需要飞牛手机端备份一次然后两个相册就能都看到。
|
||||
ps:飞牛的相册还是需要继续优化的,我直接把照片复制进对应的备份文件夹中它竟然扫描不出来,不同文件夹中的完全相同的图片,它的重复检查也查不出来;但是mtphotos里是可以检查到的。
|
||||
连接呢,使用ipv6(飞牛DDNS域名)加ipv4(passnet内网穿透服务);mtphotos手机端主地址填飞牛的ipv6(DDNS)域名加mtphotos的端口(默认8063),备用地址填内网穿透服务的域名。
|
||||
ps:使用ipv4的原因的一个是ipv6的普及度其实并不是很高,特别是各种地方的wifi,我的朋友们的家里的wifi就没有ipv6,这样他们访问还需要切换到手机流量就很麻烦;另一个原因是家里的服务器部署服务默认是没法用标准端口的(80 443),域名后面加一串端口号看到真的不是很舒服。
|
||||
### 实现步骤
|
||||
#### 本地操作
|
||||
一、安装好飞牛OS并成功进入系统;创建好储存空间;在文件管理->我的文件页面创建docker文件夹;创建mtphotos子目录,创建config子子目录。
|
||||
二、配置好飞牛自带相册,可以在文件管理中新建备份文件夹,然后在相册设置的文件夹管理中更改一下路径;手机端飞牛相册备份配置页面,备份目录偏好建议选择按设备目录,其他备份设置中的按拍摄日期重命名不要打开,不要打开,不要打开(会导致vivo的动态图片的视频跟图片的名称不一样,会导致mtphotos识别不了动态图片);打开备份,先备份一些照片进去。
|
||||
三、点开Docker,选择好存储位置,直接在镜像仓库中搜索mtphotos并下载(500K+那个就是),在本地镜像中找到mt-photos,点三角形创建容器,勾上开机自动启动,下一步中存储位置添加两个路径,选择创建的config文件夹,右边装载路径填写 /config,
|
||||
再添加路径,选择相册备份的文件夹中的手机的型号那个文件夹上级文件夹也行,右边装载路径填写 /upload;然后下一步完成创建。
|
||||
四、浏览器地址栏IP:8063进入mtphotos网页端,初始化mtphotos后,图库管理里面添加图库,文件夹选择 /upload 或者以手机型号命名的文件夹,然后确定后自动回到上级菜单,勾上 仅管理员有权限修改或删除该图库的照片 并选择可使用该图库的用户(自己的账号)然后确定,会自动扫描一次图库。之后在飞牛备份完成所有照片或者新照片后建议手动点击一次扫描图库(mtphotos默认会间隔15min自动扫描一次图库)
|
||||
#### 配置DDNS和内网穿透
|
||||
##### DDNS
|
||||
进入飞牛网页端,打开系统设置->远程访问->DDNS->新增,上面四项自己填写,外部IPv4地址禁用(大内网地址没啥用),外部IPv6地址自动获取就行;填好后点击测试连接,成功保存。
|
||||
##### 内网穿透
|
||||
一、打开飞牛应用商店,下载并启用frpc客户端和lucky;
|
||||
二、点击lucky进入后台,设置选项,根据需要更改安全入口和密码(不改可以选择禁用安全入口设置检查和禁用默认账号密码检查);SSL/TLS证书选项,添加证书,证书备注建议填子域名,添加方式选择ACME,证书颁发机构Let's Encrypt比较快和稳定,验证方式根据自己的域名服务商自己填写,滑动到最下面打开证书映射选项,映射路径自己先在飞牛中创建好,要有写入权限,然后点击添加,等待添加完成,后到飞牛看看对应映射目录下有没有证书文件。
|
||||
三、进入passnet网页,隧道管理->隧道列表->创建新隧道,选择一个近一点用户少一点的服务器,隧道名称随意,本地IP一般不用动(需要改动自己应该知道),传输协议选择HTTPS,本地端口没改就是8063,源站协议HTTP,子域名是lucky申请的证书的子域名,顶级域名需要在passnet隧道管理->域名管理中添加并加入白名单,crt证书路径就是lucky映射的后缀为 .crt 的证书文件(在飞牛的文件管理中找到并点击选中文件,更多->详细信息->复制原始路径),key密钥路径同理;提交后在隧道列表中,点击对应隧道,有个蓝底注意事项提醒右边的蓝色<mark>点我获取</mark>,点击后复制到剪贴板;然后到飞牛,打开frpc,粘贴复制内容,回到passnet隧道列表,对应的隧道显示绿底在线就说明配置成功。
|
||||
<mark>ps:</mark>在配置文件中可以看到服务器地址,需要提前在域名服务商处做好解析。
|
||||