8445|9

283

帖子

2

TA的资源

纯净的硅(初级)

楼主
 

「当幸狐来敲门」适配Alpine Linux下篇--适配Alpine Linux的详细步骤 [复制链接]

 
 
本帖最后由 walker2048 于 2023-10-19 14:53 编辑

一、Linu启动流程简要分析

想要适配rootfs,就得先了解Linux开发板常见启动流程。详细的启动过程我们这里就不再多说了,别的大佬说的更好。
这里简单说明一下,开发板上电后,当然是Bootloader先启动了,不同的板子有不同的过程。
然后UBoot启动完之后,会传递启动参数给内核,然后跳转到内核。
内核启动后会尝试加载rootfs,并从里面特定目录里查找init程序。
然后init程序会开始运行初始化系统服务的程序(我们的镜像用的OpenRC),然后OpenRC负责启动各种服务。

例如这是传递了一个有问题的rootfs给内核,内核找不到init程序,然后报错了。

二、docker运行Alpine Linux容器

其实docker是个不错的rootfs提取工具,基本上各个平台的发行版都有。
下载速度还很快,版本任你选,还可以在集成到SDK之前在电脑上把想安装的软包和源都给处理好。
废话不多说,现在开始搞。

2.1 先创建一个100M的临时文件,用来存储新的rootfs

dd if=/dev/zero of=rootfs.ext4 bs=1M count=100

2.2 格式化该临时文件

mkfs.ext4 rootfs.ext4

2.3 挂载该临时文件系统到/tmp/my-rootfs

mkdir /tmp/my-rootfs
sudo mount rootfs.ext4 /tmp/my-rootfs

2.4 开启虚拟化支持(如果重启了WSL或者电脑,就需要从这一步开始)

  1. docker run --rm --privileged multiarch/qemu-user-static --reset --persistent yes

2.5 创建名称为armv7alpine的容器

  1. docker run -it \
  2. --name armv7alpine \
  3. --net=host \
  4. -v /tmp/my-rootfs:/my-rootfs \
  5. arm32v7/alpine

接下来所有的操作都是在这个armv7alpine容器内完成的,一直到创建Alpine根文件系统压缩包完成。

三、修改源

由于官方源速度比较慢,我们需要将Alpine Linux的官方源替换成阿里源。修改好用apk update命令测试一下。

  1. sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
  2. apk update

四、安装启动服务软件和配置串口

4.1 安装openrc
根据第一节内容的说明,大家已经简单了解了Linux的启动过程。
安装openrc很简单,就是输入下面这一行命令就行了。

  1. apk add openrc

安装完OpenRC,还需要配置一些东西,接下来继续搞。

4.2 启动必要服务

  1. rc-update add devfs boot
  2. rc-update add procfs boot
  3. rc-update add sysfs boot

4.3 设置串口自动登录
在设置前,我们需要确认内核使用的默认串口设备是哪个。可以通过cat /proc/cmdline指令来确认内核使用的串口设备。
同时也可以在官方SDK里输入ls /dev/tty*来查看板子默认开启了哪些串口。

其实图片里是有tty1,tty3,tty4的,但是一般我们只用到ttyFIQ0,也懒得记这么多串口引脚。

4.3.1 添加串口到配置文件,这个文件是负责管理哪个串口能登录root用户

echo ttyFIQ0 > /etc/securetty

4.3.2 修改/etc/inittab文件,这个文件负责在串口设备上开启登录服务和别的一些东西
删除tty1到tty6开始的行,这一步一定要做,否则串口启动会卡死在找ttyX上。

添加这一行,允许串口自动登陆

  1. ttyFIQ0::respawn:/sbin/agetty --autologin root ttyFIQ0 vt100

修改好的内容

  1. # /etc/inittab
  2. ::sysinit:/sbin/openrc sysinit
  3. ::sysinit:/sbin/openrc boot
  4. ::wait:/sbin/openrc default
  5. # Set up a couple of getty's 这下面的删除掉
  6. # Put a agetty on the serial port 这下面一行的改成这样,其他不变
  7. ttyFIQ0::respawn:/sbin/agetty --autologin root ttyFIQ0 vt100
  8. # Stuff to do for the 3-finger salute
  9. ::ctrlaltdel:/sbin/reboot
  10. # Stuff to do before rebooting
  11. ::shutdown:/sbin/openrc shutdown

