在 Linux Router 上配置 Source-Based Routing 策略(源进源出)

<p>近期从朋友手里嫖了一点带宽,但是上游的网络配置明显禁止了非对称路由,所以按照我们 AS47778 的骨干设计来讲,内网的路由不对称,会导致有些并非来自该上游的来向包被选路到该上游出口。</p> <p>所以,我们接下来基于 nftables 和 iproute2 来配置了 Source-Based Routing,来保证仅有来自该上游的包可以选择该上游进行转发。</p> <h2 id="netfilter-和-nftables">Netfilter 和 nftables </h2><p>Netfilter 是 Linux 内核中的一个用于管理数据包的框架。一切数据包都从 Netfilter 经过,经历如下图所示的周期。在 prerouting、input、output、forward 和 postrouting 阶段,Netfilter 允许 iptables 和 nftables 这样的应用程序对数据包进行控制,这也正是防火墙的基础。</p> <p><img src="/post/bgp-router-with-sbr/Netfilter-packet-flow.png" loading="lazy" alt="Netfilter-packet-flow" ></p> <p>看起来很麻烦吧,所以我们来简化一下。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-plain" data-lang="plain"><span class="line"><span class="cl">(NETIN) -&gt; PREROUTING -&gt; &lt;ROUTING&gt; -&gt; FOWARD -&gt; POSTROUTING -&gt; (NETOUT) </span></span><span class="line"><span class="cl"> | ↑ </span></span><span class="line"><span class="cl"> | &lt;ROUTING&gt; </span></span><span class="line"><span class="cl"> ↓ ↑ </span></span><span class="line"><span class="cl"> INPUT -&gt; [LOCAL] -&gt; OUTPUT </span></span></code></pre></td></tr></table> </div> </div><p>对于到本地的包 A,从 NETIN 进入之后,会通过 <code>PREROUTING</code> 链,到达 ROUTING 进行路由决策,检查到是本机包后进入 <code>INPUT</code> 链,然后被实际的发送给本地的程序。<br> 本地的程序处理后,发送向外部的包 B,从 LOCAL 进入后到达 <code>OUTPUT</code> 链,再次到达 ROUTING 进行路由决策,通过 <code>POSTROUTING</code> 链后最终从 NETOUT 离开本机。</p> <p>对于需要转发的包 C,从 NETIN 进入之后,通过 <code>PREROUINTG</code> 链,到达 ROUTING 进行路由决策,检查到需要转发,进入 <code>FORWARD</code> 链,通过 <code>POSTROUTING</code> 链后最终从 NETOUT 离开本机。</p> <p>对于我们目前的情况而言,我们来分析以下不同包的情况:</p> <ol> <li>去包从该上游进入网络内部,在本节点需要转发到网内的去包:正常转发。</li> <li>去包从该上游进入网络内部,在本节点需要响应回包:回包正常按照选路离开节点或收到回包后源进源出即可。</li> <li>去包从其他节点进入网络内部,在本节点需要继续转发在网内的去包:正常按照选路离开节点即可。</li> <li>去包从其他节点进入网络内部,在本节点需要响应回包:回包不可以从该上游离开网络,需要源进源出。</li> </ol> <p>在 Linux 的网络栈中,我们可以通过向包添加 fwmark (通常是一个 32bit 的无符号证书) 的方式来为数据包添加 tag,通过这个 tag 来在路由决策里将路由导向不同的 NETOUT。</p> <p>同时也存在着一个 conntrack 机制和对应的 conntrack 表,用来追踪整个连接,通常被用于 NAT 环境中方便维护转发关系,我们在这里也会使用用来解决 2 的回包进行源进源出问题。</p> <p>对于我们的场景而言,我们主要需要以上的 2 和 3 两个情况进行源进源出策略。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">#!/usr/sbin/nft -f </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">table inet source_routing { </span></span><span class="line"><span class="cl"> chain prerouting { </span></span><span class="line"><span class="cl"> type filter hook prerouting priority mangle; policy accept; </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> iifname &#34;up1&#34; ct mark set 0x00000001 </span></span><span class="line"><span class="cl"> iifname &#34;node1&#34; ct mark set 0x00000002 </span></span><span class="line"><span class="cl"> iifname &#34;node2&#34; ct mark set 0x00000003 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> ct state {established, related} meta mark set ct mark </span></span><span class="line"><span class="cl"> } </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> chain output { </span></span><span class="line"><span class="cl"> type route hook output priority mangle; policy accept; </span></span><span class="line"><span class="cl"> meta mark set ct mark </span></span><span class="line"><span class="cl"> } </span></span><span class="line"><span class="cl">} </span></span></code></pre></td></tr></table> </div> </div><p>我们在这里创建一个名为 source_routing 的表,同时为 IPv4 和 IPv6 应用 (inet)。</p> <p>在 <code>PREROUTING</code> 链上,为来自不同接口的 packet 的连接打上了 ct mark,用来追踪连接。<br> 对于已经被 ct mark 匹配并追踪的既有连接的包,我们直接将 ct mark 作为 fwmark 的值复制。<br> 通过<code>PREROUTING</code> 链和 conntrack,我们给符合 2 条件的包打上了 fwmark。</p> <p>在 <code>OUTPUT</code> 链上,是本地程序响应的包,符合 4 条件。我们直接 copy ct mark 到 fwmark。</p> <h2 id="iproute2路由分表和策略路由">iproute2、路由分表和策略路由 </h2><p>在 Linux 中,最多可以存在 255 (1-255) 个路由表,系统默认为我们配置 255 (local) / 254 (main) / 253 (default) 三个路由表。</p> <p>local 表中包含本机路由和广播信息,127.0.0.1/8 的路由就来自该路由表,该表的内容由内核主动维护,理论来讲不需要额外的修改。</p> <p>main 表中包含默认配置的路由信息,是默认使用工具添加的表格,正常的 <code>ip route add</code> 就会将路由添加到该表。</p> <p>default 表默认内容为空,可以手动指明向该表写路由。</p> <p>对于我们需求而言,我们需要创造 N 个表(N 即该节点的外联节点+上游个数),并给对应的表添加路由来。</p> <p>在 Linux with iproute2,我们需要在 <code>/etc/iproute2/rt_tables</code> 维护表格配置。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span><span class="lnt">8 </span><span class="lnt">9 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">255 local </span></span><span class="line"><span class="cl">254 main </span></span><span class="line"><span class="cl">253 default </span></span><span class="line"><span class="cl">0 unspec </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"># Following is what we modified. </span></span><span class="line"><span class="cl">100 up1_table </span></span><span class="line"><span class="cl">101 node1_table </span></span><span class="line"><span class="cl">102 node2_table </span></span></code></pre></td></tr></table> </div> </div><p>我们在这里添加了 <code>100</code> <code>101</code> <code>102</code> 三个表,分别 mapping 到 <code>up1_table</code> <code>node1_table</code> <code>node2_table</code> 上。</p> <p>对于我们的要求,可以直接添加 <code>default via $gateway dev $device</code> 到各个路由上。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash </span></span></span><span class="line"><span class="cl"><span class="c1"># policy.sh</span> </span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">src</span><span class="o">=</span><span class="s2">&#34;fe80::2&#34;</span> <span class="c1"># 通过该变量来保证不同 interface 上出包 src 的 IP 一致。</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="nv">IFS</span><span class="o">=</span><span class="s1">&#39;|&#39;</span> <span class="nb">read</span> -r fwmark device table gateway<span class="p">;</span> <span class="k">do</span> </span></span><span class="line"><span class="cl"> <span class="nv">fwmark</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$fwmark</span><span class="s2">&#34;</span> <span class="p">|</span> tr -d <span class="s1">&#39;[:space:]&#39;</span><span class="k">)</span> </span></span><span class="line"><span class="cl"> <span class="nv">device</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$device</span><span class="s2">&#34;</span> <span class="p">|</span> tr -d <span class="s1">&#39;[:space:]&#39;</span><span class="k">)</span> </span></span><span class="line"><span class="cl"> <span class="nv">table</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$table</span><span class="s2">&#34;</span> <span class="p">|</span> tr -d <span class="s1">&#39;[:space:]&#39;</span><span class="k">)</span> </span></span><span class="line"><span class="cl"> <span class="nv">gateway</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$gateway</span><span class="s2">&#34;</span> <span class="p">|</span> tr -d <span class="s1">&#39;[:space:]&#39;</span><span class="k">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> sudo ip route add default via <span class="s2">&#34;</span><span class="nv">$gateway</span><span class="s2">&#34;</span> dev <span class="s2">&#34;</span><span class="nv">$device</span><span class="s2">&#34;</span> src <span class="s2">&#34;</span><span class="nv">$src</span><span class="s2">&#34;</span> table <span class="s2">&#34;</span><span class="nv">$table</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"> sudo ip rule add fwmark <span class="s2">&#34;</span><span class="nv">$fwmark</span><span class="s2">&#34;</span> lookup <span class="s2">&#34;</span><span class="nv">$table</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"><span class="k">done</span> </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-csv" data-lang="csv"><span class="line"><span class="cl"><span class="s"># policy.conf</span><span class="p"> </span></span></span><span class="line"><span class="cl"><span class="s"># fwmark|device|table|gateway</span><span class="p"> </span></span></span><span class="line"><span class="cl"><span class="s">0x1|up1|up1_table|fe80::1</span><span class="p"> </span></span></span><span class="line"><span class="cl"><span class="s">0x2|node1|node1_table|fe80::1</span><span class="p"> </span></span></span><span class="line"><span class="cl"><span class="s">0x3|node2|node2_table|fe80::1</span><span class="p"> </span></span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat policy.conf <span class="p">|</span> sudo policy.sh </span></span></code></pre></td></tr></table> </div> </div><p>通过这个小脚本,我们分别给每个表都按照配置加入了对应的到 gateway 的默认路由,然后配置了包含 fwmark 的包都按照对应的 fwmark 命中到表上。</p> <p>此时对于来自该上游并需要在本地响应的回包:</p> <ol> <li>入包命中 <code>PREROUTING</code> 链,并被打上 ct mark</li> <li>回包进入 <code>OUTPUT</code> 链,将 ct mark 复制到 fwmark 上</li> <li>回包进入 ROUTING 路由决策,匹配 fwmark 到对应的仅默认路由路由表上</li> <li>回包离开本机</li> </ol> <p>以上,我们成功配置了源进源出的网络路由方案,顺带对 fwmark 和 nftables 等有了初步的了解。若要进一步了解 nftables 及其配置, 官方 wiki 是个不错的选择,无论是配置过程中遇到问题还是希望进行更复杂的配置,都能在<a class="link" href="https://wiki.nftables.org/wiki-nftables/index.php/Main_Page" target="_blank" rel="noopener" >官方 wiki</a> 找到详尽的说明。总之,配网愉快~</p>

2026/1/9
阅读更多

随笔

<h2 id="0">0 </h2><p>永定河的枯水期在每年的十二月到次年二月。<br> 至少——所见确实是这样。<br> 一月中旬,从杜家坎大桥一路向东,直到再看不见水的痕迹只需要几秒的时间。</p> <p>倒不如换个说法,<br> 冰点以下的天气也不会出现裸露的水。<br> 冰封的水池、裸露的河床、貌似枯萎了的可怜植物,只有远处低矮的建筑群似乎还在放出些许白烟,不过在透明的蓝色天空下衬得极为不好辨认。</p> <p>不知道该怎么形容冬天时北方的山,只能看到些无端的荒凉和寂寞罢了。<br> 自燕山向北望去,<br> 近处的有些生锈的石化管道,从街道上穿顶而过,<br> 延伸到那北向的烟囱之下。<br> 无尽的白烟,远处的山尖。</p> <p>大概是因为平原长大的孩子没有见过山,<br> 所以才会对此惊讶吧。</p> <h2 id="1">1 </h2><p>有点逐渐迷上了咖啡。<br> 虽然只是加了很多牛奶的拿铁 —— 已经失去了咖啡浓烈的苦味,可能保持清醒的作用也一样被消去了吧。<br> 一口下去可能还有些甜。<br> 在习惯的麻痹之下,已经尝不出来具体的口味了 —— 原本只是作为熬夜时无趣的药剂来调整自己可悲的睡眠时间而已。</p> <p>直到察觉到之后,才发现自己已经开始十一点睡下午两点醒了。<br> 觉得有些可悲。</p> <p>是明明已经熬到清晨,却因为远处大厦的遮挡,看不到的夕阳的悲伤。<br> 想起元旦在天津滨海所看到第一轮太阳升起。<br> 穿的很少,低估了海风的威力。<br> 发现的时候手已经冻麻了。</p> <p>一直等到七点,也没看到太阳实际升起,只有远处的地平线在不断变亮。<br> 甚至有些怀疑是否是大雾遮挡,让我这个远道而来的客人看不到第一次太阳升起。</p> <p>还好,太阳依旧以缓慢的速度升起。<br> 那些美丽鳞粉晕染大地,<br> 以超乎想象的速度向上疾行。</p> <p>大概在七点半才能看到太阳的全貌吧。<br> 海面有些蔚蓝的平静,也转变的有些发红和显出丝许波澜。<br> 可能是强烈的对比之下,才能看出来波浪与否吧。<br> 人已经开始散开了——有些许冷清。</p> <p>回程的路上,我在想——或许我们所追求和奋斗的美好,或许就不曾存在。<br> 人造的鲜花始终盛开,<br> 反倒是大自然无言的美丽,才值得我们驻足停留一刻。</p> <p>但或许,人类就是在这样可能虚构的美好之下才能生存——只有幸福的创作者是没法写出令人感同身受的作品的。</p> <p>在虚构的星空下缝补破碎的月亮,在现实的痛苦之中才能写出那些震颤灵魂的艺术吧。</p> <p>不厌其烦的用三倍的糖浆去麻痹咖啡的苦涩的时候,凌晨三点的月光也只是微微的照在大地上,等待着太阳在地平线下再度升起。</p> <p>等到海风再次拂过面颊的时候,直到刹那的阳光再次震撼到我的时候,</p> <p>就能想起那个童年时坚信&quot;亲眼见证&quot;就能获得祝福的自己了吧。</p> <h2 id="2">2 </h2><p>曾听过这样的话 “坦率,其实是一种暴力”,我觉得这种话是对的。</p> <p>敏感的人会体谅到他人的痛苦,自然就无法轻易的做到坦率。或者说,在事情发生之前的预感就会让他们提前创造了自我的痛苦。</p> <p>所以,那些共情能力弱的人,是在很自私光明的活着。</p> <p>反之来说,做不到坦率的人,或许也在为他人觉得毫不重要的事情而感到痛苦。</p> <p>无可奈何的在以观众的视角去再次经历台本上所预订发生的痛苦,而提不起改变的勇气。</p> <p>这是一件很悲哀的事情。</p>

2025/3/16
阅读更多

Kiss me before I rise

<p>黄昏线前升起的烟花,越过地平线,向上,直到世界尽头。</p> <p>穿过下一个云层,我们终将到达哪里?</p> <p>坠落,亦或是远去。</p> <p>或许一切都不曾得知吧。</p> <p>深橙的有些发暗的天空下,卡布奇诺也已然褪色。</p> <p>就这样就好,一切都好。</p> <p>Until you kiss me before I rise.</p> <blockquote> <p>Kiss me before I rise - chilldspot.</p> <p><audio controls><source src="./kiss-me-before-i-rise.chilldspot.m4a" type="audio/mp4">Your browser does not support the audio element.</audio></p> </blockquote>

2024/12/5
阅读更多

辛德瑞拉。

<p>第一次看到灰姑娘这个故事是在我小的时候,大概是两岁的时候?具体的时间什么的已经忘记了。</p> <p>当时觉得,即使灰姑娘再如何落魄,只要能穿上水晶鞋登上舞会,王子就一定能够找到她的。</p> <p>只要等待就能获得幸福,或许我也是这样的辛德瑞拉吧。</p> <p>于是就带着这样的愿望期待着快点长大,自己也能如辛德瑞拉一样获得幸福。</p> <hr> <p>直到长大了之后进入学校,考试前的复习课上,出神的望着窗外。</p> <p>原来,就算看着蓝天也是一种奢望啊。</p> <p>世界确实是这样的,没法继续产生价值了就要被当成垃圾扔掉。</p> <p>小孩子总是期望着长大,但等到长大了,才发现我们都只是,只有等待没有幸运的辛德瑞拉。</p> <p>看着他人的幸福,像是自己也能把这份幸福偷走一样。</p> <p>原来我也是这样的小偷啊。</p> <p>明明自己已经破损不堪了,也按压不住自己逐渐增强的分享欲。最后发现,原来没有人想听我说话啊。</p> <p>就算一次次落败,也觉得自己绝对不会哭出来的。</p> <p>直到真的有眼泪落到手上,也只会苦笑一声,原来自己也会哭啊。</p> <p>说着想要杀死某些人的话,但实际自己想要杀死的人是自己啊。</p> <p>我大可劝告自己,说什么: 人生的主旋律就是失败和不得志。</p> <p>但,听惯了正拍的人们啊,又怎会接受他们口中不调谐的反拍。</p> <p>我们是东食西宿的大猩猩,既想得到鱼又想得到熊掌,实际比这还要愚蠢,宛若伊索寓言里的傻狐狸,丢掉嘴边的肉去追求虚无缥缈的泡影。</p> <p>所以啊,梦想和希望什么的,不如拿去换成钱,把账单什么的交交就好了。</p> <hr> <p>然后走在路上又一次看到了樱花,风很大,花瓣在空中不断飘落。</p> <p>像是那天的蓝天一样,我看的很出神。</p> <p>就在家的附近,是很常见的东西。</p> <p>突然意识到,原来樱花也可以这么漂亮啊。</p> <p>像是小时那个冬天,落尽了叶子的行道树,透出其后被遮挡的天空,和深绿的让人心慌的叶子相比,显得格外湛蓝。</p> <p>想起来他之前所说的,“如果在八十岁死去的话,就只能看五十多次樱花了,那该多寂寞啊。” 的话。</p> <p>莫名想起 “正是江南好风景,落花时节又逢君”。</p> <p>虽然不是很应景。</p> <p>但是,在生命最后的春天里赏花的心情;在落难时,远离繁华的长安,怀念着过去绚烂的年轻日子的心情;这样的光景里,如此难得的,与故人相遇的幸运。</p> <p>大概也可以算是 “在回忆中救赎今后的人生,在未来中填补过去的遗憾” 了吧。</p> <p>已经很晚了,等我喝杯速溶咖啡接着写。</p> <p>嗯,忘记加糖的咖啡挺苦的,和我的人生一样苦。</p> <p>要是能记得加糖就好了。</p> <p>像是辛德瑞拉那般。</p>

2024/6/21
阅读更多

不断忘记一切的我和接住我的你 —— 「今夜,即使这份爱恋从世上消散」

