Search Posts

分类: 管理

Centos9/rockylinux9启动提示LVM分区异常的解决办法:device file sys_wwid last seen on not found,timed out waiting for device

问题表现形式

Centos9/rockylinux9 系统使用再生龙(clonezilla)硬盘对拷后,得到的新硬盘的系统启动报错信息:

timed out waiting for device /dev/mapper/rl-home

LVM的逻辑分区有 rl-root,rl-home,rl-swap
其中只有提示 rl-home的问题。但rl-home和rl-root的分区格式都是xfs(换成ext4也一样的报错)。

报错截图:

问题根源:

在 RHEL 9.0 上,LVM 使用持久命名文件 /etc/lvm/devices/system.devices 来查找 PV,例如 IDTYPE、IDNAME、DEVNAME、PVID 等(此配置在 RHEL 9.0 上默认启用,在 RHEL 8.x 上默认禁用。在 AHV 上,克隆或创建快照功能会为 SCSI 磁盘生成新的 PV(在 ESXi 和 Hyper-V 上不会发生这种情况),但持久命名文件 /etc/lvm/devices/system.devices 不会在新虚拟机启动时自动更新。在此问题中,持久命名文件 /etc/lvm/devices/system.devices 中未列出新 PV,这会导致 LVM 忽略新 PV。在操作系统启动期间,原始 PV 中所需的磁盘分区不会挂载,而是 VM 进入紧急模式。

紧急解决方式:

若要从紧急模式恢复 VM,只需执行以下步骤:

  1. 删除原始设备文件:
    root@VM# rm /etc/lvm/devices/system.devices
  2. 创建新的设备文件:
    root@VM# vgimportdevices -a

彻底解决方式:

解决方式一:

编辑系统目录下的lvm的配置文件(/etc/lvm/lvm.conf 的 129行左右)

将其中的

#use_devicesfile=1

修改为

use_devicesfile=0

然后重启。问题解决。
解决方式一的一个可选后续操作为:

root@VM# rm /etc/lvm/devices/system.devices

解决方式二:

要防止虚拟机进入下一个克隆/快照的紧急模式,请执行以下操作:

  1. 在原始 VM 上,暂时禁用设备文件:
    root@VM# mv /etc/lvm/devices/system.devices /tmp/
  2. 创建虚拟机克隆/快照。
  3. 在原始 VM 上,使用设备文件恢复:
    root@VM# mv /tmp/system.devices /etc/lvm/devices/
  4. 在复制的 VM 上,创建新的设备文件:
    root@VM# vgimportdevices -a

参考资料:

  1. https://portal.nutanix.com/page/documents/kbs/details?targetId=kA07V000000LaGrSAK#:~:text=Uncomment%20the%20following%20line%20in%20%2Fetc%2Flvm%2Flvm.conf%20%3A%20use_devicesfile,since%20config%20has%20been%20disabled%3A%20root%40VM%23%20rm%20%2Fetc%2Flvm%2Fdevices%2Fsystem.devices
查看余下内容

Linux的层级架构与Rust的主要模块crate总结,值得转发收藏

Linux的层级架构

每个操作系统都有一个内核,内核封装了底层硬件设备管理、内存管理、网络数据协议转化和收发传输、文件系统读写等。从这个图可以看到,内核将系统硬件与应用程序进程连接起来,隐藏了上层下层交互的一些细节,各司其职。

这些分层包括:

  • 用户空间程序
  • 编译器
  • 终端
  • 防火墙
  • 系统调用的跨平台API(特定于平台的系统调用包装API)
  • Rust标准库
  • libc(或等效的API)
  • kernel,操作系统的核心模块
  • 系统资源
  • 内存
  • 文件系统
  • 网络
  • 硬件和其他设备(包括键盘、鼠标、监视器、磁盘驱动器)

Rust的标准库的功能划分

而Rust标准库,很好的利用了操作系统内核提供的API。

Rust标准库是Rust程序进入Linux操作系统内核函数的主要接口,它在内部使用libc(在Windows系统使用其他等效的库)来调用内核提供的系统调用。

从Rust程序中发起系统调用,以实现管理和操作各种系统资源(如图)。libc(或其变体)为类UNIX操作系统上的系统调用提供了一个包装器,如Linux内核实现了POSIX标准指定的数百个POSIX API(对于Windows,系统调用有等效的API,也实现了POSIX标准)。

作为标准库,Rust标准库是跨平台的,Rust标准库的系统调用的细节是从Rust开发人员那里抽象出来的。Rust也支持不依赖于标准库的运行方式(no_std 方式),Rust直接操控底层硬件(如应用在嵌入式系统开发场景),此时Rust就做了操作系统本身的工作。

对于大部分软件开发工程师而言,他们用Rust主要开发应用层软件,也就是运行在用户空间的程序。它们基于标准库编写,实现各种业务功能。应用层的软件并非所有模块和函数都涉及到系统调用(例如一些用于操作字符串和处理错误的函数,就无需调用系统调用)。

Rust标准库包括几大领域的模块,包括四大类:

第一类,Rust语言原语

即Rust Language Primitives:Rust 语言的基本元素或基本类型(如下图)。

如有符号整数、布尔值、浮点数、字符、字符串、数组、元组、切片。这些由Rust编译器负责实现。

Rust标准包括原语,并在它们之上构建。

第二类,alloc crate

与堆分配值的内存分配相关的类型、函数和特征。

包括集合(Vec、String等集合)、智能指针类型(Box<T>)、引用计数指针(Rc<T>)和原子引用计数指针(Arc<T>))。

