跳转至

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 会失败——必须用数字 ID 2001: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. 本次踩坑记录

  1. chown rain01:design 在宿主失败(宿主未接 LDAP)→ 改用 2001:2000。
  2. 首次误用 /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 同步,请勿在站点侧修改)