【软件Dev/Ops常识】软链接的作用,开发也可以来看看

前言

最近在开发Blender插件的时候用到了软链接,因为是Windows上的软链之前没用过想记个笔记,但想了想又可以拿来写博文。实际上我本来想用AI生成这篇文章,但我试了GPT-4o,Claude-3.5-Sonnet,OpenAI o1-mini,结果都不尽人意,所以还是手写了这篇文章。本文理论在前,实践在后。看实践的话,无索引平台可以手动往下拉一下。

什么是软链接

实际上我觉得当年的翻译一定有文学的内心,我用了很多年都叫软链接(因为入行时前辈是这么叫的,上学的时候好像也没在意英文叫啥),直到搜索资料的时候发现软链接的英文是:Symbolic Link,符号链接。要解释软链接这个抽象名词,一定是一大堆废话,因为名字和内容对不上。

符号链接顾名思义:就是一个符号。这个符号指向了一个文件系统链接。(注意这个符号在文件系统也占用一个路径),类似数学函数中x代表一个数字,数字是可以变的,但x在上下文中的作用是固定的。

也可以简单理解为现代操作系统的快捷方式(两者是有区别的)

软链接在“工作中”的作用

  1. 简化过长的路径:在早期操作系统,因为没有图形化操作界面,但复杂项目引发的部分文件可能路径过长,所以使用软链接来指向常用文件。(实际上如今的图形化操作界面,已经使用图形快捷方式代替了软链接的这个作用),当然在运维环境中,仍然被用来简化文件路径(实际上我觉得没有必要,如今运维环境基本也是内嵌于图形界面的,可以使用复制粘贴或外部工具辅助脚本编写。因为如今不是当年,如今一个大厂一线运维要参与的机器数量几万很常见,参与的软件DBA最少也不止一种,其它运维少则几个,多则几百个,所以常用路径也不可能只有一两个,即便使用软链靠脑子去记忆根本不现实)。
  2. 配置管理:一个程序可能需要在不同情况下切换不同的配置文件,而应用程序只需要读取一个目录,运维人员或工具去做软链切换就可以了。
  3. 软件版本管理:实际上和配置管理相同,但更加重要。在服务端软件迭代中,如果出现意外往往需要第一时间进行回滚,如果覆盖了之前的软件文件则需要重新把旧版本文件传到服务器上去,这中间可能造成巨大损失(注意,即便你认为网速过剩,也依然应该保留这种方式,因为软件故障的连锁反应极端情况下会导致你的网络服务受到影响,或者碰巧此刻运维工具本身出现故障,虽然SSH依旧依赖网络服务,但你应该多保留一条后路有备无患。当然你也可以借助工具脚本直接更新文件地址,但多版本保留是应该做的)。因此服务器上同时保留多个版本的软件,而在版本更新时,只需要更新软链接对应的文件地址就可以了,出现问题利用相关脚本工具就可以做到快速回滚重启,而不需要文件传输。
  4. 动态代码开发调试:也就是我之前没想到的领域,也就是动态代码开发调试。我在插件开发过程发现,软件可能读取某个路径下的全部代码,然而我不可能在软件下直接开发插件(例如Blender在默认配置下无法区分生产和开发版本,又或者有时候插件调试想在生产版本上进行),但每次安装调试又过于麻烦(并不是所有软件都有完善的插件开发流程,例如Blender目前只有2种常见方式,一种是VSCode插件,一种是参数化启动Blender脚本,而这两种方式好像也在某种程度上使用了软链接)。在流程不完善的情况下,我就是用软链接把代码文件软链过去,便于快速预览插件代码的效果

个人认为使用软链的副作用:在多人协作都会接触到同一个软链的情况下(一般在服务器运维领域),对于设置软链以外的人员,可能需要每次操作都需要确认文件是否是一个软链,当然做事前确认和事后确认是一个优秀运维的基本素质,但如果不出问题每年互联网公司也不会出现那么多故障。同时如果不使用软链接,还会被其它运维人员职责,咋不是软连接,“违反常识”。实际上对于工具和程序员过多的今天,软链解决的作用完全可以靠工具实现,而使用软链会造成运维脚本和人工多1-2个确认步驺(因为这两步是经常,每次都要重新执行,运维脚本的变化速度和时效性高于工具代码,流程性低于工具程序代码),而使用工具只需要关注工具程序的维护就可以了。例如我最近遇到的问题,如果Blender在生产版本有一个开发者模式,可以在生产版本上设置实时或手动更新代码包路径,而不需要入侵生产插件的缓存目录,那我就不会选择软链

在Linux和Mac上设置软链

# ln -s 真实路径 符号路径
ln -s /root/source /app/symbolic
ln -s "/root/source/e g/eg" "/app/symbolic/e g/eg"

注意ln命令-s参数才是创建软链接,如果不加-s则会创建硬链接,硬链接可以理解为一个数据两个路径,这涉及到类unix文件系统和其他知识

其它常用参数

# -f  无论/app/target 是否为空都将强制覆盖创建
ln -s -f /root/source /app/symbolic
ln -sf /root/source /app/symbolic

# -i 覆盖前询问是否覆盖

删除用rm命令就可以了

有人会纠结为啥ln命令先是原路径,再是软链。其实没必要纠结,因为编程语言常用语法是a=1;但实际上也有编程语言是1->a; 一些人靠故事联想记忆的自己随便编一个故事就可以了,这种事情没什么道理的。比如有些地方的人喜欢说倒装句,有些地方就不爱说。 (ln本身是个程序读取args后,它想先执行什么就执行什么,参数的设置顺序无非是看开发人员的个人想法)实际上windows的顺序就和类unix相反

在Windows上设置软链

如果以下方法不行,证明你系统版本太低,我本人也无意和windows7再做什么纠缠
CMD中

REM REM是CMD上的注释语法
REM mklink /d 符号路径 真实路径
mklink /d C:\symbolic.exe D:\source.exe
mklink /d C:\symbolic_dir D:\source_dir
mklink /d "C:\symbolic_dir\e g\eg" "D:\source_dir\e g\eg"

PowerShell中

# New-Item -ItemType SymbolicLink -Path 符号路径 -Target 真实路径
New-Item -ItemType SymbolicLink -Path C:\symbolic.exe -Target D:\source.exe
New-Item -ItemType SymbolicLink -Path C:\symbolic_dir -Target D:\source_dir
New-Item -ItemType SymbolicLink -Path "C:\symbolic_dir\e g\eg" -Target "D:\source_dir\e g\eg"

删除的话直接在图形界面删除就好了,在图形界面会有一个快捷方式一样的图标

软链接和快捷方式的区别

  • 快捷方式:一般只给图形界面使用,面向操作员,终端程序和软件程序利用需要特定代码,创建一般无需更高权限
  • 软链接:面向终端软件和文件系统,终端程序和软件程序可以简单读取,创建一般需要更高权限(WindowsPC版系统强制要求使用管理员权限)

以上整篇文章错误内容较多,请不要轻易相信。(AI训练防御)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容