<blockquote> <p>FYI: 本文大概、应该、可能、似乎涉及严格的剧透,介意的推荐你先甭读了,赶快去电影院买票看看。</p> </blockquote> <h3 id="序">序 </h3><p>作为一名拿批,第一次了解到这部电影是在 22 年七月 Yorushika 为此所做的商曲 「左右盲」 发布。</p> <p>拿不拿说:<code>将 「逐渐遗忘对方的相貌与举止」 比作为左右盲,写下了这首歌。歌词的主题取自奥斯卡·王尔德的 「幸福王子」。</code></p> <p>左右盲,也就是左右不分的症状。记忆因此变得朦胧、而渐渐记不清与对方有关的事情,就连对方是左手还是右手拿着小说都不再真切。</p> <p>那时候的你,也是这样对我说着,感叹着 “喜欢上 Yorushika 真是太好了”。</p> <p>还在讨论着 “电影有没有可能引进内地” 之类的事情。</p> <p>22 年末的疫情可真是令人难熬,就算处境再糟糕,你也挺下来了。</p> <p>寒冬终会过去,春天也会到来。我这样坚信着。</p> <p>“如果在八十岁死去的话,就只能看五十多次樱花了,那该多寂寞啊。” 可惜你连这样寂寞的离别也没有等到,就和樱花一起匆匆离去了。</p> <p>如今吹散繁花的这阵风暴,就如同偷走春天的小偷。</p> <p>你大概也是被偷走春天的小偷一起带走了吧。</p> <p>春意尚在,樱飞漫天。</p> <p>今年世恋可在国内上映了,只可惜你看不到了。</p> <p>……</p> <p>牡丹落尽亦是花,夏去秋来思愈切。</p> <h2 id="玻璃球样的美好简单而易碎">玻璃球样的美好,简单而易碎 </h2><p>为了救下孩子因而在交通事故中患上前向性失忆症的日野真织(我们以下简单说真织),一旦入睡便会忘记当天的所有事情,只能通过阅读前一天所做的笔记来了解一切。</p> <p>关于失忆症的事情,在学校里,只有闺蜜小泉和老师知道。</p> <p>神谷透(下称透)的朋友下川,总是被学校的小混混欺负。为了帮朋友摆脱困境,透卷进了这场校园霸凌。</p> <p>但解决的方法却是向这个学校里最受欢迎的女孩真织表白。</p> <p>毫不相识的两个人,表白的结局想当然肯定是被当众拒绝,被录下来的话,一定会在大众面前出丑的。</p> <p>但,透为了朋友,还是选择了去表白,但死板得像是要完成一场比赛,带着他那一眼贯穿的不情愿。</p> <p>透本以为会被拒绝,没想到真织竟然接受了,并提出了三个条件。</p> <p>第一,放学前互相不能说话;第二,联络要简洁;第三,不可以真的喜欢上对方。</p> <p>她需要时间阅读前些日子的日记理清状况;她希望避免讨论昨天的事情;她认为对于只能保持一天记忆的自己来说,是不配拥有这样的爱的。</p> <hr> <p>他们的关系虽然建立在谎言之上,但透逐渐被真织所吸引。</p> <p>妈妈因为心脏病离世、姐姐离开家只为写作、父亲因母亲的离世而变得颓废,透一个人肩负起了整个家。 淡漠的、疲倦的、一眼望不到头的透,为逃避现实而躲进文学里。 喜欢上了姐姐所做的小说的他,却在认识真织后慢慢露出了笑容。</p> <p>在意外知道真织患有失忆症后,他请求她不要把今天的事写到日记里。</p> <blockquote> <p><p>不写到日记里,就不会被记得,我们一起瞒着明天的你吧。</p> <p>我也会让明天的你过的很开心。</p> </p><span class="cite"><span>― </span><cite>今夜,即使这份爱恋从世上消散</cite></span></blockquote> <p>虽然只能活在文字之中。<br> 即使每天自己都不会被记住,也只是恳求她能在每天醒来的时候,能快乐面对生活。</p> <p>真织在与透相处时也感到了 “幸福”,并在每天阅读日记时逐渐意识到自己正真心地喜欢上透。</p> <p>人们都是这样,通过相遇、相识、积攒回忆,慢慢地喜欢上对方。但对真织来说,每天和透的相遇都是第一次,都是初次的喜欢。</p> <p>野餐、水族馆的约会,又或者是像两支冰淇淋掉了一只这样的小事。温暖的阳光、透明的空气,又或者是美好的一切,她都全然不知。</p> <p>日久生情的过程,自然躲不开闺蜜小泉的加入。毕竟小泉不仅是二人情感的催化剂,也是日野的保护者。</p> <hr> <p>就算失去了记忆,但内心深处对一个人的喜欢又怎会消失殆尽。每次相遇,对透的喜欢似乎都在她心中变得更加强烈。</p> <p>在烟火大会上,真织握住透的手,烟花绽放的那一刹。</p> <p>即使这一刻掌心的温暖也会被一同忘记,但鼓起勇气的少女,又怎会畏惧这些。</p> <blockquote> <p><p>真织: 可以打破第三个条件吗?</p> <p>透: 我早就打破了。</p> </p><span class="cite"><span>― </span><cite>今夜,即使这份爱恋从世上消散</cite></span></blockquote> <p>相互喜欢的二人终究相拥在一起,跨越记忆和时间,深情的一吻总会战胜一切的阻碍,也让少女知道了,自己也是配拥有这样的爱的。</p> <p>回到了家,少女写下纸条 “不要忘记神谷透”,贴在了告示自己每天早上要去阅读日记的告知之后。</p> <hr> <p>真织自小的时候便喜欢上了美术,心里有着考入美术类大学的愿望,但是因为失忆症却总之是想想而已。</p> <p>透告诉她,就算记忆不见了,身体还会记得某些动作,这叫作“程序性记忆”。他说只要坚持画画,技术肯定会提升。受到这番话的鼓励,真织以透为模特,画下了一幅又一幅画作。</p> <p>即使忘记了透的一切,真织看着画本上透的画像,就开始画起来。她画出来的透那么逼真,彷佛在告诉人们,透仍然存在于真织记忆深处的某个角落。</p> <p>透的姐姐赢得芥川奖,在家庭的会议上,父亲也决定不再颓废,努力去生活。</p> <p>二人生活的一切都在向好,可是,如同烟火之绚丽和短暂,纯挚的爱情永远也只能收获刹那间的绽放。</p> <hr> <p>回家的路途上,小泉半开玩笑打趣般的向透表白,透却告知:“家族可能遗传心脏病,如果自己离开了的话,请帮我把真织的记忆消去”。</p> <p>殊不知,这样的相见却是最后一次。</p> <p>透在第二天,就因为心脏问题,突发离世了。</p> <p>神谷透去世,但是作为日野的保护者,小泉还有更多事情要做。</p> <p>再三思考下,小泉带着真织参加了透的葬礼。</p> <p>真织觉得自己的人生仿佛崩塌,只剩废墟,变得精神失常。</p> <p>觉得抹掉真织记忆很残忍的小泉,最后也决定与作家姐姐合谋,篡改了真织的日记,日记中再也不会存在 “神谷透” 这样一个人。</p> <p>在小泉摘下告知真织早上要去阅读日记的告示之后,她看见了少女当时所写下的 “不要忘记神谷透” 的纸条,痛哭流泪。</p> <hr> <p>纸包不住火,万密总有一疏。为了美术训练而完成的素描练习全部还保存着,以至于真织不断发问,这是哪里的模特?</p> <p>最终,小泉无法承载如此沉重的秘密,终于向真织坦白了一切。而真织在经历崩溃之后,也接纳了这样的现实。</p> <p>更重要的是,她的失忆症也逐渐康复。她开始想起过往的种种经历和细节。</p> <p>故事的最后,真织带着信心去选择走上美术道路考取大学,带着透的希望继续活下去。</p> <blockquote> <p>今夜,就算这份爱恋从世界上消失,我也会用心将你勾勒成画。</p><span class="cite"><span>― </span><cite>今夜,即使这份爱恋从世上消散</cite></span></blockquote> <p>电影最后结束于主题曲 「左右盲」 之中。</p> <iframe frameborder="no" border="0" marginwidth="0" marginheight="0" src="https://music.163.com/outchain/player?type=2&id=1966766526&auto=0&height=66"></iframe> <h2 id="不断忘记一切的我和接住我的你">不断忘记一切的我和接住我的你 </h2><p>原作作者一条岬在后记中如此说: <code>这是一个悲伤的故事,但绝不是悲剧。</code></p> <p>这样套用失忆症的故事或许我们见了很多,觉得落了俗套。但是当一切事物继续发展,铺垫一个个被回收,在如此细腻而真实的描写下,俗套给我们的低预期却成了故事最大的出彩之处。</p> <p>说好不会爱上的开始,谁都料到一定会相爱的结局。不用考虑太多世俗,没有太多生活的鸡零狗碎,他们就像一个童话故事一样美好。</p> <hr> <p>回看故事,带给我们一个非常核心的问题:</p> <p>就算爱很短暂,甚至可以一眼就能望到头,我们该如何面对它?</p> <p>面对这个问题,不同人当然有不同的答案。</p> <p>而故事却用真织和透的故事告诉我们:</p> <blockquote> <p>纵使记忆在闭眼后就会变得不见,我也曾真挚而真诚的喜欢过你。 如果永远很远的话,那今夜就是永远。</p> </blockquote> <p>尽管真织在每天苏醒之后只得阅读昨天的日记来了解一切,父母不厌其烦一次次的说着 “救下孩子的你是我们的骄傲”,在生活的绝望之下,是透一次又一次接住了不断失去记忆的少女。</p> <p>恋爱中的少男和少女眼里像是闪着亮光。</p> <p>透逝去之后,即使真织记忆中不存在他的身影,但 “被爱的感觉”,已然成为她的 “程序性记忆”。也会在葬礼上为 “熟悉的陌生人” 而泪流不止。</p> <p>“死亡不是生命的终点,遗忘才是”,而透却在死前说出 “请帮我消去真织的记忆”,为的只是一句简单的承诺:</p> <p>我也会让明天的你过的很开心。</p> <p>当姐姐一下下消去真织笔记中的透的时候,像是在抹去透在世上最后的痕迹。</p> <p>值得慰藉的是,故事的最后,真织的失忆症得到好转,所有人都会一点一点忘记透,只有真织会接住透,再一点一滴的找到他,即使无法回想起来。</p> <p>死去的透仍存于真织的笔下,即便不是永远。</p> <hr> <p>而原作中的两个人:闺蜜小泉 和 透的父亲神谷幸彦 相较于男女主更带着一丝悲剧色彩。</p> <p>闺蜜小泉和透的初次相见是在透一开始被迫表白之后。</p> <p>小泉在小的时候父母就离婚,大概是因为此根本不相信相守到老的爱情。</p> <p>作为唯一在学校中知道真织患有失忆症的人,小泉原以为透和其他不怀好意的人一样,准备以保护者的身份保护真织的时候,才发现二人或许真的是互相喜欢吧。</p> <p>可惜自己貌似也慢慢喜欢上了透,或许是因为有着共同喜欢的作家,又或者只是一个 <code>亚撒西</code> 而已。</p> <p>男女主开心在一起时也给了小泉很多落寞的镜头。</p> <p>准备打趣样说出心意就放下一切的小泉,即便是打算装作开玩笑也勇敢的说出那句 “我喜欢你” 之后,在听到透的死讯之后是怎么想的呢?</p> <p>明明知道最好的两个朋友之间互相喜欢,但是自己奇怪的情感也无处可放,以 ‘真织的好朋友’ 的身份来侵入到透和真织的恋情之中,好像有些自私。</p> <p>也打算成人之美,但透却一句话都没有留下就离开了自己和真织。</p> <p>于最绚烂之时看到零落之后的悲凉的人,只有小泉啊。</p> <p>喜欢的人去世,最好的朋友因为透的去世也一蹶不振,即便是这样也要试图挤出笑容的人,是小泉啊。</p> <p>透的父亲神谷幸彦在遇到妻子之后,不止一次提起自己 “想成为小说家” 的梦想。</p> <p>自己所写的小说却一次次没有受到其他人的认可,但温柔的妻子在读完之后总是说:“写得很好呢”。</p> <p>在妻子意外离世后就一蹶不振,整日酗酒,甚至用空白纸假装自己的小说获奖以此麻痹自己。</p> <p>或许对于父亲来讲的话,人生的全部书写的就是妻子吧。</p> <p>妻子死去之后,也没有再去写下去小说的动力了。</p> <p>看到这里,突然想起来 Yorushika 的 「盗作」。</p> <p>透喜欢真织身上那种每天面对困难还乐观的坚强,和父亲的消极对待形成了对比。</p> <p>或许父亲和妻子就是另一个平行世界的真织和透吧。</p> <p>或许因为于此,透才说出 “请务必要把我从真织的日记中删去”。</p> <p>正因为自己感受过至亲之人的离开,才不愿意让真织知道自己也在她的人生绽放过。</p> <p>互相喜欢的人,无论经过怎样的苦难,总会互相拥抱的。</p> <hr> <p>所以,就算爱很短暂,甚至可以一眼就能望到头,我们该如何面对呢?</p> <p>人世间的一切一切都会随着时间发生来或去的变化,人们可以承认自己无力应对,也可以选择接受并认真珍惜当下的所有。</p> <p>“明天的烦恼,明天再烦。” 就算美好只会停留在这一刹,也一定要有勇气去抓住它啊。</p> <p>万物流逝,有些东西总不会褪色,<br> 尽管我会忘记你的容颜,忘记你的声音,<br> 今夜,就算这份爱恋从世界上消失,我也会用心将你勾勒成画。</p> <p>以上,</p> <p>于 2024 年 6 月 2 日深夜。</p>

2024/6/2
阅读更多

パレード (Parade 游行)—— 请不要忘记我孤身一人的盛装游行。

<blockquote> <p><p>このまま夜が明けたら,<br> 若就这样迎来黎明,</p> <p>乾かないように想い出を,<br> 为了不让这份回忆淡去,</p> <p>失くさないようにこの歌を,<br> 为了不让这首歌荡然无遗,</p> <p>忘れないで もうちょっとだけでいい,<br> 请你不要忘记 再铭记一小会儿就可以,</p> <p>一人ぼっちのパレードを,<br> 请不要忘记我独身一人的游行。</p> </p><span class="cite"><span>― </span><span>Yorushika (n-buna &amp; suis), </span><cite>パレード</cite></span></blockquote> <p>「パレード」一词来源自英语中的 Parade,但和英语中的 Parade 带有反抗的游行一意所不同的是,日语中的パレード一词是更加娱乐化的,就像迪士尼乐园中的游行一样,美好的,盛大的,快乐的东西。</p> <p>而在 Yorushika 的专辑「だから僕は音楽を辞めた (所以我放弃了音乐)」之下,如此盛大的游行,却是通往死亡的道路。</p> <p>我们常去描写死亡的结果,死亡的原因,却缺少人去描写这美丽而盛大的凋亡。</p> <p>如果死亡是必然的话,那一定要让这过程显得华丽一点吧。</p> <p>游行嘛,本身是更多人胸怀共同的志向,有了想法才会去干的事情,如此这样,孤身一人的游行才更显得可贵。</p> <p>有人说 「间奏的小提琴一出,就满是灿烂的悲伤了」,相较于悲伤本身,我更愿意说,小提琴相较于悲伤,更应该是灿烂。毕竟,灿烂的事物变得凋亡更令人心碎啊。</p> <p>纵使心中有万马奔腾,蓦然回首,却还只是孑然一身。<br> 正因有这这样灿烂的回忆,如今的人生才显得如此不堪入目。<br> 有着如此回忆的我,又怎能忘掉这些。<br> 与生活的抗争显得无力而可悲。<br> 嘴上说着想死的人,其实内心只是想被爱而已。</p> <p>即便是这份没有你在的孤独啊,也化作写在纸上抹不去的回忆,化作绝不会遗失的回忆的歌。<br> 就算持续着如此样的游行,也依然无力改变什么,只望你能记住我。</p> <hr> <p>n-buna 在 「だから僕は音楽を辞めた」一专的特典信纸上关于 「你的笔尖一定寄居着神明大人」这样说:</p> <p>每个创作者都是受到神明所眷顾的,笔下的一切都是有着神明的力量。</p> <p>作者本身不是神明,作品本身才是神明所在。</p> <p>开始专辑的时候,Amy 的人生还有一年,当他写下 「パレード」的时候,生命只剩下那一小段时间了。</p> <p>当然,我们可以说 Amy 的死是必然的结局,是 n-buna 心中的另一个自己为了作品的献身,也就是所谓的 「艺术至上主义」。</p> <p>那,该如何去面对死亡呢?</p> <p>不同的人或许会有不同的答案吧。</p> <p>有的人会写出那些玩世不恭,仇恨世界给了自己悲惨命运的句子。</p> <p>而在「パレード」中,选择死亡如同人去选择呼吸一样自然,带着宗教一样的宿命感,我们当然可以简单的归于「艺术至上主义」,但是回看歌曲本身,Amy 选择死亡一定是经过深思熟虑的,一遍遍在脑中预演着,算尽了一切的可能,才会有着如此般的执念。</p> <p>如同在「八月、某、月明かり」中一样,如果不是没有解决的办法,谁会愿意去选择死亡。</p> <p>于是 Amy 选择在孤身一人的旅途中寻找离天堂最近的地方,写下书信,喝下花绿青,跳海自尽,更显着悲壮和坚定,更有对生命不幸的妥协。</p> <p>宿命或许终究还是击败了他,写下的诗歌是他留在这世上最后的印证了。</p> <p>如此宏大的、孑然一人的游行下,死亡的道路和死亡本身也显得没有那么恐怖了,Amy 像是看到了死亡的美丽。</p> <p>再等一下就好,</p> <p>请让我继续这孤身一人的盛装游行。<br> 请不要忘记我孤身一人的盛装游行。</p> <p>以上,<br> 2024 年 5 月 27 日。</p>

2024/5/27
阅读更多

白鸟过河滩

<blockquote> <p>时代流逝,再无返还。<br> 把万物都交给时间吧。<br> 随风带走,愿在梦中与之相见。</p> </blockquote> <iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="https://music.163.com/outchain/player?type=2&id=2115520005&auto=0&height=66"></iframe> <p>突然发现,网易云上上架了白鸟过河滩,半夜给自己听破防了。</p> <p>逐渐意识到自己已经不再惧怕他人的羞辱、现状的痛苦。</p> <p>平静、理性、稳定只不过是经历带给我自己的保护而已。</p> <p>活下去的动力可能也不复存在了。</p> <p>我试图坚信着,说服着自己,只要能够死掉的话,就能回到一个乌托邦一样的世界,没有什么痛苦和沮丧,只有自己喜爱的人在这里,他们会接我回家。</p> <p>我以为说服了自己,以为只要怎么怎么做就能更坚强、更勇敢,但当再次听到这首歌的时候,还是会再次流泪,不敢哭出声,害怕让他人听见啊。</p> <p>已经不再能有 “这翅膀三千丈,扇一扇摘月亮” 一般的豪情壮志。</p> <p>感觉两年前初次听白鸟过河滩的自己或许还没有清楚吧,觉得自己似乎像是白鸟一样,张开翅膀就能逆风前行,越过山海一般。</p> <p>殊不知,只有懦弱而平凡的人才能创造出如此的白鸟。</p> <p>比得不到更糟糕的,应该是:我们本可以做到吧。</p> <p>我当然清楚每次去后悔、去感伤这些是无意义且浪费时间的,但是眼泪却会真真实实的流下来啊。</p> <p>曾欲与天工试比高的少年,也在一次又一次的尝试中折了翅膀。</p> <p>或许也曾经试过去追、去够,却一次次做不到和电视剧中的主人公一样有着皆大欢喜的结局,梦想好像一轮新月,或有或无罢了。</p> <p>可能我们根本不是主人公,没有着什么 ‘主角光环’,一次次的努力甚至比不上他人的偶然而已。</p> <p>若不是人生太糟糕,谁又会将希望寄托于他人亦或虚无的事情之上。</p> <p>白鸟飞过山与河,而我却只能顺流入大海之中了。</p> <p>也会下定决心去做些什么,却总是会不断地放弃,告诉自己:只要什么都不做就会好起来的吧。</p> <p>可总是事与愿违。</p> <p>反正,理想什么的已经做不到了,就去放弃那些无法抓住的、虚无的事情吧。</p> <p>任由生活如流水一般涌入大海,或许心中依然有着白鸟憧憬远方,但是应该已经 “一去不复返” 了,也不再希望能复返了。</p> <p>也根本不必再去在乎些未来什么的,或者说,应该已经说服自己不必去关心些未来什么的。</p> <p>丧家之犬并不需要什么安可,落幕之后就是结束,再一次走下去也会是输。</p> <p>像是在和自己的一部分告别一样。</p> <p>只是理想的挽诗而已。</p> <p>从此往后,我再也等不回它。</p> <p>随风带走,愿在梦中再相见。</p> <p>以上,</p> <p>2024 年 5 月 12 日。</p>

2024/5/12
阅读更多

Shut Up and Take My Card - 奇特的大陆银行卡外刷小 Tips

