【玩泰山派】4、制作ubuntu镜像-(5)总结制作ubuntu22.04镜像+5.10内核流程

作者:风为你而吹日期:2025/10/7

文章目录

  • 前言
  • rk镜像概念
    • rk镜像构成
    • 生成sd卡镜像
  • 制作根文件系统流程概述
    • 文件概述
    • 执行流程
      • 执行./mk-base-debian.sh
        • 执行mk-buster-rootfs.sh
        • 执行./mk-image.sh
    • 总结
  • 使用docker容器基于鲁班猫的仓库制作泰山派的ubuntu22.04根文件系统
    • 前言
    • 流程
      • 制作docker镜像
        • 启动docker容器
        • 进入容器
        • 进入容器后执行
          • step1.准备
            * step2.构建基础 Ubuntu 系统。
            * step3.添加 rk overlay 层,并打包ubuntu-rootfs镜像
    • 总结
  • 使用泰山派sdk编译5.10内核问题记录
    • 背景
    • 问题1:内核配置没选好编译工具链,报失败
      • 报错日志
        • 解决方案
    • 问题2:环境中lz4工具版本过低,导致编译失败
      • 报错日志
        • 解决方案
    • 问题3:手动安装bcmdhd.ko内核模块报错
      • 报错日志
        • 原因排查
        • 解决方案
    • wifi固件路径不正确,导致wifi有问题
    • 泰山派调整分区大小【TODO】
    • 安装docker之后,docker服务一直启动报错【还没解决,之后】

前言

完整梳理制作镜像流程

rk镜像概念

这里描述的镜像就是指最终能烧写到sd卡种的一个文件(使用Rockchip的sdk生成的update.img文件)

rk镜像构成

使用Rockchip的sdk去执行./build.sh all和./mkfirmware.sh脚本后,会在rockdev目录下生成下列文件,这些文件是构成sd卡烧录镜像的组成成分

1boot.img -> ../kernel/boot.img    # 内核
2MiniLoaderAll.bin -> ../u-boot/rk356x_spl_loader_v1.13.112.bin  # Secondary Bootloader(SPL)
3misc.img -> ../device/rockchip/rockimg/wipe_all-misc.img*    # misc镜像
4oem.img        # 不熟悉可能和重置系统相关
5parameter.txt -> ../device/rockchip/rk356x/parameter-buildroot-fit.txt # 分区配置文件
6recovery.img -> ../buildroot/output/rockchip_rk356x_recovery/images/recovery.img # 不熟悉可能和重置系统相关
7rootfs.ext4 -> ubuntu-xfce-rootfs.img  # 根文件系统,指向ubuntu-xfce-rootfs.img 
8rootfs.img -> ubuntu-xfce-rootfs.img   # 根文件系统,指向ubuntu-xfce-rootfs.img 
9uboot.img -> ../u-boot/uboot.img         # uboot
10ubuntu-xfce-rootfs.img                        # 根文件系统
11userdata.img										# 不熟悉,用户数据img
12

在 Rockchip 的启动流程中:
​BootROM​ → 2. ​MiniLoaderAll.bin (SPL)​​ → 3. ​U-Boot​ → 4. ​Kernel

生成sd卡镜像

执行./build.sh updateimg后生成名为update.img的sd卡镜像,可以使用Rockchip烧录工具烧录到sd卡中,插入泰山派sd卡卡槽中,就可以直接启动。

./build.sh updateimg执行日志如下,

