SOP — 项目区目录创建(rain01 个人项目骨架,2026-09-27)¶
变更目录:
eda_workspace_standard_20260927/(与规范文档同主题) 落点:共享盘宿主dell-R620的/data/nfs/projects/design/rain01/(客户端/projects/design/rain01/) 依据:EDA-项目区与工作流规范.md第 8.1 / 8.4 节;用户确认范围=仅 rain01、标准骨架、组内可协作 性质:C 类变更(写共享盘),纯新建、无覆盖,实现方式=单机 shell(动作 ≤5 条、无编排)
1. 背景¶
/projects 已按职能建好 8 个 setgid 目录,但均为空。用户最初在 /projects 根执行
cp /pdk/templates/.cdsinit ./ 被拒(根目录 root:root 755,属权限模型正常生效)。
经工作流规范讨论后,决定按行业惯例在自己的职能组目录下建立个人项目骨架。
2. 目标(可验证状态)¶
| # | 判据 | 实测结果 |
|---|---|---|
| 1 | 存在 /projects/design/rain01/proj1/{cdssetup,design,verif,layout,signoff,release,docs} |
✓ 7 个子目录 |
| 2 | 目录权限 2775(setgid)、属主 rain01:design |
✓ 全部 drwxrwsr-x 2001:2000 |
| 3 | cdssetup/ 内为站点模板副本(.cdsinit、cds.lib,664) |
✓ |
| 4 | rain01 在该目录可写 |
✓ WRITABLE |
| 5 | setgid 生效:rain01 新建目录自动继承 design 组 |
✓ 实测 .sg_test → rain01 design |
| 6 | 幂等:复跑零变更、不重写既有文件 | ✓ 两个模板均 skip |
3. 前置条件¶
- 本机
sudo免密(写/data/nfs)。 - 宿主未接 LDAP,
chown rain01:design会失败——必须用数字 ID2001:2000(与客户端id rain01=uid=2001(rain01) gid=2000(design)一致)。 - 模板源在宿主侧
/data/nfs/pdk/templates/(/pdk是客户端挂载点,宿主上不存在)。 - 变更前确认
/projects/design下无他人待保留内容。 - 无需停服;无在跑作业;窗口任意。
4. 影响范围¶
| 项 | 内容 |
|---|---|
| 宿主 | 新增 /data/nfs/projects/design/rain01/(目录 + 2 个模板副本,共约 1.5 KB 目录项) |
| 客户端 | 六台 /projects 视图即时可见(NFS) |
| 既有内容 | 不覆盖任何既有文件;/projects/design 根上用户自行放置的 .cdsinit/cds.lib 保持原样 |
| 是否停服 | 否 |
| 在跑作业 | 无 |
5. 分步操作¶
步骤 1:变更前确认(只读)¶
坑:/projects/design 是组共享区,可能已有他人内容;建目录前先看一眼,避免误判与误删。
ls -la /data/nfs/projects/design/
预期:仅 root:design 的职能目录本身(本次执行前空;实测当时存在用户自行放置的
.cdsinit/cds.lib,属主 2001:2000——不动)。
步骤 2:创建骨架(幂等)¶
坑:宿主无 LDAP 用户,属主必须写数字 ID;权限用 2775 使 setgid 生效(子目录继承 design 组)。
# 高危:写共享盘
BASE=/data/nfs/projects/design/rain01; PROJ="$BASE/proj1"; U=2001; G=2000
sudo -n mkdir -p "$PROJ"/{cdssetup,design,verif,layout,signoff,release,docs}
sudo -n chown -R $U:$G "$BASE"
sudo -n find "$BASE" -type d -exec chmod 2775 {} +
预期:7 个子目录 + 上级 rain01/ 全部 drwxrwsr-x 2001:2000。失败判断:chown 报"无效的用户"→ 说明用了
用户名而非数字 ID,改回数字重跑(幂等,无副作用)。
步骤 3:安装模板副本(不覆盖既有)¶
坑:用户可能已在 cdssetup/ 放过自己的配置,存在即跳过,绝不覆盖用户文件。
SRC=/data/nfs/pdk/templates # 宿主侧路径
for f in .cdsinit cds.lib; do
if sudo -n test -e "$PROJ/cdssetup/$f"; then echo "skip: $f";
else sudo -n install -o $U -g $G -m 664 "$SRC/$f" "$PROJ/cdssetup/$f"; fi
done
预期:首次 installed,复跑 skip。失败判断:源文件不存在 → 确认用了宿主路径而非 /pdk。
6. 验证¶
# ① 结构与权限(宿主)
BASE=/data/nfs/projects/design/rain01
find "$BASE" | sort; stat -c '%A %u:%g %n' "$BASE" "$BASE"/proj1 "$BASE"/proj1/*
# ② 客户端以 rain01 身份验证可写性与 setgid
ssh root@192.168.31.28 'su - rain01 -s /bin/bash -c "
test -w /projects/design/rain01/proj1 && echo WRITABLE
mkdir -p /projects/design/rain01/proj1/.sg_test && ls -ld /projects/design/rain01/proj1/.sg_test
rmdir /projects/design/rain01/proj1/.sg_test"'
# ③ 幂等复跑(应全 skip、mtime 不变)
实测(2026-09-27 22:13):
| 判据 | 实测 |
|---|---|
| 结构 | proj1/{cdssetup,design,docs,layout,release,signoff,verif} |
| 权限 | 全部 drwxrwsr-x 2001:2000 |
| 模板 | cdssetup/{.cdsinit,cds.lib},664 2001:2000 |
| 客户端可写 | WRITABLE |
| setgid 继承 | 新建 .sg_test → drwxr-sr-x rain01 design |
| 幂等 | 复跑 .cdsinit/cds.lib 均 skip,未重写 |
7. 回滚¶
本次为纯新建,无被覆盖/删除的既有文件,因此没有备份源文件(无需 backup/ 内的恢复文件)。
# 高危:删除本次新建的目录树(路径唯一、无通配;执行前确认无用户新增数据)
sudo -n rm -rf /data/nfs/projects/design/rain01
回滚前必查:
find /data/nfs/projects/design/rain01 -newer /data/nfs/projects/design/rain01/proj1/cdssetup/cds.lib 2>/dev/null
- 若列出内容 → 说明已有用户数据,停止删除,改为人工确认后再处置。
- 不在回滚范围:
/projects/design/根上用户自行放置的.cdsinit/cds.lib(本次未动)。
回滚后验证:ls -ld /data/nfs/projects/design/rain01 应报"没有那个文件或目录",/projects/design 回到只有职能目录本身的状态。
8. 风险说明¶
| 风险 | 说明 | 缓解 |
|---|---|---|
| 误删上级共享区 | rm -rf 若路径写错会波及 /projects/design(他人共享区) |
路径逐字校验、不用通配;回滚前用 -newer 检查是否有用户新增数据 |
| 属主写错 | 宿主无 LDAP 用户,用用户名会失败;若强行用错 ID,用户将无法写自己的目录 | 统一用数字 ID 2001:2000,并与客户端 id rain01 核对 |
| 权限过宽 | 2775 允许同组(design)成员在个人目录内写——用户明确选择了"组内可协作" |
如需收紧:chmod -R 2755(组内只读)或 2700(仅自己) |
| 覆盖用户文件 | 用户可能已在 cdssetup/ 放自己的配置 |
安装前 test -e 判存在,存在即跳过 |
| 模板路径混淆 | /pdk 是客户端挂载点,宿主上不存在 |
宿主侧统一用 /data/nfs/pdk/templates |
| 与根目录副本并存 | 用户此前在 /projects/design/ 根放了同名 .cdsinit/cds.lib,易与 proj1/cdssetup/ 副本混淆 |
本次不动;建议由用户择一(见附录 B) |
附录¶
A. 交付物清单¶
| 路径 | 内容 |
|---|---|
EDA-项目区与工作流规范.md |
行业规范 vs 本集群现状(含 6.1 用户名/家目录/项目区目录的区别) |
docs/SOP-项目区目录创建.md |
本文件(本次变更档案) |
backup/README.md |
台账(本次无备份文件,说明回滚方式) |
B. 遗留建议(未执行,待用户决定)¶
/projects/design/ 根上现有用户放置的 .cdsinit(21:29)与 cds.lib(21:56),与
rain01/proj1/cdssetup/ 内的副本内容一致(均为 /pdk/templates 副本)。两种处置任选:
# 甲:保留(在 /projects/design 目录直接启动 Virtuoso 时生效)
# 乙:删除根上的重复,统一用项目内配置(推荐)
sudo -n rm -f /projects/design/.cdsinit /projects/design/cds.lib
C. 本次踩坑记录¶
chown rain01:design在宿主失败(宿主未接 LDAP)→ 改用2001:2000。- 首次误用
/pdk/templates(客户端路径)作为宿主源路径 → 改用/data/nfs/pdk/templates。
来源:
/home/rain/Documents/eda_tools_ins/Cadence/eda_workspace_standard_20260927/docs/SOP-项目区目录创建.md| 最后更新:2026-09-27 22:14(由build/sync.py同步,请勿在站点侧修改)