为什么在Ubuntu 18.04中,所有的快照都被挂载并列为块设备或分区?

截至Ubuntu 18.04运行lsblk显示16个快照循环(每个快照2-3次)。问题是,为什么它们会被列为lsblk、fdisk-l和blkid的结果?
这给我需要查看的实际磁盘驱动分区带来了很多混乱,即/dev/分区。我知道有一个据称是这个问题的重复,但它只问为什么每个快照都列出了三个循环。我想知道为什么首先会列出这些快照,而据称的重复并没有回答这个问题(也许那些将其标记为重复的人可以通过解释为什么它是重复来帮助我)。从技术上讲,它们符合文件系统的条件(我既没有创建也没有要求),但它们妨碍了我对/dev/分区的信息输出。当fdisk -l输出一个超过三页的列表,主要是快照时,这就成为了一个问题。
这是最近(1周前)安装的Ubuntu的输出,我没有安装任何快照。
$ lsblk  
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT  
loop0    7:0    0  14.5M  1 loop /snap/gnome-logs/37  
loop1    7:1    0   2.3M  1 loop /snap/gnome-calculator/170  
loop2    7:2    0  86.6M  1 loop /snap/core/4486  
loop3    7:3    0  86.6M  1 loop /snap/core/4650  
loop4    7:4    0   1.6M  1 loop /snap/gnome-calculator/154  
loop5    7:5    0  14.5M  1 loop /snap/gnome-logs/34  
loop6    7:6    0   3.3M  1 loop /snap/gnome-system-monitor/36  
loop7    7:7    0   2.3M  1 loop /snap/gnome-calculator/178  
loop8    7:8    0    13M  1 loop /snap/gnome-characters/101  
loop9    7:9    0   3.7M  1 loop /snap/gnome-system-monitor/45  
loop10   7:10   0 139.5M  1 loop /snap/gnome-3-26-1604/64  
loop11   7:11   0   140M  1 loop /snap/gnome-3-26-1604/59   
loop12   7:12   0   3.7M  1 loop /snap/gnome-system-monitor/41  
loop13   7:13   0    21M  1 loop /snap/gnome-logs/25  
loop14   7:14   0  12.2M  1 loop /snap/gnome-characters/69  
loop15   7:15   0    13M  1 loop /snap/gnome-characters/96  
sda      8:0    0 298.1G  0 disk  
├─sda1   8:1    0   512M  0 part /boot/efi  
└─sda2   8:2    0 297.6G  0 part /  
sr0     11:0    1  1024M  0 rom  

(上述文本的补充屏幕截图): screenshot.jpg 我的“snap列表”显示了6个结果:
核心 gnome-3-26-1604 gnome-calculator gnome-characters gnome-logs gnome-system-monitor 与此同时,gnome-disk-utility对于snaps一无所示,只显示我的硬盘驱动器和光驱。
如果每个已安装的snap都被列为一个块设备(每个要添加2-3次),那将不太高效。我应该期待未来的更新来解决这个问题吗?

编辑:
fdisk-l 也会输出一个非常长的列表,其中包含了 16 个 "磁盘循环"(Disk /dev/loop0,Disk /dev/loop1 等等),每个都有详细信息,此处不显示因为太长。这不能是期望的行为,对吗?
blkid 也列出了 16 个循环,类型为 "squashfs"。至少 parted -l 的工作正常,只输出了我的实际磁盘分区。

我刚刚测试过,安装更多的 Snaps 会在 lsblk 输出中添加更多内容。因此,fdisk、lsblk 和 blkid 的输出列表可能非常庞大,取决于可用和已安装的 Snaps 数量。


4我认为你问题的实际答案在这个相关问题中:"Snap包是squashfs文件系统。访问snap的唯一方式是挂载它们。所以是的,它们总是被挂载。" https://askubuntu.com/questions/842093/how-do-snaps-work-exactly-and-why-are-they-mounted天哪,我希望它们不需要被挂载! - craq
这个回答解决了你的问题吗?从lsblk输出中排除loop\snap设备? - Ehtesh Choudhury
6个回答

当你输入命令时
snap list 

你将获得实际安装的快照软件包的输出。原因是当一个快照软件包被更新时,旧版本会被保留(请参阅 snapcraft 文档)引用自 snapcraft 文档
垃圾收集然后会删除和清除任何在刚刚更新的快照版本之前的快照文件及其可写区域,这意味着系统上最多只会存在两个版本的快照。这样可以节省磁盘空间,而不会影响将快照回滚到先前的已知良好状态的能力。
明确从系统中移除一个快照也将删除代码并清除所有先前版本的数据。
例如,你已经安装了多个版本的 gnome-calculator
如果你只需要最新版本,你可以使用
sudo snap remove gnome-calculator --revision <version to be placed>

使用命令
losetup -a 

显示已挂载的快照(循环设备)
如果您想删除重复的快照,请键入
sudo losetup -d /dev/loop<loopnumber>

似乎是快照代码的错误,因为所有旧的都保存在/var/lib/snapd/snaps文件中。


