现状总结

最早 v0.0

yocto部分提供了3个接口:

  1. PRE_CMD :前置操作。
  2. EXTRA_INSTALL:额外安装的包。
  3. POST_CMD :收尾操作。

当时考虑的比较简单,实际上经常性的无法满足实际需要。

改进版 v0.1

在v0.0基础上,稍加改动 —— 使用PRE_CMD POST_CMD。例子如下:

 16 PRE_CMD = "sudo mount --bind /dev ${IMAGE_ROOTFS}/dev; \
 17 sudo mount --bind /run ${IMAGE_ROOTFS}/run; \
 18 sudo mount -t devpts devpts ${IMAGE_ROOTFS}/dev/pts; \
 19 sudo mount -t proc proc ${IMAGE_ROOTFS}/proc; \
 20 sudo mount -t sysfs sysfs ${IMAGE_ROOTFS}/sys; \
 21 sudo cp ${WORKDIR}/config.sh ${IMAGE_ROOTFS}; \
 22 sudo chroot ${IMAGE_ROOTFS} bash /config.sh; \
 23 "
 24 
 25 POST_CMD = "sudo umount ${IMAGE_ROOTFS}/proc; \
 26 sudo umount ${IMAGE_ROOTFS}/sys; \
 27 sudo umount ${IMAGE_ROOTFS}/dev/pts; \
 28 sudo umount ${IMAGE_ROOTFS}/dev; \
 29 sudo umount ${IMAGE_ROOTFS}/run; \
 30 sudo rm ${IMAGE_ROOTFS}/config.sh; \ 
 31 "

这一部分在每个项目中都是一样的,并且EXTRA_INSTALL已经无用。所有的扩展通过config.sh脚本去实现,像这样:

    1 set -e
    2                                                                                                                                                                                                                       
    3 export HOME=/root
    4 export LC_ALL=C
    5 
    6 apt update
    7 apt install -y systemd-sysv
    8 apt install -y dialog locales
    9 
   10 # 扩展根分区大小         
   11 apt install -y resize-assistant
   12 # set background         
   13 apt install -y simple-wallpaper
   14 
   15 # libopen62541-1 -> libmbedcrypto3 libmbedx509-0 libmbedtls12
   16 apt install -y libopen62541-1
   17   
   18 # 制作过程中使用的源
   19 cat >/etc/apt/sources.list <<EOF
   20 # 第三方其他包           
   21 deb http://172.29.157.20/my_mirror/extra v101-0721 main
   22 # kvisor, 协议包
   23 deb http://172.29.157.20/my_mirror/kvisor v101-0621 main
   24 # 麒麟V10 SP1源
   25 deb http://172.29.157.20/kylin/KYLIN-ALL 10.1 main restricted universe multiverse
   26 EOF
......
  132 cat >/etc/lightdm/lightdm.conf <<EOF
  133 [SeatDefaults]
  134 autologin-guest=false
  135 autologin-user=root
  136 autologin-user-timeout=0
  137 EOF
  138 
  139 # 最终系统使用的源
  140 cat >/etc/apt/sources.list <<EOF
  141 deb http://archive.kylinos.cn/kylin/KYLIN-ALL 10.1 main universe multiverse restricted
  142 EOF
  143 
  144 # 设置 hostname
  145 echo kylinos >/etc/hostname
  146 
  147 # 设置 root密码
  148 echo root:qwer1234 | chpasswd
  149 
  150 # 添加 kylin 用户
  151 if ! awk -F: '{print $1}' /etc/passwd | grep -q ekylin; then
  152     USERNAME="ekylin"
  153     PASSWORD="qwer1234"
  154     useradd -m -s /bin/bash -u 2000 "${USERNAME}"
  155     usermod -c "${USERNAME}" "${USERNAME}"
  156     echo "${USERNAME}:${PASSWORD}" | chpasswd
  157     adduser ${USERNAME} sudo
  158     adduser ${USERNAME} adm
  159 fi

此时每个项目的config.sh看起来都差不多,基本上就是apt install加上一些配置啥的;存在大量的重复,并且这些重复分布在各个项目中。

当前状态存在的问题:

  1. 扩展一个新项目比较麻烦,往往通过复制粘贴的形式。
  2. 没有抽象,不宜维护。

v0.2

