天涼好個秋.
HIWIFI,Openwrt,极路由,飞鸟集,喜折腾,爱思考,记录交流于积累。
f452e3a6af46e7008ad61404df24761a852d2ed1-stray.bitcron.com
2018-12-18T04:44:00Z
为 Aria2 添加 Tracker 服务器
2018-12-18T04:44:00Z
itshou-zha/wei-aria2-tian-jia-tracker-fu-wu-qi
天涼好個秋.
<h2 id="toc_1" class="h16">BitTorrent tracker</h2><blockquote class="blockquote_lines_2">
<p class="md_block">
<span class="md_line md_line_start md_line_end"><strong>BitTorrent tracker</strong>(中文可称:<strong>BT服务器</strong>、<strong>tracker服务器</strong>等)是帮助BitTorrent协议在节点与节点之间做连接的服务器</span>
</p>
</blockquote><blockquote>
<p class="md_block">
<span class="md_line md_line_start md_line_end">BitTorrent客户端下载一开始就要连接到tracker,从tracker获得其他客户端IP地址后,才能连接到其他客户端下载。在传输过程中,也会一直与tracker通信,上传自己的信息,获取其它客户端的信息。</span>
</p>
</blockquote>
<p class="md_block">
<span class="md_line md_line_start md_line_end">所以说想使用 Aria2 下载 BT 资源,Tracker 是必不可少的。当然 你会说,我从没添加过 Tracker 服务器, Aria2 也照样能用啊!那是因为 Aria2 也支持分布式的 DHT 网络,没有 Tracker 时就靠它了。</span>
</p>
<h2 id="toc_2" class="h16">trackerslist</h2>
<p class="md_block">
<span class="md_line md_line_start md_line_end"><strong><a class="md_compiled" href="https://github.com/ngosang/trackerslist">trackerslist</a></strong> 是一个开源项目,每天更新 Trackers list,比如下面的 best list</span>
</p>
<div class="codehilite code_lang_shell highlight"><pre><span></span><span class="c1"># https://github.com/ngosang/trackerslist/raw/master/trackers_best.txt</span>
udp://tracker.coppersurfer.tk:6969/announce
http://tracker.internetwarriors.net:1337/announce
udp://tracker.opentrackr.org:1337/announce
udp://9.rarbg.to:2710/announce
udp://exodus.desync.com:6969/announce
udp://explodie.org:6969/announce
http://tracker1.itzmx.com:8080/announce
udp://thetracker.org:80/announce
udp://ipv4.tracker.harry.lu:80/announce
udp://denis.stalker.upeer.me:6969/announce
udp://tracker.torrent.eu.org:451/announce
udp://tracker.tiny-vps.com:6969/announce
udp://tracker.port443.xyz:6969/announce
udp://open.demonii.si:1337/announce
udp://bt.xxx-tracker.com:2710/announce
udp://retracker.lanta-net.ru:2710/announce
udp://open.stealth.si:80/announce
http://open.acgnxtracker.com:80/announce
udp://tracker.vanitycore.co:6969/announce
udp://tracker.iamhansen.xyz:2000/announce
</pre></div>
<!--block_code_end-->
<p class="md_block">
<span class="md_line md_line_start md_line_end">只要将他们添加到 Aria2 的配置文件中,理论上能大幅提高 Aria2 下载 BT 的速度。</span>
</p>
<h2 id="toc_3" class="h16">Aria2 的配置文件</h2>
<p class="md_block">
<span class="md_line md_line_start md_line_end">参考 Aria2 的官方文档 ,<code>https://aria2.github.io/manual/en/html/aria2c.html#cmdoption-bt-tracker</code></span>
</p>
<p class="md_block">
<span class="md_line md_line_start md_line_end">配置类似于:</span>
</p>
<pre class="lang_conf"><code>bt-tracker=udp://tracker.coppersurfer.tk:6969/announce,http://tracker.internetwarriors.net:1337/announce,udp://tracker.opentrackr.org:1337/announce</code></pre>
<!--block_code_end-->
<p class="md_block">
<span class="md_line md_line_start md_line_end">添加到 Aria2 的配置文件,重启 Aria2 即可生效。</span>
</p>
<h2 id="toc_4" class="h16">省力的方法</h2>
<p class="md_block">
<span class="md_line md_line_start md_line_end">上面的教程很详细了,但每次都自己来修改肯定会累死人,你可以使用脚本替你完成上面的工作,可以参考小众软件的这篇文章下的评论:</span>
</p>
<p class="md_block">
<span class="md_line md_line_dom_embed md_line_start md_line_end"><a class="md_compiled" href="https://www.appinn.com/ara2-add-trackers-list-for-speed-up/">https://www.appinn.com/ara2-add-trackers-list-for-speed-up/</a></span>
</p>
<p class="md_block">
<span class="md_line md_line_start md_line_end">记得重启 Aria2。</span>
</p>
<h2 id="toc_5" class="h16">这样就完了吗?</h2>
<p class="md_block">
<span class="md_line md_line_start md_line_end">懒人自然需要更省力的手段。Aria2 是支持 RPC 的,类似与 AriaNG 等 WEB UI 都是靠 RPC 和 Aria2 通信的,那么我们也是可以写个脚本用 RPC 来设置 Aria2 ,并且实时生效,无需重启 Aria2。</span>
</p>
<div class="codehilite code_lang_shell highlight"><pre><span></span><span class="ch">#!/bin/sh</span>
<span class="c1">#more trackers list, see https://github.com/ngosang/trackerslist</span>
<span class="nv">tracker_url</span><span class="o">=</span><span class="s1">'https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_all.txt'</span>
<span class="nv">path</span><span class="o">=</span><span class="s1">'http://10.10.10.5:6800/jsonrpc'</span>
<span class="nv">passwd</span><span class="o">=</span><span class="s1">'xxxxxx'</span>
<span class="nv">tracker</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> -n <span class="k">$(</span>curl -s -L <span class="nv">$tracker_url</span> <span class="p">|</span> sed <span class="s1">'N;s/\n//g'</span><span class="k">)</span> <span class="p">|</span> tr <span class="s1">' '</span> <span class="s1">','</span><span class="k">)</span>
<span class="o">[</span> -n <span class="s2">"</span><span class="nv">$tracker</span><span class="s2">"</span> <span class="o">]</span> <span class="o">&&</span> curl <span class="nv">$path</span> -d <span class="s1">'{"jsonrpc":"2.0","method":"aria2.changeGlobalOption","id":"cron","params":["token:'</span><span class="nv">$passwd</span><span class="s1">'",{"bt-tracker":"'</span><span class="nv">$tracker</span><span class="s1">'"}]}'</span>
</pre></div>
<!--block_code_end-->
<p class="md_block">
<span class="md_line md_line_start md_line_end">在定时任务中定时执行上面的脚本就万事大吉了。定时任务不在本文的范畴里了蛤,Google 一下就有了。</span>
</p>
<p class="md_block">
<span class="md_line md_line_start md_line_end">修改 tracker_url、path 和 passwd 三个变量,脚本就可以为你工作了。</span>
</p>
<h2 id="toc_6" class="h16">完</h2>
<p class="md_block">
<span class="md_line md_line_start">很早之前就在 NAS 里使用这个脚本来更新 trackerslist 了,直到昨天,在 twitter 上看到小青蛙(小众软件的作者)分享了文章,才想到把我自己的方式记录一下。<br /></span>
<span class="md_line md_line_end">很久没写博客了,最近有些忙。</span>
</p>
极路由 KoolProxy 本地插件
2018-12-13T07:59:29Z
hiwifi/ji-lu-you-koolproxy-ben-di-ban-cha-jian
天涼好個秋.
<h2 id="toc_1" class="h16">填坑</h2>
<p class="md_block">
<span class="md_line md_line_start md_line_end">很久之前(半年了)答应了很多朋友要做一个本地版本的 kp 插件,经过端午节三天的努力,现在终于把坑填上了。而且也支持 HTTPS 了。</span>
</p>
<h2 id="toc_2" class="h16">说明</h2>
<p class="md_block">
<span class="md_line md_line_start md_line_end">插件 UI 和 iptables 规则移植自 koolshare F大(fw867)维护的 lede-x64 软件中心中的 koolproxy 插件,取得了 houzi 和 Carseason 大佬的同意。</span>
</p>
<h2 id="toc_3" class="h16">界面</h2>
<p class="md_block">
<span class="md_line md_line_start">简单放两张图<br /></span>
<span class="md_line md_line_dom_embed md_line_with_image"><img class="md_compiled " src="https://cdn.stray.love//hiwifi/ji-lu-you-koolproxy-ben-di-ban-cha-jian/plugin_home.jpg" alt="" title="" ><br /></span>
<span class="md_line md_line_dom_embed md_line_with_image img_before only_img_before md_line_end"><img class="md_compiled " src="https://cdn.stray.love//hiwifi/ji-lu-you-koolproxy-ben-di-ban-cha-jian/kp_main.jpg" alt="" title="" ></span>
</p>
<h2 id="toc_4" class="h16">改动日志</h2>
<ul>
<li class="md_li"><span>0.1.8: 重构插件。
</span></li>
<li class="md_li"><span>0.2.0:
<ol>
<li class="md_li"><span>修复无法开机启动的问题。
</span></li>
<li class="md_li"><span>更新过滤引擎和规则到最新版。
</span></li>
<li class="md_li"><span>修复其他BUG
</span></li>
</ol>
</span></li>
<li class="md_li"><span>0.2.3:
<ol>
<li class="md_li"><span>修复 BUG。
</span></li>
<li class="md_li"><span>更新过滤引擎和规则到最新版。
</span></li>
</ol>
</span></li>
</ul>
<h2 id="toc_5" class="h16">to-do</h2>
<ul>
<li class="md_li"><span>多端口控制
</span></li>
<li class="md_li"><span>证书备份 && 恢复
</span></li>
<li class="md_li"><span>UI 适配手机
</span></li>
</ul>
<h2 id="toc_6" class="h16">下载</h2>
<p class="md_block">
<span class="md_line md_line_dom_embed md_line_start"><a class="md_compiled" href="https://cdn.stray.love//hiwifi/ji-lu-you-koolproxy-ben-di-ban-cha-jian/%E8%BF%87%E6%BB%A4%E5%B9%BF%E5%91%8A_%E6%9C%AC%E5%9C%B0-koolproxy-0.1.8.hipk">koolproxy-0.1.8.hipk</a><br /></span>
<span class="md_line md_line_dom_embed"><a class="md_compiled" href="https://cdn.stray.love/hiwifi/ji-lu-you-koolproxy-ben-di-ban-cha-jian/koolproxy-2.0.hipk">koolproxy-0.2.0.hipk</a><br /></span>
<span class="md_line md_line_dom_embed md_line_end"><a class="md_compiled" href="https://cdn.stray.love/hiwifi/ji-lu-you-koolproxy-ben-di-ban-cha-jian/koolproxy-2.3.hipk">koolproxy-0.2.3.hipk</a></span>
</p>
第几个 Hello World
2018-08-06T03:27:05Z
itshou-zha/helloworld-n
天涼好個秋.
<h2 id="toc_1" class="h16">Hello World 情怀</h2>
<p class="md_block">
<span class="md_line md_line_start md_line_end">每个人初学代码时肯定都写过 Hello World, 每一次接触一门新的技术&编程语言,都会用新语言写一个Hello World 程序,最近在看《Beej's Guide to Network Programming》,突发奇想又写了一个 Hello World</span>
</p>
<h2 id="toc_2" class="h16">code</h2><div class="codehilite code_lang_c highlight"><pre><span></span><span class="cp">#include</span><span class="cpf"><stdio.h></span><span class="cp"></span>
<span class="cp">#include</span><span class="cpf"><string.h></span><span class="cp"></span>
<span class="cp">#include</span><span class="cpf"><sys/socket.h></span><span class="cp"></span>
<span class="cp">#include</span><span class="cpf"><sys/types.h></span><span class="cp"></span>
<span class="cp">#include</span><span class="cpf"><sys/wait.h></span><span class="cp"></span>
<span class="cp">#include</span><span class="cpf"><netdb.h></span><span class="cp"></span>
<span class="cp">#include</span><span class="cpf"><arpa/inet.h></span><span class="cp"></span>
<span class="cp">#include</span><span class="cpf"><stdlib.h></span><span class="cp"></span>
<span class="cp">#include</span><span class="cpf"><netinet/in.h></span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf"><unistd.h></span><span class="cp"></span>
<span class="cp">#define PORT "5964"</span>
<span class="cp">#define BACKLOG 10</span>
<span class="kt">char</span> <span class="n">hello_world</span><span class="p">[]</span> <span class="o">=</span> <span class="s">"HTTP/1.1 200 OK</span><span class="se">\r\n</span><span class="s">Server: MarIxs</span><span class="se">\r\n</span><span class="s">Content-length: 13</span><span class="se">\r\n</span><span class="s">Content-Type: text/html</span><span class="se">\r\n\r\n</span><span class="s">Hello, World!!"</span><span class="p">;</span>
<span class="kt">void</span> <span class="nf">sigchld_handler</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">while</span><span class="p">(</span><span class="n">waitpid</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">WNOHANG</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">);</span><span class="c1">//等效于 wait</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="o">*</span><span class="nf">get_in_addr</span><span class="p">(</span><span class="k">struct</span> <span class="n">sockaddr</span> <span class="o">*</span><span class="n">sa</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">sa</span><span class="o">-></span><span class="n">sa_family</span> <span class="o">==</span> <span class="n">AF_INET</span><span class="p">){</span>
<span class="k">return</span> <span class="o">&</span><span class="p">(((</span><span class="k">struct</span> <span class="n">sockaddr_in</span><span class="o">*</span><span class="p">)</span><span class="n">sa</span><span class="p">)</span><span class="o">-></span><span class="n">sin_addr</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">return</span> <span class="o">&</span><span class="p">(((</span><span class="k">struct</span> <span class="n">sockaddr_in6</span><span class="o">*</span><span class="p">)</span><span class="n">sa</span><span class="p">)</span><span class="o">-></span><span class="n">sin6_addr</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">int</span> <span class="n">sockfd</span><span class="p">,</span> <span class="n">new_fd</span><span class="p">;</span>
<span class="k">struct</span> <span class="n">addrinfo</span> <span class="n">hints</span><span class="p">,</span> <span class="o">*</span><span class="n">servinfo</span><span class="p">,</span><span class="o">*</span><span class="n">p</span><span class="p">;</span>
<span class="k">struct</span> <span class="n">sockaddr_storage</span> <span class="n">their_addr</span><span class="p">;</span>
<span class="kt">socklen_t</span> <span class="n">sin_size</span><span class="p">;</span>
<span class="k">struct</span> <span class="n">sigaction</span> <span class="n">sa</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">yes</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
<span class="kt">char</span> <span class="n">s</span><span class="p">[</span><span class="n">INET6_ADDRSTRLEN</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">rv</span><span class="p">;</span>
<span class="n">memset</span><span class="p">(</span><span class="o">&</span><span class="n">hints</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span> <span class="n">hints</span><span class="p">);</span>
<span class="n">hints</span><span class="p">.</span><span class="n">ai_family</span> <span class="o">=</span> <span class="n">AF_UNSPEC</span><span class="p">;</span>
<span class="n">hints</span><span class="p">.</span><span class="n">ai_socktype</span> <span class="o">=</span> <span class="n">SOCK_STREAM</span><span class="p">;</span>
<span class="n">hints</span><span class="p">.</span><span class="n">ai_flags</span> <span class="o">=</span> <span class="n">AI_PASSIVE</span><span class="p">;</span>
<span class="k">if</span><span class="p">((</span><span class="n">rv</span> <span class="o">=</span> <span class="n">getaddrinfo</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="n">PORT</span><span class="p">,</span> <span class="o">&</span><span class="n">hints</span><span class="p">,</span> <span class="o">&</span><span class="n">servinfo</span><span class="p">))</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">"getaddrinfo: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">gai_strerror</span><span class="p">(</span><span class="n">rv</span><span class="p">));</span>
<span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">for</span><span class="p">(</span><span class="n">p</span> <span class="o">=</span> <span class="n">servinfo</span><span class="p">;</span> <span class="n">p</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">;</span> <span class="n">p</span> <span class="o">=</span> <span class="n">servinfo</span><span class="o">-></span><span class="n">ai_next</span><span class="p">){</span>
<span class="k">if</span><span class="p">((</span><span class="n">sockfd</span> <span class="o">=</span> <span class="n">socket</span><span class="p">(</span><span class="n">p</span><span class="o">-></span><span class="n">ai_family</span><span class="p">,</span> <span class="n">p</span><span class="o">-></span><span class="n">ai_socktype</span><span class="p">,</span> <span class="n">p</span><span class="o">-></span><span class="n">ai_protocol</span><span class="p">))</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
<span class="n">perror</span><span class="p">(</span><span class="s">"server:port"</span><span class="p">);</span>
<span class="k">continue</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">if</span><span class="p">(</span><span class="n">setsockopt</span><span class="p">(</span><span class="n">sockfd</span><span class="p">,</span> <span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">SO_REUSEADDR</span><span class="p">,</span> <span class="o">&</span><span class="n">yes</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">))</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
<span class="n">perror</span><span class="p">(</span><span class="s">"setsockopt"</span><span class="p">);</span>
<span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">if</span><span class="p">(</span><span class="n">bind</span><span class="p">(</span><span class="n">sockfd</span><span class="p">,</span> <span class="n">p</span><span class="o">-></span><span class="n">ai_addr</span><span class="p">,</span> <span class="n">p</span><span class="o">-></span><span class="n">ai_addrlen</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
<span class="n">close</span><span class="p">(</span><span class="n">sockfd</span><span class="p">);</span>
<span class="n">perror</span><span class="p">(</span><span class="s">"server:bind"</span><span class="p">);</span>
<span class="k">continue</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">break</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="n">p</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
<span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">"server:failed to bind</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
<span class="k">return</span> <span class="mi">2</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">freeaddrinfo</span><span class="p">(</span><span class="n">servinfo</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">listen</span><span class="p">(</span><span class="n">sockfd</span><span class="p">,</span> <span class="n">BACKLOG</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
<span class="n">perror</span><span class="p">(</span><span class="s">"server:listen"</span><span class="p">);</span>
<span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">sa</span><span class="p">.</span><span class="n">sa_handler</span> <span class="o">=</span> <span class="n">sigchld_handler</span><span class="p">;</span>
<span class="n">sigemptyset</span><span class="p">(</span><span class="o">&</span><span class="n">sa</span><span class="p">.</span><span class="n">sa_mask</span><span class="p">);</span>
<span class="n">sa</span><span class="p">.</span><span class="n">sa_flags</span> <span class="o">=</span> <span class="n">SA_RESTART</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="n">sigaction</span><span class="p">(</span><span class="n">SIGCHLD</span><span class="p">,</span> <span class="o">&</span><span class="n">sa</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
<span class="n">perror</span><span class="p">(</span><span class="s">"sigaction"</span><span class="p">);</span>
<span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"server:waiting for connections... </span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
<span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
<span class="n">sin_size</span> <span class="o">=</span> <span class="k">sizeof</span> <span class="n">their_addr</span><span class="p">;</span>
<span class="k">if</span> <span class="p">((</span><span class="n">new_fd</span> <span class="o">=</span> <span class="n">accept</span><span class="p">(</span><span class="n">sockfd</span><span class="p">,</span> <span class="p">(</span><span class="k">struct</span> <span class="n">sockaddr</span> <span class="o">*</span><span class="p">)</span><span class="o">&</span><span class="n">their_addr</span><span class="p">,</span> <span class="o">&</span><span class="n">sin_size</span><span class="p">))</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
<span class="n">perror</span><span class="p">(</span><span class="s">"server:accept</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
<span class="k">continue</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">inet_ntop</span><span class="p">(</span><span class="n">their_addr</span><span class="p">.</span><span class="n">ss_family</span><span class="p">,</span> <span class="n">get_in_addr</span><span class="p">((</span><span class="k">struct</span> <span class="n">sockaddr</span> <span class="o">*</span><span class="p">)</span><span class="o">&</span><span class="n">their_addr</span><span class="p">),</span> <span class="n">s</span><span class="p">,</span> <span class="k">sizeof</span> <span class="n">s</span><span class="p">);</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"server: got connection from %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">s</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">fork</span><span class="p">())</span> <span class="p">{</span>
<span class="n">close</span><span class="p">(</span><span class="n">sockfd</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">send</span><span class="p">(</span><span class="n">new_fd</span><span class="p">,</span> <span class="n">hello_world</span><span class="p">,</span> <span class="n">strlen</span><span class="p">(</span><span class="n">hello_world</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="n">perror</span><span class="p">(</span><span class="s">"send"</span><span class="p">);</span>
<span class="n">close</span><span class="p">(</span><span class="n">new_fd</span><span class="p">);</span>
<span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">close</span><span class="p">(</span><span class="n">new_fd</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<!--block_code_end--><h2 id="toc_3" class="h16">验证</h2><div class="codehilite code_lang_shell highlight"><pre><span></span>root@NL:~# curl http://127.0.0.1:5964
Hello, World!
</pre></div>
<!--block_code_end-->
<p class="md_block">
<span class="md_line md_line_start md_line_end">在浏览器里打开 ip:5964 就会显示 Hello, World!</span>
</p>
<h2 id="toc_4" class="h16">后</h2>
<p class="md_block">
<span class="md_line md_line_start md_line_end">中间加上逗号: Hello, world! 才是正确的写法哦。</span>
</p>
OpenWrt jsonfilter
2018-07-17T10:09:08Z
itshou-zha/jsonfiler
天涼好個秋.
<h2 id="toc_1" class="h16">Info</h2><div class="codehilite code_lang_shell highlight"><pre><span></span>root@Openwrt:~# opkg files jsonfilter
Package jsonfilter <span class="o">(</span>2018-02-04-c7e938d6-1<span class="o">)</span> is installed on root and has the following files:
/usr/bin/jsonfilter
root@Openwrt:~# opkg info jsonfilter
Package: jsonfilter
Version: 2018-02-04-c7e938d6-1
Depends: libc, libubox, libjson-c
Status: install user installed
Architecture: x86_64
Installed-Time: 1528614208
root@Openwrt:~# <span class="nv">jsonfilter</span>
<span class="o">==</span> <span class="nv">Usage</span> <span class="o">==</span>
<span class="c1"># jsonfilter [-a] [-i <file> | -s "json..."] {-t <pattern> | -e <pattern>}</span>
-q Quiet, no errors are printed
-h, --help Print this <span class="nb">help</span>
-a Implicitely treat input as array, useful <span class="k">for</span> JSON logs
-i path Specify a JSON file to parse
-s <span class="s2">"json"</span> Specify a JSON string to parse
-l limit Specify max number of results to show
-F separator Specify a field separator when using <span class="nb">export</span>
-t <pattern> Print the <span class="nb">type</span> of values matched by pattern
-e <pattern> Print the values matched by pattern
-e <span class="nv">VAR</span><span class="o">=</span><pat> Serialize matched value <span class="k">for</span> shell <span class="s2">"eval"</span>
<span class="o">==</span> <span class="nv">Patterns</span> <span class="o">==</span>
Patterns are JsonPath: http://goessner.net/articles/JsonPath/
This tool implements $, @, <span class="o">[]</span>, * and the union operator <span class="s1">','</span>
plus the usual expressions and literals.
It does not support the recursive child search operator <span class="s1">'..'</span> or
the <span class="s1">'?()'</span> and <span class="s1">'()'</span> filter expressions as those would require a
<span class="nb">complete</span> JavaScript engine to support them.
<span class="o">==</span> <span class="nv">Examples</span> <span class="o">==</span>
Display the first IPv4 address on lan:
<span class="c1"># ifstatus lan | jsonfilter -e '@["ipv4-address"][0].address'</span>
Extract the release string from the board information:
<span class="c1"># ubus call system board | jsonfilter -e '@.release.description'</span>
Find all interfaces which are up:
<span class="c1"># ubus call network.interface dump | \</span>
jsonfilter -e <span class="s1">'@.interface[@.up=true].interface'</span>
Export br-lan traffic counters <span class="k">for</span> shell eval:
<span class="c1"># devstatus br-lan | jsonfilter -e 'RX=@.statistics.rx_bytes' \</span>
-e <span class="s1">'TX=@.statistics.tx_bytes'</span>
</pre></div>
<!--block_code_end--><h2 id="toc_2" class="h16">Some example</h2><h3 id="toc_3" class="h16">Option -a</h3><div class="codehilite code_lang_shell highlight"><pre><span></span>root@Openwrt:~# <span class="nb">echo</span> <span class="m">1</span> <span class="m">2</span> <span class="m">3</span> <span class="m">4</span> <span class="p">|</span> jsonfilter -a -e <span class="s2">"</span>$<span class="s2">"</span>
<span class="o">[</span> 1, 2, 3, <span class="m">4</span> <span class="o">]</span>
</pre></div>
<!--block_code_end--><h3 id="toc_4" class="h16">Option -i</h3><div class="codehilite code_lang_shell highlight"><pre><span></span>root@Openwrt:~# <span class="nb">echo</span> <span class="s1">'{"a":1,"b":2}'</span> > /tmp/test.json<span class="p">;</span>jsonfilter -i /tmp/test.json -e <span class="s2">"</span>$<span class="s2">"</span>
<span class="o">{</span> <span class="s2">"a"</span>: 1, <span class="s2">"b"</span>: <span class="m">2</span> <span class="o">}</span>
</pre></div>
<!--block_code_end--><h3 id="toc_5" class="h16">Option -s</h3><div class="codehilite code_lang_shell highlight"><pre><span></span>root@Openwrt:~# jsonfilter -s <span class="s1">'{"a":1,"b":2}'</span> -e <span class="s2">"</span>$<span class="s2">"</span>
<span class="o">{</span> <span class="s2">"a"</span>: 1, <span class="s2">"b"</span>: <span class="m">2</span> <span class="o">}</span>
</pre></div>
<!--block_code_end--><h3 id="toc_6" class="h16">Get Bing pic url from api</h3><div class="codehilite code_lang_shell highlight"><pre><span></span>root@Openwrt:~# curl -k <span class="s1">'http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1'</span>
<span class="o">{</span><span class="s2">"images"</span>:<span class="o">[{</span><span class="s2">"startdate"</span>:<span class="s2">"20180706"</span>,<span class="s2">"fullstartdate"</span>:<span class="s2">"201807061600"</span>,<span class="s2">"enddate"</span>:<span class="s2">"20180707"</span>,<span class="s2">"url"</span>:<span class="s2">"/az/hprichbg/rb/Peloton_ZH-CN7472605035_1920x1080.jpg"</span>,<span class="s2">"urlbase"</span>:<span class="s2">"/az/hprichbg/rb/Peloton_ZH-CN7472605035"</span>,<span class="s2">"copyright"</span>:<span class="s2">"2016年环法自行车赛中骑在绿树成荫的道路上的选手 (© Michael Steele/Getty Images Sport)"</span>,<span class="s2">"copyrightlink"</span>:<span class="s2">"http://www.bing.com/search?q=%E7%8E%AF%E6%B3%95%E8%87%AA%E8%A1%8C%E8%BD%A6%E8%B5%9B&form=hpcapt&mkt=zh-cn"</span>,<span class="s2">"quiz"</span>:<span class="s2">"/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20180706_Peloton%22&FORM=HPQUIZ"</span>,<span class="s2">"wp"</span>:false,<span class="s2">"hsh"</span>:<span class="s2">"f4e4025f39bd7ed187dee34e042e8ee6"</span>,<span class="s2">"drk"</span>:1,<span class="s2">"top"</span>:1,<span class="s2">"bot"</span>:1,<span class="s2">"hs"</span>:<span class="o">[]}]</span>,<span class="s2">"tooltips"</span>:<span class="o">{</span><span class="s2">"loading"</span>:<span class="s2">"正在加载..."</span>,<span class="s2">"previous"</span>:<span class="s2">"上一个图像"</span>,<span class="s2">"next"</span>:<span class="s2">"下一个图像"</span>,<span class="s2">"walle"</span>:<span class="s2">"此图片不能下载用作壁纸。"</span>,<span class="s2">"walls"</span>:<span class="s2">"下载今日美图。仅限用作桌面壁纸。"</span><span class="o">}}</span>
root@Openwrt:~# curl -sk <span class="s1">'http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1'</span> <span class="p">|</span> jsonfilter -e <span class="s2">"</span>$<span class="s2">.images[0].url"</span>
/az/hprichbg/rb/Peloton_ZH-CN7472605035_1920x1080.jpg
</pre></div>
<!--block_code_end--><h3 id="toc_7" class="h16">which elemnt a's value is 1 in array</h3><div class="codehilite code_lang_shell highlight"><pre><span></span>root@Openwrt:~# jsonfilter -s <span class="s1">'[{"a":"1","b":100},{"a":"2","b":200}]'</span> -e <span class="s2">"</span>$<span class="s2">[@.a='1']"</span>
</pre></div>
<!--block_code_end-->
windows进程休眠
2018-06-28T12:47:23Z
wen-ti-jie-jue-fang-an/suspend-processes-on-windows
天涼好個秋.
<h2 id="toc_1" class="h16">前</h2>
<p class="md_block">
<span class="md_line md_line_start md_line_end">去年换了入门版的 Surface Book,买了 TF 卡和 Dock,存储容量和接口也都够用,软件上,配合 WSL 能很好的完成日常的工作。作为二合一设备,工作之余随时变成平板电脑,看看新闻听听歌还是很棒的,但尴尬之处在于,之前打开的桌面应用,比如:Chrome 、微信、QQ、IDE 会让平板模式下设备发烫,但还不好关掉,因为休息事件过了还要重新打开。所以才有了接下来的对策。</span>
</p>
<h2 id="toc_2" class="h16">对策</h2><h3 id="toc_3" class="h16">如果关掉程序麻烦,那干脆想办法 暂停进程?</h3>
<p class="md_block">
<span class="md_line md_line_start md_line_end">Google 了下,找到了 pssuspend 程序</span>
</p>
<pre class="lang_cmd"><code>C:\Users\MarIxs>pssuspend /h
PsSuspend v1.07 - Process Suspender
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals
PsSuspend suspends or resumes processes on a local or remote NT system.
Usage: pssuspend [-r] [\\RemoteComputer [-u Username [-p Password]]] <process Id or name>
-r Resume.
-u Specifies optional user name for login to
remote computer.
-p Specifies optional password for user name. If you omit this
you will be prompted to enter a hidden password.
-nobanner Do not display the startup banner and copyright message.</code></pre>
<!--block_code_end-->
<p class="md_block">
<span class="md_line md_line_start md_line_end">试用下</span>
</p>
<pre class="lang_cmd"><code>C:\Users\MarIxs>pssuspend qq.exe
PsSuspend v1.07 - Process Suspender
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals
Process qq.exe suspended.</code></pre>
<!--block_code_end-->
<p class="md_block">
<span class="md_line md_line_start md_line_end">QQ确实被暂停了,接下来用 -r 参数恢复。</span>
</p>
<pre class="lang_cmd"><code>C:\Users\MarIxs>pssuspend qq.exe -r
PsSuspend v1.07 - Process Suspender
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals
Process qq.exe resumed.</code></pre>
<!--block_code_end-->
<p class="md_block">
<span class="md_line md_line_start md_line_end">进程被暂停后,cpu 占用会变成 0 ,内存占用并没有被释放(这也是应该的),而且程序本身会变得无响应。</span>
</p>
<p class="md_block">
<span class="md_line md_line_start md_line_end">另一个问题是 pssuspend 每次只能暂停一个进程,感觉效率略低。</span>
</p>
<h2 id="toc_4" class="h16">再寻找</h2>
<p class="md_block">
<span class="md_line md_line_start">这次不止 Google、还搜了下 GitHub,果然有收获<br /></span>
<span class="md_line md_line_dom_embed md_line_end"><a class="md_compiled" href="https://github.com/craftwar/suspend">https://github.com/craftwar/suspend</a></span>
</p>
<pre class="lang_readme"><code>Usage:
suspend.exe [-n] [-r] [-s] ProcessName1 [ProcessName2] .....
Options
switch can be specified in any postion (first ones are recommended)
-n no operation mode (for test or whatever)
-r resume mode
-s case sensitive (case insensitive if not specified)
ex:
to suspend
suspend.exe a.exe b.exe
to resume
suspend.exe -r a.exe b.exe</code></pre>
<!--block_code_end-->
<p class="md_block">
<span class="md_line md_line_start md_line_end">测试下</span>
</p>
<pre class="lang_cmd"><code>C:\Users\MarIxs>suspend qq.exe chrome.exe
suspended process(es):
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
QQ.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe</code></pre>
<!--block_code_end-->
<p class="md_block">
<span class="md_line md_line_start md_line_end">看样很给力,恢复试试</span>
</p>
<pre class="lang_cmd"><code>C:\Users\MarIxs>suspend qq.exe chrome.exe -r
resumed process(es):
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
QQ.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe</code></pre>
<!--block_code_end-->
<p class="md_block">
<span class="md_line md_line_start md_line_end">很不错</span>
</p>
<h2 id="toc_5" class="h16">边边角角</h2>
<p class="md_block">
<span class="md_line md_line_start">一个进程在暂停时是全屏的,那么暂停后,就再也没办法把它最小化了,所以还需要在暂停前把窗口最小化,为了完成这个操作,我又找到了另一个工具 NirCmd <a class="md_compiled" href="http://nircmd.nirsoft.net">http://nircmd.nirsoft.net</a><br /></span>
<span class="md_line md_line_end">使用 sendkey 发送 win + m 将所有窗口最小化,之后再暂停进程,完美~</span>
</p>
<h2 id="toc_6" class="h16">成品</h2>
<p class="md_block">
<span class="md_line md_line_start">配合 Listary<br /></span>
<span class="md_line md_line_dom_embed md_line_with_image md_line_end"><img class="md_compiled " src="https://oartlm8rs.qnssl.com//wen-ti-jie-jue-fang-an/suspend-processes-on-windows/snipaste.jpg" alt="" title="" ></span>
</p>
<h2 id="toc_7" class="h16">最后</h2>
<p class="md_block">
<span class="md_line md_line_start md_line_end">好久没像这样折腾了..</span>
</p>
ZeroTier 中阶教程
2018-02-22T09:43:00Z
jiao-cheng/zerotier-zhong-jie-jiao-cheng
天涼好個秋.
<h1 id="toc_0" class="h16">前</h1>
<p class="md_block">
<span class="md_line md_line_start md_line_end">这篇中阶教程从这个网络拓扑图说起。</span>
</p>
<p class="md_block">
<span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"><img class="md_compiled " src="https://cdn.stray.love//jiao-cheng/zerotier-zhong-jie-jiao-cheng/networks.png" alt="" title="" ></span>
</p>
<p class="md_block">
<span class="md_line md_line_start md_line_end">本文教大家如何通过 ZeroTier 让拓扑图中的 两台 PC、两台 Router、两台 Server、iPhone 之间可以互相访问。</span>
</p>
<h2 id="toc_1" class="h16">初阶方案</h2>
<p class="md_block">
<span class="md_line md_line_start md_line_end">如果读过初阶教程,那一定能想得到最容易的方法:在所有的设备上都安装 Zerotier 就可以实现互相访问的目的。但这也是最麻烦的方法,毕竟要在所有设备上安装 ZeroTier。</span>
</p>
<h2 id="toc_2" class="h16">正确的做法是什么?</h2>
<p class="md_block">
<span class="md_line md_line_start md_line_end">只需要在两台 Router上安装 ZeroTier 并正确配置 路由表 和 防火墙 即可。</span>
</p>
<h2 id="toc_3" class="h16">正式开始</h2>
<ol>
<li class="md_li"><span>在 Router1 上安装 Zerotier,并填写 network ID 加入 ZeroTier 网络
</span></li>
<li class="md_li"><span>假设 ZeroTier 为 Router1 分配的 IP 为 10.10.10.11
</span></li>
<li class="md_li"><span>在 ZeroTier 官网设置 Managed Routes 选项 如下图填写:
<p class="md_block">
<span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"><img class="md_compiled " src="https://cdn.stray.love//jiao-cheng/zerotier-zhong-jie-jiao-cheng/ManagedRoutes.png" alt="" title="" ></span>
</p>
</span></li>
<li class="md_li"><span>点击加号,等待生效。
</span></li>
<li class="md_li"><span>配置 Router1 的防火墙(以 OPENWRT 路由器为例)
<pre><code># 其中 zt0 是 ZeroTier 的物理接口,可以使用 zerotier-cli listnetworks 命令查看,其中 zt0 在其他平台可能是 其他名字
root@LEDE:~# zerotier-cli listnetworks
200 listnetworks <nwid> <name> <mac> <status> <type> <dev> <ZT assigned ips>
200 listnetworks xxxxxxxxx MarIxs xx:xx:xx:xx:xx:xx OK PRIVATE zt0 10.10.10.11/20
#配置防火墙
root@LEDE:~# iptables -I FORWARD -i zt0 -j ACCEPT
root@LEDE:~# iptables -I FORWARD -o zt0 -j ACCEPT
root@LEDE:~# iptables -t nat -I POSTROUTING -o zt0 -j MASQUERADE</code></pre>
<!--block_code_end--></span></li>
<li class="md_li"><span>为了测试 iPhone 安装并运行 ZeroTier 并加入 ZeroTier 网络
</span></li>
</ol>
<p class="md_block">
<span class="md_line md_line_start md_line_end">如此 Router1 下的所有设备和 iPhone 可以互相访问了,也就是说 iPhone、Router1、PC1、Server1 任意两个之间都可以 ping 通。</span>
</p>
<p class="md_block">
<span class="md_line md_line_start md_line_end">比如在 iPhone 上 ping 10.10.10.11(Router1)、192.168.10.1(Router1)、192.168.10.100(PC1)、192.168.10.200(Server1) 都是没问题的。</span>
</p>
<h2 id="toc_4" class="h16">更进一步</h2>
<p class="md_block md_has_block_below md_has_block_below_ol">
<span class="md_line md_line_start md_line_end">将 Router2 网络加入 ZeroTier,过程和 Router1 类似。</span>
</p>
<ol>
<li class="md_li"><span>在 Router2 上安装 Zerotier,并填写相同 network ID 加入 ZeroTier 网络
</span></li>
<li class="md_li"><span>假设 ZeroTier 为 Router2 分配的 IP 为 10.10.10.12
</span></li>
<li class="md_li"><span>在 ZeroTier 官网设置 Managed Routes 选项 如下图填写:
<p class="md_block">
<span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"><img class="md_compiled " src="https://cdn.stray.love//jiao-cheng/zerotier-zhong-jie-jiao-cheng/ManagedRoutes2.png" alt="" title="" ></span>
</p>
</span></li>
<li class="md_li"><span>点击加号,等待生效。
</span></li>
<li class="md_li"><span>配置 Router2 的防火墙(以 OPENWRT 路由器为例)
<pre><code>#其中 zt0 是 ZeroTier 的物理接口,可以使用 zerotier-cli listnetworks 命令查看,其中 zt0 在其他平台可能是 其他名字
root@LEDE:~# zerotier-cli listnetworks
200 listnetworks <nwid> <name> <mac> <status> <type> <dev> <ZT assigned ips>
200 listnetworks xxxxxxxxx MarIxs xx:xx:xx:xx:xx:xx OK PRIVATE zt0 10.10.10.12/20
#配置防火墙
root@LEDE:~# iptables -I FORWARD -i zt0 -j ACCEPT
root@LEDE:~# iptables -I FORWARD -o zt0 -j ACCEPT
root@LEDE:~# iptables -t nat -I POSTROUTING -o zt0 -j MASQUERADE</code></pre>
<!--block_code_end--></span></li>
</ol>
<p class="md_block">
<span class="md_line md_line_start md_line_end">至此,拓扑图上的所有设备都可以互相访问了。而 Router1 和 Router2 所在的两个网络被无缝连接在了一起,如果两个网络在异地,那就是所谓的异地组网了。</span>
</p>
<h2 id="toc_5" class="h16">ZeroTier 的 Managed Routes 功能</h2>
<p class="md_block">
<span class="md_line md_line_start">按上面教程设置后, Managed Routes 如下图,<br /></span>
<span class="md_line md_line_dom_embed md_line_with_image"><img class="md_compiled " src="https://cdn.stray.love//jiao-cheng/zerotier-zhong-jie-jiao-cheng/route.png" alt="" title="" ><br /></span>
<span class="md_line img_before only_img_before md_line_end">对于熟悉路由表的朋友应该没什么难度,但对于对于网络了解很少的朋友可能会有些困难。</span>
</p>
<p class="md_block md_block_as_opening md_has_block_below md_has_block_below_ul">
<span class="md_line md_line_start md_line_end">这里简单说明下:</span>
</p>
<ul>
<li class="md_li"><span>networks/bits:填写需要被访问的网段
</span></li>
<li class="md_li"><span>(lan):网络中接入 ZeroTier 的设备被分配的 IP
</span></li>
</ul>
<p class="md_block md_block_as_opening md_has_block_below md_has_block_below_ul">
<span class="md_line md_line_start md_line_end">所以前面的教程例子很容易理解了,以 Router1 为例:</span>
</p>
<ul>
<li class="md_li"><span>需要被访问的是 Router1 下的设备,就是 Router1 的 lan IP 段,拓扑图上可以看出 Router1 lan IP 段为 192.168.10.1/24
</span></li>
<li class="md_li"><span>这部分网络,接入 ZeroTier 的是 Router1 ,被分配的 IP 为 10.10.10.11
</span></li>
<li class="md_li"><span>所以 networks/bits 为 192.168.10.1/24,(lan)为 10.10.10.11
</span></li>
</ul>
<p class="md_block">
<span class="md_line md_line_start md_line_end">用相同的思路分析 Router2 的网络,也能得到:networks/bits 为 192.168.5.1/24,(lan)为 10.10.10.12</span>
</p>
<p class="md_block">
<span class="md_line md_line_start">ZeroTier 会根据你的设置,自动(智能)下发路由表到设备中,从而实现多个网段互联互通。<br /></span>
<span class="md_line md_line_end">感兴趣的朋友可以按照教程组网,然后查看设备上路由表。</span>
</p>
<h2 id="toc_6" class="h16">需要注意</h2>
<ul>
<li class="md_li"><span><strong>组网的多个局域网,IP 段不能冲突,</strong>
<ul>
<li class="md_li"><span>如拓扑图中 Router1 192.168.10.1/24 和 Router2 192.168.5.1/24 是不冲突的。
</span></li>
</ul>
</span></li>
<li class="md_li"><span><strong>防火墙的配置可能因设备而异</strong>
<ul>
<li class="md_li"><span>主要的目的是放行 ZeroTier 的数据包和 SNAT 转换。
</span></li>
</ul>
</span></li>
</ul>
<h2 id="toc_7" class="h16">其他 FAQ</h2>
<ol>
<li class="md_li"><span>ZeroTier 一定要安装路由器上才能实现组网嘛?
<ul>
<li class="md_li"><span>不,只要能运行 ZeroTier 的设备加上正确的路由表都可以实现。只是在路由器(网关上)某些配置更加方便。
</span></li>
</ul>
</span></li>
<li class="md_li"><span>只能两个局域网互相访问嘛?
<ul>
<li class="md_li"><span>当然可以更多
</span></li>
</ul>
</span></li>
<li class="md_li"><span>延迟如何?
<ul>
<li class="md_li"><span>实测在 4G 网络下十分不稳定。
</span></li>
<li class="md_li"><span>在固网(宽带)的情况下很稳定。
</span></li>
</ul>
</span></li>
<li class="md_li"><span>极路由插件什么时候出?
<ul>
<li class="md_li"><span>快了快了(拖延症)
</span></li>
</ul>
</span></li>
</ol>
<h1 id="toc_8" class="h16">后</h1>
<p class="md_block">
<span class="md_line md_line_start md_line_end">春节躺在家中刷推特,无意中发现有朋友分享初级教程到了推特上,倍感荣幸。给大家拜个晚年,新年快乐,狗年大吉~!</span>
</p>
ZeroTier 初阶教程
2018-02-03T09:43:00Z
jiao-cheng/zerotier-chu-jie-jiao-cheng
天涼好個秋.
<h1 id="toc_0" class="h16">什么是 ZeroTier</h1>
<p class="md_block md_has_block_below md_has_block_below_blockquote">
<span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"><img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/zerotier.png" alt="" title="" ></span>
</p>
<blockquote class="blockquote_lines_1">
<p class="md_block">
<span class="md_line md_line_start md_line_end">ZeroTier delivers the capabilities of VPNs, SDN, and SD-WAN with a single system. Manage all your connected resources across both local and wide area networks as if the whole world is a single data center.</span>
</p>
</blockquote>
<p class="md_block">
<span class="md_line md_line_start md_line_end">简单来说,ZeroTier 是一款简单易用的,在任何有网络的地方,都可以连回家里、公司、学校,而无需公网 IP 和复杂端口转发配置,基于 p2p 技术的内网穿透工具。</span>
</p>
<p class="md_block">
<span class="md_line md_line_start md_line_end">更形象一点的说法是,ZeroTier 就像虚拟的交换机,所有 ZeroTier 的客户端节点都可以互访互通。</span>
</p>
<h2 id="toc_1" class="h16">ZeroTier 的优势是什么</h2>
<ol>
<li class="md_li"><span>跨平台。客户端涵盖主流的设备: Windows、MacOS、Linux、iOS、Android、QNAP NAS、Synology NAS、Western Digital MyCloud NAS、Openwrt
</span></li>
<li class="md_li"><span>控制端(ZeroTier 官网)功能足够强大。可以下发路由表、设备准入控制、IP 分配、流量规则等,ZeroTier 会自动下发配置,只需启动客户端即可。
</span></li>
<li class="md_li"><span>客户端配置简单。ZeroTier 会自动下发配置,所以只需填入 Network ID 启动 ZeroTier 就可以了,这对于很多智能设备、嵌入式设备很友好。
</span></li>
<li class="md_li"><span>可以建立中转服务器(Moon 服务器)。在网络高峰期,或者某些众所周知(qiang)的原因会导致 ZeroTier 官方服务器链接困难,此时可以自己建立 Moon 服务器,从而实现更好的链接效果。
</span></li>
<li class="md_li"><span>接近于免费。个人用户最多可以接入 100 节点设备,完全能满足一般人的需求,而在路由表配置得当的情况下,两个节点就可以使两个内网完全互联(异地组网),这样就远不止100 设备那么少了。
</span></li>
<li class="md_li"><span>客户端开源。这就意味着在官方不提供客户端的设备上,你完全可以自己编译。
</span></li>
</ol>
<h2 id="toc_2" class="h16">初阶教程 点对点链接</h2><h3 id="toc_3" class="h16">注册 ZeroTier 账号</h3>
<ol>
<li class="md_li"><span>访问 ZeroTier 官网 <a href='https://my.zerotier.com/login' target='_blank'>传送门</a>
</span></li>
<li class="md_li"><span>推荐使用 Google 账户快速登陆
</span></li>
<li class="md_li"><span>使用其他注册方式的略过吧,相信你能搞定
</span></li>
</ol>
<h3 id="toc_4" class="h16">创建 Network</h3>
<ol>
<li class="md_li"><span>登陆后点击 Networks 选项卡
</span></li>
</ol>
<p class="md_block md_has_block_below md_has_block_below_ol">
<span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"><img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/creat_network_id.png" alt="" title="" ></span>
</p>
<ol>
<li class="md_li"><span>点击 Creat 创建 Networks
</span></li>
</ol>
<p class="md_block md_has_block_below md_has_block_below_ol">
<span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"><img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/creat_network_id_1.png" alt="" title="" ></span>
</p>
<ol>
<li class="md_li"><span>点击新创建出的 Networks 进行设置
</span></li>
</ol>
<p class="md_block">
<span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"><img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/created_network_id.png" alt="" title="" ></span>
</p>
<h3 id="toc_5" class="h16">设置 Network</h3>
<p class="md_block">
<span class="md_line md_line_start md_line_end">创建好了 Network 后,一般情况下无需设置就可以使用了。着急上手的朋友可以跳过设置这一节,下面介绍一些设置的说明。</span>
</p>
<p class="md_block md_has_block_below md_has_block_below_ol">
<span class="md_line md_line_start">设置项分四大类,常用其中两项 Settings 和 Members。<br /></span>
<span class="md_line md_line_dom_embed md_line_with_image md_line_end"><img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/network_setting.png" alt="" title="" ></span>
</p>
<ol>
<li class="md_li"><span>Settings 常用设置项的解释
<ol>
<li class="md_li"><span>Network ID: 网络 ID ,客户端使用此 ID 加入到网络中
</span></li>
<li class="md_li"><span>Name & Description: 设定 Network 的名称和描述,可任意修改
</span></li>
<li class="md_li"><span>Access Control: 设定 Network 的类型,其中 Certificate (Private Network) 是私有网络,节点的加入需要审核。None (Public Network) 加入不需要任何审核。推荐选择私有网络
</span></li>
<li class="md_li"><span>Multicast Recipient Limit 不用管系列
</span></li>
<li class="md_li"><span>Managed Routes: 路由表设置,初阶教程中不需要修改
</span></li>
<li class="md_li"><span>IPv4 Auto-Assign: 节点 IPv4 自动分配,这里只要保证自动分配的网段和节点的 IP 不冲突即可
</span></li>
<li class="md_li"><span>IPv6 Auto-Assign: 节点 IPv6 自动分配,可以忽略
</span></li>
</ol>
</span></li>
<li class="md_li"><span>Members 顾名思义,就是节点状态查看和管理,包括在线状态、准入、拉黑、改名、添加描述、设置静态 IP。
</span></li>
</ol>
<p class="md_block">
<span class="md_line md_line_start md_line_end">嗯~!除了注意分配的 IPv4 不和节点 IP 冲突,基本没有其他的注意项目了。</span>
</p>
<h3 id="toc_6" class="h16">客户端使用</h3>
<p class="md_block md_has_block_below md_has_block_below_ul">
<span class="md_line md_line_start">这里以 Windows 和 Android 为例,期待的结果是两者可以互相访问。<br /></span>
<span class="md_line md_line_end">客户端下载 <a href='https://www.zerotier.com/download.shtml' target='_blank'>传送门</a></span>
</p>
<ul>
<li class="md_li"><span>Windows
<ul>
<li class="md_li"><span>下载安装,运行 Windows 客户端之后,点击右下角区域的 ZeroTier 图标,选择join network
<img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/Windows_join.png" alt="" title="" >
</span></li>
<li class="md_li"><span>输入 Network ID ,然后点击 join<br>
<img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/Windows_network_id.png" alt="" title="" >
</span></li>
<li class="md_li"><span>点击右下角的 ZeroTier 图标,选择 show networks<br>
<img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/deauth_network.png" alt="" title="" >
</span></li>
<li class="md_li"><span>status 显示为 ACCESS_DENIED,这说明设备没有被准入,去查看 Members 选项,确认设备确实是当前设备后,点击的箭头处准许设备连入。
</span></li>
<li class="md_li"><span>稍等一分钟左右,状态如下图,表示加入成功,此时记住节点的 IP 为 192.168.192.88<br>
<img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/auth_ok.png" alt="" title="" >
</span></li>
</ul>
</span></li>
<li class="md_li"><span>Android 注意状态栏,手机全程使用 4G,方便后面测试连通性<br>
<ul>
<li class="md_li"><span>下载安装,点开 Android APP,点击右下角的 connect,等待状态显示为 ONLINE 后,点击 右上角加号<br>
<img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/app_connected.png" alt="" title="" >
</span></li>
<li class="md_li"><span>输入 Network ID ,然后点击 join<br>
<img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/app_join.png" alt="" title="" >
</span></li>
<li class="md_li"><span>和 Windows 客户端一样, Members 选项,确认设备确实是当前设备后,准入
</span></li>
<li class="md_li"><span>等待 status 变成ok,记录下 IP 192.168.192.231<br>
<img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/app_ok.png" alt="" title="" >
</span></li>
</ul>
</span></li>
</ul>
<h3 id="toc_7" class="h16">连通性测试</h3>
<ol>
<li class="md_li"><span>从 Windows Ping Android 的 IP,延迟有点高,但还是连通的
</span></li>
</ol>
<p class="md_block md_has_block_below md_has_block_below_ol">
<span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"><img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/windows_ping.png" alt="" title="" ></span>
</p>
<ol>
<li class="md_li"><span>从 Android 访问 Windows 的 IP,可以看到了 Windows 的资源使用情况,说明是连通的<br>
</span></li>
</ol>
<p class="md_block">
<span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"><img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/app_test_connect.png" alt="" title="" ></span>
</p>
<h3 id="toc_8" class="h16">其他</h3>
<ul>
<li class="md_li"><span>你可能会好奇,在网页中显示 PC 资源占用是怎么做到的,emmm 是用 AIDA64 实现的,用废旧手机做资源监视器,是不是很炫酷
</span></li>
<li class="md_li"><span>关注博客的朋友应该知道,每次发一些新奇东西的教程,就代表着接下来会出插件了。嗯~!是的, ZeroTier 的极路由插件不远了
</span></li>
<li class="md_li"><span>看过初阶教程后,你可能会疑问,每一个设备都必须安装 ZeroTier 才能实现互通?然而这也太麻烦了。嗯 所以叫初阶教程啊,好戏还在后头
</span></li>
</ul>
使用公钥登陆OpenWrt
2017-11-30T12:56:40Z
wen-ti-jie-jue-fang-an/shi-yong-gong-yao-deng-lu-openwrt
天涼好個秋.
<h3 id="toc_0" class="h16">前</h3>
<p class="md_block">
<span class="md_line md_line_start md_line_end">以下操作均在 Bash on windows 下执行。</span>
</p>
<h3 id="toc_1" class="h16">生成密钥</h3>
<p class="md_block">
<span class="md_line md_line_start md_line_end">输入以下命令,输入三次回车,即可得到一对密钥。</span>
</p>
<div class="codehilite code_lang_shell highlight"><pre><span></span>toor@SurfaceBook:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key <span class="o">(</span>/home/toor/.ssh/id_rsa<span class="o">)</span>:
Created directory <span class="s1">'/home/toor/.ssh'</span>.
Enter passphrase <span class="o">(</span>empty <span class="k">for</span> no passphrase<span class="o">)</span>:
Enter same passphrase again:
Your identification has been saved in /home/toor/.ssh/id_rsa.
Your public key has been saved in /home/toor/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:U2ZM6mqTrxl0e/JWVygB9fw6RXHZBHcinGM7wegMmws
toor@SurfaceBook
The key<span class="err">'</span>s randomart image is:
+---<span class="o">[</span>RSA 2048<span class="o">]</span>----+
<span class="p">|</span> o*o.o+B<span class="p">|</span>
<span class="p">|</span> .+. O+ +<span class="o">=</span><span class="p">|</span>
<span class="p">|</span> .*<span class="o">=</span>. <span class="o">=</span>o..<span class="p">|</span>
<span class="p">|</span> E.o+o + .o.<span class="p">|</span>
<span class="p">|</span> ..S. o .o<span class="p">|</span>
<span class="p">|</span> . +.o . .o <span class="p">|</span>
<span class="p">|</span> * o .. .o <span class="p">|</span>
<span class="p">|</span> . <span class="o">=</span> +. . <span class="p">|</span>
<span class="p">|</span> o.... <span class="p">|</span>
+----<span class="o">[</span>SHA256<span class="o">]</span>-----+
toor@SurfaceBook:~$ ll .ssh
总用量 4
drwx------ <span class="m">0</span> toor toor <span class="m">512</span> 11月 <span class="m">30</span> 20:37 ./
drwxr-xr-x <span class="m">0</span> toor toor <span class="m">512</span> 11月 <span class="m">30</span> 20:37 ../
-rw------- <span class="m">1</span> toor toor <span class="m">1679</span> 11月 <span class="m">30</span> 20:37 id_rsa
-rw-r--r-- <span class="m">1</span> toor toor <span class="m">398</span> 11月 <span class="m">30</span> 20:37 id_rsa.pub
</pre></div>
<!--block_code_end--><h3 id="toc_2" class="h16">上传公钥</h3>
<p class="md_block">
<span class="md_line md_line_start md_line_end">上传公钥到路由器</span>
</p>
<div class="codehilite code_lang_shell highlight"><pre><span></span>ssh-copy-id root@tw -p1022
</pre></div>
<!--block_code_end-->
<p class="md_block">
<span class="md_line md_line_start">此时公钥在路由器中的位置: /root/.ssh/authorized_keys<br /></span>
<span class="md_line md_line_end">将公钥拷贝到 dropbear 目录下,并赋予争取的权限</span>
</p>
<div class="codehilite code_lang_shell highlight"><pre><span></span>cp /root/.ssh/authorized_keys /etc/dropbear/
chmod <span class="m">700</span> /etc/dropbear
chmod <span class="m">600</span> /etc/dropbear/authorized_keys
</pre></div>
<!--block_code_end--><h3 id="toc_3" class="h16">使用私钥登陆</h3><div class="codehilite code_lang_shell highlight"><pre><span></span>ssh -i ~/.ssh/id_rsa root@tw -p 1022
</pre></div>
<!--block_code_end-->
<p class="md_block">
<span class="md_line md_line_start md_line_end">不出意外,已经可以免密码登陆了。</span>
</p>
<h3 id="toc_4" class="h16">更便利</h3>
<p class="md_block">
<span class="md_line md_line_start md_line_end">虽然省去密码,但 SSH 命令还是要敲的,那就想办法更便利些。</span>
</p>
<div class="codehilite code_lang_shell highlight"><pre><span></span>vim .ssh/config
<span class="c1"># 添加如下配置</span>
Host gee
HostName tw
Port 1022
IdentityFile ~/.ssh/id_rsa
User root
</pre></div>
<!--block_code_end-->
<p class="md_block">
<span class="md_line md_line_start md_line_end">然后就可以使用 Host 指定的名称登陆了。</span>
</p>
<div class="codehilite code_lang_shell highlight"><pre><span></span>toor@SurfaceBook:~$ ssh gee
BusyBox v1.25.1 <span class="o">()</span> built-in shell <span class="o">(</span>ash<span class="o">)</span>
***********************************************************
__ __ _ _ ____ _ TM
/ / / / <span class="o">(</span>_<span class="o">)</span> _ __ <span class="o">(</span>_<span class="o">)</span> / __/ <span class="o">(</span>_<span class="o">)</span>
/ /_/ / / / <span class="p">|</span> <span class="p">|</span> /<span class="p">|</span> / / / / / /_ / /
/ __ / / / <span class="p">|</span> <span class="p">|</span>/ <span class="p">|</span>/ / / / / __/ / /
/_/ /_/ /_/ <span class="p">|</span>__/<span class="p">|</span>__/ /_/ /_/ /_/
http://www.hiwifi.com/
***********************************************************
root@Hiwifi:~#
</pre></div>
<!--block_code_end--><h3 id="toc_5" class="h16">Enjoy it</h3>
解决GO语言编译程序无法在openwrt上运行的问题
2017-11-19T08:17:59Z
wen-ti-jie-jue-fang-an/jie-jue-goyu-yan-bian-yi-cheng-xu-wu-fa-zai-openwrtshang-yun-xing-de-wen-ti
天涼好個秋.
<h3 id="toc_0" class="h16">问题</h3>
<p class="md_block">
<span class="md_line md_line_start md_line_end">Aria2Gee 插件靠 frp 进行内网穿透,但一直以来都存在一个诡异的问题:个别机型上 frpc 无法运行,具体表现是运行之后进程就被阻塞住无响应。</span>
</p>
<h3 id="toc_1" class="h16">转机</h3>
<p class="md_block">
<span class="md_line md_line_start">由于 frpc 不是我自己编译的,所以这个问题一直都没解决。直到最近,在极路由插件开发群,一位朋友用 go 写了 hello world 程序,放在极路由上运行时遇到相同的问题。经过排查他发现是内核未开启 FPU(floating point unit) emulator 选项。<br /></span>
<span class="md_line md_line_end">于是我也去验证了下 frpc 无法运行是否也是同样的原因。手动运行 frpc 然后 log 如下:</span>
</p>
<div class="codehilite code_lang_shell highlight"><pre><span></span>Nov <span class="m">15</span> 18:57:59 Hiwifi kern.info
kernel: <span class="o">[</span> 2031.780000<span class="o">]</span> FPU emulator disabled,
make sure your toolchainwas compiled with software floating point support <span class="o">(</span>soft-float<span class="o">)</span>
</pre></div>
<!--block_code_end-->
<p class="md_block">
<span class="md_line md_line_start md_line_end">emmmm~~!确实是这个问题(感觉 debug 时的程序员都像柯南)</span>
</p>
<h3 id="toc_2" class="h16">思路</h3>
<p class="md_block md_block_as_opening md_has_block_below md_has_block_below_ol">
<span class="md_line md_line_start md_line_end">既然提示未开启 FPU emulator ,那解决方法至少有两个:</span>
</p>
<ol>
<li class="md_li"><span>将选项启用,并重新编译固件
</span></li>
<li class="md_li"><span>golang 本身是否有编译选项不依赖于 FPU emulator 。
</span></li>
</ol>
<p class="md_block">
<span class="md_line md_line_start">方法1显然是不现实的,我无法左右官方 ROM 的编译选项。<br /></span>
<span class="md_line md_line_end">至于方法2能否实现就要看 golang 是不是支持了。</span>
</p>
<p class="md_block">
<span class="md_line md_line_start">从 golang 的 wiki 来看是没戏的:<br /></span>
<span class="md_line md_line_dom_embed md_line_end"><a class="md_compiled" href="https://github.com/golang/go/wiki/MinimumRequirements#mips-big-endian-and-mipsle-little-endian">MinimumRequirements</a></span>
</p>
<p class="md_block">
<span class="md_line md_line_start md_line_end">Google 关键字 "MIPS FPU golang",emmmmm~!果然很多人遇到了这个问题,<a class="md_compiled" href="https://github.com/golang/go/issues/18162">runtime: mips32 soft float point support</a></span>
</p>
<p class="md_block">
<span class="md_line md_line_start md_line_end">从 issue 的回复来看,官方似乎会在接下来的版本支持类似的特性(emmmmm~~也就是说现在是不支持的),但事情还是有转机的,发现有朋友放出了 patch ,<a class="md_compiled" href="https://github.com/golang/go/issues/18162#issuecomment-318880038">go1.8.3-sf-patch</a></span>
</p>
<p class="md_block md_block_as_opening md_has_block_below md_has_block_below_ol">
<span class="md_line md_line_start md_line_end">所以接下来的思路很清晰了:</span>
</p>
<ol>
<li class="md_li"><span>下载 go 1.8.3 的代码
</span></li>
<li class="md_li"><span>打上 issue 提供的 patch
</span></li>
<li class="md_li"><span>重新编译 golang
</span></li>
<li class="md_li"><span>用新编译出的 golang 编译 frp
</span></li>
</ol>
<h3 id="toc_3" class="h16">解决</h3>
<p class="md_block">
<span class="md_line md_line_start">最后确实按照上面的思路解决了问题,但编译的过程有些复杂就不在这篇里面写了。上面提供的信息已经足够你自己动手解决问题了。<br /></span>
<span class="md_line md_line_end">当然,最后还是要提供编译好 frpc 文件的,见下面链接。</span>
</p>
<p class="md_block">
<span class="md_line md_line_dom_embed md_line_start md_line_end"><a class="md_compiled" href="https://github.com/IxsCN/frpc_mipsle_noFPU">frpc_mipsle_noFPU</a></span>
</p>
<h3 id="toc_4" class="h16">后</h3>
<p class="md_block">
<span class="md_line md_line_start md_line_end">虽然解决了问题,但不知道 golang 模拟的 FPU 会不会带来性能问题,特别是 MTK 这种本来就很弱的 CPU。emmmm~慢总比不能用强吧~~!</span>
</p>
搭建群晖交叉编译环境并编译Aria2
2017-10-05T15:09:00Z
itshou-zha/da-jian-qun-hui-jiao-cha-bian-yi-huan-jing-bing-bian-yi-aria2
天涼好個秋.
<h3 id="toc_0" class="h16">前</h3>
<p class="md_block">
<span class="md_line md_line_start md_line_end">一直想自己编译一个群晖上的 aria2 ,正好国庆假期,自己折腾下,这里是折腾过程的流水账,仅作记录之用。</span>
</p>
<h3 id="toc_1" class="h16">搭建官方编译环境</h3>
<p class="md_block md_has_block_below md_has_block_below_ul">
<span class="md_line md_line_start">找到了官方文档,搭建似乎很容易:<br /></span>
<span class="md_line md_line_end">官方的文档 <a class="md_compiled" href="https://developer.synology.com/developer-guide/index.html">DSM_Developer_Guide</a></span>
</p>
<ul>
<li class="md_li"><span>编译环境的需求如下:
<ul>
<li class="md_li"><span>64bit linux environment.
</span></li>
<li class="md_li"><span>Bash (>= 4.1.5)
</span></li>
<li class="md_li"><span>Python (>= 2.7.3)
</span></li>
</ul>
</span></li>
<li class="md_li"><span>建立工作目录
</span></li>
</ul>
<div class="codehilite code_lang_shell highlight"><pre><span></span>mkdir -p /toolkit/
</pre></div>
<!--block_code_end-->
<ul>
<li class="md_li"><span>下载toolkit
</span></li>
</ul>
<div class="codehilite code_lang_shell highlight"><pre><span></span><span class="nb">cd</span> /toolkit/
git clone https://github.com/SynologyOpenSource/pkgscripts-ng.git
</pre></div>
<!--block_code_end-->
<ul>
<li class="md_li"><span>更新环境
</span></li>
</ul>
<pre><code>version="6.1"
platform="armada375"
cd /toolkit/pkgscripts-ng
./EnvDeploy -v ${version} -p ${platform}</code></pre>
<!--block_code_end-->
<ul>
<li class="md_li"><span>更新好之后的目录结构
</span></li>
</ul>
<div class="codehilite code_lang_shell highlight"><pre><span></span>/toolkit
├── build_env
│ └── ds.armada375-6.1
├── pkgscripts-ng
│ ├── CodeSign.php
│ ├── EnvDeploy
│ ├── include
│ ├── PkgCreate.py
│ ├── ProjectDepends.py
│ ├── README.md
│ ├── SynoBuild
│ └── SynoInstall
└── toolkit_tarballs
├── base_env-6.1.txz
├── ds.armada375-6.1.dev.txz
└── ds.armada375-6.1.env.txz
</pre></div>
<!--block_code_end-->
<ul>
<li class="md_li"><span>进入 chroot 环境
</span></li>
</ul>
<div class="codehilite code_lang_shell highlight"><pre><span></span>sudo chroot /toolkit/build_env/ds.armada375-6.1
</pre></div>
<!--block_code_end-->
<ul>
<li class="md_li"><span>继续看文档发现,这是编译官方安装的环境,我似乎不需要弄这么复杂,弃坑。
</span></li>
</ul>
<h3 id="toc_2" class="h16">搭建交叉编译环境</h3>
<ul>
<li class="md_li"><span>
<p class="md_block">
<span class="md_line md_line_start">根据 NAS 型号,选择编译器<br /></span>
<span class="md_line md_line_dom_embed md_line_end"><a class="md_compiled" href="https://sourceforge.net/projects/dsgpl/files/DSM%206.1%20Tool%20Chains/Marvell%20Armada%20375%20Linux%203.2.40/armada375-gcc493_glibc220_hard-GPL.txz">armada375-gcc493_glibc220_hard-GPL.txz</a></span>
</p>
</span></li>
<li class="md_li"><span>解压文件到 /usr/local
</span></li>
</ul>
<pre><code>tar -zJf armada375-gcc493_glibc220_hard-GPL.txz /usr/local
cp -rf /usr/local/arm-unknown-linux-gnueabi/* /usr/local/</code></pre>
<!--block_code_end--><h3 id="toc_3" class="h16">编译依赖库</h3>
<p class="md_block">
<span class="md_line md_line_start md_line_end">在 github 上搜索了下有人写好了编译的脚本,<a class="md_compiled" href="https://github.com/q3aql/aria2-static-builds">aria2-static-builds</a></span>
</p>
<p class="md_block">
<span class="md_line md_line_start md_line_end">嗯,自己修改了下</span>
</p>
<div class="codehilite code_lang_shell highlight"><pre><span></span><span class="ch">#!/bin/bash</span>
<span class="c1"># In this configuration, the following dependent libraries are compiled:</span>
<span class="c1">#</span>
<span class="c1"># * zlib</span>
<span class="c1"># * c-ares</span>
<span class="c1"># * expat</span>
<span class="c1"># * sqlite3</span>
<span class="c1"># * openSSL</span>
<span class="c1"># * libssh2</span>
<span class="c1">#CHECK TOOL FOR DOWNLOAD</span>
aria2c --help > /dev/null
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$?</span><span class="s2">"</span> -eq <span class="m">0</span> <span class="o">]</span> <span class="p">;</span> <span class="k">then</span>
<span class="nv">DOWNLOADER</span><span class="o">=</span><span class="s2">"aria2c --check-certificate=false"</span>
<span class="k">else</span>
<span class="nv">DOWNLOADER</span><span class="o">=</span><span class="s2">"wget -c"</span>
<span class="k">fi</span>
<span class="c1">## DEPENDENCES ##</span>
<span class="nv">ZLIB</span><span class="o">=</span>http://sourceforge.net/projects/libpng/files/zlib/1.2.11/zlib-1.2.11.tar.gz
<span class="nv">OPENSSL</span><span class="o">=</span>http://www.openssl.org/source/openssl-1.0.2k.tar.gz
<span class="nv">EXPAT</span><span class="o">=</span>https://sourceforge.net/projects/expat/files/expat/2.2.0/expat-2.2.0.tar.bz2
<span class="nv">SQLITE3</span><span class="o">=</span>http://www.sqlite.org/2017/sqlite-autoconf-3180000.tar.gz
<span class="nv">C_ARES</span><span class="o">=</span>http://c-ares.haxx.se/download/c-ares-1.12.0.tar.gz
<span class="nv">SSH2</span><span class="o">=</span>https://www.libssh2.org/download/libssh2-1.7.0.tar.gz
<span class="c1">## CONFIG ##</span>
<span class="nv">ARCH</span><span class="o">=</span><span class="s2">"unknown"</span>
<span class="nv">HOST</span><span class="o">=</span><span class="s2">"arm-unknown-linux-gnueabi"</span>
<span class="nv">PREFIX</span><span class="o">=</span><span class="s2">"/opt/aria2-arm-unknown/build_libs"</span>
<span class="nv">LOCAL_DIR</span><span class="o">=</span><span class="s2">"/opt/aria2-arm-unknown/build_libs"</span>
<span class="nv">TOOL_BIN_DIR</span><span class="o">=</span><span class="s2">"/usr/local/</span><span class="nv">$HOST</span><span class="s2">/bin"</span>
<span class="nv">PATH</span><span class="o">=</span><span class="si">${</span><span class="nv">TOOL_BIN_DIR</span><span class="si">}</span>:<span class="nv">$PATH</span>
<span class="nv">CFLAGS</span><span class="o">=</span><span class="s2">"-mhard-float -mfpu=vfpv3"</span>
<span class="nv">DEST</span><span class="o">=</span><span class="s2">"/opt/aria2-arm-unknown/build_libs"</span>
<span class="nv">CC</span><span class="o">=</span><span class="nv">$HOST</span>-gcc
<span class="nv">CXX</span><span class="o">=</span><span class="nv">$HOST</span>-g++
<span class="nv">LDFLAGS</span><span class="o">=</span><span class="s2">"-L</span><span class="nv">$DEST</span><span class="s2">/lib"</span>
<span class="nv">CPPFLAGS</span><span class="o">=</span><span class="s2">"-I</span><span class="nv">$DEST</span><span class="s2">/include"</span>
<span class="nv">CXXFLAGS</span><span class="o">=</span><span class="nv">$CFLAGS</span>
<span class="nv">MAKE</span><span class="o">=</span><span class="s2">"make -j`nproc`"</span>
<span class="nv">CONFIGURE</span><span class="o">=</span><span class="s2">"./configure --prefix=</span><span class="si">${</span><span class="nv">LOCAL_DIR</span><span class="si">}</span><span class="s2"> --host=</span><span class="nv">$HOST</span><span class="s2">"</span>
<span class="nv">BUILD_DIRECTORY</span><span class="o">=</span>/tmp/
<span class="c1">## BUILD ##</span>
<span class="nb">cd</span> <span class="nv">$BUILD_DIRECTORY</span>
<span class="c1">#</span>
<span class="c1"># zlib build</span>
<span class="nv">$DOWNLOADER</span> <span class="nv">$ZLIB</span>
tar zxvf zlib-1.2.11.tar.gz
<span class="nb">cd</span> zlib-1.2.11/
<span class="nv">PKG_CONFIG_PATH</span><span class="o">=</span><span class="nv">$PREFIX</span>/lib/pkgconfig/ <span class="nv">LD_LIBRARY_PATH</span><span class="o">=</span><span class="nv">$PREFIX</span>/lib/ <span class="nv">CC</span><span class="o">=</span><span class="nv">$HOST</span>-gcc <span class="nv">STRIP</span><span class="o">=</span><span class="nv">$HOST</span>-strip <span class="nv">RANLIB</span><span class="o">=</span><span class="nv">$HOST</span>-ranlib <span class="nv">CXX</span><span class="o">=</span><span class="nv">$HOST</span>-g++ <span class="nv">AR</span><span class="o">=</span><span class="nv">$HOST</span>-ar <span class="nv">LD</span><span class="o">=</span><span class="nv">$HOST</span>-ld ./configure --prefix<span class="o">=</span><span class="nv">$PREFIX</span> --static
make
make install
<span class="c1">#</span>
<span class="c1"># expat build</span>
<span class="nb">cd</span> ..
<span class="nv">$DOWNLOADER</span> <span class="nv">$EXPAT</span>
tar jxvf expat-2.2.0.tar.bz2
<span class="nb">cd</span> expat-2.2.0/
<span class="nv">PKG_CONFIG_PATH</span><span class="o">=</span><span class="nv">$PREFIX</span>/lib/pkgconfig/ <span class="nv">LD_LIBRARY_PATH</span><span class="o">=</span><span class="nv">$PREFIX</span>/lib/ <span class="nv">CC</span><span class="o">=</span><span class="nv">$HOST</span>-gcc <span class="nv">CXX</span><span class="o">=</span><span class="nv">$HOST</span>-g++ ./configure --host<span class="o">=</span><span class="nv">$HOST</span> --build<span class="o">=</span><span class="sb">`</span>dpkg-architecture -qDEB_BUILD_GNU_TYPE<span class="sb">`</span> --prefix<span class="o">=</span><span class="nv">$PREFIX</span> --enable-static<span class="o">=</span>yes --enable-shared<span class="o">=</span>no
make
make install
<span class="c1">#</span>
<span class="c1"># c-ares build</span>
<span class="nb">cd</span> ..
<span class="nv">$DOWNLOADER</span> <span class="nv">$C_ARES</span>
tar zxvf c-ares-1.12.0.tar.gz
<span class="nb">cd</span> c-ares-1.12.0/
<span class="nv">PKG_CONFIG_PATH</span><span class="o">=</span><span class="nv">$PREFIX</span>/lib/pkgconfig/ <span class="nv">LD_LIBRARY_PATH</span><span class="o">=</span><span class="nv">$PREFIX</span>/lib/ <span class="nv">CC</span><span class="o">=</span><span class="nv">$HOST</span>-gcc <span class="nv">CXX</span><span class="o">=</span><span class="nv">$HOST</span>-g++ ./configure --host<span class="o">=</span><span class="nv">$HOST</span> --build<span class="o">=</span><span class="sb">`</span>dpkg-architecture -qDEB_BUILD_GNU_TYPE<span class="sb">`</span> --prefix<span class="o">=</span><span class="nv">$PREFIX</span> --enable-static --disable-shared
make
make install
<span class="c1">#</span>
<span class="c1"># Openssl build</span>
<span class="nb">cd</span> ..
<span class="nv">$DOWNLOADER</span> <span class="nv">$OPENSSL</span>
tar zxvf openssl-1.0.2k.tar.gz
<span class="nb">cd</span> openssl-1.0.2k/
<span class="nv">PKG_CONFIG_PATH</span><span class="o">=</span><span class="nv">$PREFIX</span>/lib/pkgconfig/ <span class="nv">LD_LIBRARY_PATH</span><span class="o">=</span><span class="nv">$PREFIX</span>/lib/ <span class="nv">CC</span><span class="o">=</span><span class="nv">$HOST</span>-gcc <span class="nv">CXX</span><span class="o">=</span><span class="nv">$HOST</span>-g++ ./Configure linux-armv4 <span class="nv">$CFLAGS</span> --prefix<span class="o">=</span><span class="nv">$PREFIX</span> shared zlib zlib-dynamic -D_GNU_SOURCE -D_BSD_SOURCE --with-zlib-lib<span class="o">=</span><span class="nv">$LOCAL_DIR</span>/lib --with-zlib-include<span class="o">=</span><span class="nv">$LOCAL_DIR</span>/include
make <span class="nv">CC</span><span class="o">=</span><span class="nv">$CC</span>
make <span class="nv">CC</span><span class="o">=</span><span class="nv">$CC</span> install <span class="nv">INSTALLTOP</span><span class="o">=</span><span class="nv">$DEST</span> <span class="nv">OPENSSLDIR</span><span class="o">=</span><span class="nv">$DEST</span>/ssl
<span class="c1">#</span>
<span class="c1"># sqlite3</span>
<span class="nb">cd</span> ..
<span class="nv">$DOWNLOADER</span> <span class="nv">$SQLITE3</span>
tar zxvf sqlite-autoconf-3180000.tar.gz
<span class="nb">cd</span> sqlite-autoconf-3180000/
<span class="nv">PKG_CONFIG_PATH</span><span class="o">=</span><span class="nv">$PREFIX</span>/lib/pkgconfig/ <span class="nv">LD_LIBRARY_PATH</span><span class="o">=</span><span class="nv">$PREFIX</span>/lib/ <span class="nv">CC</span><span class="o">=</span><span class="nv">$HOST</span>-gcc <span class="nv">CXX</span><span class="o">=</span><span class="nv">$HOST</span>-g++ ./configure --host<span class="o">=</span><span class="nv">$HOST</span> --prefix<span class="o">=</span><span class="nv">$PREFIX</span> --enable-static --enable-shared --build<span class="o">=</span><span class="sb">`</span>dpkg-architecture -qDEB_BUILD_GNU_TYPE<span class="sb">`</span>
make
make install
<span class="c1">#</span>
<span class="c1"># libssh2</span>
<span class="nb">cd</span> ..
<span class="nv">$DOWNLOADER</span> <span class="nv">$SSH2</span>
tar zxvf libssh2-1.7.0.tar.gz
<span class="nb">cd</span> libssh2-1.7.0/
rm -rf <span class="nv">$PREFIX</span>/lib/pkgconfig/libssh2.pc
<span class="nv">PKG_CONFIG_PATH</span><span class="o">=</span><span class="nv">$PREFIX</span>/lib/pkgconfig/ <span class="nv">LD_LIBRARY_PATH</span><span class="o">=</span><span class="nv">$PREFIX</span>/lib/ <span class="nv">CC</span><span class="o">=</span><span class="nv">$HOST</span>-gcc <span class="nv">CXX</span><span class="o">=</span><span class="nv">$HOST</span>-g++ <span class="nv">AR</span><span class="o">=</span><span class="nv">$HOST</span>-ar <span class="nv">RANLIB</span><span class="o">=</span><span class="nv">$HOST</span>-ranlib ./configure --host<span class="o">=</span><span class="nv">$HOST</span> --without-libgcrypt --with-openssl --without-wincng --prefix<span class="o">=</span><span class="nv">$PREFIX</span> --enable-static --disable-shared
make
make install
<span class="c1">#</span>
<span class="c1">#cleaning</span>
<span class="nb">cd</span> ..
rm -rf c-ares*
rm -rf sqlite-autoconf*
rm -rf zlib-*
rm -rf expat-*
rm -rf openssl-*
rm -rf libssh2-*
<span class="c1">#</span>
<span class="nb">echo</span> <span class="s2">"finished!"</span>
</pre></div>
<!--block_code_end--><h3 id="toc_4" class="h16">编译 Aria2</h3>
<ul>
<li class="md_li"><span>下载源代码
</span></li>
</ul>
<div class="codehilite code_lang_shell highlight"><pre><span></span><span class="nb">cd</span> /root/
wget https://github.com/aria2/aria2/releases/download/release-1.32.0/aria2-1.32.0.tar.gz
tar -zxf aria2-1.32.0.tar.gz -C ./
mv aria2-1.32.0/ aria2/
</pre></div>
<!--block_code_end-->
<ul>
<li class="md_li"><span>configure
</span></li>
</ul>
<div class="codehilite code_lang_shell highlight"><pre><span></span><span class="ch">#!/bin/bash</span>
<span class="c1"># In this configuration, the following dependent libraries are used:</span>
<span class="c1">#</span>
<span class="c1"># * zlib</span>
<span class="c1"># * c-ares</span>
<span class="c1"># * expat</span>
<span class="c1"># * sqlite3</span>
<span class="c1"># * openSSL</span>
<span class="c1"># * libssh2</span>
<span class="c1">## CONFIG ##</span>
<span class="nv">ARCH</span><span class="o">=</span><span class="s2">"unknown"</span>
<span class="nv">HOST</span><span class="o">=</span><span class="s2">"arm-unknown-linux-gnueabi"</span>
<span class="nv">PREFIX</span><span class="o">=</span><span class="s2">"/opt/aria2-arm-unknown"</span>
<span class="nv">LOCAL_DIR</span><span class="o">=</span><span class="s2">"/opt/aria2-arm-unknown/build_libs"</span>
<span class="nv">TOOL_BIN_DIR</span><span class="o">=</span><span class="s2">"/usr/local/</span><span class="nv">$HOST</span><span class="s2">/bin"</span>
<span class="nv">PATH</span><span class="o">=</span><span class="si">${</span><span class="nv">TOOL_BIN_DIR</span><span class="si">}</span>:<span class="nv">$PATH</span>
<span class="nv">CFLAGS</span><span class="o">=</span><span class="s2">"-mhard-float -mfpu=vfpv3"</span>
<span class="nv">DEST</span><span class="o">=</span><span class="s2">"/opt/aria2-arm-unknown/build_libs"</span>
<span class="nv">CC</span><span class="o">=</span><span class="nv">$HOST</span>-gcc
<span class="nv">CXX</span><span class="o">=</span><span class="nv">$HOST</span>-g++
<span class="nv">LDFLAGS</span><span class="o">=</span><span class="s2">"-L</span><span class="nv">$DEST</span><span class="s2">/lib"</span>
<span class="nv">CPPFLAGS</span><span class="o">=</span><span class="s2">"-I</span><span class="nv">$DEST</span><span class="s2">/include"</span>
<span class="nv">CXXFLAGS</span><span class="o">=</span><span class="nv">$CFLAGS</span>
<span class="nv">MAKE</span><span class="o">=</span><span class="s2">"make -j`nproc`"</span>
<span class="nv">CONFIGURE</span><span class="o">=</span><span class="s2">"./configure --prefix=</span><span class="si">${</span><span class="nv">LOCAL_DIR</span><span class="si">}</span><span class="s2"> --host=</span><span class="nv">$HOST</span><span class="s2">"</span>
./configure <span class="se">\</span>
--host<span class="o">=</span><span class="nv">$HOST</span> <span class="se">\</span>
--build<span class="o">=</span><span class="sb">`</span>dpkg-architecture -qDEB_BUILD_GNU_TYPE<span class="sb">`</span> <span class="se">\</span>
--prefix<span class="o">=</span><span class="nv">$PREFIX</span> <span class="se">\</span>
--disable-nls <span class="se">\</span>
--without-gnutls <span class="se">\</span>
--with-openssl <span class="se">\</span>
--without-libxml2 <span class="se">\</span>
--with-libz --with-libz-prefix<span class="o">=</span><span class="si">${</span><span class="nv">LOCAL_DIR</span><span class="si">}</span> <span class="se">\</span>
--with-libexpat --with-libexpat-prefix<span class="o">=</span><span class="si">${</span><span class="nv">LOCAL_DIR</span><span class="si">}</span> <span class="se">\</span>
--with-slite3 --with-sqlite3-prefix<span class="o">=</span><span class="si">${</span><span class="nv">LOCAL_DIR</span><span class="si">}</span> <span class="se">\</span>
--with-libcares --with-libcares-prefix<span class="o">=</span><span class="si">${</span><span class="nv">LOCAL_DIR</span><span class="si">}</span> <span class="se">\</span>
--with-ca-bundle<span class="o">=</span><span class="s1">'/etc/ssl/certs/ca-certificates.crt'</span> <span class="se">\</span>
<span class="nv">LDFLAGS</span><span class="o">=</span><span class="s2">"-L</span><span class="nv">$LOCAL_DIR</span><span class="s2">/lib"</span> <span class="se">\</span>
<span class="nv">PKG_CONFIG_PATH</span><span class="o">=</span><span class="s2">"</span><span class="nv">$LOCAL_DIR</span><span class="s2">/lib/pkgconfig"</span> <span class="se">\</span>
<span class="nv">ARIA2_STATIC</span><span class="o">=</span>yes
</pre></div>
<!--block_code_end-->
<ul>
<li class="md_li"><span>make
</span></li>
</ul>
<div class="codehilite code_lang_shell highlight"><pre><span></span>make -j4 <span class="nv">V</span><span class="o">=</span>s
</pre></div>
<!--block_code_end-->
<ul>
<li class="md_li"><span>链接时遇到一些小问题,库的位置不对,复制下。
</span></li>
</ul>
<div class="codehilite code_lang_shell highlight"><pre><span></span>cp /usr/local/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot/lib/* /usr/local/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/lib/
</pre></div>
<!--block_code_end-->
<ul>
<li class="md_li"><span>install
</span></li>
</ul>
<div class="codehilite code_lang_shell highlight"><pre><span></span>make install
</pre></div>
<!--block_code_end-->
<ul>
<li class="md_li"><span>优化编译出的二进制文件
</span></li>
</ul>
<div class="codehilite code_lang_shell highlight"><pre><span></span>arm-unknown-linux-gnueabi-strip -s /opt/aria2-arm-unknown/bin/armle-unknown-linux-aria2c
</pre></div>
<!--block_code_end--><h3 id="toc_5" class="h16">其他</h3>
<ul>
<li class="md_li"><span>修改 max-connections-per-server 默认值
<ul>
<li class="md_li"><span>自己修改 OptionHandlerFactory.cc 源代码就好
</span></li>
<li class="md_li"><span>具体详见这里 <a class="md_compiled" href="https://github.com/aria2/aria2/issues/580">How can i build aria2c with max-connections-per-server more than 16</a>
</span></li>
</ul>
</span></li>
</ul>