如何让快照访问 /somedir

Pet*_*rch 46 snap

我的脚被啪的一声弄湿了。我已经安装了 vlc 并想尝试使用它。我的所有媒体都安装在/storeNFS 挂载下。快照不允许访问该目录。

谷歌搜索后,我终于明白,我可以在访问文件/home/peter:home接口和/media:removable-media接口。

不过我却喜欢/store和不希望改变这种状况是/media/store/home/peter/store或其他任何东西比/store

有没有办法让 snap 允许我的 snap(或者可能只是 vlc)访问/store,所以 snap 符合我的命名约定,或者我是否被迫转换为 snap 的首选项?

这似乎非常不灵活,我希望我错过了一些东西。

Pet*_*rch 31

令我惊讶的是,它看起来真的/home是硬编码的。 mount-support.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
    ...
Run Code Online (Sandbox Code Playgroud)

哇。这让我很惊讶。但是你现在有了。

编辑:另请参阅Launchpad 问题 1643706

  • @ZygmuntKrynicki 我也很惊讶。默认挂载点应该通过配置文件配置而不是强制执行。 (23认同)
  • @ZygmuntKrynicki 感谢您加入并解释代码符合您的意图。我尊重并完全不同意你写的东西。硬编码路径是非常糟糕的做法,即使以安全的名义,也不能有意义地证明其合理性。这只是基本的不灵活。 (21认同)
  • @ZygmuntKrynicki:那些在`/veracrypt` 之类的路径上安装加密卷的人呢?将路径列入白名单是不可能的? (4认同)
  • @ZygmuntKrynicki — 至少从 1980 年代初期(可能更早)起,出于极好的原因,硬编码已被弃用。请您考虑使用配置文件。这给我们中的一些人带来了严重的问题。 (4认同)
  • @ZygmuntKrynicki 没有人要求复制任意路径。但是,针对特定情况的一般解决方案似乎是配置而不是硬编码,不是吗? (3认同)
  • 嘿,这里负责该代码的 snapd 开发人员。令您惊讶的是,这实际上是正确的做法。我们无法复制主机文件系统及其可能包含的任何随机目录。虽然您可以使用 /store,但其他人可能会使用 /stash 或 /whatever,但通常无法使其正常工作。我的建议是简单地将您的媒体安装在您想要的位置,在 /home/... 或 /media 中。然后它将属于管理该数据的现有系统,并且事情应该正常工作。 (2认同)
  • 想法:让这项工作类似于 Docker,您可以在其中显式地使卷或文件夹可供容器使用。当我运行“snap”时,我可以执行“snap --allow-write /foo/Movies”,或者任何我想做的事情。 (2认同)
  • (比如,为什么我想要一个快照能够读取/写入我的整个主文件夹?“限制权限”的意义是什么,然后授予它访问*所有我的数据*!:O) (2认同)
  • @HughPerkins:您的评论不需要括号。硬编码论点的荒谬性的又一例证。 (2认同)

Kat*_*dam 10

所以,有两件事。

首先:Linux 和 Unix 有 Ubuntu 和 Snap 遵循的文件系统层次结构标准。 https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

第二:如果选择偏离自 1979 年以来实施的全球标准,那完全没问题,但随后绑定挂载您的非标准目录,以便 snap 可以找到它。

mount --bind /nonstandard_mountpoint /media/$USER/directory
Run Code Online (Sandbox Code Playgroud)

或者

mount --bind /nonstandard_mountpoint /home/$USER/directory
Run Code Online (Sandbox Code Playgroud)

那么您可以继续使用非标准安装点,同时所有快照都可以找到您的 nonstandard_mountpoint 数据。

甚至可以通过将其添加到 FSTab 来使此安装永久化

sudo nano /etc/fstab
Run Code Online (Sandbox Code Playgroud)

追加行

/source /destination none defaults,bind 0 0
Run Code Online (Sandbox Code Playgroud)

保存并退出

CTRL+X y
Run Code Online (Sandbox Code Playgroud)

这是一个示例: 存储在 /srv/dsmusic 的音乐文件

首先在 /home/$USER/Music/dsmusic 创建一个目录