好的,改完这些,现在的rootfs已经可以启动了。只是还不能使用网络安装软件包。

五、配置网络

5.1 添加网络接口配置
跟很多发行版一样,想永久配置网络设置,可以修改/etc/network/interfaces这个文件。
默认是没有这个文件的,使用以下命令新建

vi /etc/network/interfaces

然后将以下内容复制进去,记得改成自己的IP和对应网段,网关。
个人建议是使用静态IP,这样就不用反复去路由器确认自动获取的IP地址了。

  1. auto eth0
  2. iface eth0 inet static
  3. address 192.168.50.59
  4. netmask 255.255.255.0
  5. gateway 192.168.50.1

修改为记得将networking服务添加到默认启动队列,如果发现板子没有IP可以检查networking服务是否正常运行。

rc-update add networking default

5.2 修改域名解析服务器
编辑/etc/resolv.conf文件,将DNS服务器的IP地址更换成自己当地的服务器IP。
注意:这个文件在重启docker容器、重启电脑后会恢复

  1. # This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry# [network]
  2. # generateResolvConf = false
  3. nameserver 202.103.224.68

5.3 修改主机名称
编辑/etc/hostname这个文件,把里面的内容换成主机名称,例如这里是修改成了Luckfox。
主机名称在ssh远程登录进入shell、串口登录时会显示,用来标识主机。

六、安装和配置ssh服务

6.1 安装openssh软件包
没啥好说的,直接apk add openssh就行了

apk add openssh

6.2 配置ssh
打开/etc/ssh/sshd_config文件
将内容32行和57行修改成以下内容

  1. # Authentication:
  2. #LoginGraceTime 2m
  3. PermitRootLogin yes
  4. #StrictModes yes
  5. #MaxAuthTries 6
  6. #MaxSessions 10
  7. #PubkeyAuthentication yes
  8. # To disable tunneled clear text passwords, change to no here!
  9. PasswordAuthentication yes

6.3 将sshd添加到默认级别队列,实现开机启动sshd

rc-update add sshd default

七、配置开机启动ntpd实现网络校时

7.1 创建本地启动服务脚本
新建/etc/local.d/crond.start这个文件,在文件内添加一下内容。
这个开机服务脚本只做三件事情:ntp网络校时、开启crond定时任务、关闭板子led灯。

  1. #!/bin/bash
  2. ntpd -d -q && crond
  3. echo 0 > /sys/class/leds/work/brightness

保存后,给脚本添加可执行权限

chmod a+x /etc/local.d/crond.start

7.2 配置ntp服务器
新建/etc/ntp.conf文件,添加ntp服务器,这里用的是阿里云校时服务器。
文件内容如下:

  1. server ntp.aliyun.com iburst
  2. server ntp0.aliyun.com iburst
  3. server ntp1.aliyun.com iburst
  4. server ntp2.aliyun.com iburst

7.3 将local添加到默认级别队列

rc-update add local default

7.4 设置时区
Alpine Linux默认是不带多国语言支持和时区支持的。
需要安装tzdata包,复制了上海时区数据后,就可以把这个包删除了,能省一点是一点。

  1. apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
  2. echo "Asia/Shanghai" > /etc/timezone && apk del tzdata

做到这里,开机校时服务就完成了,但是busybox的ntpd程序只进行一次校时。
如果板子需要长期开启,期间需要更准确的时间,清按下一步步骤添加定时ntp校时配置。

7.5 设置crond定时任务
注意:这一步要烧录到板子之后,串口启动再做。现在做了也白搭,具体原因我也没去了解和分析。
7.5.1 创建/var/spool/cron/crontabs目录,用于保存定时配置

mkdir -p /var/spool/cron/crontabs

7.5.2 输入crontab -e命令编辑定时任务

crontab -e

然后将以下内容复制进去,保存

  1. # do daily/weekly/monthly maintenance
  2. # min hour day month weekday command
  3. 0 */6 * * * ntpd -d -q

八、安装需要用到的软件包

到这一步,rootfs的定制工作基本上完成了,剩下的就是安装一些自己需要用到的软件包到rootfs里。
根据自己的需要进行调整,个人建议util-linux、btop、bash都安装一下。

  1. apk add util-linux
  2. apk add sqlite btop
  3. apk add bash bash-completion

