用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>  # 使用交互方式设置该条目的默认配置;如果留空,对当前系统中存在的所有条目依次进行配置

devtoolset是个好东西,解决了我使用CentOS多年要自行更新gcc工具链的困扰。

然而我为什么使用了多年才知道= =

使用这条命令启用包含有devtoolset的软件源:

sudo yum install centos-release-scl
sudo yum-config-manager --enable rhel-server-rhscl-7-rpms

然后快乐sudo yum install devtoolset-*即可。

横杠后的数字,可选的有7、8和9。根据测试,分别对应的是GCC的7、8和9三个大版本。

然后是启用:

scl enable devtoolset-8 bash

其中8bash可以分别替换为需要的devtoolset的版本,以及要使用的命令行的可执行文件,就可以实现一般的配置方法了。此时再看gcc -v,主版本和devtoolset的版本一致。

当我实验室的好兄弟告诉我,那台插满了GPU和硬盘的Inspur NF5288服务器家目录炸了的时候,我的内心是拒绝的= =

起初的表现形式是这样的:在家目录下输入ls,直接提示Input/Output error,没有任何商量的余地。
后来重启了一下之后,情况更加混乱了:由于为了合理规划高速/低俗空间,系统装在了RAID 1的SSD中,而家目录则挂在了RAID 5的HDD上。这导致我们的系统启动正常,但是出现了奇怪的IO错误,推测是fstab试图挂载家目录的时候出了问题,结果顺手把系统给崩了。(emm忘记截图了,总是就是要求用户输入root密码修复系统或者Ctrl+D跳过步骤一类的提示,也不知道我是忘记root密码了还是系统出问题了)

然后就开始推测:可能是分区坏了?
遂插入Ubuntu系统安装盘(为啥不是CentOS?因为手头只有Nvidia的安装盘了),准备fsck修复磁盘。然而操作后发现,同样报出I/O error错误,磁盘修复根本无法运行,盘都读不了。

接下来思考后开始怀疑,这个I/O错误指的是不是系统底层硬件上有问题(磁盘修复工具都无法读取,看来是软件无法完成的工作了),于是想起了服务器上8块硬盘上,原本应该是8个绿灯,而现在有2块亮起了红灯。

是不是RAID控制器能给出什么有用的信息?遂重启开机进入RAID管理界面,果然发现了端倪:SSD组成的RAID 1正常工作,而HDD组成的RAID 5处于Offline(即离线/不可用)状态。查看后发现,其中4块好的HDD处于UG状态(推测是正常工作),而有问题的两块处于Frn-Bad状态。

秉着开机时所有HDD全部为绿灯的事实,抱着企业级的HDD(Seagate ST2000NX0253)不会这么容易损坏的心态,查找了一下有没有解决方案,结果还真有:https://support.huawei.com/enterprise/es/doc/EDOC1000163569/e744d41f/restoring-a-hard-drive-in-frn-bad-state

鬼知道为什么最先找到的是西班牙语版的,但我还是说一句菊花NB好吧

SAS3108的RAID管理界面一般有4~5个选项卡,其中第一个可以通过方向键查看磁盘状态。在不同选项卡之间使用Ctrl+N或者Ctrl+P切换。(其实界面最下方有操作说明)

大致步骤如下(华为文档翻译+copy):

  1. 上下键选择到需要修复的RAID阵列,Ctrl+N切换到PD Mgmt(估计是Physical Disk Management的缩写),上下键选到Frn-Bad状态的磁盘,按F2,在菜单中执行Make unconfigured good选项(强制通知RAID控制器本磁盘无物理损坏),然后磁盘会进入Foreign状态。

  2. 之后管理界面会出现第五个选项卡Foreign View。在这里进行RAID配置的恢复。可以参照这个教程:https://support.huawei.com/enterprise/es/doc/EDOC1000163569?section=j04f。 选择到要恢复配置的磁盘标题,然后F2选择Foreign config > Import,完成配置导入工作。

  3. 接下来回到VD Mgmt(Virtual Disk Management),发现之前处在Foreign状态的两块磁盘已经相应地进入了OnlineRebulding状态,分别表示磁盘已经进入了正常工作状态,或是正在进行修复。此时已经可以重新启动,并且正常进入系统了。

  4. 虽然完成配置导入后已经可以启动系统,直接由于不知道在系统正常工作的情况下RAID磁盘的恢复工作是否进行,为了安全起见,本次采用的方法是在RAID管理界面等待修复完成后,再进入系统。修复进度极其缓慢,花了近5个小时才完成一块磁盘的重建= =

