Android termux 下 proot-distro 装 Arch Linux 的 fakeroot 处理
副标题
兼论为什么Linux不是一个新手友好的系统
今天尝试使用 termux 来装一个 ArchLinux,主要目的是给平板配一个凑合能用的本地开发环境, 飞机上开飞行模式之后还能运行个本地的code-server
或者neovim
啥的。
不追求图形界面。图形界面其实玩过,确实能用,但实用角度来看乏善可陈,练技术倒是不错。
然而,过程中遇到了两个嵌套在一起的“梯云纵左脚点右脚 bootstrap”的问题,让人感慨新手遇上的话近乎无解。记录一下。
关于termux
下proot-distro
的选择和使用
proot-distro
的一般用法就不说了。
proot-distro
提供有各种版本,但其中ubuntu
可能不太好用,似乎有一些权限方面的问题,比如apt update
在我这边不需要sudo
, 但apt upgrade
就需要,怪得很。还有默认shell
一直是sh
一类的问题。总体感觉不是很精致。
但也有可能是因为我一开始时没有用--isolated
选项,反而是让proot-distro
与termux
共享了home
和tmp
目录。
所以仅仅是推测,没有重新开始测试,原因是发现ubuntu
官方源的neovim
居然才0.7
版本,可玩性比较低。
相反,Arch Linux
就我来看表现的比较好,有经验的话用着应该不错——前提是解决了下面说的俩问题。
termux
- proot-distro
环境下的fakeroot
问题
这个主要是被Arch Linux
的makepkg
/AUR
机制触发,手动makepkg
或者安装任何AUR
软件的过程中必然用到fakeroot
, 而不用AUR
的话Arch Linux
就少了起码一半的快感。
现在,一般而言,运行termux
的设备是不root
的,proot-distro
环境给发行版的root
自然是假的,模拟的。 如果折腾过termux
下运行图形环境的话,应该知道这个特性给dbus
和systemd
都带来不少问题。 现在的问题是,fakeroot
也是受影响的。proot-distro
环境安装的Arch
,makepkg
走到fakeroot
这一步是报错的。
解决方案倒是明确的很,一搜就有了:用fakeroot-tcp代替fakeroot
, 其实是同一套代码,就是编译选项不一样。
但是!“梯云纵左脚点右脚 bootstrap”问题来了,fakeroot-tcp
这是个在AUR
里面提供的源码,怎么安装呢? 没有能用的fakeroot
,既装不上yay
或者paru
这样的AUR
管理器,也不能手动编译pacman
的软件包, 自然是不能用正常办法安装fakeroot-tcp
的。
大海捞针搜索之后,七拼八凑出来了一个办法:
原始方案来自这里, 但有一些内容是过时的,比如软链接少了一个,没有
po4a
的问题等等。
首先,把fakeroot-tcp这里的 仓库克隆下来,获得PKGBUILD
和fakeroot.install
两个文件。
然后,在这个目录运行makepkg
,当然必然出错(还出一个额外的错误,看本文最后一部分,这里假定OK以便解耦), 但出错前。应该已经完成了软件包的make
.
观察PKGBUILD
可以发现,此时软件实际已经编译完了,只是缺乏在fakeroot
环境下make install
的步骤。 于是,我们可以cd
到src
目录,一路下潜走到存放着makefile
的地方,按PKGBUILD
文件里面的写法, 执行make DESTDIR=随便啥目录 install
.
然后,随便啥目录
里面就有了fakeroot-tcp
的关键二进制文件。虽然不能自动安装,但理论上能用了,手动安装呗,需要新建三个链接。
/usr/bin/faked
/usr/bin/fakeroot
/usr/lib/libfakeroot # 文件夹
应该就是这三兄弟,把原有的文件sudo mv
成faked.bak
一类的名字,然后sudo ln -s 随便啥目录/usr/bin/faked /usr/bin/faked
这样搞一下,三个都要处理。
之后,执行一下fakeroot
,不出现segmentfault
一类的问题就行。接下来,回到刚才克隆的fakeroot-tcp
目录,再次makepkg
. 这一次,调用的是fakeroot-tcp
的二进制文件,应该不出错了,能够正常生成软件包。
然后,别急安装,还是装不上呢。需要恢复现场,把刚刚新建的三个软链接删掉,mv
成.bak
的三个地方再mv
回来。 最后才可以pacman -U xxx.
,完成fakeroot-tcp
的安装。
编译的二进制文件,估计几年之内都凑合能用, 就放在这里:fakeroot-tcp-1.32.2-1-aarch64.pkg.tar.xz。 不怕安全问题的话可以直接拿走安装,就不用费这一番功夫了。 只要第一个fakeroot-tcp
装上,新版旧版是无所谓的,马上就可以自己升级。
po4a的路径问题
应该是termux
-proot-distro
环境下的特有问题。
编译fakeroot-tcp
的过程中要生成文档,这里用到了一个叫po4a
的工具,PKGBUILD
里面可以看到。
这个包也可以很简单地通过pacman
官方仓库安装。但是!只是简单安装的话,编译fakeroot-tcp
的过程会报错找不到po4a
,你手动执行po4a
也是找不到的。
pacman -Ql po4a
可以看到软件包下的所有文件,可以看到其实是有一个po4a
的可执行文件, 实际上是个perl
脚本,放在/usr/bin/vender_perl
下面, 但这个目录,为什么不在PATH
里面呢?实测,手动加PATH
,就不报错了。
于是去找/etc/profile
这一套,发现在/etc/profile.d
里面, 是有一个专门的脚本叫做perlbin.sh
, 是用来把/usr/bin/vendor_perl
、/usr/bin/site_perl
、/usr/bin/core_perl
三兄弟加进PATH
的, 而这个脚本也确实应该在/etc/profile
被调用了。 经过几次测试,发现可能是由于proot-distro
的的模拟登陆机制原因, /etc/profile
在proot-distro
所谓的login
时并没有被执行。 于是这一套PATH
也就没了。 由于这个用法并不多见,除了perl
之外的东西不怎么受影响,遇上的时候就不好发现。 考虑到对系统原装的东西尽量少改动,在.bashrc
/.zshrc
里面把这三个目录加进PATH
,就够用了。
export PATH=$PATH:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
补充:后面发现,如果用
fish
,这个文件是会被加载的。但bash
和zsh
都不行。
有关 Termux 的更多使用笔记,可以移步此处。