現(xiàn)狀總結(jié)

最早 v0.0

yocto部分提供了3個接口:

  1. PRE_CMD :前置操作尤辱。
  2. EXTRA_INSTALL:額外安裝的包砂豌。
  3. POST_CMD :收尾操作。

當(dāng)時考慮的比較簡單光督,實(shí)際上經(jīng)常性的無法滿足實(shí)際需要阳距。

改進(jìn)版 v0.1

在v0.0基礎(chǔ)上,稍加改動 —— 使用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 "

這一部分在每個項(xiàng)目中都是一樣的娄涩,并且EXTRA_INSTALL已經(jīng)無用。所有的擴(kuò)展通過config.sh腳本去實(shí)現(xiàn)映跟,像這樣:

    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 # 擴(kuò)展根分區(qū)大小         
   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, 協(xié)議包
   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 # 最終系統(tǒng)使用的源
  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 # 設(shè)置 hostname
  145 echo kylinos >/etc/hostname
  146 
  147 # 設(shè)置 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

此時每個項(xiàng)目的config.sh看起來都差不多,基本上就是apt install加上一些配置啥的扬虚;存在大量的重復(fù)努隙,并且這些重復(fù)分布在各個項(xiàng)目中。

當(dāng)前狀態(tài)存在的問題:

  1. 擴(kuò)展一個新項(xiàng)目比較麻煩辜昵,往往通過復(fù)制粘貼的形式荸镊。
  2. 沒有抽象,不宜維護(hù)。

v0.2

將各個項(xiàng)目中的config.sh文件中的一些共性的內(nèi)容抽象成函數(shù)躬存,例如:

   23 # 擴(kuò)充根分區(qū)
   24 function ins_resize() {
   25     apt install -y resize-assistant
   26 }
   27 
   28 # 開機(jī)執(zhí)行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 # 網(wǎng)絡(luò)工具
   64 ## 基礎(chǔ)網(wǎng)絡(luò)工具
   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 # 創(chuàng)建用戶
  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 }

然后张惹,每個項(xiàng)目都會有一個對應(yīng)的函數(shù),例如:

  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, 協(xié)議包
  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     # 最終系統(tǒng)使用的源
  584     apt_KYLIN_ALL_public_2107
  585 
  586     finish
  587 }

此時岭洲,所有項(xiàng)目共用一個config.sh腳本宛逗,通過傳給該腳本不同的參數(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"

比以前強(qiáng)一些盾剩,但是需要不斷的擴(kuò)展config.sh雷激;而且至此完全跟yocto/bitbake沒有關(guān)系;最終還是希望能跟yocto/bitbake結(jié)合起來告私,使用include屎暇、inherit等語法更好的構(gòu)建版本。

v0.3 (討論中)

主要修改yocto這塊的流程:

  1. 緩存debootstrap的結(jié)果:以前每次運(yùn)行都要重新執(zhí)行debootstrap驻粟,很耗時不方便根悼;目前除非執(zhí)行do_clean,否則不在執(zhí)行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進(jìn)一步的操作都放在middle_stage這里擴(kuò)展番挺。

設(shè)想

first_stage 、middle_stage屯掖、last_stage都可以通過bitbake的append語法進(jìn)行擴(kuò)展玄柏,結(jié)合v0.2抽象出來的函數(shù)使用,會非常的靈活贴铜。

append語法設(shè)想:

  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 }

還可以考慮結(jié)合bitbake的layer —— 使用.append文件粪摘,更加靈活的控制版本生成流程。

v0.4 版本規(guī)劃(設(shè)想)

  1. 根據(jù)實(shí)際需求绍坝,規(guī)劃若干基線——類似需求分類徘意,針對項(xiàng)目出的版本依附在某個基線上。
  2. 基線是成長的——隨著需求的增加轩褐,將共性的需求提到基線中即基線成長椎咧。
  3. 基線分級——底層基線負(fù)責(zé)功能,比如系統(tǒng)基礎(chǔ)包把介、安全特性等勤讽;中層基線相對大的功能,比如可視化等拗踢。

補(bǔ)充:

  1. 基線可以不隨著項(xiàng)目走脚牍;基線可以提前測試,為項(xiàng)目提供一個穩(wěn)定的基礎(chǔ)巢墅,提高發(fā)版速度诸狭。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末券膀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子驯遇,更是在濱河造成了極大的恐慌芹彬,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叉庐,死亡現(xiàn)場離奇詭異舒帮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)眨唬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門会前,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匾竿,你說我怎么就攤上這事瓦宜。” “怎么了岭妖?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵临庇,是天一觀的道長。 經(jīng)常有香客問我昵慌,道長假夺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任斋攀,我火速辦了婚禮已卷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淳蔼。我一直安慰自己侧蘸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布鹉梨。 她就那樣靜靜地躺著讳癌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪存皂。 梳的紋絲不亂的頭發(fā)上晌坤,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機(jī)與錄音旦袋,去河邊找鬼骤菠。 笑死,一個胖子當(dāng)著我的面吹牛猜憎,可吹牛的內(nèi)容都是我干的娩怎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼胰柑,長吁一口氣:“原來是場噩夢啊……” “哼截亦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柬讨,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤崩瓤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后踩官,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體却桶,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年蔗牡,在試婚紗的時候發(fā)現(xiàn)自己被綠了颖系。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡辩越,死狀恐怖嘁扼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情黔攒,我是刑警寧澤趁啸,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站督惰,受9級特大地震影響不傅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赏胚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一访娶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧觉阅,春花似錦崖疤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痴柔,卻和暖如春沦偎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咳蔚。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工豪嚎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谈火。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓侈询,卻偏偏與公主長得像,于是被迫代替她去往敵國和親糯耍。 傳聞我的和親對象是個殘疾皇子扔字,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 本文章首發(fā)地址:https://www.lgfccl.xyz 隨時down 機(jī)囊嘉,轉(zhuǎn)載注明出處謝謝 UBOOT 概述...
    fafactx閱讀 1,276評論 0 2
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,502評論 6 427
  • Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列的資...
    葉同學(xué)閱讀 11,183評論 0 73
  • python 也是很值得學(xué)習(xí)的一門工具。學(xué)好python和R革为。 1環(huán)境管理 管理 Python 版本和環(huán)境的工具 ...
    Liam_ml閱讀 4,835評論 1 51
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    小邁克閱讀 2,996評論 1 3