1root@lckfb:/home/lckfb# ./build.sh updateimg
2processing option: updateimg
3Make update.img
4start to make update.img...
5Android Firmware Package Tool v2.0
6------ PACKAGE ------
7Add file: ./package-file
8package-file,Add file: ./package-file done,offset=0x800,size=0x28b,userspace=0x1
9Add file: ./Image/MiniLoaderAll.bin
10bootloader,Add file: ./Image/MiniLoaderAll.bin done,offset=0x1000,size=0x719c0,userspace=0xe4
11Add file: ./Image/parameter.txt
12parameter,Add file: ./Image/parameter.txt done,offset=0x73000,size=0x1f4,userspace=0x1
13Add file: ./Image/uboot.img
14uboot,Add file: ./Image/uboot.img done,offset=0x73800,size=0x400000,userspace=0x800
15Add file: ./Image/misc.img
16misc,Add file: ./Image/misc.img done,offset=0x473800,size=0xc000,userspace=0x18
17Add file: ./Image/boot.img
18boot,Add file: ./Image/boot.img done,offset=0x47f800,size=0x16eea00,userspace=0x2dde
19Add file: ./Image/recovery.img
20recovery,Add file: ./Image/recovery.img done,offset=0x1b6e800,size=0x1e5fa00,userspace=0x3cc0
21Add file: ./Image/rootfs.img
22rootfs,Add file: ./Image/rootfs.img done,offset=0x39ce800,size=0xec827000,userspace=0x1d904e
23Add file: ./Image/oem.img
24oem,Add file: ./Image/oem.img done,offset=0xf01f5800,size=0x10a6000,userspace=0x214c
25Add file: ./Image/userdata.img
26userdata,Add file: ./Image/userdata.img done,offset=0xf129b800,size=0x444000,userspace=0x888
27Add CRC...
28Make firmware OK!
29------ OK ------
30********rkImageMaker ver 2.0********
31Generating new image, please wait...
32Writing head info...
33Writing boot file...
34Writing firmware...
35
36Generating MD5 data...
37MD5 data generated successfully!
38New image generated successfully!
39Making ./Image/update.img OK.
40Running build_updateimg succeeded.
41

最终生成update.img文件,从日志中可以看出,update.img文件就是由其他文件组成的而已。这次我主要关注根文件系统(rootfs)的制作,可以根据自己的需求,去制作不同的根文件,其他部分可以复用。替换rootfs.ext4和rootfs.img软链到自己制作的根文件系统之后,就可以做出对应的镜像文件。

制作根文件系统流程概述

这里这要分析制作debian和ubuntu根文件系统的流程,不涉及buildroot根文件系统(sdk默认生成的就是buildroot根文件系统)。主要是粗略解读一下Rockchip sdk中的制作debian根文件系统的框架,这里也主要参考了鲁班猫的文档

文件概述

进入debian目录下,有以下文件.

1-rwxrwxr-x  1 1.1K 3月  10 11:04 mk-base-debian.sh
2-rwxrwxr-x  1 8.1K 3月  10 11:25 mk-buster-rootfs.sh
3-rwxrwxr-x  1  477 3月  10 10:49 mk-image.sh
4-rwxrwxr-x  1  441 12月 26 15:18 mk-rootfs.sh
5drwxrwxr-x  7   67 11月 30 11:19 overlay
6drwxrwxr-x  5   49 11月 30 11:19 overlay-debug
7drwxrwxr-x  4   28 11月 30 11:19 overlay-firmware
8drwxrwxr-x  3   19 11月 30 11:19 packages
9drwxrwxr-x  5   47 11月 30 11:19 packages-patches
10-rwxrwxr-x  1 3.0K 11月 30 11:19 post-build.sh
11-rw-rw-r--  1 2.6K 3月  10 11:17 readme.md
12drwxrwxr-x  7  164 11月 30 11:19 ubuntu-build-service
13
  • mk-base-debian.sh:清理构建目录并调用live build开始构建。
  • mk-buster-rootfs.sh:添加Rockchip overlay层。
  • mk-image.sh:将根文件系统打包成img镜像文件
  • overlay:Rockchip overlay层,主要是rootfs中的配置文件
  • overlay-debug:Rockchip overlay层,主要是debug脚本和工具
  • overlay-firmware:Rockchip overlay层,主要是wifi/bt/npu的固件
  • packages:硬件加速包
  • ubuntu-build-service:用于搭建构建环境的依赖文件和live build配置文件

packages目录下有很多重要的deb包,和Rockchip芯片适配的硬件固件和加速包