第三类,core crate

作为Rust标准库的基础。充当Rust语言与标准库之间的链接,提供在Rust原语之上实现的类型、特征、常量和函数,并为所有Rust代码提供基础构建块,它是跨平台的,没有任何指向操作系统或其他外部依赖的链接。由于较少直接用到core crate,所以本文不做过多介绍。

第四类,模块(标准库的其他crate)

是标准库的一部分,模块crate包括针对并发、I/O,文件系统、网络、异步I/O、错误处理等功能,以及与特定操作系统相关的函数,Rust的官网对std有专门的文档。例如

  • 为用户程序在多个线程上并发运行的功能在std::thread模块中;
  • 用于处理同步I/O的功能在std::io模块中提供;
  • 针对特定os的模块,主要在std::os模块中实现。

下图展示了Rust标准库各个领域功能涉及到的具体std模块(如std::io、std::os等)

以下着重对第四类的主要 crate 做一介绍,并附上文档地址

Rust的并发控制相关模块 conurrency:

模块名 说明
std::env 模块 包含与环境变量交互的功能,包括读取、设置和删除环境变量。
std::sync 模块 提供了用于实现线程安全共享状态的同步原语,如互斥锁(Mutex)、原子操作(Atomic)和条件变量(Condvar)。
std::thread 模块 提供了创建和管理线程的功能,包括线程的创建、 join、spawn 和同步。
std::process 模块 提供了与操作系统进程交互的功能,包括运行外部命令、启动新进程以及与进程进行通信。

Rust的内存管理相关模块 memory management:

模块名 说明
std::alloc 模块 提供了内存分配器的功能,包括分配和释放动态内存。
std::convert 模块 提供了用于不同类型之间转换的工具函数。
std::ptr 模块 提供了对指针的操作和转换功能,包括对裸指针的操作。
std::borrow 模块 提供了用于管理借用的功能,包括&&mut借用运算符的实现。
std::default 模块 提供了默认 trait 实现的功能,用于为不提供具体实现的类型提供默认行为。
std::rc 模块 提供了引用计数(Reference Counting)的功能,用于实现线程安全的共享内存。
std::cell 模块 提供了可变性的 Cell 和 RefCell 类型,用于在多线程环境下安全地共享可变状态。
std::mem 模块 提供了与内存相关的功能,包括内存布局、内存对齐和内存操作。
std::clone 模块 提供了用于实现克隆(Clone) trait 的功能,用于复制和克隆复杂的数据结构。
std::pin 模块 提供了 Pin 类型,用于固定借用的生命周期,以避免悬垂指针和数据竞争问题。

