我想将已安装的 snap 软件包移至主目录。Snap 软件包比 .deb 软件包稍大,因此它们占用了我的根分区的空间。我知道软件包位于 中,/var/lib/snapd/snaps
并且它们正在将软件包安装到 中/snap/app_dir
。我尝试过 simlinked,但没有成功。
答案1
更改 snap 安装目录
这是许多人问到的一个常见问题。Snap 开发人员似乎不打算很快解决这个问题,因此提出了一些解决方案。
第一个解决方案社区强烈反对的一个方法是使用符号链接来链接指向 snap 的目录,但我没有尝试。这种方法似乎行不通,因为社区回复说 AppArmor 不支持符号链接。
第二种解决方案是mount --bind
目录/val/lib/snapd/snaps
,对于我已安装的应用程序来说,它可以正常工作,但由于我将目录移动到另一个分区,因此无法安装新应用程序。这给了我一个错误,关于将 snap 应用程序与位于 的缓存目录硬链接/var/lib/snapd/cache
。我不知道如果位置在同一个分区中,这个解决方案是否可行;但这就是我将 snap 目录移动到另一个分区以释放一些空间的原因。
第三个可行的选择是将/var/lib/snapd
目录作为一个整体移动,然后mount --bind
从另一个位置移动到它,这对我有用,下面是步骤。
只需注意一点,您已经知道,在下面的步骤中完成 rsync 之后,您可以将里面的数据备份/var/lib/snapd
到另一个位置,直到整个过程成功完成,然后如果您想释放更多空间,您可以删除备份数据,但保持/var/lib/snapd
目录本身空闲,因为它被挂载点使用。
##############################################################################
# Take Care this section may break your System !!!
##############################################################################
##Move snap folder to Home instead of root.
#Create the directory : you can change the location
mkdir -p /home/$USER/snap/snapd
#Stop auto-updating (will *not* crash snaps already open)
sudo systemctl mask snapd.service
sudo systemctl stop snapd.service
sudo systemctl disable snapd.service
#Copy the data
sudo rsync -avzP /var/lib/snapd/ /home/$USER/snap/snapd/
#Do backups
sudo mv /var/lib/snapd /var/lib/snapd.bak
sudo cp /etc/fstab /etc/fstab.bak
#Change fstab (Change $USER with your name or change the path totally)
echo "/home/$USER/snap/snapd /var/lib/snapd none bind 0 0" | sudo tee -a /etc/fstab
#remount fstab Or reboot.
sudo mkdir /var/lib/snapd
sudo mount -a
if ls /var/lib/snapd/ | grep snaps
then
echo "Re-mounting snapd folder is done successfully. !!!!"
sudo rm -rf /var/lib/snapd.bak
else
echo "WARNING : Re-mounting snapd folder failed, please revert !!!!! "
echo "WARNING : Re-mounting snapd folder failed, please revert !!!!! "
echo "WARNING : Re-mounting snapd folder failed, please revert !!!!! "
echo "WARNING : Re-mounting snapd folder failed, please revert !!!!! "
echo "WARNING : Re-mounting snapd folder failed, please revert !!!!! "
# Trying to revert automatically
sudo cp /etc/fstab.bak /etc/fstab
sudo mount -a
sudo umount /var/lib/snapd
sudo mv /var/lib/snapd.bak /var/lib/snapd
echo "Files located at ~/snap/snapd should be removed, but are kept for
recovery until you, manually reboot the system and make sure the service
is running correctly. Then you can manually remove the folder ~/snap/snapd
!!!!!!!!!!!!!!, you should do that manually."
fi
#Restart auto-updating
sudo systemctl unmask snapd.service
sudo systemctl start snapd.service
sudo systemctl reenable snapd.service
##############################################################################
# Take care the previous section may break your System !!!
##############################################################################
参考
- 某些快照的自定义磁盘位置问题
- 询问 ubuntu 问题(不是最佳解决方案)关联
- 建议在移动 snap 目录时使用绑定挂载而不是符号链接关联
- 绑定挂载和符号链接之间的区别关联
- 使绑定挂载永久生效
答案2
我找到了这个方法...
- 首先将 snap 包移动到所需位置。将
snap_app.snap
其设为要移动的应用程序。将包从/var/lib/snapd/snaps/snap_app.snap
移动到~/snaps/snap_app.snap
。 - 然后,您必须更改 中的挂载选项
/etc/systemd/system/snap-snap_app-90.mount
,文件名中的数字可能会有所不同。它What=/snap_app_loaction
在 下有指令[Mount]
。将其更改为新的 snap 包位置。 - 最后,你必须将 snap 包符号链接到
/var/lib/snapd/snaps/
。
例如:ln -s ~/snaps/snap_app.snap /var/lib/snapd/snaps/snap_app.snap
Snap 包最初挂载在/snap/snap_app
目录中。您可以使用来检查它mount
。重新启动您的机器,您就大功告成了。
答案3
我使用 VLC Player snap 的体验
要求。我想将 VLC snap 安装从一个 Ubuntu 18.04 系统“克隆”到另一个。原因。互联网限额和带宽有限。
我按照@Lakindu-Akash 写的步骤操作。谢谢。这为我进入 snap 安装世界提供了一个很好的起点。我发现我有重复的 VLC snap。见下文。
已清理 1) /snap/vlc$ ls 1620 1700 当前 /snap/vlc$
1700 是当前的。我删除了 1620 目录和内容。
2)在 /etc/systemd/system$ 中我有 snap-vlc-1620.mount snap-vlc-1700.mount
所以我删除了这里的1620名词。
/etc/systemd/system$ sudo rm snap-vlc-1620.mount
3)在 /var/lib/snapd/snaps$
我有 -rw------- 1 root root 305086464 Aug 00 00:00 vlc_1620.snap -rw------- 1 root root 304545792 Jul 15 2020 vlc_1700.snap
我在这里删除了 vlc_1620.snap,它是实际的 snap 下载文件。
/var/lib/snapd/snaps$ sudo rm vlc_1620.snap
- 在新系统上将文件和目录复制到新系统,保留相同的位置不起作用。我没有手动尝试创建新的挂载点。如果我这样做,也许会成功。
阅读完snap 论坛,谢谢@adam-monsen,我决定从位于/var/lib/snapd/snaps$ 的快照文件进行安装,实际下载的 VLC 快照文件位于其中,而不是 inode(指针)。
我将 vlc_1700.snap 复制到新机器并从此目录中运行命令
sudo 安装 snap vlc_1700.snap --dangerous
其中 vlc_1700.snap 是 snap 的名称(图像或您称之为的名称)显然,由于我没有使用确认号码,因此此安装永远不会更新?我必须了解确认及其用法。但是,安装进行得很顺利,VLC 可以在新系统上运行。我敢说,如果您也想在同一台机器上重新安装到其他位置,这可能会有所帮助。这是因为新的 snap 图像是在安装 snap 图像所在的目录中创建的,并且安装过程已启动。
答案4
我正在使用 ntfs 分区,必须更改挂载选项来解决此错误:
UUID=0952DA6E1534D154 /media/user/progs ntfs-3g uid=1000,gid=1000,umask=022,permissions 0 2
/media/user/progs/snapd /var/lib/snapd none bind 0 0
#UUID=0952DA6E1534D154 /media/user/progs ntfs-3g uid=1000,gid=1000,nls=iso8859-1,umask=022,permissions 0 2
#/media/user/progs/snapd /var/lib/snapd none bind,fmask=0022,dmask=0022 0 0
我减少了注释掉的条目直到它仍然有效,但是还没有进行太多测试。
有关的:
如何在 NTFS(或 FAT32)分区上使用“chmod”?
systemctl mask snapd && systemctl stop snapd && systemctl disable snapd
# output: "Unit /etc/systemd/system/snapd.service is masked, ignoring."
rsync -aAX --info=progress2 /var/lib/snapd /media/user/progs/ #(or use `mv` and use `progress -w` afterward)
mv /var/lib/snapd /var/lib/snapd0
mount -a
systemctl unmask snapd && systemctl start snapd && systemctl reenable snapd
systemctl status snapd
snap info core
rm -R /var/lib/snapd0
用于systemctl daemon-reload
重新加载 /etc/systemd/system 中的 snap mount 单元文件。或者apt purge snapd
清除它们并重新安装。