1├── chromium
2├── glmark2
3├── gst-plugins-bad1.0
4├── gst-plugins-base1.0
5├── gst-plugins-good1.0
6├── gst-plugins-ugly1.0
7├── gstreamer
8├── gst-rkmpp
9├── libdrm
10├── libdrm-cursor
11├── libmali
12├── libv4l
13├── mpp
14├── openbox
15├── pcmanfm
16├── pulseaudio
17├── rga
18├── rga2
19├── rkaiq
20├── rkisp
21├── rknpu2
22├── rktoolkit
23├── rkwifibt       # 这个里面有泰山派使用的博通网卡的固件
24└── xserver
25

执行流程

Rockchip sdk中编译debian根文件系统的函数

1function build_debian(){
2	ARCH=${RK_DEBIAN_ARCH:-${RK_ARCH}}
3	case $ARCH in
4		arm|armhf) ARCH=armhf ;;
5		*) ARCH=arm64 ;;
6	esac
7
8	echo "=========Start building debian for $ARCH========="
9
10	cd debian
11	if [ ! -e linaro-$RK_DEBIAN_VERSION-alip-*.tar.gz ]; then
12		RELEASE=$RK_DEBIAN_VERSION TARGET=desktop ARCH=$ARCH ./mk-base-debian.sh
13		ln -rsf linaro-$RK_DEBIAN_VERSION-alip-*.tar.gz linaro-$RK_DEBIAN_VERSION-$ARCH.tar.gz
14	fi
15
16	VERSION=debug ARCH=$ARCH ./mk-rootfs-$RK_DEBIAN_VERSION.sh
17	./mk-image.sh
18
19	finish_build
20}
21

从上面函数可以看出,执行流程分三步

  • 1、执行./mk-base-debian.sh
  • 2、执行./mk-rootfs-$RK_DEBIAN_VERSION.sh(这里也就是mk-buster-rootfs.sh)
  • 3、执行./mk-image.sh

执行./mk-base-debian.sh

这里主要是使用debian的livebuild工具,去做出一个基础的debian根文件系统

执行mk-buster-rootfs.sh

这里在上面的生成的根文件系统基础上,安装Rockchip相关的东西。主要是把overlay、 overlay-debug、overlay-firmware、packages相关的东西装进去。

鲁班猫在这一步会调用./mk-image.sh,所以就不用单独执行下面的脚本了。

执行./mk-image.sh

将上一步的内容打包成一个img文件,这个就是根文件系统文件。

总结

制作debian、ubuntu根文件系统的基本思路就是:

  1. 先做一个基本的镜像(可以成为base镜像),debian是用live build工具,ubuntu是从官网下载一个基础镜像。这个基础镜像只提供基本的能力,缺乏对应硬件厂商的加速包(比如rk的mpp、libdrm、libmali等)和一些固件(比如:博通的wifi网卡固件)。
  2. 在上面基础镜像的基础上,安装对应硬件厂商的加速包和一些固件,以及一些适配硬件的软件:比如chromium、gstreamer等等(这些应该也是适配了rk底层硬件的,能使用rk硬件解码,不然cpu软件解码性能很差);然后有些自己需要的可能和硬件无关的软件,比如vim、gcc、git等。
  3. 调用工具将上述镜像打包成一个img根文件系统文件,供后续和内核、uboot等其他组件部分合并成一个完整的可以烧录的镜像。

使用docker容器基于鲁班猫的仓库制作泰山派的ubuntu22.04根文件系统

前言

这里我参考了鲁班猫的ubuntu仓库。我从中fork了一份,主要是添加了泰山派博通网卡的固件和内核模块,制作了一个可以在泰山派中跑的ubuntu22.04的镜像。

我fork的仓库地址,仓库中我只适配了ubuntu22.04分支,其他分支我没适配。在readme中我也添加了完整的流程说明,这里也在稍微记录下。

流程

制作docker镜像

首先使用仓库中给定的dockerfile去构建docker镜像

1docker build -t lubancat_build_rootfs:v2 . -f Docker/Dockerfile
2

启动docker容器

1docker run --privileged -d \
2--name lubancat_build_ubuntu \
3--hostname build_ubuntu \
4-v /root/new_workspace/tspi_ubuntu:/ubuntu \ # 这里/root/new_workspace/tspi_ubuntu换成你们本地的仓库根路径
5-it lubancat_build_rootfs:v2 /bin/bash
6

