我有一个标准的 ubuntu 加密 lvm 设置。/dev/sda3
使用 LUKS 加密。在 LUKS 容器内部是一个 LVM ( at /dev/mapper/dm_crypt-0
),在该 LVM 内部是一个从 挂载到 的文件/dev/ubuntu-vg/ubuntu-lv
系统/
如何在 bash 中将已知的挂载点转换/
为/dev/sda3
一行,最好无需 root?如果可以实现此目的,我很乐意安装一个单独的实用程序。
我已经想办法df|tail -n +2|cut -f 1 -d
抓住我了/dev/mapper/ubuntu--vg-ubuntu--lv
,但我该如何摆脱呢/dev/sda3
?
可能有一种更简单、更有效的方法来做到这一点,但我能够使用
lsblk
、grep
和 来实现您想要的,并且awk
不需要 root 访问权限。太长了;博士
让我们将其分解并使用测试虚拟机作为示例,Ubuntu 22.04.3 Server。从 的输出开始
lsblk
。正如您所看到的,您想要的所有信息都在那里。它显示了挂载点和沿树向上到达的路径/dev/sda3
。挑战在于如何解析此输出以获取/dev/sda3
来自安装点的路径/
。幸运的是,
lsblk
有一个-o
选项允许您提供要打印的列列表。这显示可以使用grep
和解析的附加信息awk
。查看lsblk --help
完整列表。首先,我选择了MOUNTPOINT
and ,但稍后PKNAME
我也会使用PATH
and 。KNAME
1.找到
PKNAME
for挂载点:/
以下行打印与挂载点关联的
MOUNTPOINT
和:PKNAME
/
用于
awk
打印第二列 并将其分配PKNAME
给变量:2. 找到
PKNAME
上一个的PKNAME
再次使用
lsblk
,这次与PATH
、PKNAME
和KNAME
作为列。用于grep
查找包含 值的行$pkname
:这会产生两个匹配项,但我们只想要一个与
$pkname
第三列(即 )匹配的匹配项KNAME
。PKNAME
必须包含第二列,因为这是需要的下一个值。再次使用
awk
来获取该值,并将其重新分配给您的变量:3. 找到
PATH
上一个的PKNAME
用于
lsblk
显示PATH
和KNAME
列,grep
查找匹配行,并awk
打印第一列,PATH
:最后,将所有命令组合在一起,并用分号分隔。
unset
为了完整起见,请在末尾添加 来清除变量$pkname
。这就是您不需要 root 访问权限的单行代码。