笔记¶
Cloudflare warp proxy
简介
- Cloudflare 作为全球最大的网络服务提供商,全球大约有30%的网络服务由它提供。
- WARP是Cloudflare提供的免费的,没有带宽上限或限制的VPN服务,可以让你在任何地方访问互联网,而不会受到地域限制。
- WARP软件是基于wireguard魔改的。
- WARP有安卓和Windows的客户端,但是使用人数过多,体验并不好
- Linux下通过WARP代理能实现20MB/s的下载速度。
WARP on Linux
安装配置
- 缘由:WARP下的PT做种快得多。(不是,是因为网络硬盘,所以下载多少要占用多少上传)
- 参考教程。
-
脚本和所需文件在
Z:\shaojiemike\Documents\文献\计算机网络目录下。这里先使用fjw的脚本。 -
通过注册脚本
register.py,获得私钥和分配的ip - 配置wg。其中Endpoint端口可从官方文档中找到,默认的2408很可能被封。WARP with firewall · Cloudflare Zero Trust docs
[Interface] PrivateKey = xxxx #register.py的私钥 Address = xxx/32,xxx/128 #register.py的ipv4和ipv6 Table = off # off禁止wg修改路由表 [Peer] PublicKey = bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo= AllowedIPs = 0.0.0.0/0,::/0 Endpoint = [2606:4700:d0::a29f:c001]:500 #2408, 1701, 500, 4500 PersistentKeepalive = 25 - warp使用的不是标准的wg协议,root下运行,需要通过一个nft脚本
main.sh修改包的3个字节。 - 安装nft
apt-get install nftables - 需要
/etc/default/warp-helper文件填写对应的 - ROUTING_ID对应register.py的ROUTING_ID。注意三个数之间没空格
- UPSTREAM对应
wg-conf里Endpoint。比如: ROUTING_ID=11,45,14 UPSTREAM=[2606:4700:d0::a29f:c001]:500- 最后开启路由表,Root权限运行
ip route add default dev warp proto static scope link table default
WARP on OpenWRT
- 目的:为了防止大量流量通过WARP,导致被官方封禁,所以只在OpenWRT上配置WARP分流github的流量。
- 实现思路:
- 运行python脚本,通过github的API获得所有的github域名ip,
- 使用iptables的warp_out表,将目的地址为github域名ip路由到WARP的虚拟网卡上。
WARP Wireguard Establishment
python register.py #自动生成warp-op.conf,warp.conf和warp-helper
mv warp-helper /etc/default
# cat main.sh
# cat warp-op.conf
vim /etc/config/network #填写warp-op.conf内容,默认只转发172.16.0.0/24来测试连接
ifup warp #启动warp, 代替wg-quick up warp.conf
bash main.sh #启动防火墙实现报文头关键三字节修改
nft list ruleset #查看防火墙,是否配置成功
wg #查看warp状态,测试是否连接成果
这时还没创建warp_out路由表,所以还不能通过WARP出数据。
#/etc/config/network
config interface 'warp'
option proto 'wireguard'
option private_key 'wKpvFCOk4sf8d/RD001TF7sNQ39bWnllpqaFf8QnHG4='
option listen_port '51825'
list addresses '172.16.0.2/32'
list addresses '2606:4700:110:8466:d4ea:ffb8:10da:470f/128'
#option disabled '1'
ifconfig warp down && ifup
Network planning and design
添加了WARP的网络出口后,路由器不在只是通过WAN出数据。防火墙需要更新:
- 原路返回规则。
- 针对有公网ip的接口,需要原路返回。
- 配置来自wan和WARP的信报,使用wan和WARP的路由表,优先级3
- 来自wan的比如来自外部的ssh,为了防止失联。
- 来自WARP的比如
wget --bind-address=WARP_ip来模拟
- 内网地址没有必要配置,因为通过内网地址访问host,则dst必然也是内网地址。因此会匹配main中的内网地址规则。
- wan和WARP的路由表内各自走wan和WARP的网卡
- 为了使得原本wg正常运行,
10: from all lookup main suppress_prefixlength 1 - 假如warp_out是defualt规则,该项也是为了防止失联。
- 创建warp_out的空路由表
1000: from all lookup warp_out,优先级1000
root@tsjOp:~/warp# ip rule
0: from all lookup local
3: from 114.214.233.141/22 iif eth1 lookup wan
3: from 172.16.0.2 iif warp lookup warp
10: from all lookup main suppress_prefixlength 1
1000: from all lookup warp_out
32766: from all lookup main
32767: from all lookup default
填充warp_out路由表
cd ip_route
mv ../github_ipv4.txt .
python fill_ip_table.py --table warp_out --iface warp --p2p -f github_ipv4.txt
对所有github域名的ip执行类似ip ro add 192.30.252.0/22 dev warp proto static table warp_out操作。
测试
mtr www.github.com
ssh -vT [email protected]
git clone https://github.com/llvm/llvm-project
添加到启动项
修改/etc/rc.local
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
sleep 30 && cd /root/warp/ip_route && python fill_ip_table.py --table warp_out --iface warp --p2p -f github_ipv4.txt
/root/warp/main.sh #重新添加防火墙
exit 0
WARP on Windows
基于1.1.1.1 的安装windows版本直接白嫖
需要进一步的研究学习
暂无
遇到的问题
暂无
开题缘由、总结、反思、吐槽~~
参考文献
https://gist.github.com/iBug/3107fd4d5af6a4ea7bcea4a8090dcc7e
glados
Services Systemd Systemclt
区别
Service
历史上,Linux 的启动一直采用init进程。 下面的命令用来启动服务。
这种方法有两个缺点。
一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。
Systemd
Systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。
根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统。
使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。
Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反"keep simple, keep stupid"的Unix 哲学。

