我不会想到实现这个结果会如此困难,这正是我想要从我的设置中获得的输出。
我使用 LUKS(所以我的系统是加密的)和 LVM。
我不想显示 sda,因为那是我的根文件系统所在的地方,也是我的根设备。该解决方案也适用于没有 LUKS 或 LVM 的系统,这意味着它必须处理所有场景。
我在 Debian 12.x 上,如果可能的话,我想在一行命令中显示所有主要设备,除了我的根设备,无论它是否是 LVM、LUKS 等。
命令应该灵活,如果可能的话,我不想使用固定的规格*--vg-root
等。
@bertieb 评论: 从添加的输出来看,似乎根挂载点位于设备上加密卷的卷组中,并显示为 sda - OP 希望省略整个设备和所有相关块“设备”?即删除根卷组和交换、crypt、包含分区(sda3)以及其他分区,最后是设备(sda)
这应该是我的结果,因此所有主要设备均不需要, sda
因为这是我的根设备,我的根文件系统位于其中/
,并且不需要我指定详细信息,所以我也可以在其他设备/系统上使用它,无论是 LVM、LUKS 等,而不需要知道根叫什么,或者 UUID 是什么,等等。
我不想看到分区,只想看到没有根设备的主设备,就像在这个命令中lsblk -d -o NAME,SIZE --sort SIZE
这是我需要的输出:
没有 sda(因为它是包含我的根文件系统 / 的根设备)
仅显示主要设备(无论有多少个)
不包含来自其他设备的分区
我不知道该如何更好地解释它。
我需要的结果:
NAME SIZE
nvme0n1 238.5G
我的设置:
$ lsblk -d -o NAME,SIZE --sort SIZE
NAME SIZE
sda 57,3G
nvme0n1 238,5G
$ lsblk -fs -o NAME
# ROOT DEVICE
sda1
`-sda
sda2
`-sda
desktop--vg-root
`-sdb3_crypt
`-sda3
`-sda
...
...
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 1 57,3G 0 disk
├─sda1 8:1 1 512M 0 part /boot/efi
├─sda2 8:2 1 488M 0 part /boot
└─sda3 8:3 1 56,3G 0 part
└─sdb3_crypt 254:0 0 56,3G 0 crypt
├─desktop--vg-root 254:1 0 55,3G 0 lvm /
└─desktop--vg-swap_1 254:2 0 980M 0 lvm [SWAP]
nvme0n1 259:0 0 238,5G 0 disk
└─nvme0n1p1 259:1 0 238,5G 0 part /user/backup
我不想要那个,例如/dev/mapper/desktop--vg-root
,,不sdb3_crypt
。sda3
sda
但是从这个例子来看sda
,这是根设备,我不需要输出中的这个设备。
不幸的是,这两个答案都未能解决我的问题。
我的设备,我的设置:
NAME SIZE
sda 57.3G
|-sda1 512M
|-sda2 488M
`-sda3 56.3G
`-sdb3_crypt 56.3G
`-desktop--vg-swap_1980M
nvme0n1 238.5G
`-nvme0n1p1 238.5G
我需要的结果:
NAME SIZE
nvme0n1 238.5G
系统设置Debian、lsblk和其他信息:
Operating System: Debian GNU/Linux 12 (bookworm)
Kernel: Linux 6.1.0-22-amd64
Architecture: x86-64
lsblk from util-linux 2.38.1
$ apt-get install --only-upgrade util-linux
util-linux is already the newest version (2.38.1-5+deb12u3)
来自@terdon结果:
mylsblk(){ lsblk -o NAME,SIZE,MOUNTPOINT | awk '$NF!="/"{printf "%-15s%-10s\n", $1,$2}'; }
NAME SIZE
sda 57.3G
|-sda1 512M
|-sda2 488M
`-sda3 56.3G
`-sdb3_crypt 56.3G
`-desktop--vg-swap_1980M
nvme0n1 238.5G
`-nvme0n1p1 238.5G
$ lsblk -o NAME,SIZE,MOUNTPOINT
NAME SIZE MOUNTPOINT
sda 57.3G
|-sda1 512M /boot/efi
|-sda2 488M /boot
`-sda3 56.3G
`-sdb3_crypt 56.3G
|-desktop--vg-root 55.3G /
`-desktop--vg-swap_1 980M [SWAP]
nvme0n1 238.5G
$ lsblk -o NAME,SIZE,MOUNTPOINT | awk '$NF!="/"{printf "%-15s%-10s\n", $1,$2}';
NAME SIZE
sda 57.3G
|-sda1 512M
|-sda2 488M
`-sda3 56.3G
`-sdb3_crypt 56.3G
`-desktop--vg-swap_1980M
nvme0n1 238.5G
$ lsblk -o NAME,SIZE,MOUNTPOINT | awk '$NF=="/"'
|-desktop--vg-root 55.3G /
来自Chris Davies 的结果:
Root partition: mapper/desktop--vg-root
Root device:
NAME SIZE
sda 57.3G
nvme0n1 238.5G
来自@muru:
lsblk -d $(findmnt -no source /)
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
desktop--vg-root 254:1 0 55,3G 0 lvm /
我建议使用以下 shell 脚本 (我们称之为
lsblk_without_root_parent.sh
):运行如下
更新:上面的脚本打印了完整的树(减去从根的顶级父节点开始的子树)。由于您只想打印顶级设备,因此最后一条语句可以简化为
解释
该脚本用于
findmnt
确定哪个文件系统被挂载为/
。然后,它使用 的
-s
标志lsblk
打印从根文件系统设备开始的“逆设备树”,以确定其顶级父级,即 的输出的最后一行lsblk -l -n -s
。我们将输出限制为仅设备名称。如果您只想打印顶级设备,则输出
lsblk -d
将被反向过滤,grep
以删除以“根顶级父级”开头的行。另一方面,如果您想要获得完整的树输出(减去从根的顶级父级开始的子树),
awk
则使用程序来过滤常规lsblk
输出:p=1
)。p
标志设置为 0 以抑制打印。|
或空格开头(这表明我们仍在打印根的顶级父级的子设备),则打印将再次打开。这是一个可行的方法。确定根分区。然后识别其设备。最后将其从设备列表中排除。
如果根目录位于间接文件系统(例如 LVM、LUKS 或 RAID)上,则可能无法正常工作。我手边没有可以测试的系统