这里有两个注意点:

  • 1、这里做了目录映射,主要是把宿主机的仓库目录映射到容器中,这样在宿主机中就可以拿到生成的根文件系统
  • 2、这里必须使用–privileged,使得容器拥有比较大的权限,可以执行mount、chroot等一些命令,不然可能有问题

进入容器

1docker ps|grep lubancat_build_ubuntu # 查看容器id,输出的第一列就是
2docker exec -it ${容器id} /bin/bash       # 执行这个命令进入容器
3

进入容器后执行

下面的步骤都是在容器中执行的

step1.准备
1cd /ubuntu
2# 注册binfmts,在x86的容器中,执行跨架构命令依赖这个,如果是arm的容器,应该就不需要
3update-binfmts --enable qemu-aarch64
4# 安装依赖
5sudo dpkg -i ubuntu-build-service/packages/*
6sudo apt-get install -f
7

这里有个关键点

  • 如果是x86的机器,可能需要手动执行update-binfmts --enable qemu-aarch64去注册binfmts,在x86的容器中,执行跨架构命令依赖这个,如果是arm的容器,应该就不需要。我之前的文章中描述我在容器中无法制作成功,应该就是没有执行它,导致chroot后,arm64的可执行文件无法被自动翻译执行,导致有问题。这个有可能是自动生效的,但是如果没生效,就需要执行下这个了
step2.构建基础 Ubuntu 系统。
1# 运行以下脚本,根据提示选择要构建的版本
2./mk-base-ubuntu.sh
3
step3.添加 rk overlay 层,并打包ubuntu-rootfs镜像
1# 运行以下脚本,根据提示选择要构建处理器版本和ubuntu的版本
2./mk-ubuntu-rootfs.sh
3

总结

我现在自测这个流程是非常ok的,而且我基于鲁班猫的这个仓库做的ubuntu22.04的xfce桌面的镜像,使用chromium浏览器播放视频还算流畅。实测播放b站上面的720p及以下分辨率的视频还是比较流畅;播放1080p的视频就完全不行了,非常卡顿了。估计这也是到达了rk3566这款soc的极限性能了吧。这已经比我之前做的镜像好多了,我之前应该是没有配置好rk硬件加速包之类的,直接播放任意流畅度的b站视频都无比卡顿。感谢鲁班猫,提供的资料很详细,yyds;之后高低整一块鲁班猫的板子。

这样就能在docker容器中完整制作根文件系统了,不用在像之前的文章介绍的使用qemu虚拟机去做了,就方便太多了0.0

使用泰山派sdk编译5.10内核问题记录

背景

我使用的是从鲁班猫仓库获取的内核,fork了一份:仓库地址,里面有5.10版本的内核

我使用的是ubuntu18.04.6的容器去进行泰山派sdk的编译操作

问题1:内核配置没选好编译工具链,报失败

报错日志

失败日志如下:

1arch/arm64/Makefile:25: ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum
2arch/arm64/Makefile:33: LSE atomics not supported by binutils
3arch/arm64/Makefile:44: Detected assembler with broken .inst; disassembly will be unreliable
4arch/arm64/Makefile:25: ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum
5arch/arm64/Makefile:33: LSE atomics not supported by binutils
6arch/arm64/Makefile:44: Detected assembler with broken .inst; disassembly will be unreliable
7  CC      scripts/mod/empty.o
8  CC      scripts/mod/devicetable-offsets.s
9gcc: error: unrecognized command line option '-mlittle-endian'; did you mean '-fconvert=little-endian'?
10gcc: error: unrecognized command line option '-mlittle-endian'; did you mean '-fconvert=little-endian'?
11scripts/Makefile.build:273: recipe for target 'scripts/mod/empty.o' failed
12make[2]: *** [scripts/mod/empty.o] Error 1
13make[2]: *** Waiting for unfinished jobs....
14scripts/Makefile.build:117: recipe for target 'scripts/mod/devicetable-offsets.s' failed
15make[2]: *** [scripts/mod/devicetable-offsets.s] Error 1
16Makefile:1354: recipe for target 'prepare0' failed
17make[1]: *** [prepare0] Error 2
18arch/arm64/Makefile:214: recipe for target 'tspi-rk3566-user-v10-linux.img' failed
19make: *** [tspi-rk3566-user-v10-linux.img] Error 2
20ERROR: Running build_kernel failed!
21ERROR: exit code 2 from line 656:
22    make ARCH=$RK_ARCH $RK_KERNEL_DTS.img -j$RK_JOBS
23

解决方案

后面发现是没搞好内核的编译器的配置,需要修改kernel中的Makefile为自己的编译器(kernel/Makefile里)。【这里有点奇怪的是,编译泰山派sdk原来的4.19版本的内核也没这样显式的去写,但是是ok的,这里后面有时间再看看,现在就先这样搞吧
在这里插入图片描述
这里是参考文档:RK3566-移植5.10内核&Ubuntu22.04,去解决的。

问题2:环境中lz4工具版本过低,导致编译失败

报错日志

1arch/arm64/configs/rockchip_linux_defconfig:683:warning: override: reassigning to symbol NETFILTER
2#
3# No change to .config
4#
5
6  CALL    scripts/atomic/check-atomics.sh
7  CALL    scripts/checksyscalls.sh
8  CHK     include/generated/compile.h
9  LZ4C    arch/arm64/boot/Image.lz4
10Incorrect parameters
11Usage :
12      lz4 [arg] [input] [output]
13
14input   : a filename
15          with no FILE, or when FILE is - or stdin, read standard input
16Arguments :
17 -1     : Fast compression (default) 
18 -9     : High compression 
19 -d     : decompression (default for .lz4 extension)
20 -z     : force compression
21 -f     : overwrite output without prompting 
22 -h/-H  : display help/long help and exit
23arch/arm64/boot/Makefile:31: recipe for target 'arch/arm64/boot/Image.lz4' failed
24make[2]: *** [arch/arm64/boot/Image.lz4] Error 1
25make[2]: *** Deleting file 'arch/arm64/boot/Image.lz4'
26arch/arm64/Makefile:170: recipe for target 'Image.lz4' failed
27make[1]: *** [Image.lz4] Error 2
28make[1]: *** Waiting for unfinished jobs....
29arch/arm64/Makefile:214: recipe for target 'tspi-rk3566-user-v10-linux.img' failed
30make: *** [tspi-rk3566-user-v10-linux.img] Error 2
31ERROR: Running build_kernel failed!
32ERROR: exit code 2 from line 656:
33    make ARCH=$RK_ARCH $RK_KERNEL_DTS.img -j$RK_JOBS
34

解决方案

升级工具版本,由于我的ubuntu版本太低,使用apt无法升级更新的,只能从源码安装

1# 1. 从 GitHub 下载最新源码
2git clone https://github.com/lz4/lz4.git
3cd lz4
4
5# 2. 编译并安装到系统路径
6make
7sudo make install
8
9# 3. 验证新版本
10lz4 --version
11

然后再执行./build.sh kernel就编译成功了。

问题3:手动安装bcmdhd.ko内核模块报错

报错日志

编译好这个5.10内核后,手动安装wifi的驱动bcmdhd.ko一直报错,报错如下

1insmod /system/lib/modules/bcmdhd.ko,
2  [  162.699496] bcmdhd: Unknown symbol dhd_wlan_mem_prealloc (err -2
3

原因排查

刚开始不知道什么原因,以为缺少其他的一些内核模块,搞了好久也不行。
后面使用modinfo输出内容,让ds分析:

1modinfo /system/lib/modules/bcmdhd.ko
2
3filename:       /system/lib/modules/bcmdhd.ko
4import_ns:      VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver
5license:        GPL and additional rights
6alias:          sdio:c00v*d*
7alias:          sdio:c*v02D0d449A*
8alias:          sdio:c*v02D0d4499*
9alias:          sdio:c*v02D0d4498*
10alias:          sdio:c*v02D0dA805*
11alias:          sdio:c*v02D0d4497*
12alias:          sdio:c*v02D0d4496*
13alias:          sdio:c*v02D0d4495*
14alias:          sdio:c*v02D0dA806*
15alias:          sdio:c*v02D0dA804*
16alias:          sdio:c*v02D0dAAE8*
17alias:          sdio:c*v02D0dAAE7*
18alias:          sdio:c*v02D0d4362*
19alias:          sdio:c*v02D0d0000*
20depends:        dhd_static_buf
21intree:         Y
22name:           bcmdhd
23vermagic:       5.10.209 SMP mod_unload aarch64
24parm:           dhd_doflow:uint
25parm:           dhd_dpcpoll:uint
26parm:           clockoverride:SDIO card clock override (int)
27parm:           sd_msglevel:uint
28parm:           sd_power:uint
29parm:           sd_clock:uint
30parm:           sd_divisor:uint
31parm:           sd_sdmode:uint
32parm:           sd_hiok:uint
33parm:           sd_f2_blocksize:int
34parm:           sd_f1_blocksize:int
35parm:           fw_ap_select:uint
36parm:           wl_reassoc_support:uint
37parm:           g_assert_type:int
38parm:           dhd_oob_gpio_num:DHD oob gpio number (int)
39parm:           clm_path:string
40parm:           info_string:string
41parm:           op_mode:int
42parm:           dhd_msg_level:int
43parm:           iw_msg_level:int
44parm:           wl_dbg_level:int
45parm:           android_msg_level:int
46parm:           config_msg_level:int
47parm:           dhd_arp_mode:uint
48parm:           disable_proptx:int
49parm:           firmware_path:string
50parm:           nvram_path:string
51parm:           config_path:string
52parm:           wl_event_enable:uint
53parm:           logtrace_pkt_sendup:uint
54parm:           dhd_watchdog_ms:uint
55parm:           dhd_console_ms:uint
56parm:           dhd_slpauto:uint
57parm:           dhd_pkt_filter_enable:uint
58parm:           dhd_pkt_filter_init:uint
59parm:           dhd_master_mode:uint
60parm:           dhd_watchdog_prio:int
61parm:           dhd_dpc_prio:int
62parm:           dhd_rxf_prio:int
63parm:           dhd_dongle_ramsize:int
64parm:           passive_channel_skip:int
65parm:           instance_base:int
66parm:           pcie_txs_metadata_enable:int
67parm:           iface_name:string
68parm:           dhd_idletime:int
69parm:           dhd_poll:uint
70parm:           dhd_intr:uint
71parm:           dhd_sdiod_drive_strength:uint
72parm:           dhd_txbound:uint
73parm:           dhd_rxbound:uint
74parm:           dhd_deferred_tx:uint
75parm:           allow_delay_fwdl:int
76parm:           enable_ecounter:uint
77parm:           dhd_tcm_test_enable:uint
78这是加载失败的模块介绍,可以看出它加载失败的原因么?
79

ds输出结果

1一、核心问题分析​
2​**关键信息:depends: dhd_static_buf**​
3这行输出明确告诉我们,bcmdhd.ko 依赖于另一个名为 ​**dhd_static_buf**​ 的模块。
4在 Linux 内核模块机制中,一个模块所依赖的所有符号(函数、变量)必须在其依赖模块加载后,由依赖模块提供。如果依赖模块未加载,内核就无法解析这些符号,从而导致 Unknown symbol 错误。
5​结合您之前的错误信息:​​
6您之前的错误是 Unknown symbol dhd_wlan_mem_prealloc (err -2)。
7函数 dhd_wlan_mem_prealloc 极有可能就是由 dhd_static_buf.ko 这个模块导出的。
8因此,根本原因是 ​没有先加载 dhd_static_buf.ko。
9

从结果看是依赖一个dhd_static_buf.ko模块,然后看5.10内核目录,对应的modules.order文件中果然有这依赖项,但是4.19内核是没有,

5.10内核
在这里插入图片描述
4.19内核,就没这个依赖项,应该是模块代码有改动。。。。
在这里插入图片描述

解决方案

首先我把dhd_static_buf.ko模块也拷进去试试。

但是更好的版本应该是把内核模块安装到根文件系统之中,这就能按依赖自动加载内核模块了。参考命令:

  • 1、将rootfs的img文件绑定挂载到指定目录(这里因为做出的rootfs是一个img文件,可以说是一个镜像,不是一个目录,无法直接操作,所以需要使用loop设备去挂载到一个目录(好像直接挂载这个img文件也是可以,不用loop也可以))
    • mount -o ubuntu-xfce-rootfs.img ./ubuntu
    • 这样就可以通过ubuntu目录去操作rootfs里面的内容
  • 2、使用命令安装内核模块到根文件系统
    • make ARCH=arm64 modules_install INSTALL_MOD_PATH=…/ubuntu
  • 3、用完umount ubuntu就可以
    这样应该就ok了
    在这里插入图片描述

wifi固件路径不正确,导致wifi有问题

wifi固件路径要和内核模块放在一块,之前ko和固件都放在/system/lib下,后面ko放在/lib/modules下面了,但是固件没改,导致有问题,把/system/lib/firmware里面的固件都拷贝到/lib/firmware下面,就OK了。

泰山派调整分区大小【TODO】

还没做,之后可以做

安装docker之后,docker服务一直启动报错【还没解决,之后】

  • 我只前做的是ubuntu22.04+4.19的内核,安装docker就不成功,主要是iptables有问题。后面网上搜索说因为ubuntu22.04得配置5.10内核,因为ubuntu22.04对应的iptables需要5.10内核的东西,我就准备升级5.10内核,现在换了5.10内核还没搞好,后面再看看。。。。。。

【玩泰山派】4、制作ubuntu镜像-(5)总结制作ubuntu22.04镜像+5.10内核流程》 是转载文章,点击查看原文


相关推荐


DrissionPage爬取汽车之家:(车名 + 颜色 + 车辆型号/续航里程)
python全栈蛇行者2025/10/5

DrissionPage爬取汽车之家 效果展示 项目概述与背景 在当今大数据时代,网络数据采集已成为获取信息的重要手段。本教程将全面详细介绍如何使用Python的DrissionPage库结合其他工具爬取汽车之家网站(https://www.autohome.com.cn/price/levelid_1)的汽车数据。汽车之家作为国内领先的汽车资讯平台,包含了丰富的汽车信息数据,这些数据对于汽车市场分析、竞品研究、价格监控等具有重要价值。 本项目旨在通过自动化技术手段,高效地采集汽


UNIX下C语言编程与实践5-C 语言编译器 cc(gcc/xlc)核心参数解析:-I、-L、-D 的使用场景与实例
迎風吹頭髮2025/10/4

一、引言:为什么需要关注 cc 编译器参数? 在 UNIX 环境下,C 语言编译器(如 gcc、xlc,统一简称 cc)是开发的核心工具。当项目规模超过单个文件、依赖第三方库或需要条件编译时,仅靠默认编译命令(如 cc main.c -o main)会频繁遇到「头文件找不到」「库链接失败」「宏定义未生效」等问题。 本文聚焦 cc 编译器中最核心的三个参数:-I(加载头文件路径)、-L(加载库文件路径)、-D(宏定义),结合实际项目案例解析其作用、使用场景及常见问题,同时拓展其他实用参数,帮助


介绍一种新的向量存储格式:DiskBBQ
Elastic 中国社区官方博客2025/10/3

作者:来自 Elastic Benjamin Trent, John Wagster 及 Ignacio Vera Sequeiros 介绍 DiskBBQ,一种 HNSW 的替代方案,并探讨何时以及为何使用它。 测试 Elastic 的领先开箱即用能力。深入我们的示例笔记本,开始免费的云试用,或立即在本地机器上尝试 Elastic。 DiskBBQ 是 Inverted Vector File (IVF) 索引的进化版。它是 Hierarchical Navigable Sm


vue2到vue3快速上手入门
cz橙2025/10/2

vue3 需要会vue2,该文档笔记基于黑马的课,进阶快速入门vue3 vue3 官方文档:https://v3.cn.vuejs.org/ main.js改变 import { createApp } from 'vue' import App from './App.vue' const app = createApp(App) app.mount('#app') /* 挂载app到id为app的元素上 */ 不需要new Vue(),直接createApp(App) App.


