前一阵子,我通过一篇教程:学习,记录,骚操作] 在openwrt上搭建MC服务器,成功的在openwrt上安装了openjdk17,然后我不想要jdk17了,想要删除jdk17,直接apk del openjdk17-jre,结果软路由崩了,这不是坑爹吗???
按道理来讲都是用Musl加Busybox为关键组件的,应该是没有问题才是,结果确实有问题,就是出现在了Musl和Busybox组件上,现在用vmware的IStoreos复现一下过程:
在apk update后,我直接apk add openjdk17-jre,下面出现了这两行:
(1/32) Installing musl (1.2.4_git20230717-r4)
(2/32) Installing busybox (1.36.1-r15)
安装完了,也确实能用,但一apk del就崩了
看下面这图,它apk把busybox和musl都删除了,这是openwrt很重要的组件,
不出意外的话,openwrt系统就崩了,什么命令都没有用了
所以有没有什么方法能让apk不去删除musl组件呢?找了半天,确实有了,下面看演示:
看上面的图,在opkg中没有这zip包,但我又想用这zip包,所以我用apk来安装,结果就是安装的时候能行,一删除就顺手将musl也删除了,不出意外系统又崩了,这样我就有一个大胆的猜想:zip的运行要有musl支持,但openwrt的musl它apk不识别,若我提前将musl用apk安装一遍,那它再次安装zip时,是否就不用安装musl了呢?
事实证明,对的,所以现在只要提前安装好这些重要的组件,并不去删除这些组件就可以保证系统的正常运行,那问题又来了,那些组件是重要的呢?根据 ChatGpt 多年的经验和自己的一些见解,就有四个组件,分别为:
musl busybox busybox-binsh apk-tools
前面两个不用说了,不管是musl还是busybox对于openwrt与alpine来说,都是非常重要的,musl一个C标准库的实现,类似于glibc(GNU C Library)或uClibc,busybox一个轻量级的工具箱,包含了精简的Unix工具,提供ls、cat等命令,如果这两个组件没了,openwrt和alpine都必崩无疑。
后面的busybox-binsh和apk-tools对于alpine也行重要,busybox-binsh提供了alpine的轻量级的 shell,apk-tools是apk包安装工具,可以使用apk查看相关依赖,其中busybox-binsh依赖于busybox,busybox依赖于musl,apk-tools有两个依赖(zlib、libcrypto3)没有安装,可以用以下命令查看apk-tools的依赖关系。
apk info -R apk-tools
下面图,左边是docker中的alpine安装jre17,右边是Vmware中的istoreos安装jre17,多了5个包:musl、busybox、busybox-binsh、zlib、libcrypto3,后面这两个包被依赖于apk-tools
所以解决apk del openjdk17-jre的方法就有了,直接apk update后,先不安装jdk,先安装musl等重要组件,再安装jdk就行了:
apk add musl busybox busybox-binsh apk-tools
好了,看下图,现在openjdk17-jre的包就是27个了,跟原版的alpine一样
安装好后,再试试apk del openjdk17-jre命令,
没毛病,apk del能正常运行了,系统也不崩了!!!
PS:注意上面的组件都不可以删除,如果一个手误apk del musl或apk del busybox,系统必崩,其实alpine也是一样的,但它用的是alpine-baselayout,它依赖于musl、busybox、busybox-binsh、apk-tools,你可以试试,在alpine上直接apk del alpine-baselayout,系统一样崩,如下图所示:
完结~~~