Browsed by
Category: 计算机技术

openEuler 的苦难体验

openEuler 的苦难体验

下午忙完工作、又临近周末,想着抽点时间体验一下 openEuler 系统,毕竟这是华为隆重推出、并且捐赠的系统,据说会成为国内各大系统的上游版本,有点类似 Debian 的意思。简单查了点资料,openEuler 大概是走 CentOS 或者 RHEL 的路子,着重在企业级系统的开发和部署上,听上去似乎很合我的胃口,我在 Debian 上也主要是开发企业用的软件(比如 miniSIPServer 软件 ^_^)。

从网上下载了 ISO 安装包,名字比较古怪,openEuler-20.03-LTS-SP2。从字面意思大概是 20.03 版本的第二个迭代版本,这个版本是长期支持版本。又顺手查了一下对应的生命周期,“长期”是指5年。这个5年是从20年03月开始算起,不是从SP2 发布开始算起。之所以觉得名字古怪,从网站的内容看,还以为需要下载三个版本,如下图。似乎应该先安装 20.03 LTS,然后安装 SP1,然后安装 SP2,但是看了一下安装包大小,没可能一个补丁那么大啊,这是学习 Windows 的命名方式? 事实证明,直接下载、安装 SP2 就可以了。

openEuler 下载页面
openEuler 下载页面

下载 iso 包中断了几次,显然是我的 300M 光纤宽带不够给力。转到阿里云的镜像站点下载,同样在中断几次之后,终于下载成功。

手头上没有实机,因此只能麻烦 openEuler 在 VirtualBox 中先凑合一下了。

第一次安装……失败。安装界面的按钮居然是在左上角!我一直按照以往的经验在右下角找“下一步”按钮,以为是 VirtualBox 的原因导致无法显示按钮。愤怒地升级 VirtualBox 后,重新安装,终于无意中找到了左上角的按钮……对不起,VirtualBox,错怪你了。

第二次安装……失败。安装倒是顺利完成,进入黑暗的命令行界面,然后……网络不通!难道要自己从命令行配置网卡、路由?我只是 Linux 用户,不是专家,书到用时方恨少。一定是哪出错了,以前安装别的发布版本(我的意思是 Debian 或者 Ubuntu),从来没出现这么奇怪的要求。上网查了安装指导文档(请点击此处),果然是自己没注意安装界面中开启网络。

第三次安装……失败。同样顺利地完成安装,进入无比黑暗的命令行界面,然后……网络还是不通!重新看文档,怪自己太粗心。原来安装时开启网络,只是在安装时有效,不等于安装后自动开启网络(真的,这个说起来有点挠头),需要在安装时,进入网络属性配置里,选定“自动以优先级连接”,然而这个项在界面里是英文 Connect automatically with priority(中英文混杂,很有港味、很 fashion!):

openEuler 网络配置
openEuler 网络配置项

第四次安装……失败。精心配置好网络,选中必要的选项,顺利进入依然黑暗的命令行界面,然后按照文档的指导(请点击此处)安装 XFCE,太棒了!重启后看到了久违的图形界面,然后登录……然后登录……然后登录……(很不幸,每次输入用户密码后,闪一下,又回到输密码的界面)

第五次安装……失败一半。淡定地配置好网络,进入暗黑无界的命令行界面,然后按照文档的指导(请点击此处)安装 DDE 界面。不愧是国产精品,非常顺利,这次可以登录,也可以使用各种软件了!只是有个小小的遗憾,系统没有自动调整界面大小,因此整个图形界面小小的。这个我懂,安装 VirtualBox 增强功能就可以了。将 VirtualBox 增强功能的虚拟光盘手工 mount 到目录后(Debian 以及后续尝试的 CentOS 都可以自动mount),运行编译,很快就……失败了!查了一下log,是调用 access_ok 函数时出错,从网络上检索的信息看,大概是 openEuler 合并了 5.x 内核的代码,但是自身内核版本号还是 4.x,企业级 Linux 玩得这么骚气吗? CentOS/RHEL 也这样? 要搞定这个问题,需要改源码……我只是想安装 openEuler 体验一下……

但是 DDE 确实值得一提!速度非常快,如果不是上述界面过小的原因,那就是 DDE 这两年进步确实很大。以前曾经体验过 Deepin 的版本,当时感觉界面还比较混乱、速度也不太让人满意,这次大有改观。唯一奇怪的是,我觉得“高效模式”比“时尚模式”更好看,这大概是我自己杀马特审美的错。

五次安装之后,窗外的天空已经黑得像个命令行界面,我沉痛地决定放弃了,下一个 LTS 版本出来后再体验吧。

2021-11-27 更新:

考虑到 openEuler 的令人迷惑的行为,是否是目前 RHEL/CentOS 系列的常态?下载了 CentOS stream 8(也是个令人迷惑的版本)安装,对比 openEuler 确实大部分都相同,当然也有小部分不一样:

(1)安装按钮都在左上角。看来这是新一代安装工具的标配了。

(2)网络配置默认都没有打开,都需要手工打开,而且要修改配置中的项才能在安装后自动启动网络。但 CentOS 的完成度明显更高,至少界面语言是统一的,没出现混杂的情况。

(3)CentOS 的软件设置更丰富,实际上丰富很多。安装完成后,可以直接进入图形界面。

CentOS 软件选择
CentOS 软件选择

(4)安装完成后都无法安装 VirtualBox 增强功能。CentOS 的 log 显示的是另一个与“map_vm_area”函数相关的错误。简单检索后得出相同的结论:也是 merge 了 5.x 内核的内容,但是内部版本号还是停留在 4.x。 企业级 Linux 玩得这么骚气,有点令人意外,这和掩耳盗铃有什么区别?

2021-11-27 再次更新:

由于 openEuler 和 CentOS Stream 都遇到了无法正常编译 VitualBox 增强工具的情况,都需要修改增强工具的源码才能编译成功,因此思考 VirtualBox 自己是不是会解决这个问题? 查了一下 changelog,在 VirtualBox 6.1.20 版本的发布日志中明确提到:

Linux Guest Additions: Fixed kernel module build for RHEL 8.4 beta and CentOS Stream

看起来的确是解决了问题,因此重新下载最新的 VirtualBox V6.1.30,果然成功了! 如下图示:

CentOS Stream 完全展开
CentOS Stream 完全展开

解决完CentOS Stream的问题后,猜测 openEuler 是否也可以一起解决了? 于是第六次安装 openEuler,然后……失败了。看来 VirtualBox 并没有解决 access_ok 函数的问题,估计 openEuler 相关人员也没有提交类似的问题给 VirtualBox ……

Apache 日志分析工具:goaccess

Apache 日志分析工具:goaccess

如果统计、分析网站日常的访问情况,无疑优选 Google Analytics。不过由于众所周知的原因,访问稍显麻烦,而且有时候希望了解更细节一些的东西,因此最好直接检查 Apache 的日志来获取相关信息。日常维护时,同步检查日志也有助于尽早发现问题。

推荐采用一个非常小巧的工具:goaccess,这个工具基本不依赖第三方库(似乎有一个地理位置信息的库),Debian 系统自带,使用也非常简单,呈现的信息足够丰富、有序。

使用以下命令安装:

sudo apt install goaccess

可以直接读取 Apache 的日志文件进行分析,例如:

goaccess /var/log/apache2/access.log

Apache 的历史日志都保存为 .gz 格式,可以直接重定位方式进行分析,例如:

zcat -f /var/log/apache2/access.log*.gz | goaccess --log-format=COMBINED

goaccess 还有其他一些很棒的功能,例如实时显示、html格式等,有兴趣的话可以进一步了解。日常维护则上述命令足以。

公共 DNS 服务器

公共 DNS 服务器

在路由器配置中,通常可以指定 DNS 服务器,如果不单独指定,那默认就是运营商给定的 DNS 服务器。考虑到国情在此,建议指定 DNS 服务器。

国内有很多家服务商能提供公共 DNS 服务,例如腾讯(DNSPod)、阿里等。综合这几年的使用情况看,采用腾讯和Cloudflare 两家的 DNS 服务器作为主备,对于我(坐标:深圳电信)是个比较好的选择。

通常,我设置 Cloudflare 家的 DNS 服务器作为主服务器,腾讯家的 DNS 服务器作为备用服务器。这两家也都支持 IPv6 以及 DoH 等,充分满足需要,下面列示这两家的信息。

Cloudflare:

IPv4: 1.1.1.1
IPv6: 2606:4700:4700::1111
DoH:  https://cloudflare-dns.com/dns-query

腾讯:

IPv4:119.29.29.29
IPv6: 2402:4e00::
DoH:  https://doh.pub/dns-query

如果使用 Firefox 浏览器并采用 DoH,默认就是 Cloudflare 的 DoH,无需额外配置。

Firefox 中的 DoH 配置
DoH in Firefox

Javascript 模板字符串

Javascript 模板字符串

在编写 JS 代码时(例如我们的小网站、或者 miniSIPServer 的 web 管理界面),拼接字符串是件很头疼的事情,尤其是字符串本身又可能包含单引号(‘)或者双引号(“)的情况时,简直头晕眼花。