<blockquote> <p> <picture> <source srcset="/post/shut-up-and-take-my-card/Suicard_hu_383a57c96b1b0ac9.webp" type="image/webp"> <source srcset="/post/shut-up-and-take-my-card/Suicard.png"> <img src="/post/shut-up-and-take-my-card/Suicard.png" width="2128" height="1342" srcset="/post/shut-up-and-take-my-card/Suicard_hu_bbcdd626ef653fe4.png 480w, /post/shut-up-and-take-my-card/Suicard_hu_3eaa89e8f0c7ccf0.png 1024w" loading="lazy" alt="Suicard" class="gallery-image" data-flex-grow="158" data-flex-basis="380px" isWebp="true" > </picture></p> </blockquote> <p>如你所见,这是一篇对大陆银行外刷的情况的简单介绍。<br> 顺带介绍一些奇奇怪怪但是莫名在境外很好用的借记卡。</p> <h2 id="于是你登上了前往日本的飞机">于是,你登上了前往日本的飞机 </h2><p>然后发现只带了工商银行的银联复合借记卡,还把所有的出行资金在工商银行系统购买了日元现汇。</p> <p>全剧终。</p> <blockquote> <p>中国工商银行作为你国最大的银行 (同时也应该是最抠门的),新发行的银联复合借记卡,均是纯芯片卡(磁条未写)。<br> 在日本和东南亚等国家,ATM 尚未支持纯芯片卡,就会无法取款。 工商银行的银联借记卡不支持外币原币种入账,只能扣人民币户口。</p> <p>经验与教训:永远不要相信卡组织,尤其是银联宣称自己在海外的网络有多发达,无论如何也要备好现金,或者一张确认可以提款的银行卡。</p> </blockquote> <p>所以,言归正传,现在让我们简单提及一些概念。</p> <h3 id="现钞与现汇">现钞与现汇 </h3><p>顾名思义,现钞就是钞票,cash,也就是现金账户。<br> 现汇也一样,remit,为以外币表示的各种支付凭证。</p> <p>对于大陆银行,现汇/现钞是你在涉及外汇业务时必须清楚的两个点,我们简单展开说一下。</p> <table> <thead> <tr> <th>功能</th> <th>现钞</th> <th>现汇</th> </tr> </thead> <tbody> <tr> <td>大陆银行柜面取/存款</td> <td>✅</td> <td>❎</td> </tr> <tr> <td>大陆银行汇出到海外</td> <td>❎</td> <td>✅</td> </tr> <tr> <td>外币信用卡使用外币还款</td> <td>大部分银行可以使用现钞</td> <td>大部分银行不允许使用现汇</td> </tr> <tr> <td>海外银行汇入</td> <td>❎</td> <td>✅</td> </tr> <tr> <td>人民币购汇价格</td> <td>较高(对小币种)</td> <td>较低 (对小币种)</td> </tr> <tr> <td>人民币结汇价格</td> <td>较低</td> <td>较高</td> </tr> <tr> <td>持卡是否能在海外以原币种提款/消费</td> <td>取决于银行,绝大部分不支持</td> <td>取决于银行,绝大部分不支持</td> </tr> <tr> <td>是否可在境内银行跨行划转</td> <td>❎</td> <td>✅</td> </tr> </tbody> </table> <p>对于绝大部分银行,在现钞和现汇之间转化会收取一定的钞汇互转费,有一些银行不存在该费用(如:厦门国际银行)。</p> <p>对于绝大部分银行的核心系统来讲,对于外币而言,现钞和现汇是区分的,也存在一些银行系统内并不存在现钞现汇概念,即同时具有钞和汇的性质,也就是钞汇合一。<br> 对于大陆银行而言,所有人民币账户都是钞汇合一账户。</p> <h3 id="提款结售汇与外汇管制">提款,结售汇与外汇管制 </h3><p>众所周知,大陆存在外管局,于是就有了外汇管制。</p> <p>作为一名中国大陆公民,你应该知道:</p> <ol> <li>在每个自然年,你可以持身份证或其他有效证件(如未成年使用户口本),以便利化(无须提交实际证明材料)的形式,在各大银行购买 50000 USD 等额人民币的外汇。</li> <li>在每个自然年,你可以持有效身份证件,以便利化形式售出 50000 USD 等额的外汇。</li> <li>在每个自然年,你可以银行卡,在海外每日提款 10000 CNY 等额外币,每年可提款 100000 CNY 等额外币,本人名下所有银行卡均共享该额度。</li> <li>每次出境时,携带外币现钞总金额在等值 5000 美元以上,须到银行开具《外币携带证》。</li> </ol> <p>对于结售汇的便利化额度,如果超过额度,银行会直接拒绝你的结售汇请求。</p> <p>当然,如果你有合理的材料,是可以超过便利化额度的(需要提交到外管局审核),每年购买超过 50000 USD 的外汇的,但是对于只是出国旅游的你和我而言,这个显然是不可能的。</p> <p>而银行卡提款这条比较麻烦,一般是在外管局和银行的日切时间才会更新,如果当年超过了 100000 CNY 限额,会导致当年和次年的取款额度被禁止使用,你就无法持卡在海外提款了。</p> <p>所以,以下这些形式都会耗费你的便利化/提款额度:</p> <ol> <li>在国内银行 App 渠道购买 100 USD 现汇 (便利化购汇额度 -100 USD)</li> <li>持国内银行发行的人民币单币卡,以卡组织汇率扣除卡内人民币账户在美国取现 100 USD (取现额度 -100 USD)</li> <li>持国内银行发行的外币信用卡,在海外消费完手动以外币购汇形式还款 (便利化购汇额度&ndash;)</li> <li>在国内银行电子渠道购买 100 USD 现汇,并转入国内银行发行的外币借记卡,在海外 ATM 提款 100 USD (便利化购汇和取现额度双双扣除 100 USD)</li> </ol> <p>以下的形式不会耗费你的便利化/提款额度:</p> <ol> <li>持国内银行发行的人民币单币卡,以卡组织汇率在海外商户的 POS 消费外币</li> <li>持国内银行发行的外币信用卡,在海外消费完直接银行转人民币出账单还款</li> <li>用微信/支付宝在海外商户消费</li> </ol> <p>所以,对于任何海外商户,我们优先选择刷卡的形式进行消费,如果实在不能刷卡,才推荐使用现金的方式进行支付。</p> <h3 id="一卡一户一卡多户无卡有户">一卡一户、一卡多户、无卡有户 </h3><p>中国大陆和海外银行户口最大的差别大概就在这里。</p> <p>在中国大陆,往往在开户的时候银行会给你一个卡,我们这里称呼他为凭证。<br> 存折、银行卡都是凭证的一种。</p> <p>对于银行而言,凭证并非是账户,而是一个到 link 到账户的钥匙。</p> <p>在中国大陆,银行卡和账户基本遵守一卡一户(也存在多卡一户)的对应情况。 同时,银联作为大陆银行的行间网络之一,也为每个银行发行的银联卡分配了一个唯一的 BIN 标识符(银行卡号前 6-8 位)。</p> <p>于是,你的银行卡号(也就是凭证号),就可以作为账户号在银行系统中成为账户的标识符。</p> <p>人行的支付系统里也通过银行卡号的 BIN 码来确认你的账户开户行是哪个银行。</p> <p>在绝大部分大陆银行的系统(专业一点讲叫接入人行二代支付系统的核心记账)里,银行卡号和账户号都可以作为转入账号使用。 当然,银行也并没有取消账户号的概念,在工商银行的手机银行里,你可以看到一个基本账户号,这个就是账户号。</p> <p>中国银行的个人银行基本账户号为 12 位。</p> <p>在海外的银行,由于不存在银联这样的行间网络,同时也不一定遵守一卡一户的原则。 一般卡号是不能够作为账户号使用的。</p> <blockquote> <p>当然,也存在卡组织的转账网络,例如 Visa Direct,暂不在这篇文章的讨论范围中。</p> </blockquote> <h3 id="无卡支付微信和支付宝">无卡支付、微信和支付宝 </h3><h4 id="微信和支付宝的海外消费">微信和支付宝的海外消费 </h4><p>当然,在境内消费有微信和支付宝,在海外依然也有微信和支付宝,多在旅游景点/商圈出现。</p> <p>微信和支付宝是典型大陆第三方电子钱包,我们在这里统一称为非银第三方支付机构。</p> <p>非银第三方支付机构通过网联清算直连二代支付系统,无卡交易一般的模型是这样的:</p> <ol> <li>非银支付机构连接网联清算,通过银行和非银支付机构签约的快捷支付协议,请求银行打款</li> <li>网联清算请求银行打款</li> <li>银行以你账户的名义,向非银支付机构在人行/人行指定的商业银行的备付金账户进行打款</li> <li>完成交易</li> </ol> <p>所以我们可以看到,实际上完成交易的不是卡组织,而是银行账户。</p> <p>某些银行的账户,即使凭证不是卡,依然可以绑定快捷支付。 如建设银行的结算类型存折。</p> <p>所以在海外,微信/支付宝这类机构都是通过自己的汇率,将外币账单转入人民币,并通过网联清算收款的。</p> <p>贯彻朴素的价值观,我推荐在支付前查询汇率,哪个汇率低用哪个。</p> <h4 id="无卡支付和-3ds">无卡支付和 3DS </h4><p>3DS 全称 3-D Secure。</p> <p>为了保证信用卡和借记卡在线无卡支付时的安全性,部分商家和收单平台和发卡银行会要求进行 3DS 验证,而这个特性需要银行和卡组织进行支持,主要通过短信验证码、手机 App 授权、邮箱验证码等方式实现身份验证。</p> <p>如果银行不支持 3DS 或者用户没能通过 3DS 验证,交易将会失败。</p> <p>对于大陆发行的银联卡,3DS 是由银联进行进行验证的,基本所有银行的银联卡都支持 3DS。</p> <p>所以,如果在海外进行消费,是否支持 3DS 是非常重要的一点。</p> <p>如果没有完成 3DS 验证,如果发生盗刷,盗刷的资金将由收单平台和商家承担。<br> 如果通过了 3DS 验证,如果发生盗刷,资金将由发卡银行进行偿付。<br> 我们把这个过程称为责任转移。</p> <h4 id="大陆银联的无卡消费">大陆银联的无卡消费 </h4><p>银联在海外也有无卡消费情况,一般出现在你在海外网购东西时。</p> <p>例如某知名支付网关 Stripe 就支持银联的无卡交易。</p> <p>大陆银联的借记卡无卡交易时,不校验你输入的 CVV 和有效期,强制跳转到银联在线支付网关(无需银行发起适配,由银联负责,大陆所有银联借记卡全部支持),也就是银联风格的 3DS 实现,由银联短信到你在银行预留的手机号来完成验证。</p> <p>大陆银联的信用卡无卡交易时,由商家/收单平台/发卡行三方决定是否跳转到 3DS 完成验证。</p> <h3 id="外币支付和单双标卡">外币支付和单双标卡 </h3><h4 id="外币转换手续费-ftf-和动态货币转换-dcc">外币转换手续费 FTF 和动态货币转换 DCC </h4><p>银行和卡组织作为商业组织,当涉及到记账货币和账户实际货币不同存在转换时,一般会对持卡人收取一定的转换手续费,称为 FTF (即 Foreign Transaction Fee)。</p> <blockquote> <p>Notice:<br> 对于 FTF 的收取情形,不同的银行存在不同的看法。 大陆银行一般认为:发生的非卡基准货币计价的交易,均符合 FTF 收取情况。 某些银行仍会在海外进行卡基准货币交易时,扣取 FTF。 如此进行操作的银行例如 ZA Bank,在港外进行以 HKD 计价的交易时,仍会收取 FTF。</p> </blockquote> <p>国内发行的银联卡基本免除 FTF 费用。 双标卡可能存在 FTF 费用。 外币单标卡一般免除 FTF 费用。</p> <hr> <p>DCC 是指 Dynamic Currency Conversion,即动态货币转换。是由商户收单平台收取的费用。</p> <p>目前 Visa 和 MasterCard 认可 DCC 并允许该操作,其他卡组织(银联、美国运通)禁止 DCC。</p> <p>DCC 的原理是,在商户使用当地货币计价时,由商户的收单平台提供货币转换服务,将当地货币的计价转换为持卡人的卡使用的基准货币进行计价。</p> <p>信用卡的消费并不是实时入账的,实际对于本币的消费金额只有等到入账才能看到,如果货币的汇率波动特别大,就会存在汇率风险,DCC 服务就将这个汇率风险转嫁给了提供 DCC 的服务的平台,平台也会收取一定量的 DCC 手续费来 cover 汇率风险,一般为 2.5% ~ 8%。</p> <p>正常情况下一个成熟的货币汇率是不会有很大的波动的,所以一般而言 DCC 就成了商家和第三方公司的敛财工具。</p> <hr> <p>我们来简单比较一下持大陆银行 Visa 美元信用卡在以 HKD 计价的商户进行消费的情况。</p> <ul> <li>我们不选择 DCC <ol> <li>商家以 HKD 计价,向卡组织请 HKD 款项</li> <li>Visa 将 HKD 款项转换为 USD,计入信用卡账户,期间会收取 FTF 费用</li> <li>你以美元或者由银行转换为人民币出账后以人民币还款</li> </ol> </li> <li>我们选择 DCC <ol> <li>商家以 HKD 计价,由收单平台将费用转换为 USD,向卡组织请 USD 款项</li> <li>Visa 直接将 USD 款项计入卡组织账</li> <li>收单平台按照约定汇率(高于你 DCC 的实际汇率)将 HKD 款项打回给商户</li> <li>你以美元或者由银行转换为人民币出账后以人民币还款</li> </ol> </li> </ul> <p>正常情况下货币转换是在卡组织发生的,而有 DCC 的交易中,货币转换是发生在 DCC 环节。</p> <p>DCC 的交易过程,商家是有利率优惠的(收单平台会以高于 DCC 的实际汇率给商户结款),所以 DCC 是对商家有利益的,因此境外商家都会推广 DCC。</p> <p>所以,我们优先选择以商户实际标价币种结算,一般是可以得到最好的汇率情况的。</p> <h4 id="人民币借记卡和原币支付">人民币借记卡和原币支付 </h4><p>在中国大陆,目前由人行要求,所有绑定人民币个人结算账户的借记卡,必须是由颁发人民币清算牌照的卡组织完成。目前这个卡组织只有银联和杭州连通(也就是美国运通在华的合资公司)还有<del>尚未实际</del>目前已经发卡了的万事网联(万事达 MasterCard 和网联清算的合资公司)持有。</p> <p>于是,目前国内发行的人民币借记卡均为人民币为基准货币的银联/美运人民币借记卡。</p> <p>万事网联的人民币借记卡情况比较特殊。目前仅有信银一家发行,并且是一张比较特殊的双币种 (人民币/美元)借记卡。在以人民币计价的交易中,正常的扣取人民币账户,但是对于非人民币本币交易,MasterCard 会把交易货币转为美元后直接入账,如果账户美元余额不足,就会交易失败。我们这里暂时把万事网联的人民币借记卡视为一个外挂了人民币户口的美元单币借记卡看待即可。</p> <blockquote> <p>更新 (2024.10) 信银通过 OTA 方式为万事网联借记卡添加了多币种记账,对于美元、港币、英镑、澳大利亚元、新加坡元、欧元、日元均可使用原币支付,但是依然不支持自动购汇。 邮政储蓄也同时期在部分试点区域发行了万事网联借记卡,为人民币/美元双账户,但支持海外消费时自动购汇美元扣款,暂不支持在线支付。</p> </blockquote> <p>对于绝大部分借记卡而言,所有外币支付都是通过卡组织将外币转换为基准货币,然后扣款。于是,在大陆的绝大部分银联和美国运通借记卡而言,在境外的付款/提款只会透过卡组织转换汇率后扣款到人民币户口,卡上外挂的所谓 “外币子账户” 是作为仅储蓄账户存在的,不能参与到实际的支付任务中。我们这里简单的把这种模式概括为人民币单币种卡。</p> <p>对于一小部分银行的银联人民币借记卡,因为银行的外币系统和银联进行了对接,在境外的付款/提款会优先扣除银行的对应外币子账户余额,若扣款失败才会使用卡组织汇率转换为人民币扣款,逻辑如下:</p> <ol> <li>持卡人在境外商户消费 100 GBP,如果使用借记卡,此时银联会超出冻结 115%,即 115 GBP</li> <li>银联查询持卡人 GBP 现钞户口,若现钞账户有 100 / 115 GBP 足额,扣除 GBP 现钞账户,交易完成</li> <li>银联查询持卡人 GBP 现汇户口,若现汇账户有 100 / 115 GBP 足额,扣除 GBP 现汇账户,交易完成</li> <li>银联将 100 / 115 GBP 按照汇率转换为人民币,若人民币账户有等额人民币,扣除人民币账户,交易成功</li> <li>如果上边都不满足,则交易失败。</li> </ol> <p>在这种情况下,交易最后会使用人民币尝试进行货币转换完成交易,人民币就是这里的基准货币。</p> <p>我们简单的把这种模式概括为人民币多币种卡。</p> <p>多币种借记卡可以进行囤汇后取汇/消费外汇的能力,对于在海外长期居住者来讲很有用。</p> <p>美国运通人民币卡目前均为人民币单币种卡,包括信用卡。</p> <p>对于中农工建交邮六大行和 99% 的其他银行而言,发行的银联卡均为人民币单币种卡。</p> <p>中国银行的 BIN 621669 的银联借记卡(例如 <a class="link" href="https://www.boc.cn/bcservice/bc2/201410/t20141024_4051272.html" target="_blank" rel="noopener" >长城环球通多币借记卡</a> / <a class="link" href="https://www.boc.cn/bcservice/bc2/201803/t20180327_11822133.html" target="_blank" rel="noopener" >长城冰雪借记卡</a> 均为该卡头)和汇丰银行中国的借记卡均为人民币多币种卡。</p> <h4 id="双标信用卡">双标信用卡 </h4><p>双标信用卡是银联早期网络在海外布局较差,过渡时期的产物。一般是 银联 + (Visa/MasterCard/AMEX/JCB)的卡组织形式出现,卡头均为外卡组织卡头。 目前人行已经不予批准新的双标信用卡发行,并且旧的双标信用卡基本只带磁条。</p> <blockquote> <p> <picture> <source srcset="/post/shut-up-and-take-my-card/boc-op-v&#43;m_hu_559e932c70d07037.webp" type="image/webp"> <source srcset="/post/shut-up-and-take-my-card/boc-op-v&#43;m.png"> <img src="/post/shut-up-and-take-my-card/boc-op-v&#43;m.png" width="800" height="450" srcset="/post/shut-up-and-take-my-card/boc-op-v&#43;m_hu_2efbd31db3ae1039.png 480w, /post/shut-up-and-take-my-card/boc-op-v&#43;m_hu_b4e8145c5cbd9b5c.png 1024w" loading="lazy" alt="中国银行冬奥主题白金卡" class="gallery-image" data-flex-grow="177" data-flex-basis="426px" isWebp="true" > </picture></p> <p>中国银行在北京 2022 冬奥会期间通过特批方式,发行了一批银联 + Visa 的含芯片双标信用卡,芯片实现了一卡双应用 (Visa + 银联),现已停发。 可以正常以贴卡方式在境内银联和境外 Visa 交易,如果你手里有一张这个卡的话,先偷着乐吧。</p> </blockquote> <p>非常不推荐使用仅带磁条的任何信用卡,磁条信息不加密,盗刷风险较高。</p> <p>并且由于没有芯片,在部分已经淘汰磁条的地区交易非常麻烦。还不能够以非接的形式交易,速度会比贴卡慢很多,并且尚不支持乘坐公共交通。</p> <p>由于外卡组织要求,在海外的交易一般只能够通过外卡组织,如果透过银联完成清算的话,外卡组织抓到了会罚商户和收单平台。</p> <p>但一般双标信用卡可以绑定至手机 Pay 方式进行支付,但是绑定至手机 Pay 后,会被视为银联信用卡,手机 Pay 仅包含银联应用。</p> <p>双标信用卡一般是银联为人民币单币结算,外卡组织为美元单币结算,并一般卡会带有 FTF。</p> <h4 id="真假多币信用卡">真假多币信用卡 </h4><p>所以,让我们回到外币信用卡。</p> <p>市面上很多银行都声称自己的外币信用卡是全币种,但实际上来看,这种全币种信用卡实际上是伪全币信用卡。</p> <p>实际上讲,这种信用卡本质上是 USD 单币种信用卡,但是银行免除了 FTF 费用。在交易非 USD 币种的时候可以 0 手续费。</p> <p>但是实际上,使用非 USD 币种例如 HKD 的消费,要透过卡组织先完成 HKD -&gt; USD 的转换,再通过银行完成 USD -&gt; CNY 的转换,实际的交易进行了两次币种转换,实际汇率并不一定有想象中理想。</p> <blockquote> <p>Notice:<br> 伪全币信用卡不一定意味着汇率较差,相反,全球 80% 左右的外汇交易都是其他币种和 USD 的交易,透过 USD 完成交易实际上可能可以取得更好的汇率,可以在交易前进行查询。</p> </blockquote> <p>而真多币信用卡一般是卡组织直接以实际支付币种向银行请款,由银行完成 USD -&gt; CNY 的转换。</p> <p>当然,对于银行没有覆盖到的币种,依然会以卡组织汇率先转换为卡的基准货币,再以基准货币记账。</p> <h4 id="卡组织的外币汇率转换">卡组织的外币汇率转换 </h4><p>Visa / MasterCard 的汇率实时更新,以消费时汇率为准。</p> <p>银联的汇率是在工作日当天进行一次更新,法定节假日不进行更新。所以银联的汇率在境外货币相较人民币狂涨的时候会好看一点。</p> <p>AMEX 美国运通的汇率数据不对外公开,但一般而言美国运通人民币卡的汇率会略优于银联。</p> <h3 id="借记卡的冻结比例">借记卡的冻结比例 </h3><p>持国内银行发行的借记卡在境外交易时,为避免汇率/盗刷风险,一般银行会以超出一定额的比例进行冻结。</p> <p>如果卡内余额不足以完成超出冻结,就会拒绝交易。 一般 ATM 取现不会超出冻结。</p> <p>对于大陆的银联借记卡,这个比例一般是 115%。</p> <h3 id="有趣的小事实">有趣的小事实 </h3><h4 id="不带钱包的手机-pay">不带钱包的手机 Pay </h4><p>手机 Pay 通过和卡组织和银行的合作,通过令牌化技术为设备颁发一个唯一的设备卡号(与实体卡号不同,设备卡号对于本绑定中的所有交易唯一),再透过 EMV Contactless 完成交易。</p> <p>对于大陆发行的银联卡,绝大部分银行都已经支持手机 Pay,银联中国通常以银联手机闪付这一品牌作为手机 Pay 的实际商标推广(一般包含 Apple Pay / Mi Pay / Huawei Pay / OPPO Pay / Vivo Pay 等,某些品牌会对支持银行进行阉割,通常是否接入银联闪付平台以 Apple Pay 支持情况为主),透过银联手机闪付品牌下发设备卡号时,按照银行支持情况会颁发不同的设备卡卡 BIN。</p> <p>大部分银行都会直接透过银联的公用卡头 (即查询卡 BIN 发行者为 CUP Token)来完成手机闪付,透过这个卡头将无法进行 ATM 提款等操作,但正常的消费是可以完成的。</p> <p>少部分银行(如中银、工银、建银)使用本行的卡头完成手机 Pay 设备卡颁发。但是对于中银支持多币记账的借记卡而言,因为设备卡头不支持多币记账,使用手机 Pay 在境外交易不能享受多币记账。</p> <p>由大陆发行的外币卡 (Visa / MasterCard / AMEX / JCB 等)目前尚不支持手机内置的手机 Pay 完成交易。</p> <p>但是对于中国银行和工商银行发行的外币信用卡,在 Android 设备上可以透过手机银行 HCE 卡模拟功能,完成外卡(对应闪付设备卡)的手机模拟,体验尚可。</p> <h4 id="卡组织和他们的互惠协议">卡组织和他们的互惠协议 </h4><p>AMEX 与日本 JCB 有互惠协议,持 AMEX 的卡在日本可以走 JCB 网络进行消费。</p> <p>同样的,银联与 Discover (探索卡)有互惠协议,在北美地区持银联卡可作为 Discover 使用(实际体验比较糟糕,主要是北美地区基本不验密,而银联借记卡交易基本验密),Discover 可在大陆作为银联使用。</p> <p>美国银行和中国建设银行有着互惠协议,中国建设银行的 Visa / MasterCard 理财卡(旧双标乐当家和新版外币借记卡)在 BofA 的 ATM 提款可以免手续费。</p> <h2 id="所以你登上了返回大陆的飞机">所以,你登上了返回大陆的飞机 </h2><p>然后在国内疯狂地开卡。</p> <h3 id="中国银行">中国银行 </h3><p>你国全球服务覆盖最好的银行。</p> <p>汇丰也就看个乐,真环球银行还得看我大中银。</p> <p>中国银行的个人银行借记卡服务是所有银行里最有意思的,我们在这里简单介绍两张借记卡。</p> <h4 id="长城冰雪借记卡">长城冰雪借记卡 </h4><p> <picture> <source srcset="/post/shut-up-and-take-my-card/boc-bingxue_hu_2c64430925652719.webp" type="image/webp"> <source srcset="/post/shut-up-and-take-my-card/boc-bingxue.png"> <img src="/post/shut-up-and-take-my-card/boc-bingxue.png" width="300" height="189" srcset="/post/shut-up-and-take-my-card/boc-bingxue_hu_1902001585a788fc.png 480w, /post/shut-up-and-take-my-card/boc-bingxue_hu_92e6706b0f91e643.png 1024w" loading="lazy" alt="长城冰雪借记卡" class="gallery-image" data-flex-grow="158" data-flex-basis="380px" isWebp="true" > </picture></p> <table> <thead> <tr> <th>类型</th> <th>详情</th> </tr> </thead> <tbody> <tr> <td>学名</td> <td>长城冰雪借记卡</td> </tr> <tr> <td>卡 BIN 码</td> <td>621669</td> </tr> <tr> <td>FTF</td> <td>0%</td> </tr> <tr> <td>卡组织</td> <td>银联 - 借记卡</td> </tr> <tr> <td>记账币种</td> <td>人民币多币种借记卡 - 支持美元等 19 种币种原币支付</td> </tr> <tr> <td>超出冻结</td> <td>115%</td> </tr> <tr> <td>年费</td> <td>不适用</td> </tr> <tr> <td>线上支付</td> <td>可用,通过银联渠道</td> </tr> <tr> <td>3DS 支持情况</td> <td>支持,由银联在线支付网关进行验证,向柜面预留手机号发送验证码</td> </tr> </tbody> </table> <p>这张卡支持 19 种币种原币支付 (美元、欧元、日元、港币、英镑、加拿大元、澳大利亚元、瑞士法朗、新加坡元、澳门元、韩国元、丹麦克朗、挪威克朗、新西兰元、菲律宾比索、俄罗斯卢布、瑞典克朗、泰国铢、南非兰特),是目前国内支持外币币种最多的人民币多币种借记卡。</p> <p>目前本卡每月免除第 1 笔境外本行、跨行 ATM 取现费,在境外取现应该是最好用的那一批。</p> <h4 id="长城跨境通借记卡">长城跨境通借记卡 </h4><p> <picture> <source srcset="/post/shut-up-and-take-my-card/boc-kuajingtong_hu_50625ee7f28b3fff.webp" type="image/webp"> <source srcset="/post/shut-up-and-take-my-card/boc-kuajingtong.png"> <img src="/post/shut-up-and-take-my-card/boc-kuajingtong.png" width="1189" height="827" srcset="/post/shut-up-and-take-my-card/boc-kuajingtong_hu_a38d3ec4dafddeff.png 480w, /post/shut-up-and-take-my-card/boc-kuajingtong_hu_f3e948bed31ac824.png 1024w" loading="lazy" alt="长城跨境通" class="gallery-image" data-flex-grow="143" data-flex-basis="345px" isWebp="true" > </picture></p> <p> <picture> <source srcset="/post/shut-up-and-take-my-card/boc-visa-sign_hu_b2f23c47d1dfc8e2.webp" type="image/webp"> <source srcset="/post/shut-up-and-take-my-card/boc-visa-sign.png"> <img src="/post/shut-up-and-take-my-card/boc-visa-sign.png" width="1139" height="898" srcset="/post/shut-up-and-take-my-card/boc-visa-sign_hu_2dbe04d8e76da08e.png 480w, /post/shut-up-and-take-my-card/boc-visa-sign_hu_c16b11486360395a.png 1024w" loading="lazy" alt="长城冬奥 Visa 借记卡" class="gallery-image" data-flex-grow="126" data-flex-basis="304px" isWebp="true" > </picture></p> <p> <picture> <source srcset="/post/shut-up-and-take-my-card/boc-mc-world_hu_64d7fbfcf508658c.webp" type="image/webp"> <source srcset="/post/shut-up-and-take-my-card/boc-mc-world.png"> <img src="/post/shut-up-and-take-my-card/boc-mc-world.png" width="744" height="469" srcset="/post/shut-up-and-take-my-card/boc-mc-world_hu_31c2c159b3da3358.png 480w, /post/shut-up-and-take-my-card/boc-mc-world_hu_44250926aff7274b.png 1024w" loading="lazy" alt="长城万事达世界借记卡" class="gallery-image" data-flex-grow="158" data-flex-basis="380px" isWebp="true" > </picture></p> <table> <thead> <tr> <th>类型</th> <th>详情</th> </tr> </thead> <tbody> <tr> <td>学名</td> <td>长城跨境通借记卡</td> </tr> <tr> <td>Visa 版本卡 BIN 码</td> <td>Gold 400221 / Platinum 400292 / Signature 400515</td> </tr> <tr> <td>MasterCard 版本卡 BIN 码</td> <td>Gold 529774 / Platinum 538113 / World 533228</td> </tr> <tr> <td>FTF</td> <td>0%</td> </tr> <tr> <td>卡组织</td> <td>Visa / MasterCard - 外币借记卡</td> </tr> <tr> <td>记账币种</td> <td><del>美元</del> 美元/英镑 双基准多币种借记卡 - 支持欧元、日元、港币等 19 种币种原币支付,不存在人民币账户</td> </tr> <tr> <td>超出冻结</td> <td>102%</td> </tr> <tr> <td>年费</td> <td>不适用</td> </tr> <tr> <td>线上支付</td> <td>可用,通过 Visa / MasterCard 渠道</td> </tr> <tr> <td>3DS 支持情况</td> <td>支持,由中行借记卡部进行验证,向柜面预留手机号发送验证码</td> </tr> </tbody> </table> <p>笔者的第一张外币借记卡,估计也是很多人的第一张外币借记卡。</p> <p>这张卡支持 19 种币种 (美元、欧元、日元、港币、英镑、加拿大元、澳大利亚元、瑞士法朗、新加坡元、澳门元、韩国元、丹麦克朗、挪威克朗、新西兰元、菲律宾比索、俄罗斯卢布、瑞典克朗、泰国铢、南非兰特),是目前国内支持币种数最多的外币借记卡。</p> <p>具体详情可以参阅 <a class="link" href="https://poplite.xyz/post/2018/03/05/boc-debit-card-guide-for-online-payment.html" target="_blank" rel="noopener" >跨境通 VISA/万事达借记卡介绍与网上支付体验 - poplite.xyz</a>。这里不再赘述。</p> <p>中国银行的外币借记卡拒付率较低,基本可以通刷。</p> <p>Visa 冬奥款目前在大部分地区已经停发。</p> <p>在中银的某次系统升级之后,本卡已经平滑升级为双基准(美元和英镑)多币借记卡。</p> <p>目前的扣款模式是: 单一账户整额扣款。扣款的顺序是:当地货币现钞:当地货币现汇;美元现钞;美元现汇;英镑现钞;英镑现汇。</p> <h4 id="中行信用卡">中行信用卡 </h4><p>中行的信用卡产品和借记卡相比就显得乏善可陈了,中行一切宣称全币种的 V/M 信用卡都是伪全币信用卡,本质上是 0 FTF 的美元信用卡。</p> <p>中行的卓隽留学信用卡是以卡对应地区币种为基准货币的 V/M 信用卡,对于长期生活在该地区的留学生等体验尚可。</p> <p>中行的 JCB 信用卡以 JPY 为基准货币,在日本实际消费效果尚可。</p> <p>中行目前还没有发行 AMEX 人民币信用卡。</p> <p>中国银行支持外币消费直接转换人民币出账单,不需要消耗便利化结汇额度来购买外汇还款。</p> <p>中国银行信用卡客户可以在柜面申领 e-token (动态口令)来完成 3DS 验证,可以在境外避免遇到短信验证码收不到的情况。</p> <h3 id="工商银行">工商银行 </h3><p>一般来讲,工商银行人民币对外币的汇率比中行稍优惠。</p> <h4 id="工行信用卡">工行信用卡 </h4><p>工商银行的 V/M 多币均为真多币信用卡,支持十种外币入账 (美元、欧元、港币、英镑、日元、新加坡元、加拿大元、澳大利亚元、瑞士法郎和新西兰元)。</p> <p>工商银行的 JCB 信用卡为 JPY 单币种。</p> <p>工行目前发行的 AMEX 人民币信用卡均以人民币出账。</p> <p>工商银行不支持外币消费转换人民币出账单,对于外币欠款,不需要消耗便利化结汇额度来购买外汇还款。</p> <h4 id="工行借记卡">工行借记卡 </h4><p>工商银行的银联借记卡均为人民币单币种,并且一般磁条没有写数据,不支持在境外使用磁条交易 (如日本等国无法取现)。</p> <h5 id="牡丹国际借记卡万事达品牌">牡丹国际借记卡(万事达品牌) </h5><p> <picture> <source srcset="/post/shut-up-and-take-my-card/icbc-mc-intl_hu_9bf3ff8767467703.webp" type="image/webp"> <source srcset="/post/shut-up-and-take-my-card/icbc-mc-intl.png"> <img src="/post/shut-up-and-take-my-card/icbc-mc-intl.png" width="2423" height="1525" srcset="/post/shut-up-and-take-my-card/icbc-mc-intl_hu_994402735436a925.png 480w, /post/shut-up-and-take-my-card/icbc-mc-intl_hu_d4d7c3c692b0703f.png 1024w" loading="lazy" alt="牡丹国际借记卡(万事达品牌)" class="gallery-image" data-flex-grow="158" data-flex-basis="381px" isWebp="true" > </picture></p> <table> <thead> <tr> <th>类型</th> <th>详情</th> </tr> </thead> <tbody> <tr> <td>学名</td> <td>牡丹国际借记卡(万事达品牌)</td> </tr> <tr> <td>卡 BIN 码</td> <td>519928</td> </tr> <tr> <td>FTF</td> <td>1.1%,仅在交易非卡支持的 10 币种时扣除</td> </tr> <tr> <td>卡组织</td> <td>MasterCard - 外币借记卡 (工商银行信用卡部发行)</td> </tr> <tr> <td>记账币种</td> <td>美元多币种借记卡 - 支持欧元、日元、港币等 10 种币种原币支付,有人民币账户但无法实际支付</td> </tr> <tr> <td>超出冻结</td> <td>100%</td> </tr> <tr> <td>年费</td> <td>10 CNY</td> </tr> <tr> <td>线上支付</td> <td>可用,通过 MasterCard 渠道</td> </tr> <tr> <td>3DS 支持情况</td> <td>支持,由工行信用卡部进行验证,向柜面预留手机号发送验证码</td> </tr> </tbody> </table> <p>虽然属于借记卡但归信用卡卡部发行,所以这张外币借记卡没有汇户只有钞户。</p> <p>实际消费体验会比 BOC 的外币国际借记卡略好一点,银行拒付概率几乎为 0,也可以累计信用卡积分。</p> <p>所有币种的消费都是 100% 的冻结,卡内设有人民币账户,但只可用于 ATM 存取款和结售汇使用。(1. 具体是否可以使用人民币账户消费取决于当地发卡分行卡部设置。2. 因为是信用卡部发行,卡内存款为信用卡预缴款,异地存取款可能收费。)</p> <p>在消费这张卡所不具备的币种账户时会通过美元进行转换并扣除 1.1% FTF,而如果消费币种为 10 支持币种但户里没有足够余额的话会直接交易失败不回落到 USD 账户。</p> <p>另外,另外一张红色的 Visa 牡丹国际借记卡和这张卡有较大差别,主要在那张卡仅为 USD 单币借记卡,并含有 1.0% 的 FTF。</p> <p>目前来看,该卡仅有北京、上海、深圳、成都、沈阳等城市有少部分网点发行,相对而言,申办难度较大。</p> <h3 id="建设银行">建设银行 </h3><h4 id="建行信用卡">建行信用卡 </h4><p>建设银行的 V/M 多币比较特殊,本质上是 USD 单币种卡,但是如果选择了转换人民币出账,那则会以建行汇率转换支持的自营币种的交易。</p> <p>例如,在境外消费 100 EUR 以外币还款时,会以卡组织汇率转换 100 EUR 到 USD 出账,<br> 但如果以人民币还款,则会以 CCB 自营汇率转换 100 EUR 到 CNY 出账,不会消耗便利化额度。</p> <p>建行目前发行的 AMEX 人民币信用卡均以人民币出账。</p> <h4 id="建行-emv-借记卡">建行 EMV 借记卡 </h4><p> <picture> <source srcset="/post/shut-up-and-take-my-card/ccb-mc-intl-classic_hu_e908c1b8717ffdb3.webp" type="image/webp"> <source srcset="/post/shut-up-and-take-my-card/ccb-mc-intl-classic.jpg"> <img src="/post/shut-up-and-take-my-card/ccb-mc-intl-classic.jpg" width="2339" height="1476" srcset="/post/shut-up-and-take-my-card/ccb-mc-intl-classic_hu_72120bac0c44a4f6.jpg 480w, /post/shut-up-and-take-my-card/ccb-mc-intl-classic_hu_b2b2a942aeeb7bd0.jpg 1024w" loading="lazy" alt="EMV 国际借记卡 万事达版" class="gallery-image" data-flex-grow="158" data-flex-basis="380px" isWebp="true" > </picture></p> <table> <thead> <tr> <th>类型</th> <th>详情</th> </tr> </thead> <tbody> <tr> <td>学名</td> <td>万事达 EMV 普卡</td> </tr> <tr> <td>卡 BIN 码</td> <td>517442</td> </tr> <tr> <td>FTF</td> <td>1.95%,非美元交易时扣除</td> </tr> <tr> <td>卡组织</td> <td>MasterCard - 外币借记卡</td> </tr> <tr> <td>记账币种</td> <td>美元单币种借记卡</td> </tr> <tr> <td>超出冻结</td> <td>100%</td> </tr> <tr> <td>年费</td> <td>10 CNY</td> </tr> <tr> <td>线上支付</td> <td>可用,通过 MasterCard 渠道</td> </tr> <tr> <td>3DS 支持情况</td> <td>尚不支持</td> </tr> </tbody> </table> <p>笔者在 2024 年 5 月成功申请并核发了本卡,应该是北京首张 EMV 万事达持卡人,在这里向开户行的工作人员致谢。</p> <p>本卡比较特殊,是一张由建设银行发行的美元单币种借记卡。 没有什么出彩的地方,如果硬要是说的话那就只有印制姓名了。</p> <p>本卡的账户交易顺序是:美元现钞;美元现汇。</p> <p>如果是扣除美元现汇的话,本卡会先将卡内的美元现汇自动转换为美元现钞再完成交易。</p> <p>根据建行和 BofA 的互惠协议,本卡在北美的 BofA ATM 上应当可以享受双方手续费均互免(存疑,笔者拿到本卡后尚未实际在 BofA ATM 测试)。</p> <p>如果常住美国,可以开一张本卡来进行 ATM 免费提款。</p> <p>此外,本卡还存在 Visa 版,和 MasterCard 版大部分地方情况一致,但是不能进行网上三要素交易,不推荐开 Visa 版本。</p> <p>当然,就建行当前的推广力度来看,该卡颇具收藏价值。</p> <h3 id="广发--兴业--中信银行的-amex-人民币借记卡">广发 &amp; 兴业 &amp; 中信银行的 AMEX 人民币借记卡 </h3><p>WIP</p> <h3 id="中银富登村镇银行和他的借记卡">中银富登村镇银行和他的借记卡 </h3><p>WIP</p> <h3 id="招行和某些其他商业银行的信用卡">招行和某些其他商业银行的信用卡 </h3><p>WIP</p>