Rust的文件系统操作相关模块 File system:

模块名 说明
std::fs 模块 提供了与文件系统操作相关的功能,包括文件和目录的创建、读取、写入和删除等操作。
std::path 模块 提供了与文件路径相关的功能,包括路径的解析、构造和操作。

Rust的数据处理相关模块 data processing:

模块名 说明
std::ascii 模块 提供了与 ASCII 码相关的功能,包括对 ASCII 字符的操作和转换。
std::fmt 模块 提供了格式化输出的功能,包括对各种数据类型的格式化和打印。
std::num 模块 提供了对数字类型的抽象和操作,包括整数、浮点数和复数等。
std::cmp 模块 提供了用于比较和排序值的工具,包括比较运算符的实现和排序函数。
std::hash 模块 提供了用于计算哈希值的功能,包括对各种数据类型的哈希函数实现。
std::ops 模块 提供了一些基本的运算符和操作符的实现,包括数学运算符、比较运算符和逻辑运算符等。
std::iter 模块 提供了迭代器(Iterator)的功能,包括创建和操作迭代器的方法,以及一些常见的迭代器类型。

Rust的错误处理相关模块 Error handling:

模块名 说明
std::error 模块 提供了错误处理的功能,包括定义错误类型和处理错误的方法。
std::panic 模块 提供了恐慌(Panic)机制,用于处理不可恢复的错误情况。
std::option 模块 提供了 Option 类型,用于表示可能存在或不存在的值,用于处理可能出现空值的情况。
std::result 模块 提供了 Result 类型,用于表示成功或失败的情况,通常用于处理可能出现错误的函数返回值。

Rust的编译处理相关模块 compiler:

模块名 说明
std::hint 模块 提供了一些用于编译器提示的宏,用于影响编译器的优化行为。
std::primitive 模块 提供了一些基本的类型和函数,用于处理数字、字符和布尔值等基本数据类型。
std::prelude 模块 包含了一些基本的函数和宏,这些函数和宏在 Rust 标准库中被广泛使用,并且在每个 Rust 程序中自动导入。

Rust的跨语言调用相关模块: FFI

模块名 说明
std::ffi 模块 提供了与外部函数接口(Foreign Function Interface,FFI)相关的功能,用于与其他语言或库进行交互。

Rust的网络处理功能模块 Networking:

模块名 说明
std::net 模块 提供了与网络编程相关的功能,包括网络协议、套接字(Socket)和网络地址等。

Rust的IO处理模块:

模块名 说明
std::io 模块 提供了与输入输出相关的功能,包括文件操作、缓冲、读写数据等。

Rust的OS特定的功能模块:

模块名 说明
std::os 模块 提供了与操作系统相关的功能,包括文件系统操作、进程管理和系统信息等。

Rust的时间处理模块:

模块名 说明
std::time 模块 提供了与时间和日期相关的功能,包括时间的表示、解析、转换和计算等。
查看余下内容

Linux 0.01代码分析:键盘输入字符串到屏幕显示的整个过程

在Linux 0.01 版本中,键盘输入字符串到屏幕显示是通过以下步骤实现的:

  1. 键盘中断处理程序:当用户按下键盘上的键时,硬件会产生一个中断信号,通知操作系统有键盘输入发生。在 Linux 0.01 中,键盘中断处理程序位于 keyboard_interrupt 函数中,它是在 kernel/keyboard.s 文件中定义的。

  2. 中断处理程序的注册:在操作系统启动时,会设置一个中断向量表(interrupt vector table),将键盘中断与相应的处理程序关联起来。在 Linux 0.01 中,这个过程发生在 head.s 文件中的 setup_idt 函数中。

  3. 键盘中断处理程序的执行:当键盘中断发生时,CPU会跳转到键盘中断处理程序的入口地址,即 keyboard_interrupt 函数。在该函数中,将从键盘读取输入字符。

  4. 键盘输入的处理:键盘输入的处理过程包括读取键盘缓冲区中的字符,将其转换为可打印字符,并将其输出到屏幕上。在 keyboard_interrupt 函数中,使用 inb 汇编指令读取键盘缓冲区,并进行相应的处理。

  5. 字符串的显示:在 Linux 0.01 中,字符串的显示是通过调用 BIOS 中断实现的。在 keyboard_interrupt 函数中,使用 int 汇编指令调用 BIOS 中断,将字符显示在屏幕上。