将各个项目中的config.sh文件中的一些共性的内容抽象成函数,例如:

   23 # 扩充根分区
   24 function ins_resize() {
   25     apt install -y resize-assistant
   26 }
   27 
   28 # 开机执行resize
   29 function set_resize() {
   30     if dpkg -l | grep ^ii | awk '{print $2}' | grep -q "^resize-assistant$"; then                                                                                                                                     
   31     ¦   systemctl enable resize-assistant
   32     fi
   33 } 
   63 # 网络工具
   64 ## 基础网络工具
   65 function ins_base_network() {
   66     apt install -y iputils-ping iproute2 net-tools
   67 }
   68 
   69 function ins_network() {
   70     ins_base_network
   71     # Network Manager
   72     apt install -y network-manager
   73     if [ -d /etc/NetworkManager/conf.d ]; then
   74     ¦   touch /etc/NetworkManager/conf.d/10-globally-managed-devices.conf
   75     fi
   76     apt install -y netplan.io
   77 }
  309 # 创建用户
  310 function create_user() {
  311     USERNAME="$1"
  312     PASSWORD="$2"
  313     if ! awk -F: '{print $1}' /etc/passwd | grep -q ${USERNAME}; then
  314     ¦   useradd -m -s /bin/bash -u 2000 "${USERNAME}"
  315     ¦   usermod -c "${USERNAME}" "${USERNAME}"
  316     ¦   echo "${USERNAME}:${PASSWORD}" | chpasswd
  317     ¦   adduser ${USERNAME} sudo
  318     ¦   adduser ${USERNAME} adm
  319     else
  320     ¦   echo "user ${USERNAME} already exists"
  321     fi
  322 }
  323 
  324 function set_hostname() {
  325     HOSTNAME="$1"
  326     echo ${HOSTNAME} >/etc/hostname
  327 
  328     if ! grep -q "127.0.0.1 localhost" /etc/hosts; then
  329     ¦   cat >>/etc/hosts <<EOF
  330 127.0.0.1 localhost
  331 127.0.1.1 ${HOSTNAME}
  332 EOF
  333     fi
  334 }

然后,每个项目都会有一个对应的函数,例如:

  438 function ubuntu() {
  439     cat >/etc/apt/sources.list <<EOF
  440 # deb http://172.29.157.20/ubuntu jammy main universe multiverse restricted
  441 deb http://172.29.157.20/ubuntu-ports focal main universe multiverse restricted
  442 EOF
  443     apt update
  444     ins_sysv
  445     ins_kernel
  446 
  447     (
  448     ¦   # 解决不生成initrd问题
  449     ¦   apt install -y initramfs-tools
  450     ¦   version=$(basename $(readlink -f /boot/vmlinuz) | sed 's,vmlinuz-,,')
  451     ¦   update-initramfs -u -k ${version}
  452     )
  453 
  454     ins_tools
  455     ins_network
  456     ins_ssh
  457     finish
  458 }

  553 function chuangxin() {
  554     cat >/etc/apt/sources.list <<EOF
  555 # 第三方其他包
  556 deb http://172.29.157.20/my_mirror/extra-0721 10.1 main
  557 
  558 # kvisor, 协议包
  559 deb http://172.29.157.20/my_mirror/kvisor-0811 10.1 main
  560 deb http://172.29.157.20/my_mirror/kvisor-0621 10.1 main
  561 
  562 deb http://archive.launchpad.dev/archive.kylinos.cn/kylin/KYLIN-ALL 10.1 main restricted universe multiverse
  563 EOF
  564     set_kylin_hosts
  565     apt update
  566 
  567     ins_sysv
  568     ins_resize
  569     ins_ssh
  570     ins_network
  571     ins_tools
  572 
  573     ins_kvisor_chuangxin
  574     ins_protocol
  575 
  576     # 登录提示
  577     sed -i "s#Kylin V10 SP1#Kylin Secure RT Operating System(IoT)V10#g" /etc/issue
  578     sed -i "s#Kylin V10 SP1#Kylin Secure RT Operating System(IoT)V10#g" /etc/issue.net
  579 
  580     remove_some_pkg
  581     clean_kylin_hosts
  582 
  583     # 最终系统使用的源
  584     apt_KYLIN_ALL_public_2107
  585 
  586     finish
  587 }

此时,所有项目共用一个config.sh脚本,通过传给该脚本不同的参数生成不同的版本,像这样:

public.inc

 18 PRE_CMD = "sudo mount --bind /dev ${IMAGE_ROOTFS}/dev; \                                                 
 19 sudo mount --bind /run ${IMAGE_ROOTFS}/run; \                                                            
 20 sudo mount -t devpts devpts ${IMAGE_ROOTFS}/dev/pts; \                                                   
 21 sudo mount -t proc proc ${IMAGE_ROOTFS}/proc; \                                                          
 22 sudo mount -t sysfs sysfs ${IMAGE_ROOTFS}/sys; \                                                         
 23 sudo cp ${WORKDIR}/config.sh ${IMAGE_ROOTFS}; \                                                          
 24 sudo chroot ${IMAGE_ROOTFS} bash /config.sh ${KYCODENAME}; \                                             
 25 " 

