暴风播酷云系统设置
前几天,我的亲戚给我送了一个暴风播酷云:
这是暴风公司生产的一个影音类产品。其本来的设计功能是,让用户把他连上家里的宽带,暴风公司用它来做边缘CDN,用户则通过给暴风公司提供带宽赚取暴风商城的代币。设备硬件的性能其实还挺不错的,我就把他换成了Ubuntu 20.04 LTS,用来做文件服务器。
设备组成简介
最开始我还担心,要是这是暴风特地定制的硬件的话,会不会不好找各种芯片的驱动(我的小米R2D路由器就是因为这个原因刷不了OpenWRT)。结果一看,就是一个普通x86_64 PC机的结构:
- CPU : Intel Celeron J3160,14 nm制程,主频1.60 GHz,4核4线程,2 MiB L2 Cache。虽然性能一般,但是做文件服务器肯定是够用的,毕竟文件服务器的主要性能瓶颈在硬盘上。而且其6 W的TDP对于服务器还是比较合适的。
- 主板:梅捷Thin Mini N3160主板。梅捷板卡公司提供了非常详细的说明文档,包括所有跳线的设置方法。
- 硬盘:机器附带了两个2 TB的硬盘,SeaGate SkyHawk ST2000VX003,虽然是比较便宜的版本,但性能应该够用。还有一个万由公司的16 GiB SSD,可以做系统盘。
- 网卡:Realtek RTL8211E 1 Gbps自适应网卡。
安装过程
首先要重置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选项,可以选择不使用图形界面。
网络设置
我在装系统的时候没连网线,没让系统自己设置网络,这导致安装好后要手动设置才能连网。其实重装会更快一些,我是想熟悉一下网络设置的有关工具才这么干的。
系统启动后,对网络要从底层向高层做各种设置:
- 载入网卡驱动,初始化网卡。这是内核进行的,dmesg里面会显示。一般网卡都是以PCIe设备的形式连到CPU上,这一步进行完应该会建立一个PCIe设备。
- 初始化链路层(link layer),建立和路由器的链路层连接,建立一个interface提供网络层使用。如果是WiFi的话,就是建立和AP的连接,包括身份认证、选择channel、速率协商等步骤。
- 初始化网络层。对于动态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。这个文件指示systemd
在enp2s0
这个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的以太网帧其实也可以,就是编程麻烦一点。
-
这里说一下interface的名字,各个网络interface现在有一套“可预测”的命名方法(https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/)。这是根据网络设备的PCIe地址和别的一些参数实现的,这样就不会出现重启一次interface名字就变了的情况。
en
开头的是以太网设备,wl
开头的是WiFi设备。 ↩