在64位处理器的手机上部署centos会有下面的困难。

1. 没有现成的aarch64的rootfs。

2. termux没有rpm2cpio进行部署。

3. armv8*不会被centos识别为aarch64。

如果手机root了,可以直接使用linuxdeploy进行部署。linuxdeploy自带了apt,dpkg,rpm,yum包管理程序,以其部署centos为例,它是通过直接指定最小rpm集,在镜像站下载使用rpm2cpio进行还原,然后进入proot/chroot容器,对之前还原的包重新使用rpm安装一次。rpm2cpio原始还原,不进行包管理,这一步的目的是使用容器有实用程序可用。进入容器调用容器内的实用程序进行rpm安装,目的是将现有的包一一归入到包管理系统,建立包管理信息,可以理解为包注册到系统,不然rpm和yum是不会识别的。

linuxdeploy另一种部署方法,与termux一样,直接下载已经安装好最小包的rootfs.img。linuxdeploy提供centos armhfp现成镜像,要收费没有aarch64对应的镜像。termux的部署脚本atilo提供的centos镜像文件地址无效的,也就是没有了。

那么在非root手机部署aarch64对应的centos就需要将linuxdeploy部署方案移植到termux上。可以参考linuxdeploy的include/bootstrap/centos/deploy.sh等脚本进行修改移植。termux要使用linuxdeploy部署的方案,就需要rpm2cpio工具,但是termux应用的是apt包管理系统,不提供rpm工具。这就可以借termuxt部署fedora,然后通过fedora容器使用rpm2cpio工具进行centos的部署。因为fedora直接提供aarch64的最小rootfs镜像文件。由于安卓版的linux内核的用户权限管理的原因,这种方式会生成一些文件,其它容器访问不了。

armv8l是一个很怪的cpu架构命名,它不被fedora, centos生态兼容。一般地有arch列表arm, armv7, arm64, aarch64,在armv7l手机上,可以很好地被识别成arm或armhfp ,但是armv8l明明是aarch64,就不能被识别,而硬生生地识别成不兼容的armv8l。这里首先就影响我们要移植的部署方案,必须手动去指定,或者是添加兼容识别的脚本代码。

执行移植好的部署脚本,最小包集合还原到新容器的根目录,在进入容器进行包注册时就会再次因为armv8l困扰,rpm会报错所有aarch64的包为intended for different arch。自然就不能注册了。这时候你会发现,从aarch64包还原出来的实用程序以及依赖库,其实已经可以正常执行了,但是你想通过rpm包管理系统去注册,yum安装更多软件,这扇门因为armv8*这兼容难的名字被关上了。没有正确部署好gcc之前,连编译也不行。这样一来,部署下来的容器也只是一个死容器了。

在部署fedora也有同样的问题,在fedora下armv8*直接被兼容成armhfp,使用yum时,直接定向到armhfp镜像分支。但是fedora的yum可以通过--forcearch指定aarch64解决问题,但是centos就不行,fedora用的是dnf。centos部署可以通过rpm --ignorearch临时解决包注册的问题,但是yum却死活没有途径让人指定arch或者忽略。换句话说,你可以一个个包通过rpm --ignorearch --nodeps进行注册安装,但是就不能通过yum进行简单的依赖安装,甚至连正确安装次序都搞不好。这样的容器同样也是一个死容器。

armv8*在centos的包管理系统看来,既不是armhfp也不是aarch64的新型不兼容的特殊的cpu。所以你下载的armhfp还是aarch64分支的包也好,通通都认为是armv8*之外的“intended for different arch“。

要解决问题,就只能跟踪rpm或yum,看它们是怎么想的。rpm是二进制实用程序,yum是python脚本,那就跟踪yum。yum脚本一共有4部分组成,site-packages目录下的rpm, rpmUtils, yum以及/usr/share/yum-cli。通过单步跟踪可以发现脚本arch.py:getCononArch对cpu识别作了兼容处理,我们可以在这里添加上兼容代码,这样我们的yum就可以将armv8*识别成aarch64。修改后的yum终于定向到镜像站站点的aarch64分支,而不是armv8l这样不存在的分支。修改前,即使在repos.d目录的仓库配置文件硬指定aarch64地址路径,还是会因为识别不兼容问题将所有aarch64的包过滤掉,只能搜查出noarch的包。修改arch.py一来,yum在搜索下载环节就正常了,但是最后的问题也还是抹不平,仍然是armv8*引出的问题。

yum在搜索出包后,理清依赖关系,建立好依赖图,一一下载所有包就会进行安装测试。安装实际就是在进行rpm安装。由于我们不能通过yum去指使rpm进行--ignorearch操作,所以最后一切都安装不上,报错直接退出。仍旧是跟踪,发现yum脚本会生成事务去进行测试和安装,代码在cli.py:doTransaction,yum实际上调用扩展模块_rpm.so进行操作,我们只能通过三个hook函数被回调事件。我们还是干预不了这事。但是发现了,只要跳过测试阶段的错误raise,yum脚本就会在/tmp生成yum_save*事务日志,在/var/lib/yum/生成transaction-all*文件记录包安装的次序。