mkdir /home/$USER/Music/dsmusic
Run Code Online (Sandbox Code Playgroud)

然后将 mount /srv/ds music 绑定到该目录

sudo mount --bind /srv/dsmusic /home/$USER/Music/dsmusic
Run Code Online (Sandbox Code Playgroud)

然后您所有的快照音乐程序都会自动神奇地找到音乐文件。

继续音乐示例:

sudo nano /etc/fstab
Run Code Online (Sandbox Code Playgroud)

追加行

/srv/dsmusic    /home/username/Music/dsmusic    none    defaults,bind    0 0
Run Code Online (Sandbox Code Playgroud)

** 卸载 **

如果您想卸载,可以像常规挂载点一样使用常规 umount 命令

sudo umount /home/$USER/Music/dsmusic
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅: https://unix.stackexchange.com/questions/198590/what-is-a-bind-mount

系统D

** 请注意,在 SystemD 中有一种更现代的方法可以代替使用 fstab 来执行此操作。

要在 SystemD 中创建绑定挂载,您需要创建一个 .mount 文件,其中非标准挂载点的路径由 -(减号)而不是正斜杠(/)分隔

sudo systemctl edit --full --force path-nonstandard.mount
Run Code Online (Sandbox Code Playgroud)

通过以下内容并编辑安装点

[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
Run Code Online (Sandbox Code Playgroud)

如果 nano 是默认编辑器 CTRL+X y (对于 nano) :wq (对于 vim)

启用systemD文件

sudo systemctl enable path-nonstandard.mount
Run Code Online (Sandbox Code Playgroud)

然后重新加载SystemD守护进程

sudo systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)

然后开始你的安装

sudo systemctl start path-nonstandard.mount
Run Code Online (Sandbox Code Playgroud)

如果需要再次修改只需

sudo systemctl edit --full path-nonstandard.mount
Run Code Online (Sandbox Code Playgroud)

示例: 再次使用音乐示例:

sudo systemctl edit --full --force srv-dsmusic.mount
Run Code Online (Sandbox Code Playgroud)

这将打开一个空白编辑器,并在正确的系统文件夹中创建一个新的 .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
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的非标准挂载点是 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
Run Code Online (Sandbox Code Playgroud)

然后退出编辑器 CTRL+X y (对于 nano) :wq (对于 vim)

启用systemD文件

sudo systemctl enable srv-dsmusic.mount
Run Code Online (Sandbox Code Playgroud)

然后重新加载systemD守护进程

sudo systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)

然后启动你的新挂载点

sudo systemctl start srv-dsmusic.mount
Run Code Online (Sandbox Code Playgroud)

卸载bindmount

sudo systemctl stop srv-dsmusic.mount
Run Code Online (Sandbox Code Playgroud)

您现在可以在 /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

  • 我有一个疑问,也许你可以挤进你的答案:如果 /mnt 用于临时安装,而 /media 用于可移动媒体。安装不属于系统安装但与几个用户共享的额外硬盘驱动器的标准位置是什么?我想知道,特别是当用户主目录被加密并且在登录之前不会安装时。 (3认同)
  • 毫无疑问,Snap 超级用户友好。 (2认同)
  • 我认为这个答案完全没有抓住重点。应该是**用户可配置的**。例如,我可能想让 LibreOffice 访问 `/mnt/super-secret-project`,而不是 VLC。那也是不可能的。 (2认同)

Ama*_*icA 6

只需运行应用程序,就好像它不是一个快照 \o/

例如

  1. 使用菜单编辑器,例如。“主菜单”添加自定义铬“菜单项”(这是当您按 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>

  • 好的,只是澄清一下:走这条路,我们_**明确绕过** Snap 限制_并使用_标准用户权限_运行应用程序。它不会读取/写入`~/snap/appname/{common,current}/`中的文件(设置、缓存等),而是读取/写入`$HOME`内的默认位置。这样做没有问题——我将它用于 Chrome SSB——但是你需要了解你在做什么。 (4认同)
  • 我想这不适用于较新的 snap,它只是将二进制文件符号链接到 `/usr/bin/snap` 本身? (2认同)

归档时间:

查看次数:

19301 次

最近记录:

5 年,5 月 前