笔记本服务器改造踩坑

公司入职发了台 16G 内存的惠普笔记本,买了 Mac 之后一直闲置,在拖延许久之后终于抽时间将其换成 CentOS,来搞一些自己的服务放上面,毕竟 16G 内存还是很可观的配置。本篇讲述折腾过程。

安装 CentOS

安装过程就不多说了,需要注意的就是关闭安全启动,启用传统模式(事实上启用之后是 UEFI 和传统模式混用,这种情况下 CentOS 会自动以 UEFI 模式进行安装)。这里有一个坑点在于如果在安装过程中选择无线连接,在安装完之后该连接无法启用。因为选择了最小化安装,网络管理相关的依赖是残缺的,所以需要在安装之后手动修复。

命令行模式下的网络连接

首先查看网络设备:

1
2
3
4
5
[root@localhost ~]# nmcli dev status
DEVICE TYPE STATE CONNECTION
wlp2s0 wifi unmanaged --
enp1s0 ethernet unavailable --
lo loopback unmanaged --

证明无线网卡没有被管理,需要将其纳入网络管理。

安装 NetworkManager-wifi 包重启即可,由于在安装过程中连接过无线网,那么在 /etc/sysconfig/network-scripts 目录下可以看到 ifcfg-[SSID] 的配置文件,那么重启之后会用该文件连接 wifi 网络。

没有网络怎么安装依赖包呢?挂安装光盘起本地镜像就好,在 /etc/yum.repos.d/CentOS-Media.repo 中指定了本地镜像源的挂载位置,挂在到相应位置启用即可。

设置公网访问

电信提供公网 IP,在路由器中将该电脑设备设置为 DMZ 区设备即可利用公网 IP 访问,需要注意的是启用 DHCP 的话内网 IP 可能变化,要在路由器配置中将特定的固定 IP 地址与设备 MAC 进行绑定,如此便确保 DMZ 区的设备始终为该电脑设备。

休眠问题

笔记本电脑合盖之后会自动休眠,需要进行配置,使其在合盖操作时依然保持运行状态。

编辑 /etc/systemd/logind.conf 文件,找到如下部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
HandlePowerKey=ignore # 按电源键时不做任何处理
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate
HandleLidSwitch=ignore # 合上盖子时不做任何处理
#HandleLidSwitchDocked=ignore
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#IdleAction=ignore
#IdleActionSec=30min
#RuntimeDirectorySize=10%
#RemoveIPC=no
#UserTasksMax=

这里对该文件有详细的描述:https://www.freedesktop.org/software/systemd/man/logind.conf.html

到这里应该已经 OK 了,但是合上盖子后发现,即使通过局域网内进行 ssh 连接操作,都异常卡顿,网络连接非常慢。然而确实是可以连接上去的,服务器并没有休眠。这就让我开始怀疑除了上述控制休眠的设定之外,还有其他配置,猜测是由于电源管理的问题引起的。

由电源管理着手,搜寻资料,找到了一份《Red Hat Enterprise Linux 7 电源管理指南》。在其中发现了管理无线设备的工具,RFKill。此处引用原文介绍:

很多计算机系统包含无线电传输,其中包括 Wi-Fi、蓝牙和 3G 设备。这些设备消耗电源,在不使用这些设备时是一种浪费。
RFKill 是 Linux kernel 中的一个子系统,它可提供一个界面,在此界面中可查询、激活并取消激活计算机系统中的无线电传输。当取消激活传输时,可使其处于可被软件重新激活的状态(即“软锁定”)或者将其放在软件无法重新激活的位置(即“硬锁定”)。

刚开始以为这就是原因,后来才发现该软件包和 BIOS 设定中的启用硬件设备一样,都是为了在电脑运行时停止启用某些设备。

1
2
3
4
5
6
7
8
9
10
[root@localhost yum.repos.d]# rfkill list
0: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
2: hp-wifi: Wireless LAN
Soft blocked: no
Hard blocked: no

要么启用,要么禁用。这跟合上盖子启用网卡节能的现象不太相符。后来同样在该手册中,我发现了ASPM(Active-State Power Management,活动状态电源管理)。

ASPM(Active-State Power Management,活动状态电源管理)能节省 PCI Express(PCIe,Peripheral Component Interconnect Express)子系统的电量,其原理为当 PCIe 连接没有处于使用状态时将其设定为低功率状态。ASPM 可以同时控制连接两端的电源状态,并且在连接终端的设备处于满电状态的情况下,仍然可以节电。

看描述和我遇到的问题比较相符,在如下文件中可以看到 ASPM 的策略配置。

1
2
[root@localhost yum.repos.d]# cat /sys/module/pcie_aspm/parameters/policy
[default] performance powersave

在默认情况下,ASPM 是默认状态(default),即根据固件设置设定 PCIe 连接的状态。在上述文件中去直接更改设置是不可以的,修改的话系统会报写保护,手册中提到可以在启动时作为内核参数配置,参考 《在 CentOS 7 上设置 grub2》尝试之:

1
2
3
4
5
6
7
8
[root@localhost yum.repos.d]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet pcie_aspm=off"
GRUB_DISABLE_RECOVERY="true"

