::: info 副标题
兼论为什么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装上,新版旧版是无所谓的,马上就可以自己升级。
应该是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 的更多使用笔记,可以移步此处。