iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >Centos 7.1找不到/dev/loop0问题排查处理过程
  • 264
分享到

Centos 7.1找不到/dev/loop0问题排查处理过程

centoslinux服务器loop内核升级 2023-09-05 19:09:56 264人浏览 泡泡鱼
摘要

一、问题描述 某次挂载本地磁盘镜像为loop时,系统报错:failed to setup loop device,且/dev/目录找不到loop0设备文件,如下所示: sudo mount -o lo

一、问题描述

某次挂载本地磁盘镜像为loop时,系统报错:failed to setup loop device,且/dev/目录找不到loop0设备文件,如下所示:

sudo mount -o loop ./Centos-7.5-x86_64-DVD-1804.iso /mnt/cdrom  //报错mount: ./CentOS-7.5-x86_64-DVD-1804.iso: failed to setup loop device: No such file or directory

在这里插入图片描述
在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者说是仿真设备,我们又叫它为循环接口文件,它能使我们像块设备一样访问一个文件。在使用之前,一个 loop 设备必须要和一个文件进行连接。这种结合方式给用户提供了一个替代块特殊文件的接口。因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来。

这种文件格式,我们经常见到的是 CD 或 DVD 的 ISO 光盘镜像文件或者是软盘(硬盘)的 *.img 镜像文件。通过这种 loop mount (回环mount)的方式,我们可这些镜像文件 mount 到当前文件系统的一个目录下,从而读取镜像中内容。

loop 含义:对于第一层文件系统,它直接安装在我们计算机的物理设备之上;而对于这种被 mount 起来的镜像文件(它也包含有文件系统),它是建立在第一层文件系统之上,这样看来,它就像是在第一层文件系统之上再overlay了一层文件系统,所以称为 loop,而在linux系统里,用块文件模拟了该接口,Centos上默认有0-7个这样的设备。正常系统一般显示如下:

在这里插入图片描述

现场环境:CentOS Linux release 7.1.1503 (Core)

二、处理过程

1、手动新建,执行:

mknod -m 666 /dev/loop0 b 7 0 #实际验证无效chown :disk /dev/loop0#附:批量chown :disk --reference=/dev/loop0 /dev/loop*

2、尝试手动先将镜像装入loop,在挂载loop伪设备

losetup -a  #查看当前loop设备使用情况,返回当前已经使用的所有环回设备,即先查看一下哪些是空闲的sudo losetup -f  #自动查找空闲的设备,返回第一个未使用的环回设备#新建一个loopdd if=/dev/zero of=test.img bs=5M count=1000  #新建5g的imglosetup /dev/loop0 ./CentOS-7.5-x86_64-DVD-1804.isomount /dev/loop0 /mnt/cdrom#实际等同于mount -o loop /./CentOS-7.5-x86_64-DVD-1804.iso /mnt/cdromsudo mount /root/CentOS-7.5-x86_64-DVD-1804.iso /mnt/cdrom -o loop=/dev/loop0#卸载umount /mnt/cdromlosetup -d /dev/loop0

3、报错 'no such device’可能是因为超过了可用loop device设备的最大限制,修改配置文件

vi /etc/modprobe.conf //现场检查未发现该文件,相关资料显示Linux默认没有生成这个文件,我们可自定义该文件的内容,直接创建该文件,或者在/etc/modprobe.d目录中创建相应的配置文件即可;另外/etc/modules.conf (kernel 2.4.x),2.6之后才是modprobe.conf;modprobe是kmod的一部分,该二进制文件实现了用于管理Linux内核模块的多个程序。内核模块存储在/lib/modules/目录中,只有具有管理特权的用户才能管理内核模块。要加载模块,可借用modprobe命令调用加载,后跟模块名称:modprobe module_name;modprobe命令将加载指定的模块和模块依赖项,且只支持一次调用一个;modprobe -r module_name删除模块;
在这里插入图片描述
在这里插入图片描述

添加以下内容:options loop max_loop=10;完成后重启OS或modprobe -v loop,因生产环境现场未验证,请验证的小伙伴留言确认,多谢。

modprobe loop  # This may not be necessary, depending on your kernel build but is harmless.major=$(grep loop /proc/devices | cut -c3)for index in 0 1 2 3 4 5do  mknod /dev/loop$i $major $idone

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