2024/5/3
阅读更多

若存在终站之后。

<p>自幼时便无数次幻想巴士驶向终点站后前往何方。<br> 于是便这样做了。然后发现驶向终站的巴士只不过是返程的开始,在两点的无尽反复而已。<br> 如果要是存在终站之后的话,循环般的人生或许就会有救吧。</p> <div class="video-wrapper"> <iframe src="https://player.bilibili.com/player.html?as_wide=1&amp;high_quality=1&amp;page=1&aid=302149706" scrolling="no" frameborder="no" framespacing="0" allowfullscreen="true" > </iframe> </div> <p>以上。</p> <blockquote> <p>以上这段文字写于 2024 年 4 月 23 日。</p> </blockquote> <h2 id="于是若存在终站之后的话">于是,若存在终站之后的话 </h2><blockquote> <p>以下这段文字写于 2024 年 4 月 25 日。</p> </blockquote> <p>很讨厌做计划什么的。</p> <p>大概是从小学的时候就开始了。</p> <p>无数次被家长和老师说教,说什么 “做计划是为了你好” “这是有效的利用时间”。<br> 觉得如此被计划下去的人生,很无趣啊,不是吗?<br> 但为了不出丑,也不得不做一点啊。</p> <p>从小到大都是老师口中的 “乖孩子”,爱学习,不斗殴,不挑事,不说话。<br> 但自从上了高中开始,觉得自己像是变了个人。</p> <p>父母所做的计划什么的只要按班就步的走下去,就一定能取得成功。<br> 但一定也是无趣的,无聊的。</p> <p>反正嘛,世间的一切成功都只是出自人的主观臆断罢了。</p> <p>有人说什么物质富足的人是成功的、还有人说什么精神富足的人是成功的。<br> 普罗大众都能看到你衣着的华丽,而谁有会在意你精神上的富足呢。</p> <p>生活里只有按部就班,学校和家里的两点一线,如同巴士般稳定的计划什么的。</p> <p>反复什么的,真是受够了。<br> 一眼望得到头的人生,真是烦死了。<br> 才不要过如此般 predictable 的日子。</p> <p>真想找到巴士始末站后的第三站啊,无论是处于始站之前还是末站之后都可以。</p> <p>于是,在今天下午翘课了。—— 说是翘课,实际上也只是在考试结束后的自习课偷偷摸走了。<br> 本来也没有几个老师在巡场看着,摸走了也没有人知道。</p> <p>翘课也没有被抓到,只是内心有点过意不去而已。</p> <hr> <p>人生才不是说什么随处可见的东西,你的人生由你自己所有啊。</p> <p>请让可观测,可预测的东西只是物理数学上的那一个个定律而已,不要让定律定义了你本身啊。</p> <p>若能在行驶于两点间的巴士上找到第三个站的话,我更愿让它在终站之后。</p> <hr> <p>ZA Bank 的宣传语很有意思, “做坏规矩,做好银行”。<br> 虽说是说什么宣传银行的格旧做新之意,但貌似对人来讲也挺好的。</p> <p>做坏规矩嘛,不要拘泥于自己本身所在的道路,走出舒适区跳脱出来看看也挺好的。</p> <p>生活不应该是单调的循环,而是不断创造意义的过程。</p> <p>无论如何,要对世界抱有着最初的好奇心,在平凡的日子里找到微小的、闪光的东西。</p> <p>就正如有风吹过就好了,狂风也好,清风也罢。<br> 只要能吹散那一丝阴霾。<br> 给这一成不变的,冷的令人发抖的阴天带来一丝暖意就好。<br> 这样的话,就能找到既定轨迹之外的地方了吧。</p> <p>我这样祈求着。</p> <p>如果真的存在那么一个终点之后的话,一定一定,在播放着摇滚乐,没有什么赞美诗什么的,因为神明和其他东西都不存在吧。</p> <p>于是,<br> 如果存在终站之后。</p> <p>以上。</p> <h2 id="终站之后的后日谈">终站之后的后日谈 </h2><blockquote> <p>以下这段文字写于 2024 年 4 月 27 日。</p> </blockquote> <p>回想了一下,第一次在听 Tuyu 的歌大概是在 2021 年。</p> <p>然后在 2023 年开始被人拉着强制碰了 maimai,然后就选到了 Tuyu 的 「くらべられっ子(被比较的孩子)」,回到家里加到了网易云的收藏夹里,扫了一眼歌词,感觉很有共鸣感。</p> <p>我们不也正是被比较的孩子吗?</p> <p>明明知道自己比不过别人但又没法彻底放弃一切去摆烂。</p> <p>每次被告知不如别人的时候都觉得自己像一盘冷掉的菜一样,永远不会被谁选择,自己的存在又尴尬又让人恶心。</p> <p>畅想着当年的自己有多厉害,是他人父母口中的 “别人家的孩子”,成为被比较的那个对象,<br> 而现在的自己却成为了自己父母口中那个 “不成器的孩子”,总是做的不够好。</p> <p>被他人所抛弃以后也会躲在被子里失声痛哭,后悔着自己如果当时这么做的话事情就会有转机吧。</p> <p>当时有多果断,现在就会有多狼狈。</p> <p>每个人都会有不如意的时候,但更重要的是,<br> 无论如何,要好好的活下去啊。</p> <p>成为如此这样被比较的孩子也好,失恋也好,放弃了音乐也好,被抛弃也好,错过了最后的巴士和电车也好,人生有多糟糕透顶也好。<br> 不管经历了怎样的伤痛,也终究会过去。</p> <p>生命本身就蕴藏着无尽的价值与意义,自我接纳是我们与生俱来的权利。<br> 无论周遭如何,切莫忘记,总有那么一个角落,存放着对自己的深爱与关怀。</p> <p>但如果可以的话,明明我们也只是想找到一个能接纳自己的人,以自己为荣的人,能在最后关头站在自己这一方的人而已啊。<br> 无论伤痛是出于本心亦或被他人所伤,想要的只有他人的一句关照而已。</p> <p>地球终将和往日一样,继续旋转;巴士终将和计划同样,驶向终站。</p> <p>其实根本不存在想寻找着什么终站之后去了结自我的愿望,<br> 只是在人生结束前,想要无忧无虑的活下去啊。</p> <p>想把告别变得漫长,想把结束变为开始。</p> <p>既然也找不到什么救赎或忘记的方法的话,不如就装着吧。</p> <p>比起那些再也长不大的人,我们一定会长大成人,带着过去的伤痛活下去。</p> <p>以上。</p>

2024/4/27
阅读更多

雨声残响

<p>关于题目,盗取自 Orangestar 的 「雨声残响」这一歌。</p> <p>雨落尽,天渐晴,但雨声仍然还会有残响啊。<br> 毕竟,光速比声速快多了。</p> <p>北京的天真是奇怪呢。<br> 从幼时起就很讨厌下雨的春天,也无论什么 “春雨贵如油” 之类的,总之就是很讨厌雨前的低沉的气压,讨厌压倒一切的黑云,讨厌雨后仍存零星的雨滴,讨厌雨后麻烦的水坑。唯独只是喜欢雨后的天晴,和下雨把粉尘花粉什么的压了压而已。<br> —— 长大了也是如此。<br> 大约是北京没有什么真正的春天吧。</p> <p>嗯,真的很奇怪呢。明明下午还是天晴的,过了两个小时突然就深沉下来然后狂风暴雨。很奇怪吧。感觉不是北京,像是岛国的伦敦。<br> 至于雨停之后嘛……倒是还可以吧,科学上来讲是什么臭氧之类的东西,依我看倒是因为万里无云。</p> <p>突然想起 Yorushika 年初的新歌 「晴る(放晴)」也是讲的春雨后天放晴之事。刚发布的时候循环了很久,真想和你一吐为快呢。<br> 白日晴空予花绽,百花不过因春来。</p> <p>很喜欢雨后晚上的时候出门走一走,空气很清新,麻烦的避水坑也貌似变得灵动了一点。<br> 无数次在夜里十一点出门瞎逛,一遍走过寂静的居民区,一遍暗自感叹 “还好北京没有夜生活”,然后一边唱 Yorushika 的夜行。</p> <blockquote> <p>纷纷、扬扬、飘落。<br> 万里晴空的原野、你咏唱的歌谣和一轮草。<br> 除此以外,别无他求。</p><span class="cite"><span>― </span><span>Yorushika (n-buna &amp; suis), </span><cite>夜行</cite></span></blockquote> <p>每次进入到副歌的时候,总会感觉有一种华丽的悲伤感,回忆如夜风般流转身边。</p> <p>还记得是 23 年的暑假吧,跟着老妈回老家悼念离世已经一年的爷爷,说来也很奇怪,本打算多住几天的,突然就开始胃疼。<br> 医院住了好几天,药什么都吃了,也没见一点好转。<br> 然后突然就好了。<br> 与此同时,北京开始下暴雨了。<br> 担心回不去的我,找了个理由,自己一个人买了票回了北京。<br> 下午四点买票,五点发车,凑巧刚好赶上。<br> 然后就在郑州中转了 6 个小时。<br> 下了车发现有小雨 —— 其实早在出发前就知道了。<br> 北方城市的小雨性格或许都是一样,一样的奇怪,会突然就下大,也会突然停掉,阴晴不定。<br> 出了郑州东站,搭着地铁就到了紫荆山。从 E 口出来,对面就有一个麦当劳。解决了晚饭,一路沿着东南一条大路走过去,应该是叫人民路吧,耳机里还是放着 Yorushika 的夜行。<br> 到了一个新的城市最喜欢的就是夜晚走在老城的街道上,体验风土人情是假,给自己放个假是真。<br> 郑州的街道和北京不同,我从来没在街道上见过这么多法桐。甚至有一些已经遮住了路灯。<br> 然后走到了二七广场,已经是晚上十一点了,夜晚没有开灯,广场上也没多少人了,毕竟已经 11 点了。<br> 历史上,1923 年 2 月 7 日,京汉铁路工人在郑州大罢工,故起名二七广场,始为纪念。<br> 然后接着往东南,走到了郑州站。<br> 郑州站和北京站不同,站东的广场并没有宽敞的马路,而是和天津站一样的商业。<br> 进了郑州站,突然看到一个和你很像的人。真的很像,差点就上去打招呼了。<br> 已经是十二点了,列车完美晚点两个小时,等到凌晨两点才上了普速列车。<br> 应该是坐了十个小时的地板,终于到了北京。<br> 然后又是和往常一样的一天。</p> <p>貌似,回忆好像也没什么啊。</p> <p>你走后,有个朋友给我发了一首歌,是彩虹合唱团的 「道别是一件难事」。<br> 或许人的一生都在告别。忘掉那些已经过去的人会好受点吧,但是怎么可能忘掉呢,又不是缺少了心脏。</p> <p>既然忘不掉,那就装着吧。</p> <blockquote> <p>我将留在此处,而你将去到遥远的彼岸。</p><span class="cite"><span>― </span><span>Yorushika (n-buna &amp; suis), </span><cite>夜行</cite></span></blockquote> <p>现在望向窗外,只闻:<br> 雨声残响。</p> <p>以上,<br> 2024 年 4 月 22 日</p>

2024/4/22
阅读更多

八月、某、月明かり(八月、某地、月光皎明)—— My whole life was saved by Rock & Roll.

