<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>绒布地球</title>
  
  
  <link href="https://rongrongbq.moe/atom.xml" rel="self"/>
  
  <link href="https://rongrongbq.moe/"/>
  <updated>2021-08-25T18:40:54.000Z</updated>
  <id>https://rongrongbq.moe/</id>
  
  <author>
    <name>Rongrong</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>简单缩减 AWS EC2 实例附加的 EBS 卷的容量</title>
    <link href="https://rongrongbq.moe/2021/08/Reduce-the-EBS-volume-capacity-of-aws-EC2-instances/"/>
    <id>https://rongrongbq.moe/2021/08/Reduce-the-EBS-volume-capacity-of-aws-EC2-instances/</id>
    <published>2021-08-25T18:40:54.000Z</published>
    <updated>2021-08-25T18:40:54.000Z</updated>
    
    <content type="html"><![CDATA[<p>缩减 AWS EC2 实例附加的 EBS 卷的容量的方法有很多，大多比较繁琐，本文使用一些技巧，来大大简化这个流程。</p><span id="more"></span><h1 id="第一步：启动一个新实例"><a href="#第一步：启动一个新实例" class="headerlink" title="第一步：启动一个新实例"></a>第一步：启动一个新实例</h1><p>启动一个新的 EC2 实例。</p><ul><li>这个实例与需要被缩减 EBS 卷容量的实例尽可能相同，其中，操作系统和实例类型必须相同，所在的 AWS 区域及子网也必须相同。</li><li>可以不为其添加密钥对。</li><li>其 EBS 卷容量为需要缩减到的容量。</li><li>添加储存时取消勾选「终止时删除」。</li></ul><p>待实例启动后，终止（非停止）实例。</p><h1 id="第二步：附加新的-EBS-卷"><a href="#第二步：附加新的-EBS-卷" class="headerlink" title="第二步：附加新的 EBS 卷"></a>第二步：附加新的 EBS 卷</h1><blockquote><p>上一步终止新的实例后，其 EBS 卷被保留且已从实例分离，并拥有所有我们需要的分区，因此，我们不需要再进行任何分区操作啦。</p></blockquote><p>转到 EBS 管理页面，将新的 EBS 卷连接到需要被缩减 EBS 卷容量的 EC2 实例。</p><h1 id="第三步：迁移数据"><a href="#第三步：迁移数据" class="headerlink" title="第三步：迁移数据"></a>第三步：迁移数据</h1><p>列出所有可用块设备的信息，发现新的 EBS 卷是 <code>nvme1n1</code>，其中 <code>nvme1n1p1</code> 就是我们迁移的目标分区，而 <code>nvme1n1p14</code> 和 <code>nvme1n1p15</code> 是引导所需要的分区，我们不用理会它们：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">root@ip-***:~# lsblk</span><br><span class="line">NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT</span><br><span class="line">nvme0n1      259:0    0   30G  0 disk</span><br><span class="line">├─nvme0n1p1  259:1    0 29.9G  0 part /</span><br><span class="line">├─nvme0n1p14 259:2    0    3M  0 part</span><br><span class="line">└─nvme0n1p15 259:3    0  124M  0 part /boot/efi</span><br><span class="line">nvme1n1      259:4    0   20G  0 disk</span><br><span class="line">├─nvme1n1p1  259:5    0 19.9G  0 part</span><br><span class="line">├─nvme1n1p14 259:6    0    3M  0 part</span><br><span class="line">└─nvme1n1p15 259:7    0  124M  0 part</span><br></pre></td></tr></table></figure><p>挂载并清除新分区内所有数据：</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p /mnt/newebs</span><br><span class="line">mount /dev/nvme1n1p1 /mnt/newebs</span><br><span class="line"><span class="built_in">rm</span> -rf /mnt/newebs/*  <span class="comment"># 也可以格式化新分区</span></span><br></pre></td></tr></table></figure><p>迁移根目录*（选做：深入理解各参数的含义）*：</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rsync -aAHXxvP / /mnt/newebs/  <span class="comment"># 如果没有 rsync，请安装</span></span><br></pre></td></tr></table></figure><h1 id="第四步：修复引导（大部分情况不需要）"><a href="#第四步：修复引导（大部分情况不需要）" class="headerlink" title="第四步：修复引导（大部分情况不需要）"></a>第四步：修复引导（大部分情况不需要）</h1><p>列出卷的 UUID：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">root@ip-***:~# blkid</span><br><span class="line">/dev/nvme0n1: PTUUID=&quot;********-****-****-****-************&quot; PTTYPE=&quot;gpt&quot;</span><br><span class="line">/dev/nvme0n1p1: UUID=&quot;********-****-****-****-************&quot; TYPE=&quot;ext4&quot; PARTUUID=&quot;********-****-****-****-************&quot;</span><br><span class="line">/dev/nvme0n1p14: PARTUUID=&quot;********-****-****-****-************&quot;</span><br><span class="line">/dev/nvme0n1p15: SEC_TYPE=&quot;msdos&quot; UUID=&quot;****-****&quot; TYPE=&quot;vfat&quot; PARTUUID=&quot;********-****-****-****-************&quot;</span><br><span class="line">/dev/nvme1n1: PTUUID=&quot;********-****-****-****-************&quot; PTTYPE=&quot;gpt&quot;</span><br><span class="line">/dev/nvme1n1p1: UUID=&quot;********-****-****-****-************&quot; TYPE=&quot;ext4&quot; PARTUUID=&quot;********-****-****-****-************&quot;</span><br><span class="line">/dev/nvme1n1p14: PARTUUID=&quot;********-****-****-****-************&quot;</span><br><span class="line">/dev/nvme1n1p15: SEC_TYPE=&quot;msdos&quot; UUID=&quot;****-****&quot; TYPE=&quot;vfat&quot; PARTUUID=&quot;********-****-****-****-************&quot;</span><br></pre></td></tr></table></figure><ul><li>由于我们创建了一个和需要被缩减 EBS 卷容量的实例配置相同的实例，并取得了它的 EBS 卷，在大部分情况下，新卷和旧卷各分区的 UUID 应该是相同的，因此不需要修复引导。</li><li>如果不是这样，请修复引导，替换引导配置中的 UUID 即可，此处不赘述。</li></ul><h1 id="第五步：替换根设备"><a href="#第五步：替换根设备" class="headerlink" title="第五步：替换根设备"></a>第五步：替换根设备</h1><ol><li>取消挂载新 EBS 卷：</li></ol><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">umount /mnt/newebs</span><br></pre></td></tr></table></figure><ol><li>转到实例管理页面，停止（非终止）需要被缩减 EBS 卷容量的实例。</li><li>在实例信息中的储存分页，复制根设备名称，一般为 <code>/dev/xvda</code>。</li><li>转到 EBS 管理页面，断开新旧两个 EBS 卷的连接。</li><li>重新连接新 EBS 卷到该实例，<code>设备</code>处填入先前复制的根设备名称。</li><li>重新启动该实例。</li><li>验证实例工作正常后，为旧 EBS 卷创建一个快照作为备份，就可以删除它了。</li><li>某些情况下，停止并重新启动实例可能导致 IP 地址变更，如果你有一个指向该实例的域名，记得修改 DNS 记录。</li></ol><h1 id="Done"><a href="#Done" class="headerlink" title="Done!"></a>Done!</h1><p>是不是很简单w</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;缩减 AWS EC2 实例附加的 EBS 卷的容量的方法有很多，大多比较繁琐，本文使用一些技巧，来大大简化这个流程。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="https://rongrongbq.moe/tags/Linux/"/>
    
    <category term="笔记" scheme="https://rongrongbq.moe/tags/%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>正确地配置 IPv6 防火墙和 DDNS 以在公网访问设备</title>
    <link href="https://rongrongbq.moe/2021/08/firewall-and-DDNS-settings-for-IPv6/"/>
    <id>https://rongrongbq.moe/2021/08/firewall-and-DDNS-settings-for-IPv6/</id>
    <published>2021-08-05T16:35:58.000Z</published>
    <updated>2023-03-10T12:49:20.000Z</updated>
    
    <content type="html"><![CDATA[<p>IPv6 已经相当普及，无论是家宽、校园网，抑或是蜂窝移动网络，获得 <code>/64</code> 的 IPv6 子网已经不是难事。本文意在解决：在获得 IPv6 公网地址（全球单播地址）且 ISP 未阻止入站连接的前提下，如何在路由器上配置防火墙及如何配置 DDNS，以便于在公网访问自己的设备。</p><span id="more"></span><h1 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h1><ul><li>路由器：<code>OpenWrt 21.02.0-rc3</code><ul><li>绝大部分厂商的原厂固件的 IPv6 防火墙都是残缺的，请不要使用原厂固件</li><li>光猫应当配置为桥接模式并使用路由器拨号，请不要让光猫承担它不该承受之重</li></ul></li><li>需要暴露的主机：<code>Debian GNU/Linux 11</code><ul><li>当然也通用于其他 Linux 发行版</li></ul></li></ul><h1 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h1><h2 id="确认已经取得-64-的-IPv6-子网"><a href="#确认已经取得-64-的-IPv6-子网" class="headerlink" title="确认已经取得 /64 的 IPv6 子网"></a>确认已经取得 <code>/64</code> 的 IPv6 子网</h2><p>一般可在路由器管理页面确认，也可通过其他方式确认。<br>如果获得的子网大小不是 <code>/64</code> ，本文仍可供参考，但需要有一些小改动。<br>如果只能取得 <code>/128</code> 的子网（整个子网只有一个地址），这种梦回 IPv4 时代的情况通常出现在校园网，考虑到没法换 ISP，要不……<del>行而上学，不行退学？</del><br><strong>下文中，我们假定取得的子网是</strong> <code>2001:2002:2003:2004::/64</code>。</p><h2 id="确认-ISP-没有阻止入站连接"><a href="#确认-ISP-没有阻止入站连接" class="headerlink" title="确认 ISP 没有阻止入站连接"></a>确认 ISP 没有阻止入站连接</h2><p>如果路由器使用的是 OpenWrt，默认的防火墙规则不会阻止 ICMP 入站连接；如果是其他路由器固件，请先完全关闭防火墙。<br><strong>本文假设系统防火墙已经被恰当配置，不会阻止需要暴露的端口的入站连接。</strong></p><ol><li>访问 <a href="https://ip.sb/">ip.sb</a>，取得<strong>当前设备的 IPv6 临时公网地址，我们假设它是</strong> <code>2001:2002:2003:2004::1234</code>。</li><li>尝试在<u>外部网络</u> ping 上述 IPv6 公网地址。<ul><li>最简单的方式是，在 Android 手机上通过 <a href="https://termux.com/">Termux</a> 使用蜂窝移动网络 ping。（应当先确定 Termux 能连接到 IPv6）</li></ul></li><li>如果能 ping 通，则进行下一步。如果不能，通常没有必要再进行下一步。</li><li>向 OpenWrt 添加一条通信规则（访问 <code>cgi-bin/luci/admin/network/firewall/rules</code>）以临时允许入站连接：<ul><li>允许 <code>TCP 和 UDP</code>，源区域为 <code>wan</code> (包含 wan, wan6)，目标区域为 <code>lan</code>，操作为<code>接受</code>，其余留空，保存并应用。</li></ul></li><li>在本机挂载一个 web 服务，如 <code>python3 -m http.server 8321</code>，<code>8321</code> 可以替换为自己选定的端口（如为 <code>80</code>, <code>443</code> 等端口，可能需要 root 权限）。</li><li>尝试在<u>外部网络</u>访问这个端口，如 <code>curl http://[2001:2002:2003:2004::1234]:8321</code>。</li><li>更换端口重试几遍，重点留意 <code>80</code>, <code>443</code>, <code>8080</code> 等常见端口有无被封锁；如被封锁，尝试不常见的端口。</li><li>关闭 web 服务，<u>删除先前创建的通信规则，保存并应用。</u>如果是其他路由器固件，请重新打开防火墙，并想办法刷入 OpenWrt。</li></ol><p>如果 ISP 阻止了入站连接，请考虑换一家 ISP。<br>有些路由器的原厂固件可能无法关闭 IPv6 防火墙并造成假阳性结果，请考虑使用 <a href="https://openwrt.org/">OpenWrt</a>。</p><h2 id="取得设备的不变后缀"><a href="#取得设备的不变后缀" class="headerlink" title="取得设备的不变后缀"></a>取得设备的不变后缀</h2><h3 id="选项一：EUI-64（推荐）"><a href="#选项一：EUI-64（推荐）" class="headerlink" title="选项一：EUI-64（推荐）"></a>选项一：EUI-64（推荐）</h3><blockquote><p>EUI-64 地址有着我们需要的优点：后缀固定不变、前缀实时更新。一般情况下，我们应该使用它。如果获得的子网大小不是 <code>/64</code>，可能不按预期工作。</p></blockquote><p>Linux: </p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo ifconfig</span><br></pre></td></tr></table></figure><p>Windows（需要提权）: </p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">set-netipv6protocol -RandomizeIdentifiers Disabled  <span class="comment"># Windows 默认不使用 EUI-64，启用它</span></span><br><span class="line">ipconfig /all</span><br></pre></td></tr></table></figure><ol><li>找到目前用于连接互联网的网络适配器。</li><li>找到一个 IP 地址，它应该类似于 <code>2001:2002:2003:2004:****:**ff:fe**:****</code>，它就是该设备的 EUI-64 地址。</li><li>记下 <code>****:**ff:fe**:****</code> 的部分，<strong>下文假设它是</strong> <code>1:20ff:fe77:2077</code>。</li><li>验证 EUI-64 地址（可选）：参见 <a href="https://ccie.lol/knowledge-base/ipv6-use-eui-64-convert-link-local-address/">通过EUI-64自动生成IPv6地址和IPv6链路本地地址（Link-Local Address） | CCIE 工程师社区</a>。</li></ol><h3 id="选项二：不使用不变后缀，使用临时-IPv6-地址"><a href="#选项二：不使用不变后缀，使用临时-IPv6-地址" class="headerlink" title="选项二：不使用不变后缀，使用临时 IPv6 地址"></a>选项二：不使用不变后缀，使用临时 IPv6 地址</h3><blockquote><p>并不推荐使用临时地址，这将导致防火墙规则难以编写。</p></blockquote><p>请直接跳到下一节。</p><h3 id="选项三：DHCPv6"><a href="#选项三：DHCPv6" class="headerlink" title="选项三：DHCPv6"></a>选项三：DHCPv6</h3><blockquote><p>并不推荐使用 DHCPv6，因为它总是落后于网络变化。如果家宽重拨导致分配到的 v6 子网变化，它根本不会自动更新，只有等到租约到期（一般是 <code>12h</code>）续租时才会更新。</p></blockquote><p>首先选定一个 IPv6 后缀如 <code>a1cd</code>（也可不选定。默认分配的后缀一般是设备特定且不变的，不选定则自行记录默认分配的后缀）。<br>注意：有时候，在系统的默认配置下并没有完整的 stateful DHCPv6 支持，此时请使用其他方法。本文亦不含有打开 stateful DHCPv6 的教学。<del>（DHCPv6 坏坏）</del></p><ol><li>在 OpenWrt 为需要的设备创建一个静态地址分配（访问 <code>cgi-bin/luci/admin/network/dhcp</code>），指定租期如 <code>5m</code>（因租约到期才会自动刷新，必须设定为较短的值以确保 DHCPv6 分配维持最新），填写选定的 IPv6 后缀（也可留空），保存并应用。</li><li>物理上重新连接目标设备。</li><li>刷新页面，在页面底部的 <code>已分配的 DHCPv6 租约</code> 里确认确实为该设备正确分配了需要的后缀和<u>租期</u>。</li><li>如果<u>租期</u>没有被正确分配，仍为默认的 <code>12h</code>，则该设备不适合该方法。（除非能获得不变的 IPv6 子网）</li></ol><h1 id="配置防火墙"><a href="#配置防火墙" class="headerlink" title="配置防火墙"></a>配置防火墙</h1><p>向 OpenWrt 添加一条通信规则（访问 <code>cgi-bin/luci/admin/network/firewall/rules</code>）：</p><ul><li>协议：<code>TCP 和 UDP</code></li><li>源区域：<code>wan</code> (包含 wan, wan6)</li><li>目标区域：<code>lan</code></li><li>目标地址：<ul><li>使用 EUI-64 或 DHCPv6：<code>::&lt;需要暴露的主机的后缀&gt;/::ffff:ffff:ffff:ffff</code>，如 <code>::1:20ff:fe77:2077/::ffff:ffff:ffff:ffff</code> 或 <code>::a1cd/::ffff:ffff:ffff:ffff</code>（如果子网大小不是 <code>/64</code>，请自行改变掩码）</li><li>使用临时地址：留空（注意：这会导致其他主机一并暴露，请避免同时留空目标端口）</li></ul></li><li>目标端口：<ul><li>暴露特定端口：<code>&lt;需要暴露的端口或端口范围&gt;</code></li><li>整台主机暴露：留空</li></ul></li><li>操作：<code>接受</code></li><li>高级设置<ul><li>限制地址类型：<code>仅 IPv6</code></li></ul></li><li>其余维持默认<ul><li>特别提醒：源端口留空，只填目标端口</li></ul></li></ul><h1 id="配置-DDNS"><a href="#配置-DDNS" class="headerlink" title="配置 DDNS"></a>配置 DDNS</h1><h2 id="编写更新脚本"><a href="#编写更新脚本" class="headerlink" title="编写更新脚本"></a>编写更新脚本</h2><blockquote><p>以 Cloudflare API 为例。<br>替换如下脚本中的环境变量，存放至合适的位置。</p></blockquote><p>DNS ID 需要通过 Cloudflare API 查询获得，也可通过审查元素抓包获得。</p><h3 id="使用-EUI-64-或-DHCPv6"><a href="#使用-EUI-64-或-DHCPv6" class="headerlink" title="使用 EUI-64 或 DHCPv6"></a>使用 EUI-64 或 DHCPv6</h3><p>在需要暴露的主机上运行，也可在同一子网下别的主机（含路由器）上运行，因此适合需要暴露的主机为 Windows 等比较坏坏的操作系统的情况。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">CURRENT_IP=$(curl -s ipv6.ip.sb)</span><br><span class="line">CURRENT_PREFIX=$(<span class="built_in">echo</span> <span class="variable">$CURRENT_IP</span> | <span class="built_in">cut</span> -d : -f 1-4)  <span class="comment"># 如果子网大小不是 /64，此处需要修改</span></span><br><span class="line">SUFFIX=&lt;固定后缀&gt;</span><br><span class="line">DNS_RECORD=&lt;域名&gt;</span><br><span class="line">ZONE_ID=&lt;Zone ID&gt;</span><br><span class="line">DNS_ID=&lt;DNS 记录 ID&gt;</span><br><span class="line">TOKEN=&lt;API token&gt;</span><br><span class="line"><span class="keyword">if</span> [ <span class="string">&quot;<span class="subst">$(cat /run/current_prefix 2&gt;/dev/null)</span>&quot;</span> != <span class="string">&quot;<span class="variable">$CURRENT_PREFIX</span>&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">        <span class="built_in">echo</span> <span class="variable">$CURRENT_PREFIX</span> &gt; /run/current_prefix</span><br><span class="line">        curl -s \</span><br><span class="line">             -X PUT <span class="string">&quot;https://api.cloudflare.com/client/v4/zones/<span class="variable">$ZONE_ID</span>/dns_records/<span class="variable">$DNS_ID</span>&quot;</span> \</span><br><span class="line">             -H <span class="string">&quot;Content-Type:application/json&quot;</span> \</span><br><span class="line">             -H <span class="string">&quot;Authorization: Bearer <span class="variable">$TOKEN</span>&quot;</span> \</span><br><span class="line">             --data <span class="string">&#x27;&#123;&quot;type&quot;:&quot;AAAA&quot;,&quot;name&quot;:&quot;&#x27;</span><span class="variable">$DNS_RECORD</span><span class="string">&#x27;&quot;,&quot;content&quot;:&quot;&#x27;</span><span class="variable">$CURRENT_PREFIX</span>:<span class="variable">$SUFFIX</span><span class="string">&#x27;&quot;,&quot;ttl&quot;:1,&quot;proxied&quot;:false&#125;&#x27;</span></span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><h3 id="使用临时地址"><a href="#使用临时地址" class="headerlink" title="使用临时地址"></a>使用临时地址</h3><p>只能在需要暴露的主机上运行。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">CURRENT_IP=$(curl -s ipv6.ip.sb)</span><br><span class="line">DNS_RECORD=&lt;域名&gt;</span><br><span class="line">ZONE_ID=&lt;Zone ID&gt;</span><br><span class="line">DNS_ID=&lt;DNS 记录 ID&gt;</span><br><span class="line">TOKEN=&lt;API token&gt;</span><br><span class="line"><span class="keyword">if</span> [ <span class="string">&quot;<span class="subst">$(cat /run/current_ip 2&gt;/dev/null)</span>&quot;</span> != <span class="string">&quot;<span class="variable">$CURRENT_IP</span>&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">        <span class="built_in">echo</span> <span class="variable">$CURRENT_IP</span> &gt; /run/current_ip</span><br><span class="line">        curl -s \</span><br><span class="line">             -X PUT <span class="string">&quot;https://api.cloudflare.com/client/v4/zones/<span class="variable">$ZONE_ID</span>/dns_records/<span class="variable">$DNS_ID</span>&quot;</span> \</span><br><span class="line">             -H <span class="string">&quot;Content-Type:application/json&quot;</span> \</span><br><span class="line">             -H <span class="string">&quot;Authorization: Bearer <span class="variable">$TOKEN</span>&quot;</span> \</span><br><span class="line">             --data <span class="string">&#x27;&#123;&quot;type&quot;:&quot;AAAA&quot;,&quot;name&quot;:&quot;&#x27;</span><span class="variable">$DNS_RECORD</span><span class="string">&#x27;&quot;,&quot;content&quot;:&quot;&#x27;</span><span class="variable">$CURRENT_IP</span><span class="string">&#x27;&quot;,&quot;ttl&quot;:1,&quot;proxied&quot;:false&#125;&#x27;</span></span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><h2 id="定时执行"><a href="#定时执行" class="headerlink" title="定时执行"></a>定时执行</h2><h3 id="使用-crontab"><a href="#使用-crontab" class="headerlink" title="使用 crontab"></a>使用 crontab</h3><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crontab -e</span><br></pre></td></tr></table></figure><p>增加一行如下，注意替换 <code>/path/to/script/</code>。示例为每分钟执行一次，如需修改，可参考 <a href="https://crontab.guru/">crontab.guru</a>。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">* * * * * /path/to/script/setDNS.sh</span><br></pre></td></tr></table></figure><h3 id="使用-systemd"><a href="#使用-systemd" class="headerlink" title="使用 systemd"></a>使用 systemd</h3><h4 id="setDNS-service"><a href="#setDNS-service" class="headerlink" title="setDNS.service"></a><code>setDNS.service</code></h4><p>放置到 <code>/etc/systemd/system/</code> 下，注意替换 <code>/path/to/script/</code>。</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Unit]</span></span><br><span class="line"><span class="attr">Description</span>=check IPv6 address and set DNS record</span><br><span class="line"></span><br><span class="line"><span class="section">[Service]</span></span><br><span class="line"><span class="attr">ExecStart</span>=/bin/sh /path/to/script/setDNS.sh</span><br></pre></td></tr></table></figure><h4 id="setDNS-timer"><a href="#setDNS-timer" class="headerlink" title="setDNS.timer"></a><code>setDNS.timer</code></h4><p>放置到 <code>/etc/systemd/system/</code> 下。</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Unit]</span></span><br><span class="line"><span class="attr">Description</span>=monitor IPv6 address and set DNS record minutely</span><br><span class="line"></span><br><span class="line"><span class="section">[Timer]</span></span><br><span class="line"><span class="attr">OnBootSec</span>=<span class="number">1</span>min</span><br><span class="line"><span class="attr">OnUnitActiveSec</span>=<span class="number">1</span>min</span><br><span class="line"></span><br><span class="line"><span class="section">[Install]</span></span><br><span class="line"><span class="attr">WantedBy</span>=timers.target</span><br></pre></td></tr></table></figure><p>即时启动并添加到开机启动。</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl daemon-reload</span><br><span class="line">sudo systemctl start setDNS.timer</span><br><span class="line">sudo systemctl <span class="built_in">enable</span> setDNS.timer</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;IPv6 已经相当普及，无论是家宽、校园网，抑或是蜂窝移动网络，获得 &lt;code&gt;/64&lt;/code&gt; 的 IPv6 子网已经不是难事。本文意在解决：在获得 IPv6 公网地址（全球单播地址）且 ISP 未阻止入站连接的前提下，如何在路由器上配置防火墙及如何配置 DDNS，以便于在公网访问自己的设备。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="https://rongrongbq.moe/tags/Linux/"/>
    
    <category term="笔记" scheme="https://rongrongbq.moe/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="OpenWrt" scheme="https://rongrongbq.moe/tags/OpenWrt/"/>
    
  </entry>
  
  <entry>
    <title>解决在 Armbian 中执行 apt search 非常慢的问题</title>
    <link href="https://rongrongbq.moe/2021/07/How-to-solve-slowly-apt-search-on-Armbian/"/>
    <id>https://rongrongbq.moe/2021/07/How-to-solve-slowly-apt-search-on-Armbian/</id>
    <published>2021-07-04T19:15:32.000Z</published>
    <updated>2021-07-04T19:15:32.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h1><p>原本想购入一块 Raspberry Pi，奈何价格长期虚高，就在某天从女票票手里顺走了一块 <a href="https://www.pine64.org/pine-h64-ver-b/">PINE H64 Model B</a>。往一张 TF 卡里灌入 Armbian 的镜像，就可以愉快地玩耍了。</p><p>Armbian 衍生自 Debian。对于 Debian 系，当你需要管理软件包时，通常会使用 <code>apt</code> 来完成。而要搜索软件包，则有 <code>apt search</code> 和 <code>apt-cache search</code> 两种方式，它们的搜索范围、结果详细度、输出的可读性都不尽相同，且通常后者是更快的。</p><p>自某个时候开始，在某些灌入 Armbian 的设备上，使用 <code>apt search</code> 搜索软件包变得无可容忍地慢，而 <code>apt-cache search</code> 却仍然保持着较高的速度。Armbian 论坛上的这个 <a href="https://forum.armbian.com/topic/14064-my-apt-search-has-become-super-slow-recently/">topic</a> 讨论了这个问题。</p><span id="more"></span><p>总地来说，这个问题与 apt 对软件包列表（存放于 <code>/var/lib/apt/lists/</code> 中）的压缩有关，由于压缩被默认打开，且 lz4 压缩方式优先级较高，软件包列表被以 lz4 的方式压缩。在上述 topic 中，部分用户将压缩方式改为 gzip，解决了这个问题，因此 Armbian 已经合并了一个 <a href="https://github.com/armbian/build/pull/2729">Pull Request</a>，提高了 gzip 的优先级，现在 Armbian 上的 apt 已经会默认使用 gzip 来压缩软件包列表。</p><p>然而，将压缩方式改为 gzip 显然不能解决所有用户的问题，上述 topic 中仍旧有不少用户反馈这个问题没有得到解决。实际经过测试，改回默认的优先级（优先使用 lz4 压缩）也不能解决问题。因此，最根本的解决方法就是，关闭压缩。</p><h1 id="解决方法"><a href="#解决方法" class="headerlink" title="解决方法"></a>解决方法</h1><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">echo</span> <span class="string">&#x27;Acquire::GzipIndexes &quot;false&quot;;&#x27;</span> | sudo <span class="built_in">tee</span> /etc/apt/apt.conf.d/99disable-compression</span><br><span class="line">sudo <span class="built_in">rm</span> /var/lib/apt/lists/*.gz  <span class="comment"># 如果你的压缩方式是 lz4，请对应更改</span></span><br><span class="line">sudo apt update</span><br></pre></td></tr></table></figure><p>或者，你也可以只使用 <code>apt-cache search</code>，它总是相当快的。</p><h1 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h1><h2 id="上游问题"><a href="#上游问题" class="headerlink" title="上游问题?"></a>上游问题?</h2><p>这似乎是一个上游问题。Armbian 在 <a href="https://github.com/armbian/build/blob/fc07886a1d5e5013bc27b58cb30d5e3d218e5da9/packages/bsp/common/etc/apt/apt.conf.d/02-armbian-compress-indexes">2018 年 6 月</a>对 apt 增加了一条默认配置 <code>Acquire::GzipIndexes &quot;true&quot;;</code>，使得软件包列表的压缩被默认打开，但 <code>apt search</code> 慢的问题似乎要到 2020 年才出现。Debian 则默认没有配置压缩，因而掩盖了这个问题。<br>在 Debian GNU&#x2F;Linux 10 (buster) on Windows 10 x86_64 上测试，得到了这样的结果：</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">time apt search python</span><br><span class="line">time apt-cache search python</span><br><span class="line"></span><br><span class="line"><span class="comment"># 未配置压缩（Debian 默认配置：不被压缩）</span></span><br><span class="line"><span class="comment"># apt search python  1.10s user 0.38s system 80% cpu 1.840 total</span></span><br><span class="line"><span class="comment"># apt-cache search python  0.34s user 0.14s system 99% cpu 0.481 total</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 开启压缩（默认优先级：被 lz4 压缩）</span></span><br><span class="line"><span class="comment"># apt search python  67.92s user 6.86s system 99% cpu 1:15.20 total</span></span><br><span class="line"><span class="comment"># apt-cache search python  0.38s user 0.18s system 99% cpu 0.568 total</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 开启压缩（Armbian 优先级：被 gzip 压缩）</span></span><br><span class="line"><span class="comment"># apt search python  678.15s user 6.50s system 99% cpu 11:25.26 total</span></span><br><span class="line"><span class="comment"># apt-cache search python  0.47s user 0.10s system 98% cpu 0.575 total</span></span><br></pre></td></tr></table></figure><h2 id="磁盘用量"><a href="#磁盘用量" class="headerlink" title="磁盘用量"></a>磁盘用量</h2><p>不必担心关闭压缩后磁盘用量会大幅增长，事实上不会增加太多，磁盘空间并没有时间宝贵。关闭压缩后，Armbian 初始的软件源的软件包列表也仅仅占用 100M 左右的空间，确实不能明白默认开启压缩的用意。</p><h2 id="关于-PINE-H64-Model-B"><a href="#关于-PINE-H64-Model-B" class="headerlink" title="关于 PINE H64 Model B"></a>关于 PINE H64 Model B</h2><p>可以在<a href="https://www.armbian.com/pine-h64/">这里</a>下载适用于它的 Armbian 镜像。它的 TF 卡槽只有 HS 级别，并不支持 UHS。一张 4K 读写性能不太差的卡就能满足使用。<br><a href="https://www.pine64.org/pine-h64-ver-b/">产品页</a>和 <a href="https://wiki.pine64.org/wiki/PINE_H64">PINE64 wiki</a> 都写错了 WiFi 能力，它只能使用 2.4GHz 频段，不支持 11ac。<br>PINE H64 Model A 实际是一款流产的产品，由于它采用的 Allwinner(R) H6 SoC 在 PCIe 上的<a href="https://linux-sunxi.org/H6#Errata">天坑</a>，它的 mPCIe 插槽不再有很大的意义，没有 mPCIe 插槽的 Model B 就是这么诞生的。</p>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;背景&quot;&gt;&lt;a href=&quot;#背景&quot; class=&quot;headerlink&quot; title=&quot;背景&quot;&gt;&lt;/a&gt;背景&lt;/h1&gt;&lt;p&gt;原本想购入一块 Raspberry Pi，奈何价格长期虚高，就在某天从女票票手里顺走了一块 &lt;a href=&quot;https://www.pine64.org/pine-h64-ver-b/&quot;&gt;PINE H64 Model B&lt;/a&gt;。往一张 TF 卡里灌入 Armbian 的镜像，就可以愉快地玩耍了。&lt;/p&gt;
&lt;p&gt;Armbian 衍生自 Debian。对于 Debian 系，当你需要管理软件包时，通常会使用 &lt;code&gt;apt&lt;/code&gt; 来完成。而要搜索软件包，则有 &lt;code&gt;apt search&lt;/code&gt; 和 &lt;code&gt;apt-cache search&lt;/code&gt; 两种方式，它们的搜索范围、结果详细度、输出的可读性都不尽相同，且通常后者是更快的。&lt;/p&gt;
&lt;p&gt;自某个时候开始，在某些灌入 Armbian 的设备上，使用 &lt;code&gt;apt search&lt;/code&gt; 搜索软件包变得无可容忍地慢，而 &lt;code&gt;apt-cache search&lt;/code&gt; 却仍然保持着较高的速度。Armbian 论坛上的这个 &lt;a href=&quot;https://forum.armbian.com/topic/14064-my-apt-search-has-become-super-slow-recently/&quot;&gt;topic&lt;/a&gt; 讨论了这个问题。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="https://rongrongbq.moe/tags/Linux/"/>
    
    <category term="笔记" scheme="https://rongrongbq.moe/tags/%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="https://rongrongbq.moe/2021/07/hello-world/"/>
    <id>https://rongrongbq.moe/2021/07/hello-world/</id>
    <published>2021-07-04T17:25:21.000Z</published>
    <updated>2021-07-04T17:25:21.000Z</updated>
    
    <content type="html"><![CDATA[<p>记录下文字最大的门槛从来不是没有合适的地方记录，但没有合适的地方记录却常常是疏于记录文字的藉口。</p><p>那么，为了让脑海中漂泊无依的思绪找到其中一个归宿，绒布也就有了地球。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;记录下文字最大的门槛从来不是没有合适的地方记录，但没有合适的地方记录却常常是疏于记录文字的藉口。&lt;/p&gt;
&lt;p&gt;那么，为了让脑海中漂泊无依的思绪找到其中一个归宿，绒布也就有了地球。&lt;/p&gt;
</summary>
      
    
    
    
    
    <category term="随笔" scheme="https://rongrongbq.moe/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
</feed>
