我刚刚开始接触 snap。我已经安装了 vlc,想尝试使用它。我的所有媒体都安装在/store
NFS 挂载下。但 snap 不允许访问该目录。
经过谷歌搜索后,我了解到我可以访问/home/peter
接口:home
和/media
接口下的文件:removable-media
。
但我实际上喜欢/store
并且不想将其改变为/media/store
或/home/peter/store
其他任何东西/store
。
有没有办法让 snap 允许我的 snap(或者可能只是 vlc)访问/store
,这样 snap 才符合我的命名约定,还是我被迫转换为 snap 的偏好设置?
这看起来非常不灵活,我希望我错过了一些东西。
答案1
令我惊讶的是,它看起来确实像是/home
硬编码的。
安装支持.c包含:
const struct sc_mount mounts[] = {
{"/dev"}, // because it contains devices on host OS
{"/etc"}, // because that's where /etc/resolv.conf lives, perhaps a bad idea
{"/home"}, // to support /home/*/snap and home interface
...
哇。这真让我吃惊。不过事实就是如此。
编辑:另请参阅Launchpad 问题 1643706
答案2
只需运行该应用程序,就像它不是一个快照一样 \o/
例如铬
- 使用菜单编辑器,例如“主菜单”,添加自定义 Chromium“菜单项”(这是当您按下 super+a 时 ubuntu 用来查找应用程序的菜单项):
- 设置名称例如:
Chromium Unsnapped
- 设置命令:
/snap/chromium/current/usr/lib/chromium-browser/chrome --user-data-dir=~/ChrUnsnapped --class="ChrUnsnapped" %U
- 设置图标,例如下载复古铬标志
- 保存/关闭
- super+a(或显示左下角的应用程序图标)找到新项目并右键单击以添加到收藏夹
<rant>
我对 snap 非常失望,因为我无法像 15 年来一直做的那样配置我的个人 /stf 目录。谢天谢地,有了这个 hack,看来我必须为每个 freeken snap 应用程序都这样做 :'( 。
是的,我知道这很糟糕,但除非有白名单配置,否则这似乎是让事情恢复正常的唯一方法。我真的不想把我的东西放在 /home、/mnt、/media 中,请不要讨厌你的用户。
</rant>
答案3
所以,有两件事。
首先:Linux 和 Unix 有一个文件系统层次结构标准,Ubuntu 和 Snaps 遵循该标准。 https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
第二:如果有人选择偏离自 1979 年以来一直存在的全球标准,那完全没问题,但随后绑定挂载您的非标准目录,以便 snap 可以找到它。
mount --bind /nonstandard_mountpoint /media/$USER/directory
或者
mount --bind /nonstandard_mountpoint /home/$USER/directory
然后您可以继续使用非标准挂载点,同时您的所有快照都可以找到您的 nonstandard_mountpoint 数据。
甚至可以将此挂载添加到您的 FSTab 中,使其成为永久挂载
sudo nano /etc/fstab
添加行
/source /destination none defaults,bind 0 0
保存并退出
CTRL+X y
以下是一个例子: 音乐文件存储在 /srv/dsmusic
首先在 /home/$USER/Music/dsmusic 创建一个目录
mkdir /home/$USER/Music/dsmusic
然后将 /srv/ds 音乐绑定到该目录
sudo mount --bind /srv/dsmusic /home/$USER/Music/dsmusic
然后,您所有的快照音乐程序将自动神奇地找到音乐文件。
继续音乐示例:
sudo nano /etc/fstab
添加行
/srv/dsmusic /home/username/Music/dsmusic none defaults,bind 0 0
** 卸载 **
如果你想卸载,你可以使用常规的 umount 命令,就像常规的挂载点一样
sudo umount /home/$USER/Music/dsmusic
更多信息请参阅: https://unix.stackexchange.com/questions/198590/what-is-a-bind-mount
系统D
** 请注意,在 SystemD 中有一种更现代的方法可以执行此操作,而不是使用 fstab。
要在 SystemD 中创建绑定挂载,您需要创建一个 .mount 文件,其中非标准挂载点的路径以 -(减号)而不是正斜杠 (/) 分隔
sudo systemctl edit --full --force path-nonstandard.mount
完成以下操作并编辑挂载点
[Unit]
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target
[Mount]
What=/some/old/dir
Where=/the/new/dir
Type=none
Options=bind
[Install]
WantedBy=local-fs.target
如果 nano 是默认编辑器 CTRL+X y(对于 nano) :wq(对于 vim)
启用 systemD 文件
sudo systemctl enable path-nonstandard.mount
然后重新加载 SystemD 守护进程
sudo systemctl daemon-reload
然后启动你的坐骑
sudo systemctl start path-nonstandard.mount
如果你需要再次修改它
sudo systemctl edit --full path-nonstandard.mount
例子: 再次使用音乐示例:
sudo systemctl edit --full --force srv-dsmusic.mount
这将打开一个空白编辑器,并在正确的系统文件夹中创建一个新的 .mount 文件,并在其中添加以下行
对于同一硬件上的本地挂载点:
[Unit]
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target
[Mount]
What=/srv/dsmusic
Where=/home/username/Music/dsmusic
Type=none
Options=bind
[Install]
WantedBy=local-fs.target
请注意,如果您的非标准挂载点是 NAS 或其他远程设备,则需要使用 remote-fs.target 而不是 local-fs.target
用于不同硬件(如 NAS)上的远程挂载点
[Unit]
DefaultDependencies=no
Conflicts=umount.target
Before=remote-fs.target umount.target
[Mount]
What=/srv/dsmusic
Where=/home/username/Music/dsmusic
Type=none
Options=bind
[Install]
WantedBy=remote-fs.target
然后退出编辑器 CTRL+X y (用于 nano) :wq (用于 vim)
启用 systemD 文件
sudo systemctl enable srv-dsmusic.mount
然后重新加载 systemD 守护进程
sudo systemctl daemon-reload
然后启动新的挂载点
sudo systemctl start srv-dsmusic.mount
卸载 bindmount
sudo systemctl stop srv-dsmusic.mount
您现在可以在 /srv/dsmusic 找到数据的镜像,并且 snap 也可以在 /home/$USER/Music/dsmusic 找到相同的数据
更多信息请参见:https://utcc.utoronto.ca/~cks/space/blog/linux/SystemdBindMountUnits 和 https://www.freedesktop.org/software/systemd/man/systemd.mount.html
答案4
安装目标目录到/home/*/snap/
被提及为一个选项;简单的绑定挂载对我来说不起作用,将目标文件或目录硬链接或符号链接至拟议的 snap 目录或其任何子目录也不起作用。此限制可能是由于目标文件存在于目录之外/home/*/
,我没有测试 mounts/hard/symlinks 到/home/*/
前缀 glob 内的文件。
但是,一种解决方法:将完整文件复制到其中/home/<myuser>/snap/<appname>/<somenewdirectory>
对我来说是可行的。维护完整的数据集副本对我来说是不可行的,但有很多工具可以帮助解决这种限制;如果您的数据集很小甚至是原子的,那么在使用 snap 之前进行手动递归复制,然后在之后将修改后的文件复制回来是一种选择
以下是一些可以帮助您的文件复制实用程序:
cp --verbose --archive --recursive /somedir ~/snap/somedir
,源/目标反之亦然tar -C / -c somedir | tar -C ~/snap/ -xv
是基于 tar 的文件复制示例rsync --archive /somedir ~/snap/somedir
rsync 很流行,有很多包装器/扩展任何基于文件的备份实用程序(图形示例
grsync
:)应该是可用的,因为整个目标是根据需要向前和向后复制数据集git 克隆,可能,但是本地克隆默认使用硬链接,因此如果您使用 git 将文件系统 io 管理到 snap 中,请注意如果在克隆时不禁用硬链接,git 克隆可能无法访问 snap。