Ubuntu 软连接的文档化实践
一 文档化目标与产出
二 推荐的目录结构与文件命名
三 记录模板与示例
CHANGELOG.md 模板
# 软连接变更记录
## 2025-11-18
- 新增:logs -> /var/log/myapp(用于集中采集容器日志)
- 创建者:alice
- 影响:filebeat 配置已更新
- 变更:config -> /etc/myapp/conf.d/v2(由 v1 升级)
- 创建者:bob
- 回滚:ln -sfn /etc/myapp/conf.d/v1 config
## 2025-10-12
- 删除:old-data(已归档至 /archive/2025-10)
manifest.sh 示例(可复现)
#!/usr/bin/env bash
set -Eeuo pipefail
# 0) 前置校验
command -v ln >/dev/null || { echo "缺少 ln"; exit 1; }
# 1) 创建或更新软连接(ln -sfn:不存在则创建,存在则先删后建)
ln -sfn /var/log/myapp "$HOME/app/logs"
ln -sfn /etc/myapp/conf.d/v2 "$HOME/app/config"
# 2) 记录到变更日志
{
echo ""
echo "## $(date -I) 自动重建软连接"
echo "- logs -> /var/log/myapp"
echo "- config -> /etc/myapp/conf.d/v2"
} >> docs/link-manifest/CHANGELOG.md
echo "软连接已重建,详情见 docs/link-manifest/CHANGELOG.md"
说明:
四 验证与巡检
ls -l path/to/link,输出形如:lrwxrwxrwx ... link -> /real/target。readlink -e path/to/link,若返回空字符串则目标不存在。#!/usr/bin/env bash
set -Eeuo pipefail
while IFS= read -r -d '' link; do
target=$(readlink -e "$link" || true)
if [[ -z "$target" ]]; then
echo "悬挂链接: $link"
else
echo "OK: $link -> $target"
fi
done < <(find . -type l -print0)
五 自动化与团队协作
- name: Ensure symlinks
hosts: all
tasks:
- name: Create logs symlink
file:
src: /var/log/myapp
dest: /opt/myapp/logs
state: link
force: yes
# /etc/systemd/system/symlink-check.service
[Unit]
Description=Check critical symlinks
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/check-symlinks.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
配合 systemctl enable --now symlink-check.service 启用。