About Blog Contact

暴风播酷云系统设置

前几天,我的亲戚给我送了一个暴风播酷云:

暴风播酷云 图片来源:https://g.pconline.com.cn/product/server/bf/1072087.html

这是暴风公司生产的一个影音类产品。其本来的设计功能是,让用户把他连上家里的宽带,暴风公司用它来做边缘CDN,用户则通过给暴风公司提供带宽赚取暴风商城的代币。设备硬件的性能其实还挺不错的,我就把他换成了Ubuntu 20.04 LTS,用来做文件服务器。

设备组成简介

最开始我还担心,要是这是暴风特地定制的硬件的话,会不会不好找各种芯片的驱动(我的小米R2D路由器就是因为这个原因刷不了OpenWRT)。结果一看,就是一个普通x86_64 PC机的结构:

安装过程

首先要重置BIOS。这是因为系统的BIOS被上了锁,需要重置BIOS才能重装系统。主板文档里面给出了重置方法:关电源后短接1号跳线(JBAT2),几秒钟后拔除跳线帽。

如果想把系统安装到HDD上的话,现在就可以安装了。不过我想把系统按到SSD上,这样在空闲时硬盘可以进入休眠状态,节约能源,延长寿命。但是我在安装的时候遇到了问题,发现安装过程很顺利,但boot的时候怎么着都找不到EFI分区和bootloader。最终我发现是驱动和硬件连接的原因。

主板有2个SATA和一个mSATA接口,不过由于主板的连线设置,这些接口只能同时用2个,到底用哪个用跳线设置。2个SATA被硬盘占了,mSATA又不能用,因此SSD用的一个mini PCIe接口。但SSD又是SATA接口的,因此系统用了一个ASMedia公司的ASM1062 SATA控制器,实现PCIe和SATA的转换(这不是主板的一部分,是系统额外加的)。主板的AMI BIOS貌似没有这个控制器的驱动,因此不能把EFI分区放在上面。我的解决方法是,把2个硬盘连到ASM1062 SATA转PCIe转换器上(这个控制器支持同时接2个SATA),把SSD连到主板的SATA上,这样SSD就能被BIOS识别的。

Ubuntu安装的过程也有一点小坑。显示的有关硬件貌似有点问题,如果是用有图形界面的live-server镜像(比如这个:https://releases.ubuntu.com/18.04/ubuntu-18.04.4-live-server-amd64.iso)的话,要给grub加参数才能正常显示。因此用不带图形界面的镜像,比如这个:http://cdimage.ubuntu.com/ubuntu/releases/18.04/release/ubuntu-18.04.4-server-amd64.iso)。20.04已经不发布没有图形界面的版本了,只有live-server,不过安装时有safe graphics选项,可以选择不使用图形界面。

网络设置

我在装系统的时候没连网线,没让系统自己设置网络,这导致安装好后要手动设置才能连网。其实重装会更快一些,我是想熟悉一下网络设置的有关工具才这么干的。

系统启动后,对网络要从底层向高层做各种设置:

  1. 载入网卡驱动,初始化网卡。这是内核进行的,dmesg里面会显示。一般网卡都是以PCIe设备的形式连到CPU上,这一步进行完应该会建立一个PCIe设备。
  2. 初始化链路层(link layer),建立和路由器的链路层连接,建立一个interface提供网络层使用。如果是WiFi的话,就是建立和AP的连接,包括身份认证、选择channel、速率协商等步骤。
  3. 初始化网络层。对于动态IP的情况,一般情况要执行DHCP协议,获取自己的IP,子网掩码,获取gateway IP,得到DNS服务器地址等,根据这些信息设置路由表。

做完这3步才能上网。第1步主要是通过内核boot参数和内核有关配置文件来设置,2,3步则都是由用户态程序进行的。一般情况下,网络管理器(network manager)会把2,3步都给完成了,这样我们什么都不用干。Ubuntu下面的网络管理器就叫NetworkManager,用nmcli指令可以访问其命令行版。也可以使用别的工具对2,3步分别进行设置,不过要注意的是,网络管理器和具体的设置工具最好不要同时用,可能会出现设置的冲突。类似,也不要同时使用多个网络管理器,也可能出现冲突。可以看看Arch的这个教程,详细的说明了各种网络管理工具的关系:Network Configuration

我没有安装别的工具,直接使用了systemd-networkd提供的设置。在/etc/systemd/network/文件夹里面建立一个以.network结尾的文件,里面写:

[Match]
Name=enp2s0
[Network]
DHCP=yes

enp2s0换成你的以太网interface的名字1。这个文件指示systemdenp2s0这个interface启动以后,自动执行DHCP协议(包括IPv4和IPv6),获取IP地址, 配置DNS等。然后systemctl restart systemd-networkd即可。(可能要重启)。可以执行networkctl status查看IP获取的情况,如果显示类似这样的结果,就说明你配置好了

  Address: 192.168.1.11 on enp2s0                          
           2408:1111:2222:3333:4444:5555:6666:7777 on enp2s0
           fe80::2222:3333:4444:5555:6666:7777 on enp2s0              
  Gateway: 192.168.1.1 on enp2s0         
           fe80::1  on enp2s0             
      DNS: 192.168.1.1                                     

Wake On Lan

我希望可以远程控制开机,这样我躺在床上就可以开启服务器了。幸好,这台电脑的网卡和BIOS支持Wake on Lan技术,可以实现远程开机。Wake On Lan技术是说,关机后,网卡不彻底断电,而是启动一个低功耗的硬件电路,监测链路上有没有一个满足特定条件的MagicPacket(TM)2,有的话就开机。

这个指令查看网卡支不支持设置Wake on Lan:

sudo ethtool enp2s0

看看Supports Wake-on这行有没有g,有的话就是支持。比如我的网卡显示:

Supports Wake-on: pumbg

运行:

sudo ethtool -s enp2s0 wol g

启用Wake on Lan。有可能重启后设置就失效了。可以设置systemd-networkd使得每次开机自动设置。在/etc/systemd/network/里面建立一个.link结尾的文件,加上:

[Match]
MACAddress=00:11:22:33:44:55

[Link]
WakeOnLan=magic

MACAddress写网卡的MAC地址。这样重启设置就不会丢了。

由于开机启动过程是BIOS负责的,因此也要设置一下BIOS,启动Wake on Lan功能。每个BIOS都不一样,这里就不说了。

要想使用这个功能的话,在同一个子网的电脑上运行这个脚本即可:

import socket
import sys

def wakeonlan(mac : str):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    mac = b''.join([int(i, base=16).to_bytes(1, 'big') for i in mac.split(":")])
    msg = bytes(b'\xff') * 6 + mac * 16
    s.sendto(msg, ('<broadcast>', 3000))

if __name__ == "__main__":
    wakeonlan(sys.argv[1])

命令行第一个参数写要启动的设备的MAC。这个脚本器是就是广播一个UDP包,里面先把0xFF重复6次,再把mac地址重复16次。广播的原因是,关机以后ARP表可能会过期,而目标设备又关机了,这时候ARP的话肯定没结果,如果指定IP地址的话可能会导致找不到路线。直接发目标是设备MAC的以太网帧其实也可以,就是编程麻烦一点。

  1. 这里说一下interface的名字,各个网络interface现在有一套“可预测”的命名方法(https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/)。这是根据网络设备的PCIe地址和别的一些参数实现的,这样就不会出现重启一次interface名字就变了的情况。en开头的是以太网设备,wl开头的是WiFi设备。 

  2. 这是AMD的商标哦,可以参考一下文档。