find /lib/modules/3.10.0-693.11.6.el7.x86_64/ -name *loop*  //输出如下/lib/modules/3.10.0-693.11.6.el7.x86_64/kernel/drivers/block/loop.ko.xz/lib/modules/3.10.0-693.11.6.el7.x86_64/kernel/drivers/nvme/target/nvme-loop.ko.xz/lib/modules/3.10.0-693.11.6.el7.x86_64/kernel/drivers/nvme/target/nvme-fcloop.ko.xz/lib/modules/3.10.0-693.11.6.el7.x86_64/kernel/drivers/target/loopback/lib/modules/3.10.0-693.11.6.el7.x86_64/kernel/drivers/target/loopback/tcm_loop.ko.xz/lib/modules/3.10.0-693.11.6.el7.x86_64/kernel/sound/drivers/snd-aloop.ko.xzdepmod   //输出如下depmod: ERROR: could not open directory /lib/modules/3.10.0-229.el7.x86_64: No such file or directorydepmod: FATAL: could not search modules: No such file or directorymodprobe -c|grep loop  //查看 modules 的配置文件,输出如下alias block_major_7_* loopalias char_major_10_237 loopalias devname:loop_control loopalias nvmet_transport_254 nvme_loopalias symbol:loop_reGISter_transfer loopalias symbol:loop_unregister_transfer loop#列出内核中所有已经或者未挂载的所有模块,l参数已失效modprobe -lmodinfo loop  //查看模块的信息,如下可看到模块与内核版本还是对不上filename:       /lib/modules/3.10.0-229.el7.x86_64/kernel/drivers/block/loop.ko.xzalias:          devname:loop-controlalias:          char-major-10-237alias:          block-major-7-*license:        GPLrhelversion:    7.4srcversion:     CBC8A49D084BCADAFE1EB31depends:        intree:         Yvermagic:       3.10.0-693.11.6.el7.x86_64 SMP mod_unload modversions signer:         Red Hat Enterprise Linux kernel signing keysig_key:        9D:B6:7B:36:5D:13:DF:D3:C4:AB:AA:65:4A:99:96:D2:EF:C9:3E:0Esig_hashalGo:   sha256parm:           max_loop:Maximum number of loop devices (int)parm:           max_part:Maximum number of partitions per loop device (int)less modules.dep|grep loop  //自动生成后,检查按如下kernel/drivers/block/loop.ko.xz:kernel/drivers/nvme/target/nvme-loop.ko.xz: kernel/drivers/nvme/target/nvmet.ko.xz kernel/drivers/nvme/host/nvme-fabrics.ko.xz kernel/drivers/nvme/host/nvme-core.ko.xzkernel/drivers/nvme/target/nvme-fcloop.ko.xz: kernel/drivers/nvme/host/nvme-fc.ko.xz kernel/drivers/nvme/target/nvmet-fc.ko.xz kernel/drivers/nvme/target/nvmet.ko.xz kernel/drivers/nvme/host/nvme-fabrics.ko.xz kernel/drivers/nvme/host/nvme-core.ko.xzkernel/drivers/target/loopback/tcm_loop.ko.xz: kernel/drivers/target/target_core_mod.ko.xz kernel/lib/crc-t10dif.ko.xz kernel/crypto/crct10dif_common.ko.xzkernel/sound/drivers/snd-aloop.ko.xz: kernel/sound/core/snd-pcm.ko.xz kernel/sound/core/snd-timer.ko.xz kernel/sound/core/snd.ko.xz kernel/sound/soundcore.ko.xzrpm -qa|grep kernel  //系统安装的内核版本,输出如下kernel-3.10.0-693.11.6.el7.x86_64uname -r   //当前加载使用的内核,输出如下3.10.0-229.el7.x86_64

在这里插入图片描述
在这里插入图片描述

正常环境显示如下:执行depmod无输出
在这里插入图片描述
在这里插入图片描述

综上,本次loop模块加载失败原因为内核版本升级后,不匹配导致的无法找到模块路径所致;检查grub启动文件(etc/grub2.cfg,找到menuentry的序号,从上倒下从0开始编号),当前启动内核就是:3.10.0-693.11.6.el7.x86_64

在这里插入图片描述
在这里插入图片描述
因时间问题,这里拜请路过的大佬,上述问题该如何处理修正,还请不吝赐教!!!

查看加载启动默认的系统:
在这里插入图片描述
在else set default下新增set default=“2”,完成后重启验证;

三、附录

1)losetup命令用法:

losetup [ -e encryption ] [ -o offset ] loop_device file
losetup [ -d ] loop_device

说明:此命令用来设置循环设备。循环设备可把文件虚拟成块设备,籍此来模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用。

参数说明:

-e 表示加密的方式
-o 设置数据偏移量
-d 卸载设备
loop_device 循环设备名,在 linux 下如 /dev/loop0 , /dev/loop1 等。
file 要与循环设备相关联的文件名,这个往往是一个磁盘镜象文件,如 *.img

2)如果要防止在启动时加载内核模块,请在/etc/modprobe.d中创建一个名称任意的.conf文件。 语法为:

/etc/modprobe.d/blacklist.conf //内容格式如下

blacklist module_name

3)加载内核驱动模块有两种方式,一种是通过insmod,一种是 modprobe,后者的好处 是他可以检测对应驱动模块的依赖项,但是,在使用中发现,使用modprobe经常提示指定目录下无法找到该驱动模块,但实际上该目录下已有该文件。modprobe是在/lib/module/uname -r下寻找加载的模块的,并且modprobe需要一个最新的modules.dep文件,这个modules.dep文件内容是些各个模块之间的依赖等信息,此文件是由depmod命令来更新的,执行man modprobe查看。

insmod:需指定到对应驱动模块的目录下,目录可以不固定, 加载模块时需带 后缀,如:

先cd到ixgbe.ko驱动模块的路径
再执行:insmod ixgbe.ko

2、modprobe:需将对应驱动模块拷贝到系统指定目录,目录固定,加载模块时不要带后缀, 如:

先将驱动模块拷贝到:/lib/modules/($uname -a)/目录下(可以使用该命令随便加载一个不存在的模块,会提示该目录);
再执行:modprobe ixgbe

使用modprobe加载驱动模块的好处是同步能加载相关依赖性; depmod 命令用于分析可载入模块的相依性。

4)modprobe模块加载永久生效

CentOS Linux release 8.5.2111下在/etc/sysconfig/modules/下创建个xxx.modules文件,然后设置755权限

cat /etc/sysconfig/modules/iptables.modulesmodprobe -- ip_tablesmodprobe -- iptable_filterchmod 755 /etc/sysconfig/modules/iptables.modules   #设置权限sh /etc/sysconfig/modules/iptables.modules     #临时生效

来源地址:https://blog.csdn.net/ximenjianxue/article/details/128107165

--结束END--

本文标题: Centos 7.1找不到/dev/loop0问题排查处理过程

本文链接: https://www.lsjlt.com/news/395893.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作