AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 793601
Accepted
localhost
localhost
Asked: 2025-04-11 16:36:26 +0800 CST2025-04-11 16:36:26 +0800 CST 2025-04-11 16:36:26 +0800 CST

如何获取包含 LUKS 加密逻辑卷的循环设备的名称

  • 772

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

lvm
  • 2 2 个回答
  • 346 Views

2 个回答

  • Voted
  1. Best Answer
    Vojtech Trefny
    2025-04-11T17:10:33+08:002025-04-11T17:10:33+08:00

    您可以使用它--inverse来以相反的顺序获取设备的依赖关系:

    $ lsblk --inverse /dev/test/lvol0
    NAME        MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS
    test-lvol0  252:2    0   12M  0 lvm   
    └─a         252:1    0   83M  0 crypt 
      └─loop0p1 259:1    0   99M  0 part  
        └─loop0   7:0    0  100M  0 loop
    

    有了它,您可以添加--list扁平化“树”结构,然后使用它tail -1来打印最后一行。因此,对于您的情况,完整的命令如下所示:

    $ lsblk /dev/test/lvol0 --inverse --list -o PATH | tail -1
    /dev/loop0
    
    • 6
  2. David Z
    2025-04-12T04:51:25+08:002025-04-12T04:51:25+08:00

    我的“专业”意见是,jq 对于这项任务来说有些过度,Vojtech Trefny 的答案中提供的简单管道才是最佳选择,除非您有其他因素促使您使用 JSON。不过既然您问了,这里有一种方法可以做到:

    $ lsblk --json | jq --arg path "/dev/ubuntuclone/lv_root" -r '
      ($path | ltrimstr("/dev/") | gsub("/"; "-")) as $name
      | .blockdevices[]
      | select(any(.. | objects | select(.name == $name)))
      | "/dev/\(.name | gsub("-"; "/"))"
    '
    /dev/loop0
    

    (jq 程序中的换行符只是为了方便阅读,可以省略)

    这里的策略基本上是:

    1. ($path | ltrimstr("/dev/") | gsub("/"; "-")) as $name:通过删除前缀并将所有内容替换为,将输入路径从转换--arg path <path>为块设备名称(作为奖励,您可以传递块设备名称而不是路径,并且这部分将是无操作,因此它仍然有效)/dev//-
    2. .blockdevices[]:将顶层blockdevices数组拆分成单个元素,以便进一步处理
    3. select(any(.. | objects | select(.name == $name))):在这些元素中,仅选择一个(理论上应该只有一个,但如果有多个,程序将全部发出它们),该元素在其层次结构中的某个位置包含一个 JSON 对象,该对象的字段值与步骤 1 中的name值匹配$name
    4. "/dev/\(.name | gsub("-"; "/"))":提取name每个选定元素顶层的字段,并将该设备名称转换回路径。请注意,这假设-块设备名称中出现的任何字符都应转换回路径,以获取路径,这在您的示例中显然是正确的(名称中/没有s ),但如果您发现情况并非如此,则必须相应地调整逻辑。-loop0

    这有可能变得更有效率,或者至少更短;一旦我发现了有效的方法,我就不会考虑对其进行优化。

    • 3

相关问题

  • 修改 LVM 时未更新 LVM 快照

  • grub2-mkconfig 没有生成正确的挂载路径(以及如何摆脱不再使用的额外内核?)

  • lvm 和一个分区问题

  • 调整设备 /dev/sdb 上的 LVM 物理卷的大小

  • 以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve