在 Ubuntu 中,我已将原始磁盘 .img 文件安装为循环设备,其中包含安装了 Ubuntu 的 LUKS 加密 LVM。
它的安装方式如下:(输出来自lsblk -o NAME,PKNAME,KNAME,FSTYPE,SIZE /dev/loop0
NAME PKNAME KNAME FSTYPE SIZE
loop0 loop0 240G
├─loop0p1 loop0 dm-11 ext4 487M
├─loop0p2 loop0 dm-12 1K
└─loop0p5 loop0 dm-13 crypto_LUKS 239.5G
└─cloneluks dm-13 dm-14 LVM2_member 239.5G
├─ubuntuclone-lv_swap dm-14 dm-15 8G
└─ubuntuclone-lv_root dm-14 dm-16 ext4 231.5G
当我给出已安装的 LV 名称时,是否有任何命令可以在脚本中用于返回根“块设备”(我不确定这是否是正确的术语)?
我希望它能lsblk -no pkname /dev/ubuntuclone/lv_root
起作用,但它什么也没输出——使用kname
会给我dm-16
。
我想去loop0
。
我也看到了这个答案,暗示我可以使用"$(basename "$(readlink -f /dev/VG/LV)")"
,但我不知道如何使用它:
dev=/dev/ubuntuclone/lv_root ; echo "$(basename "$(readlink -f $dev)")"
输出dm-16
。
我不知道如何“超越” crypto_LUKS 容器。
这就是我所寻找的:
输入:
/dev/ubuntuclone/lv_root
或者ubuntuclone-lv_root
我希望获得输出:
/dev/loop0
谢谢。
编辑:我认为使用lsblk --json | jq
可能正是我想要的,但我在制定正确的咒语时遇到了很多麻烦jq
......
您可以使用它
--inverse
来以相反的顺序获取设备的依赖关系:有了它,您可以添加
--list
扁平化“树”结构,然后使用它tail -1
来打印最后一行。因此,对于您的情况,完整的命令如下所示:我的“专业”意见是,jq 对于这项任务来说有些过度,Vojtech Trefny 的答案中提供的简单管道才是最佳选择,除非您有其他因素促使您使用 JSON。不过既然您问了,这里有一种方法可以做到:
(jq 程序中的换行符只是为了方便阅读,可以省略)
这里的策略基本上是:
($path | ltrimstr("/dev/") | gsub("/"; "-")) as $name
:通过删除前缀并将所有内容替换为,将输入路径从转换--arg path <path>
为块设备名称(作为奖励,您可以传递块设备名称而不是路径,并且这部分将是无操作,因此它仍然有效)/dev/
/
-
.blockdevices[]
:将顶层blockdevices
数组拆分成单个元素,以便进一步处理select(any(.. | objects | select(.name == $name)))
:在这些元素中,仅选择一个(理论上应该只有一个,但如果有多个,程序将全部发出它们),该元素在其层次结构中的某个位置包含一个 JSON 对象,该对象的字段值与步骤 1 中的name
值匹配$name
"/dev/\(.name | gsub("-"; "/"))"
:提取name
每个选定元素顶层的字段,并将该设备名称转换回路径。请注意,这假设-
块设备名称中出现的任何字符都应转换回路径,以获取路径,这在您的示例中显然是正确的(名称中/
没有s ),但如果您发现情况并非如此,则必须相应地调整逻辑。-
loop0
这有可能变得更有效率,或者至少更短;一旦我发现了有效的方法,我就不会考虑对其进行优化。