Mock数据与真实API的无缝切换:联调阶段的核心技术
_5792025/10/2

在现代软件开发中,尤其是在多系统、多平台的应用环境下,如何高效地进行数据集成和接口联调一直是一个挑战。随着开发流程的不断优化,Mock数据和真实API的无缝切换成为了开发和测试过程中的一个关键环节。本文将详细探讨如何实现Mock数据与真实API的无缝切换,并分享在联调阶段的核心技术及最佳实践。??Mock数据与真实API的背景概述在开发初期,API的设计和实现往往会滞后于前端界面的开发。此时,为了保证前端开发能够顺利进行,开发人员通常会使用Mock数据来模拟真实API的响应。这种方法可以帮助开发


没电脑=不能写代码?为什么我一个高中生能在手机上码 1万多行 C++,造了一个 GUI 库和一款肉鸽游戏?
Gamexyrs10/2/2025

当所有人都在说手机编程不可能,当别人在电脑上用 VS 欻欻欻敲代码时,我用 MT 管理器敲屏幕编代码,用 C4Droid编译打包程序。做了自己的界面库,做了自己的游戏。这篇文章主要介绍了我是怎么单凭手机一步步走过来的,也想为跟我相似的人提供一些方法。支持开源:所有代码已在 Github 开源,可在文章末尾链接查看。


