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

一、问题描述

某次挂载本地磁盘镜像为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)

二、处理过程

2.1、手动新建,执行:

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

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

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

2.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 5
do
  mknod /dev/loop$i $major $i
done

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

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.xz

depmod   //输出如下
depmod: ERROR: could not open directory /lib/modules/3.10.0-229.el7.x86_64: No such file or directory
depmod: FATAL: could not search modules: No such file or directory


modprobe -c|grep loop  //查看 modules 的配置文件,输出如下
alias block_major_7_* loop
alias char_major_10_237 loop
alias devname:loop_control loop
alias nvmet_transport_254 nvme_loop
alias symbol:loop_register_transfer loop
alias symbol:loop_unregister_transfer loop

#列出内核中所有已经或者未挂载的所有模块,l参数已失效
modprobe -l

modinfo loop  //查看模块的信息,如下可看到模块与内核版本还是对不上
filename:       /lib/modules/3.10.0-229.el7.x86_64/kernel/drivers/block/loop.ko.xz
alias:          devname:loop-control
alias:          char-major-10-237
alias:          block-major-7-*
license:        GPL
rhelversion:    7.4
srcversion:     CBC8A49D084BCADAFE1EB31
depends:        
intree:         Y
vermagic:       3.10.0-693.11.6.el7.x86_64 SMP mod_unload modversions 
signer:         Red Hat Enterprise Linux kernel signing key
sig_key:        9D:B6:7B:36:5D:13:DF:D3:C4:AB:AA:65:4A:99:96:D2:EF:C9:3E:0E
sig_hashalgo:   sha256
parm:           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.xz
kernel/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.xz
kernel/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.xz
kernel/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.xz

rpm -qa|grep kernel  //系统安装的内核版本,输出如下
kernel-3.10.0-693.11.6.el7.x86_64

uname -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查看。

1、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.modules
modprobe -- ip_tables
modprobe -- iptable_filter

chmod 755 /etc/sysconfig/modules/iptables.modules   #设置权限
sh /etc/sysconfig/modules/iptables.modules     #临时生效

猜你喜欢

转载自blog.csdn.net/ximenjianxue/article/details/128107165
今日推荐