用符号链接替换 ​​etc 中的文件是个好主意吗?

php*_*_qq 7 backup etc symlink

我不经常切换机器,但我不想被绑定到一台机器。我不升级硬件的原因通常是因为我不想设置新机器。

到目前为止,我已经努力将大部分内容集中在主目录中,以便轻松备份和部署在新计算机上。

最大的问题是那些(可能有数百个)配置文件,我已经对其进行了一些(通常是微小的)更改,但如果没有它们在新机器上,任何东西都无法工作。

我有一个想法,制作一个脚本,从 etc 中抓取文件,将它们放在我的主目录中,并用符号链接替换原始文件。然后我会有另一个脚本,在新机器上将检查抓取的文件并用符号链接替换原始文件。

我不确定这听起来有多令人困惑,所以这里有一个简单的例子。

#!/bin/bash

FILE=$(realpath $1)
TARGET=$(realpath ~/snatched)$FILE

mkdir -p $TARGET
mv $FILE $TARGET
ln -s $TARGET $FILE
Run Code Online (Sandbox Code Playgroud)

然后运行

snatch /etc/hosts
Run Code Online (Sandbox Code Playgroud)

将在原始位置放入并创建符号链接/etc/hosts~/snatched/etc/hosts

我担心水下的石头,任何会让我将来后悔的事情,基本上都是来自更有经验的用户的建议。

谢谢!

wal*_*tor 19

不!

  1. 您将拥有一个非标准系统。未来系统对文件的更新/etc将破坏符号链接。
  2. 许多安全和身份验证程序将其配置文件不是/etc文件视为攻击的标志,因此无法工作。
  3. 您将拥有非标准配置。未来的你每次都会记得吗?替代你或助理你呢?
  4. 有一些工具(etckeepertar、 ...)可以提供帮助。

最后,这是Again the Rules(违反标准)!

请参阅文件系统层次结构标准https://refspecs.linuxfoundation.org/fhs.shtml,或阅读man hier

它解释了事情的去向。

  • 这些工具的目的是跟踪对“/etc”的修改,而不是移动文件。考虑在 /etc 中执行“git init”,然后添加、提交和推送文件,并将它们拉到其他地方。添加一些自动更改检测,您基本上就完成了这些工具的工作。 (6认同)
  • 我不会说“这违反了规则”……这是 Linux,我们没有规则。但我确实同意这是一个糟糕的主意,你只是用枪指着你的脚。 (5认同)
  • @ScottishTapWater *我不会说“这违反了规则”……这是 Linux,我们没有规则。* 有一些规则。根文件系统中可用的“/etc”中的文件就是其中之一。这可能会打破该规则。当我进一步阅读时,[telcoM 的答案](https://unix.stackexchange.com/a/744871/111943) 中指出了这一点...... (2认同)
  • @AndrewHenle - 我只是不想删除向人们学习的最有价值的方式之一。去寻找答案是一种非常有效的学习方式。我并不是建议你告诉他这很好,无论如何都要告诉他不建议这样做以及为什么。然而,这并不违反任何规则。 (2认同)

tel*_*coM 15

如果您的主目录位于根文件系统中,那么它可能会起作用。大多。有一些非常重要的警告。

某些安全敏感文件(例如/etc/sudoers)如果替换为符号链接可能会变得无效。这是因为使用该文件的子系统或工具会专门验证该文件的实际路径。如果它找到符号链接,它通常会假设某种安全漏洞尝试正在进行中,并且通常会完全忽略符号链接文件的内容并回退到默认值或只是拒绝所有内容,只是为了安全(安全)侧。

但是,如果您有/home一个单独的文件系统(这通常是推荐的方式),那么请考虑在/home尚未安装时启动时会发生什么。在引导进行到安装点之前,每个“抢夺”的文件都将无法读取(因为符号链接损坏)/home。如果引导过程的任何早期步骤需要这些文件,则该步骤很可能会失败。

一个极端的例子是,如果您“抢夺” /etc/fstab/home文件系统尚未安装,系统将无法读取/etc/fstab,因此不知道需要将特定文件系统安装到/home。系统将仅在安装根文件系统的情况下启动,任何依赖于/home可用的服务都可能会失败。


Ste*_*ris 9

如果您正在修改的文件被包管理系统视为“配置文件”,因此它们不会被覆盖,那么您所建议的内容可能在某些情况下有效。

例如,如果您的主目录是 NFS 挂载的,那么您应该预料到会出现故障,因为/etc/hosts无法解决并且 NFS 挂载可能会失败。即使您在 fstab 中使用 IP 地址,也可能会出现依赖性问题,导致出现问题。

如果您的主目录不是 NFS,那么您就需要处理“保持同步”问题。

更好的解决方案可能是使用配置管理系统,例如 ansible,您可以在其中将“剧本”(或脚本或其他内容)应用于所有计算机。因此,您不必直接修改 /etc/hosts,而是修改 playbook 配置,然后将其应用到所有计算机。

或者有一个本地“/etc/myconfig”类型目录和rsync来自权威来源的内容(类似于配置解决方案,但结构较少)。