<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>软路由 on STARRY-S&#39; Blog</title>
    <link>https://blog.starry-s.moe/tags/%E8%BD%AF%E8%B7%AF%E7%94%B1/</link>
    <description>Recent content in 软路由 on STARRY-S&#39; Blog</description>
    <image>
      <title>STARRY-S&#39; Blog</title>
      <url>https://blog.starry-s.moe/web-app-manifest-512x512.png</url>
      <link>https://blog.starry-s.moe/web-app-manifest-512x512.png</link>
    </image>
    <generator>Hugo</generator>
    <language>zh</language>
    <copyright>2016 - 2026 STARRY-S | CC BY-NC-SA 4.0 | Hosted on GitHub Pages
</copyright>
    <lastBuildDate>Wed, 08 Jun 2022 00:49:34 +0800</lastBuildDate>
    <atom:link href="https://blog.starry-s.moe/tags/%E8%BD%AF%E8%B7%AF%E7%94%B1/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>在Arch Linux上配置软路由</title>
      <link>https://blog.starry-s.moe/posts/2022/archlinux-router/</link>
      <pubDate>Wed, 08 Jun 2022 00:49:34 +0800</pubDate>
      <guid>https://blog.starry-s.moe/posts/2022/archlinux-router/</guid>
      <description>&lt;p&gt;之前买了个NanoPi R4S，当时给他装了Arch Linux ARM并用&lt;code&gt;systemd-networkd&lt;/code&gt;配置了一个简易的软路由。不过&lt;code&gt;systemd-networkd&lt;/code&gt;不支持PPPoE，所以当时我是把R4S接在租的房子的主路由下做子路由的，然后再给R4S接了一个小米路由器当作无线AP。最近从北京搬回家了所以想直接使用R4S做家里的主路由，因为&lt;a href=&#34;https://blog.starry-s.moe/posts/2022/nanopi-r4s/&#34;&gt;R4S上手体验&lt;/a&gt;的那篇文章已经写完很久了，所以就不打算在那篇博客上做修改了，而是新开（水）了一篇博客。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>之前买了个NanoPi R4S，当时给他装了Arch Linux ARM并用<code>systemd-networkd</code>配置了一个简易的软路由。不过<code>systemd-networkd</code>不支持PPPoE，所以当时我是把R4S接在租的房子的主路由下做子路由的，然后再给R4S接了一个小米路由器当作无线AP。最近从北京搬回家了所以想直接使用R4S做家里的主路由，因为<a href="/posts/2022/nanopi-r4s/">R4S上手体验</a>的那篇文章已经写完很久了，所以就不打算在那篇博客上做修改了，而是新开（水）了一篇博客。</p>
