分类 Rock64 下的文章

挖藕,厉害了

================
来自我的Armbian on Rock64(大雾)


第一次在Linux环境下配置中文输入法。为啥呢?因为Fedora已经自带装好了,用服务器也不用打汉字啊

实属懒得回寝室拿电脑的神奇操作

然后看到网上的教程,全都零零碎碎的,从ArchWiki看到博客,好像都没说完整= =

简而言之的话安装包括大致5个部分,fcitx本体、输入法(实现方式)、输入法UI实现、输入法皮肤和设置UI:

sudo apt install fcitx fcitx-libpinyin fcitx-tools fcitx-frontend-gtk3 fcitx-ui-classic fcitx-config-gtk

用Linux也有几个年头了,最长碰见的问题就是,不同的程序对于同一套基础软件有着不同的版本需求,比如Python2/Python3,Java8/Java11,以及各个版本的gcc等等。然而,由于太懒一直没有找到一个好的软件版本管理工具。

可是这次在玩Rock64的时候,被mawk活生生地坑了一把,还顺便学会了update-alternatives这个基本命令= =

起因是Rock64的swap虚拟内存。秉持着内存多大,swap就应该有多大的传统思想,看到我4G内存的Rock64只有1G的swap,心里甚是不爽,于是决定修改配置文件来把swap修改到至少2G以上。

由于编写系统的人不同,初始化系统swap的脚本位置也不同。在Armbian的系统下,使用的swap也是压缩的zram,初始化的脚本位置在/usr/lib/armbian/armbian-zram-config

可以看到其中激活zram作为swap分区的函数activate_zram_swap,截取其中的关键部分如下:

# Load zram module with n instances for swap: one per CPU core, $ZRAM_MAX_DEVICES
# defines the maximum, on modern kernels we overwrite this with 1 and rely on
# max_comp_streams being set to count of CPU cores or $ZRAM_MAX_DEVICES
uname -r | grep -q '^3.' && zram_max_devs=${ZRAM_MAX_DEVICES:=4} || zram_max_devs=1
cpu_cores=$(grep -c '^processor' /proc/cpuinfo | sed 's/^0$/1/')
[[ ${cpu_cores} -gt ${zram_max_devs} ]] && zram_devices=${zram_max_devs} || zram_devices=${cpu_cores}
module_args="$(modinfo zram | awk -F" " '/num_devices/ {print $2}' | cut -f1 -d:)"
[[ -n ${module_args} ]] && modprobe zram ${module_args}=$(( ${zram_devices} + 2 )) || return

# Expose 50% of real memory as swap space by default
zram_percent=${ZRAM_PERCENTAGE:=50}
mem_info=$(LC_ALL=C free -w 2>/dev/null | grep "^Mem" || LC_ALL=C free | grep "^Mem")
memory_total=$(awk '{printf("%d",$2*1024)}' <<<${mem_info})
mem_per_zram_device=$(( ${memory_total} / ${zram_devices} * ${zram_percent} / 100 ))

可以看到,脚本获得系统的内存容量,然后按照预先设置好的比例建立好zram的分区大小。奇怪的是,按照脚本设计,zram大小应该是系统内存的一半实际上只有四分之一。

这是为啥呢?好问题。

在我多次修改swap分区比例,并重启测试之后发现,似乎脚本所识别到的内存容量只占总内存容量的一半。在我手动执行了上面的相关代码后,露出了端倪:awk的数据大小有限制。系统所自带的awk,允许的最大整数为2147483647,使用再大的数输入awk,输出的整数结果都不会超过这个数,而这恰好是一个32位有符号整形的最大值。

在网上冲浪后发现,实际上Debian最小化安装版(听名字应该能发现Armbian是Debian家的吧)中,默认自带的awkmawk,查看版本可以发现这玩意还是1996年11月的,怎么想支持64位数据的可能性都不大= =(ps. 查了一下,amd64指令集的提出是2000年,产品最早出现在2003年)

然后就要感谢大公无私的GNU了。作为awk的后继,GNU组织开发了gawk,在实现awk原有功能的基础上添加了大量插件库(虽然我还没用到过),不必多想,64位数据的问题自然早已解决。

安装完gawk后,实际上系统是把/usr/bin/awk最终重定向到了gawk的可执行文件。根据上文表述可以推测,Debian的非最小化安装版本的默认awk不是mawk,而是gawk。这也是为啥只有在嵌入式设备上才容易发生这类问题的原因了吧= =