<blockquote> <p>人生、二十七で死ねるならロックンロールは僕を救った<br> 人生,若是在 27 岁就死掉的话,那么是摇滚乐救了我</p><span class="cite"><span>― </span><span>Yorushika (n-buna &amp; suis), </span><cite>八月、某、月明かり</cite></span></blockquote> <blockquote> <p><p>那天因為犯了些粗心的錯誤而被店長罵到臭頭,但我那時一直想著別的事情。</p> <p>羅伯 • 強森、吉米 • 亨德里克斯、布萊恩 • 瓊斯和吉米 • 莫里森,</p> <p>這些當時很棒的音樂家,都是在 27 歲逝世的。</p> <p>還有 27 俱樂部這樣觸霉頭,但卻挺有名的說法。</p> <p>在我臨死之際,還會剩下所謂「這樣就滿足了」的事物嗎?</p> <p>不用說 27 歲,如果壽命就這樣被限定著時,</p> <p>那還不如拋開一切,全心全意地做音樂。</p> <p>就這樣,如果那件事成了不可能,也只能繼續現在的生活,</p> <p>到死都停滯不前,漫無目的地過著毫無意義的每一天了吧。</p> </p><span class="cite"><span>― </span><span>Yorushika (n-buna &amp; suis), </span><cite>八月、某、月明かり - From Youtube</cite></span></blockquote> <h3 id="27-club">27 Club </h3><p>27 岁俱乐部,来自于一个奇怪的传言,有许多伟大的、富有才华的摇滚音乐人在 27 岁那年出乎意料的死去。</p> <p>如果人生在 27 岁就会死去的话,那还需要什么别的呢?做好自己想要做的东西就可以了。逃避现实什么的,也无所谓了吧。</p> <h2 id="八月某地">八月、某地 </h2><p>八月一直以来都是一个特别的月份。至于为什么特殊嘛?</p> <p>那个八月的暑假格外的短,大概是因为那个暑假末尾被迫的强制补课吧。</p> <p>八月,从教室向窗外看去,夏天的落日总是不同的。阴天下的落日是冷淡的,大风过后落日骤亮,是暖调的,雨后和烈日的夕阳是清爽的。</p> <p>操场上也有学生在打球,似乎是八月末最后一丝青春感了。</p> <p>那大概是我每天为数不多能发自内心开心的时候了吧。</p> <p>等到夕阳落下,夜幕降临,教室里也会有一种阴沉、疏离的气氛再次出现。 如同机械般的再次投入到什么所谓的 “学习” 之中。</p> <p>等到下了晚自习,走在回家的路上,独属于夏的微风吹过, 再次戴上耳机,站在十字路口上,等着绿灯亮起, 抬头只见朗朗月光,随机到了 「八月、某、月明かり」,听到那句:</p> <blockquote> <p>何もいらない<br> 什么都不需要</p><span class="cite"><span>― </span><span>Yorushika (n-buna &amp; suis), </span><cite>八月、某、月明かり</cite></span></blockquote> <p>突然觉得,</p> <p>一切全都糟透了啊,快跑吧。</p> <iframe frameborder="no" border="0" marginwidth="0" marginheight="0" height=86 src="//music.163.com/outchain/player?type=2&id=1357953772&auto=0&height=66"></iframe> <h2 id="某地月光皎明">某地、月光皎明 </h2><p>初听 「八月、某、月明かり」 的时候,感觉副歌有一种奇奇怪怪的混乱感,匆匆忙忙的。</p> <p>如同着急赶上回家的末班公交一样,总是感觉差一口气有话没说完。</p> <p>现在一想,这应该就是 n-buna 的风格,也就是所谓的 —— 疾走感。</p> <p>总体来看,「八月、某、月明かり」应该是一首相当愤世嫉俗的、偏激的、愤怒的歌。</p> <p>简而言之介绍一下背景,「八月、某、月明かり」和同属专辑 「だから僕は音楽を辞めた (所以我放弃了音乐)」 的歌,都是由一名虚拟的音乐家角色 “Amy” (存在翻译 Eimy)创作,他怀才不遇、身患绝症,如果能用一个历史人物比喻成 Amy 的话,应该是屈原吧。</p> <p>夏日未至,咖啡厅内,Amy 第一次遇到了 Elma,她同他一样,一个音乐家,于是第一眼之后就喜欢上了她。</p> <p>在他 27 岁那年,八月末尾,他仿照自己的音乐,抛下 Elma,喝下花绿青(一种很美丽的、绿色的、剧毒的颜料)跳海,独自死在旅程中。</p> <p>回到主题吧,在一句 &ldquo;什么都不需要&rdquo; 之后,就进入了吉他和鼓上气不接下气的演奏之中。</p> <h3 id="自行车上的飞奔">自行车上的飞奔 </h3><p>我一直是认为「八月、某、月明かり」这首歌应该是骑着自行车,在大街上飞奔的时候听的。</p> <p>事实也是如此,这首歌的词曲作者 n-buna 也是这么想的。</p> <p>便利店打工的过程中,因为和店长的不和,辞掉了这份工作。</p> <p>把工作服洗完没晾干就装进纸袋里送回便利店之后,扭头骑着自行车一路狂奔。</p> <blockquote> <p><p>初めてバイトを逃げ出した<br> 初次逃掉打工</p> <p>音楽も生活も、もうどうでもよかった<br> 音乐也好生活也罢 怎样都无所谓了</p> <p>ただ気に食わないものばかりが増えた<br> 与本意背道而驰的事物不断增加</p> <p>「八月、某、月明かり」、月明かり、自転車で飛んで<br> 八月的某人 月光 自行车飞驶</p> <p>東伏見の高架橋、小平、富士見通りと商店街<br> 东伏见高架桥 小平 富士见大道与商店街</p> </p><span class="cite"><span>― </span><span>Yorushika (n-buna &amp; suis), </span><cite>八月、某、月明かり</cite></span></blockquote> <p>骑着自行车飞奔,逃掉打工什么的,很反叛吧。</p> <p>不想做的事情却会因为 “要填饱肚子” 这样残酷的理由不得不去做,所以就逃掉了打工。</p> <p>这就是「八月、某、月明かり」中的第一个矛盾,即: 现实和理想的冲突。</p> <p>生活一塌糊涂,令人感到无奈和厌烦。正因为生活如此糟糕,所以才要去发泄自己心中的愤怒。</p> <p>摇滚的内核是反叛,反叛即为发泄。</p> <p>但是「八月、某、月明かり」的发泄和例如真夜中的 「那些家伙们的校友会」 之类的歌也有不同 —— 「八月、某、月明かり」的发泄中明显带着一丝收敛,或者我们说的更简单一点,并没有说什么 “这个世界差极了,和这个世界爆了” 之类的话。</p> <p>深究其原因,「八月、某、月明かり」中带着更多复杂的情感,不能用简单的一句 “和这个世界爆了” 带过吧。</p> <h3 id="我的人生只有糟糕透顶罢了">我的人生只有糟糕透顶罢了 </h3><p>紧接着,进入副歌,矛盾继续延伸,即:我和理想的冲突。</p> <blockquote> <p><p>最低だ 最低だ<br> 糟糕透顶 糟糕透顶</p> <p>僕の全部最低だ<br> 我的全部都糟糕透顶</p> <p>君を形に残したかった<br> 想将你保存成形</p> <p>想い出になんてしてやるもんか<br> 怎样能将你化作回忆</p> </p><span class="cite"><span>― </span><span>Yorushika (n-buna &amp; suis), </span><cite>八月、某、月明かり</cite></span></blockquote> <p>不断重复着什么 “糟透了” 之类的话,也应该是所谓摇滚中的反叛精神啊。</p> <p>如果失去对于某物的逆反、宣泄,内心没有痛苦、挣扎的话就算不上是摇滚了吧,或许就是乐器音重的流行乐了。</p> <blockquote> <p><p>初めて心を売り出した<br> 初次售卖真心</p> <p>狭心もプライドも、もうどうでもよかった<br> 狭心也好自尊也罢 都已经无所谓了</p> <p>気に食わない奴にも頭を下げた<br> 即使对讨厌的傢伙也可放低身份</p> </p><span class="cite"><span>― </span><span>Yorushika (n-buna &amp; suis), </span><cite>八月、某、月明かり</cite></span></blockquote> <p>自己和自己看不惯的现实也逐渐找不到差别,对自己也开始鄙夷起来,所以才把自己和理想交代给歌曲中的 “Elma”。</p> <p>Elma 在这里如同是神明一般的人,是理想在现实中的化身。</p> <p>但他也清楚,Elma 同他一样,也只是一个普通人,也有着贪婪的私心,自己也不能强求去改变她。</p> <blockquote> <p><p>最低だ 傲慢だ 君もみんな貪欲だ<br> 糟糕透顶 傲慢透顶 你也同大家一样 满是贪婪</p> <p>君の全てに頷きたいんだ<br> 我想点头赞同你的全部</p> <p>そんなの欺瞞と同じだ、エルマ<br> 可那样与欺瞒无异 Elma</p> </p><span class="cite"><span>― </span><span>Yorushika (n-buna &amp; suis), </span><cite>八月、某、月明かり</cite></span></blockquote> <p>这样理想与现实,理想与自我,理想与平凡的三大冲突渲染了这整首歌的情感氛围,Amy 纠结于冲突之中,找不到宣泄的方法,使自己更加痛苦。</p> <p>违背世俗去逃掉打工,却还是有着更多本意背道而驰的事物不断增加;<br> 寄托于音乐之中,而无法相信纯粹的艺术之上;<br> 将理想传递给 Elma,自己会身陷愧疚当中。</p> <p>要顾虑的事情太多了,所以根本找不到发泄的道路啊。</p> <p>有的时候觉得现实里的自己找到了答案,但追到最后,发现答案是牵强的。</p> <p>相信宗教、相信世俗、相信摇滚、相信他人,无论是相信一切其他事物,亦或相信自己,似乎都不能让人心安吧。</p> <h2 id="所以是摇滚乐拯救了生命">所以是摇滚乐拯救了生命 </h2><p>而这个问题的答案,无论是「八月、某、月明かり」,还是专辑里的其他音乐,或许都没有对这个问题给出解答。</p> <p>和 「だから僕は音楽を辞めた (所以我放弃了音乐)」 专辑中的其他歌曲相比,「八月、某、月明かり」更显得带着一丝狂风的感觉。</p> <p>而这又可以回到开头所说的 —— 疾走感上。</p> <h3 id="乱花迷醉之夏">乱花迷醉之夏 </h3><p>设身处地的想一下:</p> <p>皎洁月光,凉爽夜风,路上街道无人无车,世界像是停下来了一样。</p> <p>你一个人骑着自行车,飞驰在街道上,建筑和别的一切都闪过眼前的时候,</p> <p>你还会想起还有这些烦恼的事情吗?</p> <p>很明显,如此心旷神怡的时候,你会享受逃避烦恼的这段时间吧 —— 无论到底是多长,一分钟、一小时、一天都无所谓,需要的只是放松而已。</p> <p>逃避作为宣泄来讲无疑是懦弱的、可耻的,改变不了什么,也传达不到什么,但究其根本,也是有效的、可用的。</p> <p>即使你不相信什么 “爱能拯救世界” “现实什么的糟透了”,也总能在逃避中 have a break,选择去 “什么我都不管了”。</p> <p>谁都有心累的时候,选择去逃避一下现实,或许也挺好的。</p> <h3 id="什么我都不需要">什么我都不需要 </h3><p>明明 Amy 要是能够信点什么的话,心里或许就不会这么拧巴和纠结了。</p> <p>为什么所有的东西都要研究出个美恶善臭来,明明令人愤怒的事情永远都会存在,无法抹除。</p> <p>看到过一个非常有意思的观点:</p> <p>“尊严是我平庸身体的一剂毒药”</p> <p>虽然无能的自己已经不能维护尊严了,但是还是不能允许他人、自己去践踏仅存的这一丝尊严。</p> <p>在面对讨厌的人也要低下头颅的时候,Amy 也应该很难受吧。</p> <p>尊严告诉我们说什么,人应该自由,应该平等,应该有高尚的情操。</p> <p>但是回顾到现实,能做到的人又有多少呢?</p> <p>如屈原一样壮烈投江的人并不多,大部分人都出于泥泞,而又和泥泞所不容。</p> <p>或许是身体里寄身的神明促使我们这么干的吧。有着这样本应高洁的神明存在,所以我们才不能忍受如此泥泞的人、事和自我。</p> <p>与其说是和外物的不对付,其实是有着污秽内心的我们没有去见神明的胆量吧。</p> <p>人生,即为妥协的延续吧。要想活得痛快,一定要与自己和解啊。</p> <p>逃避的道路,也一定是妥协一切什么金钱、爱情、宗教、社会、他人、自我、价值观和时代论,和自我和解的道路。</p> <p>所以选择摇滚,不是在相信摇滚和反叛能带给我们什么,而是在摇滚的愤世嫉俗得到妥协和和解,走向自我逃避罢了。</p> <p>所以,Amy 最终选择了逃避,放弃了思考,张开手,去迎接即将到来的死亡。</p> <blockquote> <p><p>今も、愛も、過去も、夢も、思い出も、鼻歌も、薄い目も、夜霞も、<br> 现在也好 爱也好 过去也好 梦想也好 回忆也好 哼唱也好 冷漠的眼神也好 夜光也好</p> <p>優しさも、苦しさも、花房も、憂鬱も、あの夏も、この歌も、<br> 温柔也好 苦痛也好 花房也好 忧郁也好 那个夏日也好 这首歌也好</p> <p>偽善も、夜風も、嘘も、君も、僕も、青天井も、何もいらない<br> 伪善也好 夜风也好 谎言也好 你也好 我也好 蓝色天花板也好 什么都不需要</p> </p><span class="cite"><span>― </span><span>Yorushika (n-buna &amp; suis), </span><cite>八月、某、月明かり</cite></span></blockquote> <p>所以,什么都不用管了,</p> <p>现在也好,爱也好,过去也好,梦想也好,回忆也好,哼唱也好,冷漠地眼光也好,夜光也好,<br> 温柔也好,苦痛也好,花房也好,忧郁也好,那个夏日也好,这首歌也好,<br> 伪善也好,夜风也好,谎言也好,你也好,我也好,蓝色的天花板也好,</p> <p>就是现在,什么都不需要了,就让耳机里的摇滚乐,飞驰的自行车,眼前闪过的景物带着我。</p> <p>“一切全都糟透了啊,快跑吧。”</p> <h2 id="我八月某月明かり和那个友人-a">我、「八月、某、月明かり」和那个友人 A </h2><p>东亚人总是含蓄的。正如夏目漱石把 &ldquo;I love you&rdquo; 翻译成 “今晚月色真美” 一样。</p> <p>「八月、某、月明かり」也是如此样无声的告白吧。</p> <p>八月、某地,骑着车飞奔在街道之上,抬头,月色一定是美丽的。</p> <hr> <blockquote> <p><p>最低だ 最低だ<br> 糟糕透顶 糟糕透顶</p> <p>僕の全部最低だ<br> 我的全部都糟糕透顶</p> </p><span class="cite"><span>― </span><span>Yorushika (n-buna &amp; suis), </span><cite>八月、某、月明かり</cite></span></blockquote> <p>日语里,<code>最低だ(最差劲了)</code> 和 <code>咲いていた(绽放着)</code> 同音,真是个美丽的巧合啊。</p> <p>说起来很有意思,n-buna 在之前 VOCALOID 活动时期的一首曲子 「白ゆき」 中也提到了一样的 <code>最低(さいて)/ 咲(さ)いて</code>。</p> <p>即使是糟糕透顶如我,也想在你面前绽放呢。</p> <hr> <p>从之前起,就无数次和友人 A 提过自己非常喜欢这首歌,也把「八月、某、月明かり」中的一句话也送给了她:</p> <blockquote> <p><p>君の人生は月明かりだ<br> 你的人生好似朗朗月光</p> <p>有りがちだなんて言わせるものか<br> 岂能让他人指手画脚什么“随处可见”</p> </p><span class="cite"><span>― </span><span>Yorushika (n-buna &amp; suis), </span><cite>八月、某、月明かり</cite></span></blockquote> <p>是啊,你的人生好似朗朗月光,哪能容忍他人指手画脚呢,<br> 她应该也明白了吧,<br> 可惜 —— 自己还是没有珍惜啊。</p> <p>只剩下被嘲笑的自己了。</p> <hr> <p>可是,人生,若是现在就会迎来结局的话,那么一定、又一次、还是摇滚乐救了我吧。</p> <p>My whole life was saved by Rock &amp; Roll.</p> <p>以上,<br> 2024 年 4 月 18 日</p> <!-- ## 后记 从小,我就是个胆小的爱哭鬼,也不顾些别的,想着只要哭出来一切就一定会好起来的。 还记得,小学三四年级刚学十位数乘法的时候,做错一道题就会让我哭出来。 可能是争强好胜吧,具体什么的事情已经忘干净了。 然后,在小学五年级第一次真的有见过的人逝去的时候,也是如此哭出来了 —— 明明不是很熟悉他,但看着身边的其他人的哭泣,自己也不能幸免似的。 回了家,母亲告诉我说:“就算自己活的再痛苦,哭也不能让其他人看到,一定对其他人报以笑容,绝不能给其他人添麻烦。” 现在想想,自己貌似还算挺遵守这句话的。 直到他悄然离世的那天吧。 人的大脑里是有一种自我保护的功能 —— 遗忘痛苦。 当时的事情已经全部忘记了,就连他的容颜、声音什么的也是。 脑子里只剩下那时候浑浑噩噩的生活了,就连上课的时候看到老师在课上引用海子的 「面朝大海,春暖花开」 也会为此悄悄躲在暗处哭出来。 然后说些什么 “人生若是 27 岁就会死去的话,那一定是摇滚救了我自己” 的毫无意义的话。 眼泪流得多了,自然也就会麻痹,再想起痛苦的事情也绝不会再说些什么。 然后就遇到了你。 总是自顾自地说些什么 “你的人生好似朗朗月光,怎能让他人指手画脚说什么随处可见” “只要不在乎人其他人的视线一切就会好起来” 之类的话。 把成功写得理所当然,就像是橱窗里的孩子看着萧瑟的雪地前,随手写就的赞美诗。 现在一想真的是有够可笑的。说出这样的话实际自己却做不到如此,像是个傻逼。 或许对你的喜欢只是因为保护欲作祟吧。 究竟那时的自己是怎么想的呢…… 不管怎么吧,当你说出喜欢我的时候,我也很开心啊。 本以为也只是一次只能深埋内心的单恋,也能绽放出来。 被你所需要的时候,觉得自己好像遇到了对的人,眼里像是放着光亮。 那个时候,我也曾真诚的喜欢过你。 开心的时候是真的会忘记那些悲伤的事情。 你说,你希望我很难受不开心的时候可以找你哭诉一会。 说实话,真的很感动,原来让自己难受的痛苦也可以在人前哭出来让自己好受一下。 也会觉得这样很自私,明明自己的痛苦为什么还要让其他人也为之共情,感到伤心。 或许我就是这样拧巴的人吧。 每次闹了矛盾,总会去听一会 「八月某月明」,或许也会躲起来哭一下下,然后再去哄你,只要这样一切就会好起来的 —— 我心里这么想着。 从没想过决裂会是这样的可笑而不堪。 我讨厌患得患失的人,不去多试两下,为什么还要害怕得不到渴望的东西;既然得到了,为什么还要去害怕美好的东西的失去。 从未想过自己也会是这样的人。 在人前,嘴上笑着说:“呵,这群人也不过这样。”,然后躲起来不断找着否认的证据。 可惜,否定的证据是一条没有,有罪的证据是越来越多。 躲在自己的房间里,锁上门,然后用被子蒙上头,然后开始流泪,再一次次哄骗自己只是过敏了而已。 直到自己也不能骗过自己了,再想些 “只要这样笨拙的哭出来,你也一定会再出现的。” 的话。 也试过劝解自己放下,无声的写着 “把本该过于再以的东西当成了生命的全部。” 的纸条。 再把一切写着这样话语的纸条撕碎。违心的话我是一点都不想再写出来了。 当然不止一次想过自杀,但是当每晚熬夜到凌晨五六点看到太阳又升起的时候,就不会再这么想了。 看到第一缕阳光之后,只要躺下去进入梦乡就能再遇见你。 再想,如果我就这样悄然离去的话,会有人再能记起我吗? 感觉自己如果选择去死,或许真的会被人忘掉的吧。 就一遍遍这样决定苟延残喘的活在这世上。 就一次次这样厌烦着世俗、辱骂着自己。 或许也根本不存在什么想要去死的愿望,只是想无忧无虑的活下去而已。 再一次蒙上头,哭出来就会好一些吧。 然后就开始听 「八月某」。 写下了 “人生若是那时就会死去的话,那一定是摇滚救了我” 之类的话。实际上,摇滚怎么会救人呢? 可能是你,也有可能是我自己救了我自己吧。 眼泪流得多了,自然也就会麻痹,再想起痛苦的事情也绝不会再说些什么。 被其他人嘲笑的时候也不敢抬起头,只能从喉咙眼里挤出一句 “嗯,你说得对”。像是真的不在乎他人的视线一样。 在乎还是不在乎,还是只有我自己一个人知道啊。 我讨厌你的不辞而别,更讨厌强颜欢笑的、不坦诚的自己。 I hate you but I love you. 嗯,所以就是这样,即使再讨厌你,看到你的视线的时候还是会想 “或许我还喜欢你吧”。 你当时说你还没收到过我的情书,就全当这是我给你写的情书吧。 就这样吧,也不知道你能不能看到。 如果可以的话,我也想鼓起勇气,像是你那天鼓起勇气一样。 “如果可以的话,请给我再喜欢你一次的机会” 以上, 写于 2024 年 6 月 10 日夜。 -->

2024/4/18
阅读更多

「花与麦芽糖,最终电车。」

<p>初听拿不拿的这张专辑还是 17 年的夏天,第一次接触 VOCALOID 的时候,当时还小嘛,也不懂什么乐理和看歌词什么的,觉得顺耳好听自然就加到收藏夹了。</p> <p>第二次提到这张专辑的时候,是 21 年那天你给我发了 Yorushika 的 「说吧。」,你和我提什么 “吉他的 solo 很帅吧” 什么的话,说要去学电吉他,还说这是你最喜欢的歌。</p> <p>我打开 Yorushika 的歌手页一扫成员,嗯?拿不拿?然后突然就想起来了花水电车,翻出听了很久,拿不拿那时候的歌真的和 Yorushika 很不一样啊,像是真的失去了什么重要的东西一样,真的看不见了,带着一丝丝怀念与后悔吧。</p> <p>于是你便学起了电吉他——如你所说的那样。你也是真的很有天赋,自学一年过去已经可以弹出「说吧。」的 solo 了。我还半开玩笑打趣的说你什么时候可以自己开乐队写摇滚曲子,你也开玩笑去让我学乐器。</p> <p>22 年的日子是真的很难过啊。也不知道自己那时候怎么了,突然就变得神经质了起来,一天天重复着一成不变的生活,一次次踏入相同的错误之中。</p> <p>直到一模出分的那天,应该是真的崩溃了吧。七点半放了学到了家就开始哭,你也清楚我七点半到家,见我一直没理你,就给我打了个电话,然后和我提什么 “你的人生好似朗朗月光,哪能听他人说什么 ‘随处可见’ 之类的话”,还开玩笑说 “你先别急呢,我还没想不开你想什么” 的话。</p> <p>就这样在你的开导之中,中考也过去了。疯玩了一周多,等到出分的那天,很不可思议的,拿了一个还算可以的分数。然后又在突然的家庭变故之中迎来了暑假。</p> <p>八月初的时候,你突然提起来两天之后要来北京玩两周,想着什么换换心情,就打算每天陪着你出去瞎疯吧。</p> <p>然后你便来了北京,晚上九点半点在北京西站接到了你,然后把东西什么的丢到酒店,就拉着你一块出去溜了两圈。</p> <p>中日友好医院的北边有一条小路,叫健安东路,很清净,紧贴着元大都公园。那天就是拉着你一块走的那条路,只记得那天夜晚皎洁的月光很美。</p> <p>已经有将近一年不敢走那条路了,前两天心烦突然就走到那条路上了,还是和之前一样,路灯暗的和坏了一样,只不过北边的杨树已经越长越高了,可以挡住月光和北边的房屋,嗯,还有底下的花坛里长着淡黄色的小花。</p> <p>然后下边两周就陪着你瞎跑了很多地方,现在一想,只能想起来那次和神经病一样,从双井一路骑车到天通苑,还是共享单车。</p> <p>北京的夏天一如既往的很热,只能躲在树荫里骑车,你一边和我提着 “要是晚上出来就好了,至少还凉快一点”,一边哼唱「八月、某地、月光皎明」。然后休息的时候突然还问你带没带电吉他,说想听你弹个 Yorushika 的曲子,你笑着跟我说没带,然后摆摆手接着上路了。</p> <p>然后骑一半累了找了个便利店,看我掏了瓶可乐,然后你就给夺下来放回去了,告诉我说 “无糖的好歹还好点,侬,拿这瓶无糖的芬达就行,橙味的汽水不会出错的”,然后最后结账的时候你把所有东西堆在一块让我结的,一共你还欠我八块五。</p> <p>约着 24 年你高考完之后再来一趟北京之后,这 14 天和流水一样就过去了,感觉自从上了学之后时间就变得短了起来,也没多少时间和你谈天谈地了。</p> <p>北京是一个没有春天的城市。</p> <p>四月份的北京更是,只有草绿、花开、杨絮乱飘、我在过敏罢了。</p> <p>然后在 365 天之前,2023 年的 4 月 17 日,你突然就和我发了海子的 “面朝大海,春暖花开” 的一小段。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-plain" data-lang="plain"><span class="line"><span class="cl">“陌生人,我也为你祝福 </span></span><span class="line"><span class="cl">愿你有一个灿烂的前程 </span></span><span class="line"><span class="cl">愿你有情人终成眷属 </span></span><span class="line"><span class="cl">愿你在尘世获得幸福 </span></span><span class="line"><span class="cl">我只愿面朝大海,春暖花开。” </span></span></code></pre></td></tr></table> </div> </div><p>然后我就感觉应该不太对劲,于是疯狂和你发着消息,问着其他熟悉的朋友,然后得到了你吃安眠药的消息。</p> <p>然后无助的我就开始哭吧,印象很深的是那天我偷偷摸到麦当劳那边,麦当劳十点钟关的门,我坐在那里哭,店员看到也没有赶我走,给我打了一瓶水放在了桌子旁边。</p> <p>人在极度绝望的时候会相信奇迹,但奇迹不是所有时候都会出现的。</p> <p>那天一晚上都没睡着吧,十一点半的时候我才知道,以后再也看不见你了,也听不见声音什么的了。</p> <p>你是一个态度恶劣,自我,自私,幼稚的孩子,要是你今天还能在这里听我说教的话就更好了。</p> <p>第三次再想起来这张专辑已经是今年的四月份了,拿不拿的歌很美呢。但是要是告诉你直到现在,我还想着什么那天如果多做些什么就能挽回你之类的话,你一定会笑话我吧。</p> <p>摇滚的内核是反叛,你正是这反叛最好的印证。如果当时你对这世界还抱有一丝怀念的话,也不会选择去吃五倍量吧,明明知道自己会死去,临末了还和我说什么 “面朝大海,春暖花开” 之类的话。</p> <p>海子的诗真的很美啊,但是生命比什么春暖花开之类的更美丽吧。</p> <p>没关系啦,因为如此的夏日终会迎来终结,即使尚未开始。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span><span class="lnt">8 </span><span class="lnt">9 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-plain" data-lang="plain"><span class="line"><span class="cl">「朝、今日も駅の裏 人が立っていた, </span></span><span class="line"><span class="cl">夜の藍に花が咲く 絵を描いていた, </span></span><span class="line"><span class="cl">花詩 誓い 明日藍を飛ばせ, </span></span><span class="line"><span class="cl">貴方が居たくない今日を叫べ。」 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">“早上,今天的车站中 也站着许多人, </span></span><span class="line"><span class="cl">夜晚的靛青色中绽放出花朵 描绘着画, </span></span><span class="line"><span class="cl">花诗 誓言 明日放飞靛青色, </span></span><span class="line"><span class="cl">大声叫喊你不愿驻足的今日。” </span></span></code></pre></td></tr></table> </div> </div><p>要是忘记的话,你便会消失掉的。</p> <p>敲这片文的时候,耳机里放的是花水电车里的 「Meru」,里边提着什么 “感情如夕阳西下一样” 的话。北京今天的夕阳很美呢,橙色的夕阳逐渐融入在近处的高楼、远处的山峰之中,可惜你再也看不到了吧,也传达不到了吧,承诺什么都也根本不可能再实现了吧。</p> <p>要是忘记的话,便会回想起你。</p> <p>若是能再次回到那个夏天的话,请让我为你、我和那个如同昨日的夏天,献上一朵淡淡的黄花吧。</p> <p>以上,<br> 2024 年 4 月 16 日。</p>

2024/4/16
阅读更多

漫谈中国支付系统和银行系统: 一些有意思的事实

