📘编译 openwrt 官方源码时QA.
2023-7-3
| 2023-7-16
0  |  0 分钟
type
status
date
Jul 3, 2023 01:13 PM
slug
summary
tags
category
icon
password
 
 
F
You

kernel 和 kernel module 的区别

ChatGPT
ChatGPT
内核(Kernel)和内核模块(Kernel Module)都是操作系统的重要组成部分,但它们在功能和使用方式上有所不同。
内核是操作系统的核心部分,它直接与硬件进行交互,管理硬件资源,同时为上层应用提供统一的服务接口。内核在系统启动时载入,并在系统运行期间一直保持在内存中。
内核模块是一种特殊的可执行文件,它可以在系统运行时动态地加载到内核或从内核中卸载。内核模块的设计使得内核可以在不重启的情况下增加新功能或移除不再需要的功能。例如,当你添加一个新的硬件设备时,相应的驱动程序(通常作为一个内核模块)可以被加载到内核中,使得内核能够支持这个新设备。当设备不再需要时,驱动程序可以从内核中卸载,以节省系统资源。
内核模块可以按需加载和卸载,使得内核具有更好的灵活性和扩展性。然而,每个内核模块也必须与内核的版本和配置高度匹配,否则可能会导致兼容性问题。
F
You

解释 world 含义 `make -j $(nproc) download world `

ChatGPT
ChatGPT
在OpenWrt等Linux发行版的构建系统中,make world命令通常用于构建整个系统镜像。world指的是所有的目标任务,包括工具链(编译器、链接器等)、内核、所有的软件包等。
命令make -j $(nproc) download world的各个部分的含义如下:
  • make:这是一个构建工具,用于根据Makefile中的规则构建目标文件。在这里,它用于启动OpenWrt的构建过程。
  • j $(nproc):这告诉make同时启动多个构建任务。$(nproc)是一个Shell命令,它返回当前系统的CPU核心数。所以,j $(nproc)表示同时启动的构建任务数应与CPU核心数相等,以充分利用系统的多核资源。
  • download:这是一个特殊的目标任务,它使得make先下载所有需要的源码文件,然后再进行构建。这对于网络环境不稳定的情况非常有用,可以先一次性下载所有源码,然后离线构建。
  • world:这是一个目标任务,它代表构建整个系统。
所以,make -j $(nproc) download world命令的整体意思是:在多核并行的条件下,先下载所有需要的源码文件,然后构建整个OpenWrt系统。
F
You

make kernel_menuconfig这段话想说明什么

"Note that make kernel_menuconfig modifies the Kernel configuration templates of the build tree and clearing the build_dir will not revert them. :!: Also you won't be able to install kernel packages from the official repositories when you make changes here."
ChatGPT
ChatGPT
这段话主要在提醒两点:
  1. make kernel_menuconfig 命令用于修改内核配置模板,这些更改将对构建树产生持久性影响。即使你清理了 build_dir(构建目录),这些更改也不会被还原。因此,如果你做了一些测试或实验性的修改,需要记住这些更改,以便在必要时手动恢复。
  1. 当你使用 make kernel_menuconfig 修改内核配置后,你将无法从官方仓库安装内核相关的软件包。这是因为这些软件包可能需要与内核配置紧密匹配的特性或模块,如果你的内核配置发生改变,可能会导致这些软件包无法正常工作。
这段警告主要是为了让用户了解,修改内核配置是一个重大的操作,可能会影响到整个系统的稳定性和兼容性,因此在进行此类操作时需要格外小心。
F
You

解释这段脚本

`# Configure the firmware image and the kernel make menuconfig make -j$(nproc) kernel_menuconfig # Build the firmware image make -j$(nproc) defconfig download clean world`
ChatGPT
ChatGPT
这段脚本是用于配置和构建固件镜像的。具体来说:
  1. make menuconfig:这个命令用于启动图形化的配置界面,用户可以在这个界面中选择需要编译进固件的软件包。
  1. make -j$(nproc) kernel_menuconfig:这个命令用于配置内核。和make menuconfig类似,它也会启动一个图形化的配置界面,但这个界面是用于配置内核选项的。j$(nproc)表示在配置过程中允许同时运行的任务数等于CPU核心数。
  1. make -j$(nproc) defconfig:这个命令用于根据.config文件生成最终的配置。.config文件在前两步中生成,其中包含了用户选择的所有配置选项。j$(nproc)表示在配置过程中允许同时运行的任务数等于CPU核心数。
  1. make -j$(nproc) download:这个命令用于下载所有需要的源代码。这一步是为了确保在构建过程中不会因为网络问题而出错。
  1. make -j$(nproc) clean:这个命令用于清理所有之前编译生成的文件,以确保接下来的构建过程是从干净的状态开始的。
  1. make -j$(nproc) world:这个命令用于开始构建固件镜像。j$(nproc)表示在构建过程中允许同时运行的任务数等于CPU核心数。
在整个脚本中,$(nproc)是一个Shell命令,它返回当前系统的CPU核心数,用于充分利用系统的多核资源。
F
You

make defconfig 的输入输出是什么