为什么说是最终呢?观察/usr/bin/awk的指向可以发现,它并非直接指向/usr/bin/gawk,而是指向了/etc/alternatives/awk。这就引出了本文的后半篇内容,update-alternatives命令。(名字又臭又长的,一度以为是ubuntu用户专属命令

update-alternatives是Linux下的一个标准命令。简单解释来说,就是允许在系统中安装同一个软件包的多个版本,并且根据需求修改默认调用软件包版本的版本。比如在本文前半篇中的场景,一个系统中可能同时安装了mawkgawk,两者的基本功能完全一致,到底使用哪一个awk作为默认的这个工作,就可以通过update-alternatives配置软链接轻松完成。

常用命令:

update-alternatives --get-selections # 查看当前所有存在配置的文件(似乎还可以配置程序库)
update-alternatives --config <name>  # 使用交互方式设置该条目的默认配置;如果留空,对当前系统中存在的所有条目依次进行配置

主要起因是IPv6的出现吧。。现在大部分卖得火的便宜路由器往往会因为要么存储空间或RAM太小,或者CPU等硬件尚未得到支持而无法使用诸如OpenWRT一类的第三方固件。估计是出于商业目的吧,现在的路由器都不会宣称自己支持IPv6,到时候路由器就可以卖两道了。(然而放在移动放在学校寝室里的华为的接入点可以支持IPv6,估计要上千)然后接上自己的路由器,IPv6地址就没了,怪可惜的。因而打算同时支持IPv4+IPv6的“路由器”,学校接入点每次都要登陆,显然不行,主角就打算选这个刚买的开发板了。在我原本的想象中,这件事应该是十分简单的,计算机网络理论十分完整而清晰,再加上GNU这样的开源组织,多少也会提供一个能用的解决方案吧,毕竟路由器这玩意还是十分实用的。结果后来发现,著名的OpenWRT还是因为Cisco因为偷偷使用了Linux才不得不开源的。开源路由固件大头都要靠这种方式开头,这发展指望不得啊,唉。。。

现在的探索历程就很迷,在国内搜,估计基本tmd都是为了应付计网实验的,两台主机,静态ip,加个ip forward完事,要不就是vmware;在国外,也差不多只会实现流量转发的功能,不过写得比较实在,会在标题写上“流量转发”四个大字而不是像国内一样,不但话说不清楚,反倒觉得自己很NB了。看了一下鸟叔的Linux私房菜,不过里面关于路由器的那部分,层次有点高。。那真的是讲路由器的,不过是路由器之间的配置,上升到RIP和OSPF那个层次了。。我想要和下层设备的交互部分,DHCP啊。。

可能是没有找到正确博客的原因吧,在各大搜索引擎上零零散散地只是搜集到了一些相关的组件,比如Linux内核自带的IP转发IP forwarding功能,具有类似IP防火墙功能的iptables提供了网络地址转换NAT功能,hostapd提供的Wi-Fi热点功能,以及提供PPPoE拨号的pppoepppoeconf软件包(Ubuntu)。这虽然已经构成了路由器最基本的功能:数据的定向转发,但是离日常生活中花钱买的路由器还是有点距离的。除路由器的核心功能外,最关键的,也是最常用的一个,私以为便是DHCP了。

从stackoverflow上获得推荐的,ubuntu的官方路由搭建指导: https://help.ubuntu.com/community/Router

里面提到了一个DHCP服务器,不过Debian Buster的apt里面好像没有这个包: https://help.ubuntu.com/community/dhcp3-server

到时候有时间试试手动编译吧。

目前对于整个架构的设想: 使用开发板上的千兆网口作为网络输入,开发板上装Linux系统并进行有线网拨号;(已实现,pppoe) 插入无线网卡(RTL8188EU,已有内置驱动支持),作为Wi-Fi热点的发射装置;(已实现,hostapd) 使用虚拟网桥将有线网与Wi-Fi连接,让连入了Wi-Fi的设备可以手动配置后上网;(根据进一步的调查,发现这个可能要用iptables比较好,网桥的话,pppoe不知道能不能作为设备连接起来) 添加DHCP等路由器-终端自动配置服务,自动完成无线网络参数配置; 最后,如果可能的话,再更改一下Wi-Fi的认证机制,使其支持企业级认证。(记录一下,可能考虑用LEAP或者PEAP)