如何授予 snap 程序对 /somedir 的访问权限

如何授予 snap 程序对 /somedir 的访问权限

我刚刚开始接触 snap。我已经安装了 vlc,想尝试使用它。我的所有媒体都安装在/storeNFS 挂载下。但 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/

例如

  1. 使用菜单编辑器,例如“主菜单”,添加自定义 Chromium“菜单项”(这是当您按下 super+a 时 ubuntu 用来查找应用程序的菜单项):
  2. 设置名称例如:Chromium Unsnapped
  3. 设置命令:/snap/chromium/current/usr/lib/chromium-browser/chrome --user-data-dir=~/ChrUnsnapped --class="ChrUnsnapped" %U
  4. 设置图标,例如下载复古铬标志
  5. 保存/关闭
  6. 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/SystemdBindMountUnitshttps://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/somedirrsync 很流行,有很多包装器/扩展

  • 任何基于文件的备份实用程序(图形示例grsync:)应该是可用的,因为整个目标是根据需要向前和向后复制数据集

  • git 克隆,可能,但是本地克隆默认使用硬链接,因此如果您使用 git 将文件系统 io 管理到 snap 中,请注意如果在克隆时不禁用硬链接,git 克隆可能无法访问 snap。

相关内容