2-2-18-9 QNX系统架构之文件系统(二)
阅读前言
本文以QNX系统官方的文档英文原版资料为参考,翻译和逐句校对后,对QNX操作系统的相关概念进行了深度整理,旨在帮助想要了解QNX的读者及开发者可以快速阅读,而不必查看晦涩难懂的英文原文,这些文章将会作为一个或多个系列进行发布,从遵从原文的翻译,到针对某些重要概念的穿插引入,以及再到各个重要专题的梳理,大致分为这三个层次部分,分不同的文章进行发布,依据这样的原则进行组织,读者可以更好的查找和理解。
1. 文件系统
本文接上一篇继续讲解文件系统:《2-2-18-9 QNX系统架构之文件系统(一)》
1.6. Power-Safe文件系统
电源安全(Power-Safe)文件系统是一种可靠的磁盘文件系统,可以承受电源故障而不会丢失或损坏数据。该电源安全文件系统由fs-qnx6.so共享对象进行支持。
可扩展的文件系统
对于电源安全(Power-Safe)文件系统类型,你可以创建可扩展的文件系统,这种文件系统的最大存储容量可以超过其指定的大小。你可以使用主机端【host-side】的mkqnx6fsimg工具或目标端【target-side】的mkqnx6fs工具;这些工具使用不同的单位来表示文件系统的大小。
对于mkqnx6fsimg工具,构建 Power-Safe 文件系统镜像,必须设置num_sectors属性来指示存储该镜像所需的扇区数量,设置max_sectors属性来指示文件系统支持的最大扇区数量。有关如何确定最大容量的解释,请参阅实用程序参考中mkqnx6fsimg条目的max_sectors属性。
对于mkqnx6fs工具,格式化的Power-Safe文件系统,必须设置-x选项来请求可扩展的文件系统,设置-n选项来指示文件系统希望支持的逻辑块的最大数量(即可分配单元的最大数量)。有关逻辑块的最大数量的具体计算方法,请参见mkqnx6fs -n option选项。
bitmap文件和inodes文件
在Power-Safe文件系统中,必须为bitmap文件和inode文件保留空间。
其中,bitmap文件是一个大的位域【bitfield】,它覆盖了尽可能多的内存块,以便将文件系统镜像中的每个块表示为单个位。如果该块已被分配,则该位会被置1,如果还没有分配,则该位为0。bitmap文件的大小,是根据最大扇区数(max_sectors)进行计算的。
而inodes文件是一个表,包含了系统中特定文件的信息。如果给mkqnx6fsimg工具提供num_inodes属性,则使用该属性来确定信息节点(inodes)的数量。该计数值是inodes表中项的数目。如果没有提供该属性,则mkqnx6fsimg工具会根据其他属性(包括num_sectors)来确定inodes的数量。有关inodes数量计算方法的更多信息,请参见mkqnx6fsimg的num_inodes属性。有关inodes的更多详细信息,请参见《QNX Neutrino用户指南》中 “使用文件系统” 章节中的 “Links and inodes” 的内容。
因为这两个系统文件占用了镜像中的一些空间,所以用户可访问的内存容量会略小于文件系统的最大容量。
1.6.1. 现有磁盘文件系统的问题
尽管现有的磁盘文件系统被设计得健壮而可靠,但是仍然有可能丢失数据,这取决于当灾难性故障(例如电源故障)发生时文件系统正在做什么。
例如:
- 硬盘上的每个扇区都包含一个4字节的纠错码(ECC),驱动器使用该纠错码来捕获硬件错误等等。如果当电源故障发生时驱动程序正在写入磁盘,那么磁头将会被移除以防止磁头刮擦表面,从而使扇区与新内容保持在半写入状态。而在下次尝试读取该块或扇区时,不一致的ECC会导致读取失败,因此这样做将会同时丢失旧内容和新内容。你可以使用为你提供原子扇区更新并向你保证扇区中的所有旧数据或新数据都可读的硬盘驱动器,但这些驱动器很少且昂贵。
- 某些文件系统操作需要更新多个磁盘上的数据结构。例如,如果某个程序调用
unlink()
,则文件系统必须更新一个bitmap
块、一个目录块以及一个inode
项,这意味着它必须写入三个独立的块。如果在写入这些块之间发生了电源故障,则磁盘上的文件系统将处于一种不一致的状态。按照精心选择的顺序,把关键的文件系统数据同步写入磁盘(比如,对于目录【directories】、inodes、扩展块【extent blocks】和位图【bitmap】的更新),以减少(但不能完全消除)这种风险。
- 如果根目录【root directory】、位图【bitmap】或inodes文件(都在磁盘的前几个块中)损坏,则根本无法挂载文件系统。你或许能够手动修复文件系统,但是你需要非常熟悉文件系统结构的细节。
1.6.2. 写时复制文件系统
为了解决与现有磁盘文件系统相关的问题,Power-Safe 文件系统从不会覆盖实时数据;它使用一种被称为写时复制的策略(copy-on-write, COW)来完成所有更新,在磁盘未使用的块中组装文件系统的新视图。只有当所有更新都被安全地写入磁盘时,文件系统的新视图才会变为“活动”状态。一切都是COW的:元数据【metadata】和用户数据【user data】都受到了保护。
要了解这是如何工作的,让我们考虑一下数据是如何存储的。Power-Safe文件系统被划分为很多逻辑块,可以在使用名为mkqnx6fs
的工具格式化文件系统时指定逻辑块的大小。每个inode会包含16个指向逻辑块的指针。如果文件小于16个逻辑块的大小,则inode直接指向数据块。如果文件再大一些,则这16个块就会变成指向更多逻辑块的指针,以此类推。
指向实际数据的最后一个逻辑块指针都是叶子节点,并且都在同一层。在其他一些文件系统(如EXT2)中,一个文件总是会有一些直接块、一些间接块和一些双间接块,因此你可以进入不同的级别来访问文件的不同部分。而与此不同的是,使用Power-Safe文件系统,一个文件的所有用户数据都处于同一级别。
如果你更改了一些数据,那么它将会被写入一个或多个未使用的块中,而原始数据保持不变。但是文件系统必须修改间接块指针列表,以引用新使用的块,因此文件系统会复制现有的指针块并修改其副本。然后,文件系统会更新inode(再次通过修改副本),以引用新的间接指针块。当操作完成后,原始数据和指向它的指针均保持不变,但是有一组新的块,新的间接指针以及inode会用于修改后的数据:
这对COW文件系统有几个含义:
- 对于bitmap及inode的处理方式与对用户文件的处理方式相同。
- 任何文件系统block都可以重新定位,因此没有任何固定的位置。
- 文件系统必须完全是自引用的【self-referential】。
超级块【superblock】是一个全局根块【global root block】,其中包含系统位图【system bitmap】和inode文件【inodes files】的inode信息。Power-Safe文件系统维护两个超级块:
- 一个稳定的超级块,反映所有块的原始版本;
- 一个反映了数据修改的正在工作的超级块;
“正在工作的超级块” 可以包含一些指针,指向位于稳定超级块中的块。这些块包含了尚未修改的数据。正在工作的超级块的inode和位图【bitmap】可以基于此进行增长。
快照【snapshot】是文件系统的一致性视图(简单地说就是一个提交了的超级块【committed superblock】)。要创建快照,文件系统进行如下操作:
- 锁定文件系统以确保它处于稳定状态;所有客户端活动被挂起,并且必须没有活动的操作。
- 将所有复制的块写入到磁盘。顺序并不重要,因此它可以被优化。
- 强制将数据同步到磁盘,包括刷新任何硬件磁道缓存【hardware track cache】。
- 构造超级块,记录bitmap和inode到新位置,增加其序列号,并计算CRC。
- 将超级块写入磁盘。
- 在工作视图和提交视图之间进行切换。旧版本的复制块被释放并可供使用。
要在启动时挂载磁盘,文件系统只需从磁盘读取超级块,验证它们的CRC,然后选择序列号较高的那个。不需要重新播放事务日志。挂载文件系统所需的时间就是读取几个块所需的时间。
如果驱动器不支持同步,则fs-qnx6.so不能保证文件系统是电源安全的。在使用该文件系统之前,请检查以确保你的设备满足该文件系统的要求。有关详细信息,请参见 Utilities Reference 中的 fs-qnx6.so项的 “Required properties of the device” 的内容。
1.6.3. 性能【Performance】
写时复制(COW)方法有一些缺点:
- 对用户数据的每次更改都可能导致多达十几个块被复制和修改,因为文件系统从来不会修改inode和间接块指针【indirect block pointers】;它必须将数据块复制到一个新的位置,并修改副本。因此,写操作时间较长。
- 当创建快照时,文件系统必须在提交超级块之前强制所有块完全放到磁盘上。
然而:
- 写入块(除了超级块)的顺序没有限制。
- 从任何空闲的、连续的空间中可以分配新块。
文件系统的性能取决于有多少缓冲缓存【buffer cache】可用,以及快照的频率。快照存储会周期性地发生(每10秒一次,或者按照fs-qnx6.so
的snapshot
选项进行指定),以及当你对整个文件系统调用sync()
或对单个文件调用fsync()
时发生。
同步是在文件系统级别的,而不是在单个文件级别的,因此fsync()
可能是一个昂贵的操作;Power-Safe 文件系统忽略O_SYNC
标志。
如果你正在执行一些长时间的操作,并且中间状态对你没有用处,你也可以关闭快照。例如,假设你正在将一个非常大的文件复制到Power-Safe文件系统中。实用程序cp
实际上只是一系列基本操作:
- 调用
open(O_CREAT|O_TRUNC)
来创建文件; - 许多次
write()
操作来复制数据; - 调用
close()
,chmod()
,以及chown()
来拷贝元数据;
当文件足够大,以至于其复制过程跨越了多个快照时,磁盘上的视图会经历一系列的变化。最初,文件可能还不存在;随着复制过程的进行,文件开始存在,并且其大小会逐渐增加;最后,文件复制完成,其ID和权限也会完成设置。
每个快照都是文件系统的一个有效的时间点视图(即,如果你复制了 50 MB,那么大小就是 50 MB,并且 50 MB以下的所有数据也都被正确地复制并可用)。如果停电,文件系统会恢复到最近的快照。open()
、write()
和close()
操作序列实际上是一个高级操作,也就是cp
,但是该电源安全的文件系统没有这样的概念。如果你想要一个更高级的语义,禁用cp
附近的快照,那么中间的快照就不会发生,如果发生停电,文件要么完整,要么根本就不存在。
有关使用电源安全的文件系统的信息,请参阅 “QNX Neutrino 用户指南” 中 “Working with Filesystems” 章节的 “Power-Safe filesystem” 的内容。
1.6.4. 加密【Encryption】
你可以加密Power-Safe文件系统的全部或部分内容,以保护其内容。
- 要使用文件系统加密,请从QNX软件中心下载Encrypted filesystem软件包。
- 使用加密文件系统时,读/写吞吐量和性能会比使用非加密文件系统时低一些,而CPU使用率会更高。
你可能需要用不同的密钥加密文件系统的不同部分,也有可能你不需要加密某些部分,因此Power-Safe文件系统允许你创建多个加密域【encryption domains】,你可以根据需要锁定或解锁这些域。
在一个加密域内可以包含任意数量的文件或目录,但一个文件或目录最多只能属于一个加密域。如果把加密域分配给目录,则随后在该目录中创建的所有的文件都会加密并且会继承该加密域。将加密域分配给目录并不会对该目录中已存在的任何文件或目录引入加密。
你可以简单地将加密域分配给目录或空文件;文件系统以同样的方式对待它们,因为此时它们之中没有任何需要加密的内容(目录中的已有文件不会进行加密)。如果你希望加密某个非空文件,则你必须把该文件迁移到一个加密域,因为文件系统需要先解密该文件,为其分配新的加密域,然后再次加密该文件。
在操作过程中,被分配到域中的文件会被加密,文件的内容只有在解除关联域的锁定后才能使用。当一个域被解锁时,该域下的所有文件和目录(无论它们在卷中的位置如何)也被解锁,因此是可访问的(根据基本文件权限)。当一个域被锁定时,对属于该域的文件内容的任何访问都将被拒绝。
锁定和解锁操作适用于整个域,而不是特定的文件或目录。
Domain 0 (FS_CRYPTO_UNASSIGNED_DOMAIN)
始终处于解锁状态,其内容未加密;你可以将系统设计为使用任何其他域。有效域名为 0 - 119
。
为了使用加密,必须为 fs-qnx6.so 设置crypto=
选项。然后可以使用 fsencrypt 来管理加密。chkqnx6fs 实用程序能够自动识别加密格式并验证加密数据的完整性。在格式化卷并添加内容之后,也可以使用 fsencrypt 启用加密,但是必须在启动 fs-qnx6.so 时设置crypto=
选项。
Key types【密钥类型】
Key type | Description |
File key | 是私有的,并且是在创建文件时随机生成的(如果文件被分配到一个域)。保存有关文件的一些信息,以确保文件与其密钥之间的完整性。用于文件数据加密,使用域密钥加密。密钥由文件系统管理,对用户是隐藏的。 |
Domain key | 是私有的,并且是在创建域时随机生成的。用于加密属于其域的所有文件密钥,并使用域主密钥进行加密。密钥由文件系统管理,对用户是隐藏的。 |
Master key | 是可选地公开的,因为它是由第三方(而不是文件系统)提供和管理的。用于加密域密钥,在创建域和随后的解锁请求中需要。 |
Encryption types【加密类型】
Power-Safe文件系统支持以下类型的加密:
域加密类型 | 常量 | 描述 | 密钥长度 |
0 | FS_CRYPTO_TYPE_NONE | 未加密 | — |
1 | FS_CRYPTO_TYPE_XTS | AES-256, in XTS mode. 这两个密钥是随机生成的。 | 512 bits |
2 | FS_CRYPTO_TYPE_CBC | AES-256, in CBC mode | 256 bits |
3–99 | — | 预留以便未来使用 | — |
Interface usage【接口使用】
要从命令行管理加密,请使用fsencrypt
;它的-c
选项允许你指定要运行的命令。要从你的代码中管理加密,请使用fscrypto
库。你需要同时包含<fs_crypto_api.h>
和<sys/fs_crypto.h>
两个头文件。其中的许多 API 在成功时会返回 EOK,并具有提供更多信息的reply
参数。
API |
| 描述 |
fs_crypto_check() | check | 确定底层文件系统是否支持加密; |
fs_crypto_domain_add() | create | 如果给定的域/类型不存在,则创建它。你需要提供64位加密密钥。从程序中,你可以创建锁定或解锁的域; |
fs_crypto_domain_add_flags() | create | 创建给定的域/类型(如果它不存在),为新文件密钥和域密钥使用给定的锁定状态和标志。你需要提供64位加密密钥。 |
fs_crypto_domain_hard_lock() | lock | 锁定一个域,防止访问属于该域的任何文件的原始内容。使用此函数,锁定行为由 |
fs_crypto_domain_key_change() | change-key | 修改用于加密域密钥的主域密钥 |
fs_crypto_domain_key_check() | check-key | 确定给定的域密钥是否有效 |
fs_crypto_domain_key_size() | — | 返回文件系统加密所需的密钥大小 |
fs_crypto_domain_lock() | lock | 锁定一个域,阻止访问属于该域的任何文件的原始内容。你必须在拥有文件系统挂载点的组中才能锁定域。 |
fs_crypto_domain_query() | query, query-all | 获取域的状态信息 |
fs_crypto_domain_remove() | destroy | 销毁一个域。你必须处于拥有文件系统挂载点的用户组中。在该域被销毁后,则该域中的任何文件都不可能再被检索到。 |
fs_crypto_domain_unlock() | unlock | 解锁一个域,给定适当的密钥数据 |
fs_crypto_domain_whitelist_configure() | — | 配置域白名单 |
fs_crypto_domain_whitelist_ctrl() | — | 对域白名单执行控制操作 |
fs_crypto_domain_whitelist_ctrl_access_grant() | — | 授予客户端对域的访问权限 |
fs_crypto_domain_whitelist_ctrl_access_revoke() | — | 撤销客户端对域的访问权限 |
fs_crypto_domain_whitelist_get_flags() | — | 获取域名白名单的标志 |
fs_crypto_domain_whitelist_set_flags() | — | 设置域白名单标志。白名单只有在使用硬锁并且没有设置 |
fs_crypto_enable() , fs_crypto_enable_option() | enable | 启用卷上加密支持(该卷在格式化时没有设置加密) |
fs_crypto_file_get_domain() | get | 返回文件或目录的域(如果已分配) |
fs_crypto_file_set_domain() | set | 将给定的域分配给路径(常规文件或目录)。如果是常规文件,则文件长度必须为零。该域将会替换以前分配给该路径的任何域。 |
fs_crypto_key_gen() | -K or -k option | 从一个密码生成一个加密密钥 |
fs_crypto_set_logging() | -l and -v options | 设置日志记录目的地和详细程度 |
该库还包括一些函数,可用于把现有文件和目录移动到加密域中。为此,你可以解锁源域和目标域,标记要移动的文件和目录,然后开始迁移,这是文件系统在后台执行的操作。这些功能包括:
API |
| 描述 |
fs_crypto_migrate_control() | migrate-start, migrate-stop, migrate-delay, migrate-units | 控制文件系统内的加密迁移 |
fs_crypto_migrate_path() | migrate-path | 将整个目录标记为要迁移到加密域 |
fs_crypto_migrate_status() | migrate-status | 获取文件系统中的迁移状态 |
fs_crypto_migrate_tag() | migrate-tag, tag | 标记要迁移到加密域的文件 |
Examples【示例】
下面是一些使用 fsencrypt
管理文件系统加密的示例:
- 确定是否支持或启用加密:
$ fsencrypt -vc check -p /
ENCRYPTION_CHECK(Path:'/') FAILED: (18) - 'No support'
- 在现有文件系统上启用加密:
$ fsencrypt -vc enable -p /
ENCRYPTION_CHECK(Path:'/') SUCCESS
$ fsencrypt -vc check -p /
ENCRYPTION_CHECK(Path:'/') NOTICE: Encryption is SUPPORTED)
这种更改是不可逆的,并且强制两个连续的磁盘事务重写超级块中的一些数据。
- 确定文件是否加密。域编号为
0
的文件不会进行加密。非零值意味着文件被分配到一个域。对文件原始内容的访问由域的状态决定。下面的示例显示命名文件被分配到域10
:
$ fsencrypt -vcget -p /accounts/1000/secure/testfile
GET_DOMAIN(Path:'/accounts/1000/secure/testfile') = 10 SUCCESS
- 确定域是否被锁定。如果一个域被锁定,读取该域内的文件会产生加密的数据;未解锁的域产生原始文件内容。“未使用”的域是指尚未创建的域。在下面的示例中,域
11
尚未创建,而域10
目前处于解锁状态:
$ fsencrypt -vc query -p/ -d11
QUERY_DOMAIN(Path:'/', Domain:11) NOTICE: Domain is UNUSED
$ fsencrypt -vc query -p/ -d10
QUERY_DOMAIN(Path:'/', Domain:10) NOTICE: Domain is UNLOCKED
未完,请继续看下一篇:《 2-2-18-9 QNX系统架构之文件系统(三)》
相关文章:

