我们知道systemctl是基于systemd的,因为我装机的时候是16.04,所以systemctl的版本才223,最近需要搞一个东西,对systemd的版本有要求,就升级了一下。其间踩了很多坑,就稍微记录一下。
先到systemd的仓库里去下个源码:https://github.com/systemd/systemd/releases,我选了v245,要升级就索性升到最新版,然后tar + configure一条龙,然后……然后就报错了,提示exec: meson: not found
。
查了一下,meson是个python写的构建工具。那还不简单,apt-get装一个就是了,apt-get install meson
一气呵成,然后再次configure……又报错了。这次是什么?Meson version is 0.45.1 but project requires >= 0.46
.得,又是apt-get的问题。我们知道,apt-get为了稳定,经常会给我们装一些远古版本的东西。我至今还记得当年apt-get给我装了一个node 4。
那要怎么安装新版本的meson呢,手动下载编译吗?可以,但没必要。不要忘了meson是py写的,我们可以用pip来安装(前提是有py的环境,怎么装py不是这里的重点):pip install meson
。这里的pip是py3的pip,有可能你那叫pip3。
然后再次configure,又报错了,这次是Program(s) ['gperf'] not found or not executable
。这个也简单,装个gperf就是了,apt-get install gperf
。这次的依赖好像可以用apt-get。
然后再次configure,又双报错了,这次是/usr/sbin/update-info-dir: 4: /etc/environment: Syntax error: Unterminated quoted string
。想来想去也不知道是为啥,查了半天也没查到,干脆去看看/etc/environment的内容:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN:zh:en_US:en
?最后那个引号去哪了?
把最后的引号补上,再次configure,又双叒报错了,这次是Problem encountered: POSIX caps headers not found
。查了一下,发现是少了sys/capability.h。
因为我这是Ubuntu,就apt-get install libcap-dev
装了个libcap-dev(centos应该是libcap-devel),然后再次configure,又双叒叕报错了,这次是ERROR: Dependency "mount" not found, tried pkgconfig
。
那就装一个,apt-get install libmount-dev
,然后再次configure,这次终于好了。make && make install
,然后systemctl --version
验证一下:
systemd 245 (245)
-PAM -AUDIT -SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP -LIBCRYPTSETUP -GCRYPT -GNUTLS -ACL -XZ -LZ4 -SECCOMP +BLKID -ELFUTILS -KMOD -IDN2 -IDN -PCRE2 default-hierarchy=unified
搞定。