根文件系统

根文件系统

  • 1 介绍
    • 1.1 根文件系统介绍
    • 1.2 根文件系统目录
    • 1.3 常见的根文件系统
  • 2 Buildroot 根文件系统的构建
    • 2.1 介绍
    • 2.2 依赖文件
    • 2.3 交叉编译工具
    • 2.4 构建
      • 2.4.1 配置 Target options
      • 2.4.2 配置 Toolchain
      • 2.4.3 配置 System configuration
      • 2.4.4 配置 Filesystem images
      • 2.4.5 关闭 kernel 和 uboot 的编译
      • 2.4.6 编译 Buildroot
    • 2.5 搭建 NFS 网络系统
    • 2.6 设置 u-boot 环境参数
  • 3 busybox 根文件系统的构建
    • 3.1 busybox 简介
    • 3.2 下载源码
    • 3.3 安装依赖
    • 3.4 构建 busybox
    • 3.5 配置 busybox
      • 3.5.1 修改 Makefie
      • 3.5.2 配置 menuconfig
      • 3.5.3 编译
  • 4 Ubuntu Base 构建根文件系统
    • 4.1 什么是 Ubuntu Base
    • 4.2 下载Ubuntu Base
    • 4.3 安装一些依赖文件
    • 4.4 配置根文件系统
    • 4.4 启动开发板
  • 5 Debian 根文件系统的构建
    • 5.1 安装依赖
    • 5.2 配置config_file
    • 5.3 下载与构建
    • 5.4 调试与烧写
  • 参考

1 介绍

1.1 根文件系统介绍

根文件系统首先是内核启动时所 mount 的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。相当于 windows 下的 C 盘,保存了系统启动后的应用程序和系统配置。

1.2 根文件系统目录

目录描述
/根目录,所有其他目录和文件的起点
/bin存放系统命令的二进制文件,如lscpcatchgrpchmodcplsshkillmountumountmkdir
/sbin存放系统管理命令的二进制文件,通常由root使用,系统命令还可以存放在/usr/sbin/usr/local/sbin 目录下,/sbin 目录中存放的是基本的系统命令,它们用于启动系统和修复系统等,与 /bin 目录相似,在挂接其他文件系统之前就可以使用 /sbin,所以/sbin 目录必须和根文件系统在同一个分区中。/sbin 目录下常用的命令有:shutdown、reboot、fdisk、fsck、init 等,本地用户自己安装的系统命令放在 /usr/local/sbin 目录下。
/etc系统配置文件存放的目录,例如人员的账号密码文件、各种服务的其实文件等。
/dev包含设备文件,例如硬盘、打印机等
/lib存放系统库文件,包括动态链接库、内核模块等
/proc虚拟文件系统,包含进程和内核信息,它没有实际的存储设备,里面的目录,文件都是由内核临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。
/var存放经常变化的文件,如日志文件
/tmp存放临时文件的目录
/usr用户相关的应用程序和文件,/usr 目录的内容可以存在另一个分区中,在系统启动后再挂接到根文件系统中的 /usr 目录下。里面存放的是共享、只读的程序和数据,这表明 /usr 目录下的内容可以在多个主机间共享,这些主要也符合 FHS 标准的。/usr 中的文件应该是只读的,其他主机相关的,可变的文件应该保存在其他目录下,比如 /var
/usr/bin用户使用的系统命令的二进制文件
/usr/sbin用户使用的系统管理命令的二进制文件
/usr/local存放本地安装的软件和文件
/home用户的个人目录,存放用户文件
/opt存放可选包的目录
/mnt临时挂载文件系统的挂载点,用来临时挂载光盘、移动存储设备等。
/boot存放启动加载程序和内核文件
/rootroot用户的主目录
/sys另一个虚拟文件系统,包含系统设备信息
/srv存放服务相关数据的目录
/lost+found文件系统损坏时,存放恢复文件的目录

