因为有些项目只能在docker中build.
所以,我在pull一个Centos7.5的docker后,添加完用户,改好机器名,重新启动后,安装好yocto。
然后,编译时,遇到一系列问题。
第一个问题是找不到self目录,以后有时间,我会把详细的log放上来。
这个问题,由于没有调试环境,一直没来得及分析。但由于在另外一台实体机上,是可以构建成功的,所以分析是我自己的一些环境变量没有设置导致。
为验证,我用我的用户登录到docker container后,还是会出错。因为我没有将本机的fold/myname的目录映射进docker container.
映射后,编译过出错的位置。在新的位置出错,这次的错是说我的用户和组不对。
然后我将主机的ID和docker container设置为相同后,这个出错的位置通过,但是后面出的错是说可以存在主机污染。
所以,将我自己的用户移动user中,从root中移走后,编译成功。
但最后还是有一个告警:还是主机污染。是这么说的:运行yocto bitbaker的用户与被编译对象的owner用户是一个人,它说这样不好,非常不好。
==================================
然后我建一个其它的用户,与主机分离,然后,把我的git,ssh,rsa,bashrc等,都拷了过去,拷到它的home目录下面,
这次编译完全正常了。
没有告警。
分解解决这几个问题:ssh问题,gitlab和github下代码的问题,环境变量中设置self临时目录的问题。以及启动yocto的用户与被编译对象的owern 归属指向同一个人的问题。
====================================
这里面,再回头,我一直在反复思考的是为什么说yocto的启动用户与编译对象的从属者重复的问题。
以及主机污染。
日志中说运行yocto的用户是0,而0即是root.
无论什么时候,我启动docker container所用的一定不是root。
那么,为什么,我用宿主机我自己的用户,start docker container,最后会说我的yocto的启动者就是当前用户呢?
我的分析应该是这样的:
docker container中的root用户,就是 run docker container的用户。那个用户就是主机中的我,比如haoyujie,这个用户映射到docker中后,就是root,也就是用户ID=0的那个用户。
然后实际上,不论你如何操作,docker container中的操作系统,还是能识别出root==haoyujie这个事实,不论有没有主机污染。
这里说的主机污染就是我将haoyujie在主机和docker container中的ID设置为一样。
当然,当我把haoyujie从docker container中的root组移除后,权限的问题解决的,docker container能够成功地将root与haoyujie分开,但是主机污染还是存在的,即它还是发现运行yocto的用户和yocto编出来的东西的归属,实际上还是同一个用户。
所以,归跟究底,我们可以认为是docker container的设计导致。
解决办法就是建一个新的用户。
这个用户是任何名称都可以,在宿主机有还是没有,映到到docker container还是没有映射,都是没有问题的。
因为,docker container中的root用户,是 run docker container的那个用户,与就是你自己,
总之,yocto允许用root编译的同时,把编译结果的归属权限也给root。这样linux系统的权限分级从最开始就烧制不出来了。
在这件事情上,即使是warning也不能出现,编译成功,可能也没办法用。这就是linux,一个有权限控制洁癖的人带来的结果。