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

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

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

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

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

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

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

#!/bin/bash

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

mkdir -p $TARGET
mv $FILE $TARGET
ln -s $TARGET $FILE

然后运行

snatch /etc/hosts

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

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

谢谢!

答案1

不!

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

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

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

它解释了事情的去向。

答案2

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

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

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

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

答案3

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

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

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

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

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

答案4

其他人则强调这是一个坏主意——他们是对的——而且其中的原因超出了人们的想象。

更积极地说,这就是我为实现这个完全合理的目标所做的事情。

  1. 学会喜欢默认设置。它们是默认的,因为关心它们的人仔细考虑了它们并认为它们是最好的。我积极抵制太快地再次猜测那个人,因为几十年来和多台机器,我已经了解到这是最低摩擦的方式。我在工作日使用各种各样的机器,其中一些机器的个性化程度比其他机器低得多,并且我对默认值或最低配置的情况感到满意vi,这意味着这不一定是麻烦。

  2. 将个人点文件(~/.*rc 文件)放入存储库中,并将它们克隆到您的新机器上。我的~/.zshrc~/.bashrc文件(我有偏好,但我故意不担心我在特定机器上使用哪一个)包括设置一些环境变量,然后source $HOME/checkouts/.../bashrcbashrc文件进行条件化以匹配实际使用的 shell。我的init.el900 多行是方式它比应有的要大,但其中很多都是几十年来我对第一点不那么严格时的长期冗余,而且它的大小可能会在我没有注意到的情况下减半。

  3. 对于我的手指无法记住默认值的一部分,我有一个字符串,可以将其粘贴到远程 shell 中,该 shell 可以执行unalias -a、 并定义几个函数和环境变量。

  4. 我有一个配置调整的文本清单,实际上,我真诚地记住第一点,确实想在新盒子上进行调整。

  5. 其他答案之一提到了尼克斯。 尼克斯包装是很棒的。

  6. 如果你真的在做这件事很多机器(...真的吗?!好吧...),然后安西布尔可能值得调查。

  7. 我将重点放在整个系统配置而不是外壳配置上,我确实将内容放入/etc版本控制中,并强调提交任何本地更改的结果。这对于在另一台机器上复制任何内容没有帮助(甚至没有帮助)思考关于将其复制到另一个盒子!),但它确实让我明白了什么我在一台特定的机器上进行了更改,并记录了时间和原因。

相关内容