对于嵌入式 Linux 系统的根文件系统来说,一般可能没有上面所列出的那么复杂,比如嵌入式系统通常都不是针对多用户的,所以 /home 这个目录在一般嵌入式 Linux 中可能就很少用到,而 /boot 这个目录则取决于你所使用的 BootLoader 是否能够重新获得内核映象从你的根文件系统在内核启动之前。一般说来,只有 /bin,/dev,/etc,/lib,/proc,/var,/usr 这些需要的,而其他都是可选的。

1.3 常见的根文件系统

根文件系统本质都是一些文件和配置信息组成,之间的界限没有很明确的界定,以下大致列出一些根文件系统的特点。
在这里插入图片描述

2 Buildroot 根文件系统的构建

2.1 介绍

Buildroot 是 Linux 平台上一个开源的嵌入式 Linux 系统自动构建框架。整个 Buildroot 是由 Makefile 脚本和 Kconfig 配置文件构成的。你可以和编译 Linux 内核一样,通过 buildroot 配置,menuconfig 修改,编译出一个完整的可以直接烧写到机器上运行的 Linux 系统软件。

2.2 依赖文件

sudo apt-get install zlib1g-dev unzip gcc g++ aptitude lib32stdc++6-4.8-dbg make build-essential libncurses5 libncurses5-dev u-boot-tools traceroute

2.3 交叉编译工具

可以到官网下载 https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/
arm-linux-gnueabihf/ 也可以使用我们提供的工具包 交叉编译器下载找一个自己熟悉的位置放置,
我放在 /home/lhf 文件夹下解压 tar -vxf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar

进入工具链文件夹 gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf 获取路径 pwd 我的路径为 /home/lhf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf 该路径需要记录一下,等会设置工具链的时候需要使用。

cd gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
pwd
/home/lhf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf

2.4 构建

我们可以到官网地址下:https://buildroot.org/ 打开后如图
选择 DOWNLOAD
在这里插入图片描述

我们选择长期支持版本 (LTS),两个压缩格式,选择其中一个即。

也可使用我们提供的源码包 Buildroot 下载构建根文件系统

tar -vxf buildroot-2021.02.3.tar.gz
cd buildroot-2021.02.3
make menuconfig

2.4.1 配置 Target options

Target options
    -> Target Architecture = ARM (little endian)
    -> Target Binary Format = ELF
    -> Target Architecture Variant = cortex-A7
    -> Target ABI = EABIhf
    -> Floating point strategy = NEON/VFPv4
    -> ARM instruction set = ARM

2.4.2 配置 Toolchain

Toolchain
    -> Toolchain type = External toolchain
    -> Toolchain = Custom toolchain //选择用户的交叉编译器
    -> Toolchain origin = Pre-installed toolchain
    -> Toolchain path =/home/lhf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf //这里填入我们上面获得的交叉编译器路径
    -> Toolchain prefix = arm-linux-gnueabihf //前缀
    -> External toolchain gcc version = 7.x
    -> External toolchain kernel headers series = 4.10.x
    -> External toolchain C library = glibc/eglibc
    -> [*] Toolchain has SSP support? (NEW) //选中
    -> [*] Toolchain has RPC support? (NEW) //选中
    -> [*] Toolchain has C++ support? //选中
    -> [*] Enable MMU support (NEW) //选中

2.4.3 配置 System configuration

System configuration
    -> System hostname = Embedfire_imx6ull //平台名字
    -> System banner = Welcome to embedfire i.mx6ull //欢迎语
    -> Init system = BusyBox //使用 busybox
    -> /dev management = Dynamic using devtmpfs + mdev //使用 mdev
    -> [*] Enable root login with password (NEW) //使能登录密码
    -> Root password = root //登录密码为 root

2.4.4 配置 Filesystem images

这个选项是配置将编译生成什么格式的根文件系统,可以做如下配置

-> Filesystem images
    -> [*] ext2/3/4 root filesystem //如果是 EMMC 或 SD 卡的话就用 ext3/ext4
        -> ext2/3/4 variant = ext4 //选择 ext4 格式