修改root用户默认登录的shell,打开/etc/passwd文件,将root这一行的末尾,ash修改成bash。
如下图所示:

  1. root:x:0:0:root:/root:/bin/bash
  2. bin:x:1:1:bin:/bin:/sbin/nologin
  3. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  4. adm:x:3:4:adm:/var/adm:/sbin/nologin

九、将rootfs打包并集成到SDK里完成镜像构建

9.1 打包rootfs
在/目录下执行以下命令

  1. for d in bin etc lib root sbin usr; do tar c "$d" | tar x -C /my-rootfs; done
  2. for dir in dev proc run sys var; do mkdir /my-rootfs/${dir}; done
  3. cd /my-rootfs/ && tar czf alpine.tar.gz *

执行完毕之后,可以看到/tmp/my-rootfs目录下有一个alpine.tar.gz文件。
将这个文件复制到Luckfox的官方SDK的sysdrv/custom_rootfs目录下(自行创建目录)。
如下图所示

9.2 修改官方SDK根目录下的build.sh文件
打开SDK的build.sh,找到1044行的function __PACKAGE_ROOTFS()函数,
将build_get_sdk_version前的内容替换成以下内容:

  1. function __PACKAGE_ROOTFS()
  2. {
  3. local rootfs_tarball _target_dir _install_dir
  4. if [ -f $rootfs_tarball ]; then
  5. if [ -z $RK_CUSTOM_ROOTFS ]; then
  6. rootfs_tarball="$RK_PROJECT_PATH_SYSDRV/rootfs_${RK_LIBC_TPYE}_${RK_CHIP}.tar"
  7. tar xf $rootfs_tarball -C $RK_PROJECT_OUTPUT
  8. else
  9. rootfs_tarball="$RK_CUSTOM_ROOTFS"
  10. if [ ! -d $RK_PROJECT_PACKAGE_ROOTFS_DIR ]; then
  11. mkdir $RK_PROJECT_PACKAGE_ROOTFS_DIR
  12. fi
  13. tar xf $rootfs_tarball -C $RK_PROJECT_PACKAGE_ROOTFS_DIR
  14. fi
  15. else
  16. msg_error "Not found rootfs tarball: $rootfs_tarball"
  17. exit 1
  18. fi
  19. build_get_sdk_version

9.3 修改SDK根目录下的.BoardConfig.mk文件
在文件末尾添加以下内容

  1. # 配置自定义镜像目录
  2. export RK_CUSTOM_ROOTFS=../sysdrv/custom_rootfs/alpine.tar.gz

然后执行以下命令删除output/out/rootfs_uclibc_rv1106目录

rm -rf output/out/rootfs_uclibc_rv1106
这个目录只是构建系统生成的临时rootfs,删除后能确保我们的rootfs生效

然后重新执行build.sh命令生成镜像即可,生成镜像后按常规方式烧录到Nand Flash就行了。
TF卡镜像目前还没研究好怎样处理,烧录后能用,就是根分区大小不能拓展。

./build.sh

清理临时文件系统

如果以后很少用到,不想再自己折腾文件系统的,可以按此步骤执行。
关闭docker容器

docker stop armv7alpine

取消挂载

sudo umount /tmp/my-rootfs

删除文件

rm rootfs.ext4

参考文档

现代 Linux 的五大初始化系统 https://linux.cn/article-7873-1.html
史上最详细linux启动过程讲解---没有之一 https://cloud.tencent.com/developer/article/1114481
Creating Custom rootfs and kernel Images https://www.cnblogs.com/dream397/p/13786186.html

查看精华帖全部内容,请登录或者注册

最新回复

学习了 。楼主加油,继续分享!!!   详情 回复 发表于 2024-1-25 10:45

赞赏

2

查看全部赞赏

点赞(2) 关注(1)
 
 

回复
举报

142

帖子

4

TA的资源

一粒金砂(高级)

沙发
 

向前辈学习 

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

向隆哥学习

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 

感谢分享!

我在移植buildroot时,通过sd启动也遇到了分区挂载问题。

我主要做了两件事来修复这个问题:

        ①、etc/init.d/S20linkmount -》resize2fs似乎不存在有一定影响,增加相关命令。

        ②、我在自己的rootfs中手动创建了oem、userdata等这几个文件。

最后成功效果:

 

点评

牛逼,有空我试试,非常感谢  详情 回复 发表于 2023-11-14 22:24
 
 
 

回复

283

帖子

2

TA的资源

纯净的硅(初级)

5
 
clow 发表于 2023-11-14 19:05 感谢分享! 我在移植buildroot时,通过sd启动也遇到了分区挂载问题。 我主要做了两件事来修复这个问 ...

牛逼,有空我试试,非常感谢

 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

6
 
不错,一起学习。
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

7
 

楼主能请教下,你是怎么让编译出来的镜像同时支持Nand跟emmc的?

我烧录你的镜像,烧录到nand跟tf卡上都能启动。

我自己编译的nand的精选,烧到sd卡后,没办法运行。串口一直打印RKUART

点评

我这个是不支持TF卡的。。。。暂时也没时间折腾  详情 回复 发表于 2024-1-25 10:52
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

8
 
jeason1997 发表于 2024-1-24 16:39 楼主能请教下,你是怎么让编译出来的镜像同时支持Nand跟emmc的? 我烧录你的镜像,烧录到nand跟tf卡上都 ...

很邪门,我昨天明明是可以将你的alpine镜像烧录到tf卡并启动的。

今天无论怎么烧录都不行了,烧我自己编译的也不行。都是启动的时候命令行输出 RKUART。。。是不是还跟nand里烧录的东西有关

 
 
 

回复

6190

帖子

4

TA的资源

版主

9
 

学习了 。楼主加油,继续分享!!!

 
 
 

回复

283

帖子

2

TA的资源

纯净的硅(初级)

10
 
jeason1997 发表于 2024-1-24 16:39 楼主能请教下,你是怎么让编译出来的镜像同时支持Nand跟emmc的? 我烧录你的镜像,烧录到nand跟tf卡上都 ...

我这个是不支持TF卡的。。。。暂时也没时间折腾

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
AD73360 6通道模拟输入的16位串行可编程A/D转换器

AD73360 6通道模拟输入的16位串行可编程A/D转换器 AD73360是AD公司推出的6通道模拟输入的16位串行可编程A ...

可播放语音的红外遥控小车

由于这段时间工作很忙,OUR ROBOT 1号的研发工作一直搁浅。最近利用指导本科毕业生毕业设计的机会,和漂亮的毕业生陈MM一起制作 ...

关于运放的基础细节探索

本人新手,如有不对请老师们赐教。 前两天发了个帖子,原以为讨论USB接口,没想到最终是回到如何使用运放的问题上,特别是得到 ...

Altium Designer 使用

Altium Designer 使用 —— 快速制作原理图封装当制作引脚数比较多的器件的原理图封装时,可以使用AD提供的“smart grid insert ...

分立高速MOS驱动电路

感觉电子工程世界的高手还是比较多的,再发一个之前发表过的电路跟大家一起讨论 最近业余时间本人一直在设计一款严格控制成本的 ...

蓝牙芯片

这个蓝牙芯片我们希望集成更多的功能,比如内存有1M以上;有ADC采样,有OP运放,或者内置有AFE电路;有充电管理(如果没有可以增 ...

最近有传进口半导体厂家的物料价格开始回落

最近有传个半导体厂家的物料价格开始回落,大家有没有感觉到。如果能恢复到2019年的水平,你是否还愿意用回以前的设计。

单片机内存描述

单片机内存描述 最大 2MBKByte 的 dual bank Flash memory – 最大 516KByte 的 SRAM,包括 128KByte 的 单周期访 ...

探索无线世界:从传统的无线电频谱分配到超宽带技术的诱惑

传统无线电频谱分配: 当前可用的 Lan/Pan 收音机 692673 超宽带的诱惑 692674 美国联邦通信委员会法规 对三 ...

【玄铁杯第三届RISC-V应用创新大赛】相关文章阅读记录

简单记录一下吧,虽然也看了几篇文章,但是这个事情必须亲自动手实践才知道细节的。文章中描述了很多有关移植debian的时候遇到的 ...

关闭
站长推荐上一条 1/10 下一条
【干货上新】电源解决方案和技术第二趴 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 15

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表