显然,这样的痛苦不是仅仅一小部分人才有,因此有人(ES6规范?)聪明地引入了“模板字符串”这么一个语法糖,顺利解决了问题。在 JS 文件中,采用反单引号“`”,即键盘左上角那个引号,和“${}”即可完成拼接,如以下示例:

<div>`My name is ${usrName}`</div>

修改 root 用户的PATH

修改 root 用户的PATH

最近工作需要安装了一台运行 Debian 11 系统的电脑,不知道是不是很久没安装 Debian 系统的原因,惊讶地发现 root 用户的路径少了很多,比如 /sbin, /usr/sbin 路径等。这些路径都是一些系统管理员级命令所在,不清楚什么原因没有加入 root 的默认路径。

不想影响其他用户,因此只要单纯修改 root 用户 HOME 目录下的”.bashrc”文件,在该文件尾加入以下语句即可:

export PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin
定时清理释放内存

定时清理释放内存

家里有台 Raspberry Pi3, 日常做点小任务,比如做 samba 服务器当 NAS、做 web 的功能测试、学习点 Linux 知识等,基本都是一些负荷不大的任务。不过由于我是死忠的 GUI 党, 因此总是喜欢进入 Pi 那个巨丑无比的界面里进行操作,这也导致 Pi3 的内存会逐渐显得有些捉襟见肘,时间长了,就不得不使用 swap 。这可能会有损 microSD 卡的寿命,因此希望 Pi 能定时清理、释放内存。

网上搜了搜,也比较简单,而且效果比较明显。简要记录一下:

在 /etc/cron.daily 目录下,创建一个 gilson-clearcache 文件,内容如下:

#!/bin/sh
sync
echo 3 > /proc/sys/vm/drop_caches

将这个文件设置为可执行文件即可:

sudo chmod +x ./gilson-clearcache

设置为可执行文件后,可以手工执行一下,可以看到 “free -m” 显示的结果里,“buff/cache available”等项有明显的改善。

不过考虑到 Pi3 可怜的 1GB 内存,这种内存回收方面的改善,估计不能从根本上解决问题,上 Pi4 (2GB或者4GB)或许更好。后续继续观察一下,如果实在不行,就换 Pi4 或者等 Pi5 吧。

给 vbox 的客机系统扩容

给 vbox 的客机系统扩容

主机是Window 10, 运行在 VirtualBox 中的客机系统是 Debian (testing)。当初估计不足,只划了 8G 空间给客机系统,因此面临着容量不足的问题,迫切需要扩容,要不然就要重新构建一个客机,实在过于麻烦了。

从网上搜集了一些信息,有各种问题。绝大部分的资料其实不能算扩容,无非就是增加一个盘,然后 mount 到新的分区而已。而我希望是将现有的虚拟硬盘直接扩容,无需改变或者 mount 特定的分区或者目录。最后通过安装 GParted 软件,加上修改部分配置,终于解决了问题,从8G 扩展到 28G, 如下图所示:

扩容后的硬盘分区
扩容后的硬盘分区

系统只有两个分区: 主分区 和 交换分区。目的就是扩大主分区(/dev/sda1)的容量即可,其他无需改变(至少在使用者的角度是没有任何变化)。

增加 VBox 虚拟介质容量

VBox 新版都支持给虚拟介质扩容,操作简单。在“管理 – 虚拟介质管理”里找到客机的虚拟介质,直接增加容量即可。比如,将介质从 8G 直接调整到 28G。

但是客机系统不是直接就使用了扩容的硬盘容量。新增加的部分对客机系统而言,属于“未分配”的容量,因此需要进入客机系统(也就是 Debian)中进行磁盘管理,让系统能识别、管理这部分新容量。

Debian 磁盘管理

牛人直接用 fdisk 大概就可以搞定。作为一名无可救药的图形界面党, 我当然还是倾向于使用图形界面的软件来解决问题(非常不 linux,非常不 geeker),也就是 GParted。

GParted 很像 Windows 的磁盘管理工具,因此使用起来油然而生熟悉的感觉。启动 GParted 后,很容易就看到未分配的磁盘容量。可惜不能直接移动或者扩容/dev/sda1,原因大概是中间有个 swap 分区。刚开始我被困住了,后来想明白:

既然 swap 分区阻挡了主分区的扩容(移动),那删除掉 swap 分区,那主分区和未分配分区不就连起来了吗? 试试后发现果然如此:(1)删除 swap 分区, (2)调整主分区(/dev/sda1)的大小,(3)然后再重新将剩余的分区设置为 swap 分区。

千万别格式化主分区!只需要重新格式化 swap 分区即可。

GParted 有个bug:在上述步骤中,重新删除、创建了 swap 分区,可是 GParted 并没有修改 /etc/fstab 里对应的 UUID 值!导致每次重启后,发现 swap 区都没有激活使用。

解决这个bug也简单,在 GParted 中查询 swap 分区的属性,获取其 UUID 值,然后修改 /etc/fstab 中对应的 swap 分区的 UUID 值即可。

一点思考

本次扩容过程中,被 swap 分区困扰了很久,有各种问题。要么是 swap 分区阻挡了主分区扩容,要么是 swap 分区的 UUID 更新(这个算GParted的bug)。

如果不设置 swap 分区呢? 修改为采用 swap 文件方式,只保留一个主分区,这样就灵活很多。当然,实际部署 Linux 系统如果采用这种方式,可能会有问题(比如崩盘导致数据丢失等),既然是客机系统,倒是无所谓。

DNS over HTTPs

DNS over HTTPs

传统的 DNS 基于 UDP 协议,并且采用明文方式传递请求和结果。在互联网早期,这样做没什么问题。而现在网络越来越复杂,网络实体越来越多,各种看得见、看不见的手都可能修改 DNS 的结果。

简单的解决方式就是对 DNS 进行加密。 Mozilla 联合 Cloudflare 通过 HTTPs 来传递 DNS 消息,也就是 DoH (DNS over HTTPs)。这种方式从设计上看,不如 DNS over TLS 高效,但是胜在简单、无需过多更改网络设备和软件。

Firefox 已经内置了对 DoH 的支持,而且非常简单。问题是默认的两个 DoH 服务商:Cloudflare 和 NextDNS,在国内由于某种不可描述的原因,访问速度都很受影响。实际上国内腾讯和阿里的公共 DNS 服务也支持 DoH,以腾讯为例,它提供的 DoH 访问地址是:

https://doh.pub/dns-query

Firefox 的网络设置中,按下图进行配置即可:

Firefox 中设置腾讯 DoH
Firefox 中设置腾讯 DoH

另外,阿里提供的 DoH 访问地址为:

https://dns.alidns.com/dns-query
NetworkManager state is now ASLEEP

NetworkManager state is now ASLEEP

最近有一台 HP ELite 笔记本退役了,其实配置还不错,500GB SSD 硬盘、16GB内存,看着挺轻薄,本来还打算用来替换自己平时使用的笔记本,后来发现有些不爽:(1)触控板有点飘 (2)有个键被我不小心按坏了,也许本来就坏了 (3)屏幕时不时出现横线、甚至出现闪烁,很不舒服。

食之无味、弃之可惜。忽然想到可以安装 Debian 做家庭服务器用,上述缺点就无关紧要了。安装了最新的 Debian 10, 然后修改成 Debian(sid),过程很顺利。非常棒!以至于我甚至打算直接 VNC, 或者用 VSCode 登录上去做一些开发工作。

因为是当服务器用,因此一直都是合盖,然后扔角落里默默工作。接着又发现一个问题:过一段时间后,WiFi 网络老是断开,无法远程登录,需要重新开盖然后登录。琢磨着大概是系统休眠了,检查 syslog 信息,发现以下信息:

NetworkManager: sleep: wake requested (sleeping: yes  enabled: yes)
NetworkManager: state change: unavailable -> unmanaged (reason 'sleeping', sys-iface-state: 'managed')
NetworkManager: NetworkManager state is now ASLEEP

看来确实休眠了。搜索网络,查到一篇 Ubuntu 停止休眠的文章(请点击此处),考虑到 Ubuntu 和 Debian 本质没什么区别,操作也是有效的。

关闭休眠功能,请使用以下命令:

sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

当然,如果后悔了,需要重新打开休眠功能,可以使用以下命令(未验证):

sudo systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target
xrdp的小问题

xrdp的小问题

目标系统是 Debian, 采用 xrdp 远程登录窗体界面,总是在显示登录时黑屏。查了很久一直没有结论,后来就干脆用 vnc 算了。

今天在查其他问题时,无意间翻查到文件 “/usr/share/doc/xrdp/README.Debian”, 里面提示需要修改“/etc/X11/Xwrapper.config”文件,将

allowed_users=console

修改为

allowed_users=anybody

重启后,果然可以通过xrdp正常登录了! 只是比较奇怪,为什么 Debian 系统不将默认值修改为 anybody?是没人维护的原因吗? 那为啥又在 readme 文件中单独说明呢?

另外,由于 Raspberry Pi 也是基于 Debian 系统,因此 Pi 中做同样的修改,也可以通过 xrdp 正常登录。

xrdp 读取 “/etc/ssl/private/ssl-cert-snakeoil.key” 进行加密,但是这个文件默认只有 “ssl-cert” 组的成员才可以读取,因此还需要将 xrdp 用户加入该组:

sudo adduser xrdp ssl-cert