3sudo:remove:未找到命令 losetup -d 没有任何变化。 - jordy
4正确的代码是 sudo snap remove 而不是 sudo remove。请修改你的回答。 - jordy
这不是永久删除,下次启动它们还会在那里。 - undefined

你可以使用-e7标志来排除回环设备,这样打字会更简单(虽然可能不容易记住)。
lsblk -e7

对于那些非常懒惰的人:将以下内容添加到您的 ~/.bash_aliases 文件中(或者您默认使用的任何其他 shell):alias lsblk=lsblk -e 7 - Jens
我认为问题在于安装了重复的软件,这掩盖了真正的问题。 - undefined

从您问题的内容来看,您的问题是关于寻找一种方法来控制在查看块设备时所看到的内容,而不是关于snap如何使用块设备进行操作。
我同意您提到的fdisk -lparted -l之间的区别。虽然fdisk显示了块设备的非常详细的输出,但它还显示了太多其他分散注意力的东西。
解决方案
您可以使用过滤器对lsblk格式化的输出进行过滤。这样可以得到与gnome-disk-utility类似的干净输出。
$ lsblk -o name,mountpoint,label,size,fstype,uuid | egrep -v "^loop"

或者如你在问题中所指示的:
$ sudo parted -l

对于你的问题中的df命令,请使用以下内容:
$ df | egrep -v /dev/loop

6我等了很久,希望有人能提出这个建议,即为lsblk提供一个过滤输出的选项(而不是那些辩护过多输出正常且良好的评论)。然而,我希望能避免这样做,只因为简单直接的lsblk命令既快速又容易记住,在snap干扰之前它运行得非常好。我希望能恢复到原来的状态。希望过多的输出只是一个会被修复的错误。 - jordy
4@danthonyd 感谢您的肯定。我确信自己理解了问题,并且坚信它值得在 AU 信息数据库中考虑和回答。这是我长期以来关注的一个问题。然而,问题不在于 Snap,而在于 fdisk 的开发人员。他们应该添加一种方法,用于过滤掉伪设备中的真实设备,以消除过多的输出并使其应用更易管理,就像 Gnome 磁盘工具一样。没有人会使用 fdisk 来管理他们的loop设备。(续) - L. D. James
4...(续)他们甚至不需要在fdisk输出中看到它。这就是losetup和其他应用程序命令存在的目的。所以,如果你不能用工具来管理它,为什么还要显示它呢?这种在fdisk设计中的缺陷使得像partedlsblk这样的应用程序变得更受欢迎和用户友好。 - L. D. James
1谢谢。今天我会在我所有的16.04 lsblk 脚本中添加 | egrep -v "^loop",以减少在我升级到18.04的那一天的维护工作。(顺便说一下,在今天之前我已经给你的答案点了赞) - WinEunuuchs2Unix

如果您使用的是系统监视器的快照版本,那么您将看到snap使用的所有文件系统以及您自己使用的文件系统。
一个简单的“解决办法”是从应用商店卸载Gnome System Monitor。它是快照版本。
然后使用Synaptic软件包管理器从正常的软件源安装Gnome System Monitor。这是正常版本,会在根分区上安装一堆文件。很好!
当您启动Gnome System Monitor时,您将看到您所期望看到的内容...

1太棒了!这就是我在寻找的东西。命令是 snap remove gnome-system-monitor(无需sudo),然后是 sudo apt install gnome-system-monitor(这次需要sudo)。 - PerlDuck

我知道这是一个较旧的问题,但由于在谷歌搜索“为什么blkid / fdisk -l会生成大量“loop”条目”时,它位于搜索结果的顶部附近,所以我想与下一个人分享一下。
一个可能有效(取决于您的需求)的选择是简单地删除snapd。在Linux Mint 19.3(基于Ubuntu 18.04),snapd默认未安装,因此也不需要。据我了解,Ubuntu 18.04与之不同,snapd已经预装。在Mint 19.3下,安装snapd会在fdisk -l和blkid中生成相同的“loop”条目,而运行sudo apt purge snapd可以将其清除。
我尚未在特定的Ubuntu 18.04版本下进行过测试,但假设删除snapd不会对任何关键内容产生影响,那么如果您实际上不使用snap作为用户,则这可能是一个可行的选择。
我不认为在基于Ubuntu的系统中删除snapd会破坏任何关键内容,根据12。但是我看到一个注意事项here,可能需要重新安装一些作为snaps安装的默认Ubuntu软件包(sudo apt install gnome-software gnome-calculator gnome-logs gnome-characters gnome-system-monitor)。我不确定这是否是一个完整的列表/在MATE/KDE/xfce等下需要哪些默认软件包。为了验证这一点,我强烈建议在虚拟机中进行测试,除非您不介意在出现问题时重新安装。
对于Mint 19,我可以确认卸载snapd会消除fdisk -lblkidmount以及可能其他命令中的"loop"条目。

只显示不包括loopback的挂载点,你也可以简单地:
lsblk -af |grep -sv loop

;)