vkylin-2209.bb
  7 KYCODENAME = "v2209"

比以前强一些,但是需要不断的扩展config.sh;而且至此完全跟yocto/bitbake没有关系;最终还是希望能跟yocto/bitbake结合起来,使用include、inherit等语法更好的构建版本。

v0.3 (讨论中)

主要修改yocto这块的流程:

  1. 缓存debootstrap的结果:以前每次运行都要重新执行debootstrap,很耗时不方便;目前除非执行do_clean,否则不在执行debootstrap
  103 python do_copy_from_origin() {
  104     src = d.getVar('ROOTFS_ORIGIN') 
  105     dst = d.getVar('IMAGE_ROOTFS')  
  106     cmd = "sudo rm -rf {};sudo cp -av {} {}".format(dst, src, dst)
  107     exec_cmd(cmd)        
  108 }
  1. 将原来的PRE_CMD POST_CMD修改(但是依然兼容)为下面的形式:
  114 python do_prepare_rootfs_first_stage() {
  115     pre_cmd = d.getVar("PRE_CMD")
  116     bb.note("fucking life : pre_cmd [%s]" % (pre_cmd))
  117 
  118     if pre_cmd:
  119     ¦   exec_cmd(pre_cmd)
  120 }
  121 python do_prepare_rootfs_middle_stage() {
  122     bb.note("fucking life : here is middle stage !")
  123 }
  124 python do_prepare_rootfs_last_stage() {
  125     post_cmd = d.getVar("POST_CMD")
  126     bb.note("fucking life : post_cmd [%s]" % (post_cmd))
  127 
  128     if post_cmd:
  129     ¦   exec_cmd(post_cmd)
  130 }
  1. debootstrap生成的origin_rootfs进一步的操作都放在middle_stage这里扩展。

设想

first_stage 、middle_stage、last_stage都可以通过bitbake的append语法进行扩展,结合v0.2抽象出来的函数使用,会非常的灵活。

append语法设想:

  8 do_first_stage:append() {  
  9     sudo mount --bind /dev ${IMAGE_ROOTFS}/dev;
 10     sudo mount --bind /run ${IMAGE_ROOTFS}/run;
 11     sudo mount -t devpts devpts ${IMAGE_ROOTFS}/dev/pts;                                                                                                                                                                
 12     sudo mount -t proc proc ${IMAGE_ROOTFS}/proc; 
 13     sudo mount -t sysfs sysfs ${IMAGE_ROOTFS}/sys;
 14 }
 15 
 16 do_middle_stage:append() { 
 17     echo "xxx" > /etc/apt/sources.list
 18     apt update             
 19     apt install xxx        
 20 }
 21 
 22 do_last_stage:append() {   
 23     sudo umount ${IMAGE_ROOTFS}/proc;
 24     sudo umount ${IMAGE_ROOTFS}/sys;
 25     sudo umount ${IMAGE_ROOTFS}/dev/pts; 
 26     sudo umount ${IMAGE_ROOTFS}/dev;
 27     sudo umount ${IMAGE_ROOTFS}/run;
 28     sudo rm ${IMAGE_ROOTFS}/config.sh;
 29 }
 30 
 31 
 32 do_middle_stage:append() {
  567     ins_sysv             
  568     ins_resize           
  569     ins_ssh              
  570     ins_network
  571     ins_tools
  572                                                                                                                                                                                                                       
  573     ins_kvisor_chuangxin 
  574     ins_protocol 
 34 }

还可以考虑结合bitbake的layer —— 使用.append文件,更加灵活的控制版本生成流程。

v0.4 版本规划(设想)

  1. 根据实际需求,规划若干基线——类似需求分类,针对项目出的版本依附在某个基线上。
  2. 基线是成长的——随着需求的增加,将共性的需求提到基线中即基线成长。
  3. 基线分级——底层基线负责功能,比如系统基础包、安全特性等;中层基线相对大的功能,比如可视化等。

补充:

  1. 基线可以不随着项目走;基线可以提前测试,为项目提供一个稳定的基础,提高发版速度。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • 本文章首发地址:https://www.lgfccl.xyz 随时down 机,转载注明出处谢谢 UBOOT 概述...
    fafactx阅读 1,252评论 0 2
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,474评论 6 427
  • Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资...
    叶同学阅读 11,172评论 0 73
  • python 也是很值得学习的一门工具。学好python和R。 1环境管理 管理 Python 版本和环境的工具 ...
    Liam_ml阅读 4,817评论 1 51
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,978评论 1 3