2-2-18-9 QNX系统架构之文件系统(二)
阅读前言 本文以QNX系统官方的文档英文原版资料为参考,翻译和逐句校对后,对QNX操作系统的相关概念进行了深度整理,旨在帮助想要了解QNX的读者及开发者可以快速阅读,而不必查看晦涩难懂的英文原文,这些文章将会作为一个…...

【经管数据】上市公司企业审计报告时滞数据、 年报披露时滞数据(2001-2022年)
测算方式:参考C刊《审计研究》窦笑晨(2022)老师的研究,从审计报告约定披露日期到审计报告实际披露日期之间的时间间隔。有关审计报告时滞的度量,现有研究大多采用资产负债表日与审计报告实际披露日期之间的间隔天数进行…...

debian ubuntu armbian部署asp.net core 项目 开机自启动
我本地的环境是 rk3399机器,安装armbian系统。 1.安装.net core 组件 sudo apt-get update && \sudo apt-get install -y dotnet-sdk-8.0或者安装运行库,但无法生成编译项目 sudo apt-get update && \sudo apt-get install -y aspnet…...

无人机地面遥控遥测技术与算法概述!
一、地面系统遥控检测核心技术 卫星遥测技术: 定义:卫星遥测技术是实现卫星与地面之间遥测数据传输的关键环节。 功能:传输卫星的状态信息、传感器采集的环境参数等。 关键技术: 调制解调技术:用于将数字遥测数据…...

