嵌入式Linux开发实战:基于Orange Pi的U-Boot、内核与设备树配置指南
1. 项目概述一个面向嵌入式开发者的开源硬件仓库最近在折腾Orange Pi、香橙派这类ARM开发板时经常需要找一些适配的U-Boot引导程序、Linux内核源码或者设备树文件。官方仓库的代码有时更新不及时或者缺少针对特定外设的补丁这时候就得去GitHub上“大海捞针”。正是在这个过程中我发现了jaguarliuu/xunlong这个宝藏仓库。它不是什么惊天动地的框架但对于我们这些玩嵌入式Linux、尤其是基于全志Allwinner芯片方案的开发者来说它就像一位默默无闻的“后勤部长”把开发过程中最琐碎、最基础但又不可或缺的资源分门别类地整理好了。简单来说jaguarliuu/xunlong是一个在GitHub上托管的开源仓库其主要内容是收集、整理并维护与“迅龙”Xunlong公司旗下产品——也就是我们熟知的Orange Pi香橙派系列开发板——相关的各类底层软件资源。这包括但不限于为不同型号开发板适配的U-Boot引导加载器源码、经过验证的Linux内核分支、预编译好的固件如Wi-Fi/蓝牙、设备树Device Tree文件以及一些实用的构建脚本和配置说明。这个仓库的价值在于它的“聚合”与“验证”属性。原作者或维护者jaguarliuu并非这些代码的原始作者它们大多来源于Linux内核主线、U-Boot主线或全志的SDK但他的工作是将散落在各处的、经过实际测试可用的资源集中起来并标注清楚其对应的硬件型号和版本。对于开发者而言这直接解决了“用什么版本的内核能点亮我的板子”“这个DTB文件对应哪个型号”这类入门级但极其耗时的痛点。你不用再在论坛、博客、官方Wiki之间反复横跳对比而是可以在这个仓库里找到一个相对可靠的起点。2. 仓库内容深度解析与核心价值2.1 核心资源构成不止是代码搬运初看jaguarliuu/xunlong你可能会觉得它只是一个简单的代码合集。但深入使用后你会发现它的结构设计蕴含了对嵌入式开发流程的深刻理解。仓库的内容通常围绕以下几个核心板块组织1. 引导加载器U-Boot集合这是让开发板从“砖头”变成“智能设备”的第一步。仓库里通常会包含针对不同全志SoC如H3、H5、H6、H616等和具体板型Orange Pi Zero, PC, Plus等编译好的U-Boot二进制文件u-boot-sunxi-with-spl.bin以及对应的源码或补丁。对于开发者尤其是刚上手的新手直接使用一个已知能工作的U-Boot可以避免在时钟、DRAM初始化这些底层硬件调试上耗费数天时间。仓库可能会提供多个版本例如一个最稳定的旧版本和一个支持新特性的新版本并附上简单的说明。注意直接使用预编译的U-Boot固件虽然快捷但如果你需要深度定制比如修改环境变量、增加驱动还是需要获取对应的源码进行编译。仓库中如果提供了源码或补丁务必查看其基于的U-Boot主线版本这关系到后续内核的兼容性。2. Linux内核分支与设备树这是仓库的核心部分。它会提供数个Linux内核的分支例如linux-5.10.y、linux-5.15.y等并已经打上了必要的补丁以支持Orange Pi的特定硬件如GPU、视频编解码器、GPIO扩展芯片等。更重要的是它会清晰地列出每个内核版本所支持的板型列表以及对应的设备树源文件.dts和编译后的设备树二进制文件.dtb。设备树是嵌入式Linux的“硬件描述文件”它告诉内核这块板子上有什么硬件、地址在哪里、如何初始化。对于Orange Pi这种拥有众多变体的产品线正确的DTB文件是系统能否正常启动的关键。jaguarliuu/xunlong仓库的价值就在于它帮你做了匹配和验证。你不需要自己去研究sunxi内核目录下那一堆令人眼花缭乱的.dts文件哪个对应你的Orange Pi 3 LTS仓库里可能已经有一个标记好的文件或一个构建脚本自动为你选择。3. 脚本与工具链为了提升易用性仓库通常会包含一些Shell脚本或Makefile。例如构建脚本一键式脚本用于从指定分支拉取内核源码、应用补丁、配置内核可能使用一个预置的.config文件、编译内核和模块并最终打包。这大大简化了从源码到可部署镜像的过程。烧录工具可能包含或指引如何使用sunxi-tools这样的全志专用工具用于通过FEL模式从USB启动并烧录镜像这是在板载存储为空或损坏时的救砖利器。根文件系统制作脚本指导如何与Buildroot或Debian根文件系统结合制作完整的SD卡镜像。4. 文档与链接虽然不是长篇大论的手册但关键的说明往往以README文件或目录内注释的形式存在。例如会注明“此内核分支需要搭配U-Boot v2022.01及以上版本”或者“该DTB文件仅适用于带有eMMC版本的Orange Pi PC2”。同时它可能还会链接到更权威的社区资源如Linux Sunxi Wiki引导用户在遇到更深层次问题时去查阅。2.2 解决的实际痛点为什么你需要它在嵌入式开发中“环境准备”和“基础组件适配”往往消耗掉项目初期50%以上的精力。jaguarliuu/xunlong这类仓库的出现精准地打击了以下几个痛点痛点一信息碎片化与版本迷宫。全志芯片的官方支持资料SDK/BSP可能更新缓慢或不易获取而社区资源则散落在论坛帖子、个人博客、GitHub Gist和各种开源项目中。同一个Orange Pi Zero 2你可能找到基于内核4.19、5.10、5.15、6.1的多种移植方案质量参差不齐外设支持度也不同。这个仓库充当了一个“策展人”的角色筛选出经过一定验证的、可工作的版本组合为你提供了一个明确的起点。痛点二硬件适配的“最后一公里”问题。主线Linux内核已经支持了很多全志SoC的基础功能但具体到某一块Orange Pi开发板其板级差异比如PMIC型号、网络PHY、音频编解码器、LED和按键的GPIO连接方式需要正确的设备树来描述。自己从头编写或修改设备树需要阅读原理图、数据手册门槛较高。这个仓库提供的现成设备树文件让你跳过了硬件验证阶段直接进入系统开发和应用开发。痛点三构建流程的复杂性。交叉编译工具链的选择、内核配置选项的勾选几千个选项、驱动模块的编译与安装每一步都可能遇到依赖问题或配置错误。仓库提供的脚本如果存在将这一系列步骤自动化你只需要运行一条命令或者稍作修改如指定工具链路径就能得到可用的内核镜像和模块。这对于需要频繁测试不同内核版本或进行小修改的开发者来说效率提升是巨大的。痛点四救砖与恢复。玩开发板难免有失手的时候错误的刷机操作可能导致板子无法启动。仓库中如果包含了进入FEL模式的方法和相应的烧录工具/镜像就等于提供了一份“保险”。你知道至少有一个途径能把板子恢复到一个已知的正常状态。3. 实战指南如何利用该仓库启动你的Orange Pi项目假设我们拿到一块全新的Orange Pi Zero 2基于全志H616芯片目标是运行一个自定义的Debian系统。下面我将结合jaguarliuu/xunlong这类仓库的典型资源一步步演示如何操作。3.1 前期准备与资源获取第一步硬件与基础环境确认Orange Pi Zero 2 开发板一块。一张至少8GB的MicroSD卡及读卡器。一台用于开发的Linux主机Ubuntu 20.04/22.04或类似发行版并确保已安装基本开发工具sudo apt update sudo apt install git build-essential swig python3-dev libssl-dev pkg-config安装ARM交叉编译工具链。你可以使用系统仓库的gcc-arm-linux-gnueabihf但更推荐使用Linaro或Arm官方更现代的工具链。例如下载并解压到~/toolchains/wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz tar -xf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz -C ~/toolchains/将工具链路径加入环境变量临时export PATH$PATH:~/toolchains/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin export CROSS_COMPILEarm-none-linux-gnueabihf- export ARCHarm第二步克隆与探索目标仓库我们以jaguarliuu/xunlong为例请注意实际操作时请确认该仓库的当前状态和可用性git clone https://github.com/jaguarliuu/xunlong.git cd xunlong进入仓库后第一件事是仔细阅读README.md文件。然后浏览目录结构通常你会看到类似这样的布局xunlong/ ├── README.md ├── u-boot/ # U-Boot相关 │ ├── orangepi-zero2/ # 针对特定板型的目录 │ │ ├── u-boot-sunxi-with-spl.bin │ │ └── README │ └── ... ├── linux/ # Linux内核相关 │ ├── 5.15.y/ # 内核版本分支 │ │ ├── configs/ # 内核配置文件 │ │ │ └── orangepi_zero2_defconfig │ │ ├── patches/ # 额外补丁 │ │ └── build.sh # 构建脚本 │ └── ... ├── scripts/ # 通用工具脚本 ├── tools/ # 预编译工具 └── docs/ # 补充文档找到与你的板型Orange Pi Zero 2和所需内核版本例如5.15.y对应的目录。3.2 编译与部署引导加载器U-Boot对于Orange PiU-Boot通常需要两个部分组合SPL (Secondary Program Loader) 和主U-Boot。仓库里可能直接提供了二进制文件。方案A直接使用预编译二进制最快在u-boot/orangepi-zero2/目录下找到u-boot-sunxi-with-spl.bin。这就是可以直接烧录到SD卡前部的完整引导程序。方案B从源码编译更灵活如果仓库提供了U-Boot源码或补丁或者你想使用特定版本# 假设仓库的u-boot目录下有源码 cd u-boot # 查看有哪些分支或tag git branch -a git tag # 切换到与内核兼容的版本例如 v2022.01 git checkout v2022.01 # 应用仓库可能提供的针对Orange Pi Zero 2的补丁如果有 patch -p1 ../patches/orangepi-zero2-u-boot-fix.patch # 配置 make orangepi_zero2_defconfig # 编译CROSS_COMPILE环境变量已在之前设置 make -j$(nproc)编译完成后在源码根目录会生成u-boot-sunxi-with-spl.bin。烧录U-Boot到SD卡首先插入SD卡用lsblk命令确认其设备名例如/dev/sdb请务必确认否则可能格式化错误磁盘。sudo dd ifu-boot-sunxi-with-spl.bin of/dev/sdb bs1k seek8 convfsync这条命令将U-Boot写入SD卡从第8个扇区1KB*88KB开始的位置这是全志芯片BootROM要求的固定偏移量。convfsync确保数据完全写入。实操心得在运行dd命令前双重甚至三重确认of后面的设备名是否正确。一个有效的方法是先拔掉SD卡运行一次lsblk再插入SD卡再运行一次lsblk多出来的那个设备就是你的SD卡。也可以根据容量大小判断。误操作可能导致主机系统盘数据丢失。3.3 配置与编译Linux内核进入内核目录例如linux/5.15.y。cd linux/5.15.y第一步应用补丁如果有查看patches/目录按顺序应用补丁for p in patches/*.patch; do patch -p1 $p; done第二步配置内核使用仓库提供的默认配置这通常已经为对应的开发板做了优化。make ARCHarm CROSS_COMPILEarm-none-linux-gnueabihf- orangepi_zero2_defconfig如果你想进一步自定义内核功能比如增加某个驱动、启用文件系统支持make ARCHarm CROSS_COMPILEarm-none-linux-gnueabihf- menuconfig在图形界面中进行修改保存后退出。第三步编译内核与模块# 编译内核镜像zImage和设备树二进制文件dtbs make ARCHarm CROSS_COMPILEarm-none-linux-gnueabihf- -j$(nproc) zImage dtbs # 编译内核模块 make ARCHarm CROSS_COMPILEarm-none-linux-gnueabihf- -j$(nproc) modules编译完成后关键文件位于arch/arm/boot/zImage- 压缩的内核镜像。arch/arm/boot/dts/*.dtb- 各种开发板的设备树二进制文件找到你的sun50i-h616-orangepi-zero2.dtb。模块文件散落在各个驱动目录需要安装到指定位置。第四步安装内核模块到临时目录我们将模块安装到一个临时目录以便后续打包进根文件系统。# 创建一个临时目录用于存放模块 mkdir -p ../output/modules # 安装模块指定安装路径 make ARCHarm CROSS_COMPILEarm-none-linux-gnueabihf- INSTALL_MOD_PATH../output/modules modules_install执行后模块会被安装到../output/modules/lib/modules/内核版本/下。3.4 准备根文件系统与制作完整SD卡镜像内核和U-Boot准备好了还需要一个根文件系统Rootfs。这里以使用现成的Debian根文件系统为例。第一步获取Debian根文件系统可以从Armbian或Ubuntu官方获取基础根文件系统。例如下载Debian Bullseye最小化根文件系统cd .. wget https://rcn-ee.com/rootfs/eewiki/minfs/debian-11.7-minimal-armhf-2023-05-22.tar.xz mkdir rootfs sudo tar -xpf debian-11.7-minimal-armhf-2023-05-22.tar.xz -C rootfs第二步将内核模块复制到根文件系统sudo cp -r output/modules/lib/modules/* rootfs/lib/modules/第三步安装内核镜像和设备树到根文件系统的boot分区通常SD卡会被分为两个分区第一个是FAT32格式的boot分区存放内核和DTB第二个是ext4格式的rootfs分区。我们先在本地准备好boot分区的内容。mkdir boot_partition # 复制内核镜像 cp linux/5.15.y/arch/arm/boot/zImage boot_partition/ # 复制对应的设备树文件 cp linux/5.15.y/arch/arm/boot/dts/sun50i-h616-orangepi-zero2.dtb boot_partition/ # 可以创建一个基本的U-Boot脚本可选 echo load mmc 0:1 0x46000000 zImage; load mmc 0:1 0x47000000 sun50i-h616-orangepi-zero2.dtb; bootz 0x46000000 - 0x47000000 boot_partition/boot.scr mkimage -A arm -T script -C none -n Boot script -d boot_partition/boot.scr boot_partition/boot.scr.uimg第四步分区并烧录SD卡假设SD卡设备是/dev/sdb再次警告请确认设备名。sudo parted /dev/sdb --script mklabel msdos sudo parted /dev/sdb --script mkpart primary fat32 1MiB 256MiB sudo parted /dev/sdb --script mkpart primary ext4 256MiB 100% sudo mkfs.vfat /dev/sdb1 sudo mkfs.ext4 /dev/sdb2第五步复制文件到SD卡# 挂载分区 mkdir -p /mnt/sd_boot /mnt/sd_root sudo mount /dev/sdb1 /mnt/sd_boot sudo mount /dev/sdb2 /mnt/sd_root # 复制boot分区内容 sudo cp -r boot_partition/* /mnt/sd_boot/ # 复制根文件系统内容 sudo cp -r rootfs/* /mnt/sd_root/ # 同步并卸载 sync sudo umount /mnt/sd_boot /mnt/sd_root现在将SD卡插入Orange Pi Zero 2上电你应该能看到串口输出U-Boot信息随后内核启动最终进入Debian系统。4. 进阶应用与定制化开发当基础系统跑起来后jaguarliuu/xunlong仓库的价值还体现在更深度的定制上。4.1 设备树Device Tree的修改与调试设备树是硬件描述的枢纽。假设你想在Orange Pi Zero 2上启用一个官方设备树未启用的功能比如某个GPIO引脚的控制。第一步定位源文件在linux/5.15.y/arch/arm/boot/dts/目录下找到板级设备树文件例如sun50i-h616-orangepi-zero2.dts。同时需要参考SoC级的设备树文件sun50i-h616.dtsi其中定义了H616芯片的通用硬件资源。第二步理解设备树语法设备树是一种描述硬件拓扑和配置的数据结构。一个简单的GPIO LED节点示例如下/ { compatible xunlong,orangepi-zero2, allwinner,sun50i-h616; model Xunlong Orange Pi Zero 2; leds { compatible gpio-leds; status_led { label orangepi:green:status; gpios pio 2 13 GPIO_ACTIVE_HIGH; /* PC13 */ linux,default-trigger heartbeat; }; }; };compatible属性用于匹配驱动。gpios pio 2 13 GPIO_ACTIVE_HIGH表示使用GPIO控制器pio的端口C编号2的第13号引脚高电平有效。第三步修改与编译你可以添加、修改或覆盖节点。修改.dts文件后需要重新编译DTBcd linux/5.15.y make ARCHarm CROSS_COMPILEarm-none-linux-gnueabihf- dtbs只编译设备树会比编译整个内核快得多。将新的.dtb文件复制到SD卡的boot分区替换旧文件即可。第四步调试在内核启动时可以通过串口查看设备树解析信息。更有效的调试是在系统启动后使用dtc设备树编译器工具反编译当前运行的设备树# 在开发板上执行 sudo apt install device-tree-compiler dtc -I fs /sys/firmware/devicetree/base -O dts -o current.dts这会将当前运行的设备树导出为文本格式方便你查看内核实际看到的是什么。4.2 内核驱动的添加与配置有时你需要为外接的硬件如特定的传感器、USB设备添加内核驱动支持。方案一将驱动编译为模块.ko文件这是最灵活的方式。在内核配置中将对应驱动选为M。make ARCHarm CROSS_COMPILEarm-none-linux-gnueabihf- menuconfig例如找到并启用Device Drivers - Input device support - Touchscreens - * Goodix I2C touchscreen假设你添加了一个Goodix触摸屏。保存配置后重新编译模块make ARCHarm CROSS_COMPILEarm-none-linux-gnueabihf- modules然后将新生成的.ko文件位于对应驱动目录复制到开发板根文件系统的/lib/modules/内核版本/kernel/相应位置运行depmod -a更新模块依赖最后用modprobe加载。方案二将驱动内置到内核镜像中在内核配置中选为*。这会使驱动代码直接编译进zImage无需手动加载模块但内核镜像会变大。适用于系统启动就必须的、或你不希望用户动态加载的驱动。注意事项在修改内核配置时一个常见的坑是“依赖关系”。启用某个驱动可能需要先启用其依赖的总线支持如I2C、SPI、框架支持或库。menuconfig界面通常会有提示但最稳妥的方法是在做出大量修改后使用make savedefconfig生成精简的配置并与原defconfig做对比或者直接使用仓库提供的已知可工作的配置作为基线。4.3 构建系统的整合与自动化对于需要频繁迭代的项目手动执行上述步骤是低效的。我们可以借鉴jaguarliuu/xunlong仓库中脚本的思路创建自己的自动化构建脚本。一个简化的build.sh脚本框架可能如下#!/bin/bash set -e # 遇到错误立即退出 # 配置变量 export ARCHarm export CROSS_COMPILEarm-none-linux-gnueabihf- KERNEL_SRC_DIRlinux/5.15.y UBOOT_SRC_DIRu-boot OUTPUT_DIRoutput BOARDorangepi_zero2 # 清理旧构建 # rm -rf ${OUTPUT_DIR} # 编译U-Boot echo 编译 U-Boot cd ${UBOOT_SRC_DIR} make ${BOARD}_defconfig make -j$(nproc) cp u-boot-sunxi-with-spl.bin ../${OUTPUT_DIR}/ cd .. # 编译Linux内核 echo 编译 Linux 内核 cd ${KERNEL_SRC_DIR} make ${BOARD}_defconfig # 可以在这里应用自定义补丁 # patch -p1 ../patches/my_custom.patch make -j$(nproc) zImage dtbs make -j$(nproc) modules mkdir -p ../${OUTPUT_DIR}/modules make INSTALL_MOD_PATH../${OUTPUT_DIR}/modules modules_install cp arch/arm/boot/zImage ../${OUTPUT_DIR}/ cp arch/arm/boot/dts/*.dtb ../${OUTPUT_DIR}/ # 或只复制特定板型的 cd .. echo 构建完成 echo 输出文件在 ${OUTPUT_DIR}/ 目录下这个脚本自动化了内核和U-Boot的编译过程。你可以进一步扩展它集成根文件系统打包、SD卡镜像生成等功能打造一条完整的CI/CD流水线。5. 常见问题排查与经验实录即便有了jaguarliuu/xunlong这样的资源库在实际操作中仍然会遇到各种问题。下面记录了一些典型问题及其排查思路。5.1 系统启动失败问题排查表现象可能原因排查步骤与解决方案上电后无任何输出串口无信息1. 电源问题电流不足。2. U-Boot未正确烧录或烧录位置错误。3. SD卡接触不良或损坏。4. 板子进入FEL模式启动介质无效。1. 使用5V/2A以上优质电源测量电压是否稳定。2. 确认dd命令的of参数是SD卡设备如/dev/sdb而不是分区如/dev/sdb1。3. 换一张SD卡或重新格式化烧录。4. 按住板子上的FEL按钮或短接测试点上电尝试用sunxi-fel工具连接若能连接说明BootROM正常是SD卡内容问题。U-Boot启动后卡住不加载内核1.boot.scr脚本错误或缺失。2. 内核镜像zImage或设备树.dtb文件路径/名称错误。3. boot分区FAT32损坏或未被识别。1. 在U-Boot命令行手动输入加载命令测试load mmc 0:1 0x46000000 zImage; load mmc 0:1 0x47000000 sun50i-h616-orangepi-zero2.dtb; bootz 0x46000000 - 0x47000000。2. 确认SD卡boot分区根目录下文件名称与命令一致区分大小写。3. 在U-Boot中用fatinfo mmc 0:1和fatls mmc 0:1检查分区和文件列表。内核panic无法挂载根文件系统1. 内核缺少根文件系统所在块设备如MMC、USB的驱动。2. 内核缺少根文件系统类型如ext4的支持。3. 内核命令行参数bootargs中的root指定错误。4. 根文件系统损坏或不完整。1. 检查内核配置确保启用了CONFIG_MMC_SUNXI(SD/MMC驱动) 和CONFIG_EXT4_FS。2. 查看内核启动打印确认识别到的MMC设备号如mmcblk0p2。3. 在U-Boot中设置正确的bootargs例如setenv bootargs root/dev/mmcblk0p2 rootwait consolettyS0,115200。4. 尝试重新制作根文件系统或用fsck检查文件系统。网络、Wi-Fi、音频等特定外设不工作1. 内核配置中未启用对应驱动。2. 设备树中未启用或错误配置该外设节点。3. 缺少必要的固件文件.bin。4. 硬件连接问题。1. 使用zcat /proc/config.gz查看运行内核的配置确认驱动是否编译y或m。2. 检查设备树源文件中对应外设的status是否为okay引脚复用pinctrl配置是否正确。3. 将所需固件如Wi-Fi芯片固件放入/lib/firmware/目录。4. 检查硬件连接如USB Wi-Fi dongle是否插好。5.2 内核编译与配置中的“坑”问题编译内核时出现“Recipe for target ‘xxx’ failed”错误。这通常是依赖缺失或环境问题。解决确保已安装所有必要的开发库。对于Ubuntu/Debian一个较全的安装命令是sudo apt install build-essential libncurses-dev libssl-dev bc flex bison libelf-dev。另外确认交叉编译工具链的版本与内核兼容太旧或太新的工具链都可能出问题。使用仓库推荐或社区验证过的工具链版本最稳妥。问题内核启动后某些模块无法加载modprobe失败。解决首先用dmesg \| tail查看内核日志通常会有具体的错误信息如“未找到符号”。这通常是因为模块依赖的内核版本与当前运行的内核版本不匹配。确保你安装的模块是由当前运行的内核源码树编译出来的。每次编译新内核后模块都需要重新编译和安装。使用uname -r确认运行内核版本并与lib/modules/下的目录名对比。问题自定义设备树修改后系统行为异常或无法启动。解决设备树语法严格一个拼写错误或格式错误就可能导致解析失败。使用dtc工具对你的.dts文件进行语法检查dtc -I dts -O dtb -o /dev/null your_file.dts。如果编译通过再检查逻辑。一个很好的调试方法是先在原版可工作的设备树上做最小的、一次只改一处的修改逐步验证。5.3 性能优化与稳定性调优建议内核参数调优在U-Boot的bootargs中可以添加一些参数提升体验。例如consoletty1可以启用HDMI输出如果支持swiotlb1024可能解决某些DMA内存问题cpufreq.default_governorperformance可以将CPU频率调控器设为性能模式耗电增加。文件系统优化对于SD卡在/etc/fstab中为根分区添加noatime,nodiratime挂载选项可以减少不必要的写操作延长SD卡寿命。对于eMMC版本可以考虑启用discard选项以支持TRIM。内存与交换分区Orange Pi Zero 2有512MB或1GB内存对于轻量级应用足够。但如果运行内存消耗大的服务可以创建一个交换文件sudo fallocate -l 512M /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile。并将其加入/etc/fstab实现开机启用。注意频繁交换会显著降低SD卡寿命。散热与功耗H616芯片在负载下会发热。如果板子没有散热片可以考虑添加一个。监控温度可以使用sudo apt install lm-sensors后运行sensors。对于需要长时间稳定运行的项目良好的散热是必须的。可以通过内核配置或cpufrequtils工具来限制最高频率以控制发热和功耗。通过系统性地利用jaguarliuu/xunlong这类资源仓库结合上述的实战步骤和问题排查经验你可以从一个嵌入式Linux的初学者快速成长为能够熟练定制、调试和优化Orange Pi系统的高手。这个仓库的价值就在于它为你铺平了最初也是最坎坷的那段路让你能把精力更多地集中在真正的应用开发上。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2551268.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!