linux0.01的键盘按下到显示到屏幕的流程图

下面是简化的示例代码,展示了 Linux 0.01 中键盘输入字符串到屏幕显示的实现:

# kernel/keyboard.s

# 键盘中断处理程序
keyboard_interrupt:
    pusha               # 保存寄存器状态

    inb $0x60, %al      # 从键盘缓冲区读取字符
    call process_input  # 处理输入字符

    popa                # 恢复寄存器状态
    iret                # 中断返回

# 处理输入字符
process_input:
    cmp $0x01, %al      # 检查是否是按下 Esc 键
    je quit             # 如果是,退出程序

    cmp $0x0E, %al      # 检查是否是按下 Backspace 键
    je backspace        # 如果是,执行退格操作

    cmp $0x0D, %al      # 检查是否是按下 Enter 键
    je newline          # 如果是,换行

    call print_char     # 输出字符到屏幕
    ret

# 输出字符到屏幕
print_char:
    pusha               # 保存寄存器状态

    mov $0x0E, %ah      # 设置显示属性(白底黑字)
    mov $0x0007, %bx    # 设置显示页为 0,光标位置为当前位置

    int $0x10           # 调用 BIOS 中断显示字符

    popa                # 恢复寄存器状态
    ret

# 退格操作
backspace:
    ; 实现退格操作的代码

    ret

# 换行
newline:
    ; 实现换行的代码

    ret

# 退出程序
quit:
    ; 实现退出程序的代码

    ret

请注意,这只是一个简化的示例代码,真实的 Linux 0.01 版本代码更加复杂,包含了更多的功能和细节。此外,这段代码是基于汇编语言编写的,而不是高级编程语言。… 查看余下内容

如何在 PaddleOCR 中设置使用 GPU/CPU计算能力?

paddlepaddle的paddleOCR在安装配置阶段,要选对下载的版本,才能支持GPU模式,否则默认支持的是CPU模式

要在 PaddleOCR 中使用 GPU,您需要遵循几个步骤:

  1. 安装 PaddlePaddle 的 GPU 版本: 确保已安装 PaddlePaddle 的 GPU 版本,其中包括 CUDA 和 cuDNN 支持。你可以按照 PaddlePaddle官方的这个文档中提供的说明进行安装。注意选择对应的CUDA版本、操作系统版本、安装渠道等。

  2. 检查 GPU 可用性: 确保 PaddlePaddle 能正确识别你的 GPU。你可以运行以下代码片段来检查PaddlePaddle是否能检测到你的GPU:

import paddle
gpu_available  = paddle.device.is_compiled_with_cuda()
print("GPU available:", gpu_available)
如果输出为 True,则表示 PaddlePaddle 已检测到 GPU。
  1. 在 PaddleOCR 中设置 use_gpu 标志:在代码或配置文件中,确保将 use_gpu 标志设置为 True,以启用 GPU 的使用。例如,如果您使用的是 PaddleOCR API,可以这样设置:
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_gpu=True)
如果使用配置文件,请在配置文件中将 use_gpu 标志设置为 true。
  1. 在推理过程中检查 GPU 的使用情况: 使用 PaddleOCR 执行推理时,可以使用 nvidia-smi(用于英伟达™(NVIDIA®)GPU)等工具或其他 GPU 监控工具监控 GPU 的使用情况。这将帮助你验证 GPU 是否在推理过程中被使用。