-> [*] ubi image containing an ubifs root filesystem //如果使用 NAND 的话就用 ubifs

对于本教程,我们需要配置也可以。我们是使用 nfs 挂载网络根文件系统

2.4.5 关闭 kernel 和 uboot 的编译

Buildroot 不仅能构建根文件系统,还可以编译 kernel 和 uboot,但是这些源码是从官网下载的,很可能是没包含各芯片厂商的驱动文件。所以我们关闭 kernel 和 uboot 编译即可,kernel 和 uboot 的教程可参考。

-> Kernel
-> [ ] Linux Kernel //取消 Linux Kernel 选项!
-> Bootloaders
-> [ ] U-Boot //取消 U-Boot 选项!

2.4.6 编译 Buildroot

sudo make

需要注意的是 buildroot 下载的源码网速会比较慢,我们可以自己手动下载再放到 buildroot 源码
目录下的 dl 文件夹中编译完成后文件在 ./output/images 文件夹中 rootfs.tar 为本教程需要的文件。

2.5 搭建 NFS 网络系统

sudo apt-get updat

# 安装 NFS 服务器端 sudo apt-get install nfs-kernel-server
sudo apt-get install nfs-kernel-server

# 创建 NFS 共享目录 mkidr ~/nfs
mkidr ~/nfs

# 编辑指定目录 sudo vim /etc/exports
sudo vim /etc/exports

# 添加入下代码 /home/你的用户名/nfs *(rw,sync,no_root_squash)
/home/你的用户名/nfs *(rw,sync,no_root_squash)

# 给目录添加权限 sudo chmod -R 777 ~/nfs && sudo chown root:root ~/nfs/ -R
sudo chmod -R 777 ~/nfs && sudo chown root:root ~/nfs/ -R

# 启动 NFS 服务 /etc/init.d/nfs-kernel-server restart
/etc/init.d/nfs-kernel-server restart

# 我们把刚得到的 rootfs.tar 解压到 nfs 目录下
cp /home/lhf/buildroot-2021.02.3/output/images/rootfs.tar /home/lhf/nfs
tar -vxf /home/lhf/nfs/rootfs.tar -C /home/lhf/nfs

先看一下我们 NFS 主机的地址 ifconfig 我这里地址为 192.168.0.139

再看一下网关地址 traceroute baidu.com 第一条地址一般为网关地址, 我这里为 192.168.0.1

我们在局域网中找一个没有用到的地址,我这里为 192.168.0.142 要根据你们的网段来更
改。

2.6 设置 u-boot 环境参数

上电快速按回车进入 u-boot

setenv gatewayip '192.168.0.1'
setenv netmask '255.255.255.0'
setenv ipaddr '192.168.0.142'
setenv serverip '192.168.0.139'
setenv args_mmc_old 'setenv bootargs console=tty1 console=ttymxc0,115200,root=/dev/nfs nfsroot=192.168.0.139:/home/lhf/nfs rw ip=192.168.0.142:192.
,168.0.139:192.168.0.254:255.255.255.0::eth0:off'
saveenv

我们试一下开发板能否 ping 通到主机 ping 192.168.0.139

发现可以 ping 的通,我们试试能否自动挂载上我们的根文件系统用命令 reset 重启
在这里插入图片描述

这样就成功挂载上我们的根文件系统了。账号密码都为 root
我们发现我们的命令行在任何目录下都是 # 修改 /etc/profile 文件来让其显示具体路径

vi /etc/profile


# 导出PATH环境变量,包含基本的系统命令路径
export PATH="/bin:/sbin:/usr/bin:/usr/sbin"

PS1='\u@\h:\w$:'
export PS1

# 设置默认的文本编辑器为vi
export EDITOR='/bin/vi'

# 注释掉的行,不会执行
# Source configuration files from /etc/profile.d

