我正在使用 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_STATUS
ioctl,它调用loop_get_status_old
,它从a获取数据struct loop_info
。该内核数据结构中的名称字段仅限于LO_NAME_SIZE
= 64 字节。 (还有一个loop_get_status64
和struct loop_info64
,但它们有相同的限制。)所以这个限制是固有的,你不能做得更好。
无论如何,该数据结构显示底层设备或文件的原始名称,但您可以重命名它(甚至删除它),这不会反映在losetup
.
的输出显示文件的losetup
文件系统标识符 ( st_dev
) 和 inode ( ),例如。您可以通过在(以 开头的行)中查找来找到文件系统的块设备。然后在 中查找该块设备的挂载点。然后运行找到该文件。是的,这很复杂,而且不,没有更快的方法(嗯,有st_ino
[fc03]:33030504
/proc/partitions
252 3
/proc/mounts
find /mount/point -inum 33030504
debugfs
对于某些文件系统类型)。