游戏引擎学习第30天
仓库: https://gitee.com/mrxiao_com/2d_game 回顾 在这段讨论中,重点是对开发过程中出现的游戏代码进行梳理和进一步优化的过程。 工作回顾:在第30天,回顾了前一天的工作,并提到今天的任务是继续从第29天的代码开始,…...

Django drf 快速使用
1. 安装: pip install djangorestframework 2. 添加rest_framework到您的INSTALLED_APPS设置。 settings.pyINSTALLED_APPS [...rest_framework, ] 3. 定义模型 models.pyfrom django.db import modelsclass BookModel(models.Model):name models.CharField(max_length64)…...

机器学习介绍与实战:案例解析与未来展望
一、机器学习概述 1. 什么是机器学习? 机器学习(Machine Learning, ML)是一种通过数据训练模型,使计算机能够自动从经验中学习的技术。它旨在让计算机在没有显式编程的情况下,能够从数据中提取模式、进行预测或决策。…...

【SCT71401】3V-40V Vin, 150mA, 2.5uA IQ,低压稳压器,替代SGM2203
SCT71401 3V-40V Vin, 150mA, 2.5uA IQ,低压稳压器,替代SGM2203 描述 SCT71401系列产品是一款低压差线性稳压器,设计用于3 V至40 V (45V瞬态输入电压)的宽输入电压范围和150mA输出电流。SCT71401系列产品使用3.3uF…...