既然无法干预,我们只好通过手动进行rpm安装了,因为这时候我们可以通过特殊手段让yum下载好所有依赖的包缓存在/var/cache/yum/aarch64/7/*/packages,并令其生成一份安装次序表。

用这方法成功安装好vncserver以及xterm。

对于groupinstall,如果没有yum的帮助那是一件多么痛的事。以一个“Desktop“的组安装为例,就有近1000个包。

64位手机部署centos的更多相关文章

  1. 记录一次腾讯X5内核64位手机初始化失败

    之前一直在使用x5内核,只需要一个jar包和so文件就能让webview实现多余原生webview的水平,在32位的手机上能够正常运行,但是到了64位手机上就报如下错误: E/ERROR:: .... ...

  2. 64位手机无法加载x5(libmttwebview.so is 32-bit instead of 64-bit)

    x5内核暂时不提供64位的so文件,在64位手机上需要让AP以32位模式运行. 具体操作如下: 1.如果使用是Eclipse则需要将所有的.so文件都放置在so加载目录:lib/armeabi文件夹下 ...

  3. android studio 64位手机+Fresco引起的在arm64位机器上找不到对应的so库

    我们的程序在32位机器上没有问题,有一天公司采购了一台魅族MX5 MTK的64位处理器上我们的应用报错了 "nativeLibraryDirectories=[/data/app/com.l ...

  4. 64位ubuntu下重新编译hadoop2.2流水账

    hadoop官方网站中只提供了32位的hadoop-2.2.0.tar.gz,如果要在64位ubuntu下部署hadoop-2.2.0,就需要重新编译源码包,生成64位的部署包.建议以下操作使用roo ...

  5. linux CentOs 7.4 64位 系统下 nuxt部署 、nginx 安装、node环境及软连接,pm2软连接

    一.nginx安装 1.安装依赖包 //一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2 ...

  6. CentOS 7.1静默安装11.2.0.3 64位单机数据库软件

    第1章 CentOS 7.1静默安装11.2.0.3 64位单机数据库软件 1.1  安装前的准备工作 1.1.1      软件准备 1.1.2      检查硬件 注意这里的内存应该满足要求,不然 ...

  7. 浅谈Excel开发:十一 针对64位Excel的插件的开发和部署

    自Office 2010版本开始有了32位和64位之分,对Excel来说,32位的Excel和64位的Excel在性能上的主要区别是64位的Excel能够处理2G及2G以上的大数据集. 随着64位操作 ...

  8. centos 7 64位虚机上android4环境运行

    场景 现在的开发大多是在linux的虚拟机上进行,现在有些工作和android有关,因此初步尝试了一下是否可以和目前的场景进行统一. 系统是在vmware workstaion上的centos 7的6 ...

  9. CentOS RedHat YUM 源扩展补充(32位、64位均有)

    一般情况下强烈建议在CentOS6下面使用YUM配置安装LAMP环境,一些兄弟也很喜欢使用编译的安装方法,个人觉得如果不是对服务器做定制,用yum安装稳定简单,何必去download&make ...

随机推荐

  1. API设计中防重放攻击

    HTTPS数据加密是否可以防止重放攻击? 否,加密可以有效防止明文数据被监听,但是却防止不了重放攻击. 防重放机制 我们在设计接口的时候,最怕一个接口被用户截取用于重放攻击.重放攻击是什么呢?就是把你 ...

  2. HTTP Catcher

    HTTP Catcher HTTP Catcher 是一个 Web 调试工具.它可以拦截.查看.修改和重放来自 iOS 系统的 HTTP 请求. 你不需要连接电脑,HTTP Catcher 可以在后台 ...

  3. ESP8266开发之旅 网络篇⑫ 域名服务——ESP8266mDNS库

    1. 前言     前面的博文中,无论是作为client端还是server端,它们之间的通信都是通过具体的IP地址来寻址.通过IP地址来寻址,本身就是一个弊端,用户怎么会去记住这些魔法数字呢?那么有没 ...

  4. Spring Boot构建的Web项目如何在服务端校验表单输入

    本文首发于个人网站:Spring Boot构建的Web项目如何在服务端校验表单输入 这个例子用于演示在Spring Boot应用中如何验证Web 应用的输入,我们将会建立一个简单的Spring MVC ...

  5. 百万年薪python之路 -- 并发编程之 多进程二

    1. 僵尸进程和孤儿进程 基于unix的环境(linux,macOS) 主进程需要等待子进程结束之后,主进程才结束 主进程时刻检测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收. ...

  6. 防抖与节流 & 若每个请求必须发送,如何平滑地获取最后一个接口返回的数据

    博客地址:https://ainyi.com/79 日常浏览网页中,在进行窗口的 resize.scroll 或者重复点击某按钮发送请求,此时事件处理函数或者接口调用的频率若无限制,则会加重浏览器的负 ...

  7. SpringBoot之响应式编程

    一 Spring WebFlux Framework说明 Spring WebFlux 是 Spring Framework 5.0 中引入的新 reactive web framework.与 Sp ...

  8. ofd电子文档内容分析工具(分析文档、签章和证书)

    前言 ofd是国家文档标准,其对标的文档格式是pdf.ofd文档是容器格式文件,ofd其实就是压缩包.将ofd文件后缀改为.zip,解压后可看到文件包含的内容. ofd文件分析工具下载:点我下载.获取 ...

  9. mysql中if函数的正确使用姿势

    --为了今天要写的内容,运行了将近7个小时的程序,在数据库中存储了1千万条数据.-- 今天要说的是mysql数据库的IF()函数的一个实例. 具体场景如下, 先看看表结构: CREATE TABLE ...

  10. expect实现自动输入密码功能

    系统: Ubuntu:16.04 安装expect: sudo apt-get update sudo apt-get install expect 脚本实例: //这一行告诉操作系统脚本里的代码使用 ...