# 以下是一个for循环,用于加载/etc/profile.d目录下的所有.sh脚本文件
for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        . "$i"
    fi
done

# 取消设置的变量
unset i

然后重启即可, reboot

3 busybox 根文件系统的构建

3.1 busybox 简介

BusyBox 是一个集成了三百多个最常用 Linux 命令和工具的软件。BusyBox 包含了一些简单的工具,例如 ls、cat 和 echo 等等,还包含了一些更大、更复杂的工具,例 grep、find、mount 以及 telnet。

有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说 BusyBox 就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Linux 系统的自带的 shell。

3.2 下载源码

https://busybox.net/ 可以到官网下载

下载当前最新版本 busybox-1.33.1.tar.bz2 也可以使用我们提供的文件
busybox-1.33.1.tar.bz2

3.3 安装依赖

sudo apt-get install zlib1g-dev unzip gcc g++ aptitude lib32stdc++6-4.8-dbg make build-essential libncurses5 libncurses5-dev u-boot-tools traceroute sudo gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y

3.4 构建 busybox

将 busybox-1.33.1.tar.bz2 放置到一个你熟悉的目录,我这里选择为 /home/lhf 解压 busybox1.33.1.tar.bz2

tar -vxf busybox-1.33.1.tar.bz2
cd busybox-1.33.1
make menuconfig

3.5 配置 busybox

3.5.1 修改 Makefie

在第 164 行,将 CROSS_COMPILE ?= 修改为 CROSS_COMPILE :=arm-linux-gnueabihf- 注意:arm-linux-gnueabihf- 为你交叉编译器前缀,若编译其他 soc 请使用官方提供的交叉编译工具

#CROSS_COMPILE ?=
CROSS_COMPILE :=arm-linux-gnueabihf

3.5.2 配置 menuconfig

执行 make menuconfig

make menuconfig
Settings
   -> Build static binary (no shared libs) //选中静态编译,便于调用的文件不会因为库文件的更改和报错
Linux System Utilities
    ->mdev //支持 mdev

3.5.3 编译

make
make install

默认生成在 busybox 目录下的 _install 文件夹中我们进入到 _install 目录进行一些修改

cd _install
mkdir dev etc lib var proc tmp home root mnt sys
cd ./dev
sudo mknod console c 5 1
sudo mknod null c 1 3
cd ../etc
vi inittab

在 inittab 中添加一句

console::askfirst:-/bin/sh

:wq 保存退出

将 _install 目录下的文件拷贝到我们的 nfs 中进行测试注意: ./目录是 _install 目录 /home/lhf/nfs 是你的 nfs 网络文件系统根目录,若未搭建 nfs 网络文件系统,请参考 6.5 小节 搭建 NFS 网络系统