2024.12.3总结
继周一把PPT初稿弄出来后,今晚进行了转正预答辩,主管,导师,团队里能来听答辩的人都来了,讲完后,自己都觉得自己讲得不好,基本上是照着PPT念的。 写PPT,改PPT,不停的预演答辩的过程&…...

Redis探秘Sentinel(哨兵模式)
概述 Redis的高可用机制有持久化、复制、哨兵和集群。其主要的作用和解决的问题分别是: 持久化:持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进…...

Linux C/C++编程之静态库
【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com…...

strlen函数用法,模拟实现
一、strlen 函数用法 用来求字符串长度,从我们给的地址开始,往后数,直到遇到 \0 停止,返回数的个数,不包括 \0 返回值类型是无符号整形 char arr[ ]"bvcxz"; printf("%u ",strlen(arr)); …...

云原生后端:解锁高效可扩展应用的魔法世界
目录 一、云原生后端的崛起:时代的必然选择 二、云原生后端的基石:容器化与 Docker (一)容器化的概念与优势 (二)Docker:容器化的明星工具 三、微服务架构:云原生后端的灵魂 &…...

大数据新视界 -- Hive 数据湖架构中的角色与应用(上)(25 / 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

React高阶面试题目(六)
React的formik库 定义: Formik是一个用于在React应用程序中构建和处理表单数据的流行开源库。它提供了许多实用的组件和函数,使在React应用程序中处理表单数据变得更加轻松。 优点: 自动处理表单状态管理,无需手动编写大量的状态…...

容器运行应用及Docker命令
文章目录 一、使用容器运行Nginx应用1_使用docker run命令运行Nginx应用1 观察下载容器镜像过程2 观察容器运行情况 2_访问容器中运行的Nginx服务1 确认容器IP地址2 容器网络说明3 使用curl命令访问 二、Docker命令1_Docker命令获取帮助方法2_Docker官网提供的命令说明3_docker…...

【Go 基础】channel
Go 基础 channel 什么是channel,为什么它可以做到线程安全 Go 的设计思想就是:不要通过共享内存来通信,而是通过通信来共享内存。 前者就是传统的加锁,后者就是 channel。也即,channel 的主要目的就是在多任务间传递…...

windows10更新后system磁盘占用100%
windows10更新后system磁盘占用100% 现象: 解决办法: 打开服务禁用:Connected User Experiences and Telemetry 我现在已经把该服务禁用了,已经没有再出现不停写入的情况。 服务描述:“已连接的用户体验和遥测服务所…...

无人设备遥控器之防水性能篇
无人设备遥控器的防水性能是评估其耐用性和适应不同环境能力的重要指标。随着无人设备技术的不断发展,越来越多的遥控器在设计时融入了防水元素,以满足用户在不同天气条件下的使用需求。 一、防水等级与标准 无人设备遥控器的防水性能通常通过防水等级来…...

基于Matlab BP神经网络的非线性系统辨识与控制研究
随着现代工业和科学技术的不断发展,非线性系统的建模和控制成为了自动化领域中的重要研究课题。传统的系统辨识方法往往难以应对系统的复杂性和非线性特性,而人工神经网络(ANN)凭借其强大的逼近能力和自适应性,已广泛应…...

3D基因组工具(HiC可视化)trackc--bioinfomatics tools 35
01 3D genome data analysis guides 茶树三维基因组-文献精读19 https://trackc.readthedocs.io/en/latest/install.html #官网 https://github.com/seqyuan/trackc #官网https://trackc.readthedocs.io/en/latest/analysis_guide/index.html #HiC可视化案例 …...

【大模型微调】图片转pdf
有时候图片需要转成pdf https://www.bilibili.com/opus/982151156821131282 https://help.pdf24.org/ https://www.bilibili.com/video/BV163v2eyEWo/?vd_source=8318f88fcdf4948d2b21fae7c9cf3184 2024最新!小白如何安装破解版的 Acrobat https://www.32r.com/zt/dgyjzzrj/ …...

Linux-Ubuntu16.04摄像头 客户端抓取帧并保存为PNG
1.0:client.c抓取帧并保存为PNG #include <stdio.h> // 标准输入输出库 #include <stdlib.h> // 标准库,包含内存分配等函数 #include <string.h> // 字符串操作库 #include <linux/videodev2.h> // V4L2 视频设备…...

手机ip地址取决于什么?可以随便改吗
手机IP地址是指手机在连接到互联网时所获得的唯一网络地址,这个地址由一串数字组成,用于在网络中标识和定位设备。每个设备在连接到网络时都会被分配一个IP地址,它可以帮助数据包在网络中准确地找到目标设备。那么,手机IP地址究竟…...

计算机网络:TCP/IP协议的五大重要特性介绍
目录 一、逻辑编址 二、路由选择 三、名称解析 四、错误控制和流量控制 五、多应用支持 今天给大家聊聊TCP/IP协议中五大重要特性相关的知识,希望对大家深入了解该协议提供一些帮助! 一、逻辑编址 首先要了解什么是物理地址、逻辑地址。 ●...

Java与AWS S3的文件操作
从零开始:Java与AWS S3的文件操作 一、什么是 AWS S3?AWS S3 的特点AWS S3 的应用场景 二、Java整合S3方法使用 MinIO 客户端操作 S3使用 AWS SDK 操作 S3 (推荐使用) 三、总结 一、什么是 AWS S3? Amazon Simple Sto…...

详解 YOLOv5 模型运行参数含义以及设置及在 PyCharm 中的配置方法
详解 YOLOv5 模型运行参数含义以及设置及在 PyCharm 中的配置方法 这段代码中使用的命令行参数允许用户在运行 YOLOv5 模型时自定义多种行为和设置。以下是各个参数的详细说明和使用示例,以及如何在 PyCharm 中设置这些参数以确保正确运行带有参数的脚本。 命令行…...

Vue根据Div内容的高度给其Div设置style height
在 Vue.js 中,你可以使用 JavaScript 来动态地根据 div 的内容高度来设置其 style 的 height 属性。这通常是在组件挂载或更新时完成的,因为这时你已经有了实际的 DOM 元素可以操作。 以下是一个简单的例子,展示了如何实现这一点:…...

驱动篇的开端
准备 在做之后的动作前,因为win7及其以上的版本默认是不支持DbgPrint(大家暂时理解为内核版的printf)的打印,所以,为了方便我们的调试,我们先要修改一下注册表 创建一个reg文件然后运行 Windows Registr…...

OpenSSL 自建CA 以及颁发证书(网站部署https双向认证)
前言 1、前面写过一篇 阿里云免费ssl证书申请与部署,大家可以去看下 一、openssl 安装说明 1、这部分就不再说了,我使用centos7.9,是自带 openssl的,window的话,要去下载安装 二、CA机构 CA机构,全称为…...