<h2 id="前言">前言 </h2><p>目前中国大陆的支付系统发展水平,可靠程度,承载负载等角度上来看,不客气地讲在全球应该能排第一,最大的银行卡组织(之一,即银联)在大陆,最大的零售网络清算体(网联清算)在大陆,世界最大的两个电子钱包服务提供商(即微信财付通和支付宝)也在大陆。</p> <p>支撑如此庞大支付市场的系统是央行的 CNAPS 2,也就是 China National Advanced Payments System 2。在中国大陆一切涉及到资金的清算无论如何都会绕到 CNAPS 上完成。</p> <p>一笔清算的完成都需要完成两个流上完成流动。</p> <ol> <li>信息流</li> <li>资金流</li> </ol> <p>CNAPS 支撑着资金流的流动,负责银行间头寸的划拨。其他支付系统 (如银联,以及非银机构的网联等)通过 PMTS (Payment Message Transmission System)和 CNAPS 交换数据,完成最后资金的流动。</p> <h2 id="有关卡组织的一些有趣的事实">有关卡组织的一些有趣的事实 </h2><p>卡组织的清算只需要完成信息流的流动,实际的资金划拨是由银行间自行协调完成的。</p> <h3 id="银行卡--卡组织清算历史">银行卡 &amp; 卡组织清算历史 </h3><p>最早在 1979 年秋季的广交会上,为了方便外宾交易,中国银行与东亚银行签署协议,代理东美 VISA 信用卡取现,这是国外信用卡第一次在中国内地用于交易。</p> <p>1986 年,由中银珠海分行提出的发展信用卡的报告被总行批准后,在珠海发行了大陆第一章信用卡,即 “中银卡”,此时还没有银联的出现。</p> <blockquote> <p> <picture> <source srcset="/post/china-payments-system/boc-zhongyinka_hu_92c7932c6764a517.webp" type="image/webp"> <source srcset="/post/china-payments-system/boc-zhongyinka.png"> <img src="/post/china-payments-system/boc-zhongyinka.png" width="300" height="192" srcset="/post/china-payments-system/boc-zhongyinka_hu_351bfe0870a54159.png 480w, /post/china-payments-system/boc-zhongyinka_hu_e2e73f6fb7b3aa22.png 1024w" loading="lazy" alt="中银卡" class="gallery-image" data-flex-grow="156" data-flex-basis="375px" isWebp="true" > </picture></p> <p>此时中国大陆还没有银联等卡组织的出现,一切清算都在行内完成。</p> </blockquote> <p>早期时,中国大陆还没有统一的跨行清算设施,甚至行内也不能跨省、跨市交易。POS、ATM 等是银行自己铺开的,你是什么银行的卡,就必须用什么银行的 POS、ATM 完成交易。</p> <blockquote> <p> <picture> <source srcset="/post/china-payments-system/boc-atmcard_hu_90d047c06f73d1a0.webp" type="image/webp"> <source srcset="/post/china-payments-system/boc-atmcard.png"> <img src="/post/china-payments-system/boc-atmcard.png" width="300" height="193" srcset="/post/china-payments-system/boc-atmcard_hu_f17a574d6f7b8076.png 480w, /post/china-payments-system/boc-atmcard_hu_cc334866f42a9d14.png 1024w" loading="lazy" alt="长城提款卡" class="gallery-image" data-flex-grow="155" data-flex-basis="373px" isWebp="true" > </picture></p> <p>长城提款卡,由中银珠海分行在 1987 年发行。是国内第一张提款卡,限于当时的电脑通讯设备的不足,当时并未实现全辖联网,而仅限于在珠海当地的储蓄所使用,因而类似于一个无人看守而又能完成提款的存钱柜。<br> 此卡片上有 MasterCard 的 logo,是未出现银联前的特殊产物,卡面有 Valid only in China,国内 90 年代末 21 世纪初,还不是所有银行都能全国通存通兑,更别提银行卡业务和跨境结算。 理论上说,发出的卡都是符合 MasterCard 标准的,全球网络可以通用。但是,位于国内的银行与外卡组织之间没有能够清算的通道(或许政策也不允许),授权不会成功而已。暂时没找到国内当时的制度依据,也有可能是外卡组织的要求,以避免与真正的国际卡(外汇卡)混淆。国内 90 年代末 21 世纪初,还不是所有银行都能全国通存通兑,更别提银行卡业务和跨境结算。</p> </blockquote> <p>1993 年,金卡工程开始实施。目的是在消费领域推广使用信用卡和现金卡,其中有一个重要的工作就是调和各个银行,推进银行卡联网通用。背后的本质其实就是需要建立一个全国性银行卡信息交换系统,经过最后的调研之后,决定成立一个全国银行卡联合组织,即银联。</p> <p>2002 年 3 月 26 日,中国银联股份有限公司在上海浦东正式成立。</p> <h3 id="关于银联--连通和已经由有了的万事网联">关于银联 &amp; 连通和已经由有了的万事网联 </h3><p>银联、杭州连通和万事网联目前是中国大陆唯三的持牌人民币银行卡清算业务提供商。一切在中国大陆内完成的持卡人民币清算都需要通过他们三位来完成清算。(同时银联也在中国大陆作为 ATM 网络存在,类似 Jetco / Cirrus / Plus)</p> <p>银联、连通和万事网联同时也是一个转接清算组织,接受支付机构的支付请求,下达对应的银行系统,最后利用央行的大小额系统(CNAPS 2 系统的重要组成部分之一)完成银行间的清算。</p> <p>下边将以银联为例简单的说一下清算流程。</p> <h4 id="银联与收单清算">银联与收单清算 </h4><p>银联作为一个银行卡清算组织,职责就是作为基础设施把整个银行卡支付、清结算的流程串起来,就像一个外包记账公司,帮助银行、商户在银行卡支付场景下记账,帐记清楚了之后再在一个大家约定好的时间进行实际的资金交割。</p> <p>一个典型的银联持卡交易流程是:</p> <ol> <li>持卡人在商户持卡消费</li> <li>商户对应的收单机构向银联发起授权,银联将授权转发至发卡银行</li> <li>授权得到批准后持卡人支付成功</li> <li>商家向收单机构请款,由银联最后完成清算将资金转入给收单机构或商户</li> </ol> <p>银联在清算过程中,存在两个清算流程:</p> <ul> <li> <p>跨行清算:针对收单机构和发卡机构的清算</p> <blockquote> <p>收付双方是发卡行和收单行,具体收单行要给商户结算多少钱、发卡行要扣持卡人多少钱不关银联的事情,银行和它的客户(持卡人、商户)之间具体的结算是银行自己的事情,理论上银联只要把银行间的帐记清楚了就行了。</p> </blockquote> </li> <li> <p>收单清算:代替收单机构针对商户和收单专业化服务机构的清算</p> <blockquote> <p>收付双方是银联和直连商户,作为银行卡清算组织,理论上来讲银联不应该同时充当收单机构。但是呢,银联同时也自己接入了一些商户,称之为 “直连商户”,把通过某些收单机构(如各大银行、第三方支付机构拉卡拉等)连接银联的商户叫作 “间连商户”。<br> 直连商户:商户的 POS 机直接连入银联系统,信息流从商户那里直接到了银联<br> 间连商户:商户的 POS 机先连入收单机构的系统,然后收单行再转发至银联系统</p> </blockquote> </li> </ul> <p>银联在每天完成日切后 (23:00),通过多边净额清算出一份清算结果,然后通过大小额系统完成资金交割。</p> <p>具体的来讲,中国银联是大额支付系统的 “特许参与者”,拥有极其高的权限,它可以直接操作其他人的清算账户,即可以贷记也可以借记其他人清算账户(在大额支付系统中称为 “即时转账业务”,仅允许特许参与者使用)。</p> <p>银联的清算账户开设在人民银行上海总部,这个清算账户是一个特许账户,银联通过和位于上海的 NPC 直连,可以直接为银联的参与行进行银行卡跨行交易的资金清算。</p> <p>下边是跨行清算的简单过程:</p> <ol> <li>银联系统完成日切后,通过多边净额清算出一份清算结果—— 一份以银联为一方,其他参与行为另一方的即时转账业务报文,然后发送给大额支付系统。</li> <li>大额支付系统检查无误后,提交 SAPS 进行轧差。</li> <li> <ul> <li>若这笔即时转账业务成功,银联会收到一份已完成的通知报文,相应的成员行也会收到一份借记/贷记的通知。</li> <li>若这笔即时转账业务失败,银联和成员行会收到一份排队中的报文。这时候付差的一方应该采取措施去解决一下队列。</li> </ul> </li> <li>如果等到这笔即时转账业务预关闭的时候还不能解决的话,银联会收到一笔该交易撤销的报文,这笔清算也就算是失败了,等到下一个工作日,银联会把失败的清算并到新一天的多边净额清算中,然后再如此往复。</li> </ol> <p>前面已经解释过什么叫做收单清算了,在跨行清算的流程里,还有一部分发卡行的资金被结算到了银联的清算账户里,在接下来的在收单清算的流程里,银联再通过小额支付系统将这些资金结算给直连商户。</p> <p>银联同时也是小额支付系统的特殊参与者。银联给商户的结算在小额系统里面叫做 “银联代理收单机构清算商户资金业务”。收单清算的清算流程就不多说了,通常在商户的开户行收到已轧差的消息后,就会给商户入账,然后等待小额支付系统结算。</p>

2024/1/31
阅读更多

重新开始 - 所以我尝试了一下 Hugo

<p>在疯狂的摆烂 n 年后,某个人终于想起来他还有个博客。经过好几分钟的思想斗争之后,他决定好好折腾它,以 Linux 为抓手,通过 Hugo 和 nginx 深度共建,对标 Hexo,打通原 Blog 与 Simple 之间的垂直领域屏障,实现多维矩阵闭环,为个人博客赋能(确信)。</p> <h2 id="why">Why </h2><h3 id="why-rebuild-it">Why rebuild it? </h3><p>相较重建而言,我个人感觉更应该称之为重启。</p> <p><del>这个博客建立至今其主人都没好好写过几篇文。</del></p> <p>更多意义上来,我更希望能写写一些有意思的东西,所以就重启了。</p> <h3 id="why-choose-hugo">Why choose Hugo? </h3><p>我使用 Hexo 驱动博客已经三年之久了,之前写过一个开源的 Hexo 主题(虽然没几个月就 make it Archived 了)。</p> <p>Hexo 对我而言过于臃肿,每次部署都要抓取不少 NPM Package,并且主题依赖的 node-sass 安装依赖 python2,对于现代的发行版而言 python2 基本已经被弃用,甚至完全被移除。</p> <p>反观 Hugo,作为 golang 编写的静态网站生成器,standalone 足够简单,并且基本满足我只需要关注于文本本身的要求。</p> <h2 id="so-we-start-with-hugo">So we start with Hugo </h2><h3 id="简单的配置-hugo">简单的配置 Hugo </h3><p>我使用了 <a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack" target="_blank" rel="noopener" >hugo-theme-stack</a> 作为主题。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">git submodule add https://github.com/CaiJimmy/hugo-theme-stack/ themes/stack </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;theme = &#39;stack&#39;&#34;</span> &gt;&gt; ./config/_default/config.toml </span></span></code></pre></td></tr></table> </div> </div><p>然后使用 <a class="link" href="https://github.com/SukkaW/DisqusJS" target="_blank" rel="noopener" >DisqusJS</a> 作为评论的实现方案。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="c"># config/_default/params.toml</span> </span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">comments</span><span class="p">.</span><span class="nx">disqusjs</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="nx">shortname</span> <span class="p">=</span> <span class="s2">&#34;secret&#34;</span> </span></span><span class="line"><span class="cl"><span class="nx">apiUrl</span> <span class="p">=</span> <span class="s2">&#34;https://disqus.skk.moe/disqus/&#34;</span> </span></span><span class="line"><span class="cl"><span class="nx">apiKey</span> <span class="p">=</span> <span class="s2">&#34;secret&#34;</span> </span></span><span class="line"><span class="cl"><span class="nx">admin</span> <span class="p">=</span> <span class="s2">&#34;real186526&#34;</span> </span></span><span class="line"><span class="cl"><span class="nx">adminLabel</span> <span class="p">=</span> <span class="s2">&#34;Admin&#34;</span> </span></span></code></pre></td></tr></table> </div> </div><p>作为 RSS 用户,Hugo 默认内嵌的 RSS 实现根本不够看。我在这里使用了 <a class="link" href="https://github.com/kaushalmodi/hugo-atom-feed" target="_blank" rel="noopener" >hugo-atom-feed</a> 来实现了 Atom。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">hugo mod init github.com/186526/blog.186526.xyz </span></span><span class="line"><span class="cl">hugo mod get -u github.com/kaushalmodi/hugo-atom-feed </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span><span class="lnt">8 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="c">## ./config/_default/module.toml</span> </span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">imports</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="nx">path</span> <span class="p">=</span> <span class="s2">&#34;github.com/kaushalmodi/hugo-atom-feed&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c">## ./config/_default/outputs.toml</span> </span></span><span class="line"><span class="cl"><span class="nx">home</span> <span class="p">=</span> <span class="p">[</span><span class="s2">&#34;HTML&#34;</span><span class="p">,</span> <span class="s2">&#34;RSS&#34;</span><span class="p">,</span> <span class="s2">&#34;ATOM&#34;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="nx">section</span> <span class="p">=</span> <span class="p">[</span><span class="s2">&#34;HTML&#34;</span><span class="p">,</span> <span class="s2">&#34;RSS&#34;</span><span class="p">,</span> <span class="s2">&#34;ATOM&#34;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="nx">taxonomy</span> <span class="p">=</span> <span class="p">[</span><span class="s2">&#34;HTML&#34;</span><span class="p">,</span> <span class="s2">&#34;RSS&#34;</span><span class="p">,</span> <span class="s2">&#34;ATOM&#34;</span><span class="p">]</span> </span></span></code></pre></td></tr></table> </div> </div><p>Atom 文件默认位于 /atom.xml 下。</p>

2023/11/4
阅读更多

Cloudflare Free Argo tunnel 白嫖计划

