# Linuxå†…æ ¸ ## ç§»æ¤æ¦‚è¿° Linuxå†…æ ¸ç§»æ¤ä¸»è¦æ¶‰åŠåŸºäºŽlinuxå†…æ ¸åŸºçº¿åˆå…¥ä¸‰æ–¹èŠ¯ç‰‡è¡¥ä¸åŽï¼Œè¿›è¡ŒåŸºç¡€çš„å†…æ ¸ç¼–è¯‘æž„å»ºåŠéªŒè¯ã€‚ ### åŸºæœ¬ä¿¡æ¯ å½“å‰Linuxå†…æ ¸åŸºçº¿æ˜¯åŸºäºŽLinux社区 5.10 LTS版本演进,åˆå…¥CVEåŠbugfixè¡¥ä¸ã€‚具体信æ¯å‚考[代ç 库](https://gitee.com/openharmony/kernel_linux_5.10),对应repo工程代ç 路径为`kernel/linux-5.10`。 ### Bootloader å¯ä»¥ä½¿ç”¨èŠ¯ç‰‡åŽ‚å•†è‡ªå¸¦çš„Bootloader,或者是开æºUbootç‰åŠ è½½å†…æ ¸é•œåƒã€‚比如为支æŒHi3516DV300开呿¿ï¼ŒOpenHarmony引入的开æº[Uboot](https://gitee.com/openharmony/third_party_u-boot)。 ## 适é…编译和烧录å¯åЍ 1. å‡†å¤‡å†…æ ¸config(特别是芯片相关的config)。 config文件所在æºç 目录:`kernel/linux/config/` 以hi3516dv300芯片为例,å¯åœ¨å¯¹åº”çš„`linux-5.10/arch/arm/configs/`目录下新建<YOUR_CHIP>_small_defconfig,如`hi3516dv300_small_defconfig`表示针对hi3516dv300å°åž‹ç³»ç»Ÿçš„defconfig。该config文件å¯ä»¥ç”±åŸºç¡€defconfig文件`small_common_defconfig`与该芯片相关的config组åˆç”Ÿæˆã€‚ 2. 准备芯片补ä¸ã€‚ è¡¥ä¸æ–‡ä»¶æ‰€åœ¨æºç 目录:`kernel/linux/patches/linux-5.10` 以hi3516dv300芯片为例,å‚考已有的patch目录hi3516dv300_small_patch目录,新建<YOUR_CHIP>_patch目录,放置相关芯片补ä¸ï¼Œæ³¨æ„hdf.patchç‰é©±åŠ¨è¡¥ä¸ã€‚ 3. 编译。 å…·ä½“å†…æ ¸ç¼–è¯‘å…¥å£è„šæœ¬ä½äºŽå·¥ç¨‹ç›®å½•`kernel/linux/patches/`下é¢ï¼Œç‰ˆæœ¬çº§æ•´ç¼–命令会通过BUILD.gn进入`kernel_module_build.sh`å’Œ`kernel.mk`,需è¦åœ¨è¿™2个文件ä¸é’ˆå¯¹æ€§è¿›è¡ŒpatchåŠdefconfig文件路径ã€ç¼–译器ã€èŠ¯ç‰‡æž¶æž„ã€å†…æ ¸Imageæ ¼å¼ç‰çš„适é…。 通过编译错误日志调整补ä¸ï¼Œå…¸åž‹é”™è¯¯åœºæ™¯ï¼š (1)补ä¸åˆå…¥å¤±è´¥ï¼Œå‡ºçް冲çªï¼Œéœ€è¦è¿›è¡Œä¸Šä¸‹æ–‡é€‚é…修改。 (2ï¼‰ç¼–è¯‘å¤±è´¥ï¼Œå†…æ ¸ç‰ˆæœ¬å·®å¼‚ï¼ˆå‡½æ•°å®žçŽ°è°ƒæ•´ç‰ï¼‰éœ€è¦é’ˆå¯¹æ€§è¿›è¡Œå†…æ ¸é€‚é…。 >  **注æ„:** > > - å‚考`kernel.mk`,在OpenHarmony工程的编译构建æµç¨‹ä¸ä¼šæ‹·è´kernel/linux-5.10的代ç 环境åŽè¿›è¡Œæ‰“è¡¥ä¸åŠ¨ä½œï¼Œåœ¨ä½¿ç”¨ç‰ˆæœ¬çº§ç¼–è¯‘å‘½ä»¤å‰ï¼Œéœ€è¦kernel/linux-5.10ä¿æŒåŽŸä»£ç 环境。 > > - 对应拷è´åŽçš„目录ä½äºŽï¼š`out/<***>/kernel/linux-5.10`,å¯ä»¥åœ¨è¯¥ç›®å½•下进行补ä¸çš„修改适é…。 4. 烧录å¯åŠ¨ã€‚ 由于ä¸åŒèŠ¯ç‰‡çš„å¼€å‘æ¿çš„烧录方å¼ä¸ä¸€æ ·ï¼Œæ¤å¤„ä¸è¡¨è¿°å…·ä½“的烧录方å¼ã€‚éœ€è¦æ³¨æ„烧录的å„镜åƒçš„大å°åŠå¯åЍ傿•°çš„é…置,å‚考hi3516dv300采用ubootå¯åЍ傿•°ï¼š ``` setenv bootargs 'mem=128M console=ttyAMA0,115200 root=/dev/mmcblk0p3 ro rootfstype=ext4 rootwait blkdevparts=mmcblk0:1M(boot),9M(kernel),50M(rootfs),50M(userfs)' ``` ## éªŒè¯ è°ƒè¯•init进程ã€å¯åЍshellå’Œè¿è¡Œç®€å•的用户æ€ç¨‹åºï¼ŒéªŒè¯å†…æ ¸ç§»æ¤æ˜¯å¦æˆåŠŸã€‚OpenHarmonyå°åž‹ç³»ç»Ÿçš„OS镜åƒç»“构以åŠlinux用户æ€çš„å¯åЍæµç¨‹å¦‚下图1所示: **图1** 基于linuxå†…æ ¸çš„OS镜åƒç»“构和用户æ€ç¨‹åºå¯åЍæµç¨‹  基于上述æµç¨‹ï¼ŒæŽ¨è按以下æ¥éª¤å®ŒæˆéªŒè¯ï¼š 1. åˆ¶ä½œæ ¹æ–‡ä»¶ç³»ç»Ÿé•œåƒã€‚ 请å‚考[新建芯片解决方案和产å“解决方案](../subsystems/subsys-build-all.md)ç”Ÿæˆæ ¹æ–‡ä»¶ç³»ç»Ÿé•œåƒ`rootfs.img`。从上图å¯ä»¥çœ‹åˆ°å¯åŠ¨è¿‡ç¨‹ä¸Žäº§å“é…置强相关,在制作rootfs.img过程ä¸è¯·å®Œæˆå¦‚下四ç§é…置: - 组件é…ç½® 产å“组件é…置文件`vendor/{company}/{product}/config.json`需é…ç½®å¯åЍæ¢å¤å系统(startup)çš„init_liteç»„ä»¶å’Œå†…æ ¸å系统的linux_5_1_0组件。 - 系统æœåŠ¡é…ç½® 系统æœåŠ¡é…置文件`vendor/{company}/{product}/init_configs/init_xxx.cfg`需è¦å¯åЍshellæœåŠ¡ã€‚ - 文件系统é…ç½® 文件系统é…ç½®`vendor/{company}/{product}/fs.yml`ä¸éœ€è¦åˆ›å»º`/bin/sh -> mksh`å’Œ`/lib/ld-musl-arm.so.1 -> libc.so`软连接,这两个文件分别是shell坿‰§è¡Œç¨‹åºå’Œå¯æ‰§è¡Œç¨‹åºä¾èµ–çš„c库。 - å¯åЍé…ç½® å¯åЍé…置在`vendor/{company}/{product}/init_configs/etc`目录下,包括fstabã€rsSå’ŒSxxxæ–‡ä»¶ï¼Œè¯·æŒ‰å¼€å‘æ¿å®žé™…情况é…置。 编译完æˆåŽï¼Œå¯é€šè¿‡æ£€æŸ¥äº§å“编译输出目录下的rootfs内容,确认rootfs.imgæ–‡ä»¶ç”Ÿæˆæ˜¯å¦ç¬¦åˆé¢„期。 2. 调试init进程和shell。 烧录`rootfs.img`并调试init进程和shell,ä¸åŒåŽ‚å•†çš„å¼€å‘æ¿çš„烧录工具和æµç¨‹å¯èƒ½ä¸åŒï¼Œè¯·æŒ‰èŠ¯ç‰‡è§£å†³æ–¹æ¡ˆæä¾›çš„æµç¨‹è¿›è¡Œçƒ§å½•ã€‚çƒ§å½•`rootfs.img`å‰è¯·ç¡®è®¤bootloaderå’Œlinuxå†…æ ¸å¯åЍæ£å¸¸ã€‚如果`rootfs.img`è¢«å†…æ ¸æ£å¸¸æŒ‚载,接ç€å°†è¿è¡Œ`/bin/init`程åºï¼Œinit进程为用户æ€çš„第一个应用程åºï¼Œå®ƒçš„è¿è¡Œæ„味ç€ç”¨æˆ·æ€çš„开始。 init程åºé¦–先会调用`/etc/init.d/rcS`脚本,rcS脚本执行第一æ¡å‘½ä»¤ä¸º`/bin/mount -a`ï¼Œè¯¥å‘½ä»¤ä¼šåŠ è½½fstab文件,在fstabä¸çš„命令执行完åŽrcS将顺åºè°ƒç”¨Sxxx脚本完æˆè®¾å¤‡èŠ‚ç‚¹åˆ›å»ºå’Œæ‰«æã€æ–‡ä»¶æƒé™é…ç½®ç‰æ“作。 最åŽï¼Œinit程åºä¼šè¯»å–`init.cfg`系统æœåŠ¡é…ç½®æ–‡ä»¶ã€‚æ ¹æ®æ¥éª¤1ä¸çš„设置,init程åºå°†ä¼šå¯åЍshell。如果上述æµç¨‹è¿è¡Œæ£å¸¸ï¼Œç³»ç»Ÿåˆ™ä¼šè¿›å…¥shell。 è‹¥ä¸²å£æœ‰å¦‚ä¸‹ç‰ˆæœ¬å·æ—¥å¿—打å°ï¼Œåˆ™è¡¨ç¤ºinit程åºå¯åЍæ£å¸¸ï¼š **图2** initå¯åЍæ£å¸¸æ—¥å¿—  æ£å¸¸è¿›å…¥shellåŽæ‰§è¡Œlså‘½ä»¤ï¼Œä¸²å£æ‰“å°ä¿¡æ¯å¦‚下图: **图3** æ£å¸¸è¿›å…¥shellåŽè¾“å…¥ls命令䏲壿‰“å°  3. é…ç½®NFS。 init进程和shellæ£å¸¸å¯åЍåŽï¼Œä»¥æœåŠ¡ç«¯IP为192.168.1.22ã€å®¢æˆ·ç«¯IP为192.168.1.4为例,å¯åœ¨æ ¹ç›®å½•执行如下命令开å¯NFS: ``` ifconfig eth0 192.168.1.4 netmask 255.255.255.0 mkdir -p /storgage/nfs mount -t nfs -o nolock,addr=192.168.1.22 192.168.1.22:/nfs /storage/nfs ```