<blockquote>
<p>这里偷偷骂一下长城宽带没人反对吧</p>
</blockquote>
<h2 id="准备工作">准备工作</h2>
<p>按照Arch Wiki的<a href="https://wiki.archlinux.org/title/Router#Connection_sharing">Router页面</a>，你的电脑需要符合安装Arch Linux的基础硬件要求，且至少具备俩物理网口。</p>
<p>个人觉得软路由没必要非得刷*WRT或者其他路由器专用系统，也没必要搞个爱快群辉什么的系统，我只想给他装我喜欢的发行版，然后我自己配置我需要的服务，只要有两个以上的物理网口就可以配置路由功能，给他们配置DHCP和流量转发就完事了，这样搞出来的路由器更符合咱自己的需求，相对来讲也更灵活一些，不用受限于那些路由器/NAS定制的系统，而缺点则是比较折腾，有可能不稳定。</p>
<p>安装系统的步骤咱跳过不讲了，Wiki上有的东西没必要在这里重复一遍。</p>
<h2 id="配置ip地址">配置IP地址</h2>
<p>首先，将你电脑的两个物理网口一个用作WAN口（连接广域网），一个用作LAN口（连接局域网），有需要的可以自行修改网口的名称（通常默认的网卡名字为<code>eth*</code>，或者<code>enp*s*</code>）。
为了和Wiki同步，这里假设WAN口的名字为<code>extern0</code>，用来指连接到广域网的网口，LAN口的名字为<code>intern0</code>，代指连接到局域网的网口。</p>
<p>本篇使用<code>netctl</code>配置网络，在修改配置文件之前，需要先停掉其他配置网络的服务。</p>
<p>给LAN口配置一个静态IP地址。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># /etc/netctl/intern0-profile
</span></span><span class="line"><span class="cl"># Config file for intern0 (LAN)
</span></span><span class="line"><span class="cl">Description=&#39;Private Interface. (LAN)&#39;
</span></span><span class="line"><span class="cl">Interface=intern0
</span></span><span class="line"><span class="cl">Connection=ethernet
</span></span><span class="line"><span class="cl">IP=&#39;static&#39;
</span></span><span class="line"><span class="cl">Address=(&#39;10.10.10.1/24&#39;)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">IP6=&#39;static&#39;
</span></span><span class="line"><span class="cl">Address6=(&#39;fdaa:aaaa:bbbb::0001/64&#39;)
</span></span><span class="line"><span class="cl">SkipNoCarrier=yes
</span></span></code></pre></div><p>以上配置将为LAN口设定IPv4的地址为<code>10.10.10.1</code>，IPv6的地址为<code>fdaa:aaaa:bbbb::0001</code>。
你可以给这个网口设定任意的局域网IP地址，通常为<code>10.*</code>，<code>172.*</code>，<code>192.168.*</code>这些网段的任意一个地址，
IPv6的局域网网段为<code>fd00::/8</code>，通俗一点讲就是<code>fd**</code>开头的一般都是局域网的IP地址。</p>
<p>之后给WAN口配置DHCP或PPPoE协议。</p>
<blockquote>
<p>配置DHCP的方式自行翻Wiki或者看example，这里不重复讲了。</p>
</blockquote>
<p>在配置PPPoE之前需要安装<code>ppp</code>。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># /etc/netctl/extern0-profile
</span></span><span class="line"><span class="cl"># Config file for public interface (WAN)
</span></span><span class="line"><span class="cl">Description=&#39;Public Interface. (WAN)&#39;
</span></span><span class="line"><span class="cl">Interface=extern0
</span></span><span class="line"><span class="cl">Connection=pppoe
</span></span><span class="line"><span class="cl">User=&#39;username&#39;
</span></span><span class="line"><span class="cl">Password=&#39;samplepasswd&#39;
</span></span><span class="line"><span class="cl"># IP6=stateless
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Always keep a connection established
</span></span><span class="line"><span class="cl">ConnectionMode=&#39;persist&#39;
</span></span></code></pre></div><p>使用以下命令启动<code>netctl</code>的配置文件。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">netctl enable intern0-profile
</span></span><span class="line"><span class="cl">netctl enable extern0-profile
</span></span></code></pre></div><p>重启路由器，将WAN口与光猫的网口连接，使用<code>ip addr</code>查看网络设备的IP地址，顺利的话，可以看到一个名为<code>ppp0</code>的网口，并获取了一个运营商分给你的IP地址。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">1: intern0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc fq_codel state UP group default qlen 1000
</span></span><span class="line"><span class="cl">    link/ether fa:97:da:d8:9d:8a brd ff:ff:ff:ff:ff:ff
</span></span><span class="line"><span class="cl">    inet 10.10.10.1/24 brd 10.10.10.255 scope global intern0
</span></span><span class="line"><span class="cl">       valid_lft forever preferred_lft forever
</span></span><span class="line"><span class="cl">    inet6 fdaa:aaaa:bbbb::1/64 scope global nodad
</span></span><span class="line"><span class="cl">       valid_lft forever preferred_lft forever
</span></span><span class="line"><span class="cl">    inet6 fe80::f897:daff:fed8:9d8a/64 scope link
</span></span><span class="line"><span class="cl">       valid_lft forever preferred_lft forever
</span></span><span class="line"><span class="cl">2: extern0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP group default qlen 1000
</span></span><span class="line"><span class="cl">    link/ether ca:1f:4a:9b:29:df brd ff:ff:ff:ff:ff:ff
</span></span><span class="line"><span class="cl">    inet6 fe80::c81f:4aff:fe9b:29df/64 scope link
</span></span><span class="line"><span class="cl">       valid_lft forever preferred_lft forever
</span></span><span class="line"><span class="cl">3: ppp0: &lt;POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP&gt; mtu 1492 qdisc fq_codel state UNKNOWN group default qlen 3
</span></span><span class="line"><span class="cl">    link/ppp
</span></span><span class="line"><span class="cl">    inet 123.123.123.123 peer 123.123.123.1/32 scope global ppp0
</span></span><span class="line"><span class="cl">       valid_lft forever preferred_lft forever
</span></span><span class="line"><span class="cl">    inet6 240e:aaaa:bbbb:cccc:::eeee/64 scope global dynamic mngtmpaddr
</span></span><span class="line"><span class="cl">       valid_lft 259132sec preferred_lft 172732sec
</span></span><span class="line"><span class="cl">    inet6 fe80::aaaa:bbbb:cccc:dddd peer fe80::aaaa:bbbb:cccc:dddd/128 scope link
</span></span><span class="line"><span class="cl">       valid_lft forever preferred_lft forever
</span></span></code></pre></div><p>如果遇到了问题，可以使用<code>systemctl status netctl@extern0\\x2dprofile.service</code>查看一下错误信息。
如果是认证失败的话，重启几次这个service说不定就好了。</p>
<h2 id="配置dns和dhcp">配置DNS和DHCP</h2>
<p>安装<code>dnsmasq</code>，编辑<code>/etc/dnsmasq.conf</code>。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Setup listen address
</span></span><span class="line"><span class="cl">listen-address=10.10.10.1,127.0.0.1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Do not read /etc/resolv.conf
</span></span><span class="line"><span class="cl">no-resolv
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Use following dns servers
</span></span><span class="line"><span class="cl">server=114.114.114.114
</span></span><span class="line"><span class="cl">server=8.8.8.8
</span></span><span class="line"><span class="cl">server=8.8.4.4
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Bind interface
</span></span><span class="line"><span class="cl">interface=intern0
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Setup domain
</span></span><span class="line"><span class="cl">expand-hosts
</span></span><span class="line"><span class="cl">domain=foo.bar
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Setup IPv4 DHCP
</span></span><span class="line"><span class="cl">dhcp-range=10.10.10.100,10.10.10.255,255.255.255.0,12h
</span></span><span class="line"><span class="cl"># Setup IPv6 DHCP
</span></span><span class="line"><span class="cl">dhcp-range=fdaa:aaaa:bbbb::000a, fdaa:aaaa:bbbb::ffff, 64, 12h
</span></span></code></pre></div><p>使用<code>systemctl enable --now dnsmasq.service</code>启动<code>dnsmasq</code>，
之后重启路由器，使用网线连接将电脑连接到路由器的LAN口，顺利的话可以自动获取一个IP地址。</p>
<p>如果没获取到IP地址的话，有可能是DHCP服务器的问题，先尝试在电脑上手动设置一个IP地址，之后尝试ping路由器的IP（<code>10.10.10.1</code>）。
如果还是无法连接到路由器的话，就需要重新检查一下路由器的配置了。</p>
<h2 id="网络共享">网络共享</h2>
<p>首先<a href="https://wiki.archlinux.org/title/Internet_sharing#Enable_packet_forwarding">参照Wiki</a>，开启数据包转发的功能。</p>
<p>之后安装<code>iptables</code>，配置ipv4和ipv6的流量伪装。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">iptables -A FORWARD -i intern0 -j ACCEPT
</span></span><span class="line"><span class="cl">iptables -A FORWARD -o intern0 -j ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
</span></span><span class="line"><span class="cl">iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
</span></span><span class="line"><span class="cl">iptables -A FORWARD -i intern0 -o ppp0 -j ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">iptables -t mangle -A FORWARD -o ppp0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">ip6tables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
</span></span></code></pre></div><p>之后可使用<code>iptables-save -f /etc/iptables/iptables.rules</code>和
<code>ip6tables-save -f /etc/iptables/ip6tables.rules</code>将ip桌子的规则保存下来。</p>
<h2 id="done">Done</h2>
<p>以上配置完成后，按理来说路由器就已经配置好了。</p>
<p>调试的过程为首先在路由器上尝试ping一个广域网的域名或IP地址（<code>8.8.8.8</code>），之后将路由器与电脑用网线连接，
电脑应当通过DHCP自动获取到一个随机的IP地址。
之后在电脑上尝试打开一些理应能打开的网站，应该是能打开的。</p>
<p>如果能电脑可以ping通一个广域网的IP，但是打不开网站的话，就检查一下路由器DNS配置，
如果路由器上能ping通一个广域网的IP，但电脑连IP地址都ping不通，那就去检查一下ip桌子的流量伪装规则，检查一下网口名字有没有写对之类的。</p>
<p>之后如果一切都调试成功的话，就可以把家里的无线路由器改成“有线中继”模式了，这样家里的无线路由器将只作为一个无线AP使用，路由的功能将全部由刚刚配置好的软路由实现。</p>
<p>配置好“有线中继”模式后，电脑连接无线WIFI后获得的IP地址应当是软路由分配的IP地址，网段为刚刚咱们设置的<code>10.10.10.*</code>，
而不再是<code>192.168.*</code>的IP地址了。</p>]]></content:encoded>
    </item>
    <item>
      <title>NanoPi R4S上手 &amp; 安装Arch Linux ARM</title>
      <link>https://blog.starry-s.moe/posts/2022/nanopi-r4s/</link>
      <pubDate>Fri, 13 May 2022 00:32:40 +0800</pubDate>
      <guid>https://blog.starry-s.moe/posts/2022/nanopi-r4s/</guid>
      <description>&lt;p&gt;前两天下单了个Nano Pi R4S，4G内存的版本。通常情况下这玩意别人都把他当软路由用，但是今天咱收到货后想了一会拍大腿一寻思这玩意不就是个ARM架构的小电脑嘛~&lt;/p&gt;
