如何从 losetup -a 中删除长度限制

如何从 losetup -a 中删除长度限制

我正在使用 losetup -a 来查看我的循环设备,但它有长度限制(62 个字符)。所以我无法确定我真正想要哪个循环设备。

前任:

[root@r7byach]# losetup -a 
/dev/loop0: [fc03]:33030504 (/storage5_vol1/6/ABCD116476-linux-ubuntu-10_04-64b-base-07150/*)
/dev/loop1: [0015]:4933 (/storage4/5/ABCD12345-linux-centos-5-64b-base-86836/hdc)

我可以使用 /dev/loop1 获取输出

losetup -a|grep diskPath |cut -f1 -d:|cut -f3 -d/

但我无法在 Loop0 上获取该设备,因为该名称不完全限定。

无论大小如何限制,如何获取循环设备?

答案1

从内核2.6.37开始,您可以通过 查找底层文件的名称(无长度限制)/sys/block/loopX/loop/backing_file。该losetup命令从 util-linux 2.19 开始支持此方法。

答案2

对于最新的内核 (≥ 2.6.37),请参阅彼得·乌泽尔的回答。对于较旧的内核,此长度限制是固有的。

strace显示losetup -a通过获取名称LOOP_GET_STATUSioctl,它调用loop_get_status_old,它从a获取数据struct loop_info。该内核数据结构中的名称字段仅限于LO_NAME_SIZE= 64 字节。 (还有一个loop_get_status64struct loop_info64,但它们有相同的限制。)所以这个限制是固有的,你不能做得更好。

无论如何,该数据结构显示底层设备或文件的原始名称,但您可以重命名它(甚至删除它),这不会反映在losetup.

的输出显示文件的losetup文件系统标识符 ( st_dev) 和 inode ( ),例如。您可以通过在(以 开头的行)中查找来找到文件系统的块设备。然后在 中查找该块设备的挂载点。然后运行找到该文件。是的,这很复杂,而且不,没有更快的方法(嗯,有st_ino[fc03]:33030504/proc/partitions252 3/proc/mountsfind /mount/point -inum 33030504debugfs对于某些文件系统类型)。

相关内容