如果您已按照上述步骤操作,但仍遇到 PaddleOCR 使用 CPU 而非 GPU 的问题,则可能是其他因素导致了该问题。请确保您的系统环境和依赖项已正确设置为使用 GPU,并仔细检查是否安装了支持 GPU 的 PaddlePaddle。此外,检查 PaddleOCR 初始化或推理过程中的任何错误信息或警告,因为它们可能提供更多有关问题的信息。… 查看余下内容

【kerneltravel原创】机器学习的paddleOCR的项目经过pyinstaller打包后可执行文件启动报错的原因和解决方式

pyinstaller打包的基于paddleOCR的可执行文件启动报错

很多人的图片转文字功能都采用 paddleOCR项目,为了发布给用户使用,往往要借助pyinstaller等打包工具。使用pyinstaller打包paddleOCR为可执行后,很多开发者遇到,可执行文件启动报错:未找到模块。

网友kerneltravel 综合分析了多个issue和pyinstaller的报错信息后,找到这个问题的原因,并给出了解决方法,同时向paddleOCR官方提交了修复代码(见 PR1PR2 ),以PR2 为准。

下面对这个问题做具体分析:

问题表现:

  1. 打包后,paddleocr应用启动报错信息1:

    Traceback (most recent call last):
    File "main.py", line 5, in
    File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module
    File "paddleocr_init_.py", line 14, in
    File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module
    File "paddleocr\paddleocr.py", line 33, in
    File "importlib_init_.py", line 126, in import_module
    ModuleNotFoundError: No module named 'tools'
    [11752] Failed to execute script 'main' due to unhandled exception!
  2. 启动报错信息2:

    raceback (most recent call last):
    File "yes .py",line 1, in 
    File"PyInstaller\loader pyimod02 importers.py", line 385,in exec moduleFileFile"paddleocrinit .py",line 14,in 
    File"pyInstaller loader pyimod02 importers.py", line 385,in exec module
    File"paddleocr\paddleocr.py",line 34,in 
    File"importlib\ init .py",line 127,in import module
    ModuleNotFoundError: No module named"ppocr'
    [23216] Failed to execute script 'yes' due to unhandled exception!
查看余下内容

提高大型语言模型LLM对于复杂自然语言任务的学习和执行能力的一种思路:RLHF

基于RLHF提升LLM对于复杂自然语言任务的学习和执行能力

RLHF(Reinforcement Learning based Hierarchical Framework),即基于强化学习的分层框架。这种框架结合了强化学习和分层学习的思想,旨在提高智能系统对于复杂任务的学习和执行能力。

LLM(Large Language Model 即大型语言模型),是一种基于机器学习的自然语言处理技术,用于生成自然语言文本或完成自然语言理解任务。

将强化学习的分层框架(RLHF)应用于大型语言模型的研究,这个思路旨在提高大型语言模型对于复杂自然语言任务的学习和执行能力。

现有的哪些研究项目是基于将RLHF应用于LLM的:

基于 RLHF 应用于 LLM 的研究还比较新颖,目前可能还没有太多相关的研究成果。但是,近年来有许多研究探索了将强化学习应用于自然语言处理领域,这些研究可能对于基于 RLHF 应用于 LLM 的研究提供一些启示。

以下是一些基于强化学习应用于自然语言处理领域的研究,可能与基于 RLHF 应用于 LLM 的研究相关:

  • "open-assistant.io": 这个项目处于研发的初期阶段, 目前正参照现有研究将 RLHF 应用于 LLM。

  • "Learning to Communicate with Deep Multi-Agent Reinforcement Learning":这项研究探索了使用深度多智能体强化学习来训练语言模型,使其能够进行自然语言交流。

  • "Dialogue Management with Hierarchical Deep Reinforcement Learning for Conversational Systems":这项研究使用分层深度强化学习来构建对话管理器,用于处理人机对话中的多轮交互。

  • "A Deep Reinforcement Learning Framework for the Financial Portfolio Management Problem":这项研究探索了使用深度强化学习来解决金融投资组合管理问题,其中包括对自然语言数据的处理。

这些研究可能与基于 RLHF 应用于 LLM 的研究有一定的相关性,但也需要更多的研究来探索 RLHF 在 LLM 中的应用。… 查看余下内容