&lt;p&gt;所以咱暂时先不打算给这玩意装OpenWRT或 *WRT这类的路由器系统了，而是把它当成一个超小号的带俩网口的mini主机折腾。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>前两天下单了个Nano Pi R4S，4G内存的版本。通常情况下这玩意别人都把他当软路由用，但是今天咱收到货后想了一会拍大腿一寻思这玩意不就是个ARM架构的小电脑嘛~</p>
<p>所以咱暂时先不打算给这玩意装OpenWRT或 *WRT这类的路由器系统了，而是把它当成一个超小号的带俩网口的mini主机折腾。</p>
<meting-js server="netease" type="song" id="19563215" theme="#233333"></meting-js>
<h2 id="开箱">开箱</h2>
<p><img loading="lazy" src="images/nanopi_1.jpg" alt="&ldquo;USB 3.0、SD卡插槽以及三脚架接口&rdquo;" />
<p style="margin-bottom: -0.8em;" class="image-title">USB 3.0、SD卡插槽以及三脚架接口</p>
</p>
<p><img loading="lazy" src="images/nanopi_2.jpg" alt="&ldquo;供电接口和网口&rdquo;" />
<p style="margin-bottom: -0.8em;" class="image-title">供电接口和网口</p>
</p>
<p><img loading="lazy" src="images/nanopi_3.jpg" alt="&ldquo;正面&rdquo;" />
<p style="margin-bottom: -0.8em;" class="image-title">正面</p>
</p>
<h2 id="拆解">拆解</h2>
<p>咱收到货后第一件事就是找螺丝刀和塑料卡片把这漏油器拆开看看（</p>
<p><img loading="lazy" src="images/nanopi_7.jpg" alt="" />
<p style="margin-bottom: -0.8em;" class="image-title">主板正面</p>
</p>
<p>芯片的布局可以在<a href="https://www.friendlyelec.com/index.php?route=product/product&amp;product_id=284">R4S的商品页面</a>查到，<a href="https://wiki.friendlyelec.com/wiki/index.php/NanoPi_R4S">官方Wiki</a>上也有更多关于R4S的介绍。</p>
<h2 id="arch-linux-arm">Arch Linux ARM</h2>
<p>在Arch Linux ARM (简称alarm) 官网上没找到对R4S的官方的支持，简单搜了一下armbian有对R4S的官方支持。</p>
<p>因为用惯了<strong>滚动更新</strong>发行版，所以不想用*bian系统，而*WRT系统的软件包相对其他发行版而言更少一些，系统也相当于被魔改过，所以除了做漏油器之外几乎干不了别的，所以这是我想安装Arch Linux的理由。</p>
<p>然后咱搜到了一篇给<a href="https://gist.github.com/larsch/a8f13faa2163984bb945d02efb897e6d">NanoPi R2S安装alarm的教程</a>，评论里有人提到了给R4S安装也是可以的。</p>
<p>所以咱大致把这个教程翻译一下，再修改一些R2S和R4S在安装时的区别。</p>
<p>以下内容需结合alarm的 <a href="https://archlinuxarm.org/platforms/armv8/generic">aarch64通用安装教程</a>食用，像更新pacman-key，ssh的密码之类的部分咱就不在这里重复了。</p>
<h3 id="准备sd卡">准备SD卡</h3>
<ol start="0">
<li>
<p>下载armbian的镜像，下载链接自行谷歌。</p>
<blockquote>
<p>通常下载好的文件是<code>xz</code>格式的压缩文件，需要使用<code>unxz</code>解压成<code>img</code>镜像。</p>
</blockquote>
</li>
<li>
<p>将armbian镜像的<code>bootloader</code>和<code>uboot</code>(32-32767区块的部分)用<code>dd</code>写到SD卡中：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="c1"># Clean the sector before 32</span>
</span></span><span class="line"><span class="cl"><span class="n">dd</span> <span class="k">if</span><span class="o">=/</span><span class="n">dev</span><span class="o">/</span><span class="n">zero</span> <span class="n">of</span><span class="o">=/</span><span class="n">dev</span><span class="o">/</span><span class="n">sdX</span> <span class="n">bs</span><span class="o">=</span><span class="mi">1</span><span class="n">M</span> <span class="n">count</span><span class="o">=</span><span class="mi">32</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Write uBoot and bootloader</span>
</span></span><span class="line"><span class="cl"><span class="n">dd</span> <span class="k">if</span><span class="o">=</span><span class="n">Armbian_</span><span class="o">*.</span><span class="n">img</span> <span class="n">of</span><span class="o">=/</span><span class="n">dev</span><span class="o">/</span><span class="n">sdX</span> <span class="n">skip</span><span class="o">=</span><span class="mi">31</span> <span class="n">seek</span><span class="o">=</span><span class="mi">31</span> <span class="n">bs</span><span class="o">=</span><span class="mi">512</span> <span class="n">count</span><span class="o">=</span><span class="mi">32736</span>
</span></span></code></pre></div><blockquote>
<p>其实可以直接用<code>dd</code>把armbian的整个镜像写到内存卡中然后插入R4S开机，第一次开机后他会自动重新给内存卡分区，然后只需把<code>/dev/sdX1</code>格式化成ext4就能安装alarm了。</p>
</blockquote>
</li>
<li>
<p>使用<code>fdisk</code>给内存卡分区并格式化文件系统</p>
<p>创建分区时先按<code>o</code>创建个MBR分区表，然后按<code>n</code>添加分区。第一个分区的起始区块(sector)需要设置为32768，通常情况下分一个区就够用了，或者你可以像我这样分俩区，一个给swap，不过实际没啥必要。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Disk /dev/mmcblk1: 29.72 GiB, 31914983424 bytes, 62333952 sectors
</span></span><span class="line"><span class="cl">Units: sectors of 1 * 512 = 512 bytes
</span></span><span class="line"><span class="cl">Sector size (logical/physical): 512 bytes / 512 bytes
</span></span><span class="line"><span class="cl">I/O size (minimum/optimal): 512 bytes / 512 bytes
</span></span><span class="line"><span class="cl">Disklabel type: dos
</span></span><span class="line"><span class="cl">Disk identifier: 0x33fc535e
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Device         Boot    Start      End  Sectors  Size Id Type
</span></span><span class="line"><span class="cl">/dev/mmcblk1p1         32768 53944319 53911552 25.7G 83 Linux
</span></span><span class="line"><span class="cl">/dev/mmcblk1p2      53944320 62333951  8389632    4G 82 Linux swap / Solaris
</span></span></code></pre></div><p>创建完分区后，把<code>root</code>分区<code>mkfs.ext4</code>格式化成ext4，swap分区用<code>mkswap</code>格式化。</p>
</li>
<li>
<p>解压alarm系统文件到root分区中</p>
</li>
<li>
<p>复制并替换armbian的<code>/boot</code>中的文件到新建分区的<code>/boot</code>文件夹中。</p>
</li>
<li>
<p>编辑<code>/boot/armbianEnv.txt</code>，更新<code>rootdev</code>的UUID
使用<code>blkid</code>或者<code>lsblk -o+UUID</code>可以查看UUID，注意是<strong>UUID</strong>不是PARTUUID。</p>
</li>
<li>
<p>插电，开机 (<del>此处不会出现五安大电牛</del>)，网线连接R4S的WAN口到路由器的LAN口，第一次开机需要生成SSH Key所以时间会久一些，然后就可以ssh到R4S上去辣。</p>
</li>
</ol>
<h3 id="内核">内核</h3>
<p>上述的安装步骤使用的armbian的内核，可以正常开机，但是想用Arch Linux stock aarch64内核的话，得替换一下DTB文件。（DTB文件是啥我目前还不清楚，如果后续弄明白了再更新到博客上吧）</p>
<ol>
<li>
<p>ssh到R4S中，安装<code>linux-aarch64</code>。</p>
</li>
<li>
<p>修改使用的DTB文件：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">cd /boot
</span></span><span class="line"><span class="cl">rm dtb
</span></span><span class="line"><span class="cl">ln -sf dtbs dtb
</span></span></code></pre></div><p>编辑<code>armbianEnv.txt</code>，在末尾添加一行<code>fdtfile=rockchip/rk3399-rockpro64.dtb</code>。</p>
<blockquote>
<p>在<code>/boot/dtb/rockchip</code>目录下是可以找到<code>rk3399-nanopi-r4s.dtb</code>文件的，但是目前用这个DTB的话会导致PCIE不能正常工作，导致LAN口无法使用。
<code>dmesg</code>的输出为：</p>
</blockquote>
<blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-prolog" data-lang="prolog"><span class="line"><span class="cl"><span class="s">dmesg</span> <span class="p">|</span> <span class="s">grep</span> <span class="s">pci</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span>    <span class="mf">0.538310</span><span class="p">]</span> <span class="s">ehci</span><span class="o">-</span><span class="nn">pci</span><span class="p">:</span> <span class="nv">EHCI</span> <span class="nv">PCI</span> <span class="s">platform</span> <span class="s">driver</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span>    <span class="mf">0.559708</span><span class="p">]</span> <span class="s">ohci</span><span class="o">-</span><span class="nn">pci</span><span class="p">:</span> <span class="nv">OHCI</span> <span class="nv">PCI</span> <span class="s">platform</span> <span class="s">driver</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span>    <span class="mf">2.999933</span><span class="p">]</span> <span class="s">rockchip</span><span class="o">-</span><span class="s">pcie</span> <span class="s">f8000000</span><span class="p">.</span><span class="nn">pcie</span><span class="p">:</span> <span class="s">host</span> <span class="s">bridge</span> <span class="o">/</span><span class="s">pcie@f8000000</span> <span class="nn">ranges</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span>    <span class="mf">2.999974</span><span class="p">]</span> <span class="s">rockchip</span><span class="o">-</span><span class="s">pcie</span> <span class="s">f8000000</span><span class="p">.</span><span class="nn">pcie</span><span class="p">:</span>      <span class="nv">MEM</span> <span class="mh">0x00fa000000</span><span class="p">.</span><span class="mf">.0</span><span class="s">x00fbdfffff</span> <span class="s">-&gt;</span> <span class="mh">0x00fa000000</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span>    <span class="mf">2.999987</span><span class="p">]</span> <span class="s">rockchip</span><span class="o">-</span><span class="s">pcie</span> <span class="s">f8000000</span><span class="p">.</span><span class="nn">pcie</span><span class="p">:</span>       <span class="nv">IO</span> <span class="mh">0x00fbe00000</span><span class="p">.</span><span class="mf">.0</span><span class="s">x00fbefffff</span> <span class="s">-&gt;</span> <span class="mh">0x00fbe00000</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span>    <span class="mf">3.000410</span><span class="p">]</span> <span class="s">rockchip</span><span class="o">-</span><span class="s">pcie</span> <span class="s">f8000000</span><span class="p">.</span><span class="nn">pcie</span><span class="p">:</span> <span class="s">no</span> <span class="s">vpcie12v</span> <span class="s">regulator</span> <span class="s">found</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span>    <span class="mf">3.500881</span><span class="p">]</span> <span class="s">rockchip</span><span class="o">-</span><span class="s">pcie</span> <span class="s">f8000000</span><span class="p">.</span><span class="nn">pcie</span><span class="p">:</span> <span class="nv">PCIe</span> <span class="s">link</span> <span class="s">training</span> <span class="s">gen1</span> <span class="s">timeout</span><span class="p">!</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span>    <span class="mf">3.500944</span><span class="p">]</span> <span class="s">rockchip</span><span class="o">-</span><span class="nn">pcie</span><span class="p">:</span> <span class="s">probe</span> <span class="s">of</span> <span class="s">f8000000</span><span class="p">.</span><span class="s">pcie</span> <span class="s">failed</span> <span class="s">with</span> <span class="s">error</span> <span class="o">-</span><span class="mi">110</span>
</span></span></code></pre></div><p>于是就先用rockpro64的DTB文件了。</p>
</blockquote>
</li>
<li>
<p>创建uBoot镜像和initramfs。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pacman -S uboot-tools
</span></span><span class="line"><span class="cl">mkimage -A arm64 -T ramdisk -n uInitrd -d /boot/initramfs-linux.img /boot/uInitrd-initramfs-linux.img
</span></span><span class="line"><span class="cl">ln -sf /boot/uInitrd-initramfs-linux.img /boot/uInitrd
</span></span></code></pre></div><p>创建个<code>pacman</code>的钩子，在以后更新<code>linux-aarch64</code>的时候自动的重新构建uboot和initramfs。</p>
<p>在<code>mkdir -p /etc/pacman.d/hooks</code>目录下创建<code>/etc/pacman.d/hooks/initramfs.hook</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-pacmanconf" data-lang="pacmanconf"><span class="line"><span class="cl"><span class="k">[Trigger]</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">Operation</span> <span class="o">=</span> Install<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">Operation</span> <span class="o">=</span> Upgrade<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">Type</span> <span class="o">=</span> Package<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">Target</span> <span class="o">=</span> linux-aarch64<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">
</span></span></span><span class="line"><span class="cl"><span class="k">[Action]</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">Description</span> <span class="o">=</span> Generate uInitrd<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">Exec</span> <span class="o">=</span> /usr/bin/mkimage -A arm64 -T ramdisk -n uInitrd -d /boot/initramfs-linux.img /boot/uInitrd-initramfs-linux.img<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">When</span> <span class="o">=</span> PostTransaction<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">Depends</span> <span class="o">=</span> uboot-tools<span class="err">
</span></span></span></code></pre></div></li>
<li>
<p>重启，<code>uname -a</code>输出的应该是新版本的内核了。</p>
<p>有个细节，用armbian的DTB文件时，开机后SYS LED灯是闪烁的，但是换到rockpro60的DTB文件后只有PWR灯长亮，别的灯都不闪了。</p>
</li>
</ol>
<h2 id="router">Router</h2>
<p>虽然装的是Arch Linux ARM系统，但是这并不代表它不能作为一个路由器使用。</p>
<p>系统默认用的是<code>systemd-networkd</code>管理网络，所以以下内容使用<code>systemd-networkd</code>配置路由器，暂时没遇到问题，如果不行的话我再换别的。</p>
<blockquote>
<p>参考: <a href="https://wiki.archlinux.org/title/Router">Router - ArchWiki</a></p>
</blockquote>
<h3 id="重命名网络接口">重命名网络接口</h3>
<blockquote>
<p>这一步并非必须，但是我有遇到重启系统后网口从<code>eth0</code>变成<code>eth1</code>的情况，所以还是给网口重命个名好一些。</p>
</blockquote>
<p>首先移除并备份<code>/etc/systemd/network</code>中原有的配置文件。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /etc/systemd/network
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># backup config files</span>
</span></span><span class="line"><span class="cl">mv ./* /root/
</span></span></code></pre></div><p>获取WAN口的mac地址。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat /sys/class/net/eth0/address
</span></span><span class="line"><span class="cl">12:34:56:78:90:ab
</span></span></code></pre></div><p>创建<code>10-extern0.link</code>，重命名<code>eth0</code>到<code>extern0</code>。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-pacmanconf" data-lang="pacmanconf"><span class="line"><span class="cl"><span class="k">[Match]</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">MACAddress</span><span class="o">=</span>12:34:56:78:90:ab<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">
</span></span></span><span class="line"><span class="cl"><span class="k">[Link]</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">Description</span><span class="o">=</span>WAN<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">Name</span><span class="o">=</span>extern0<span class="err">
</span></span></span></code></pre></div><p>另一个网口(LAN)在开机时<code>systemd-networkd</code>会自动给他重命名为<code>enp1s0</code>。</p>
<h3 id="wan口配置dhcp客户端">WAN口配置DHCP客户端</h3>
<p>这里我是把R4S的WAN口接到另一台路由器的LAN上，所以配置的是DHCP客户端。如果你打算直接把路由器接光猫，而且你的猫设置了桥接，那么你可能需要配置PPPOE。</p>
<p>创建<code>20-extern0.network</code>。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-pacmanconf" data-lang="pacmanconf"><span class="line"><span class="cl"><span class="k">[Match]</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">Name</span><span class="o">=</span>extern0<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">
</span></span></span><span class="line"><span class="cl"><span class="k">[Network]</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">DHCP</span><span class="o">=</span>yes<span class="err">
</span></span></span></code></pre></div><h3 id="lan口配置静态ip和dhcp服务器">LAN口配置静态IP和DHCP服务器</h3>
<p>给LAN口设置成另一个网络的静态IP地址，并配置DHCP服务器，给连接到LAN口的机器分配同一个网络下的其他IP地址。</p>
<p>创建<code>20-enp1s0.network</code>。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-pacmanconf" data-lang="pacmanconf"><span class="line"><span class="cl"><span class="k">[Match]</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">Name</span><span class="o">=</span>enp1s0<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">
</span></span></span><span class="line"><span class="cl"><span class="k">[Network]</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">Address</span><span class="o">=</span>10.0.0.1/24<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">DHCPServer</span><span class="o">=</span>true<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">IPMasquerade</span><span class="o">=</span>both<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="k">
</span></span></span><span class="line"><span class="cl"><span class="k">[DHCPServer]</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">PoolOffset</span><span class="o">=</span>100<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">PoolSize</span><span class="o">=</span>100<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="na">EmitDNS</span><span class="o">=</span>yes<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="c1"># DNS=8.8.8.8</span><span class="err">
</span></span></span></code></pre></div><p>我这个配置是给LAN口设置了静态IP地址<code>10.0.0.1</code>，掩码<code>255.255.255.0</code>，启用了DHCP服务器，
设置了IPv4数据“伪装”(packets forwarded from the network interface will be appear as coming from the local host)。</p>
<p>有关配置文件的参数可以使用<code>man systemd.network</code>查询。</p>
<p>暂时还没搞懂怎么折腾IPv6，如果配置好IPv6的话我再补上……</p>
<h2 id="后续">后续</h2>
<p>之后咱装了JDK以及一堆我常用的小组件。为了测试性能，我把我以前备份的Minecraft服务器复制到R4S上跑了一下试试。我的服务器之前是在疼讯云学生主机上跑的(1核2G)，装了好多性能优化插件(lithium，phosphor，carpet&hellip;)，版本是1.16.4，抱着尝试的心态跑了一下这个服务器结果发现很流畅，一开始区块加载的时候CPU的6个核心全跑满，之后就恢复到正常水平了。刚才尝试了一下长时间的生成区块貌似没什么大的问题，只要别一直用鞘翅跑图就行，应该是内存够用了所以运行效果要好一些，不过单核性能来讲的话肯定还是X86吊打R4S的。</p>
<p>毕竟这就是半个巴掌大小的机器，跑MC的时候CPU温度才不到50度，应该不需要主动散热，功耗才十多瓦……</p>
<p><img loading="lazy" src="images/nanopi_performance.png" alt="&ldquo;MineCraft Server Performance&rdquo;" />
<p style="margin-bottom: -0.8em;" class="image-title">MineCraft Server Performance</p>
</p>
<p><img loading="lazy" src="images/nanopi_neofetch.png" alt="&ldquo;Arch Linux ARM&rdquo;" />
<p style="margin-bottom: -0.8em;" class="image-title">Arch Linux ARM</p>
</p>
<h2 id="参烤链接">参烤链接</h2>
<ul>
<li><a href="https://www.friendlyelec.com/index.php?route=product/product&amp;product_id=284">NanoPi R4S</a></li>
<li><a href="https://wiki.friendlyelec.com/wiki/index.php/NanoPi_R4S">NanoPi R4S - FriendlyELEC WiKi</a></li>
<li><a href="https://gist.github.com/larsch/a8f13faa2163984bb945d02efb897e6d">Installing Arch Linux AArch64 on the NanoPi R2S</a></li>
<li><a href="https://archlinuxarm.org/platforms/armv8/generic">Generic AArch64 Installation | Arch Linux ARM</a></li>
<li><a href="https://wiki.archlinux.org/title/Router">Router - ArchWiki</a></li>
<li><a href="https://wiki.archlinux.org/title/Systemd-networkd">systemd-networkd - ArchWiki</a></li>
<li><a href="https://man.archlinux.org/man/systemd.network.5">systemd.network(5) — Arch manual pages</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/392619184">在 NanoPi R2S 上安装 Archlinuxarm - 知乎</a></li>
</ul>]]></content:encoded>
    </item>
  </channel>
</rss>
