AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 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

Como obter o nome do dispositivo de loop que contém um volume lógico criptografado por LUKS

  • 772

No Ubuntu, montei um arquivo .img de disco bruto como um dispositivo de loop que contém um LVM criptografado por LUKS com uma instalação do Ubuntu nele.

É montado assim: (a saída é delsblk -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

Existe algum comando que eu possa usar em um script para retornar o "dispositivo de bloco" raiz (não tenho certeza se esse é o termo correto) quando eu dou o nome do LV montado?

Eu esperava que isso lsblk -no pkname /dev/ubuntuclone/lv_rootfuncionasse, mas não gera nada - usar knameme dá dm-16.

Eu quero chegar a loop0.

Também vi esta resposta que sugeria que eu poderia usar "$(basename "$(readlink -f /dev/VG/LV)")", mas não consegui descobrir como usá-la:

 dev=/dev/ubuntuclone/lv_root ; echo "$(basename "$(readlink -f $dev)")"

saídas dm-16.

Não consigo descobrir como "passar" pelo contêiner crypto_LUKS.

É isso que estou procurando:

para entrada:

/dev/ubuntuclone/lv_rootouubuntuclone-lv_root

Gostaria de obter a saída:

/dev/loop0

Obrigado.

editar: Acho que usar lsblk --json | jqpode ser exatamente o que eu quero, mas estou tendo muita dificuldade em descobrir os encantamentos corretos para jq...

lvm
  • 2 2 respostas
  • 346 Views

2 respostas

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

    Você pode usar --inversepara obter as dependências em ordem reversa para um dispositivo:

    $ 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
    

    Com isso, você pode adicionar --listpara achatar a estrutura em "árvore" e usar apenas tail -1para imprimir a última linha. Então, no seu caso, o comando completo ficaria assim:

    $ 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

    Minha opinião "profissional" é que jq é um exagero para essa tarefa e o pipeline simples na resposta do Vojtech Trefny é a melhor opção, a menos que você tenha algum fator extra que o incentive a usar JSON. Mas já que você perguntou, aqui está uma maneira de fazer isso:

    $ 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
    

    (quebras de linha no programa jq são apenas para legibilidade e podem ser omitidas)

    A estratégia aqui é basicamente:

    1. ($path | ltrimstr("/dev/") | gsub("/"; "-")) as $name: Transforme o caminho de entrada, de --arg path <path>, em um nome de dispositivo de bloco removendo o /dev/prefixo e substituindo tudo /por -(como bônus, você pode passar o nome do dispositivo de bloco em vez de um caminho e esta parte será uma operação sem efeito, então ainda deve funcionar)
    2. .blockdevices[]: Dividir a matriz de nível superior blockdevicesem elementos individuais para processamento posterior
    3. select(any(.. | objects | select(.name == $name))):Entre esses elementos, selecione apenas aquele (teoricamente deve haver apenas um, mas se houver vários, o programa emitirá todos) que, em algum lugar em sua hierarquia, contém um objeto JSON com um namecampo cujo valor corresponde $nameao da etapa 1
    4. "/dev/\(.name | gsub("-"; "/"))": Extraia o namecampo no nível superior de cada elemento selecionado e converta o nome do dispositivo de volta para um caminho. Observe que isso pressupõe que qualquer elemento -presente no bloco "nome do dispositivo" deva ser convertido novamente para "a" /para obter o caminho, o que é trivialmente verdadeiro no seu exemplo (não há -"s" no nome loop0), mas se você encontrar uma situação em que isso não seja verdade, terá que adaptar a lógica de acordo.

    É possível que isso pudesse ser um pouco mais eficiente ou pelo menos mais curto; não pensei em otimizá-lo depois que encontrei algo que funcionasse.

    • 3

relate perguntas

  • Instantâneo do LVM não atualizando quando o LVM é modificado

  • grub2-mkconfig não está gerando caminhos de montagem corretos (e também como faço para me livrar de kernels extras que não uso mais?)

  • lvm e uma questão de particionamento

  • Redimensionando um volume físico LVM no dispositivo /dev/sdb

  • snap /dev/loop em 100% de utilização -- sem espaço livre

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve