diff --git a/_config.yml b/_config.yml index 103f6ef..f9e1b31 100644 --- a/_config.yml +++ b/_config.yml @@ -60,6 +60,8 @@ index_generator: path: '' per_page: 10 order_by: -date +archive_generator: + per_page: 0 # Category & Tag default_category: uncategorized diff --git a/p b/p deleted file mode 100644 index fe04f9e..0000000 --- a/p +++ /dev/null @@ -1,5 +0,0 @@ -echo -n "该push啦:" -read input -git add -A -git commit -m "❤$input" -git push diff --git a/p.sh b/p.sh new file mode 100644 index 0000000..ac7fa9b --- /dev/null +++ b/p.sh @@ -0,0 +1,29 @@ +echo -e "Do someting:" +echo -e "\033[31m 1.Bug \033[0m \033[36m 2.Update \033[0m \033[35m 3.Docs \033[0m" +read git +#read input +case $git in + 1) echo -n 'Bug:' + read input + git add -A + git commit -m "🐛$input" + git push + ;; + 2) echo -n 'Update:' + read input + git add -A + git commit -m "🛠$input" + git push + ;; + 3) echo -n 'Docs:' + read input + git add -A + git commit -m "📃$input" + git push + ;; + *) echo 'Maybe not today.' + ;; +esac +# git add -A +# git commit -m "❤$input" +# git push diff --git a/source/_posts/ASCII在线视频流.md b/source/_posts/ASCII在线视频流.md new file mode 100644 index 0000000..f365464 --- /dev/null +++ b/source/_posts/ASCII在线视频流.md @@ -0,0 +1,246 @@ +--- +title: ASCII在线视频流 +date: 2019-06-29 12:12:41 +tags: Tools +categories: 实践 +url: online-ascii-video +index_img: /defect/images/ASCII在线视频流/logo.jpg +--- + +什么是ASCII? + +来自百度百科的解释: +ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。 + +应该很多小伙伴们都非常熟悉ASCII码了,它也是现今最能玩的一套编码了吧(雾💊 + +那么ascii视频流又是啥呢? + +这是来自某位大佬胡乱起的名字。🤣 + +![图像-1](images/ASCII在线视频流/图像-1.png) + +## 那么如何安装呢? + +根据[大佬的文章](https://file.aoaoao.me/2018/03/26/e6-9e-84-e5-bb-ba-e4-b8-80-e4-b8-aa-e5-9c-a8-e7-ba-bfascii-e8-a7-86-e9-a2-91-e6-b5-81-e6-9c-8d-e5-8a-a1/#如何搭建这么一个服务?)与开源项目。首先我们需要: + +1. ffmpeg +2. [hit9/img2txt](https://github.com/hit9/img2txt) +3. [HFO4/plus1s.live](https://github.com/HFO4/plus1s.live) +4. node.js/Go/Python运行环境 + +### 使用ffmpeg截取视频片段 + +安装ffmpeg: + +**CentOS** +由于CentOS没有官方FFmpeg rpm软件包。但是,我们可以使用第三方YUM源(Nux Dextop)完成此工作。 + +```centos7 +sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro +sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm +sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro +sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm +``` + +**Ubuntu** +Ubuntu的源里默认就有ffmpeg的软件包,所以我们直接安装就ok了。 + +``` +apt install ffmpeg +``` + +拥有了ffmpeg之后,我们可以使用如下命令: + +``` +ffmpeg -i demo.mp4 -r 5 -ss 00:01:13 -t 00:00:15 %03d.png +``` + +将demo视频的第1分13秒后的15秒以每秒5帧的速度保存为图像,图像名格式为001.png 002.png …… +效果如下: + +![图像-2](images/ASCII在线视频流/图像-2.png) + +```bash +➜ ~ ls time +001.png 005.png 009.png 013.png 017.png 021.png 025.png 029.png 033.png 037.png 041.png 045.png 049.png 053.png 057.png 061.png 065.png 069.png 073.png +002.png 006.png 010.png 014.png 018.png 022.png 026.png 030.png 034.png 038.png 042.png 046.png 050.png 054.png 058.png 062.png 066.png 070.png 074.png +003.png 007.png 011.png 015.png 019.png 023.png 027.png 031.png 035.png 039.png 043.png 047.png 051.png 055.png 059.png 063.png 067.png 071.png 075.png +004.png 008.png 012.png 016.png 020.png 024.png 028.png 032.png 036.png 040.png 044.png 048.png 052.png 056.png 060.png 064.png 068.png 072.png +``` + +### 使用修改过的hit9/img2txt将图像转换为ASCII画 + +> 原版hit9/img2txt只能单张转换,我稍微改了下,可以批量转换并保存为txt。修改后的版本:https://github.com/HFO4/img2txt/blob/gh-pages/img2txt.py + +可能大佬都是说改就改的吧。 +完事我们clone下来后修改img2txt.py第246行的目录为上一步存放图像的目录: + +``` +246 imgname = "/root/time/"+str(i).zfill(3)+".png" +``` + +然后再执行: + +``` +pip install img2txt.py +python img2txt.py h +``` + +稍等片刻,ASCII字符文件便会存放到与img2txt.py同级的pic目录下。若提示无pic文件夹导致的错误,手动创建一个名为`pic`的文件夹再运行一次即可。 + +### 部署在线服务 + +最后,使用大佬的[HFO4/plus1s.live](https://github.com/HFO4/plus1s.live)来部署在线播放的服务。 + +将上一步使用img2txt的pic文件夹中的图片放到改项目下的pic文件夹内,然后修改stream.go的第13行为你得到的单帧图像的总个数。保存后执行: + +``` +go build stream.go +./stream +``` + +然后程序会默认开放一个暴力的端口,使用`curl 您的ip:1926`命令即可查看效果。 + +## 另一款强大的软件 + +> 📺ASCIIPlayer : Golang写的ASCII码播放器 + +![ascii_cat](images/ASCII在线视频流/ascii_cat.gif) +如同作者自己所说的,该软件是Go语言写的一款强大的Ascii码的转码加播放器。 + +* [ASCIIPlayer : Golang写的ASCII码播放器](https://segmentfault.com/a/1190000016976239) + +* [asciiplayer](https://github.com/qeesung/asciiplayer) + +### 安装 + +``` +go get -u github.com/qeesung/asciiplayer +``` + +安装后若提示: + +``` +zsh: command not found: asciiplayer +``` + +则在当前目录下会缓存一个`go`文件夹,在`go/bin/`文件夹内会有一个可执行的asciiplayer。我们将其copy至`/usr/bin/`目录下,并重连ssh即可解决。 + +``` +cp -a asciiplayer /usr/bin +``` + +### 三种工作模式 + +该软件强大的地方就是在此了,对于转换为ascii码,它拥有三个工作模式: + +- 输出到一个一般文件中(Encode模式): 这里我们只能逐帧,逐像素的将转化以后的ASCII图像写到文件中去。 +- 输出到终端(Play模式): 直接将转换以后的图像按照一定的频率输出到终端即可。 +- 输出到远端客户端(Server模式): 这里和输出到终端的原理类似,只是输出到了远端客户端所在的终端。 + +``` + +---------------+ +---------+ + | | | | + +------> Gif Decoder | +---> Encoder +---> file + | | | | | | + | +---------------+ | +---------+ + | +---------------+ +-------------+ | +---------+ + | | | | | | | | +Input File+------> Image Decoder +---> Frames +-->+ Image2ASCII +->ASCII Frames-+---> Player +---> stdout + | | | | | | | | + | +---------------+ +-------------+ | +---------+ + | +---------------+ | +---------+ + | | | | | | + +------> Video Decoder | +---> Server +---> socket + | | | | + +---------------+ +---------+ +``` + +以至于它一款软件就能够直接实现我们是上述将视频中抽去图片再挨个转换为文本的ASCII码的工作了。除了不能将我们需要的输出为文本保存以外,其他都很完美。 +唯一一个缺点就是目前还不支持直接读取视频文件,只能先使用ffmpeg将视频转换为gif中,在用此软件读取。作者目前也说后续会支持视频的。🎉 + +### 常用的命令 + +- play + +通过适配屏幕的方式播放GIF + +``` +asciiplayer play demo.gif +``` + +缩小为原来的十分之一,然后播放GIF + +``` +asciiplayer play demo.gif -r 0.1 +``` + +缩放成固定的长和宽,然后播放GIF + +``` +asciiplayer play demo.gif -w 100 -h 40 +``` + +播放一个PNG图片 + +``` +asciiplayer play demo.png +``` + +- encode + +将一个GIF文件demo.gif编码为ASCII的Gif文件output.gif + +``` +asciiplayer encode demo.gif -o output.gif +``` + +指定输出ASCII字符大小的情况下,讲一个GIF文件demo.gif编码成ASCII的GIF动图文件output.gif + +``` +asciiplayer encode demo.gif -o output.gif --font_size=5 +``` + +将GIF动图demo.gif缩放为原来的十分之一,然后编码成ASCII的GIF动图文件output.gif + +``` +asciiplayer encode demo.gif -o output.gif -r 0.1 +``` + +编码一个jpeg文件,然后输出一个ASCII的output.png文件 + +``` +asciiplayer encode demo.jpeg -o output.png +``` + +- Server + +输入demo.gif,并以默认端口8080启动一个http服务器 + +``` +asciiplayer server demo.gif +``` + +输入demo.gif,并以自定义端口8888启动一个http服务器 + +``` +asciiplayer server demo.gif --port 8888 +``` + +输入一个demo.png图片,并且启动http 服务器 + +``` +asciiplayer server demo.png +``` + +## 大佬们 + +[ASCIIPlayer : Golang写的ASCII码播放器](https://segmentfault.com/a/1190000016976239#articleHeader0) +[构建一个在线ASCII视频流服务](https://file.aoaoao.me/2018/03/26/e6-9e-84-e5-bb-ba-e4-b8-80-e4-b8-aa-e5-9c-a8-e7-ba-bfascii-e8-a7-86-e9-a2-91-e6-b5-81-e6-9c-8d-e5-8a-a1/#如何搭建这么一个服务?) + +## Try it ? + +``` +curl time.defect.ink:1926 +``` \ No newline at end of file diff --git a/source/_posts/AliOssForTypecho.md b/source/_posts/AliOssForTypecho.md new file mode 100644 index 0000000..19a59ae --- /dev/null +++ b/source/_posts/AliOssForTypecho.md @@ -0,0 +1,43 @@ +--- +title: AliOssForTypecho +date: 2019-06-26 16:42:41 +tags: typecho +categories: 踩坑 +url: alioss-for-typecho +index_img: /defect/images/AliOssForTypecho/logo.jpg +--- + +原作大佬: + +* [Typecho插件](https://zhoujie.ink/AliOssForTypecho.html) + +最近从辣鸡七牛换到了阿里云的oss,对于我们使用阿里云的ECS来说,oss支持直接内网访问还是很友好的。 + +存储换了之后,于是找到了大佬的这款插件。可是大佬当初写插件的时候有些地方不太符合个人的使用习惯。比如存储的目录下都会给每张图片单独生成要一个文件夹。 + +虽然看到大佬blog下已经有留言了,但是那都是去年的事了。 + +当时是因为阿里云还没有检测object是否存在的sdk,大佬估计也是没有时间来跟这阿里云的sdk持续更新。就在18年10月份阿里云才更新了判断文件是否存在的php sdk。 + +对于我这种0基础没入门的php玩家,修改太多也太麻烦,也不会。于是只做了一些简单的修改 + +- 去除每个图片随机创建一个文件夹,但是没有是否存在的检测,上传时要确保文件不会重名。 +- 添加图片处理样式,支持自定义规则。 +- 更新了最新的OssClient(虽然我不知道它怎么用 + + + + +为什么不做object存在检测? + +- 当前文件夹是按“年-月-日”来分层的,也就是说存在重名的文件的时间段只有一天内上传的文件才有机会重名。 +- 不会 +- 主要是不会 + +阿里云的[判断文件是否存在](https://help.aliyun.com/document_detail/88501.html?spm=a2c4g.11186623.6.938.33f015cdQHplrY)文档,有兴趣的大佬可以试试。 + + + +下载地址: + +* [AliossForTypecho](https://github.com/DefectingCat/AliOssForTypecho-) \ No newline at end of file diff --git a/source/_posts/Gitlab尝鲜.md b/source/_posts/Gitlab尝鲜.md new file mode 100644 index 0000000..898abb0 --- /dev/null +++ b/source/_posts/Gitlab尝鲜.md @@ -0,0 +1,88 @@ +--- +title: Gitlab尝鲜 +date: 2019-06-19 15:42:41 +tags: Linux +categories: 实践 +url: try-the-gitlab +index_img: /defect/images/Gitlab尝鲜/52152339.png +--- + +## Gitlab? + +**GitLab**是由GitLab Inc.开发,使用[MIT许可证](https://zh.wikipedia.org/wiki/MIT許可證)的基于[网络](https://zh.wikipedia.org/wiki/互联网)的[Git](https://zh.wikipedia.org/wiki/Git)[仓库](https://zh.wikipedia.org/wiki/仓库_(版本控制))管理工具,且具有[wiki](https://zh.wikipedia.org/wiki/Wiki)和[issue跟踪](https://zh.wikipedia.org/wiki/事务跟踪管理系统)功能。 + +它是一款和常见的Github很像仓库管理工具,大体使用上和Github很像。前端页面也很好看,主要的是安装非常的方便,它集成了自身需要的nginx的服务端。 + +起初是由Ruby写成,后来部分由Go语言重写。 + +最早,它是完全免费的开源软件,按照 MIT 许可证分发。毕竟人家是公司,后来Gitlab被拆分成GitLab CE(社区版)和 GitLab EE(企业版)。和如今的模式一样,ce是完全免费使用的社区版,而ee是可以进行试用且更多功能的收费版。 + +![52152339](images/Gitlab尝鲜/52152339.png) + +## 安装部署 + +[官方](https://about.gitlab.com/install/)拥有详细的安装操作文档,并且对于不同的Linux发行版也有着不同的软件仓库源。除此之外,我们还可以选择其他的安装方式,如Docker等。 + +我当前是部署在Ubuntu上的,系统信息: + +![411390967](images/Gitlab尝鲜/411390967.png) + + 官方是推荐系统空闲内存在4GB以上的,对于类似我们这样的个人使用的较少的来说,推荐空闲内存是2GB以上。毕竟它会自己运行一套nginx、redis等服务端。 + +自家的开源地址:[Gitlab](https://gitlab.com/gitlab-org/gitlab-ce/) + +相对于从源码安装来说,自家提供的相应的软件包更加的方便,也更不会容易出错。我们只需要选择相应的操作系统即可。 + +这里仅以Ubunt示例: + +首先安装需要的相关依赖: + +``` +sudo apt-get update +sudo apt-get install -y curl openssh-server ca-certificates +``` + +如果我们不使用外部的SMTP来发邮件的话,Gitlab可以使用postfix来进行发邮件。当然对我们完全不需要发邮件的这个需求的话,这步完全可以跳过。 + +``` +sudo apt-get install -y postfix +``` + +基本依赖安装完后,随后可以添加Gitlab的源来进行安装软件了: + +``` +curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash +curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash +``` + +*注意ce和ee的区别* + +接下来,我们就可以使用`apt`来进行安装GItlab-ce了。修改下方命令的`https://gitlab.example.com`为自己Gitlab运行的域名。安装程序将自动配置该网址启动Gitlab + +对于需要启用`https`的小伙伴们,Gitlab可以自动请求[[Let's Encrypt](https://docs.gitlab.com/omnibus/settings/ssl.html#lets-encrypthttpsletsencryptorg-integration)]的证书,方便我们一步到位。当然我们也可以使用自己的证书。 + +``` +sudo EXTERNAL_URL="https://gitlab.example.com" apt-get install gitlab-ce +``` + +到这里就安装的差不多了,此时我们可以打开自己的Gitlab。第一次访问时会被重定向到设定`root`密码的界面。设置完成后我们的Gitlab就安装完成了。初始管理员的账户就是`root` + +由官方给我们提供的安装方式是不是相对来说非常的简单呢? + +## 使用 + +![99634888](images/Gitlab尝鲜/99634888.png) + +简洁多彩的界面也时非常的好看的。默认没有配置邮件的情况下是可以随意注册的,我们也可以在后台配置里关闭自动注册,作为一个私人的git仓库。也可以手动添加用户给想尝鲜的小伙伴们。 + +当然,Gitlab只是一个仓库源的管理工具,提供了类似与Github的功能。对于我们终端使用git来说,还是和Github一模一样。并且我们可以将其部署在国内的主机上,来提升某些情况到Github速度奇慢无比的问题。 + +## 启动与管理 + +``` +$ sudo gitlab-ctl reconfigure +$ sudo gitlab-ctl status +$ sudo gitlab-ctl stop +$ sudo gitlab-ctl restart +$ sudo ps aux | grep runsvdir +``` \ No newline at end of file diff --git a/source/_posts/QinQ基础操作.md b/source/_posts/QinQ基础操作.md new file mode 100644 index 0000000..f8462de --- /dev/null +++ b/source/_posts/QinQ基础操作.md @@ -0,0 +1,219 @@ +--- +title: QinQ基础操作 +date: 2019-05-29 16:21:15 +tags: Network +categories: 网络 +url: basic-knowledge-of-qinq +index_img: /defect/images/QinQ基础操作/qinq.jpg +--- + +> QwQ♥ + +## QinQ简介 + +QinQ技术(或称为IEEE 802.1ad、Vlan stacking)。是802.1q协议(Virtual Bridged Local Area Networks)为基础衍生出的一种通讯协议。 + +它是一项拓展vlan空间的技术,通过在原有的以太网帧中再堆叠一个802.1q的报头来达到拓展vlan空间的功能。使其vlan数量最多可以达4094(inner)*4094(outer)。即802.1Q-in-802.1Q,所以称之为QinQ协议。 + +### 目的 + +随着当前的以太网技术的发展,利用传统802.1q vlan来对用户进行隔离和标识收到很大限制。因为IEEE802.1Q中定义的VLAN Tag域只有12个比特,仅能表示4096个VLAN,无法满足以太网中标识大量用户的需求,于是QinQ技术应运而生。 + +而运用了QinQ协议之后,可以在原有的vlan标签中再堆叠一层vlan标签,使其vlan的数量达到翻倍,极大的拓展了vlan的空间。 + +### 优点 + +- 扩展VLAN,对用户进行隔离和标识不再受到限制。 +- QinQ内外层标签可以代表不同的信息,如内层标签代表用户,外层标签代表业务,更利于业务的部署。 +- QinQ封装、终结的方式很丰富,帮助运营商实现业务精细化运营。 + +1. 解决日益紧缺的公网VLAN ID 资源问题 +2. 用户可以规划自己的私网VLNA ID +3. 提供一种较为简单的二层VPN解决方案 +4. 使用户网络具有较高的独立性 + +### 实现方式 + +QinQ拥有两种实现方式: + +1. 基本QinQ + + 1. 如果收到的是带有VLAN Tag的报文,该报文就成为带双Tag的报文。 + 2. 如果收到的是不带VLAN Tag的报文,该报文就成为带有本端口缺省VLAN Tag的报文。 + +2. 灵活QinQ + + 1. 为具有不同内层VLAN ID的报文添加不同的外层VLAN Tag。 + 2. 根据报文内层VLAN的802.1p优先级标记外层VLAN的802.1p优先级和添加不同的外层VLAN Tag。通过使用灵活QinQ技术,在能够隔离运营商网络和用户网络的同时,又能够提供丰富的业务特性和更加灵活的组网能力。 + + +* 基本QinQ + + 基本QinQ是基于接口的封装,是指进入一个接口的所有流量都将全部封装为一个相同的外层Vlan tag。封装方式不够灵活,用户业务区分不够细致。这种封装方式称之为基本QinQ。 + +* 灵活QinQ + + * 基于Vlan ID的QinQ封装:这种封装方式可以针对不同的vlan tag来决定是否封装外层vlan tag、封装何种vlan tag。这种封装方式称之为灵活QinQ。 + * 基于802.1q优先级的QinQ封装:这种封装方式可以针对用户不同优先级的数据流来决定是否封装外层vlan tag、封装何种vlan tag。这种封装方式亦称之为灵活QinQ。 + +## 终结子接口 + +“终结”意思为设备对传过来的报文tag进行识别,然后根据后续的转发行为来对单层或双层的tag进行玻璃或继续传输。 + +“终结”一般作用于子接口上,故称之为:终结子接口 + +QinQ技术在和MPLS/IP核心网连接时,根据不同的情况,会用到不同的终结方法: + +* 如果路由子接口是对报文的单层Tag终结,那么该子接口称为Dot1q终结子接口; +* 如果路由子接口是对报文的双层Tag终结,那么该子接口称为QinQ终结子接口。 + +Tips:Dot1q终结子接口和QinQ终结子接口不支持透传不带VLAN的报文,收到不带VLAN的报文会直接丢弃。 + +## 帧格式 + +QinQ报文有着固定的格式,就是在802.1Q的标签上再堆叠一层802.1Q标签。QinQ报文比普通的vlan标签多4个字节。vlan帧最小帧长为68字节。 + +![ethernet-QinQ-format2](images/QinQ基础操作/ethernet-QinQ-format2.png) + +| 字段 | 长度 | 含义 | +| ------------------- | ----------- | ------------------------------------------------------------ | +| Destination address | 6字节 | 目的MAC地址。 | +| Source address | 6字节 | 源MAC地址。 | +| Type | 2字节 | 长度为2字节,表示帧类型。取值为0x8100时表示802.1Q Tag帧。如果不支持802.1Q的设备收到这样的帧,会将其丢弃。对于内层VLAN tag,该值设置为0x8100;对于外层VLAN tag,有下列几种类型0x8100:思科路由器使用0x88A8:Extreme Networks switches使用0x9100:Juniper路由器使用0x9200:Several路由器使用 | +| PRI | 3比特 | Priority,长度为3比特,表示帧的优先级,取值范围为0~7,值越大优先级越高。用于当交换机阻塞时,优先发送优先级高的数据包。 | +| CFI | 1比特 | CFI (Canonical Format Indicator),长度为1比特,表示MAC地址是否是经典格式。CFI为0说明是经典格式,CFI为1表示为非经典格式。用于区分以太网帧、FDDI(Fiber Distributed Digital Interface)帧和令牌环网帧。在以太网中,CFI的值为0。 | +| VID | 12比特 | LAN ID,长度为12比特,表示该帧所属的VLAN。在VRP中,可配置的VLAN ID取值范围为1~4094。 | +| Length/Type | 2字节 | 指后续数据的字节长度,但不包括CRC检验码。 | +| Data | 42~1500字节 | 负载(可能包含填充位)。 | +| CRC | 4字节 | 用于帧内后续字节差错的循环冗余检验(也称为FCS或帧检验序列)。 | + +### 报文示例 + +![报文](images/QinQ基础操作/报文-1582421531943.png) + +### TPID(Tag Protocol Identifier) + +TPID:标签协议标识ID(Tag Protocol Identifier)是Vlan tag中的一个字段,标识该vlan tag的协议类型。IEEE 802.1Q协议规定QinQ的外层vlan标签的type值为:(0x8100)。 + +![外层type](images/QinQ基础操作/外层type.png) + +> IEEE802.1Q协议定义的以太网帧的VLAN Tag。802.1Q Tag位于SA(Source Address)和Length/Type之间。通过检查对应的TPID值,设备可确定收到的帧承载的是运营商VLAN标记还是用户VLAN标记。接收到帧之后,设备将配置的TPID值与帧中TPID字段的值进行比较。如果二者匹配,则该帧承载的是对应的VLAN标记。例如,如果帧承载TPID值为0x8100的VLAN标记,而用户网络VLAN标记的TPID值配置为0x8200,设备将认为该帧没有用户VLAN标记。也就是说,设备认为该帧是Untagged报文。 +> 另外,不同运营商的系统可能将QinQ帧外层VLAN标记的TPID设置为不同值。为实现与这些系统的兼容性,可以修改TPID值,使QinQ帧发送到公网时,承载与特定运营商相同的TPID值,从而实现与该运营商设备之间的互操作性。以太网帧的TPID与不带VLAN标记的帧的协议类型字段位置相同。为避免在网络中转发和处理数据包时出现问题,不可将TPID值设置为下表中的任意值: + +| 协议类型 | 对应值 | +| :------: | :------------------: | +| ARP | 0x0806 | +| RARP | 0x8035 | +| IP | 0x0800 | +| IPV6 | 0x86DD | +| PPPoE | 0x8863/0x8864 | +| MPLS | 0x8847/0x8848 | +| IPX/SPX | 0x8137 | +| LACP | 0x8809 | +| 802.1x | 0x888E | +| HGMP | 0x88A7 | +| 设备保留 | 0xFFFD/0xFFFE/0xFFFF | + +## 基本QinQ配置 + +拓扑: + +![基本qinq](images/QinQ基础操作/基本qinq.png) + +如图示,SW2和SW3用于模拟运营商之间的Internet,SW1和SW4为客户内网。基本QinQ的配置就作用于SW2和SW3之间,将客户内网内的vlan10与vlan20封装上一层vlan100,用于再SW2和SW3之间传输。 + +* SW1和SW4配置相同: + +``` +sysname SW1 +# +vlan batch 10 20 +# +interface GigabitEthernet0/0/1 + port link-type trunk + port trunk allow-pass vlan 10 20 +# +interface GigabitEthernet0/0/2 + port link-type access + port default vlan 10 +# +interface GigabitEthernet0/0/3 + port link-type access + port default vlan 20 +``` + +SW1和SW4只需做基本配置,用作普通二层交换。 + +* SW2和SW3配置相同: + +``` +sysname SW2 +# +vlan batch 100 +# +interface GigabitEthernet0/0/1 + port link-type dot1q-tunnel //开启基本二层QinQ功能 + port default vlan 100 //并划分为vlan100 +# +interface GigabitEthernet0/0/2 + port link-type trunk //普通trunk + port trunk allow-pass vlan 100 +``` + +SW1的`G 0/0/1`为trunk接口,对应连接的SW2的`G 0/0/1`为基本二层QinQ接口,划分vlan为vlan 100。 + +使用PC1发送ICMP包到PC3,数据包内容为: + +![报文2](images/QinQ基础操作/报文2.png) + +其中,可以看到内层的802.1q的vlan标签ID为10,type为(0x0800);外层的,也就是SW2封装的vlan标签ID为100,type为(0x8100)。 + +## 灵活QinQ配置 + +拓扑和上述一样: + +![灵活拓扑](images/QinQ基础操作/灵活拓扑.png) + +我们在模拟internet的SW2和SW3之间添加了一个vlan 200,用于配置灵活的QinQ的vlan 20堆叠一个vlan 200的tag。 + +SW1和SW4的配置与普通的QinQ的配置相同,无需改变。 + +* SW2与SW3配置相同: + +``` +sysname SW2 +# +vlan batch 100 200 +# +interface GigabitEthernet0/0/1 + port link-type hybrid //必须是hybrid接口模式 + qinq vlan-translation enable //开启vlan转换 + port hybrid untagged vlan 100 200 //出方向时剥离vlan100和200的标签 + port vlan-stacking vlan 10 stack-vlan 100 //vlan10堆叠vlan100tag + port vlan-stacking vlan 20 stack-vlan 200 ////vlan20堆叠vlan200tag +# +interface GigabitEthernet0/0/2 + port link-type trunk + port trunk allow-pass vlan 100 200 +``` + +从vlan10和vlan20的PC分别向各自的vlan发包,可以看到数据包内容: + +* vlan10 + +![报文3](images/QinQ基础操作/报文3.png) + +* vlan20 + +![vlan20](images/QinQ基础操作/vlan20.png) +当两台PC机正常通信的时候,可以看到不同vlan封装的外层vlan tag也是不一样的。这就是基于vlan的灵活QinQ。 + +## 上述拓扑 + +* [灵活QinQ](http://cloud.defect.ink/s/s9l4h9rx) +* [接口QinQ](http://cloud.defect.ink/s/5ttw9ett) + +## 参考 + +* [QinQ帧格式](http://www.023wg.com/message/message/cd_feature_eth_qinq.html) +* [QinQ基础知识](https://blog.csdn.net/qq_38265137/article/details/80404320) \ No newline at end of file diff --git a/source/_posts/Resilio-Sync多平台实时同步.md b/source/_posts/Resilio-Sync多平台实时同步.md new file mode 100644 index 0000000..5d4ddfa --- /dev/null +++ b/source/_posts/Resilio-Sync多平台实时同步.md @@ -0,0 +1,343 @@ +--- +title: Resilio Sync多平台实时同步 +date: 2019-05-18 12:31:45 +tags: Tools +categories: 实践 +url: multi-platform-real-time-synchronization-by-resilio-sync +index_img: /defect/images/Resilio-Sync多平台实时同步/res.png +--- + +> 备份,同步一步到位。🏹 + +## 什么是Resilio Sync + +[Resilio Sync](https://www.resilio.com/individuals/)是一款多平台的文件同步工具,能够实现几乎实时的同步效果。原名BitTorrent Sync,看到的原名就能想到,它的运作原理类似于我们的BitTorrent。 + +它是由[BitTorrent](https://en.wikipedia.org/wiki/BitTorrent_(company))开发的一款基于P2P的协议来进行传输文件的。 + +它和我以前用过的一款运作于Linux发行版之上的同步软件[lsyncd](https://github.com/axkibe/lsyncd)类似,都能达到几乎实时监控指定文件夹变动的一款同步工具。 + +相比较二者之间的不同的是,Resilio Sync在Windows平台是拥有GUI的(亦是使用WebUI),但是在其他服务端的操作系统上,类似于各种Linux发行版与Windows Server。它的GUI是以WebUI的方式提供给我们使用的。 + +这也是它的优点之一了,在不用反复的修改配置文件的情况下,我们可以使用基于WebUI的一种交互方式来对其进行操作。 + +这也是我很喜欢它的地方之一了❤ + +### 优点 + +如果我们用作同步工具来使用的话,它还是有很多的优点的: + +1. 可以纯内网工作(P2P) +2. 多人实时同步,原理是人越多速度越快(BitTorrent) +3. 存储空间及流量等不受限制 +4. 多平台、多网络环境同步 +5. Free for home +6. WebUI + +### 缺点 + +事物都是拥有两面性的,既然它拥有不少优点。那么缺点肯定也不会缺席: + +1. 闭源软件(Free for home) +2. 公共网络可能会使用中转服务器 +3. 类似BT的原理,机器需要保持在线才能保证传输 + +### 多平台 + +- Windows +- Mac OS +- Linux +- FreeBSD +- NAS设备 +- [Android](https://play.google.com/store/apps/details?id=com.resilio.sync&hl=en_US) +- [IOS](https://itunes.apple.com/us/app/resilio-sync/id1126282325?mt=8) + +两个移动设备上目前还是一款免费软件,不知道功能是什么样的。但是身为一个闭源软件在多平台都有免费使用的方案还是很欣慰的。 + +## 同类 + +[Syncthing](https://syncthing.net/)几乎就是Resilio Sync的另一面了,有人说它就是Resilio Sync的替代品。它不但能够实现相应的实时同步的所有功能,并且还是一款开源的自由软件。 + +对于我们来说,一款开源软件不仅仅是不收费这么简单。当一款开源软件由社区进行驱动时,人人都可以完全查看它的源代码以及改进。因此,一款开源软件对我们最大的益处就是真正安全与尊重隐私。 + +但闭源软件也有它存在的合理处,如果我们未来需要可靠稳定的支持,与更多的付费服务。Resilio Sync肯定也是一个不错的选择。毕竟顾客即是上帝🍡 + +总之各个实时同步的软件之间都是各有各的优缺点,具体想要使用哪一款,完全根据我们自身的需要与心情就OK了。 + +## 安装 + +上述我们有提到Resilio Sync支持多种平台,这里的我只使用到了Windows与Linux的两个发行版之间。所以其他平台的安装没有相应的记录。 + +### Windows + +Windows是我们平常接触最多的一款GUI操作系统了,对于安装软件来说,差距都不会太大的。Resilio Sync也是同样。直接前往[官网](https://www.resilio.com/individuals/#hero)选择合适的授权下载安装即可。 + +安装界面仅仅只需要一步 + +![rs安装](images/Resilio-Sync多平台实时同步/rs安装.png) +合适的选择后,对于较新的Windows平台可是直接打开一个软件窗口 + +![入门sync](images/Resilio-Sync多平台实时同步/入门sync.png) + +接受了几个隐私政策与EULA之后(有空还是要多留意条款之类的),我们就可以正常使用了。 + +打开后的简洁的界面 + +![打开](images/Resilio-Sync多平台实时同步/打开.png) + +配置之类的稍后再说,再将自己的其他平台的机器也给完成安装。 + +### Linux + +对于在各个Linux平台的安装,官方有给一个完整的[帮助文档](https://help.resilio.com/hc/en-us/articles/206178924-Installing-Sync-package-on-Linux)其中有各个版本的不同数位版的下载链接。以及一些发行版的手动添加源的二进制安装方式。 + +- 下载安装包 + +对于网络环境不好的时候,可以考虑使用离线安装包的方式来安装。官方给了两个包,分别是deb和rpm。 + +DEB: + +``` +sudo dpkg -i +``` + +RPM + +``` +sudo rpm -i +``` + +由于我的服务器因为网络环境无法与其官方源通信,所以只好选择使用下载离线安装包的方式来进行安装了。 + +相比较之下,个人感觉Linux平台的安装甚至比带有GUI的Windows更加方便。对于此软件,至需要一条命令即可。速度也很快。 + +- 使用软件仓库安装 + +使用软件仓库安装,我们需要简单的三个步骤: + +1. 添加仓库源 +2. 添加GPG公钥用于验证 +3. 安装✨ + +对于Debian-based Linux(Debian, Ubuntu, Mint, Zorin, Elementary) + +创建用于安装的仓库源列表: + +``` +echo "deb http://linux-packages.resilio.com/resilio-sync/deb resilio-sync non-free" | sudo tee /etc/apt/sources.list.d/resilio-sync.list +``` + +添加公钥: + +``` +curl -LO http://linux-packages.resilio.com/resilio-sync/key.asc && sudo apt-key add ./key.asc +``` + +更新源与安装: + +``` +sudo apt-get update +sudo apt-get install resilio-sync +``` + +对于RPM-based Linux(Red Hat, Fedora, CentOS) + +创建用于安装的仓库源列表: + +``` +printf "[resilio-sync]\nname=Resilio Sync\nbaseurl=https://linux-packages.resilio.com/resilio-sync/rpm/\$basearch\nenabled=1\ngpgcheck=1\n" | sudo tee /etc/yum.repos.d/resilio-sync.repo +``` + +添加公钥: + +``` +sudo rpm --import https://linux-packages.resilio.com/resilio-sync/key.asc +``` + +安装: + +``` +sudo yum install resilio-sync +``` + +更新: + +``` +sudo yum check-update +sudo yum update resilio-sync +``` + +## 运行与配置 + +Windows上的打开软件不需要任何多嘴了,双击快捷方式打开就好了。 + +对于Linux发行版上,几款目前常用的较新的发行版运行软件的方式都是差不多的。 + +可以使用Systemd进行控制 + +自动运行服务: + +``` +sudo systemctl enable resilio-sync +``` + +启动与停止: + +``` +sudo systemctl start resilio-sync +sudo systemctl stop resilio-sync +``` + +对于在没有GUI的机器的环境下,是可以使用WebUI通过其他机器的浏览器访问来进行控制操作。 + +所以我们可以修改其配置文件来进行启动操作。 + +### 默认的配置文件 + +``` +/etc/resilio-sync/config.json +``` + +而对于基本的使用,配置文件也是非常的简单易读的。 + +``` +{ + "storage_path" : "/var/lib/resilio-sync/", + "pid_file" : "/var/run/resilio-sync/sync.pid", + + "webui" : + { + "listen" : "127.0.0.1:8888" + } +} +``` + +对于,官方文档称为了安全选择,软件默认监听`127.0.0.1`。如果需要在其他机器上直接访问的话,我们需要修改监听地址为: + +``` +"listen" : "0.0.0.0:8888" +``` + +并且可以根据自己的需求修改监听的端口。 + +其中`storage_path`为软件的一些设置,log等文件的存放目录。也可以根据自身的需要修改。 + +``` +╰─# ls /var/lib/resilio-sync/ +debug.txt history.dat http.port settings.dat.old storage.db-wal sync.dat.old sync.log +FileDelayConfig history.dat.old settings.dat storage.db sync.dat sync.lng +``` + +### 示例配置文件 + +上述运行的配置文件那么的简单易懂,同时可自定义的功能也就是更少了。而对于软件的一些其他功能在配置文件中的写法,官方是有留给我们示例的配置文件的。 + +我们只需要使用一条命令就可以将示例的配置文件导出到当前目录下: + +``` +rslsync --dump-sample-config > sync.conf +``` + +并且其中注释说明等都是非常完善的: + +``` +╰─# cat sync.conf +{ + "device_name": "My Sync Device", +// "listening_port" : 0, // 0 - randomize port + +/* storage_path dir contains auxilliary app files if no storage_path field: .sync dir created in current working directory */ +// "storage_path" : "/home/user/.sync", + +/* set location of pid file */ +// "pid_file" : "/var/run/resilio/resilio.pid", + +/* use UPnP for port mapping */ + "use_upnp" : true, + +/* 这里只截取部分配置 */ +``` + +当我们修改的差不多的使用,我们就可以使用上述命令启动了。启动后,可以在进程中看到默认读取的配置文件的路径: + +``` +╰─# ps -aux | grep rslsync +rslsync 88730 0.5 1.5 772560 15316 ? Ssl 01:12 0:05 /usr/bin/rslsync --config /etc/resilio-sync/config.json +``` + +### 用户 + +同样是为了安全原因,软件默认是使用最小权限的**rslsync**的用户来运行的。这样就会导致一个问题,在**rslsync**这个用户没有权限的目录就无法打开,就会导致无法使用该目录了。 + +最简便的解决办法就是将需要的文件夹给予用户**rslsync**可使用的权限,我们可以将**rslsync**添加到当前的用户组,并保证需要同步的文件夹用于上述组的权限: + +``` +sudo usermod -aG user_group rslsync +sudo chmod g+rw synced_folder +``` + +亦或者直接修改rslsync用户为当前使用的用户来运行程序,编辑文件**/usr/lib/systemd/user/resilio-sync.service**将文件中的: + +``` +WantedBy = multi-user.target +``` + +修改为: + +``` +WantedBy = default.target +``` + +随后需要reload systemd并重启程序: + +``` +systemctl daemon-reload +systemctl --user start resilio-sync +``` + +此处的`--user`与普通启动可以分别守护两个进程,默认的分别为: + +``` +rslsync 27519 0.4 0.8 670144 16928 ? Ssl 15:36 0:01 /usr/bin/rslsync --config /etc/resilio-sync/config.json +root 29385 0.3 0.4 589864 9676 ? Ssl 15:43 0:00 /usr/bin/rslsync --config /root/.config/resilio-sync/config.json +``` + +且`--user`的用户成功被更改为当前用户root。当然配置文件也是独立的。 + +### 除此之外 + +软件还可以直接在终端中使用`rslsync`命令来进行运行等其他控制。上述的打印示例配置文件就是一个例子。关于该方式的更多可以在官方的帮助文档[Guide To Linux, And Sync Peculiarities](https://help.resilio.com/hc/en-us/articles/204762449-Guide-to-Linux)中找到。 + +成后运行后的界面与Windows完全一样。毕竟二者是同一种方式展示的UI界面。 + +![home_centos](images/Resilio-Sync多平台实时同步/home_centos.png) + +## 同步 + +安装均已经完成,接下来就是简单从操作来实现需要的同步效果了。 + +在保证权限都是正常的情况下,添加在A机器添加我们需要进行同步的文件夹。选择好了之后就是三种分享链接的方式。 + +![开始同步](images/Resilio-Sync多平台实时同步/开始同步.png) + +分别是“链接”、“密钥”和二维码三种方式。 + +随后我们就可以使用三种方式的其中一种,例如使用我最喜欢的密钥,选择好读写权限后,在需要同步的B机器上输入复制过来的密钥。 + +![输入密钥](images/Resilio-Sync多平台实时同步/输入密钥.png) + +然后等着他们自己开始同步就OK了。在多平台的环境下也是不会影响正常工作的。 + +除此之外,对于同步的文件夹还有一些其他的选项可以配置。具体就看自己的需要来配置了🌭 + +![其他选项](images/Resilio-Sync多平台实时同步/其他选项.png) + +## 参考&推荐阅读 + +* [Installing Sync Package On Linux](https://help.resilio.com/hc/en-us/articles/206178924-Installing-Sync-package-on-Linux) +* [Legal](https://www.resilio.com/legal/eula/) +* [BitTorrent (company)](https://en.wikipedia.org/wiki/BitTorrent_(company)) +* [Resilio Sync](https://en.wikipedia.org/wiki/Resilio_Sync) +* [Resilio Sync Android](https://play.google.com/store/apps/details?id=com.resilio.sync&hl=en_US) +* [Resilio Sync IOS](https://itunes.apple.com/us/app/resilio-sync/id1126282325?mt=8) +* [Resilio Sync Help Center](https://help.resilio.com/hc/en-us) \ No newline at end of file diff --git a/source/_posts/Teamspeak-Server.md b/source/_posts/Teamspeak-Server.md new file mode 100644 index 0000000..4f497e2 --- /dev/null +++ b/source/_posts/Teamspeak-Server.md @@ -0,0 +1,270 @@ +--- +title: 开黑之路-Teamspeak Server搭建 +date: 2019-05-29 8:05:00 +tags: Player +categories: Player +url: teamspeak-server +index_img: /defect/images/Teamspeak-Server/logo.jpg +--- + +> 与小伙伴的开黑之路🤞 + +## Teamspeak? + +![teamspeak](images/Teamspeak-Server/teamspeak.png) + +Teamspeak是一套专有的VoIP软件。所谓VoIP软件,就是基于网络协议的语音通话。而Teamspeak就是和现在市面上大多数即时通讯软件差不多,可以发送即时消息以及多人语音通话。 + +它是以S(erver) -> C(lient)架构基于Internet的运作方式,但是与其他多数软件不同的是,它允许自己搭建服务器。也就是说它的服务端也是可以下载安装的。 + +而且Teamspeak是一款多平台的软件,这就意味着,如果我们想,可以让在任何机器上运行成为服务端。它甚至支持离线/局域网的通信。 + +除此之外,它对自己的通信频道有着完全自定义的控制。设置官方称可以为整个服务器或只是特定通道启用基于AES的加密。 + +我主要喜欢它的地方在于,完全不需要注册账号。可以建立在私人服务器上并有着很完成的控制权限。 + +## 服务端 + +废话了半天,我们了解它是一款可以搭建在自己私人服务器上的一款即时通讯软件。所以接下来就是安装操作了。 + +### 服务器环境 + +首先,我用做服务端的环境: + +* Server:阿里云ECS +* Bandwidth:1M +* OS:Ubuntu 18.04 bionic + +``` + ./+o+- root@Cruiser + yyyyy- -yyyyyy+ OS: Ubuntu 18.04 bionic + ://+//////-yyyyyyo Kernel: x86_64 Linux 4.15.0-041500-generic + .++ .:/++++++/-.+sss/` Uptime: 26d 11h 31m + .:++o: /++++++++/:--:/- Packages: 1031 + o:+o+:++.`..```.-/oo+++++/ Shell: zsh 5.4.2 + .:+o:+o/. `+sssoo+/ WM: + .++/+:+oo+o:` /sssooo. CPU: Intel Xeon E5-2682 v4 @ 2.494GHz + /+++//+:`oo+o /::--:. GPU: cirrusdrmfb + \+/+o+++`o++o ++////. RAM: 588MiB / 1993MiB + .++.o+++oo+:` /dddhhh. + .+.o+oo:. `oddhhhh+ + \+.++o+o``-````.:ohdhhhhh+ + `:o+++ `ohhhhhhhhyo++os: + .o:`.syhhhhhhh/.oo++o` + /osyyyyyyo++ooo+++/ + ````` +oo+++o\: + `oo++. +``` + +(主要是内存有点多的空闲…… + +### 下载地址 + +既然是安装,首先是下载用于作为服务端的软件。据我所知,TS是不开源的。 + +→[官方下载地址](https://www.teamspeak.com/zh-CN/downloads/) + +客户端平台: + +* LINUX +* MACOS +* WINDOWS +* ANDROID +* IOS + +听说两个移动端都不怎么样。 + +当然,我们主要搭建的是服务端,服务端的平台也不少: + +* MACOS +* WINDOWS +* FREEBSD +* LINUX + +这些都是我们常见的服务器操作系统。也就是说搭建服务端对系统没有多大挑剔性了。 + +### 开始动手 + +从上述的下载地址中,我们下将服务端的软件下载到我们的服务器上: + +``` +wget https://files.teamspeak-services.com/releases/server/3.6.1/teamspeak3-server_linux_amd64-3.6.1.tar.bz2 +``` + +(这条命令的软件版本可能会随着TS的更新而失效) + +由于下载下来的是`tar.bz2`的压缩格式,所以我们使用`-xjvf`来进行解压操作: + +``` +tar -xjvf teamspeak3-server_linux_amd64-3.6.1.tar.bz2 +``` + +解压之后的文件夹目录: + +``` +CHANGELOG libts3db_mariadb.so libts3_ssh.so LICENSE-THIRDPARTY serverquerydocs ts3server ts3server_startscript.sh +doc libts3db_sqlite3.so LICENSE redist sql ts3server_minimal_runscript.sh tsdns +``` + +我们可以了解到它有一堆各种各样的文件,我们不需要去一个个的了解。据说是专有软件,也就是不开源。所以我们也更不需要去编译等操作了。这些文件肯定都是已经编译好的了。 + +要运行服务端的软件,首先我们要同意它的许可协议。(如果有人愿意看的话 + +``` +touch .ts3server_license_accepted +``` + +`touch`这样一个文件在刚刚解压出的目录就意味着我们同意License了。 + +同意过后,我们执行它的启动脚本: + +``` +./ts3server_startscript.sh start +``` + +如果是root用户运行的话,会在启动时提示为了”安全起见,不要使用root用户运行“: + +``` +WARNING ! For security reasons we advise: DO NOT RUN THE SERVER AS ROOT +!!!!!!!!!!! +``` + +当然等最后几个感叹号出现完之后,服务端软件就会正常运行了。就可以继续快乐的当root敢死队了🎉。当然使用什么用户运行取决于你自己。我这边是和自己的小伙伴开黑用的,几乎就是私用,不会将服务器做为公用。所以我并不怕死😈。 + +警告⚠我们过后,就是正常启动了 + +``` +Starting the TeamSpeak 3 server +TeamSpeak 3 server started, for details please view the log file + +------------------------------------------------------------------ + I M P O R T A N T +------------------------------------------------------------------ + Server Query Admin Account created + loginname= "serveradmin", password= "dxxxxxxAa" +------------------------------------------------------------------ + + ○ +------------------------------------------------------------------ + I M P O R T A N T +------------------------------------------------------------------ + ServerAdmin privilege key created, please use it to gain + serveradmin rights for your virtualserver. please + also check the doc/privilegekey_guide.txt for details. + + token=HxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxRL +------------------------------------------------------------------ + +``` + +机会将等会会在客户端用的admin账户以及token显示在我们的终端上了。serveradmin账户和token都是TS的最高权限账户,可修改服务器设置。下文会用到 + +进程: + +``` + ○ ps -aux | grep ts3 +root 4031 0.4 1.1 689336 22820 pts/0 Sl 10:44 0:07 ./ts3server +``` + +### 防火墙 + +如果我们的服务器有启用防火墙来限制网络的话,ts需要一些TCP/UDP的端口来和客户端进行通信。 + +目前的Teamspeak 3需要这些端口: + +* UDP: 9987 +* TCP: 10011 +* TCP: 30033 + +可以在`iptables`中添加: + +``` +iptables -A INPUT -p udp --destination-port 9987 -j ACCEPT +iptables -A INPUT -p tcp --dport 10011 -j ACCEPT +iptables -A INPUT -p tcp --dport 30033 -j ACCEPT +``` + +亦或者使用`firewalld`: + +``` +rewall-cmd --zone=public --add-port=9987/udp --permanent +firewall-cmd --zone=public --add-port=10011/tcp --permanent +firewall-cmd --zone=public --add-port=30033/tcp --permanent +firewall-cmd --reload +``` + +对于一些特殊的发行版可能需要特殊操作,例如我当前的ECS机器,它的防火墙(iptables)的工作方式不是以进程方式运行的。(虽然我也不懂…… + +但是新建防火墙的规则与上述不同,具体可以了解我很早以前[水过的一篇文章](https://www.defectink.com/defect/23.html) + +### 开机启动 + +当前已经添加过了端口并且已经成功启动了,我们基本上就可以正常连接了。当然还少了一个重要的一步,那就是开机自启了。 +由于是使用脚本启动了,而没有使用`systemd`来进行控制,所以服务端需要使用`Crontab`来进行开机启动的控制 + +``` +@reboot /root/teamspeak/teamspeak3-server_linux_amd64/ts3server_startscript.sh start +``` + +在crontab文件中添加对应的ts脚本启动位置,来实现开机启动ts服务端的效果。 +添加完成后我们可以使用`crontab -l`来查看添加完成后的crontab文件,确认是否添加成功。 +至此,运行于Ubuntu上的Teamspeak服务端就运行成功了。 + +## 客户端 + +上述我们介绍过客户端软件支持的平台以及服务端的安装搭建。客户端的[下载地址](https://www.teamspeak.com/en/downloads/)于服务端是同一个地址,可以找的适用于自己的平台的安装包来进行下载安装。 + +### 连接服务端 + +前面有介绍过TS使用的是C/S架构,我们搭建好了服务端当然是为了连接它。连接它比我们想象的要简单的多,打开软件后直接在工具栏就能找到连接这一选项。 +单击连接,就可以根据服务器地来连接我们搭建好的服务端了。 + +![连接服务器](images/Teamspeak-Server/连接服务器.png) + +我们可以看到有三个选项框,第一个是服务器地址,其次是服务器密码,最后是用于展示给其他人的昵称 +默认新安装的服务端是没有密码的,如果我们是连接一个新服务器的话,是可以将密码留空登陆。 +**这里的昵称只用于展示于其他人,不等于我们的用户名。** + +### Token + +在上述我们的安装服务端的操作中,第一次启动后会给我们一个serveradmin账户一段token码。ts这个软件不是那么的强调用户。我们登陆至服务器是不需要创建一个拥有密码的账户的。这和我们目前常用的微信、QQ等软件是略有不同的。 + +但是ts它也是有用户身份的,因为ts大部分对于服务器的控制操作都是可以在客户端完成的。这时候我们就需要一个有高等级权限的用户身份来完成这个操作。同样需要识别出其他连接进来的用户没有修改服务器的权限。 + +如果是第一次连接至ts的新服务器,那么我们连接成功后就会立马弹出一个用于输入token的对话框。我们将刚刚创建服务器时给我们的token填入即可。这样就可以直接在客户端修改自己的服务器了。 + +![token](images/Teamspeak-Server/token.png) + +因为ts默认在使用客户端时会自动创建一个用户身份,每个身份都是不相同的。**那如果我们更换电脑连接自己的服务器时,或者想给其他人一个修改服务器的权限时该怎么办呢?** + +- 导出当前的用户身份 + +在工具栏的“工具-身份”这个标签中,我们可以看到自己当前账户身份。直接右击便可以执行导出操作。在其他地方使用相同方法导入就可以继续使用这个身份了。 +![身份](images/Teamspeak-Server/身份.png) + +- 新建token码 + +当我们想给其他身份的用户修改服务器的权限的时候,我们可以使用新建权限码的方式来提升其他用户的权限。 +在工具栏的“权限-权限码清单”中就可以找的新建权限码的按钮以及已经新建过的权限码清单。新建时也可以选择不同的权限来进一步控制。使用权限码就和我们第一次使用时一样操作即可。 +![权限码](images/Teamspeak-Server/权限码.png) + +### 翻译插件 + +如何安装软件这里就不再做赘述。ts默认是英文版本的,可以自己在其他地方下载拥有中文汉化的第三方做的包来使用。也可以自己在原版的基础上添加汉化文件。亦或者是自己安装中文翻译的插件(目前中文插件仅有繁体中文)。 + +打开软件后,打开“工具-选项”(Alt+P),找到“插件(add-ons)”这一选项卡。 + +![插件](images/Teamspeak-Server/插件.png) + +默认看到的是当前本地的插件,我们可以选择“Browse online"来查看在线可以下载安装的插件。选择筛选器为”翻译“然后输入”Chinese“就可以找到一款繁体中文的插件。点击进入插件的详情页面就可以看到”install“。单击安装即可。 + +![繁体中文](images/Teamspeak-Server/繁体中文.png) + +Install完成之后重新打开软件就会应用上翻译了。如果没有成功应用,可以再去刚刚插件地方看看有没有启用。 +除了翻译插件之外,TS还有很多种类的插件,以及界面皮肤等。和刚刚安装翻译插件的方法一摸一样。 + +![TS3](images/Teamspeak-Server/TS3-1582422801541.png) + +## 参考 + +* [Teamspeak 3 Server Ports](https://forum.teamspeak.com/threads/46486-Teamspeak-3-Server-Ports) \ No newline at end of file diff --git a/source/_posts/systemd的基础操作.md b/source/_posts/systemd的基础操作.md new file mode 100644 index 0000000..837957a --- /dev/null +++ b/source/_posts/systemd的基础操作.md @@ -0,0 +1,234 @@ +--- +title: systemd的基础操作 +date: 2019-06-14 14:42:41 +tags: Linux +categories: Linux +url: basic-knowledge-of-systemd +index_img: /defect/images/systemd的基础操作/logo.png +--- + +## 什么是systemd? + +Systemd是我们常用的一些Linux发行版中常见的一套中央化系统及设置管理程序(init),包括有[守护进程](https://zh.wikipedia.org/wiki/%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B)、[程序库](https://zh.wikipedia.org/wiki/%E7%A8%8B%E5%BC%8F%E5%BA%AB)以及应用软件。 + +我们经常使用`systemctl start apache2`来启动一些服务或者应用软件时,使用到的就是Systemd的一部分。 + +当前绝大多数的Linux发行版都已采用systemd代替原来的[System V](https://zh.wikipedia.org/wiki/UNIX_System_V)。 + +## 学习它的作用? + +它能够方便的对一些软件运行进行管理,经常使用`systemctl`的同学们可能会比较了解,譬如查看运行状态,设置开机自启等操作。 + +最近尝鲜了Ubuntu,但是遇到个新的问题。在Ubuntu 18.10中,已经将以前的开机自启动的脚本`/etc/rc.local`去掉了。无意中看到使用systemd来控制开机自启应用程序。 + +后来就顺便尝试进一步了解一下systemd,毕竟还是比较有用的。 + +## 开机运行启动的原理 + +一些支持systemd的软件,在安装时会在`/usr/lib/systemd/system`目录下添加一个支持systemd的配置文件。当我们使用`systemctl enable apache2`时,就相当于将`/usr/lib/systemd/system`目录下的配置文件添加一个符号链接,链接到`/etc/systemd/system`目录。 + +当我们的系统开机时,systemd会执行`/etc/systemd/system`目录下的配置文件,以达到开机自启的效果。 + +最近发现当前较新的发行版,使用enable命令时,创建的链接目录为: + +``` +~ systemctl enable httpd +Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service. +``` + +## 配置文件 + +几条常用且熟悉的sysemctl的命令这里就不在详细介绍了。这里直接了解一下最核心的部分,配置文件。 + +早在很久以前,对于[Nyncat](https://www.defectink.com/defect/12.html)这篇文章,里面就使用到自己编写systemd的配置文件来达到对nyancat这个服务的详细控制。(虽然当时我不理解配置文件说的啥… + +上述了解到,配置文件一般情况下出现在两个地方:`/usr/lib/systemd/system`目录和`/etc/systemd/system/multi-user.target.wants`目录。对于完全不了解配置文件的情况下,我们可以先在这两个目录找个案例了解一下。 + +**某些Ubuntu的发行版可能在`/lib/systemd/system`目录下保存配置文件** + +例如,CentOS的httpd: + +``` +[Unit] +Description=The Apache HTTP Server +After=network.target remote-fs.target nss-lookup.target +Documentation=man:httpd(8) +Documentation=man:apachectl(8) + +[Service] +Type=notify +EnvironmentFile=/etc/sysconfig/httpd +ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND +ExecReload=/usr/sbin/httpd $OPTIONS -k graceful +ExecStop=/bin/kill -WINCH ${MAINPID} +# We want systemd to give httpd some time to finish gracefully, but still want +# it to kill httpd after TimeoutStopSec if something went wrong during the +# graceful stop. Normally, Systemd sends SIGTERM signal right after the +# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give +# httpd time to finish. +KillSignal=SIGCONT +PrivateTmp=true + +[Install] +WantedBy=multi-user.target +``` + +我们可以了解到,它基本上分为三个区块:`Unit`、`Service`和`Install`区块。 + +### Unit区域 + +Unit区域用于解释启动顺序与依赖关系。可以直观的看到它有几个字段: + +- Description +- After +- Documentation + +第一眼看上去可能都是比较乱七八糟的,根本不知道它在说啥。但是我们拆开来一个一个了解,就会发现它意义非常的简单。 + +**Description**:用于给出当前服务的简单描述。通常我们查看服务状态时,都会在第一行看到这么一句话: + +``` +httpd.service - The Apache HTTP Server +``` + +这就是`Descipton`字段的作用,一句话对当前服务的简单介绍。 + +**After**:该字段是有关于启动顺序的字段,从字面意思我们就应该大概了解到,这个值应该是定义当前服务应该启动在哪些服务之后。 + +上述配置文件该值解释就是:当`network.target remote-fs.target nss-lookup.target`这些服务需要启动,那么当前的`httpd.service`应该在他们之后启动。 + +相对的,和`After`对应的还有个`Before`字段。了解了`After`这个`Before`就应该很容易理解了。完全和`After`相对的意思,定义`httpd.service`应该在哪些服务之前启动。 + +After和Before只关乎到服务的启动顺序,并不关乎到依赖关系。 + +**Documentation**:该字段比较简单,和`Descripton`作用差不多。它的值用于给出当前服务的文档的位置。 + +当前配置文件中并没有说明依赖关系的字段。依赖关系和启动顺序都是写在当前这个Unit区域的,它俩非常像象,但是作用不同。 + +依赖关系有两个字段进行控制:`Wants`和`Requiers`。 + +**Wants**:表示弱依赖关系,即使该值内的服务启动失败,也不影响当前服务的继续运行。 + +**Requires**:表示强依赖关系,如果该值内的服务无法运行,那么当前服务也将停止。 + +打个比方: + +当前的httpd.service需要依赖mysql来存储数据。如果在配置文件中它只定义了在mysql之后启动。而没定义依赖关系,那么当mysql出现错误停止时,在重新启动期间,当前的httpd将无法与mysql建立链接。 + +**这里只是打个比方帮助我们更好的了解,实际情况下httpd在通常和mysql是没有这样的依赖关系的🍥。** + +### Service区域 + +Service区域是主要的一部分,主要控制软件的启动停止等,都是在此部分声明的。也就是定义了如何启动当前的服务。 + +许多软件都有环境参数文件,使用`EnvironmentFile`字段便可以定义环境参数。 + +`EnvironmentFile`字段:指定当前服务的环境参数文件。该文件内部的`key=value`键值对,可以用`$key`的形式,在当前配置文件中获取。 + +例如,启动`sshd`,执行的命令是`/usr/sbin/sshd -D $OPTIONS`,其中的变量`$OPTIONS`就来自`EnvironmentFile`字段指定的环境参数文件。 + +除此之外,Service区域还有一些关于控制软件行为的一些字段: + +* `ExecStart`字段:定义启动进程时执行的命令。 + +- `ExecReload`字段:重启服务时执行的命令 +- `ExecStop`字段:停止服务时执行的命令 +- `ExecStartPre`字段:启动服务之前执行的命令 +- `ExecStartPost`字段:启动服务之后执行的命令 +- `ExecStopPost`字段:停止服务之后执行的命令 + +所有的启动设置之前,都可以加上一个连词号(`-`),表示"抑制错误",即发生错误的时候,不影响其他命令的执行。比如,`EnvironmentFile=-/etc/sysconfig/sshd`(注意等号后面的那个连词号),就表示即使`/etc/sysconfig/sshd`文件不存在,也不会抛出错误。 + +此外,Service中还有几个比较重要的字段 + +**Type**字段,它有如下一些值: + +- simple(默认值):`ExecStart`字段启动的进程为主进程 +- forking:`ExecStart`字段将以`fork()`方式启动,此时父进程将会退出,子进程将成为主进程 +- oneshot:类似于`simple`,但只执行一次,Systemd 会等它执行完,才启动其他服务 +- dbus:类似于`simple`,但会等待 D-Bus 信号后启动 +- notify:类似于`simple`,启动结束后会发出通知信号,然后 Systemd 再启动其他服务 +- idle:类似于`simple`,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合 + +### Install区域 + +`Install`区块,定义如何安装这个配置文件,即怎样做到开机启动。 + +`WantedBy`字段:表示该服务所在的 Target。 + +`Target`的含义是服务组,表示一组服务。`WantedBy=multi-user.target`指的是,sshd 所在的 Target 是`multi-user.target`。 + +这个设置非常重要,因为执行`systemctl enable sshd.service`命令时,`sshd.service`的一个符号链接,就会放在`/etc/systemd/system`目录下面的`multi-user.target.wants`子目录之中。 + +Systemd 有默认的启动 Target。 + + ```bash + $ systemctl get-default + multi-user.target + ``` + +一般来说,常用的 Target 有两个:一个是`multi-user.target`,表示多用户命令行状态;另一个是`graphical.target`,表示图形用户状态,它依赖于`multi-user.target`。官方文档有一张非常清晰的 [Target 依赖关系图](https://www.freedesktop.org/software/systemd/man/bootup.html#System Manager Bootup)。 + +Target 也有自己的配置文件。 + +```bash +$ systemctl cat multi-user.target + +[Unit] +Description=Multi-User System +Documentation=man:systemd.special(7) +Requires=basic.target +Conflicts=rescue.service rescue.target +After=basic.target rescue.service rescue.target +AllowIsolate=yes +``` + +## 详细的字段解释 + +``` +[Unit] +Description : 服务的简单描述 +Documentation : 服务文档 +Before、After:定义启动顺序。Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx.service之后启动。 +Requires:这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,这个单元也停止了。 +Wants:推荐使用。这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,对本单元没有影响。 +``` + +``` +[Service] +Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。 +Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。 +Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。 +Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。 +Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。 +Type=idle: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。 +PIDFile:pid文件路径 +ExecStartPre:停止服务时执行的命令 +ExecStart:指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。 +ExecReload:指定单元停止时执行的命令或者脚本。 +ExecStop:指定单元停止时执行的命令或者脚本。 +ExecStopPost:停止服务之后执行的命令 +ExecStartPost:启动服务之后执行的命令 +PrivateTmp:True表示给服务分配独立的临时空间 +Restart:这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。 +RemainAfterExit:如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置。 +``` + +``` +[Install] +Alias:为单元提供一个空间分离的附加名字。 +RequiredBy:单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息。 +WantBy:单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。 +Also:指出和单元一起安装或者被协助的单元。 +DefaultInstance:实例单元的限制,这个选项指定如果单元被允许运行默认的实例。 +``` + +## 重启 + +```bash +# 重新加载配置文件 +$ sudo systemctl daemon-reload + +# 重启相关服务 +$ sudo systemctl restart foobar +``` diff --git a/source/_posts/公开密钥密码学.md b/source/_posts/公开密钥密码学.md new file mode 100644 index 0000000..f57d707 --- /dev/null +++ b/source/_posts/公开密钥密码学.md @@ -0,0 +1,147 @@ +--- +title: 公开密钥密码学🔑 +date: 2019-06-05 18:51:32 +tags: Linux +categories: 实践 +url: public-key-cryptgraphy +index_img: /defect/images/公开密钥密码学/logo.jpeg +--- + +GPG/PGP赛高! + +## 什么是非对称加密? + +人类的历史上加密走了很长的一段路程。想尽了各种办法来保护自己那不想让不该知道的人知道的东西。 加密这东西,在密码学中最直白的解释就是将一般的明文信息改变为难以读取的内容,使其不可读的过程只有拥有解密方法的对象,经由解密过程,才能将密文还原为正常可读的内容。 + +大概在1970年代中期,所谓的“强加密”的使用开始从政府保密机构延申至公共的领域了,也就是说开始到我们大众都开始接触了。当今世界,加密已经是我们的日常生活中常常见到的东西了。 + +例如我们常常访问的带有SSL/TLS的网站,这也是非对称加密的一种。 所谓的对称加密,它也是密码学中的一种。但他与对称加密不同的是,它需要两个密钥,一个是公开密钥,另一个是私有密钥;一个用作加密,另一个则用作解密。使用其中一个密钥把明文加密后所得的密文,只能用相对应的另一个密钥才能解密得到原本的明文;甚至连最初用来加密的密钥也不能用作解密。 + + 由于加密和解密需要两个不同的密钥,故被称为非对称加密; 不同于加密和解密都使用同一个密钥的对称加密。虽然两个密钥在数学上相关,但如果知道了其中一个,并不能凭此计算出另外一个;因此其中一个可以公开,称为公钥,任意向外发布;不公开的密钥为私钥,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供,也不会透露给被信任的要通信的另一方。 + +### 加密 + +如果任何人使用公钥加密明文,得到的密文可以透过不安全的途径(如网络)发送,只有对应的私钥持有者才可以解密得到明文;其他人即使从网络上窃取到密文及加密公钥,也无法(在数以年计的合理时间内)解密得出明文。 + +典型例子是在网络银行或购物网站上,因为客户需要输入敏感消息,浏览器连接时使用网站服务器提供的公钥加密并上传数据,可保证只有信任的网站服务器才能解密得知消息,不必担心敏感个人信息因为在网络上传送而被窃取。 + +在现实世界上可作比拟的例子是,一个传统保管箱,开门和关门都是使用同一条钥匙,这是对称加密;而一个公开的邮箱,投递口是任何人都可以寄信进去的,这可视为公钥;而只有信箱主人拥有钥匙可以打开信箱,这就视为私钥。 + +常见的公钥加密算法有:RSA、ElGamal、背包算法、Rabin(RSA的特例)、迪菲-赫尔曼密钥交换协议中的公钥加密算法、椭圆曲线加密算法(英语:Elliptic Curve Cryptography, ECC)。使用最广泛的是RSA算法(由发明者Rivest、Shmir和Adleman姓氏首字母缩写而来)是著名的公开秘钥加密算法,ElGamal是另一种常用的非对称加密算法。 + +#### 加密过程 + +直白的解释: Tom 和 Jerry想发送一些消息/文件,而不被隔壁的Spike知道文件的内容。于是它们机智的采用了非对称加密来保证内容的安全性。 + +1. Tom先生产非对称的两个密钥,分别为公钥A,私钥B +2. 为了能让Jerry发过来的消息被加密了,Tom先将可公开的公钥A发给Jerry +3. 因为公钥A是完全可公开的,所以Spike知道也没关系 +4. Jerry收到Tom发的公钥A,并将自己的文件X使用公钥A进行加密 +5. 随后Jerry就可以将加密的文件A(X)正大光明的发送给Tom了 +6. 此时的Spike就算截取到加密过的文件A(X)也没有用 +7. 因为Tom收到的加密文件A(X)只有它自己的私钥B能够解密,于是它收到后可以使用私钥B正常解密 +8. 所以如果Tom丢失了它的私钥B,那么Tom and Jerry都无法读取加密的文件A(X)了 +9. (没有私钥就无法解开公钥加密过的信息) +10. 相反,Jerry也可以将自己的公钥发给Tom,使其加密要发给自己的信息。 + +#### 数字签名 + +如果某一用户使用他的私钥加密明文,任何人都可以用该用户的公钥解密密文;由于私钥只由该用户自己持有,故可以肯定该文件必定出自于该用户。 + +公众可以验证该用户发布的数据或文件是否完整、中途有否曾被篡改,接收者可信赖这条信息确实来自于该用户,该用户亦无法抵赖,这被称作数字签名。 所以我们常常见到提示一定要保护好自己的私钥,因为不仅仅会使得加密失效,还会直接影响签名验证。 + +## 非对称加密的软件 + +对于软件来说,我们可能经常听说到GPG这一词。GPG的全称是GNU Privacy Guard(GnuPG或GPG)。它是一款非对称加密的软件,是PGP加密软件的满足GPL的替代物。 也就是说它相对于PGP加密来说,它是一款开源软件。 + +因为PGP的非对称的算法是开源的,所以GPG和PGP原理是完全一样的。通常我们会见到GPG/PGP。 所以PGP就可以简单了解到它是一款非开源的非对称加密软件了。 PGP(英语:Pretty Good Privacy,中文翻译“优良保密协议”)是一套用于讯息加密、验证的应用程序,采用IDEA的散列算法作为加密和验证之用。 + +### 多平台的安装与使用 + +既然上述已经介绍了它是自由软件,那么它跨平台的几率就很大了,支持的平台也非常的多。在官方网站里,我们可以看到它支持很多平台。 + +![GPG多平台](images/公开密钥密码学/GPG多平台.png) + +#### Windows GPG4win + +安装就不再多说,GPG4win的官网有打包好的exe可执行程序,我们直接下载双击安装就好,安装过程也非常的简单,不需要进行任何配置。也就是常说的“无脑next☀”。 + +[Download]() + + GPG4win是GPG在Windows平台的一款可视化的非对称加密软件。对于可视化的软件来说,使用也非常的简单明了。 几乎常用的一些功能都非常直白的写在了刚开打的页面中。基本上只要使用者了解大概的非对称加密的运作原理,就可以很轻松的使用该软件了。 + +![Kleopatra](images/公开密钥密码学/Kleopatra.png) + +![密钥](images/公开密钥密码学/密钥.png) + +#### Ubuntu & CentOS + +目前最新的Ubuntu与CentOS的发行版中都带有GnuPrivacyGuard。也就是GPG的一种,所以使用的方法也是大同小异了。 以Ubuntu为例: * 创建密钥 + +``` +gpg --gen-key +``` + +不知道为啥我的机器在生成密钥的时候会卡住很长时间,导致我没有生成出来。等以后再考虑填这个坑吧。 + +- 查看秘钥 + +``` +查看公钥:gpg --list-key +查看私钥:gpg --list-secret-keys +``` + +- 提取秘钥 + +``` +提取公钥:gpg -a --export newkey > newkey.asc +提取私钥:gpg -a --export-secret-keys newkey > newkey_pirv.asc +``` + +- 导入秘钥 + +``` +导入公钥或私钥:gpg --import newkey +``` + +- 使用公钥加密 + +``` +gpg -ea -r newkey filename +``` + +- 解密并导出为文件 + +``` +gpg -d test.asc > test +``` + +- 设置密钥信任程度 + +``` +gpg --edit-key [导入的密钥ID] +trust +您是否相信这位用户有能力验证其他用户密钥的有效性(查对身份证、通过不同的渠道检查 +指纹等)? + 1 = 我不知道或我不作答 + 2 = 我不相信 + 3 = 我勉强相信 + 4 = 我完全相信 + 5 = 我绝对相信 + m = 回到主菜单 +``` + +## 我的公钥 + +如果有小伙伴想和我扮演Tom and Jerry的话,或者想校验我的签名的文件的话。欢迎使用下述公钥 + +[我的公钥🔒!](https://1drv.ms/u/s!ArC4gW7Dc7wWhd5PD8R_o6Mmhp2LxA?e=Ivpa8X) + +## 参考 + +* [传输层安全性协议](https://zh.wikipedia.org/wiki/%E5%82%B3%E8%BC%B8%E5%B1%A4%E5%AE%89%E5%85%A8%E6%80%A7%E5%8D%94%E5%AE%9A) +* [对称密钥加密](https://zh.wikipedia.org/wiki/對稱密鑰加密) +* [公开密钥加密](https://zh.wikipedia.org/wiki/公开密钥加密) +* [GnuPG](https://zh.wikipedia.org/wiki/GnuPG) +* [PGP](https://zh.wikipedia.org/wiki/PGP) +* [GnuPrivacyGuardHowto](https://help.ubuntu.com/community/GnuPrivacyGuardHowto) \ No newline at end of file diff --git a/source/_posts/水果自定义通知大法.md b/source/_posts/水果自定义通知大法.md new file mode 100644 index 0000000..d753e1c --- /dev/null +++ b/source/_posts/水果自定义通知大法.md @@ -0,0 +1,138 @@ +--- +title: bark-水果自定义通知大法🍎 +date: 2019-06-28 12:12:41 +tags: Tools +categories: 踩坑 +url: bark-custom-notification-for-apple +index_img: /defect/images/水果自定义通知大法/logo.jpg +--- + +> ding~ + +用了一段时间的水果了,发现它的通知来的还是非常及时的。基本上只要连接了网络,通知都不会落下。简单了解过IOS的通知机制:APP→水果服务器→你的机器。也就是说这三个步骤都能够正常通信的情况下,我们的机器就能正常的收到通知。 + +在Android平台也有类似的通知机制,也是由服务端来推送通知到我们的机器,从而到达APP可以不挂后台的情况下收到推送。但是为什么国内的UI用不了我就不清楚了。 + +ding + +## 给自己发通知🐾 + +上述我们简单了解到,既然是由APP控制的推送通知,那么我们既然想要自定义通知就非常简单了。只需要一个能够由我们控制的APP就可以了。 + +App Store中有位大佬开发的[Bark](https://apps.apple.com/cn/app/bark-给你的手机发推送/id1403753865)就是为了这事存在的,它的存在目的就是为了让我们自己给自己推送通知。、 + +Github:[Bark](https://github.com/Finb/Bark) + +![1561705066368](.\images\水果自定义通知大法\1561705066368.png) + +默认它提供了自己的服务器,如果我们需要推送一些较为隐私的消息,可以使用自建服务端。它提供了http接口,后端简单调用即可给自己的水果设备发送推送。 + +## 服务端 + +服务端是一个开源项目,[**bark-server**](https://github.com/Finb/bark-server),这是一个非常简单易用的服务端软件。 + +部署非常简单,并且也有docker的部署方式: + +``` +docker run -dt --name bark -p 8080:8080 -v `pwd`/bark-data:/data finab/bark-server +``` + +当然和我一样的传统用户喜欢直接部署在主机上的也很方便。相对来说,这种简单易用的服务端的部署和使用docker也差距不大,docker不一定会方便到哪去,说不定还会更加难用。 + +我们只需要简单的四步就可以部署完成。 + +- 1、Download precompiled binaries from the [releases](https://github.com/Finb/bark-server/releases) page +- 2、Add executable permissions to the bark-server binary: `chmod +x bark-server` +- 3、Start bark-server: `./bark-server -l 0.0.0.0 -p 8080 -d ./bark-data` +- 4、Test the server: `curl localhost:8080/ping` + +对于第三步来说,`-l`定义是监听的地址,`-p`为监听的端口,`./bark-data`默认使用`/data`目录,可以不定义。 + +当我们使用测试时,返回这样的结果`{"code":200,"data":{"version":"1.0.0"},"message":"pong"}`就意味着我们的服务端已经运行成功了。 + +此时,我们可以在客户端软件中添加我们的服务器地址`http://server-ip:8080`即可,正常通信后,软件界面上的服务器地址就会全部都变成我们自己刚刚搭建的服务器。 + +这个时候应该就已经能够正常的使用了。但是既然自己搭建服务端时为了推送一些较为隐私的消息。那么只使用http就显得有点白忙活了。 + +### https + +目前还不太清楚作者有没有直接在服务端添加证书的操作,从目前的文档来看,https需要我们使用其他的思路了。 + +我目前实现的方法是,既然bark也是基于http接口的,那么我就可以将其只监听`127.0.0.1`,然后使用我的前端apache给它做反代。毕竟apache部署个证书是非常简单的操作。 + +这样可以达到apache和bark的交互只在机器内部工作,而对外开放的apache使用证书添加上https。达到传输加密的效果。 + +这样是可以实现了完全加密推送消息到我的设备上了,至于水果那段不太清楚,应该也是加密的吧。 + +我这里使用的是免费的Let'sEncrypt的证书,他家的不但免费,还有及其方便的脚本直接给apache或其他web服务端配置好证书以及配置文件。并且证书都是保存在相应的目录的,有其他需求时,可以随时使用。 + +唯一一个缺点就是一次的证书只有3个月时长,需要不停的续期,好在官方也有自动续期的脚本。不是特别的麻烦。 + +```bash +~ # ls /etc/letsencrypt/live/api2.defectink.com +cert.pem chain.pem fullchain.pem privkey.pem README +``` + +### 反代 + +apache已经有了证书了,接下来直接反代到我们的bark服务端就ok了。 + +这是我的配置文件: + +```bash +VirtualHost *:80 + ProtocolsHonorOrder On + Protocols h2 h2c http/1.1 + + Servername api2.defectink.com + ServerAdmin webmaster@localhost + + ProxyRequests Off + ProxyMaxForwards 100 + ProxyPreserveHost On + ProxyPass / http://127.0.0.1:8181/ + ProxyPassReverse / http://127.0.0.1:8181/ + + Proxy * + Order Deny,Allow + Allow from all + /Proxy +RewriteEngine on +RewriteCond %{SERVER_NAME} =api2.defectink.com +RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] +/VirtualHost +``` + +只需要注意反代的地址就ok了,也就是我们bark监听的地址。 + +如果一切都没啥问题的话,我们直接打开刚刚配置好证书的apache站点,bark应该就是能够正常运行了。 + +![1561706128389](.\images\水果自定义通知大法\1561706128389.png) + +## Systemd + +前不久才水过一篇systemd的水文,简单试了几个服务,发现还是非常方便的。尤其是像bark这样的占用一个终端,用screen又不太方便找的程序。给他使用systemd来控制更是非常的方便。 + +把配置文件直接放到`/etc/systemd/system/`目录下就可以了。只需要修改一下`ExecStart`字段的启动路劲就可以正常使用了。 + +``` +[Unit] +Description=bark note for ip +Documentation=https://www.defectink.com +After=network.target + +[Service] +Type=simple +PIDFile=/run/bark.pid +ExecStart=/data/bark-server_linux_amd64 -l 127.0.0.1 -p 8181 +ExecReload=/bin/kill -s HUP $MAINPID +ExecStop=/bin/kill -s QUIT $MAINPID +PrivateTmp=true + +[Install] +WantedBy=multi-user.target +``` + +具体的效果就和平时使用其他的systemd控制的软件一样了,并且不用再那么麻烦了。 + +![1561706516651](.\images\水果自定义通知大法\1561706516651.png) \ No newline at end of file diff --git a/source/_posts/自动备份大法.md b/source/_posts/自动备份大法.md index 2f250b3..4be643b 100644 --- a/source/_posts/自动备份大法.md +++ b/source/_posts/自动备份大法.md @@ -2,7 +2,7 @@ title: 自动备份大法 date: 2019-06-05 16:41:57 tags: Linux -categories: 实践 +categories: Linux url: auto-backup index_img: /defect/images/自动备份大法/bakcup.jpg --- diff --git a/source/_posts/解决inotify-watch不够.md b/source/_posts/解决inotify-watch不够.md new file mode 100644 index 0000000..2916be4 --- /dev/null +++ b/source/_posts/解决inotify-watch不够.md @@ -0,0 +1,74 @@ +--- +title: 解决inotify watch不够⌚ +date: 2019-05-29 9:05:01 +tags: Linux +categories: 踩坑 +url: fixed-inotify-watch-not-enough +index_img: /defect/images/解决inotify-watch不够/logo.jpg +--- + +> Failed to add /run/systemd/ask-password to directory watch: No space left on device + +这当然不是磁盘空间不足。 + +曾经被这问题折腾了很长时间,在磁盘空间充足的情况下,一直提示设备剩余空间不足,导致许多服务无法启动。该问题所在的根源是Inotify watch被占用光了导致的。 + +## inotify watch + +Inotify 到底是什么? + +Inotify 是一种文件变化通知机制,或者称之为监控文件系统,Linux 内核从 2.6.13 开始引入。在 BSD 和 Mac OS 系统中比较有名的是[kqueue](http://wiki.netbsd.se/kqueue_tutorial),它可以高效地实时跟踪 Linux 文件系统的变化。近些年来,以[fsnotify](http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=90586523eb4b349806887c62ee70685a49415124)作为后端,几乎所有的主流 Linux 发行版都支持 Inotify 机制。 + +可以简单的理解为,inotify就是监控我们当前系统上的文件变化。在日常工作中,人们往往需要知道在某些文件 (夹) 上都有那些变化,比如: + +- 通知配置文件的改变 +- 跟踪某些关键的系统文件的变化 +- 监控某个分区磁盘的整体使用情况 +- 系统崩溃时进行自动清理 +- 自动触发备份进程 +- 向服务器上传文件结束时发出通知 + +检查当前系统内核是否支持inotify机制: + +``` +grep INOTIFY_USER /boot/config-$(uname -r) +``` + +如果输出为:`CONFIG_INOTIFY_USER=y`,那么当前的系统内核便是支持inotify了。 + +## 解决watch不够 + +经常打开服务无法启动,提示: + +``` +Failed to add /run/systemd/ask-password to directory watch: No space left on device +``` + +便是inotify watch不够导致的服务无法启动,很多程序的进程都需要使用inotify watch来监控文件系统。当某些进程使用的太多的时候,就会导致watch不够,导致一些程序直接无法启动。 + +遇到这种情况解决办法非常的简单,毕竟不是磁盘的空间不够,我们不需要删除任何的文件,只需要放大足够的watch数量就ok了。 + +临时的解决办法: + +``` +echo 1048576 > /proc/sys/fs/inotify/max_user_watches +``` + +直接在终端`echo`一个大量的watch数量到指定的路径,不出意外的话就能够直接解决问题。但这只是个临时的解决办法,再重启机器后将会还原。 + +该临时解决办法的好处就是方便快捷,有次我的sshd因为watch数量的不够倒是无法启动时,唯一的解决办法就是连接vnc来解决,然后网页的vnc是不支持粘贴的,所以使用这一行命令也就非常的方便了。 + +长期解决方法: + +``` +vim /etc/sysctl.conf +fs.inotify.max_user_watches=1048576 +``` + +长期的解决方法也很简单,我们直接在`/etc/sysctl.conf `文件的末尾添加一句话就可以了。 + +## 参考 + +* [Inotify: 高效、实时的 Linux 文件系统事件监控框架]() +* [磁盘空间充足,但是重启服务出现报错:Failed to add /run/systemd/]() +* [inotify]() \ No newline at end of file diff --git a/source/defect/images/ASCII在线视频流/ascii_cat.gif b/source/defect/images/ASCII在线视频流/ascii_cat.gif new file mode 100644 index 0000000..aaa9ec1 Binary files /dev/null and b/source/defect/images/ASCII在线视频流/ascii_cat.gif differ diff --git a/source/defect/images/ASCII在线视频流/logo.jpg b/source/defect/images/ASCII在线视频流/logo.jpg new file mode 100644 index 0000000..f152494 Binary files /dev/null and b/source/defect/images/ASCII在线视频流/logo.jpg differ diff --git a/source/defect/images/ASCII在线视频流/图像-1.png b/source/defect/images/ASCII在线视频流/图像-1.png new file mode 100644 index 0000000..8a3d972 Binary files /dev/null and b/source/defect/images/ASCII在线视频流/图像-1.png differ diff --git a/source/defect/images/ASCII在线视频流/图像-2.png b/source/defect/images/ASCII在线视频流/图像-2.png new file mode 100644 index 0000000..74e7231 Binary files /dev/null and b/source/defect/images/ASCII在线视频流/图像-2.png differ diff --git a/source/defect/images/AliOssForTypecho/logo.jpg b/source/defect/images/AliOssForTypecho/logo.jpg new file mode 100644 index 0000000..bc5bc75 Binary files /dev/null and b/source/defect/images/AliOssForTypecho/logo.jpg differ diff --git a/source/defect/images/Gitlab尝鲜/411390967.png b/source/defect/images/Gitlab尝鲜/411390967.png new file mode 100644 index 0000000..d4343d4 Binary files /dev/null and b/source/defect/images/Gitlab尝鲜/411390967.png differ diff --git a/source/defect/images/Gitlab尝鲜/52152339.png b/source/defect/images/Gitlab尝鲜/52152339.png new file mode 100644 index 0000000..3fe1143 Binary files /dev/null and b/source/defect/images/Gitlab尝鲜/52152339.png differ diff --git a/source/defect/images/Gitlab尝鲜/99634888.png b/source/defect/images/Gitlab尝鲜/99634888.png new file mode 100644 index 0000000..999b664 Binary files /dev/null and b/source/defect/images/Gitlab尝鲜/99634888.png differ diff --git a/source/defect/images/QinQ基础操作/ethernet-QinQ-format2.png b/source/defect/images/QinQ基础操作/ethernet-QinQ-format2.png new file mode 100644 index 0000000..9bf7076 Binary files /dev/null and b/source/defect/images/QinQ基础操作/ethernet-QinQ-format2.png differ diff --git a/source/defect/images/QinQ基础操作/qinq.jpg b/source/defect/images/QinQ基础操作/qinq.jpg new file mode 100644 index 0000000..4c1ef78 Binary files /dev/null and b/source/defect/images/QinQ基础操作/qinq.jpg differ diff --git a/source/defect/images/QinQ基础操作/vlan20.png b/source/defect/images/QinQ基础操作/vlan20.png new file mode 100644 index 0000000..ac46d05 Binary files /dev/null and b/source/defect/images/QinQ基础操作/vlan20.png differ diff --git a/source/defect/images/QinQ基础操作/基本qinq.png b/source/defect/images/QinQ基础操作/基本qinq.png new file mode 100644 index 0000000..83ebb30 Binary files /dev/null and b/source/defect/images/QinQ基础操作/基本qinq.png differ diff --git a/source/defect/images/QinQ基础操作/外层type.png b/source/defect/images/QinQ基础操作/外层type.png new file mode 100644 index 0000000..91b2ccd Binary files /dev/null and b/source/defect/images/QinQ基础操作/外层type.png differ diff --git a/source/defect/images/QinQ基础操作/报文-1582421531943.png b/source/defect/images/QinQ基础操作/报文-1582421531943.png new file mode 100644 index 0000000..f006a60 Binary files /dev/null and b/source/defect/images/QinQ基础操作/报文-1582421531943.png differ diff --git a/source/defect/images/QinQ基础操作/报文.png b/source/defect/images/QinQ基础操作/报文.png new file mode 100644 index 0000000..f006a60 Binary files /dev/null and b/source/defect/images/QinQ基础操作/报文.png differ diff --git a/source/defect/images/QinQ基础操作/报文2.png b/source/defect/images/QinQ基础操作/报文2.png new file mode 100644 index 0000000..79db61e Binary files /dev/null and b/source/defect/images/QinQ基础操作/报文2.png differ diff --git a/source/defect/images/QinQ基础操作/报文3.png b/source/defect/images/QinQ基础操作/报文3.png new file mode 100644 index 0000000..f006a60 Binary files /dev/null and b/source/defect/images/QinQ基础操作/报文3.png differ diff --git a/source/defect/images/QinQ基础操作/灵活拓扑.png b/source/defect/images/QinQ基础操作/灵活拓扑.png new file mode 100644 index 0000000..3211ecc Binary files /dev/null and b/source/defect/images/QinQ基础操作/灵活拓扑.png differ diff --git a/source/defect/images/Resilio-Sync多平台实时同步/home_centos.png b/source/defect/images/Resilio-Sync多平台实时同步/home_centos.png new file mode 100644 index 0000000..ce8549a Binary files /dev/null and b/source/defect/images/Resilio-Sync多平台实时同步/home_centos.png differ diff --git a/source/defect/images/Resilio-Sync多平台实时同步/res.png b/source/defect/images/Resilio-Sync多平台实时同步/res.png new file mode 100644 index 0000000..84aee59 Binary files /dev/null and b/source/defect/images/Resilio-Sync多平台实时同步/res.png differ diff --git a/source/defect/images/Resilio-Sync多平台实时同步/rs安装.png b/source/defect/images/Resilio-Sync多平台实时同步/rs安装.png new file mode 100644 index 0000000..5e3b907 Binary files /dev/null and b/source/defect/images/Resilio-Sync多平台实时同步/rs安装.png differ diff --git a/source/defect/images/Resilio-Sync多平台实时同步/入门sync.png b/source/defect/images/Resilio-Sync多平台实时同步/入门sync.png new file mode 100644 index 0000000..86aa8e8 Binary files /dev/null and b/source/defect/images/Resilio-Sync多平台实时同步/入门sync.png differ diff --git a/source/defect/images/Resilio-Sync多平台实时同步/其他选项.png b/source/defect/images/Resilio-Sync多平台实时同步/其他选项.png new file mode 100644 index 0000000..28d0044 Binary files /dev/null and b/source/defect/images/Resilio-Sync多平台实时同步/其他选项.png differ diff --git a/source/defect/images/Resilio-Sync多平台实时同步/开始同步.png b/source/defect/images/Resilio-Sync多平台实时同步/开始同步.png new file mode 100644 index 0000000..5517bb4 Binary files /dev/null and b/source/defect/images/Resilio-Sync多平台实时同步/开始同步.png differ diff --git a/source/defect/images/Resilio-Sync多平台实时同步/打开.png b/source/defect/images/Resilio-Sync多平台实时同步/打开.png new file mode 100644 index 0000000..b817faf Binary files /dev/null and b/source/defect/images/Resilio-Sync多平台实时同步/打开.png differ diff --git a/source/defect/images/Resilio-Sync多平台实时同步/输入密钥.png b/source/defect/images/Resilio-Sync多平台实时同步/输入密钥.png new file mode 100644 index 0000000..9f98891 Binary files /dev/null and b/source/defect/images/Resilio-Sync多平台实时同步/输入密钥.png differ diff --git a/source/defect/images/Teamspeak-Server/TS3-1582422801541.png b/source/defect/images/Teamspeak-Server/TS3-1582422801541.png new file mode 100644 index 0000000..2d5a312 Binary files /dev/null and b/source/defect/images/Teamspeak-Server/TS3-1582422801541.png differ diff --git a/source/defect/images/Teamspeak-Server/TS3.png b/source/defect/images/Teamspeak-Server/TS3.png new file mode 100644 index 0000000..2d5a312 Binary files /dev/null and b/source/defect/images/Teamspeak-Server/TS3.png differ diff --git a/source/defect/images/Teamspeak-Server/logo.jpg b/source/defect/images/Teamspeak-Server/logo.jpg new file mode 100644 index 0000000..ca4568b Binary files /dev/null and b/source/defect/images/Teamspeak-Server/logo.jpg differ diff --git a/source/defect/images/Teamspeak-Server/teamspeak.png b/source/defect/images/Teamspeak-Server/teamspeak.png new file mode 100644 index 0000000..c0fb605 Binary files /dev/null and b/source/defect/images/Teamspeak-Server/teamspeak.png differ diff --git a/source/defect/images/Teamspeak-Server/token.png b/source/defect/images/Teamspeak-Server/token.png new file mode 100644 index 0000000..365d6a7 Binary files /dev/null and b/source/defect/images/Teamspeak-Server/token.png differ diff --git a/source/defect/images/Teamspeak-Server/插件.png b/source/defect/images/Teamspeak-Server/插件.png new file mode 100644 index 0000000..69df160 Binary files /dev/null and b/source/defect/images/Teamspeak-Server/插件.png differ diff --git a/source/defect/images/Teamspeak-Server/权限码.png b/source/defect/images/Teamspeak-Server/权限码.png new file mode 100644 index 0000000..bb644f1 Binary files /dev/null and b/source/defect/images/Teamspeak-Server/权限码.png differ diff --git a/source/defect/images/Teamspeak-Server/繁体中文.png b/source/defect/images/Teamspeak-Server/繁体中文.png new file mode 100644 index 0000000..e18771e Binary files /dev/null and b/source/defect/images/Teamspeak-Server/繁体中文.png differ diff --git a/source/defect/images/Teamspeak-Server/身份.png b/source/defect/images/Teamspeak-Server/身份.png new file mode 100644 index 0000000..2e84f81 Binary files /dev/null and b/source/defect/images/Teamspeak-Server/身份.png differ diff --git a/source/defect/images/Teamspeak-Server/连接服务器.png b/source/defect/images/Teamspeak-Server/连接服务器.png new file mode 100644 index 0000000..32c78bb Binary files /dev/null and b/source/defect/images/Teamspeak-Server/连接服务器.png differ diff --git a/source/defect/images/systemd的基础操作/logo.png b/source/defect/images/systemd的基础操作/logo.png new file mode 100644 index 0000000..3dc781f Binary files /dev/null and b/source/defect/images/systemd的基础操作/logo.png differ diff --git a/source/defect/images/公开密钥密码学/GPG多平台.png b/source/defect/images/公开密钥密码学/GPG多平台.png new file mode 100644 index 0000000..3b5acf0 Binary files /dev/null and b/source/defect/images/公开密钥密码学/GPG多平台.png differ diff --git a/source/defect/images/公开密钥密码学/Kleopatra.png b/source/defect/images/公开密钥密码学/Kleopatra.png new file mode 100644 index 0000000..a0c4eb8 Binary files /dev/null and b/source/defect/images/公开密钥密码学/Kleopatra.png differ diff --git a/source/defect/images/公开密钥密码学/logo.jpeg b/source/defect/images/公开密钥密码学/logo.jpeg new file mode 100644 index 0000000..b2a8238 Binary files /dev/null and b/source/defect/images/公开密钥密码学/logo.jpeg differ diff --git a/source/defect/images/公开密钥密码学/密钥.png b/source/defect/images/公开密钥密码学/密钥.png new file mode 100644 index 0000000..c860191 Binary files /dev/null and b/source/defect/images/公开密钥密码学/密钥.png differ diff --git a/source/defect/images/水果自定义通知大法/1561705066368.png b/source/defect/images/水果自定义通知大法/1561705066368.png new file mode 100644 index 0000000..73d9a9d Binary files /dev/null and b/source/defect/images/水果自定义通知大法/1561705066368.png differ diff --git a/source/defect/images/水果自定义通知大法/1561706128389.png b/source/defect/images/水果自定义通知大法/1561706128389.png new file mode 100644 index 0000000..32686e0 Binary files /dev/null and b/source/defect/images/水果自定义通知大法/1561706128389.png differ diff --git a/source/defect/images/水果自定义通知大法/1561706516651.png b/source/defect/images/水果自定义通知大法/1561706516651.png new file mode 100644 index 0000000..f624a6f Binary files /dev/null and b/source/defect/images/水果自定义通知大法/1561706516651.png differ diff --git a/source/defect/images/水果自定义通知大法/logo.jpg b/source/defect/images/水果自定义通知大法/logo.jpg new file mode 100644 index 0000000..2fc743c Binary files /dev/null and b/source/defect/images/水果自定义通知大法/logo.jpg differ diff --git a/source/defect/images/解决inotify-watch不够/logo.jpg b/source/defect/images/解决inotify-watch不够/logo.jpg new file mode 100644 index 0000000..23b90e6 Binary files /dev/null and b/source/defect/images/解决inotify-watch不够/logo.jpg differ