ChatGPT
ChatGPT
make defconfig 是用于生成默认配置文件的命令,在许多开源项目(例如 Linux 内核、OpenWrt 等)中被广泛使用。
输入:这个命令通常不需要用户的直接输入,而是依赖于源代码中包含的一个名为 defconfig 的文件,这个文件通常位于源代码的特定目录中(例如,在 Linux 内核源代码中,每个硬件平台目录下通常都有一个 defconfig 文件)。defconfig 文件中包含了一套默认的配置选项。
输出:执行 make defconfig 后,它会生成一个名为 .config 的文件。这个文件包含了整个项目的配置,包括要编译哪些模块、要支持哪些硬件等。这个 .config 文件会被后续的构建过程(例如 make 命令)所使用,用于确定要编译的目标和编译参数。
注意,尽管 make defconfig 会生成默认的配置,但用户通常还需要使用 make menuconfig 或其他配置工具对其进行定制,以满足特定的需求。
F
You

解释这段话, diffconfig 的使用, 感觉很方便

```These changes can form the basis of a config file <buildroot>/.config. By running make defconfig these changes will be expanded into a full config. # Write changes to .config cp diffconfig .config # Expand to full config make defconfig```
ChatGPT
ChatGPT
这段话是说明如何从一个包含修改部分的配置文件(diffconfig)生成一个完整的配置文件(.config)。
这里的过程是:
  1. cp diffconfig .config:首先,将包含你的修改(diffconfig)复制为.config文件。diffconfig通常只包含你相对于默认配置的改动。
  1. make defconfig:然后,使用make defconfig命令,根据源代码中的默认配置(defconfig),将你的.config文件中的配置项展开为完整的配置。换句话说,这个命令将会把所有你没有在diffconfig中指定的配置项,都设置为默认值。
总的来说,这段话的含义是:如果你有一些相对于默认配置的改动(diffconfig),你可以首先将这些改动复制到.config文件中,然后使用make defconfig命令生成一个完整的配置文件,这个配置文件包含了你的所有改动,以及所有其他的默认配置项。
F
You

make defconfig 到底是产生一个默认配置还是包含.config 中改动的配置呢

ChatGPT
ChatGPT
make defconfig 的行为会因不同的项目和上下文而有所不同,但通常来说,它的主要目的是生成一个默认配置文件,这个默认配置通常基于项目中的 defconfig 文件。
然而,如果在当前目录下已经存在一个 .config 文件,make defconfig 在一些项目中可能会保留这个 .config 文件中的一些设置,而在其他一些项目中则可能会忽略这个 .config 文件,并生成一个全新的基于 defconfig 的配置文件。这主要取决于具体项目的 Makefile 如何实现 defconfig 目标。
在你提供的这段脚本中,首先通过 cp diffconfig .config 创建了一个 .config 文件,然后运行 make defconfig。在这种上下文中,看起来 make defconfig 的行为是将 .config 文件中的配置展开为完整的配置,而不是完全忽略 .config 文件并生成一个新的默认配置。
总的来说,make defconfig 的确切行为取决于具体的项目和上下文,因此如果有疑问,最好查阅相关项目的文档或源代码。
F
You

`make world` 和 `make `区别

ChatGPT
ChatGPT
在许多 Makefile 中,"world" 是一个特殊的目标,它代表了一系列的构建任务,通常是全面的构建过程,包括清理(clean)、配置(config)、编译(compile)和安装(install)等步骤。使用 make world 通常会进行一次完整的构建。
make 命令,如果不指定目标,默认会尝试构建 Makefile 文件中定义的第一个目标。这个默认目标可能是任何任务,具体取决于 Makefile 的内容。在某些情况下,makemake world 可能有相同的效果,但这并非在所有的 Makefile 中都适用。
具体区别需要看具体的 Makefile 文件定义,有些项目的 Makefile 可能没有定义 "world" 这个目标,而有些可能定义了。例如,在某些项目中,make 可能只进行编译,而不包括配置或安装等步骤。
总的来说,makemake world 的区别主要取决于具体的 Makefile 定义,你需要查看具体项目的文档或者 Makefile 来确定。
F
You

那在 openwrt 中,`make world` 和 `make `有区别吗

ChatGPT
ChatGPT
在 OpenWrt 的构建系统中,makemake world 实际上是一样的。"world" 是 OpenWrt 的顶层目标,这意味着运行 makemake world 会触发完整的编译过程。
这个过程包括各种阶段,比如下载源代码、解压源代码、准备编译环境、编译工具链、编译内核、编译软件包、创建文件系统映像等。
总的来说,对于 OpenWrt,makemake world 是等效的。
 

各种文件格式的区别

文件格式区别 固件文件名中带有 ext4 字样的文件为搭载 ext4 文件系统固件,ext4 格式的固件更适合熟悉 Linux 系统的用户使用,在 Linux 下可以比较方便地调整 ext4 分区的大小;
固件文件名中带有 squashfs 字样的文件为搭载 squashfs 文件系统固件,而 squashfs 格式的固件适用于 “不折腾” 的用户,其优点是可以比较方便地进行系统还原,哪怕你一不小心玩坏固件,只要还能进入控制面板或 SSH,就可以很方便地进行 “系统还原操作”。
固件文件名中带有 factory 字样的文件为全新安装 OpenWrt 所用的固件,推荐在全新安装 OpenWrt 时解压 gz 文件刷入 SD 卡或硬盘。
固件文件名中带有 sysupgrade 字样的文件为升级 OpenWrt 所用的固件,无需解压 gz 文件,可直接在 Luci 面板中升级。
 
技术折腾
  • openwrt
  • 操作系统
  • 折腾
  • WARNING: Makefile 'package/luci-app-openclash/luci-app-openclash/Makefile' has a dependency on 'kmod-inet-diag', which does not existlinux 修改用户主目录的方法_珠一的技术博客_51CTO 博客
    目录