后记

后来寻找问题的原因的时候,发现似乎是因为不支持热插拔造成的。

高级作战记录

学长:你看这服务器这么高级,¥%#*#@@#&@%(伸手欲拔出服务器上的硬盘)
我:学长最好还是别拔吧,万一等下出问题...
学长:这又没啥,你看硬盘摆在外面,不就是支持热插拔的吗
(说罢取下一块)
学长:你看,这不是没事吗
(说罢装了回去)

直到几个小时后,有学弟说服务器坏了用不了之后,事态的严重性才扩散开来

(我:得亏学长只拔了一块,拔多了估计真得凉凉)

把WLAN的网络桥接到LAN,按Ctrl依次选中LAN和WLAN,再在WLAN上右键点桥接。

中间可能会需要把网线拔下来,再插上去,一般来说等识别出网络的时间应该在1-2分钟内

不知道是玄学不

从某教育网上摸来的,不知道有用没,先放着

能够升级到校园正版的windows版本有:

win8 企业版和专业版
win7企业版和专业版
vista business 和enterprise版本
升级办法:首先以管理员身份运行命令行CMD,win7和win8都可以在搜索那输入cmd,然后会出来cmd选项,点击右键选择以管理员身份运行, 然后输入命令:

slmgr /ipk KMS密钥

这里的密钥对应你得操作系统版本如下:

Windows 7
Windows 7 Professional FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4
Windows 7 Professional N MRPKT-YTG23-K7D7T-X2JMM-QY7MG
Windows 7 Enterprise 33PXH-7Y6KF-2VJC9-XBBR8-HVTHH
Windows 7 Enterprise N YDRBP-3D83W-TY26F-D46B2-XCKRJ
Windows 7 Enterprise E C29WB-22CC8-VJ326-GHFJW-H9DH4

Windows 8
Windows 8 Professional NG4HW-VH26C-733KW-K6F98-J8CK4
Windows 8 Professional N XCVCF-2NXM9-723PB-MHCB7-2RYQQ
Windows 8 Enterprise 32JNW-9KQ84-P47T8-D8GGY-CWCK7
Windows 8 Enterprise N JMNMF-RHW7P-DMY6X-RF3DR-X2BQT

Windows Vista
Windows Vista Business YFKBB-PQJJV-G996G-VWGXY-2V3X8
Windows Vista Business N HMBQG-8H2RH-C77VX-27R82-VMQBT
Windows Vista Enterprise VKK3X-68KWM-X2YGT-QR4M6-4BWMV
Windows Vista Enterprise N VTC42-BM838-43QHV-84HX6-XJXKV

Windows 8.1
Windows 8.1 Professional GCRJD-8NW9H-F2CDX-CCM8D-9D6T9
Windows 8.1 Professional N HMCNV-VVBFX-7HMBH-CTY9B-B4FXY
Windows 8.1 Enterprise MHF9N-XY6XB-WVXMC-BTDCT-MKKG7
Windows 8.1 Enterprise N TT4HM-HN7YT-62K67-RGRQJ-JFFXW

Windows 10
Windows 10 Professional W269N-WFGWX-YVC9B-4J6C9-T83GX
Windows 10 Professional N MH37W-N47XK-V7XM9-C7227-GCQG9
Windows 10 Enterprise NPPR9-FWDCX-D2C8J-H872K-2YT43
Windows 10 Enterprise N DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4

完整命令如下:以win7 专业版为例

slmgr.vbs /ipk FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4 (回车)  
slmgr.vbs /skms ca.swufe.edu.cn (回车)  
slmgr.vbs /ato(回车)  

这样就完成了升级激活的安装了,你可以点击电脑然后鼠标右键查看属性就能看到自己电脑的激活状态了