核心参数就是 pcie_aspm=off。重启之后测试,立竿见影,当我觉得问题解决的时候。过了一个小时,又歇菜了,又开始陷入了卡顿。

这时考虑,可能默认的固件设置还是会生效,只是相比较系统的设置而言没那么严格,遂决定尝试更改策略,而不是完全禁用。将 GRUB 配置中改为:

1
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet pcie_aspm.policy=performance"

一切运行 OK,只能说服务器发行版运行于个人 PC 时,还是有或多或少的水土不服的。

2 小时后的更新

本以为一切 OK 的时候,又出现了该问题,看来还是没有找到问题的根源。随后又将视线转向TUNED 和 TUNED-ADM

tuned 是一项配置文件调整机制,使 Red Hat Enterprise Linux 适应特定负载特性,例如 CPU 密集型任务要求,或存储/网络吞吐量的响应能力。
伴随它的工具 ktune 结合了 tuned-adm 工具,提供大量预先配置的调整分析,以便在大量具体使用案例中提高性能并降低能耗。编辑这些配置或者创建新配置可生成为系统定制的性能解决方案。

系统内预设了一些 profile,通过这些 profile 可以快速选择性能的优化方案,查看 profile 列表:

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# tuned-adm list
Available profiles:
- balanced - General non-specialized tuned profile
- desktop - Optimize for the desktop use-case
- latency-performance - Optimize for deterministic performance at the cost of increased power consumption
- network-latency - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
- network-throughput - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
- powersave - Optimize for low power consumption
- throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
- virtual-guest - Optimize for running inside a virtual guest
- virtual-host - Optimize for running KVM guests
Current active profile: balanced

在官网提供的配置列表中还有一项名为 sap 的配置,不得不感叹果真第一 ERP 系统,连红帽都为其做单独的优化配置。

默认启用的是 balanced,在能耗和性能之间尽可能达到最佳平衡,猜测可能对网络进行限制,于是我将其改为 throughput-performance,这将关闭节点并提高网络吞吐能力。更改之后需要重启 tuned 服务:

1
systemctl restart tuned

最好重启系统以使其运行在更改之后的配置下,重启之后验证,还是不行,遂决定禁用 tuned 服务再次验证。

禁用 tuned 服务执行如下命令:

1
tuned-adm off

并直接禁用 tuned 进程:

1
2
systemctl stop tuned
systemctl disable tuned

重启之后验证,问题仍旧出现,让我想放弃用无线连接方式,买根网线改用有线方式了。不过由此过程找到的文档:《虚拟化调试和优化指南》 值得阅读。

回头看网络管理

既然 Linux 本身通过 NetworkManager 来管理网络服务,在开头也是安装了 NetworkManager-wifi 包才能使用无线网络,那么有可能在网络管理这边就有相应的配置。在 windows 系统中同样在网卡设置中有相应的节能配置,因此查找资料,发现一个配置项。

NetworkManager supports WiFi powersaving but the function is rather undocumented.

From the source code: wifi.powersave can have the following value:

NM_SETTING_WIRELESS_POWERSAVE_DEFAULT (0): use the default value
NM_SETTING_WIRELESS_POWERSAVE_IGNORE (1): don’t touch existing setting
NM_SETTING_WIRELESS_POWERSAVE_DISABLE (2): disable powersave
NM_SETTING_WIRELESS_POWERSAVE_ENABLE (3): enable powersave

/etc/NetworkManager/conf.d 目录下新建文件 wifi-powersave-off.conf

1
2
3
[connection]
# Values are 0 (use default), 1 (ignore/don't touch), 2 (disable) or 3 (enable).
wifi.powersave = 2

将其关闭,重启网络服务,再次验证:

1
systemctl restart NetworkManager

配置免密登录

事实上 CentOS 7.4 之后,使用了 ssh 2.0 版本的协议,无需手动配置 sshd_config 来启用免密登录,默认是启用的。如果像之前那样配置 RSAAuthentication yes 选项,会在 /var/log/secure 记录中看到如下提示:

1
Nov 17 14:47:06 localhost sshd[11773]: reprocess config line 43: Deprecated option RSAAuthentication

此次设置公钥之后,仍然无法登录,搜索资料有说是 SELinux 引起的,关闭 SELinux 仍然无法免密登录。查找许久后发现是我本地的 ssh 连接配置出现了问题。

1
2
3
4
Host 192.168.1.*
HostName %h
User root
IdentityFile ~/.ssh/xxx

我的局域网连接恰好和该 ip 段重复,所以一直使用错误的密钥文件进行连接。

添加了一条特殊的 ip 配置之后,问题解决,由此也说明 ssh 的 config 文件配置具体 ip 的优先级要高于表达式匹配,无所谓配置在文件中的先后顺序。

至此,便可以快乐的玩耍这台小鸡了。

参考

-EOF-

本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处! © 雨落
  1. 1. 安装 CentOS
  2. 2. 命令行模式下的网络连接
  3. 3. 设置公网访问
  4. 4. 休眠问题
  5. 5. 2 小时后的更新
  6. 6. 回头看网络管理
  7. 7. 配置免密登录
  8. 8. 参考