最早 v0.0
yocto部分提供了3個接口:
- PRE_CMD :前置操作尤辱。
- EXTRA_INSTALL:額外安裝的包砂豌。
- 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)存在的問題:
- 擴(kuò)展一個新項(xiàng)目比較麻煩辜昵,往往通過
復(fù)制粘貼
的形式荸镊。 - 沒有抽象,不宜維護(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這塊的流程:
- 緩存
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 }
- 將原來的
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 }
- 對
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è)想)
- 根據(jù)實(shí)際需求绍坝,規(guī)劃若干基線——類似需求分類徘意,針對項(xiàng)目出的版本依附在某個基線上。
- 基線是成長的——隨著需求的增加轩褐,將共性的需求提到基線中即基線成長椎咧。
- 基線分級——底層基線負(fù)責(zé)
大
功能,比如系統(tǒng)基礎(chǔ)包把介、安全特性等勤讽;中層基線相對大
的功能,比如可視化等拗踢。
補(bǔ)充:
- 基線可以不隨著項(xiàng)目走脚牍;基線可以提前測試,為項(xiàng)目提供一個穩(wěn)定的基礎(chǔ)巢墅,提高發(fā)版速度诸狭。