systemctl
systemctl是 Systemd 的主命令,用于管理系统。
systemctl - Control the systemd system and service manager
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 #显示启动失败的服务
实操
# 查看相关unit
shaojiemike@tsjNas:~$ systemctl|grep wg
[email protected]
loaded active exited WireGuard via wg-quick(8) for wg0
# 查看已经启动的服务
systemctl list-unit-files --state=enabled|grep wg
[email protected] enabled //由于我删除了wg0,所以.service前没wg0
# 删除服务
sh-4.4# systemctl disable [email protected]
Removed symlink /etc/systemd/system/syno-low-priority-packages.target.wants/[email protected].
开机启动原理
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]
sshd.socket。如果省略,Systemd 默认后缀名为.service,所以sshd会被理解成sshd.service。
实例
把程序设置systemctl服务,并开机启动
- Systemd 默认从目录
/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。 - 进入目录
/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
Loaded: loaded (/etc/systemd/system/webhook.service; enabled;这个enabled就是开机启动的意思
查看服务的log
journalctl - Query the systemd journal
问题
$ systemctl reload webhook.service
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to reload 'webhook.service'.
Multiple identities can be used for authentication:
1. Jun Shi (shijun)
2. Shaojie Tan (shaojiemike)
Choose identity to authenticate as (1-2): 2
Password:
==== AUTHENTICATION COMPLETE ===
Failed to reload webhook.service: Job type reload is not applicable for unit webhook.service.
参考文献
https://blog.csdn.net/qq_40741855/article/details/104984071
https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
Nvidia Nsight
Nsight system compute & Graph 的关系

Nsight Systems
All developers should start with Nsight Systems to identify the largest optimization opportunities. Nsight Systems provides developers a system-wide visualization of an applications performance. Developers can optimize bottlenecks to scale efficiently across any number or size of CPUs and GPUs; from large servers to our smallest SoC. For further optimizations to compute kernels developers should use Nsight Compute or to further optimize a graphics workloads, use Nsight Graphics.
Nsight Compute
Nsight Compute is an interactive kernel profiler for CUDA applications. It provides detailed performance metrics and API debugging via a user interface and command line tool. Nsight Compute also provides customizable and data-driven user interface and metric collection that can be extended with analysis scripts for post-processing results.
Nsight Graphics
Nsight Graphics is a standalone application for the debugging, profiling, and analysis of graphics applications on Microsoft Windows and Linux. It allows you to optimize the performance of your Direct3D 11, Direct3D 12, DirectX Raytracing 1.1, OpenGL, Vulkan, and KHR Vulkan Ray Tracing Extension based applications.
Install Nsight local
- check the perf config To collect thread scheduling data and IP (instruction pointer) samples
cat /proc/sys/kernel/perf_event_paranoid- 如果大于2,临时改变
sudo sh -c 'echo 2 >/proc/sys/kernel/perf_event_paranoid'重启会重置 - 永久修改
sudo sh -c 'echo kernel.perf_event_paranoid=2 > /etc/sysctl.d/local.conf' - 下载Nsight
- 但是单独下载要会员
- 下载cuda toolkit,有集成
Nsight System
目标与功能
运行 nsight-sys,可以从整体上看GPU,CPU资源的使用情况,和分辨出热点函数和kernel,但是对于为什么是热点给不出具体分析。
基本使用
勾选了CUDA-trace, GPU Metrics选项
GPU Metrics 需要 sudo
否则会报错。一般情况下使用sudo能保证0 error
GPU Metrics [0]: The user running Nsight Systems does not have permission to access NVIDIA GPU Performance Counters on the target device. For more details, please visit https://developer.nvidia.com/ERR_NVGPUCTRPERM
- API function: NVPW_GPU_PeriodicSampler_GetCounterAvailability(¶ms)
- Error code: 17
- Source function: static std::vector<unsigned char> QuadDDaemon::EventSource::GpuMetricsBackend::Impl::CounterConfig::GetCounterAvailabilityImage(uint32_t)
- Source location: /dvs/p4/build/sw/devtools/Agora/Rel/DTC_F/QuadD/Target/quadd_d/quadd_d/jni/EventSource/GpuMetricsBackend.cpp:609
Profile 速度
大致2到3倍时间:默认采样率,单独运行52s, Nsight-sys模拟需要135s。
HPC APP : PCIE, GPU DRAM Bandwidth, Warp
GPU Metrics选项能看出 PCIE, GPU DRAM Bandwidth, Warp的使用情况。

Compute Warps in Flight
将鼠标放在上面会有具体的数值或者名称的解释,(正在使用的Warps)

Unallocated Warps in Active SMs
- Definition: This metric represents the number of warps that are not actively executing but are assigned to an active Streaming Multiprocessor (SM).
- Interpretation: In CUDA, SMs are the fundamental processing units on the GPU. Each SM can execute multiple warps concurrently. "Unallocated Warps in Active SMs" indicates the number of warps that are ready to be scheduled on an SM but are currently waiting due to resource contention or other factors. A high number may suggest that there is room for additional work but available resources are not fully utilized.
NVTX
由于没有根据kernel function区分,很难读。为此提供了NVTX来给代码打标签
The NVIDIA Tools Extension Library (NVTX)
使用NVTX可以在C代码里插入标记,使得Nvsight能有效监控区域代码。
头文件:1
需要标记代码前后加入:
nvtxRangePush("checkResult"); //nvtxRangePushA,nvtxRangePushW,nvtxRangePushEx 好像都差不多
checkResult<<<dim3(row_num / TPBX, col_num / TPBY, 1), dim3(TPBX, TPBY, 1)>>>(row_num, col_num, result);
cudaDeviceSynchronize();
nvtxRangePop();
注意NVTX是作用在CPU线程上的,无法在GPU里用。
注意需要 g++ -o testnv -I/usr/local/cuda/include -L/usr/local/cuda/lib64 -lnvToolsExt testnv.cpp。或者修改cmake来实现同样的效果
NVTX问题:怎么不在同一竖直方向上?GPU还先跑是什么情况2

AI APP: Stable Diffusion XL

具体分析见 Deploy Stable Diffusion to A100
Nsight Compute
- Nsight Systems 就是nvprof的继任者,NVIDIA最新的用于监测 kernel timeline的工具。
- NVIDIA 计算能力7.5及以上的GPU设备(从A100开始)不再支持nvprof工具进行性能剖析,提示使用Nsight Compute作为替代品.
目标与功能
默认kernel模式,会根据 function的调度关系,将程序划分为kernel
- Summary: 给出in-order执行的每个kernel的参数,时间,资源占用(寄存器,计算访存单元)信息。
- Detail: 对于被选择的kernel给出, NV的优化建议
- Source:对于被选择的kernel给出, 给出源代码
基本使用
Profile速度
目测模拟时间慢百倍。
使用Nsight Compute CLI (nv-nsight-cu-cli / ncu) 输出数据
nv-nsight-cu-cli -> ncu
下面是一个使用样例:
/usr/local/NVIDIA-Nsight-Compute/nv-nsight-cu-cli -o mnist -f --csv --profile-from-start off /usr/bin/python3 mnist.py
其中-o是为了输出.nsight-cuprof-report文件用于后续的可视化查看,-f为强制覆盖原有文件,--csv可是在console输出除 timeline 以外数据的时候以逗号分隔数据,方便拷贝至csv文件, --profile-from-start的使用方法和Nsight System以及nvprof一样。其余flag选项可见文档。
上面的例子会生成mnist.nsight-cuprof-report文件。
注意
最前面的可执行文件需要绝对路径,如上面的python3需要使用 /usr/bin/python3。 生成过程中可能会产生很大的临时文件(几十G)。如果本次磁盘空间不够,可以设置如下环境变量来调整存储临时文件的地址。没有找到能直接使用 Nsight Compute 修改临时文件地址的方式。
ncu与nvprof命令行抓取参数的映射表
https://www.freesion.com/article/34871449930/
ncu-ui教程
为了显示原代码makefile添加 -g -G选项
对应CmakeList.txt
https://blog.csdn.net/yan31415/article/details/109491749
ncu-ui表格&图

我不明白我的SMEM怎么不是从DRAM来的, 而且峰值怎么这么低?
这个错误也是令人迷惑 The memory access pattern for loads from L1TEX to L2 is not optimal. The granularity of an L1TEX request to L2 is a 128 byte cache line. That is 4 consecutive 32-byte sectors per L2 request. However, this kernel only accesses an average of 3.7 sectors out of the possible 4 sectors per cache line. Check the Source Counters section for uncoalesced loads and try to minimize how many cache lines need to be accessed per memory request.

不知道为什么有1%和2% 的bank conflict
可以看到 SMEM, Register,Block Size是怎么影响GPU Warp的分配调度的。
上图没有拖累,吃满了64个warp。
关于if语句
if语句只要warp里执行相同就行。
可以提示出不连续访问的地方。(这里是这样设计的,已经避免了绝大部分的不连续访问)

显示stall最多的指令是什么以及在等待什么。还有执行最多的指令

假如 file mismatched 手动选择文件就行


stall的信息,感觉就这些有点用。(其中sb是scoreboard的意思)
ncu-ui 分析汇编
PTX&SASS汇编说明
有两种汇编
请看PTX SASS一文
基本说明

可以通过指令执行数或者采样率来得知,执行最多的指令。
鼠标悬停可以知道具体命令的含义
Ex1: for循环头

Ex2: for-loop kernel
该从DRAM里读取到SMEM的指令对应的PTX和SASS代码

问题:无效self-mov?

为了隐藏延迟?
直接原因是PTX翻译成SASS。一条mov变多条了

CUDA Visual Profiler
老一代debugger工具,逐渐被Nsight淘汰
在more里有建议
nvprof捕获信息存储
nvprof --analysis-metrics -o nbody-analysis.nvprof ./nbody --benchmark -numdevices=2 -i=1
# 下面输出 .qdrep 文件
nsys profile --stats=true --force-overwrite=true -o baseline-report ./single-thread-vector-add
CUDA Visual Profiler 问题
7196 Warning: Some profiling data are not recorded. Make sure cudaProfilerStop() or cuProfilerStop() is called before application exit to flush profile data.
解决方法在程序末尾加cudaDeviceReset()或者cudaProfilerStop()
Nsight Compute 问题
OpenGL 没有安装
Warning: Failed to get OpenGL version. OpenGL version 2.0 or higher is required.
OpenGL version is too low (0). Falling back to Mesa software rendering.
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: offscreen, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, xcb.
解决办法
sudo apt-get install libxcb-xinerama0
sudo apt install libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0
Qt插件缺失
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: xcb.
Application could not be initialized!
This is likely due to missing Qt platform dependencies.
For a list of dependencies, please refer to https://doc.qt.io/qt-5/linux-requirements.html
To view missing libraries, set QT_DEBUG_PLUGINS=1 and re-run the application.
按照说明 export QT_DEBUG_PLUGINS=1再次运行, 显示具体问题
Cannot load library /staff/shaojiemike/Install/cuda_11.7.0_515.43.04_linux/nsight-compute-2022.2.0/host/linux-desktop-glibc_2_11_3-x64/Plugins/platforms/libqxcb.so: (libxcb-xinput.so.0: cannot open shared object file: No such file or directory)
解决 sudo apt-get install libxcb-xinput0
kernel没权限profile
ERR_NVGPUCTRPERM - The user does not have permission to profile on the target device
要用sudo,或者最新的NV
could not connect to display localhost:10.0 under sudo
$ sudo ncu-ui
MobaXterm X11 proxy: Authorisation not recognised
qt.qpa.xcb: could not connect to display localhost:10.0
MobaXterm X11 proxy: Unsupported authorisation protocol
Error: Can't open display: localhost:10.0
解决办法(原因是sudo相当于切换到root用户,丢失了xauth信息)
$ xauth list
snode0/unix:12 MIT-MAGIC-COOKIE-1 84941f1f8be97d19436356685f75b884
snode0/unix:13 MIT-MAGIC-COOKIE-1 5172ee2c7364b055cd37538b460f7741
snode0/unix:11 MIT-MAGIC-COOKIE-1 589f3b5ab852f24ca3710c53e6439260
hades1/unix:10 MIT-MAGIC-COOKIE-1 9346adec202bd65250f3d21239025750
snode0/unix:10 MIT-MAGIC-COOKIE-1 52285c563f1688741fa1b434ed2b7b2c
sudo -s # 切换
xauth add snode0/unix:10 MIT-MAGIC-COOKIE-1 52285c563f1688741fa1b434ed2b7b2c # 补全xauth
# 正常执行 xauth有用的总是最后一个

GPU Metrics [0]: Sampling buffer overflow.
- 只勾选CUDA Metrics 和 GPU Metrics
- 降低采样频率
Error 0: UnsupportedGpu
原因是 软件对GPU的支持是逐步的需要安装最新的。
不支持的Nsight的可以尝试老的debugger工具 CUDA Visual Profiler
Error: Profiling is not supported on this device
Pascal support was deprecated, then dropped from Nsight Compute after Nsight Compute 2019.5.1.
The profiling tools that support Pascal in the CUDA Toolkit 11.1 and later are nvprof and visual profiler.
需要进一步的研究学习
暂无
遇到的问题
NVTX问题
开题缘由、总结、反思、吐槽~~
参考文献
https://developer.nvidia.com/tools-overview
https://www.365seal.com/y/zyn1yxJQn3.html
TinyMediaManager
docker-compose in Portainer
tinymediamanager_service:
image: romancin/tinymediamanager:latest
container_name: tinymediamanager
ports:
- 5803:5800
environment:
- USER_ID=0
- GROUP_ID=0
- PASSWORD=acsa1411
- TZ=Europe/Madrid
- VNC_PASSWORD=password #建议去除
volumes:
- /bt:/bt
- /share/Container/tinymediamanager:/config:rw
- /share/Container/tinymediamanager/media:/media:rw
password
口口字体问题
进入容器内bash,安装字体
docker exec -it tinymediamanager bash
wget https://mirrors.aliyun.com/alpine/edge/testing/x86_64/font-wqy-zenhei-0.9.45-r2.apk
apk add --allow-untrusted font-wqy-zenhei-0.9.45-r2.apk
# fc-list 查看字体
然后restart容器。注意不是重启stack(会删除容器,重启创建
tmm on Windows
利用网络挂载文件夹,用tMM软件刮削.
要注意动漫属于电视剧
多季度动漫管理

基础命名规则如下:
剧集英文名 (上映年份)/这是文件夹
---Specials /这是文件夹,存放OVA,特典,剧场版之类
------剧集英文名 S00E01.mp4
------剧集英文名 S00E02.mp4
------......
---Season 01 /这是文件夹,有几季就建几个文件夹
------剧集英文名 S01E01.mp4
------剧集英文名 S01E01.mp4
------......
---Season 02 /同上
------剧集英文名 S02E01.mp4
------剧集英文名 S02E02.mp4
------......
请根据TheTVDB里的数据确定你的ova视频的编号。

问题

在DNS索引网站查看域名的中国服务器IP地址
实际ping速度,修改win10的hosts文件在C:\WINDOWS\system32\drivers\etc
需要进一步的研究学习
暂无
遇到的问题
暂无
开题缘由、总结、反思、吐槽~~
参考文献
https://www.bilibili.com/read/cv18956570/
Docker
简介
基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。
structure

Docker vs VMWare
相对于传统虚拟机,Docker 没有硬件虚拟化/hypervisor,可以运行在物理机、虚拟机, 甚至嵌套运行在 Docker 容器内,并且其不携带操作系统的,会轻巧很多。而且调用资源时利用 Docker Engine 去调用宿主的的资源,这时候过程是虚拟内存->真正物理内存。


Linux内核的潜在兼容性问题
how docker run different ubuntu version Sharing the same running kernel? no SW conficts?
If your host kernel is "compatible enough" with the software in the container you want to run it will work; otherwise, it won't.1 So what does "compatible enough" mean? It depends on what requests the program makes of the kernel (system calls) and what features it expects the kernel to support. Some programs make requests that will break things; others don't.
Compatibility
on an Ubuntu 18.04 (kernel 4.19) or similar host:1
docker run centos:7 bash works fine.
docker run centos:6 bash fails with exit code 139, meaning it terminated with a segmentation violation signal; this is because the 4.19 kernel doesn't support something that that build of bash tried to do.
docker run centos:6 ls works fine because it's not making a request the kernel can't handle, as bash was.
If you try docker run centos:6 bash on an older kernel, say 4.9 or earlier, you'll find it will work fine.
Portainer 统一管理
- 安装Portainer Community Edition (CE)而不是Portainer Business Edition (BE)
- WSL的安装和linux类似
# 创建 Portainer Server 将用于存储其数据库的卷 docker volume create portainer_data # 下载并安装 Portainer Server 容器, 9000为WebUI端口, 8000 是可选的,仅当您计划将边缘计算功能与边缘代理一起使用时才需要。 docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /portainer_data:/data portainer/portainer-ce:2.11.1 - Portainer里的docker部署: 建议使用 Stacks 下的 docker-compose 来进行
端口映射
2333:8000 为 容器内部端口8000,宿主机端口为2333
远程WebUI访问
默认部署在 http://localhost:9000, 可以如下操作来部署 http://222.195.72.218:9000/#!/home
Install
# 安裝 docker
curl -sSL get.docker.com | sh
# 將目前使用者新增到 docker 群組內,需要重新登入才會生效
sudo usermod -aG docker $USER
# 安裝 docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -sL https://api.github.com/repos/docker/compose/releases/latest | grep tag_name | cut -d'"' -f 4)/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Relationship
- Image like a static configed/compiled software using dockerfile/gcc.
- And container is a running process that we can control.
Dockerfile
First, write an installation script for all of your dependencies. This script is written with Docker specific syntax and is called a Dockerfile(1).
- A Dockerfile is a script used to create a Docker image, which is a lightweight, standalone, and executable package that includes everything needed to run a piece of software, including the code, runtime, system tools, system libraries, and settings.
Using dockerfile in portainer
Images > Build image
Dockerfile
Here's a simple Dockerfile code snippet(it's usually built on official base image):
# Use an official base image
FROM ubuntu:20.04
# Set environment variables
ENV MY_ENV_VARIABLE my_value
# Run commands to install packages and set up the environment
RUN apt-get update && apt-get install -y \
package1 \
package2 \
&& rm -rf /var/lib/apt/lists/*
# Copy files from your local machine to the container
COPY local_directory /container_directory
# Set the working directory
WORKDIR /app
# Expose a port
EXPOSE 8080
# Define the command to run when the container starts
CMD ["command_to_start_application"]
In this example, and more options:
FROMspecifies the base image, in this case, Ubuntu 20.04.ENVsets an environment variable.RUNexecutes commands to install packages.COPYcopies files from your local machine to the container.WORKDIRsets the working directory within the container.EXPOSEspecifies that the container will listen on port 8080.CMDdefines the command that will be executed when the container starts.
Cheat Sheet

查看容器出错日志:docker logs --tail 1000 1fed0d4782cf最后一项是容器ID
换源
24年6月后国内镜像站按照国家要求已经陆续关闭,还是只能挂代理
使用docker info可以查看到文件保存路径,和是否有换源:
nano /etc/docker/daemon.json 把以下内容复制进去:
{
"registry-mirrors": [
"https://y0xk2hg9.mirror.aliyuncs.com",
"https://registry.hub.docker.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}
重启systemctl restart docker, 检查docker info
代理
在构建 Docker 镜像时,如果需要通过代理访问外部网络资源(例如,安装软件包或依赖项),你可以通过以下几种方式设置代理:
docker search ubuntu验证
单个Dockerfile
使用 --build-arg
docker build 命令中使用 --build-arg 选项,传递代理相关的环境变量。
docker build \
--build-arg http_proxy=http://your.proxy.server:port \
--build-arg https_proxy=http://your.proxy.server:port \
-t your-image-name .
在 Dockerfile 中,你需要使用 ARG 指令来声明这些构建参数,以便 Docker 在构建过程中能够使用它们:
Dockerfile 中直接设置
全局配置
在 Docker 守护进程中配置全局代理
通过配置 Docker 守护进程,在全局范围内使用代理。具体操作步骤如下:
-
创建或编辑
/etc/systemd/system/docker.service.d/{任意名字 e.g.,proxy}.conf文件(对于 HTTP 代理): -
重新加载守护进程配置,并重启 Docker:
-
通过
docker build命令构建镜像时,Docker 守护进程会自动使用配置的代理。 - 验证代理设置:
systemctl show docker --property Environment和docker info会显示 如下:
(base) root@localhost /etc/systemd/system/docker.service.d [04:47:18]
> sudo systemctl show docker --property Environment
Environment=GOTRACEBACK=crash HTTP_PROXY=http://p_atlas:proxy%[email protected]:8080 HTTPS_PROXY=http://p_atlas:proxy%[email protected]:8080 NO_PROXY=localhost,127.0.0.1
(base) root@localhost /etc/systemd/system/docker.service.d [05:02:04]
> docker info |grep HTTP
HTTP Proxy: http://xxxxx:[email protected]:8080
HTTPS Proxy: http://xxxxx:[email protected]:8080
docker show没有 HTTP_PROXY, 看日志
sudo journalctl -u docker.service 检查 代理环境变量为什么没生效
Dec 30 16:32:59 localhost.localdomain systemd[1]: Started Docker Application Container Engine.
Dec 30 16:33:12 localhost.localdomain systemd[1]: /etc/systemd/system/docker.service.d/http-proxy.conf:2: Failed to resolve specifiers in HTTP_PROXY=http://p_atlas:proxy%[email protected]:6688, ignoring: Invalid slot
Dec 30 16:33:12 localhost.localdomain systemd[1]: /etc/systemd/system/docker.service.d/http-proxy.conf:3: Failed to resolve specifiers in HTTPS_PROXY=http://p_atlas:proxy%[email protected]:6688, ignoring: Invalid slot
发现还是转义符的问题,%40123 要写成 %%40123
使用 ~/.docker/config.json
你还可以在 ~/.docker/config.json 文件中配置代理:
{
"proxies": {
"default": {
"httpProxy": "http://your.proxy.server:port",
"httpsProxy": "https://your.proxy.server:port",
"noProxy": "localhost,127.0.0.1"
}
}
}
通过这些方法,你可以在 docker build 命令中使用代理,从而在需要外部网络资源的场景下顺利构建 Docker 镜像。
证书问题
Error response from daemon: Get "https://ghcr.io/v2/": x509: certificate signed by unknown authority
编辑 Docker 配置文件 /etc/docker/daemon.json,添加以下内容:
重启 Docker 服务:
image
# load image from zip
docker load -i <image.tar>
# save current container to image
docker commit containerid image_name:tag
# save image to zip
docker save myimage:latest | gzip > myimage.tar.gz
# save all
docker save $(docker images -q) | gzip > all-images.tar.gz
docker push/pull
- It is in these containers that you will run or develop your code.
- If you would like other people to be able to use your Docker image you can push to DockerHub (with
docker push), - and if you want to use someone else’s image you can pull from DockerHub (with
docker pull).3
网络问题
root@UGREEN-A0E9:~# docker pull dreamacro/clash
Using default tag: latest
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled (Client.Timeout exceeded while awaiting headers)
需要换源
docker build
Then, run these commands to build a Docker image of your environment by using docker build.
Dockfile Path
docker build 基本的格式为 docker build [ 选项 ] 路径,该命令将读取指定路径下(包括子目录)的 Dockerfile,并将该路径下所有内容发送给 Docker 服务端,由服务端来创建镜像。因此一般建议放置 Dockerfile 的目录为空目录。也可以通过 .dockerignore 文件(每一行添加一条匹配模式)来让 Docker 忽略路径下的目录和文件。
option
option like
docker build use proxy
docker build --network=host\
--build-arg http_proxy=http://127.0.0.1:7890 \
--build-arg https_proxy=http://127.0.0.1:7890 \
--build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
-t ithemal:latest .
You also can set the proxy in the Dockerfile.5
docker 内代理经常导致网络异常
通过下面验证代理:
docker exec -it windmill-caddy-1 /bin/sh进去 curl(受到全小写环境变量http_proxy影响) and wgetdocker inspect windmill-windmill_worker-1 | grep -i proxy
docker tag
镜像的完整 tag 不仅包含镜像名字, 还指明了镜像从哪里来, 要到哪里去, 就像一个 URL。可以通过 -t 选项指定镜像的标签信息,譬如:
docker run
Once successfully built, you can instantiate copies of this image as many times as you would like by using docker run to create Docker containers.
option
# 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
$ docker run -it nginx:latest /bin/bash
# remove all stop container
$ docker container prune
-i: 以交互模式运行容器,通常与-t同时使用;-t: 为容器重新分配一个伪输入终端,通常与-i同时使用;-d: 后台运行容器,并返回容器ID;-P: 随机端口映射,容器内部端口随机映射到主机的端口-p: 指定端口映射,格式为:主机(宿主)端口:容器端口--name="nginx-lb": 为容器指定一个名称;-e username="ritchie": 设置环境变量;-v <path to datasets>:/datasets挂载本地目录
Volumes 挂载
volumes allow me to interact with data outside of the docker container.
Volumes is better than bind mounts
- Volumes are easier to back up or migrate than bind mounts.
- Volumes work on both Linux and Windows containers.
So option
-vis better than--mount
options
docker-compose
- Compose 是用于定义和运行多容器 Docker 应用程序的工具。需要额外安装。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
- 和docker共用代理配置,
docker info |grep HTTP查看。
十分不建议使用docker-compose命令
使用root用户执行docker-compose up -d,不然会有文件权限问题。各种问题,软件版本问题等,十分折磨。
compose file
version: "3"
services:
mihoyo-bbs:
image: darkatse/mihoyo-bbs
environment:
- CRON_SIGNIN=30 9 * * *
- MULTI=TRUE
volumes: # 将主机的数据卷或着文件挂载到容器里。
- .:/var/app
logging: # driver:指定服务容器的日志记录驱动程序,默认值为json-file
driver: "json-file"
options:
max-size: "1m" # 最多1m个文件,当达到文件限制上限,会自动删除旧得文件。
AutoMihoyoBBS4 将上述 YAML 文件保存为 docker-compose.yml,然后在包含该文件的目录中运行以下命令:
deploy
docker-compose logs -f命令来查看程序输出。 -f, --follow Follow log output
# docker-compose up 命令来启动并运行整个应用程序。
# docker-compose down 可以将整个应用停止并删除相关资源。
$ docker-compose up -d
# 在后台执行该服务可以加上 -d 参数
Creating network "automihoyobbs_default" with the default driver
Pulling mihoyo-bbs (darkatse/mihoyo-bbs:)...
latest: Pulling from darkatse/mihoyo-bbs
df9b9388f04a: Pull complete
a1ef3e6b7a02: Pull complete
7a687728470e: Pull complete
4ecf30de1710: Pull complete
a1f99e431609: Pull complete
7e9141a60a66: Pull complete
7aa39aec04ec: Pull complete
a75b4b3d5690: Pull complete
dee0a6b07871: Pull complete
abed80702fed: Pull complete
Digest: sha256:10958801df87675c390a8cdcc153c2f87a41af92d35f9f2cf9b7758aa3e10d1b
Status: Downloaded newer image for darkatse/mihoyo-bbs:latest
Creating automihoyobbs_mihoyo-bbs_1 ... done
docker exec
实例
提供高版本GCC
宿主机往往因为OS的原因,提供不了合适的GCC版本,为此在docker里编译是一种便捷的选择。
AllForOne 脚本
#!/bin/bash
docker_name="mihoyo-bbs"
docker stop ${docker_name}
docker rm ${docker_name}
echo -e "\033[5;36mOrz 旧容器(镜像)已清理\033[0m"
time_now=$(date "+%m%d%H")
docker build -f dockerfile --tag ${docker_name}:"${time_now}" .
echo -e "\033[5;36mOrz 镜像重建完成\033[0m"
docker run -itd \
--name ${docker_name} \
--log-opt max-size=1m \
-v $(pwd):/var/app \
${docker_name}:"${time_now}"
echo -e "\033[5;36mOrz 镜像启动完成\033[0m"
docker ps -a #顯示目前的 container 及狀態
docker logs ${docker_name} -f # -f, --follow Follow log output
hackergame2020 的源码的dockerfile

奇怪的使用
启动docker并通过xhost保持tmux连接
docker/docker_connect.sh或者 https://blog.csdn.net/winter2121/article/details/118223637- What if I want to use X forwarding from within a Docker container?3
Docker of VNC
在Linux服务器上使用Docker运行图形化界面的应用程序。为了实现这一点,您需要使用一个特别配置的Docker镜像,该镜像支持图形用户界面(GUI)。这通常涉及到安装一个桌面环境和任何必要的图形驱动程序。
以下是实现这一目的的基本步骤:
- 选择一个合适的基础镜像:您可以从一个已经包含了桌面环境的基础镜像开始,例如Ubuntu或Fedora。
- 安装图形界面:在Dockerfile中,您可以安装一个桌面环境,如GNOME、KDE或Xfce,以及任何其他必需的软件。
- 配置X11或其他显示服务器:为了让图形界面能够显示,您需要配置X11或类似的显示服务器。这可能涉及到暴露和映射一些端口,以及安装和配置VNC服务器或其他远程桌面软件。
- 运行容器并连接到图形界面:一旦容器运行起来,您需要通过VNC客户端或其他远程桌面工具连接到它。
这里是一个示例的Dockerfile,用于创建一个带有图形界面的Ubuntu容器:
FROM ubuntu:latest
# 安装必要的软件包
RUN apt-get update && apt-get install -y \
ubuntu-desktop \
vnc4server \
xterm
# 设置VNC服务器
RUN mkdir /root/.vnc
RUN echo "your-password" | vncpasswd -f > /root/.vnc/passwd
RUN chmod 600 /root/.vnc/passwd
# 设置VNC启动脚本
COPY vnc_startup.sh /root/vnc_startup.sh
RUN chmod +x /root/vnc_startup.sh
# 暴露VNC端口
EXPOSE 5900
CMD ["/root/vnc_startup.sh"]
在这个Dockerfile中,ubuntu-desktop和vnc4server被安装,以便提供图形界面和VNC访问。您需要创建一个VNC启动脚本(vnc_startup.sh),以启动VNC服务器并运行桌面环境。
请注意,运行图形界面的容器通常比标准的、无GUI的容器更加资源密集,并且可能需要更多的存储空间和内存。此外,确保遵循最佳安全实践,特别是在暴露VNC或其他远程访问服务时。
常见问题
Got permission denied while trying to connect to the Docker daemon socket
- sudo 运行
- 加入docker用户组
failed to create endpoint portainer on network bridge: adding interface xxx to bridge yyy failed: Device does not exist.
gpt's solution的无效答案
这个错误表明 Docker 在创建容器时遇到了问题,具体原因是无法将网络接口 veth2c573cd 添加到 Docker 网络桥 docker0,并且提示设备不存在。
查看 Docker 网络列表,确保相关的网络(可能是 bridge)存在:
如果不存在,你可以尝试删除并重新创建:
然后再次运行你的 Docker 容器。
参考文献
https://cloud.tencent.com/developer/article/1395434
-
Docker Commands for Managing Container Lifecycle (Definitive Guide) ↩
-
https://github.com/Womsxd/AutoMihoyoBBS ↩
-
https://cloud.tencent.com/developer/article/1806455 & http://www.debugself.com/2018/01/17/docker_network/ ↩
Vue
vue-chart
https://stackblitz.com/edit/vue-echarts-vue-3?file=src%2FApp.vue
需要进一步的研究学习
暂无
遇到的问题
暂无
开题缘由、总结、反思、吐槽~~
参考文献
无
Visualization Ranking
Goal
横向条形图排序赛跑叫Bar chart race
visualization using echart
- 完整的中文官方教程和丰富的插件和相关项目
- 可以支持vue
- 支持动态折线图和动态柱状图
visualization using d3.js
参考项目
但是好像是静态的,而且只有一个排序的柱状图
visualization using anichart
参考文档, 使用template项目
git clone https://github.com/Kirrito-k423/leetcode-ranking-visualization-anichart.git
# Install Dependencies
npm install -g pnpm
pnpm i
pnpm build # error
由于项目还在开发,暂时不进一步尝试
需要进一步的研究学习
暂无
遇到的问题
暂无
开题缘由、总结、反思、吐槽~~
参考文献
无
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了
参考文献
无
