构建嵌入式Linux rootfs根文件系统
创建根文件系统涉及选择系统运行所需的文件。在本节中,我们将介绍如何构建压缩的根文件系统。不太常见的选择是在直接作为 root 挂载的本地驱动器上构建未压缩的文件系统。
转载请注明来源,谢谢。构建嵌入式Linux rootfs根文件系统-CSDN博客创建根文件系统涉及选择系统运行所需的文件。在本节中,我们将介绍如何构建压缩的根文件系统。不太常见的选择是在直接作为 root 挂载的本地驱动器上构建未压缩的文件系统。概述根文件系统必须包含支持完整 Linux 系统所需的一切。我们描述了如何构建一个压缩文件系统,之所以这样称呼,是因为它是在磁盘上压缩的,并且在引导时被解压缩到虚拟硬盘上。使用压缩文件系统,您可以将许多文件(大约 6 兆字节)放入标准 RAW 文件上。由于文件系统比FLASH大得多,因此无法在FLASH上构建。https://blog.csdn.net/caoshiying/article/details/133918481
概述
根文件系统必须包含支持完整 Linux 系统所需的一切。为了能够执行此操作,磁盘必须包含 Linux 系统的最低要求:
- 基本文件系统结构
- 最小目录集: /dev 、 /proc 、 /bin /etc /lib /usr /tmp
- 基本的实用程序集: sh 、 ls cp mv 、等
- 最小配置文件集: rc, inittab, fstab 等
- 设备: /dev/hd*, /dev/tty*, /dev/fd0 等
- 运行时库,用于提供实用程序使用的基本功能。
当然,任何系统只有在您可以在其上运行某些内容时才有用,而根ROM通常只有在您可以执行以下操作时才有用:
- 检查另一个驱动器上的文件系统,例如,要检查硬盘驱动器上的根文件系统,您需要能够从另一个驱动器启动 Linux,就像使用根FLASH系统一样。然后,您可以在未挂载的原始根驱动器上运行fsck。
- 使用归档和压缩实用程序(如 cpio 、 tar gzip 和 ftape )从备份恢复全部或部分原始根驱动器。
我们描述了如何构建一个压缩文件系统,之所以这样称呼,是因为它是在磁盘上压缩的,并且在引导时被解压缩到虚拟硬盘上。使用压缩文件系统,您可以将许多文件(大约 6 兆字节)放入标准 RAW 文件上。由于文件系统比FLASH大得多,因此无法在FLASH上构建。我们必须在其他地方构建它,压缩它,然后将其复制到驱动器上。
创建文件系统
为了构建这样的根文件系统,您需要一个足够大的备用设备(硬盘不报警一般都可以),以便在压缩之前容纳所有文件。您将需要一个能够容纳大约4MB的设备。有几种选择:
- 使用虚拟硬盘 (设备 = /dev/ram0 )。在这种情况下,内存用于模拟磁盘驱动器。虚拟硬盘必须足够大,以容纳适当大小的文件系统。如果您使用 LILO,请检查配置文件 ( /etc/lilo.conf ) 中的一行, RAMDISK = nnn 该行决定了可以分配给虚拟硬盘的最大 RAM。默认值为 4096K,这应该足够了。您可能不应该尝试在 RAM 小于 8MB 的机器上使用这样的虚拟硬盘。检查以确保您拥有类似 /dev/ram0, /dev/ram 或 /dev/ramdisk 的设备。如果没有,请使用 mknod(大号 1,小号 0)创建 /dev/ram0 。
- 如果您有足够大(几兆字节)的未使用硬盘分区,这是可以接受的。
- 使用环回设备,它允许将磁盘文件视为设备。使用环回设备,您可以在硬盘上创建一个三兆字节的文件,并在其上构建文件系统。
- 键入 man losetup 以获取有关使用环回设备的说明。如果您没有 losetup,则可以将其与兼容版本的挂载一起获取,并从目录中 ftp://ftp.win.tue.nl/pub/linux/utils/util-linux/ 的 util-linux 包中卸载。
- 如果您的系统上没有循环设备( /dev/loop0 , /dev/loop1 等),则必须使用 ''mknod /dev/loop0 b 7 0'' 创建一个。安装这些特殊的挂载和卸载二进制文件后,在具有足够容量的硬盘上创建一个临时文件(例如, /tmp/fsfile )。您可以使用如下命令:dd if=/dev/zero of=/tmp/fsfile bs=1k count=nnn。以创建 nnn -block 文件。
- 使用文件名代替下面的设备。发出挂载命令时,必须包括指示挂载使用环回设备的选项 -o loop 。
选择这些选项之一后,使用以下命令准备设备:
dd if=/dev/zero of=DEVICE bs=1k count=4096
此命令将设备清零。将设备归零至关重要,因为文件系统稍后将被压缩,因此所有未使用的部分都应用零填充以实现最大压缩。每当移动或删除文件系统上的文件时,请记住这一点。文件系统将正确地取消分配块,但它不会再次将它们清零。如果您执行大量删除和复制操作,则压缩的文件系统最终可能会比必要的大得多。
接下来,创建文件系统。Linux 内核可识别两种文件系统类型,以便根磁盘自动复制到虚拟硬盘。这些是minix和ext2,其中ext2是首选。如果使用 ext2,您可能会发现使用该 -N 选项指定比默认值更多的索引节点很有用; -N 2000 建议这样做,这样您就不会用完索引节点。或者,您可以通过删除大量不必要的 /dev 文件来节省索引节点。默认情况下,mke2fs 将在 16Mb FLASH上创建 360 个索引节点。我发现 120 个 inode 在我当前的救援根ROM上就足够了,但如果将所有设备都包括在内 /dev ,则很容易超过 360 个。使用压缩的根文件系统允许更大的文件系统,因此默认情况下允许更多的索引节点,但您可能仍然需要减少文件数或增加索引节点数。因此,您使用的命令将如下所示:
mke2fs -m 0 -N 2000 DEVICE
如果您使用的是环回设备,则应提供您正在使用的磁盘文件来代替此设备。mke2fs 命令将自动检测可用空间并相应地进行配置。“-m 0” 参数可防止它为 root 保留空间,从而在磁盘上提供更多可用空间。接下来,挂载设备:
mount -t ext2 DEVICE /mnt
如果挂载点尚不存在,则必须创建挂载点 /mnt 。在其余部分中,假定所有目标目录名称都相对于 /mnt 。
填充文件系统文件到ROM
以下是根文件系统 [1] 的一组合理的最小目录集:
- /dev -- 执行 I/O 所需的设备文件
- /proc -- proc 文件系统所需的目录存根
- /etc -- 系统配置文件
- /sbin -- 关键系统二进制文件
- /bin -- 基本二进制文件被视为系统的一部分
- /mnt -- 用于在其他磁盘上进行维护的挂载点
- /usr -- 其他实用程序和应用程序
其中三个目录在根文件系统上为空,因此只需要使用 mkdir 创建它们。该 /proc 目录基本上是一个存根,将 proc 文件系统放置在该存根下。目录 /mnt 和 /usr 只是在引导/根系统运行后使用的挂载点。因此,只需要创建这些目录。
以下各节将介绍其余四个目录。
/dev
对于任何 Linux 系统,都必须有一个目录,其中包含 /dev 系统要使用的所有设备的特殊文件。目录本身是一个普通目录,可以用正常方式创建 mkdir 。但是,必须使用 mknod 命令以特殊方式创建设备特殊文件。
不过,有一个快捷方式 - 从现有硬盘 /dev 目录中复制设备文件。唯一的要求是使用选项复制 -R 设备特殊文件。这将复制目录而不尝试复制文件的内容。请务必使用大写 R 字母。例如:
cp -dpR /dev/fd[01]* /mnt/dev
cp -dpR /dev/tty[0-6] /mnt/dev
假定FLASH安装在 /mnt 上。这些 dp 开关确保将符号链接复制为链接,而不是使用目标文件,并保留原始文件属性,从而保留所有权信息。
如果要以困难的方式执行此操作,请使用 显示 ls -l 所需设备的主要和次要设备编号,并使用 在 mknod FLASH上创建它们。
无论创建设备文件如何,请检查所需的任何特殊设备是否已放置在修复盘上。例如, 使用磁带设备, ftape 因此如果您打算从启动盘访问FLASH磁带机,则需要复制所有这些设备。
请注意,每个设备特殊文件都需要一个索引节点,并且索引节点有时可能是一种稀缺资源,尤其是在FLASH文件系统上。您需要对包含的设备文件进行选择性选择。例如,如果您没有 SCSI 磁盘,则可以安全地忽略 /dev/sd* ;如果您不打算使用串行端口,则可以忽略 /dev/ttyS* 。
如果在构建根文件系统时收到错误 No space left on device ,但 df 命令显示空间仍然可用,则可能已用完索引节点。A df -i 将显示索引节点使用情况。
请确保包含此目录中的以下文件: console 、、 null 、 ram0 kmem mem 和 tty1 。
/etc
/etc 目录包含配置文件。它应该包含的内容取决于您打算运行的程序。在大多数系统上,这些可以分为三组:
- 始终需要,例如、 rc fstab passwd 。
- 可能需要,但没有人太确定。
- 垃圾等无用配置。
非必需的文件通常可以使用以下命令进行识别:
ls -ltru
这将按上次访问日期的相反顺序列出文件,因此,如果未访问任何文件,则可以从根FLASH中省略这些文件。
在我的根FLASH上,我的配置文件数量减少到 15 个。这将我的工作减少到处理三组文件:
- 我必须为引导/根系统配置的那些:
- rc.d/* -- 系统启动和运行级更改脚本
- fstab -- 要挂载的文件系统列表
- inittab -- 初始化进程的参数,第一个进程在引导时启动。
- gettydefs -- 初始化进程的参数,第一个进程在引导时启动。
- 我应该为引导/根系统整理的那些:
- passwd -- 用户、主目录等的关键列表
- group -- 用户组。
- shadow -- 用户密码。你可能没有这个。
- termcap ——终端能力数据库。
如果安全性很重要, passwd shadow 则应进行修剪以避免将用户密码从系统中复制,以便在从FLASH引导时拒绝不需要的登录。
请确保至少 passwd root 包含 .如果您打算其他用户登录,请确保他们的主目录和 shell 存在。
termcap ,即终端数据库,通常为几百 KB。引导/根EEPROM上的版本应向下修剪,以仅包含您使用的终端,通常只是 linux or linux-console 条目。
其余的。他们目前在工作,所以我不理会他们。除此之外,我只需要配置两个文件,它们应该包含的内容非常小。
- rc 应包含:
#!/bin/sh /bin/mount -av /bin/hostname Kangaroo
确保它是可执行的,确保它在顶部有一个“#!”行,并确保任何绝对文件名都是正确的。你真的不需要运行主机名——如果你这样做,它看起来更好。
-
fstab 应至少包含:
/dev/ram0 / ext2 defaults /dev/fd0 / ext2 defaults /proc /proc proc defaults
您可以从现有的 fstab 中复制条目,但不应自动挂载任何硬盘分区;将 noauto 关键字与它们一起使用。使用启动盘时,您的硬盘可能已损坏或损坏。
您应该更改它 inittab ,以便其 sysinit 行运行 rc 或使用任何基本引导脚本。此外,如果要确保串行端口上的用户无法登录,请注释掉行尾包含 ttys or ttyS 设备的所有条目 getty 。保留 tty 端口,以便您可以在控制台登录。
最小 inittab 文件如下所示:
id:2:initdefault:
si::sysinit:/etc/rc
1:2345:respawn:/sbin/getty 9600 tty1
2:23:respawn:/sbin/getty 9600 tty2
该文件 inittab 定义了系统将在各种状态下运行的内容,包括启动、移动到多用户模式等。仔细检查 中 inittab 提到的文件名;如果 init 找不到提到的程序,启动盘将挂起,您甚至可能不会收到错误消息。
请注意,某些程序无法移动到其他位置,因为其他程序已对其位置进行硬编码。例如,在我的系统上, /etc/shutdown 已经硬编码 /etc/reboot 了.如果我移动到 reboot /bin/reboot ,然后发出 shutdown 命令,它将失败,因为它找不到 reboot 该文件。
对于其余部分,只需复制目录中的所有文本文件,以及 /etc /etc 目录中无法确定不需要的所有可执行文件。作为指导,请参阅附录 C 中的示例列表。可能只复制这些文件就足够了,但系统差异很大,因此您无法确定系统上的同一组文件是否等效于列表中的文件。唯一确定的方法是从开始 inittab 并计算出所需的内容。
大多数系统现在使用包含 /etc/rc.d/ 不同运行级别的 shell 脚本的目录。最小值是单个 rc 脚本,但从现有系统中复制 inittab 和 /etc/rc.d 目录可能更简单,并修剪 rc.d 目录中的 shell 脚本以删除EEPROM系统环境无关的处理。
/bin 和 /sbin
该 /bin 目录是一个方便的地方,用于执行基本操作所需的额外实用程序,例如 ls、mv、cat 和 dd。有关 /bin 和 /sbin 目录中的文件的示例列表,请参阅附录 C。它不包括从备份还原所需的任何实用程序,例如cpio,tar和gzip。这是因为我将它们放在单独的实用程序FLASH上,以节省引导/根EEPROM上的空间。引导/根ROM引导后,将其复制到虚拟硬盘,使驱动器空闲以挂载另一张FLASH,即实用程序EEPROM。我通常将其安装为 /usr .
实用程序EEPROM的创建以后写文章描述。可能需要维护用于写入备份的相同版本的备份实用程序的副本,这样您就不会浪费时间尝试安装无法读取备份磁带的版本。
请务必包含以下程序: init 、或等效程序、、、一些能够运行 rc 脚本的 shell、 getty login mount 指向 sh shell 的链接。
/lib
在 /lib 你放置必要的共享库和加载器。如果在 /lib 目录中找不到必要的库,则系统将无法启动。如果幸运的话,您可能会看到一条错误消息,告诉您原因。
几乎每个程序至少都需要 libc 库 libc.so. N,其中 N 是当前版本号。检查您的 /lib 目录。该文件 libc.so.N 通常是指向具有完整版本号的文件名的符号链接:
在这种情况下,您需要 libc-2.1.1.so .要查找其他库,您应该浏览您计划包含的所有二进制文件,并使用 ldd 检查它们的依赖关系。例如:
% ldd /sbin/mke2fs
libext2fs.so.2 => /lib/libext2fs.so.2 (0x40014000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0x40026000)
libuuid.so.1 => /lib/libuuid.so.1 (0x40028000)
libc.so.6 => /lib/libc.so.6 (0x4002c000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
右侧的每个文件都是必需的。该文件可能是符号链接。请注意,有些库非常大,不容易适应您的根文件系统。例如,上面 libc.so 列出的大约是 4 meg。在将库复制到根文件系统时,您可能需要剥离库。
在 中 /lib ,还必须包含库的加载器。加载器将是 ld.so (对于不再常见的 A.OUT 库)或 ld-linux.so (对于 ELF 库)。较新版本的 ldd 会准确地告诉您需要哪个加载器,如上例所示,但旧版本可能不需要。如果不确定需要哪个,请在库上运行 file 命令。例如:
% file /lib/libc.so.4.7.2 /lib/libc.so.5.4.33 /lib/libc-2.1.1.so
/lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC), stripped
/lib/libc.so.5.4.33: ELF 32-bit LSB shared object, Intel 80386, version 1, stripped
/lib/libc-2.1.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1, not stripped
指示 QMAGIC 用于 4.7.2 A.OUT 库,指示 ELF 5.4.33 和 2.1.1 用于 ELF。
将所需的特定加载程序复制到要构建的根文件系统。应根据包含的二进制文件仔细检查库和加载程序。如果内核无法加载必要的库,内核可能会挂起并显示没有错误消息。
提供 PAM 和 NSS
您的系统可能需要动态加载的库,而这些库对 不 ldd 可见。如果未提供这些设置,则可能无法登录或使用启动磁盘。
PAM(Pluggable Authentication Modules)(可插拔身份验证模块)
如果您的系统使用 PAM(可插拔身份验证模块),则必须在引导盘上为其进行一些配置。简而言之,PAM 是一种复杂的模块化方法,用于验证用户身份并控制他们对服务的访问。确定系统是否使用 PAM 的一种简单方法是在 login 可执行文件上运行 ldd ;如果输出包括 libpam.so ,则需要 PAM。
幸运的是,启动盘通常与安全性无关,因为任何对计算机具有物理访问权限的人通常都可以做任何他们想做的事情。因此,您可以通过在根文件系统中创建如下所示的简单 /etc/pam.conf 文件来有效地禁用 PAM:
OTHER auth optional /lib/security/pam_permit.so
OTHER account optional /lib/security/pam_permit.so
OTHER password optional /lib/security/pam_permit.so
OTHER session optional /lib/security/pam_permit.so
同时将文件 /lib/security/pam_permit.so 复制到根文件系统。这个库只有大约 8K,所以它施加的开销最小。
此配置允许任何人完全访问您计算机上的文件和服务。如果您出于某种原因关心启动盘的安全性,则必须将部分或全部硬盘的 PAM 设置复制到根文件系统。请务必仔细阅读 PAM 文档,并将所需的 /lib/security 任何库复制到根文件系统中。
您还必须包含在 /lib/libpam.so 启动磁盘上。但是自从您运行 /bin/login ldd 以来,您已经知道这一点,这表明了这种依赖关系。
NSS(Name Service Switch)(名称服务交换机)
如果您使用的是glibc(又名libc6),则必须为名称服务进行配置,否则您将无法登录。该文件 /etc/nsswitch.conf 控制各种服务的数据库查找。如果您不打算从网络访问服务(例如,DNS或NIS查找),则只需准备一个简单的 nsswitch.conf 文件,如下所示:
passwd: files shadow: files group: files hosts: filesservices: filesnetworks: filesprotocols: filesrpc: filesethers: filesnetmasks: files bootparams: filesautomount: files aliases: filesnetgroup: filespublickey: files
这指定每个服务仅由本地文件提供。您还需要包含 /lib/libnss_files.so. X,其中 X 对于 glibc 2.0 为 1,对于 glibc 2.1,为 2。此库将动态加载以处理文件查找。
如果您计划从启动盘访问网络,则可能需要创建一个更详细的 nsswitch.conf 文件。有关详细信息,请参见 nsswitch 手册页。必须为指定的每个服务包含一个文件 /lib/libnss_ 服务 .so.1 。
系统引导模块
如果您有模块化内核,则必须考虑在引导后可能要从引导盘加载哪些模块。如果您的驱动器位于EEPROM上,则可能需要包括 ftape 和 zftape 模块;如果有 SCSI 设备的模块;如果要在紧急情况下访问网络,则可能需要包括用于 PPP 或 SLIP 支持的模块。
这些模块可以放置在 /lib/modules 中。您还应该包括insmod,rmmod和lsmod。根据您是否要自动加载模块,您可能还包括modprobe,depmod和swapout。如果使用内核,请将其与 /etc/conf.modules 一起包含在 中。
但是,使用模块的主要优点是您可以将非关键模块移动到实用程序磁盘并在需要时加载它们,从而使用更少的根磁盘空间。如果您可能需要处理许多不同的设备,这种方法比构建一个内置了许多驱动程序的巨大内核更可取。
为了引导压缩的 ext2 文件系统,您必须内置虚拟硬盘和 ext2 支持。它们不能作为模块提供。
一些最终细节
某些系统程序(如登录)会因为某些文件 /var/run/utmp 和目录 /var/log 不存在出错。所以:
mkdir -p /mnt/var/{log,run}
touch /mnt/var/run/utmp
最后,在设置完所需的所有库后,运行 ldconfig 以在根文件系统上重新制作 /etc/ld.so.cache 。缓存告诉加载程序在哪里可以找到库。您可以使用以下方法执行此操作:
ldconfig -r /mnt
打包发布
构建完根文件系统后,将其卸载,将其复制到文件中并压缩:
umount /mnt
dd if=DEVICE bs=1k | gzip -v9 > rootfs.gz
完成此操作后,您将拥有一个文件 rootfs.gz 。这是您的压缩根文件系统。您应该检查其大小以确保它适合EEPROM;如果没有,您将不得不返回并删除一些文件。减少根文件系统大小的一些建议不是本文重点。
此处提供的目录结构仅供根EEPROM使用。真正的 Linux 系统有一组更复杂、更规范的策略,称为文件系统层次结构标准,用于确定文件应该去哪里。
相关文章:

构建嵌入式Linux rootfs根文件系统
创建根文件系统涉及选择系统运行所需的文件。在本节中,我们将介绍如何构建压缩的根文件系统。不太常见的选择是在直接作为 root 挂载的本地驱动器上构建未压缩的文件系统。 转载请注明来源,谢谢。构建嵌入式Linux rootfs根文件系统-CSDN博客创建根文件系…...

高速电路设计----第三章
一、数字信号需要上拉的情况 1、 一般信号上拉接多大的电阻要看对于芯片的电流要求。看芯片datasheet的I(BHLO)和I(BHHO)两个参数。平时的话: 3.3V的上拉为1K~3.3k即可 5V的上拉电阻为4.7K到10K即可。 2、数字信号的逻辑控制&a…...

【微信小程序】6天精准入门(第4天:自定义组件及案例界面)附源码
一、自定义组件 1、介绍 从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。 开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用;也可以将复杂的页…...

pragma once与ifndef的区别
概要 代码编译过程中,为了防止同一份代码被重复引用,通常有两种实现方式 方式一 #pragma once 方式二 #ifndef _TEST_H_ #define _TEST_H_ #endif // !TEST_H 通常情况下,使用上述两种方式中的任意一种都是可以的。最近工作中,代…...
52单片机独立键盘控制数码管计数
前言 使用52单片机实现独立键盘控制数码管计数 代码 #include<reg52.h> #define uchar unsigned char #define uint unsigned intsbit key2 P3^4; sbit key3 P3^5; sbit key4 P3^6; sbit key5 P3^7;char code smg[] {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x…...

完美解决 在将最终稿件上传到 IEEE PDF eXpress进行格式检查是出现“font not embedded“的问题 (不会出现自动压缩图像的现象)
最近中了一篇IEEE的论文,在校稿阶段,final paper是需要通过IEEE PDF eXpress网站的格式检查,然后出现一下问题: Errors: Font TimesNewRomanPS-BoldMT, TimesNewRomanPS-ItalicMT, TimesNewRomanPSMT is not embedded 用人话说就…...

零基础学习CSS
01-CSS初体验 层叠样式表 (Cascading Style Sheets,缩写为 CSS),是一种 样式表 语言,用来描述 HTML 文档的呈现(美化内容)。 书写位置:title 标签下方添加 style 双标签,style 标签…...

基于Flume+Kafka+Hbase+Flink+FineBI的实时综合案例(五)FineBI可视化
文章目录 22:FineBI配置数据集23:FineBI构建报表24:FineBI实时配置测试附录二:离线消费者完整代码 22:FineBI配置数据集 目标:实现FineBI访问MySQL结果数据集的配置 实施 安装FineBI 参考《FineBI Windows…...

Python逆向爬虫案例: 某网站AES逆向解密
前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 Pycharm 👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了࿰…...
ONNX runtime本地终端部署
1、class_index.csv文件: ID,English,Chinese 0,A,你 1,B,我 2,C,他 3,D,她2、classification.onnx 3、单张图像处理代码如下: import onnxruntime import torch import torch.nn.functional as F import pandas as pd from PIL import Image from tor…...

Linux性能优化--性能工具:特定进程CPU
4.0 概述 在用系统级性能工具找出是哪个进程降低了系统速度之后,你需要用特定进程性能工具来发现这个进程的行为。对此,Linux提供了丰富的工具用于追踪一个进程和应用程序性能的重要统计信息。 阅读本章后,你将能够: 确定应用程…...
技术人员转岗产品经理,有优势吗?
产品经理是一个非技术型的岗位,但是懂一些技术相关的知识会更好的和技术部门沟通,能更好的从技术部门的角度理解需求的可行性。所以这么说来,技术转产品经理相对来说更加有优势。 任何事情不可能都是只有好处没有坏处的,同样的&a…...

使用IDEA2022.1创建Maven工程出现卡死问题
使用IDEA创建Maven工程出现卡死问题,这个是一个bug 这里是别人和官方提供这个bug,大家可以参考一下 话不多说,上教程 解决方案: 方案1:更新idea版本 方案2:关闭工程,再新建,看图...
Nuttx Syscall
在Nuttx系统中,mksyscall工具用于根据syscall/syscall.csv文件生成供用户调用的接口和内核中对应的接口。具体来说,mksyscall -p system.csv生成供用户调用的接口,而mksyscall -s system.csv生成内核中调用的接口。 在syscall/syscall.csv文…...
HTTP协议中GET请求和POST请求的区别
1. 形式上: GET请求:参数包含在URL中,意味着参数的长度是有限的,并且参数只能是ASCII码的形式。 POST请求:参数包含在请求体中,参数的长度是不受限,并且参数支持多种数据类型。 2.安全性 GET请…...

【广州华锐互动】利用VR开展施工现场安全培训,提高员工安全意识水平
随着科技的不断发展,虚拟现实(VR)技术已经逐渐渗透到各个领域,为我们带来了前所未有的沉浸式体验。在建筑施工行业,VR技术的应用也日益广泛,从设计、施工到管理,都可以看到VR技术的身影。而在这…...

Cornerstone for Mac:高效SVN管理的黄金标准
在当今的软件开发领域,版本控制系统是不可或缺的一部分。其中,Subversion(SVN)是一个广泛使用的版本控制系统,有助于团队协同工作,实现代码的版本管理和追踪。对于Mac用户来说,Cornerstone是一款…...

数据结构之顺序表的模拟实现
💕"世事犹如书籍,一页页被翻过去。人要向前看,少翻历史旧账。"💕 作者:Mylvzi 文章主要内容:数据结构之顺序表的模拟实现 /*** Created with IntelliJ IDEA.* Description:* User: 绿字* Date:…...

R6G azide, 5-isomer具有良好的水溶性,2135330-71-9
试剂 | 基础知识概述(部分): 英文名称:R6G azide, 5-isomer CAS:2135330-71-9 分子式:C30H32N6O4 分子量:540.61 规格标准:10mg,25mg,50mg,可提供mg级以…...

Canvas系列绘制图片学习:绘制图片和渐变效果
我们现在已经可以绘制好多东西了,不过在实际开发中,绘制最多的当然是图片了,这章我们就讲讲图片的绘制。 绘制图片 绘制图片的API是drawImage,它的参数有三种情况: // 将图片绘制在canvas的(dX, dY)坐标处 context.…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...