c++代码模块通过vcpkg安装时的报错vcpkg distribution does not have a classic mode instance的原因和解决

vcpkg安装模块的命令举例:

vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static

vcpkg命令报错信息:

Computing installation plan…
error: Could not locate a manifest (vcpkg.json) above the current working directory.
This vcpkg distribution does not have a classic mode instance.

问题原因:

执行以上vcpkg install …… 命令之前,必须需要先cd到项目的c++代码根目录。然后执行vcpkg install …… 安装c++项目依赖的库即可。… 查看余下内容

windows压缩的文件建议用7zip格式而非zip或rar格式,能防止在linux下zip和rar解压后中文文件名乱码问题

windows下压缩文件请用7zip,能防止在linux下压缩包内文件名乱码:

以上结论经过测试验证的。确实如此,windows下压缩的zip和rar包,在win下打开里面文件名(含中文名文件)显示正常,但是在linux下用xarchiver 等软件往往显示为乱码,解压后也是乱码。

而如果在win下用7zip格式压缩的,就不存在以上问题。其他方案还有:在win下压缩的zip格式,如果在linux下用7za(p7zip)软件解压,也不会出现中文名乱码问题。

centos下p7zip的安装方法:

yum install  -y p7zip

ubuntu/debian下的安装方法:

apt-get install -y p7zip

效果对比:

linux下用unrar命令解压出的文件名中文乱码,后面括号内带有“无效的编码”字样,解决方法:

linux下,当使用unrar 解压命令解压来自 windows下压缩的rar 文件时:

unrar x rar文件名

问题表现:

rar压缩文件内的文件名如果是英文,解压后显示正常。如果带有中文,解压缩时中文变成乱码,乱码文件名后面带有(无效的编码)字样。如下图所示:

问题原因:

rar文件在win系统创建,文件名默认使用gb2312编码,而gb2312字符编码在linux下用unrar软件解压后,没有正确解码中文。linux下默认的字符(中文也是一类字符)编码方式是UTF-8。

解决方法:

需要用转码工具convmv进行文件名转码

ubuntu/debian 系统下需要先安装 convmv软件:

sudo apt-get install convmv


然后转码当前目录下的文件名乱码文件名为linux下正常显示的文件名:

convmv * -f gb2312 -t utf8 –notest

注意:

由于unrar的这段处理是2014年之前的情况和解决经验。后来unrar软件版本可能有更新,近几年随着linux系统对中文的支持越来越好,这个rar的问题可能不容易发生了。 如果仍遇到这样的问题,不妨用本文提到的方法解决看。… 查看余下内容

断电/硬重启centos7 导致开机时内核崩溃,无法进入系统,解决方式记录

问题线索

用户反馈断电/硬重启centos7后,开机时出现内核崩溃(如下图),无法进入系统

解决方式记录

后来通过重新升级了一下内核(可借助救援模式的chroot方式+ iso作为软件源+yum方式重新安装内核),解决了这个问题,应该是内核文件坏了。 有一点要改进的,根目录所在分区是 ext3格式的,无法保证断电或硬重启后的数据一致性。 建议换成ext4或者xfs、reiserfs等健壮日志文件系统。

本文是2015年的处理经历。… 查看余下内容

yum update 更新软件的时候如何主动跳过内核软件文件的升级

centos/redhat/fedora升级kernel有时候可能会出现服务器无法启动,所以建议您在用yum update方式升级系统软件补丁时排除内核升级。

打开/etc/yum.conf

sudo vim   /etc/yum.conf

在这个文件的[main]段中,下添加一行,如下:

exclude=kernel*

就可以跳过内核升级步骤

生产环境下如果内核必须升级,可以考虑找一台软件硬件配置一样的服务器先测试升级内核( 去掉上面的exclude…配置,然后命令 yum update kernel*),成功后再到生产环境升级内核。… 查看余下内容

下一页 »
加好友请备注:chinaoss
您可以在微信公众号联系我们
我们将24小时内回复。
取消