cd ../ # 从 etc 目录回到_install 目录
cp -rf ./* /home/lhf/nfs

重启开发板等开发板启动成功后我们进入了我们编译好的 busybox 根文件系统我们看看根文件系统整体大小为 du -sh

仅占 1.5M,虽然占用空间是小了,但是功能也非常少,若要安装某项功能还需自行交叉编译到文件系统。仅适合对存储比较敏感且只需完成某一项功能的系统使用。如果想使用较全的功能对存储不敏感的用户可以使用 debain 根文件系统。

4 Ubuntu Base 构建根文件系统

4.1 什么是 Ubuntu Base

Ubuntu 针对不同的 CPU 架构提供相应的 ubuntu base 根文件系统,目前提供的架构有 amd64、arm64、armhf、i386、s390x、ppc64.

4.2 下载Ubuntu Base

我们可到官网下载自己需要的版本 http://cdimage.ubuntu.com/ubuntu-base/releases/ 目前最新版本到 21.04。

也可以使用我们提供的 20.04 版本 ubuntu-base-20.04.1-base-armhf.tar.gz
不使用最新版本是因为国内对于 ubuntu-arm 的镜像站比较少,目前阿里云所支持的最新版本ubuntu 镜像为 20.04,等支持 21.04 版本后大家可以构建 ubuntu 21.04,我这里就以 20.04 版本举例说明构建方法。

4.3 安装一些依赖文件

sudo apt-get install tar qemu-user-static vim -y

4.4 配置根文件系统

我们创建一个文件夹 ubuntu_rootfs 存放我们的根文件系统

mkdir ubuntu_rootfs && cd ubuntu_rootfs
tar -vxf ubuntu-base-20.04.1-base-armhf.tar.gz
sudo cp /usr/bin/qemu-arm-static ./usr/bin/
sudo cp ./etc/apt/sources.list ./etc/apt/sources.list.back
sudo echo "nameserver 8.8.8.8" > ./etc/resolv.conf
sudo vim ./etc/apt/sources.list

阿里云镜像站 我们需要注意的是,这个站点默认提供的是 amd64 的 ubuntu 镜像,所以我们需要在 ubuntu 后面加上-ports, 如下所示如果是 ubuntu 20.04 版本则可以将如下链接填入 ./etc/apt/sources.list 中

deb http://mirrors.aliyun.com/ubuntu-ports/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-backports main restricted universe multiverse

保存退出

sudo chroot ./
apt install vim sudo kmod net-tools ethtool ifupdown language-pack-en-base rsyslog htop iputils-ping -y //添加一些需要的应用
passwd root //设置 root 的密码
exit

现在我们可以把该目录放置到我们的 NFS 中试试能否启动,/home/lhf/nfs 是你的 nfs 网络文件系统根目录,若未搭建 nfs 网络文件系统,请参考参考 6.5 小节 搭建 NFS 网络系统

sudo cp -rf ./* /home/lhf/nfs

4.4 启动开发板

su root

成功启动了我们的 ubuntu 根文件系统,往后可以通过 apt 进行应用的安装。

5 Debian 根文件系统的构建

我们这里使用目前 Debian 社区较为推荐的 Multistrap 构建 Debian 根文件系统,与传统的 debootstrap 不同,multistrap 在包的选择上更具灵活性 Multistrap 的详细信息可以看 https://manpages.debian.org/bullseye/multistrap/multistrap.1.en.html

5.1 安装依赖

sudo apt-get install tar qemu-user-static vim multistrap -y

5.2 配置config_file

我们创建一个文件 config_file 存放我们需要安装的包信息

touch ./config_file
mkdir ./rootfs

vim ./config_file

填入如下内容

  [General]
  #directory=target-rootfs
  cleanup=true
  noauth=true
  unpack=true
  debootstrap=Debian Net Utils Ebf
  aptsources=Debian
  noauth=true # GPG error

  [Debian]
  packages=apt kmod lsof
  #source=https://mirrors.sjtug.sjtu.edu.cn/debian/
  source=https://mirrors.tuna.tsinghua.edu.cn/debian/
  keyring=debian-archive-keyring
  suite=buster
  components=main contrib non-free

  [Net]
  # Basic packages to enable the networking
  packages=netbase net-tools ethtool udev iproute2 iputils-ping ifupdown isc-dhcp-client ssh
  #source=https://mirrors.sjtug.sjtu.edu.cn/debian/
  source=https://mirrors.tuna.tsinghua.edu.cn/debian/

  [Utils]
  # General purpose utilities
  packages=locales vim adduser less wget dialog usbutils
  #source=https://mirrors.sjtug.sjtu.edu.cn/debian/
  source=https://mirrors.tuna.tsinghua.edu.cn/debian/

  [Lhf]
  packages=python3 mate-desktop-environment
  source=http://mirrors.bfsu.edu.cn/debian
  suite=buster
  components=main contrib non-free

  [Ebf]
  packages= ifupdown rsyslog htop iputils-ping
  source=http://mirrors.bfsu.edu.cn/debian
  suite=buster
  components=main

其中之需要将需要的安装包添加到 [Ebf] 中的 packages 即可

5.3 下载与构建

然后执行 multistrap -a armhf -d ./rootfs/ -f ./config_file

multistrap -a armhf -d ./rootfs/ -f ./config_file

等待配置完成后执行如下代码配置密码

cd ./rootfs
sudo cp /usr/bin/qemu-arm-static ./usr/bin/
sudo echo "nameserver 8.8.8.8"  > ./etc/resolv.conf
sudo chroot ./
passwd root //设置root的密码
exit

5.4 调试与烧写

现在我们可以把该目录放置到我们的NFS中试试能否启动,/home/lhf/nfs是你的nfs网络文件系统根目录,若未搭建nfs网络文件系统,请参考 Buildroot根文件系统的构建章节的第5小节 搭建NFS网络系统

如果要烧写到开发板中,参考 根文件系统的几种烧写方法

参考

1、野火–构建系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/751947.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务知识

传统架构 传统架构会出现的问题 配置烦琐,上线容易出错 加机器要重启 负载均衡单点 管理困难 CAP原则。 CAP原则是指在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partition Toleranc…

产品中心|高效能双处理器Xilinx FPGA 4通道射频收发板卡

1、产品概述 基于Xilinx XC7K325T芯片的4通道射频收发板卡,搭载高能效Cortex-A8内核处理器、1组16bit/2GB DDR3及1组4GB DDR3、 1组2GB Nand Flash、1路USB接口、4路高速ADC、4路高速DAC,支持外触发,外时钟。用于FPGA程序加载板卡工作温度范…

Zynq7000系列FPGA中的DMA控制器简介(一)

DMA控制器(DMAC)使用64位AXI主接口来执行与系统存储器和PL外围设备之间的DMA数据传输,操作频率同CPU_2x的时钟速率。传输由DMA指令执行引擎控制。DMA引擎运行在一个小指令集上,该指令集提供了一种灵活的指定DMA传输的方法。这种方…

激光雷达数据处理

激光雷达技术以其高精度、高效率的特点,已经成为地表特征获取、地形建模、环境监测等领域的重要工具。掌握激光雷达数据处理技能,不仅可以提升工作效率,还能够有效提高数据的质量和准确性,为决策提供可靠的数据支持。 第一章、激…

STM32_hal库学习(3)-OLED显示

硬件:stm32f103c8t6,四脚oled 四脚OLED用的是iic通讯协议,什么是IIC通讯协议?具体可看这篇文章。 stm32中IIC通讯协议-CSDN博客 既然了解了iic协议,接下来我们就利用stm32cubemx来配置oled。 1.新建一个工程 2.然…

愁煞了,UI设计师是闷葫芦,会干不会说,该咋办呢?

Hi,我是大千UI工场,经常有粉丝反映做好设计,不知道咋给客户和团队小伙伴阐述,传达设计里面,换言之就是设计师有必要提升表达能力,该如何提升。 UI设计师需要提升语言表达能力的原因有以下几点:…

科技赋能·创领未来丨智合同和百胜中国就Contract AI Studio项目达成合作

#智合同 #百胜中国 #AIGC #NLP #LLM #Contract AI Studio 近期,国内AIGC和LLM大语言模型发展可谓是如火如荼,其迅速崛起为社会和产业发展起到了非常重要的作用。人们利用AI技术(AIGC、LLM大语言模型、NLP等)将其赋能到企业生…

<sa8650>QCX ISP Tuning 使用详解 — Tuning前置条件

<sa8650>QCX ISP Tuning 使用详解 — Tuning前置条件 一 如何安装 Qualcomm Chromatix™ 摄像头校准工具二 如何使用 Qualcomm Chromatix™ tuning工具创建tuning项目2.1 创建工程前提依赖2.2 创建工程2.3 添加场景2.4 编辑区域触发器三 如何创建Tuning 树一 如何安装 Qualco…

ChatGPT国内中文版镜像网站整理(2024/6/25)

一、国内外模型大对比 1.交互式对话测评 用同样一个问题问文言一心3.5模型和ChatGPT3.5模型,以下是得到的两个结果: 文言一心3.5模型的回答 文言一心的这个回答显然非常愚蠢,虽然回答了很长一段话,但是“一斤土豆的重量和土豆的…

详细分析SpringBootTest中的测试类(附Demo)

目录 前言1. 基本知识2. Demo3. 实战3.1 项目测试3.2 功能测试 前言 书写测试类,一般只需要加入Test即可,但是结合Springboot项目来整体测试对应需要怎么下手 详细的Java知识点推荐阅读:java框架 零基础从入门到精通的学习路线 附开源项目面…

26、 MySQL数据库基础练习系列股票交易系统基础查询和复杂查询

5、基础查询 -- 1、查询用户信息仅显示姓名与手机号 SELECT username as 姓名,phone as 手机号 from users;-- 2、模糊查询和explain语句 alter table stocks add index stock_name_index(stock_name); explain SELECT * from stocks where stock_name like %东吴证券%; -- 3、…

提升自来水公司经济效益的策略研究

现阶段,如何提高自来水公司经济效益的问题已经得到社会的广泛关注。文章将立足于成本管理的角度,在对自来水公司生产现状分析的基础上,总结影响自来水公司经济效益的相关因素,最后从成本管理的角度出发,对如何提高自来…

企业级Windows设备日志采集工具

永久免费: 前往Gitee最新版本 更新内容 进一步提升工程师部署采集客户端效率. 打开根Url,自动跳转到部署页面.(原工程师需输入很长的Url);新增复制同类客户端同步任务功能.优化客户端分组操作;文件同步到服务器后,可配置文件名增加时间戳; 介绍 定时全量或增量采集工控机,…

字节码编程ASM之两数之和

写在前面 源码 。 看下如何使用ASM来写如下的类: package com.dahuyou.demo.asm;public class AsmSumOfTwo {public AsmSumOfTwo() {}public static void main(String[] var0) {int var1 (new AsmSumOfTwo()).sum(1, 2);System.out.println(var1);}public int su…

C++精解【8】

文章目录 运算,- 加减法* / 乘除法逐元 乘法逐元 除法逐元综合运算矩阵乘法与加减法 转置、共轭、伴随矩阵点乘法,叉积 运算 ,- 加减法 逐元加减法 #include <iostream> #include "e:/eigen/Eigen/Dense" using namespace std;int main() {Eigen::Matrix2d …

【源码】Spring Data JPA原理解析之Auditing执行原理

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…

vue + Lodop 制作可视化设计页面 实现打印设计功能(二)

历史&#xff1a; vue2 Lodop 制作可视化设计页面 实现打印设计功能&#xff08;一&#xff09; 前言&#xff1a; 之前本来打算用直接拿之前做的vue2版本改改就发的&#xff0c;但考虑到现在主流都是vue3了&#xff0c;所以从这篇文章开始使用vue3来写&#xff0c;以及最后…

Spring相关面试题(三)

29 如何在所有的BeanDefinition注册完成后&#xff0c;进行扩展 Bean工厂的后置处理器&#xff0c;在所有的Bean注册完成后&#xff0c;就被执行。 public class A implements BeanFactoryPostProcessor {private String name "a class";private B b; ​public St…

项目分层--简单图书管理系统

分层情况 实体类Book代码 //实体类 public class Book {private int id;private String name;private int bsum;public Book() {}public Book(int id, String name, int bsum) {this.id id;this.name name;this.bsum bsum;}public int getId() {return id;}public void set…

2024上海初中生古诗文大会倒计时4个多月:真题示例和独家解析

现在距离2024年初中生古诗文大会还有4个多月时间&#xff0c;我们继续来看10道选择题真题和详细解析&#xff0c;以下题目截取自我独家制作的在线真题集&#xff0c;都是来自于历届真题&#xff0c;去重、合并后&#xff0c;每道题都有参考答案和解析。 为帮助孩子自测和练习&…