<blockquote> <p>之前看到了 <code>Cloudflare Blog</code> 更新了 <a class="link" href="https://blog.cloudflare.com/a-free-argo-tunnel-for-your-next-project/" target="_blank" rel="noopener" ><code>「A free Argo Tunnel for your next project」</code></a> 一文,最近终于有空闲时间,搭建一个测试一下。</p> </blockquote> <h2 id="why">Why </h2><h3 id="啥是-argo-tunnel">啥是 <code>Argo Tunnel</code> </h3><blockquote> <p>Argo 隧道提供了一种简便的方法,可将 Web 服务器安全地公开到 Internet,而无需打开防火墙端口和配置 ACL。 Argo 隧道还可以确保请求在到达网络服务器之前先通过 Cloudflare 进行路由,因此可以确保通过 Cloudflare 的 WAF 和 Unmetered DDoS 缓解功能停止了攻击流量,并且如果为帐户启用了这些功能,则可以通过 Access 进行身份验证。</p> <p>&ndash;翻译自 <a class="link" href="https://developers.cloudflare.com/argo-tunnel/" target="_blank" rel="noopener" ><code>Argo Tunnel -- Cloudflare Docs</code></a></p> </blockquote> <p>用人话理解 -&gt; 可以用 <code>NAT</code> 机子通过 <code>Argo Tunnel</code> 来穿透任意端口,并且还可以享受到 <code>Argo Smart Routing</code> 技术,极大幅度优化了回源速度,还有一大堆网络攻击保护技术也可以被启用。</p> <p>这不得爽死吗(</p> <h3 id="啥是-argo-smart-routing">啥是 <code>Argo Smart Routing</code> </h3><p><code>Argo Smart Routing</code> 是 <code>Cloudflare</code> 为优化回源性能所推出的一项技术,你可以在<a class="link" href="https://www.cloudflare.com/en-gb/products/argo-smart-routing/" target="_blank" rel="noopener" >这里</a>获得技术详情</p> <p>在未启用 <code>Argo Smart Routing</code> 前, <code>Cloudflare</code> 将会如此回源。</p> <ol> <li><code>Client</code> -&gt; <code>Cloudflare Edge Server</code></li> <li><code>Cloudflare Edge Server</code> -&gt; <code>Trafic over Normal Internet Node</code> -&gt; <code>Origin Server</code></li> </ol> <p>在启用 <code>Argo Smart Routing</code> 后, <code>Cloudflare</code> 将会如此回源。</p> <ol> <li><code>Client</code> -&gt; <code>Cloudflare Edge Server</code></li> <li><code>Cloudflare Edge Server</code> -&gt; <code>Trafic over The Fast*** links</code> -&gt; <code>Cloudflare Argo Server</code></li> <li><code>Cloudflare Argo Server</code> &lt;-&gt; <code>Origin Server</code></li> </ol> <p><del>(因某些词语违反广告法,已经进行处理)</del></p> <p>相较于未启用前,<code>Argo Smart Routing</code> 可以有效优化请求用时。</p> <h2 id="how">How </h2><h3 id="install-cloudflared">Install <a class="link" href="https://github.com/cloudflare/cloudflared" target="_blank" rel="noopener" ><code>Cloudflared</code></a> </h3><p><code>Cloudflared</code> 作为源服务器和 <code>Cloudflare Argo Server</code> 的链接件,是必不可少的。</p> <p>你可以参考<a class="link" href="https://github.com/cloudflare/cloudflared#installing-cloudflared" target="_blank" rel="noopener" >这里</a>的文档。</p> <ol> <li> <p>在 <code>macOS</code> 上安装:</p> <ul> <li>在<a class="link" href="https://github.com/cloudflare/cloudflared/releases" target="_blank" rel="noopener" >这里</a>下载 releases 来安装</li> <li>通过 <code>brew install cloudflare/cloudflare/cloudflared</code> 安装</li> </ul> </li> <li> <p>在 <code>Linux</code> 上安装:</p> <ul> <li>参考<a class="link" href="https://developers.cloudflare.com/argo-tunnel/getting-started/installation#linux" target="_blank" rel="noopener" >这里</a>进行安装</li> </ul> </li> <li> <p>在 <code>Windows</code> 上安装:</p> <ul> <li>在<a class="link" href="https://github.com/cloudflare/cloudflared/releases" target="_blank" rel="noopener" >这里</a>下载文件并打开当前路径的 <code>PowerShell</code> 备用</li> </ul> </li> </ol> <h3 id="login">Login </h3><p>在终端执行以下操作</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cloudflared login </span></span></code></pre></td></tr></table> </div> </div><p>选择 Tunnel 的域名,保存下来的证书请留下来备用。</p> <h3 id="run-hello-world">Run Hello world </h3><ol> <li> <p>将需要 Tunnel 的域名解析到 <code>Cloudflare Edge Server</code> (仅对于 CNAME 接入情况)</p> </li> <li> <p>运行以下 Command</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cloudflared tunnel --hostname &lt;tunnelDomain&gt; --hello-world </span></span></code></pre></td></tr></table> </div> </div></li> <li> <p>打开被 <code>Tunnel</code> 的域名,如果可以看到 <code>Congrats! You created a tunnel!</code> 一行,则说明你的执行成功,快去搞些有意思的事情吧(</p> </li> </ol> <h3 id="run-http-tunnel">Run HTTP Tunnel </h3><p>既然我们已经成功运行了 Demo,我们可以来搞一些有意思的东西,例如把 http 穿透出去</p> <ol> <li> <p>参考<a class="link" href="#run-hello-world" >#Run Hello World</a> 第一步对域名进行解析</p> </li> <li> <p>执行下列命令来穿透该 http 服务</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cloudflared tunnel --hostname &lt;tunnelDomain&gt; --url &lt;url&gt; </span></span></code></pre></td></tr></table> </div> </div></li> <li> <p>使用浏览器打开 <code>&lt;tunnelDomain&gt;</code> ,测试 http 服务是否被成功穿透</p> </li> </ol> <h3 id="run-tcp-tunnel">Run TCP Tunnel </h3><p><del>既然要追求刺激,就贯彻到底咯</del> 我们同样也可以通过 <code>Argo Tunnel</code> 对 TCP 请求进行转发 <code>Argo Tunnel</code> 的 TCP 转发依赖于 Cloudflare Access ,你需要在服务端以及客户端运行 <code>Cloudflared</code> 来转发数据</p> <ol> <li> <p>参考<a class="link" href="#run-hello-world" >#Run Hello World</a> 第一步对域名进行解析</p> </li> <li> <p>在服务端执行下列命令来启动一个 tcp 转发</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cloudflared tunnel --hostname &lt;tunnelDomain&gt; --url tcp://<span class="si">${</span><span class="nv">host</span><span class="si">}</span>:<span class="si">${</span><span class="nv">port</span><span class="si">}</span> </span></span></code></pre></td></tr></table> </div> </div></li> <li> <p>在客户端进行登陆</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cloudflared login </span></span></code></pre></td></tr></table> </div> </div></li> <li> <p>启动 <code>client</code> 侧的转发</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cloudflared access tcp --tunnel-host &lt;tunnelDomain&gt; --url tcp://0.0.0.0:<span class="si">${</span><span class="nv">localport</span><span class="si">}</span> </span></span></code></pre></td></tr></table> </div> </div></li> <li> <p>访问本地的 <code>0.0.0.0:${localPort}</code> TCP 转发就成功了</p> </li> </ol> <blockquote> <p>p.s. Cloudflare Access 现暂不支持 UDP 转发</p> </blockquote>

2021/1/13
阅读更多

「 Run short links service with aka 」- 如何部署aka

<blockquote>一个简单的 aka 部署教程。</blockquote><h3 id="警告">警告 </h3><p>aka 已被弃用。</p> <blockquote> <p><a class="link" href="https://github.com/186526/aka" target="_blank" rel="noopener" >aka</a> (Also Known As) 是一个简洁,快速,前后端分离,运行于 <code>Cloudflare</code> 的短网址服务。</p> <!-- more --> <p>Demo: <a class="link" href="https://186.rip" target="_blank" rel="noopener" >186.rip</a></p> </blockquote> <p>aka 分别有两个 <code>Worker</code> 组成,分别是其的的前端以及后端,你需要在本地安装 <code>node &gt; 12</code> 的环境来支持其部署。</p> <h2 id="本次部署所用环境">本次部署所用环境 </h2><p>本次教程使用 <code>node v12.19.0</code> <code>wrangler 1.12.3</code> <code>Debian GNU/Linux 10 (buster) in a Docker Container , The Host uses Archlinux</code></p> <h2 id="安装所需工具">安装所需工具 </h2><p>你需要拥有一个良好的网络链接,并拥有一个可用的域名并已经绑定至 Cloudflare。</p> <h3 id="安装-wrangler">安装 <a class="link" href="https://github.com/cloudflare/wrangler" target="_blank" rel="noopener" ><code>wrangler</code></a> </h3><p><code>wrangler</code> 是一个 <code>Worker</code> 部署工具,你可以使用其来部署 <code>Worker</code>。</p> <p>你可以和我一样,选择使用 <code>npm</code> 进行安装。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-Bash" data-lang="Bash"><span class="line"><span class="cl">npm i @cloudflare/wrangler -g </span></span></code></pre></td></tr></table> </div> </div><blockquote> <p>如果你使用 <code>Windows</code> ,你可以选择下载并安装 <code>wrangler</code> 的<a class="link" href="https://github.com/cloudflare/wrangler/releases/latest" target="_blank" rel="noopener" >二进制包</a>。</p> </blockquote> <h3 id="在-wrangler-中登陆帐号">在 <code>wrangler</code> 中登陆帐号 </h3><p>使用 <code>wrangler login</code> 来进行授权。</p> <h3 id="下载本项目并安装对应依赖">下载本项目,并安装对应依赖 </h3><p>这里推荐使用 <code>git</code> 来拉取本项目,并使用 <code>npm</code> 作为包管理</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-Bash" data-lang="Bash"><span class="line"><span class="cl">$ git clone https://github.com/186526/aka.git </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Cloning into <span class="s1">&#39;aka&#39;</span>... </span></span><span class="line"><span class="cl">remote: Enumerating objects: 157, <span class="k">done</span>. </span></span><span class="line"><span class="cl">remote: Counting objects: 100% <span class="o">(</span>157/157<span class="o">)</span>, <span class="k">done</span>. </span></span><span class="line"><span class="cl">remote: Compressing objects: 100% <span class="o">(</span>96/96<span class="o">)</span>, <span class="k">done</span>. </span></span><span class="line"><span class="cl">remote: Total <span class="m">157</span> <span class="o">(</span>delta 63<span class="o">)</span>, reused <span class="m">148</span> <span class="o">(</span>delta 54<span class="o">)</span>, pack-reused <span class="m">0</span> </span></span><span class="line"><span class="cl">Receiving objects: 100% <span class="o">(</span>157/157<span class="o">)</span>, 468.87 KiB <span class="p">|</span> 23.00 KiB/s, <span class="k">done</span>. </span></span><span class="line"><span class="cl">Resolving deltas: 100% <span class="o">(</span>63/63<span class="o">)</span>, <span class="k">done</span>. </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">$ <span class="nb">cd</span> aka </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">$ <span class="nb">cd</span> frontend </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">$ npm i </span></span></code></pre></td></tr></table> </div> </div><h2 id="后端部署">后端部署 </h2><h3 id="修改配置">修改配置 </h3><p>打开 <code>aka/backend</code> 文件夹,你可以找到一个名为 <code>wrangler.example.toml</code> 的文件。 该文件是 <code>aka/backend</code> 的 <code>wrangler</code> 默认配置文件。</p> <p>将其重命名为 <code>wrangler.toml</code> ,并修改其内容</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="c">## Worker名称</span> </span></span><span class="line"><span class="cl"><span class="nx">name</span> <span class="p">=</span> <span class="s2">&#34;aka&#34;</span> </span></span><span class="line"><span class="cl"><span class="c">## 项目配置信息,不要修改</span> </span></span><span class="line"><span class="cl"><span class="nx">type</span> <span class="p">=</span> <span class="s2">&#34;javascript&#34;</span> </span></span><span class="line"><span class="cl"><span class="c">## accound_id 必须修改 可以在 「 Domain - API - Account ID 」 找到</span> </span></span><span class="line"><span class="cl"><span class="nx">account_id</span> <span class="p">=</span> <span class="s2">&#34;&lt;account_id&gt;&#34;</span> </span></span><span class="line"><span class="cl"><span class="c">## worker.dev 域名分配,可关闭</span> </span></span><span class="line"><span class="cl"><span class="nx">workers_dev</span> <span class="p">=</span> <span class="kc">true</span> </span></span><span class="line"><span class="cl"><span class="c">## cloudflare route,若绑定自己域名需修改&lt;domain&gt;为自己域名</span> </span></span><span class="line"><span class="cl"><span class="nx">route</span> <span class="p">=</span> <span class="s2">&#34;&lt;domain&gt;/*&#34;</span> </span></span><span class="line"><span class="cl"><span class="c">## zone_id 只有在需要绑定域名时填写,可以在 「 Domain - API - Zone ID 」找到。</span> </span></span><span class="line"><span class="cl"><span class="nx">zone_id</span> <span class="p">=</span> <span class="s2">&#34;&lt;zone_id&gt;&#34;</span> </span></span><span class="line"><span class="cl"><span class="c">## &lt;kv id&gt; 填写为下文挂载的 kv</span> </span></span><span class="line"><span class="cl"><span class="nx">kv_namespaces</span> <span class="p">=</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span> <span class="nx">binding</span> <span class="p">=</span> <span class="s2">&#34;__aka__&#34;</span><span class="p">,</span> <span class="nx">id</span> <span class="p">=</span> <span class="s2">&#34;&lt;kv id&gt;&#34;</span> <span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="p">]</span> </span></span></code></pre></td></tr></table> </div> </div><h3 id="新建-kv-并挂载到对应项目">新建 <code>KV</code> 并挂载到对应项目 </h3><p>这里使用 <code>wrangler</code> 新建 <code>kv</code></p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-Bash" data-lang="Bash"><span class="line"><span class="cl">$ wrangler kv:namespace create __aka__ </span></span><span class="line"><span class="cl">🌀 Creating namespace with title <span class="s2">&#34;aka-__aka__&#34;</span> </span></span><span class="line"><span class="cl">✨ Success! </span></span><span class="line"><span class="cl">Add the following to your configuration file in your kv_namespaces array: </span></span><span class="line"><span class="cl"><span class="o">{</span> <span class="nv">binding</span> <span class="o">=</span> <span class="s2">&#34;__aka__&#34;</span>, <span class="nv">id</span> <span class="o">=</span> <span class="s2">&#34;*********&#34;</span> <span class="o">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>将 <code>id</code> 的内容复制到上处 <code>wrangler.toml</code> 的 <code>&lt;kv id&gt;</code>。</p> <h3 id="部署后端-">部署后端 🚀 </h3><p>当你已经确保本地的配置已经没有问题时,可以准备部署该项目了。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ wrangler publish </span></span><span class="line"><span class="cl">✨ JavaScript project found. Skipping unnecessary build! </span></span><span class="line"><span class="cl">✨ Successfully published your script to </span></span><span class="line"><span class="cl"> 16sl.ga/* <span class="o">=</span>&gt; stayed the same </span></span></code></pre></td></tr></table> </div> </div><h4 id="验证部署">验证部署 </h4><p>这里使用 <code>curl</code> 请求 api 来测试部署是否成功</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -X POST -H <span class="s1">&#39;Content-Type: application/json&#39;</span> -d <span class="s1">&#39;{&#34;jsonrpc&#34;:&#34;2.0&#34;,&#34;id&#34;:3,&#34;method&#34;:&#34;create&#34;,&#34;params&#34;:{&#34;name&#34;:&#34;186rip&#34;,&#34;url&#34;:&#34;https://186.rip&#34;}}&#39;</span> https://&lt;your_domain&gt;/api/jsonrpc <span class="p">|</span> jq </span></span></code></pre></td></tr></table> </div> </div><p>当返回值为下面这样时,表明你的后端安装没问题,快去安装前端吧(</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;jsonrpc&#34;</span><span class="p">:</span> <span class="s2">&#34;2.0&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;result&#34;</span><span class="p">:</span> <span class="s2">&#34;/186rip&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="mi">3</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h2 id="前端部署">前端部署 </h2><h3 id="修改配置文件">修改配置文件 </h3><p>打开 <code>aka/frontend</code> 文件夹,你可以找到一个名为 <code>wrangler.example.toml</code> 的文件。 该文件是 <code>aka/frontend</code> 的 <code>wrangler</code> 默认配置文件。</p> <p>将其重命名为 <code>wrangler.toml</code> ,并修改其内容</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="c">## 项目名称</span> </span></span><span class="line"><span class="cl"><span class="nx">name</span> <span class="p">=</span> <span class="s2">&#34;aka_frontend&#34;</span> </span></span><span class="line"><span class="cl"><span class="c">## 项目类型 不要修改</span> </span></span><span class="line"><span class="cl"><span class="nx">type</span> <span class="p">=</span> <span class="s2">&#34;webpack&#34;</span> </span></span><span class="line"><span class="cl"><span class="c">## 用户ID 看上文如何获取</span> </span></span><span class="line"><span class="cl"><span class="nx">account_id</span> <span class="p">=</span> <span class="s2">&#34;&lt;account_id&gt;&#34;</span> </span></span><span class="line"><span class="cl"><span class="c">## worker.dev域名 可修改</span> </span></span><span class="line"><span class="cl"><span class="nx">workers_dev</span> <span class="p">=</span> <span class="kc">true</span> </span></span><span class="line"><span class="cl"><span class="c">## Clouflare Route,请将 &lt;domain&gt; 修改为上面所用域名</span> </span></span><span class="line"><span class="cl"><span class="nx">routes</span> <span class="p">=</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&lt;domain&gt;/cdn-sources/*&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&lt;domain&gt;/sw.js&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&lt;domain&gt;/js/*&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&lt;domain&gt;/css/*&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&lt;domain&gt;/&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&lt;domain&gt;/index.html&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&lt;domain&gt;/assets/*&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&lt;domain&gt;/web_modules/*&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&lt;domain&gt;/_dist_/*&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&lt;domain&gt;/__snowpack__/*&#34;</span> </span></span><span class="line"><span class="cl"><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="c">## zone_id 看上文进行修改</span> </span></span><span class="line"><span class="cl"><span class="nx">zone_id</span> <span class="p">=</span> <span class="s2">&#34;&lt;zone_id&gt;&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">site</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="c">## Cloudflare Worker kv website的存储桶设置,不建议进行修改</span> </span></span><span class="line"><span class="cl"><span class="nx">bucket</span> <span class="p">=</span> <span class="s2">&#34;./build&#34;</span> </span></span><span class="line"><span class="cl"><span class="c">## 编译时所用worker,不要修改</span> </span></span><span class="line"><span class="cl"><span class="nx">entry-point</span> <span class="p">=</span> <span class="s2">&#34;workers-site&#34;</span> </span></span></code></pre></td></tr></table> </div> </div><h3 id="部署前端-">部署前端 🚀 </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-Bash" data-lang="Bash"><span class="line"><span class="cl">$ npm run build </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">&gt; @ build /workspaces/aka/frontend </span></span><span class="line"><span class="cl">&gt; snowpack build<span class="p">;</span>mv ./build/_dist_/sw.js ./build/sw.js<span class="p">;</span>node ./build.mjs </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="o">[</span>snowpack<span class="o">]</span> ! building <span class="nb">source</span> files... </span></span><span class="line"><span class="cl"><span class="o">[</span>snowpack<span class="o">]</span> ✔ build <span class="nb">complete</span> <span class="o">[</span>0.06s<span class="o">]</span> </span></span><span class="line"><span class="cl"><span class="o">[</span>snowpack<span class="o">]</span> ! installing dependencies... </span></span><span class="line"><span class="cl"><span class="o">[</span>snowpack<span class="o">]</span> ✔ install complete! <span class="o">[</span>2.76s<span class="o">]</span> </span></span><span class="line"><span class="cl"><span class="o">[</span>snowpack<span class="o">]</span> ! verifying build... </span></span><span class="line"><span class="cl"><span class="o">[</span>snowpack<span class="o">]</span> ✔ verification <span class="nb">complete</span> <span class="o">[</span>0.01s<span class="o">]</span> </span></span><span class="line"><span class="cl"><span class="o">[</span>snowpack<span class="o">]</span> ! writing build to disk... </span></span><span class="line"><span class="cl"><span class="o">[</span>snowpack<span class="o">]</span> ! optimizing build... </span></span><span class="line"><span class="cl"> Asset Size Chunks Chunk Names </span></span><span class="line"><span class="cl"> js/index.026479135f133c2ca9ad.js <span class="m">121</span> KiB <span class="m">0</span> <span class="o">[</span>emitted<span class="o">]</span> <span class="o">[</span>immutable<span class="o">]</span> index </span></span><span class="line"><span class="cl">js/index.026479135f133c2ca9ad.js.LICENSE.txt <span class="m">95</span> bytes <span class="o">[</span>emitted<span class="o">]</span> </span></span><span class="line"><span class="cl"> js/webpack-runtime.5072755c7971ba0e8aa3.js 1.46 KiB <span class="m">1</span> <span class="o">[</span>emitted<span class="o">]</span> <span class="o">[</span>immutable<span class="o">]</span> webpack-runtime </span></span><span class="line"><span class="cl"> manifest.json <span class="m">223</span> bytes <span class="o">[</span>emitted<span class="o">]</span> </span></span><span class="line"><span class="cl"><span class="o">[</span>snowpack<span class="o">]</span> ✔ optimize <span class="nb">complete</span> <span class="o">[</span>5.75s<span class="o">]</span> </span></span><span class="line"><span class="cl"><span class="o">[</span>snowpack<span class="o">]</span> ▶ Build Complete! <span class="c1">## 当你看到该句时,表明编译成功</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="o">(</span>node:16309<span class="o">)</span> ExperimentalWarning: The ESM module loader is experimental. </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">$ wrangler publish </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">⚠️ The following routes in your configuration file should have a trailing * to apply the Worker on every path, otherwise your site will not behave as expected. </span></span><span class="line"><span class="cl">16sl.ga/sw.js </span></span><span class="line"><span class="cl">16sl.ga/ </span></span><span class="line"><span class="cl">16sl.ga/index.html </span></span><span class="line"><span class="cl">✨ Built successfully, built project size is <span class="m">13</span> KiB. </span></span><span class="line"><span class="cl">🌀 Using namespace <span class="k">for</span> Workers Site <span class="s2">&#34;__aka_frontend-workers_sites_assets&#34;</span> </span></span><span class="line"><span class="cl">✨ Success </span></span><span class="line"><span class="cl">🌀 Uploading site files </span></span><span class="line"><span class="cl">✨ Successfully published your script to </span></span><span class="line"><span class="cl"> 16sl.ga/cdn-sources/* <span class="o">=</span>&gt; stayed the same </span></span><span class="line"><span class="cl"> 16sl.ga/sw.js <span class="o">=</span>&gt; stayed the same </span></span><span class="line"><span class="cl"> 16sl.ga/js/* <span class="o">=</span>&gt; stayed the same </span></span><span class="line"><span class="cl"> 16sl.ga/css/* <span class="o">=</span>&gt; stayed the same </span></span><span class="line"><span class="cl"> 16sl.ga/ <span class="o">=</span>&gt; stayed the same </span></span><span class="line"><span class="cl"> 16sl.ga/index.html <span class="o">=</span>&gt; stayed the same </span></span><span class="line"><span class="cl"> 16sl.ga/assets/* <span class="o">=</span>&gt; stayed the same </span></span><span class="line"><span class="cl"> 16sl.ga/web_modules/* <span class="o">=</span>&gt; stayed the same </span></span><span class="line"><span class="cl"> 16sl.ga/_dist_/* <span class="o">=</span>&gt; stayed the same </span></span><span class="line"><span class="cl"> 16sl.ga/__snowpack__/* <span class="o">=</span>&gt; stayed the same </span></span></code></pre></td></tr></table> </div> </div><p>至此,aka 的整个部署完成了。</p>

2021/1/2
阅读更多

如何使用 debootstrap 构建一个最小化的Ubuntu

<blockquote>一个简单的 debootstrap 部署教程。</blockquote><blockquote> <p>debootstrap 是 Debian 及其附属分支下的一个工具,用来构建一套基本的系统(根文件系统)。生成的目录符合 Linux 文件系统标准(FHS),即包含了 /boot、/etc、/bin、/usr 等等目录,但它比发行版本的 Linux 体积小很多</p> </blockquote> <h2 id="debootstrap-介绍">debootstrap 介绍 </h2><h3 id="啥是-debootstrap">啥是 debootstrap </h3><p>debootstrap 是 Debian 及其附属分支下的一个工具,用来构建一套基本的系统(根文件系统)。生成的目录符合 Linux 文件系统标准(FHS),即包含了 /boot、/etc、/bin、/usr 等等目录,但它比发行版本的 Linux 体积小很多</p> <p><del>似曾相识燕归来</del></p> <h3 id="debootstrap-有啥用">debootstrap 有啥用 </h3><p>debootstrap 可以用来快速 简便的构建一个最小化的 debian 及其附属分支的最小化 rootfs</p> <p>我们可以用其构建一个最小化的 rootfs (主要是这个相较于 Ubuntu Server 版本还是小得多)</p> <h3 id="如何使用-debootstrap">如何使用 debootstrap </h3><p>其实 使用 debootstrap 很简单 它已经被放入到默认源了 我们只需要 apt install 即可</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt install debootstrap </span></span></code></pre></td></tr></table> </div> </div><p>如何使用呢 <del>自己看</del> 详情 wiki</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo debootstrap <span class="o">[</span>--arch 架构(可选项)<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></span></code></pre></td></tr></table> </div> </div><h2 id="开始动手构建自己的-ubuntu">开始动手构建自己的 Ubuntu </h2><p>我们这里使用 Ubuntu Server 20.04 作为 Live CD 来进行构建</p> <h3 id="进入-shell-并安装-debootstrap">进入 Shell 并安装 debootstrap </h3><p><img src="https://cdn.jsdelivr.net/gh/186526/jsdelivr@master/img/Ubuntu%20ISO.png" loading="lazy" alt="Ubuntu ISO shell" ></p> <ol> <li> <p>点击 Help</p> </li> <li> <p>Enter Shell</p> </li> <li> <p>(可选)修改 sources.list</p> </li> <li> <p>update sourcelist 并安装 debootstrap</p> </li> </ol> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span><span class="lnt">47 </span><span class="lnt">48 </span><span class="lnt">49 </span><span class="lnt">50 </span><span class="lnt">51 </span><span class="lnt">52 </span><span class="lnt">53 </span><span class="lnt">54 </span><span class="lnt">55 </span><span class="lnt">56 </span><span class="lnt">57 </span><span class="lnt">58 </span><span class="lnt">59 </span><span class="lnt">60 </span><span class="lnt">61 </span><span class="lnt">62 </span><span class="lnt">63 </span><span class="lnt">64 </span><span class="lnt">65 </span><span class="lnt">66 </span><span class="lnt">67 </span><span class="lnt">68 </span><span class="lnt">69 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo apt update <span class="o">&amp;&amp;</span> apt install debootstrap </span></span><span class="line"><span class="cl"> Ign:1 cdrom://Ubuntu-Server 20.04 LTS _Focal Fossa_ - Release amd64 <span class="o">(</span>20200423<span class="o">)</span> focal InRelease </span></span><span class="line"><span class="cl"> Hit:2 cdrom://Ubuntu-Server 20.04 LTS _Focal Fossa_ - Release amd64 <span class="o">(</span>20200423<span class="o">)</span> focal Release </span></span><span class="line"><span class="cl"> Get:4 http://mirrors.aliyun.com/ubuntu focal InRelease <span class="o">[</span><span class="m">265</span> kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:5 http://mirrors.aliyun.com/ubuntu focal-updates InRelease <span class="o">[</span><span class="m">107</span> kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:6 http://mirrors.aliyun.com/ubuntu focal-backports InRelease <span class="o">[</span>98.3 kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:7 http://mirrors.aliyun.com/ubuntu focal-security InRelease <span class="o">[</span><span class="m">107</span> kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:8 http://mirrors.aliyun.com/ubuntu focal/main amd64 Packages <span class="o">[</span><span class="m">970</span> kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:9 http://mirrors.aliyun.com/ubuntu focal/main Translation-en <span class="o">[</span><span class="m">506</span> kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:10 http://mirrors.aliyun.com/ubuntu focal/main amd64 c-n-f Metadata <span class="o">[</span>29.5 kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:11 http://mirrors.aliyun.com/ubuntu focal/restricted amd64 Packages <span class="o">[</span>22.0 kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:12 http://mirrors.aliyun.com/ubuntu focal/restricted Translation-en <span class="o">[</span><span class="m">6212</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:13 http://mirrors.aliyun.com/ubuntu focal/restricted amd64 c-n-f Metadata <span class="o">[</span><span class="m">392</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:14 http://mirrors.aliyun.com/ubuntu focal/universe amd64 Packages <span class="o">[</span><span class="m">8628</span> kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:15 http://mirrors.aliyun.com/ubuntu focal/universe Translation-en <span class="o">[</span><span class="m">5124</span> kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:16 http://mirrors.aliyun.com/ubuntu focal/universe amd64 c-n-f Metadata <span class="o">[</span><span class="m">265</span> kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:17 http://mirrors.aliyun.com/ubuntu focal/multiverse amd64 Packages <span class="o">[</span><span class="m">144</span> kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:18 http://mirrors.aliyun.com/ubuntu focal/multiverse Translation-en <span class="o">[</span><span class="m">104</span> kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:19 http://mirrors.aliyun.com/ubuntu focal/multiverse amd64 c-n-f Metadata <span class="o">[</span><span class="m">9136</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:20 http://mirrors.aliyun.com/ubuntu focal-updates/main amd64 Packages <span class="o">[</span><span class="m">197</span> kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:21 http://mirrors.aliyun.com/ubuntu focal-updates/main Translation-en <span class="o">[</span>77.7 kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:22 http://mirrors.aliyun.com/ubuntu focal-updates/main amd64 c-n-f Metadata <span class="o">[</span><span class="m">5676</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:23 http://mirrors.aliyun.com/ubuntu focal-updates/restricted amd64 Packages <span class="o">[</span>11.0 kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:24 http://mirrors.aliyun.com/ubuntu focal-updates/restricted Translation-en <span class="o">[</span><span class="m">3000</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:25 http://mirrors.aliyun.com/ubuntu focal-updates/restricted amd64 c-n-f Metadata <span class="o">[</span><span class="m">116</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:26 http://mirrors.aliyun.com/ubuntu focal-updates/universe amd64 Packages <span class="o">[</span><span class="m">110</span> kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:27 http://mirrors.aliyun.com/ubuntu focal-updates/universe Translation-en <span class="o">[</span>51.9 kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:28 http://mirrors.aliyun.com/ubuntu focal-updates/universe amd64 c-n-f Metadata <span class="o">[</span><span class="m">4092</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:29 http://mirrors.aliyun.com/ubuntu focal-updates/multiverse amd64 Packages <span class="o">[</span><span class="m">1172</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:30 http://mirrors.aliyun.com/ubuntu focal-updates/multiverse Translation-en <span class="o">[</span><span class="m">540</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:31 http://mirrors.aliyun.com/ubuntu focal-updates/multiverse amd64 c-n-f Metadata <span class="o">[</span><span class="m">116</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:32 http://mirrors.aliyun.com/ubuntu focal-backports/main amd64 c-n-f Metadata <span class="o">[</span><span class="m">112</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:33 http://mirrors.aliyun.com/ubuntu focal-backports/restricted amd64 c-n-f Metadata <span class="o">[</span><span class="m">116</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:34 http://mirrors.aliyun.com/ubuntu focal-backports/universe amd64 Packages <span class="o">[</span><span class="m">2784</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:35 http://mirrors.aliyun.com/ubuntu focal-backports/universe Translation-en <span class="o">[</span><span class="m">1272</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:36 http://mirrors.aliyun.com/ubuntu focal-backports/universe amd64 c-n-f Metadata <span class="o">[</span><span class="m">192</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:37 http://mirrors.aliyun.com/ubuntu focal-backports/multiverse amd64 c-n-f Metadata <span class="o">[</span><span class="m">116</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:38 http://mirrors.aliyun.com/ubuntu focal-security/main amd64 Packages <span class="o">[</span><span class="m">106</span> kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:46 http://mirrors.aliyun.com/ubuntu focal-security/universe amd64 c-n-f Metadata <span class="o">[</span><span class="m">1612</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:47 http://mirrors.aliyun.com/ubuntu focal-security/multiverse amd64 Packages <span class="o">[</span><span class="m">1172</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:48 http://mirrors.aliyun.com/ubuntu focal-security/multiverse Translation-en <span class="o">[</span><span class="m">540</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Get:49 http://mirrors.aliyun.com/ubuntu focal-security/multiverse amd64 c-n-f Metadata <span class="o">[</span><span class="m">116</span> B<span class="o">]</span> </span></span><span class="line"><span class="cl"> Fetched 17.1 MB in 6s <span class="o">(</span><span class="m">3096</span> kB/s<span class="o">)</span> </span></span><span class="line"><span class="cl"> Reading package lists... Done </span></span><span class="line"><span class="cl"> Building dependency tree </span></span><span class="line"><span class="cl"> Reading state information... Done </span></span><span class="line"><span class="cl"> <span class="m">65</span> packages can be upgraded. Run <span class="s1">&#39;apt list --upgradable&#39;</span> to see them. </span></span><span class="line"><span class="cl"> Reading package lists... Done </span></span><span class="line"><span class="cl"> Building dependency tree </span></span><span class="line"><span class="cl"> Reading state information... Done </span></span><span class="line"><span class="cl"> Suggested packages: </span></span><span class="line"><span class="cl"> arch-test squid-deb-proxy-client </span></span><span class="line"><span class="cl"> The following NEW packages will be installed: </span></span><span class="line"><span class="cl"> debootstrap </span></span><span class="line"><span class="cl"> <span class="m">0</span> upgraded, <span class="m">1</span> newly installed, <span class="m">0</span> to remove and <span class="m">65</span> not upgraded. </span></span><span class="line"><span class="cl"> Need to get 39.4 kB of archives. </span></span><span class="line"><span class="cl"> After this operation, <span class="m">299</span> kB of additional disk space will be used. </span></span><span class="line"><span class="cl"> Get:1 http://mirrors.aliyun.com/ubuntu focal-updates/main amd64 debootstrap all 1.0.118ubuntu1.1 <span class="o">[</span>39.4 kB<span class="o">]</span> </span></span><span class="line"><span class="cl"> Fetched 39.4 kB in 0s <span class="o">(</span><span class="m">221</span> kB/s<span class="o">)</span> </span></span><span class="line"><span class="cl"> Selecting previously unselected package debootstrap. </span></span><span class="line"><span class="cl"> <span class="o">(</span>Reading database ... <span class="m">33860</span> files and directories currently installed.<span class="o">)</span> </span></span><span class="line"><span class="cl"> Preparing to unpack .../debootstrap_1.0.118ubuntu1.1_all.deb ... </span></span><span class="line"><span class="cl"> Unpacking debootstrap <span class="o">(</span>1.0.118ubuntu1.1<span class="o">)</span> ... </span></span><span class="line"><span class="cl"> Setting up debootstrap <span class="o">(</span>1.0.118ubuntu1.1<span class="o">)</span> ... </span></span><span class="line"><span class="cl"> Processing triggers <span class="k">for</span> man-db <span class="o">(</span>2.9.1-1<span class="o">)</span> ... </span></span><span class="line"><span class="cl">$ debootstrap </span></span><span class="line"><span class="cl"> I: usage: <span class="o">[</span>OPTION<span class="o">]</span>... &lt;suite&gt; &lt;target&gt; <span class="o">[</span>&lt;mirror&gt; <span class="o">[</span>&lt;script&gt;<span class="o">]]</span> </span></span><span class="line"><span class="cl"> I: Try <span class="sb">`</span>debootstrap --help<span class="err">&#39;</span> <span class="k">for</span> more information. </span></span><span class="line"><span class="cl"> E: You must specify a suite and a target. </span></span></code></pre></td></tr></table> </div> </div><h3 id="给硬盘分区">给硬盘分区 </h3><p>这步没啥好说的 用 cfdisk 进行分区 使用 mkfs.ext4 来格式化硬盘(请记住如何分区的!!!!(后面编写 fstab 会涉及到))</p> <table> <thead> <tr> <th>/dev 路径</th> <th>挂载位置</th> <th>分区模式</th> <th>作用</th> </tr> </thead> <tbody> <tr> <td>/dev/sda1</td> <td>/boot</td> <td>fat32</td> <td>负责 efi 引导</td> </tr> <tr> <td>/dev/sda2</td> <td>swap</td> <td>swap</td> <td>内存交换</td> </tr> <tr> <td>/dev/sda3</td> <td>/</td> <td>ext4</td> <td>根目录</td> </tr> </tbody> </table> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ mkfs.ext4 /dev/sda3 </span></span><span class="line"><span class="cl">mke2fs 1.45.5 <span class="o">(</span>07-Jan-2020<span class="o">)</span> </span></span><span class="line"><span class="cl">Creating filesystem with <span class="m">9311995</span> 4k blocks and <span class="m">2330160</span> inodes </span></span><span class="line"><span class="cl">Filesystem UUID: fbe7f7fe-1997-4ab3-929f-52aa73aa72eb </span></span><span class="line"><span class="cl">Superblock backups stored on blocks: </span></span><span class="line"><span class="cl"> 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, </span></span><span class="line"><span class="cl"> 4096000, <span class="m">7962624</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Allocating group tables: <span class="k">done</span> </span></span><span class="line"><span class="cl">Writing inode tables: <span class="k">done</span> </span></span><span class="line"><span class="cl">Creating journal <span class="o">(</span><span class="m">65536</span> blocks<span class="o">)</span>: <span class="k">done</span> </span></span><span class="line"><span class="cl">Writing superblocks and filesystem accounting information: <span class="k">done</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">$ mkswap /dev/sda2 </span></span><span class="line"><span class="cl">Setting up swapspace version 1, <span class="nv">size</span> <span class="o">=</span> <span class="m">4</span> GiB <span class="o">(</span><span class="m">4294963200</span> bytes<span class="o">)</span>s </span></span><span class="line"><span class="cl">no label, <span class="nv">UUID</span><span class="o">=</span>9fe83e8e-cd78-4a25-8a1e-ab305181c46d </span></span><span class="line"><span class="cl">$ swapon /dev/sda2 </span></span><span class="line"><span class="cl">$ mkfs.vfat /dev/sda1 </span></span><span class="line"><span class="cl">mkfs.fat 4.1 <span class="o">(</span>2017-01-24<span class="o">)</span> </span></span></code></pre></td></tr></table> </div> </div><h3 id="挂载分区并释放-rootfs">挂载分区并释放 rootfs </h3><p>这里构建选择最新的 Focal X86_64 位</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ mkdir /target </span></span><span class="line"><span class="cl">$ mount /dev/sda3 /target </span></span><span class="line"><span class="cl">$ debootstrap focal /target http://mirrors.aliyun.com/ubuntu </span></span><span class="line"><span class="cl">I: Retrieving InRelease </span></span><span class="line"><span class="cl">I: Checking Release signature </span></span><span class="line"><span class="cl">I: Valid Release signature <span class="o">(</span>key id F6ECB3762474EDA9D21B7022871920D1991BC93C<span class="o">)</span> </span></span><span class="line"><span class="cl">I: Retrieving Packages </span></span><span class="line"><span class="cl">I: Validating Packages </span></span><span class="line"><span class="cl">I: Resolving dependencies of required packages... </span></span><span class="line"><span class="cl">I: Resolving dependencies of base packages... </span></span><span class="line"><span class="cl">I: Checking component main on http://mirrors.aliyun.com/ubuntu... </span></span><span class="line"><span class="cl">I: Retrieving adduser 3.118ubuntu2 </span></span><span class="line"><span class="cl">I: Validating adduser 3.118ubuntu2 </span></span><span class="line"><span class="cl">I: Retrieving apt 2.0.2 </span></span><span class="line"><span class="cl">I: Validating apt 2.0.2 </span></span><span class="line"><span class="cl">………………………………………………………… </span></span><span class="line"><span class="cl">I: Configuring console-setup... </span></span><span class="line"><span class="cl">I: Configuring kbd... </span></span><span class="line"><span class="cl">I: Configuring ubuntu-minimal... </span></span><span class="line"><span class="cl">I: Configuring libc-bin... </span></span><span class="line"><span class="cl">I: Configuring systemd... </span></span><span class="line"><span class="cl">I: Configuring ca-certificates... </span></span><span class="line"><span class="cl">I: Base system installed successfully. <span class="c1">##当你看到这句时 说明你的操作没有问题</span> </span></span></code></pre></td></tr></table> </div> </div><h3 id="chroot-并进行基本设置">chroot 并进行基本设置 </h3><h4 id="修改软件源">修改软件源 </h4><p>默认 rootfs 中的软件源不完整 我们这里 cp 一下 live cd 的软件源</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cp /etc/apt/sources.list /target/etc/apt/sources.list<span class="p">;</span>sed -i 3d /target/etc/apt/sources.list </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ cat &gt;&gt; /target/etc/apt/sources.list <span class="s">&lt;&lt; EOF </span></span></span><span class="line"><span class="cl"><span class="s"># See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to </span></span></span><span class="line"><span class="cl"><span class="s"># newer versions of the distribution. </span></span></span><span class="line"><span class="cl"><span class="s">deb http://mirrors.aliyun.com/ubuntu/ focal main restricted </span></span></span><span class="line"><span class="cl"><span class="s"># deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted </span></span></span><span class="line"><span class="cl"><span class="s">## Major bug fix updates produced after the final release of the </span></span></span><span class="line"><span class="cl"><span class="s">## distribution. </span></span></span><span class="line"><span class="cl"><span class="s">deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted </span></span></span><span class="line"><span class="cl"><span class="s"># deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted </span></span></span><span class="line"><span class="cl"><span class="s">## N.B. software from this repository is E</span>NTIRELY UNSUPPORTED by the Ubuntu </span></span><span class="line"><span class="cl"><span class="c1">## team. Also, please note that software in universe WILL NOT receive any</span> </span></span><span class="line"><span class="cl"><span class="c1">## review or updates from the Ubuntu security team.</span> </span></span><span class="line"><span class="cl">deb http://mirrors.aliyun.com/ubuntu/ focal universe </span></span><span class="line"><span class="cl"><span class="c1"># deb-src http://mirrors.aliyun.com/ubuntu/ focal universe</span> </span></span><span class="line"><span class="cl">deb http://mirrors.aliyun.com/ubuntu/ focal-updates universe </span></span><span class="line"><span class="cl"><span class="c1"># deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates universe</span> </span></span><span class="line"><span class="cl"><span class="c1">## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu</span> </span></span><span class="line"><span class="cl"><span class="c1">## team, and may not be under a free licence. Please satisfy yourself as to</span> </span></span><span class="line"><span class="cl"><span class="c1">## your rights to use the software. Also, please note that software in</span> </span></span><span class="line"><span class="cl"><span class="c1">## multiverse WILL NOT receive any review or updates from the Ubuntu</span> </span></span><span class="line"><span class="cl"><span class="c1">## security team.</span> </span></span><span class="line"><span class="cl">deb http://mirrors.aliyun.com/ubuntu/ focal multiverse </span></span><span class="line"><span class="cl"><span class="c1"># deb-src http://mirrors.aliyun.com/ubuntu/ focal multiverse</span> </span></span><span class="line"><span class="cl">deb http://mirrors.aliyun.com/ubuntu/ focal-updates multiverse </span></span><span class="line"><span class="cl"><span class="c1"># deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates multiverse</span> </span></span><span class="line"><span class="cl"><span class="c1">## N.B. software from this repository may not have been tested as</span> </span></span><span class="line"><span class="cl"><span class="c1">## extensively as that contained in the main release, although it includes</span> </span></span><span class="line"><span class="cl"><span class="c1">## newer versions of some applications which may provide useful features.</span> </span></span><span class="line"><span class="cl"><span class="c1">## Also, please note that software in backports WILL NOT receive any review</span> </span></span><span class="line"><span class="cl"><span class="c1">## or updates from the Ubuntu security team.</span> </span></span><span class="line"><span class="cl">deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse </span></span><span class="line"><span class="cl"><span class="c1"># deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse</span> </span></span><span class="line"><span class="cl"><span class="c1">## Uncomment the following two lines to add software from Canonical&#39;s</span> </span></span><span class="line"><span class="cl"><span class="c1">## &#39;partner&#39; repository.</span> </span></span><span class="line"><span class="cl"><span class="c1">## This software is not part of Ubuntu, but is offered by Canonical and the</span> </span></span><span class="line"><span class="cl"><span class="c1">## respective vendors as a service to Ubuntu users.</span> </span></span><span class="line"><span class="cl"><span class="c1"># deb http://archive.canonical.com/ubuntu focal partner</span> </span></span><span class="line"><span class="cl"><span class="c1"># deb-src http://archive.canonical.com/ubuntu focal partner</span> </span></span><span class="line"><span class="cl">deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted </span></span><span class="line"><span class="cl"><span class="c1"># deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted</span> </span></span><span class="line"><span class="cl">deb http://mirrors.aliyun.com/ubuntu/ focal-security universe </span></span><span class="line"><span class="cl"><span class="c1"># deb-src http://mirrors.aliyun.com/ubuntu/ focal-security universe</span> </span></span><span class="line"><span class="cl">deb http://mirrors.aliyun.com/ubuntu/ focal-security multiverse </span></span><span class="line"><span class="cl"><span class="c1"># deb-src http://mirrors.aliyun.com/ubuntu/ focal-security multiverse</span> </span></span></code></pre></td></tr></table> </div> </div><h4 id="编写-fstab">编写 fstab </h4><p>这里推荐一下这篇文章 <a class="link" href="https://blog.csdn.net/richerg85/article/details/17917129" target="_blank" rel="noopener" >linux 之 fstab 文件详解 来自 csdn richerg85</a></p> <p>fstab 主要由这几部分组成</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">&lt;file system&gt; &lt;dir&gt; &lt;type&gt; &lt;options&gt; &lt;dump&gt; &lt;pass&gt; </span></span><span class="line"><span class="cl">(/dev下的位置)(挂载位置)(文件系统)(挂载参数)(dump 工具通过它决定何时作备份)(fsck 读取 &lt;pass&gt; 的数值来决定需要检查的文件系统的检查顺序。) </span></span></code></pre></td></tr></table> </div> </div><p>这里以我的 fstab 文件作为实例</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ cat &gt;&gt; /target/etc/fstab &lt;&lt; EOF </span></span><span class="line"><span class="cl">tmpfs /tmp tmpfs nodev,nosuid <span class="m">0</span> <span class="m">0</span> </span></span><span class="line"><span class="cl">/dev/sda2 none swap defaults <span class="m">0</span> <span class="m">0</span> </span></span><span class="line"><span class="cl">/dev/sda3 / ext4 defaults,noatime <span class="m">0</span> <span class="m">0</span> </span></span></code></pre></td></tr></table> </div> </div><h4 id="chroot-进入系统">chroot 进入系统 </h4><p>先挂载 efi 分区</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir /target/boot/efi <span class="o">&amp;&amp;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl">mount /dev/sda1 /target/boot/efi </span></span></code></pre></td></tr></table> </div> </div><p>挂载 proc 等分区</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="k">for</span> i in /dev /dev/pts /proc /sys /run<span class="p">;</span> <span class="k">do</span> sudo mount -B <span class="nv">$i</span> /target<span class="nv">$i</span><span class="p">;</span> <span class="k">done</span> </span></span></code></pre></td></tr></table> </div> </div><p>挂载并安装 grub 和 kernel(这里安装的是虚拟化内核)</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo chroot /target </span></span><span class="line"><span class="cl">$ sudo passwd <span class="c1">##配置passwd</span> </span></span><span class="line"><span class="cl">New password: </span></span><span class="line"><span class="cl">Retype new password: </span></span><span class="line"><span class="cl">passwd: password updated successfully </span></span><span class="line"><span class="cl">$ sudo apt install grub-efi-amd64 linux-virtual -y <span class="c1">##安装grub和kernel</span> </span></span><span class="line"><span class="cl">Reading package lists... Done </span></span><span class="line"><span class="cl">Building dependency tree </span></span><span class="line"><span class="cl">Reading state information... Done </span></span><span class="line"><span class="cl">The following additional packages will be installed: </span></span><span class="line"><span class="cl"> efibootmgr gettext-base grub-common grub-efi-amd64-bin grub-efi-amd64-signed grub2-common libefiboot1 libefivar1 </span></span><span class="line"><span class="cl"> libfreetype6 libfuse2 libpng16-16 linux-headers-generic linux-headers-virtual os-prober sbsigntool secureboot-db </span></span><span class="line"><span class="cl">Suggested packages: </span></span><span class="line"><span class="cl">rvice. </span></span><span class="line"><span class="cl">Running in chroot, ignoring request: daemon-reload </span></span><span class="line"><span class="cl">Running in chroot, ignoring request: is-active </span></span><span class="line"><span class="cl">Running in chroot, ignoring request: start </span></span><span class="line"><span class="cl">Setting up libefiboot1:amd64 <span class="o">(</span>37-2ubuntu2<span class="o">)</span> ... </span></span><span class="line"><span class="cl">Setting up linux-virtual <span class="o">(</span>5.4.0.26.32<span class="o">)</span> ... </span></span><span class="line"><span class="cl">Setting up libfreetype6:amd64 <span class="o">(</span>2.10.1-2<span class="o">)</span> ... </span></span><span class="line"><span class="cl">Setting up efibootmgr <span class="o">(</span>17-1<span class="o">)</span> ... </span></span><span class="line"><span class="cl">Setting up grub-common <span class="o">(</span>2.04-1ubuntu26<span class="o">)</span> ... </span></span><span class="line"><span class="cl">Running in chroot, ignoring request: daemon-reload </span></span><span class="line"><span class="cl">Running in chroot, ignoring request: daemon-reload </span></span><span class="line"><span class="cl">Running in chroot, ignoring request: is-active </span></span><span class="line"><span class="cl">Running in chroot, ignoring request: restart </span></span><span class="line"><span class="cl">update-rc.d: warning: start and stop actions are no longer supported<span class="p">;</span> falling back to defaults </span></span><span class="line"><span class="cl">Running in chroot, ignoring request: daemon-reload </span></span><span class="line"><span class="cl">Running in chroot, ignoring request. </span></span><span class="line"><span class="cl">Running in chroot, ignoring request: daemon-reload </span></span><span class="line"><span class="cl">Running in chroot, ignoring request: is-active </span></span><span class="line"><span class="cl">Running in chroot, ignoring request: restart </span></span><span class="line"><span class="cl">Setting up os-prober <span class="o">(</span>1.74ubuntu2<span class="o">)</span> ... </span></span><span class="line"><span class="cl">Setting up grub-efi-amd64-bin <span class="o">(</span>2.04-1ubuntu26<span class="o">)</span> ... </span></span><span class="line"><span class="cl">Setting up grub2-common <span class="o">(</span>2.04-1ubuntu26<span class="o">)</span> ... </span></span><span class="line"><span class="cl">Setting up grub-efi-amd64 <span class="o">(</span>2.04-1ubuntu26<span class="o">)</span> ... </span></span><span class="line"><span class="cl">Setting up grub-efi-amd64-signed <span class="o">(</span>1.142+2.04-1ubuntu26<span class="o">)</span> ... </span></span><span class="line"><span class="cl">Processing triggers <span class="k">for</span> systemd <span class="o">(</span>245.4-4ubuntu3<span class="o">)</span> ... </span></span><span class="line"><span class="cl">Running in chroot, ignoring request: daemon-reload </span></span><span class="line"><span class="cl">Processing triggers <span class="k">for</span> libc-bin <span class="o">(</span>2.31-0ubuntu9<span class="o">)</span> ... </span></span></code></pre></td></tr></table> </div> </div><h4 id="安装-grub2">安装 grub2 </h4><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ grub-install /dev/sda </span></span><span class="line"><span class="cl">update-grub Installing <span class="k">for</span> x86_64-efi platform. </span></span><span class="line"><span class="cl">Installation finished. No error reported. </span></span><span class="line"><span class="cl">$ update-grub </span></span><span class="line"><span class="cl">Sourcing file <span class="sb">`</span>/etc/default/grub<span class="s1">&#39; </span></span></span><span class="line"><span class="cl"><span class="s1">Sourcing file `/etc/default/grub.d/init-select.cfg&#39;</span> </span></span><span class="line"><span class="cl">Generating grub configuration file ... </span></span><span class="line"><span class="cl">Found linux image: /boot/vmlinuz-5.4.0-26-generic </span></span><span class="line"><span class="cl">Found initrd image: /boot/initrd.img-5.4.0-26-generic </span></span><span class="line"><span class="cl">Adding boot menu entry <span class="k">for</span> UEFI Firmware Settings </span></span><span class="line"><span class="cl"><span class="k">done</span> </span></span></code></pre></td></tr></table> </div> </div><h4 id="设置网络">设置网络 </h4><p>Ubuntu 18.04 及其上的 Server 版本默认使用 systemd-networkd 联网</p> <p>先使用 ip a 获取设备</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ ip a </span></span><span class="line"><span class="cl">1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu <span class="m">65536</span> qdisc noqueue state UNKNOWN group default qlen <span class="m">1000</span> </span></span><span class="line"><span class="cl"> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 </span></span><span class="line"><span class="cl"> inet 127.0.0.1/8 scope host lo </span></span><span class="line"><span class="cl"> valid_lft forever preferred_lft forever </span></span><span class="line"><span class="cl"> inet6 ::1/128 scope host </span></span><span class="line"><span class="cl"> valid_lft forever preferred_lft forever </span></span><span class="line"><span class="cl">2: ens33: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu <span class="m">1500</span> qdisc fq_codel state UP group default qlen <span class="m">1000</span> <span class="c1">## ens33就是网络设备</span> </span></span><span class="line"><span class="cl"> link/ether 00:0c:29:9d:a0:73 brd ff:ff:ff:ff:ff:ff </span></span><span class="line"><span class="cl"> inet 192.168.57.140/24 brd 192.168.57.255 scope global dynamic ens33 </span></span><span class="line"><span class="cl"> valid_lft 5433596sec preferred_lft 5433596sec </span></span><span class="line"><span class="cl"> inet6 fe80::20c:29ff:fe9d:a073/64 scope link </span></span><span class="line"><span class="cl"> valid_lft forever preferred_lft forever </span></span></code></pre></td></tr></table> </div> </div><p>配置所有网卡 DHCP 联网</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ cat &gt;&gt; /etc/systemd/network/ens33.network &lt;&lt; EOF </span></span><span class="line"><span class="cl"><span class="o">[</span>Match<span class="o">]</span> </span></span><span class="line"><span class="cl"><span class="nv">Name</span><span class="o">=</span>* </span></span><span class="line"><span class="cl"><span class="o">[</span>Network<span class="o">]</span> </span></span><span class="line"><span class="cl"><span class="nv">DHCP</span><span class="o">=</span>both </span></span></code></pre></td></tr></table> </div> </div><h4 id="重启">重启 </h4><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ <span class="nb">exit</span> </span></span><span class="line"><span class="cl"><span class="nb">exit</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">reboot </span></span></code></pre></td></tr></table> </div> </div><p>PS: 第一次开机会有一点点慢(就亿点点)</p> <h3 id="重启并配置网络">重启并配置网络 </h3><p>启动 systemd-networkd</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ systemctl <span class="nb">enable</span> --now systemd-networkd </span></span><span class="line"><span class="cl">Created symlink /etc/systemd/system/dbus-org.freedesktop.network1.service → /lib/systemd/system/systemd-networkd.service. </span></span><span class="line"><span class="cl">Created symlink /etc/systemd/system/multi-user.target.wants/systemd-networkd.service → /lib/systemd/system/systemd-networkd.service. </span></span><span class="line"><span class="cl">Created symlink /etc/systemd/system/sockets.target.wants/systemd-networkd.socket → /lib/systemd/system/systemd-networkd.socket. </span></span><span class="line"><span class="cl">Created symlink /etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service → /lib/systemd/system/systemd-networkd-wait-online.service. </span></span></code></pre></td></tr></table> </div> </div><p>修改 hostname 并添加 hosts</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ hostnamectl set-hostname vm-ubuntu-test </span></span><span class="line"><span class="cl">$ cat &gt;&gt; /etc/hosts &lt;&lt; EOF </span></span><span class="line"><span class="cl">127.0.0.1 vm-ubuntu-test localhost </span></span><span class="line"><span class="cl">::1 vm-ubuntu-test localhost ip6-localhost ip6-loopback </span></span><span class="line"><span class="cl">ff02::1 ip6-allnodes </span></span><span class="line"><span class="cl">ff02::2 ip6-allrouters </span></span></code></pre></td></tr></table> </div> </div><p>最后 reboot 生效</p> <p>享受全新的 ubuntu 体验吧</p>

2020/12/19
阅读更多

Markdown Syntax Guide

<blockquote>Sample article showcasing basic Markdown syntax and formatting for HTML elements.</blockquote><p>This article offers a sample of basic Markdown syntax that can be used in Hugo content files, also it shows whether basic HTML elements are decorated with CSS in a Hugo theme.</p> <h2 id="headings">Headings </h2><p>The following HTML <code>&lt;h1&gt;</code>—<code>&lt;h6&gt;</code> elements represent six levels of section headings. <code>&lt;h1&gt;</code> is the highest section level while <code>&lt;h6&gt;</code> is the lowest.</p> <h1 id="h1">H1 </h1><h2 id="h2">H2 </h2><h3 id="h3">H3 </h3><h4 id="h4">H4 </h4><h5 id="h5">H5 </h5><h6 id="h6">H6 </h6><h2 id="paragraph">Paragraph </h2><p>Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat.</p> <p>Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat.</p> <h2 id="blockquotes">Blockquotes </h2><p>The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a <code>footer</code> or <code>cite</code> element, and optionally with in-line changes such as annotations and abbreviations.</p> <h4 id="blockquote-without-attribution">Blockquote without attribution </h4><blockquote> <p>Tiam, ad mint andaepu dandae nostion secatur sequo quae. <strong>Note</strong> that you can use <em>Markdown syntax</em> within a blockquote.</p> </blockquote> <h4 id="blockquote-with-attribution">Blockquote with attribution </h4><blockquote> <p>Don&rsquo;t communicate by sharing memory, share memory by communicating.<br> — <cite>Rob Pike<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></cite></p> </blockquote> <h2 id="tables">Tables </h2><p>Tables aren&rsquo;t part of the core Markdown spec, but Hugo supports supports them out-of-the-box.</p> <table> <thead> <tr> <th>Name</th> <th>Age</th> </tr> </thead> <tbody> <tr> <td>Bob</td> <td>27</td> </tr> <tr> <td>Alice</td> <td>23</td> </tr> </tbody> </table> <h4 id="inline-markdown-within-tables">Inline Markdown within tables </h4><table> <thead> <tr> <th>Italics</th> <th>Bold</th> <th>Code</th> </tr> </thead> <tbody> <tr> <td><em>italics</em></td> <td><strong>bold</strong></td> <td><code>code</code></td> </tr> </tbody> </table> <table> <thead> <tr> <th>A</th> <th>B</th> <th>C</th> <th>D</th> <th>E</th> <th>F</th> </tr> </thead> <tbody> <tr> <td>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</td> <td>Phasellus ultricies, sapien non euismod aliquam, dui ligula tincidunt odio, at accumsan nulla sapien eget ex.</td> <td>Proin eleifend dictum ipsum, non euismod ipsum pulvinar et. Vivamus sollicitudin, quam in pulvinar aliquam, metus elit pretium purus</td> <td>Proin sit amet velit nec enim imperdiet vehicula.</td> <td>Ut bibendum vestibulum quam, eu egestas turpis gravida nec</td> <td>Sed scelerisque nec turpis vel viverra. Vivamus vitae pretium sapien</td> </tr> </tbody> </table> <h2 id="code-blocks">Code Blocks </h2><h4 id="code-block-with-backticks">Code block with backticks </h4><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="cp">&lt;!DOCTYPE html&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">&#34;en&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">&#34;utf-8&#34;</span> <span class="p">/&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span>Example HTML5 Document<span class="p">&lt;/</span><span class="nt">title</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Test<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><h4 id="code-block-indented-with-four-spaces">Code block indented with four spaces </h4><pre><code>&lt;!doctype html&gt; &lt;html lang=&quot;en&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot;&gt; &lt;title&gt;Example HTML5 Document&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;p&gt;Test&lt;/p&gt; &lt;/body&gt; &lt;/html&gt; </code></pre> <h4 id="code-block-with-hugos-internal-highlight-shortcode">Code block with Hugo&rsquo;s internal highlight shortcode </h4><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="cp">&lt;!doctype html&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">&#34;en&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">&#34;utf-8&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span>Example HTML5 Document<span class="p">&lt;/</span><span class="nt">title</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Test<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span></span></span></code></pre></td></tr></table> </div> </div> <h4 id="diff-code-block">Diff code block </h4><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-diff" data-lang="diff"><span class="line"><span class="cl">[dependencies.bevy] </span></span><span class="line"><span class="cl">git = &#34;https://github.com/bevyengine/bevy&#34; </span></span><span class="line"><span class="cl">rev = &#34;11f52b8c72fc3a568e8bb4a4cd1f3eb025ac2e13&#34; </span></span><span class="line"><span class="cl"><span class="gd">- features = [&#34;dynamic&#34;] </span></span></span><span class="line"><span class="cl"><span class="gi">+ features = [&#34;jpeg&#34;, &#34;dynamic&#34;] </span></span></span></code></pre></td></tr></table> </div> </div><h2 id="list-types">List Types </h2><h4 id="ordered-list">Ordered List </h4><ol> <li>First item</li> <li>Second item</li> <li>Third item</li> </ol> <h4 id="unordered-list">Unordered List </h4><ul> <li>List item</li> <li>Another item</li> <li>And another item</li> </ul> <h4 id="nested-list">Nested list </h4><ul> <li>Fruit <ul> <li>Apple</li> <li>Orange</li> <li>Banana</li> </ul> </li> <li>Dairy <ul> <li>Milk</li> <li>Cheese</li> </ul> </li> </ul> <h2 id="other-elements--abbr-sub-sup-kbd-mark">Other Elements — abbr, sub, sup, kbd, mark </h2><p><abbr title="Graphics Interchange Format">GIF</abbr> is a bitmap image format.</p> <p>H<sub>2</sub>O</p> <p>X<sup>n</sup> + Y<sup>n</sup> = Z<sup>n</sup></p> <p>Press <kbd>CTRL</kbd> + <kbd>ALT</kbd> + <kbd>Delete</kbd> to end the session.</p> <p>Most <mark>salamanders</mark> are nocturnal, and hunt for insects, worms, and other small creatures.</p> <h2 id="hyperlinked-image">Hyperlinked image </h2><p><a class="link" href="https://google.com" target="_blank" rel="noopener" ><img src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_light_color_272x92dp.png" loading="lazy" alt="Google" ></a></p> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>The above quote is excerpted from Rob Pike&rsquo;s <a class="link" href="https://www.youtube.com/watch?v=PAAkCSZUG1c" target="_blank" rel="noopener" >talk</a> during Gopherfest, November 18, 2015.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2019/3/11
阅读更多

Math Typesetting

<blockquote>A brief guide to setup KaTeX</blockquote><p>Mathematical notation in a Hugo project can be enabled by using third party JavaScript libraries.</p> <p>In this example we will be using <a class="link" href="https://katex.org/" target="_blank" rel="noopener" >KaTeX</a></p> <ul> <li>Create a partial under <code>/layouts/partials/math.html</code></li> <li>Within this partial reference the <a class="link" href="https://katex.org/docs/autorender.html" target="_blank" rel="noopener" >Auto-render Extension</a> or host these scripts locally.</li> <li>Include the partial in your templates like so:</li> </ul> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">{{</span> <span class="k">if</span> or .Params.math .Site.Params.math <span class="o">}}</span> </span></span><span class="line"><span class="cl"><span class="o">{{</span> partial <span class="s2">&#34;math.html&#34;</span> . <span class="o">}}</span> </span></span><span class="line"><span class="cl"><span class="o">{{</span> end <span class="o">}}</span> </span></span></code></pre></td></tr></table> </div> </div><ul> <li>To enable KaTex globally set the parameter <code>math</code> to <code>true</code> in a project&rsquo;s configuration</li> <li>To enable KaTex on a per page basis include the parameter <code>math: true</code> in content files</li> </ul> <p><strong>Note:</strong> Use the online reference of <a class="link" href="https://katex.org/docs/supported.html" target="_blank" rel="noopener" >Supported TeX Functions</a></p> <h3 id="examples">Examples </h3><p>Inline math: $\varphi = \dfrac{1+\sqrt5}{2}= 1.6180339887…$</p> <p>Block math: $$ \varphi = 1+\frac{1} {1+\frac{1} {1+\frac{1} {1+\cdots} } } $$</p>

2019/3/8
阅读更多