Redis 内存淘汰策略 LRU 和传统 LRU 差异
程序员小29/30/2025

最近没被用过的,下次也大概率用不上。举个例子:你电脑桌面上放着常用的软件图标(微信、IDE),这些是最近常用的;而几个月没打开过的压缩工具,会被你拖到文件夹里。这就是 LRU 的思路:保留最近使用的,淘汰最近最少使用的。❝假设缓存容量只有 3,依次存入 A、B、C,此时缓存是 [A,B,C];若此时访问 A(A 变成最近使用),缓存顺序变为 [B,C,A]若再存入D(缓存满了),需要淘汰最近最少使用的 B,最终缓存是 [C,A,D]LFU的全称是。


【大数据毕设项目】基于大数据的茅台股票市场风险评估与可视化分析平台毕设源码\Hadoop+Spark茅台股票数据分析与预测平台
大数据毕设指导师9/30/2025

本文介绍了基于大数据的贵州茅台股票数据分析系统开发项目。项目利用Python、Spark、Hadoop等技术,构建了一个集成化的股票分析平台,包含价格趋势分析、技术指标分析、成交量分析等功能模块。系统通过数据挖掘和机器学习技术,为投资者提供全面、实时的市场分析,支持可视化展示。文章详细说明了项目背景、技术方案、核心内容及关键代码实现,展示了成交量趋势分析和价格区间分布的可视化效果。该项目为金融投资决策提供了科学依据,具有重要的实践价值。


前端必看!12个JS神级简写技巧,代码效率直接飙升80%,告别加班!
刘大华2025/10/8

前言 哈喽大家好,我是大华。 在日常开发中,我们经常会遇到一些重复、冗长的代码。写起来费劲,读起来费神,维护起来更是头疼。而且代码越复杂,性能可能越受影响。 那有没有办法让代码更简洁、清晰又高效呢? JavaScript提供了许多现代语法特性,合理使用这些简写技巧,不仅能大幅减少代码量,还能提升可读性和执行效率。 很多资深前端都在用,这篇文章整理了 12 个最实用的 JS 简写技巧,并结合实际场景进行优化和补充,帮助你写出更优雅的代码。 1. 短路运算符:替代简单的 if 判断 以前我们这样写


AI辅助制作宣传视频
Enabler_Rx2025/10/10

首先写好文字稿子,然后用google gemini模型生成音频。可以选择很多种人声,我选择了language English(US)和callirrhoe的发声,模型文生音频链接: https://cloud.google.com/text-to-speech?hl=zh-CN 然后下载音频文件 使用Microsoft Clipchamp打开音频文件,插入图像内容,可以调节音频速度,加入字幕等 然后导出生成文件 完成!

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0