IC设计与EDA工具平台的规划与搭建
我们设想有一家叫作owlchip.com的公司,AD域的域名为:owl.local
IC设计工具平台的搭建思路
许多从传统行业或者从互联网行业转行过来的同学在刚上手管理一个IC设计工具开发平台的时候, 可能会对这个平台有些不大理解。
在以往的行业里, 开发人员大多是人手一台Windows或者Mac笔记本(有的场景下是Windows的VDI桌面,极少数公司会用纯的Linux开发环境), 在笔记本上安装PyCharm, Eclipse, VisualStudio等开发环境, 从代码库拉代码到本地, 开发调度然后上传到代码库,触发CI/CD的过程发布软件。
而在IC设计行业,就有挺大的区别了:
- 开发工具(EDA)不是安装在笔记本上,也不是运行在Windows和MacOSX上的,而是运行在一台配置比较高的服务器上(比如至强金牌的CPU+512G内存),然后通过VNC或者其它远程桌面工具连接到这台服务器上,操作EDA工具的图形化界面,承担这样任务的服务器叫“桌面服务器”。还有一种只做计算的”计算服务器“。
- 操作系统是RedHat系的LINUX(CentOS或者Rocky),因为大多数EDA工具规定就是要运行在这样的Redhat系统上,尽管你也可以折腾一顿让它运行在任何一个版本的LINUX上,但是没有这个必要,投资人召集了一群好贵的IC设计工程师是为了赶紧把产品设计出来,而不是纠结用啥操作系统。
- 研发团队所有人都工作在这台桌面服务器上, 所以很有可能一台服务器不够,得有多台,30-50名用户共享一台这样的“桌面服务器“。
- EDA工具的仿真、计算操作单独运行于”计算服务器“上。 这些任务以脚本的形式运行, 通常会有成千上万,每一条脚本、命令都会占用一个CPU核心。 众多的任务会排队运行, 使服务器的CPU满载,内存也会消耗完。
- 根据芯片大小的不同,需要的服务器数量不同。 一个200人的芯片公司,很有可能就需要5台登录服务器和100台计算服务器。 绝大部分计算服务器都是多核心或高主频、大内存(512G、1T、2TB)。 行业里面还经常管这样的服务器集群叫做HPC集群(High Performacne Compute)。
- 为了支持上述这样一台多人共享的LINUX开发、计算环境, 这些服务器(HPC)通常会共享同一个NFS存储,实现的效果就是任何一位用户, 登录任意一台HPC或者远程运行脚本命令时, 都有相同的家目录和环境变量,因为家目录是保存在共享的NFS位置而不是只存在于其中一台服务器。
于是,要搭建这样一套EDA平台的运行环境, 多人共享的IC设计开发平台, 我们需要:
- 使用一个统一认证系统,比如NIS和LDAP。这样团队的成员可以用同一套用户名和密码登录所有的服务器。
- 远程桌面登录的工具Linux服务器使用VNC,NoMachine以及行业标杆 ETX。
- 使用共享的NFS存储并在配置服务器时将/home 指向共享存储的一个共享目录;把EDA工具安装在一个共享的/tools目录;把项目文件放到共享的/proj目录。这样无论你登录哪台服务器,都可以看到相同的家目录,使用相同的工具。Linux提供的autofs,配合LDAP、NIS或者AD的功能来实现之。
- 使用少量的登录桌面服务器给研发人员用来画图和写代码。
- 设置由很多服务器组成的服务器群集,专门用来运行复杂的计算任务。
- 利用一个任务调度系统统一分派用户提交的计算任务,比如IBM的LSF。
关于认证系统
这样的一个环境无论如何你都得有一个集中化的身份认证的模块, 你可以选择使用:
-
Windows AD,无论是微软的Windows Server实现的还是用Samba AD实现的都行
-
FreeIPA(其中集成了DS389)
-
NIS, NIS+
-
OPENLDAP
到底要选哪种?如果仅从能跑起来一套完全基于LINUX的HPC集群来说, NIS可能是最简单直接的。 然而, 如果你的这个环境要引入比如Gitlab, Jenkins, Windows Server这一类产品的时候, NIS就没有办法很好的作为一个统一的认证系统与之集成了。 然后你管理的组织就不得不使用两套用户名和密码, 一套用于登录LINUX环境,一套用于登录别的。
我个人比较喜欢使用Windows AD, 它不仅能充当LDAP使用、配合Windows客户端与服务器使用, 也集成了DNS。 在我司,员工就只有两个密码,一个是登录钉钉的(钉钉不支持LDAP集成), 另外一个密码就是基于Windows AD的密码, 它与所有业务系统集成。
关于调度器
调度器是什么? 上文不是说过计算节点可能有上百个, 计算任务成千上万。 那如何让这成千上万的计算任务在HPC众多的服务器上运行呢? 这个行业的最佳实践就是使用”调度器“。 它的原理很简单, 使用一台主控节点用来接受用户的提交任务,比如我提交了1000个计算任务给主调度器的控节点,主控节点会把1000个任务分配给后台的100台HPC服务器。 对于专业的IC设计工程来说, 他会事先预估好每个任务需要多少CPU核心和多少内存, 通过调试器的命令指定在提交的命令之中,这会使主控节点在分配HPC资源的时候更加准确。
IBM的LSF的提交命令叫bsub, 简单的举例,我可以把一条简单的命令提交到HPC集群去执行,比如:
$ bsub echo "Hello World!"
$ Job <992300> is submitted to default queue <normal>.
把echo "Hello World!" 这个命令提交到了一个名为normal的HPC集群队列中, 生成的job id是992300。 屏幕上不会回显Hello World,因为命令并不在本地执行,而是在HPC集群的100台服务器中的一台上运行了。
调度器一般由以下选择:
- IBM的LSF,好贵的说~, 按HPC集群的物理核心数收费, 每个物理核心1000块人民币的数量级,根据核心总数的多少会有不同的折扣。
- 纯开源的Slurm,很多高校和科研机构会用这个。
- 速石Faststone的产品,基于SLURM封装成和类似于LSF一样的命令格式,还带了一堆管理工具。
- 上海开赟的ICP(一个基于IBM LSF的增强产品),外包了一些可视化的管理工具,本质上就是LSF,价格会便宜一点。
关于存储
集中式的存储是不可缺少的,但是你不能使用块存储,只能使用文件存储。并不一定必须使用NFS,但一定要是文件存储。 如果你不是很理解这一点,那还是老老实实的用NFS吧。
使用集中式的存储器,而不要使用类似于基于Ceph的分布式存储给你变出来的NFS存储, 如果你的预算有限, 使用一台典型的X86架构的2U服务器自己搭建一个NFS存储服务器也是可行的。
EDA工具和整个IC设计的领域, 会产生超级大量的小文件, 动辄一个目录几百万个小文件, 所有的文件系统加总起来总容量在几十TB或者几百TB。 这些小文件的读写、删除操作会对存储设备造成极大的压力。 生产和提供存储设备的厂家可能很多,但并不是所有厂家的产品都能适用于这样的环境。 在这个环节,你可以选择:
- NetApp的产品
- 华为的Dorado存储
- Dell的PowerScale
你去买上述这些厂家的存储器时, 至少他们的销售会非常清楚他们的某个产品是能或者不能用于EDA工具环境的,而且也会给出一堆案例证明自己的产品的确是可用的。 其它厂家的销售,有可能在听说你要用于IC设计环境用来跑EDA工具,会主动推荐你去选择NetApp的产品。
关于远程桌面工具
开发人员需要稳定可靠的远程桌面登录LINUX开发桌面, 在这个环境你有以下选择,
-
ETX(OpenText的Exceed TurboX)
ETX是这个场景下最好用的产品, 画质优秀,占用带宽小, 部署方便, 是IC设计环境的绝配。 也支持Windows Server系统的远程桌面。 除了它一套一万块左右的价格。
-
VNC
很多Linux都自带的TigerVNC,免费,易于取得,也挺稳定, 但是占用带宽比较大, 在纯内网使用的话问题不大, 如果你的开发人员遍布全国各地,就不行了。 另外商用版的RealVNC, UltraVNC, 价格会比ETX便宜很多,效果听有人说其实还行, 不过我没有用过商业版的。
-
Nomachie
NoMachine是一款使用了NX协议的远程桌面软件(( 对应的开源版本有个叫FreeNX的)。 Nomachine Terminal Server可以提供类似于ETX的功能, 但NoMachine Terminal Server并不支持Windows Server(这一点有些奇怪)。 NoMachine部署和使用起来也比VNC方便,带集群和高可用管理, 跨Internet使用时远不如ETX, 在带宽使用和画质上可能介于VNC与ETX之间。国内似乎没有这个产品的代理, 从国外官网上可以直接购买,不过这东西是订阅制的,每年都要付钱, 按CPU核心数量来的。 讲实话,如果一定要花钱, 从三五年的总体成本来说,ETX可能是会比NOMACHINE便宜的。
-
xlinkvnc( https://www.fasteda.cn/)
团子精英同学自己开发的一个产品,免费的, 比VNC好使, 还有一些附加的贴心功能,比如防截屏,防拷贝等等。 这里是链接
此外国内的厂商”至翔“也提供类似于ETX的产品,据说效果也是不错的,有兴趣的自行联系销售试用。
安装配置CentOS 7.9
此文件只适用于配置IC仿真设计平台的操作系统环境配置,用做其它用途的Linux随便你怎么配置
最小化安装
最小化安装 只选择 Development Tools
英文
时区选择上海
配置swap,boot与home分区
-
配置swap空间 16G
- IC仿真平台的LINUX主机通常都有远超过256G的内存,但SWAP不能设置的太大,也不能小于4G。 太小的话会有EDA工具在打开时提示SWAP太小而不符合条件,太大的设置也完全没有意义,EDA工具是在内存中运行的,实际上根本用不着SWAP有多大空间。
-
配置单独的/boot分区 保持默认1G
-
不要单独配置/home分区
把剩下所有的空间都分配给根/, 因为IC设计群集的/home是用的NFS远程存储,不需要本地有单独空间
设置root密码
记录在密码平台上,可以从KeePass或者
通过本地控制台配置IP地址
# 此时系统还未联网,需要通过本地控制台,配置静态IP,以下配置以10.12.1.104/24为例
nmcli conn modify ens192 \
ipv4.address 10.12.1.104/24 \
ipv4.gateway 10.12.1.254 \
ipv4.dns 10.12.6.1,10.12.6.2 \
ipv4.dns-search owl.local \
ipv4.method manual \
autoconnect yes
# 激活网卡,自己测试通不通
nmcli conn up ens192
ssh远程登录
# 通过ssh远程登录此服务器进行后续配置
ssh root@10.12.1.104
配置国内源
cd /etc/yum.repos.d/
curl -o Centos7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
yum update
安装常用工具与依赖包
yum install -y *readline*.i686
yum install -y *xorg*
yum install -y acpid
yum install -y apr*.i686
yum install -y apr-util.i686
yum install -y autofs
yum install -y binutils-devel
yum install -y bzip2-devel
yum install -y cmake
yum install -y compat*
yum install -y compat*.i686
yum install -y csh
yum install -y dos2unix
yum install -y expect
yum install -y gcc-c++
yum install -y gdbm.i686
yum install -y glibc*.i686
yum install -y glibc-devel
yum install -y gnuplot
yum install -y gperf
yum install -y gstreamer
yum install -y gtk+-devel.x86_64
yum install -y gtk2-devel
yum install -y gtk3-devel.x86_64
yum install -y gvim
yum install -y help2man
yum install -y hwloc
yum install -y ImageMagick
yum install -y kernel-devel
yum install -y ksh
yum install -y libelf.so.1
yum install -y libfftw3.so.3
yum install -y libGLU.so.1
yum install -y libstdc++*
yum install -y libXaw.i686
yum install -y libXmu.so.6
yum install -y libXp*
yum install -y libXrandr.so.2
yum install -y libXrender.so.1
yum install -y libXScrnSaver
yum install -y libXss.so.1
yum install -y libXt.so.6
yum install -y libXtst.so.6
yum install -y lm_sensors
yum install -y mesa-dri-drivers
yum install -y motif.i686
yum install -y ncurses*.i686
yum install -y netpbm
yum install -y net-tools
yum install -y nfs*
yum install -y ntp
yum install -y openmotif
yum install -y openssl-devel
yum install -y p7zip
yum install -y p7zip-plugins
yum install -y perl-XML-Simple
yum install -y plotutils
yum install -y pulseaudio*
yum install -y python2
yum install -y python3
yum install -y qt5-qtwebkit
yum install -y redhat-lsb
yum install -y samba
yum install -y svn
yum install -y tcl.i686
yum install -y tcl-devel
yum install -y tcsh
yum install -y tk.i686
yum install -y tk-devel
yum install -y tree
yum install -y wget
yum install -y xdpyinfo
yum install -y xorg-x11-fonts-ISO8859-1-75dpi
yum install -y xorg-x11-fonts-misc
yum install -y xorg-x11-server-Xvfb
yum install -y xpdf
yum install -y xterm
yum install -y Xvfb
yum install -y xz-devel
yum install -y zsh
yum install -y java-11-openjdk-devel
yum install -y centos-release-scl
yum install -y devtoolset-9-gcc*
yum install -y ed
# 至此,此操作系统镜像如果在虚拟机下部署,可以将其IP地址配置去掉,转换成一个模板
关闭selinux及firewall
#禁用 selinux
sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
#关闭 firewalld
systemctl disable firewalld
启用AUTOFS
# autofs在上文件依赖包安装中已经安装,在此只需启用,光启用是没用的,autofs需要额外的配置才能生效
yum install -y autofs
systemctl enable autofs
systemctl start autofs
用SSSD加域
# 安装相关依赖与工具
yum install realmd oddjob oddjob-mkhomedir sssd adcli samba-common-tools krb5-workstation ntp
# 配置计算机名,不要加owl.local后缀
hostnamectl set-hostname owlcmp05
# exit退出 ssh再连回来,你会发现shell提示符的hostname已经被更新成了owlcmp05
# 配置与域控制器同步时间一下,加域的计算机时间不能与DC相差太远
ntpdate owldc1.owl.local
# 用有域管理员权限的用户加域,此处用owlhero的账户,根据提示输入域账户密码即可
realm join owl.local -U owlhero
#修改 /etc/sssd/sssd.conf 文件
vi /etc/sssd/sssd.conf
[sssd]
domains = owl.local
config_file_version = 2
# 非HPC群集的登录和计算节点不需要配置autofs,在此删除,autofs
services = nss, pam, autofs
[domain/owl.local]
ad_domain = owl.local
krb5_realm = owl.LOCAL
realmd_tags = manages-system joined-with-samba
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_id_mapping = True
# 以下配置由True变为False
use_fully_qualified_names = False
# 以下配置要去掉@%d
fallback_homedir = /home/%u
access_provider = ad
enumerate = false
entry_cache_timeout = 3600
# 非HPC群集的登录和计算节点不需要配置autofs
autofs_provider = ad
ldap_autofs_search_base = ou=automapper,dc=owl,dc=local
ldap_autofs_map_object_class = nisMap
ldap_autofs_map_name = nisMapName
ldap_autofs_entry_object_class = nisObject
ldap_autofs_entry_key = cn
ldap_autofs_entry_value = nisMapEntry
# visudo 授权task-owl-linuxadmins, 你也可以添加你的域账户为sudoer,加组的时候前面要有%
# Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
%task-owl-linuxadmins ALL=(ALL) ALL
# 配置系统auth模块启用sssd以及mkhomedir 模块
authconfig --enablesssd --enablesssdauth --enablemkhomedir --update
# 重启sssd服务
systemctl restart sssd
# 此时你可以再开一个ssh窗口, 用你的域账户测试连接此台服务器,正常的话你可以登录,并且sssd会在/home下自动创建你的家目录
reboot
xfce4轻量桌面
基础安装配置
# 安装 lightdm, lightdm 是一个cross platform的dm, 可以用来管理各类DE, GDM是Gnome Desktop Manager,擅长管理Gnome的DE
yum install -y lightdm
# 查看当前有DM用的是哪个
ls -l /etc/systemd/system/display-manager.service
# 修改 /etc/lightdm/lightdm.conf 使其支持 XDMP
vi etc/lightdm/lightdm.conf
[XDMCPServer]
enabled=true
port=177
# 禁用默认的gdm,启用lightdm
systemctl disable gdm && systemctl enable lightdm
# 重新lightdm
init 3 && init 5
# 安装 X Window System
yum groupinstall "X Window system" -y
# 有人也会把Server with GUI也装上,这样就有更丰富的应用包,比如firefox, thunderbird等等
yum groupinstall "Server with GUI" -y
# 安装xfce
yum groupinstall "Xfce" -y
# 配置Linux系统默认启动进图形界面,如果你用systemctl get-default来查看,如果返回值是multi-user.target,就代表非图形界面,level3。只有显示graphical.target才是图形界面,也就是level 5.
systemctl set-default graphical.target
# 移除别的桌面配置,只保留/usr/share/xsessions/下xfce.desktop文件。如果你想保留着也行,不过意义不大,因为那个界面只有在本地控制台才能选择其它桌面。
# 立即重启桌面环境
systemctl isolate graphical.target
#附赠两个中文字体,没事的时候不用装
yum install -y cjkuni* wqy*
移除关机与重启按钮
# 创建新文件并填写以下内容
vi /etc/polkit-1/rules.d/55-inhibit-shutdown.rules
polkit.addRule(function(action, subject) {
if ((action.id == "org.freedesktop.consolekit.system.stop" || action.id == "org.freedesktop.consolekit.system.restart") && subject.isInGroup("admin")) {
return polkit.Result.YES;
}
else {
return polkit.Result.NO;
}
});
# 不需要重启,这个目录是被LINUX系统即时监控的
Mate
避免 Authentication is required to create a color profile
vi /etc/polkit-1/localauthority.conf.d/02-allow-colord.conf
polkit.addRule(function(action, subject) {
if ((action.id == “org.freedesktop.color-manager.create-device” ||
action.id == “org.freedesktop.color-manager.create-profile” ||
action.id == “org.freedesktop.color-manager.delete-device” ||
action.id == “org.freedesktop.color-manager.delete-profile” ||
action.id == “org.freedesktop.color-manager.modify-device” ||
action.id == “org.freedesktop.color-manager.modify-profile”) &&
subject.isInGroup(“{group}”)) {
return polkit.Result.YES;
}
});
NoMachine
版本说明
NoMachine在我们所谈论的这个生产环境中可以用到的有三个版本:
- Enterprise Terminal Server : 这是一个可以独立运行的版本,可以将一台Linux主机发布给多人共同使用
- Enterprise Terminal Server Cluster : 这是一个群集版本,它自己也可以实现Terminal Server的全部功能,也可以在其后挂载更多的Terminal Server Node,提供一个多机负载均衡的整体
- Enterprise Terminal Server Node :些版本无法单独使用,必须配合Server Cluster来使用
对于前两者的安装方法在单台服务器的时候几乎是一样的, 这款软件国内似乎没有很专业的代理存在,你可以通过它的在线商店订购。
在我们的环境中,用做用户接入的两台Cluster 服务器和登录桌面都放在虚拟化的平台上。
基础安装配置
# 切换至root账户
# 下载并安装
rpm -ivh https://download.nomachine.com/packages/8.1-PRODUCTION/Linux/nomachine-enterprise-terminal-server-cluster_8.1.2_1_x86_64.rpm
# 配置远程连接默认启用xfce4, 修改各node节点上的配置文件 /usr/NX/etc/node.cfg 中的 DefaultDesktopCommand为startxfce4
...
DefaultDesktopCommand "/usr/bin/startxfce4"
...
# 用脚本自动处理是:
sed -i 's/^DefaultDesktopCommand.*/DefaultDesktopCommand \"\/usr\/bin\/startxfce4\"/' /usr/NX/etc/node.cfg
配置两个主管理节点
主管理节点要配置基本的认证不需要安装桌面以及工具,它们的作用仅用来接入客户访问,并把客户的访问转发到后面的Linux桌面节点服务器。 在此案例中,一共有4台主机,主机名与配置如下:
- owlnxmaster01 ~ 01 2C/4G , 10.12.6.100 为虚拟地址, 10.12.6.99和10.12.6.101分别为master01和02的地址
- owlnxnode01 ~ 02 16C/128G
# 在master01和master02上安装 Enterprise Terminal Server Cluster
# 在owlnxnode01和owlnxnode02 上安装 Enterprise Terminal Server Node
# 在owlnxmaster01 第一台主节点上
/usr/NX/bin/nxserver --clusteradd --local 10.12.6.99 --shared 10.12.6.100 --netmask 255.255.255.0 --interface ens192:0
/usr/NX/bin/nxserver --clusteradd 10.12.6.101 --netmask 255.255.255.0 --interface ens192:0
/usr/NX/bin/nxserver --restart
# 然后在owlnxmaster02 上也执行 nxserver --restart命令,依次重启两台主节点服务器上的服务
# 在owlnxmaster01主节点是执行 clusterupdate,这一步不做似乎自动的VIP切换不生效
/usr/NX/bin/nxserver --clusterupdate
# 查看集群配置
/usr/NX/bin/nxserver --clusterlist --configuration
添加两台节点服务器
/usr/NX/bin/nxserver --nodeadd owlnxnode01:4000 --node-name owlnxnode01
/usr/NX/bin/nxserver --nodeadd owlnxnode02:4000 --node-name owlnxnode02
/usr/NX/bin/nxserver --clusterupdate
禁止文件传出 在MASTER上执行
# 这条命令可以列出所有的"resource",然后你可以根据 class ,type和值 来配置规则
/usr/NX/bin/nxserver --resourcelist
# 从服务器上可以复制800字符的文本
/usr/NX/bin/nxserver --ruleadd --class feature --type server-clipboard-limit --value 800 --system
# 从客户机上可以复制800字符的文件,客户机这里也许可以调大一点
/usr/NX/bin/nxserver --ruleadd --class feature --type client-clipboard-limit --value 800 --system
# 不允许通NoMachine连接物理控制台
/usr/NX/bin/nxserver --ruleadd --class session --type physical-desktop --value no --system
# 以下是禁用一堆重定向的配置,看字面意思,就不解释了
/usr/NX/bin/nxserver --ruleadd --class service --type server-printer-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type client-network-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type audio --value no
/usr/NX/bin/nxserver --ruleadd --class service --type server-network-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type client-usb-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type server-disk-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type local-recording --value no
/usr/NX/bin/nxserver --ruleadd --class service --type client-smartcard-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type microphone --value no
/usr/NX/bin/nxserver --ruleadd --class service --type client-printer-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type client-disk-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type server-file-transfer --value no
/usr/NX/bin/nxserver --ruleadd --class service --type session-recording --value no
/usr/NX/bin/nxserver --ruleadd --class service --type server-usb-sharing --value no
# 允许从客户机上传文件到服务器
/usr/NX/bin/nxserver --ruleadd --class service --type client-file-transfer --value yes
# 以上配置是对全局生效,如果你要针对某个用户或者组单独设置策略,在命令后添加 --user USERNAME / --group GROUP 参数
NoMachine的性能调优
在节点服务器上的图形界面右上角“!M"图标点右键,Performance下有五个选项。
- User a specific display: VP8/H264 # 可能会对性能产生较大的不利影响,在自己的环境中测试一下开启的效果
- Use hardware encoding
- Use a specific frame rate
- Use acceleration for display processing
- Use X11 vector graphics mode in virtual sessions # 可能会对性能产生非常大的不利影响,在自己的环境中测试一下开启的效果
使用Custom Session
对于通过VPN或者专线远程访问的用户,使用默认的Virtual Session桌面会带来很大的开销,你可以通过在创建新桌面时选择"Create new custom session",然后指定启动xfce4-terminal + floating windows的方式来只启动一个Terminal。 这会极大的增加系统的流畅度。对于画版本、Layout和看波形的工具相当的友好,可以比较接近ETX的效果,当然,还是差得很远~ 画图的时候, 单个ETX桌面可以稳定的保持在数个Mbps的带宽消耗,而NoMachine是有可能会上到几十Mbps的,即使使用Custom Session,也有可能会奔到10Mbps。
在此种模式下,有时候应用程序 的GUI显示不正常,比如展示成绿方块。 你可以通过变更客户端显示选项中的Advcanced display seetings中的以下两个选项来解决此问题:禁用 client side image post-processing和disable client side hardware encoding。
对登录桌面节点进行分组
我们把上例中的两个登录节点分成两个组,hw-nodes和sw-nodes,分别给硬件和软件团队使用,未来我们还可以往这两个组中增加更多的登录节点。 对登录节点分组的目的是为了可以针对一批登录服务器进行策略的配置。
# 建两个组
/usr/NX/bin/nxserver --nodegroupadd hw-nodes
/usr/NX/bin/nxserver --nodegroupadd sw-nodes
# 把现存的两个节点放到两个组中
/usr/NX/bin/nxserver --nodeedit owlnxnode01 --comment "hardware team node" --node-group hw-nodes
/usr/NX/bin/nxserver --nodeedit owlnxnode02 --comment "software team node" --node-group sw-nodes
指定不同的用户访问不同的节点
把研发人员分成两个组,在AD中建安全组,hardware-node-users 和 software-node-users,然后制定策略,使硬件组的人只能登录hw-nodes中的节点。软件组亦然。
/usr/NX/bin/nxserver --ruleadd --class node --type hw-nodes --value yes --group hardware-node-users
/usr/NX/bin/nxserver --ruleadd --class node --type sw-nodes --value yes --group software-node-users
# 如果有些用户或者人需要能手动选择登录节点的权限时,比如IT管理人员,可以针对此人的账户添加手动选择节点的能力。
/usr/NX/bin/nxserver --ruleadd --class feature --type manual-node-selection --value yes --user owlhero
Troubleshooting
# 有时候执行 nxserver --nodelist 时显示节点unavailable ,在master上依次对所有节点执行一下这个命令
/usr/NX/bin/nxserver --nodeedit owlnxnode01:4000
# 在master上查看所有的session
/usr/NX/bin/nxserver --list
#断开指定用户的session
/usr/NX/bin/nxserver --kill $display
/usr/NX/bin/nxserver --kill $username
Modules
Modules 的官网:https://modules.readthedocs.io/en/latest/module.html;可以参考官网上的文档进行安装,目前公司EDA服务器上使用的module版本是4.5.0,采用编译安装的方式,安装路径:/tools/misc/modules ;其中default路径下为module 工具安装路径及配置文件路径,modulefiles文件下主要是配置环境变量文件存放路径,我们新增或修改环境变量主要再该目录下进行操作。该工具主要的用途是配置EDA工具的环境变量,用户可以根据项目需求切换工具版本。
安 装 Modules 工 具 后 , 还 需 要 对 Module 工 具 进 行 一 次 初 始 化 , 在/tools/misc/modules/default/init下(这个位置是个NFS共享位置),可以找到针对不同 SHELL 的初始化脚本,比如 C Shell。
#csh
source /tools/misc/modules/default/init/csh
#bash
source /tools/misc/modules/default/init/bash
我们目前的做法是将这两个文件通过软链接的方式,连接到/etc/profile.d目录下实现自动加载用户不需要再source 。
ln -s /tools/misc/modules/init/profile.sh ./profile.sh
ln -s /tools/misc/modules/init/profile.csh ./profile.csh
使用modules
# 查看有哪些配置好的modules, 有ic617, localeda 以及废弃不用的remoteeda
module avail
----------------- /tools/misc/modulefiles/eda -----------------
ic617 localeda remoteeda
# 配置文件在/tools/misc/modulefiles/eda ,你自己看看就懂了,以下是示例
vi /tools/misc/modulefiles/eda/localeda
#%Module1.0###################################
#
# modules modulefile
#
proc ModulesHelp { } {
global version prefix
puts stderr "\tmodules - loads the modules software & application environment"
puts stderr "\n\tThis adds $prefix/* to several of the"
puts stderr "\tenvironment variables."
puts stderr "\n\tVersion $version\n"
}
module-whatis "loads the modules environment"
# load license 这里配置的license服务器
setenv SNPSLMD_LICENSE_FILE 27000@owllic01
setenv CDS_LIC_FILE 5280@owllic01
setenv MGLS_LICENSE_FILE 1717@owllic01
# for Tcl script use only
set version 5.0.1
set prefix /tools/misc/modules
set eda_dir /tools/eda
# verdi
set VERDI_HOME ${eda_dir}/synopsys/verdi/P-2019.06-SP1
setenv VERDI_HOME ${VERDI_HOME}
prepend-path PATH ${VERDI_HOME}/bin
# vcs
set VCS_HOME ${eda_dir}/synopsys/vcs/P-2019.06-SP1
setenv VCS_HOME ${VCS_HOME}
#set UVM_HOME ${VCS_HOME}/etc/uvm-1.2
prepend-path PATH ${VCS_HOME}/bin
# hspice
set HSPICE_HOME ${eda_dir}/synopsys/hspice/T-2022.06
setenv HSPICE_HOME ${HSPICE_HOME}
prepend-path PATH ${HSPICE_HOME}/hspice/bin
IBM LSF调度工具
我们采用IBM LSF社区版,此版本支持10台点主机。 安装包可以在IBM LSF官网下载。解压后我们首先对其安装配置文件进行初始配置,然后安装到/tools/misc/lsf目录之下, 此目录为NFS共享位置。
LSF的主节点我们安装在一台单独的服务器之上,此节点只作为管理节点,并不承担计算任务。
准备lsf master服务器
- 虚拟机4C/16G/50G
- 安装同样版本的CentOS
- 配置关闭SELINUX和防火墙
- 启用AUTOFS,并且得挂载/tools目录
- 用SSSD加域,其一是为了方便日后管理,另外, lsfadmin这个系统管理账户也是在AD上建立。
- 不需要安装xfce4以及nomachine以前文件中的其它步骤
安装master节点 owllsf01
# master节点计算名为:owllsf01, ssh登录该服务器, 切换至root账户下
# 解压安装包至/root
# 确保共享位置/tools正确挂载
# cd进入安装目录
cd /root/
vi install.conf
LSF_TOP="/tools/misc/lsf"
# 在AD上要事先创建此账户
LSF_ADMINS="lsfadmin"
LSF_CLUSTER_NAME="flock1"
LSF_MASTER_LIST="owllsf01"
# 社区版不需要license
# LSF_ENTITLEMENT_FILE="/root/IBM/LSF/lsf_std_entitlement.dat"
# 执行安装,安装过程需要安装ed 工具,在装操作系统的依赖中已经装了,如果没有装,需要yum install ed
./lsfinstall -f install.config
# 安装完毕后安装自启动服务
/tools/misc/lsf/10.1/install/hostsetup --top="/tools/misc/lsf/" --boot="y"
# 针对AUTOFS挂载的/tools做的特别设置
# 在启动过程中,autofs挂载的/tools有可能会有延迟,导致lsfd无法找到/tools/misc/lsf的目录
# 所以我们需要对lsfd的服务加一个判断
vi /usr/lib/systemd/system/lsfd.service
[Service]
......
ExecStartPre=/bin/bash -c 'while [ ! -d /tools/misc/lsf ]; do /usr/bin/sleep 5; done'
TimeoutStartSec=300
# 启动服务
systemctl enable lsfd
systemctl start lsfd
#source 环境变量
#csh
source /tools/misc/lsf/conf/cshrc.lsf cshrc.lsf.csh
#bash
source /tools/misc/lsf/conf/profile.lsf
# 执行bhosts可以看到有如下输出代表工作正常
HOST_NAME STATUS JL/U MAX NJOBS RUN SSUSP USUSP RSV
owllsf01 ok - 1 0 0 0 0 0
# 配置开机自动为用户source lsf的环境变量
cd /etc/profile.d/
ln -s /tools/misc/lsf/conf/profile.lsf profile.lsf.sh
ln -s /tools/misc/lsf/conf/cshrc.lsf cshrc.lsf.csh
安装slave节点 owllsf02
# 配置好autofs让/tools 目录正确挂载
# 更新install.conf文件增加owllsf02
vi /tools/misc/lsf/10.1/install/install.config
LSF_MASTER_LIST="owllsf01 owllsf02"
# 在lsf02上生成自启动服务
/tools/misc/lsf/10.1/install/hostsetup --top="/tools/misc/lsf/" --boot="y"
# 修改owllsf02 上的 lsfd.service 配置,针对autofs进行优化,参见master设置ExecStartPre=
# 启动服务
systemctl enable lsfd
systemctl start lsfd
#source 环境变量
#csh
source /tools/misc/modules/default/init/csh
#bash
source /tools/misc/modules/default/init/bash
# 执行bhosts可以看到多了一台主机如下输出代表工作正常
HOST_NAME STATUS JL/U MAX NJOBS RUN SSUSP USUSP RSV
owllsf01 ok - 1 0 0 0 0 0
owllsf02 ok - 1 0 0 0 0 0
# 配置开机自动为用户source lsf的环境变量
cd /etc/profile.d/
ln -s /tools/misc/lsf/conf/profile.lsf profile.lsf.sh
ln -s /tools/misc/lsf/conf/cshrc.lsf cshrc.lsf.csh
在登录节点和计算节点上安装 lsfd
# 配置好autofs让/tools 目录正确挂载
# 更新install.conf文件增加,与master/salve管理节点的配置不同,这次是更改 LSF_ADD_SERVERS="host1 host2 host3 host4"
vi /tools/misc/lsf/10.1/install/install.config
LSF_ADD_SERVERS="owlnxnode01 owlnxnode02 owlcmp02 owlcmp03 owlcmp04"
# 在cluster配置文件中增加节点,比如增加owlcmp06,节点类型是(cs)
vi /tools/misc/lsf/conf/lsf.cluster.flock1
...
owlnxnode02 ! ! 1 (linux)
owlcmp05 ! ! 1 (cs)
owlcmp06 ! ! 1 (cs)
End Host
# 在各节点上生成自启动服务
/tools/misc/lsf/10.1/install/hostsetup --top="/tools/misc/lsf/" --boot="y"
# 配置开机自动为用户source lsf的环境变量,参考主节点设置
# 修改各节点上的 lsfd.service 配置,针对autofs进行优化,参见master设置ExecStartPre=
# 启动服务
systemctl enable lsfd
systemctl start lsfd
# 在lsf主节点上执行lsadmin reconfig
lsadmin reconfig
badmin reconfig
指定登录节点不参与计算
# 这已经不是安装过程了,所以工作目录是在install的上一层,查看并确认各节点的配置,mg是管理节点,cs是计算节点,linux在此是我用来区分cs随便指定的。关于mg, cs, linux的定义是在lsf.shared里面有指定的,也不能完全乱写
# 对于群集的管理要在lsf01或者lsf02上进行,不能在其计算/登录节点上进行
vi /tools/misc/lsf/conf/lsf.cluster.flock1
owllsf01 ! ! 1 (mg)
owllsf02 ! ! 1 (mg)
owlcmp02 ! ! 1 (cs)
owlcmp03 ! ! 1 (cs)
owlcmp04 ! ! 1 (cs)
owlnxnode01 ! ! 1 (linux)
owlnxnode02 ! ! 1 (linux)
# 关闭 owlnxnode01/02,owllsf01/02,使其不参与计算
badmin hclose owllsf01 owllsf02 owlnxnode01 owlnxnode02
Close <owllsf01.owl.local> ...... done
Close <owllsf02.owl.local> ...... done
Close <owlnxnode01.owl.local> ...... done
Close <owlnxnode02.owl.local> ...... done
# 在主节点上执行配置更新
# 如果你是对lsf.* 配置文件进行的修改,须执行
lsfadmin reconfig
#如果你是对lsb.*配置文件进行的修改,须执行
badmin reconfig
其它配置
# 对于job和任务的配置在
/tools/misc/lsf/conf/lsbatch/flock1/configdir/lsb.*
EDA工具的License服务器
位于owllic01,其上运行着FlexNET出品的授权工具,在芯片设计EDA包括CAD行业很通用,运行在/opt/license/下面,启动文件是lmgrd
通过/etc/rc.local 下的三条命令实现开机自启动
# /etc/rc.loca的最后三行配置 ,启动了授权,以及日志位置,工具有时候出授权报错的时候可以来这里看日志,但是一般不会出错的
/opt/license/lmgrd -c /opt/license/cadence.dat -l /opt/license/cadence.log
# 在/opt/license/下面有一些可执行的工具
# License由lmgrd启动,去读对应的license文件,而license文件最开头又指向了各家自用的启动程序,以及监听端口。
# 实际承载各家的授权的启用程序各不相同,cdslmd是cadence的, snpslmd是synopsys的,mgcld是mentor的, ansyslmd是ansys的
# lmreread用于在一个license文件新增加feature后使用
# lmstat 可以用来查看授权服务的状态
Windows AD 与 AUTOFS
配置sssd以支持AD autofs
在用sssd加域的章节,可以启用sssd对于autofs的支持
[sssd]
...
services = nss, pam, autofs
...
autofs_provider = ad
ldap_autofs_search_base = ou=automapper,dc=owl,dc=local
ldap_autofs_map_object_class = nisMap
ldap_autofs_map_name = nisMapName
ldap_autofs_entry_object_class = nisObject
ldap_autofs_entry_key = cn
ldap_autofs_entry_value = nisMapEntry
# 配置了以上sssd.conf的主机,可以从AD中读取autofs的配置信息
# 在此例中我们把autofs的配置放到 ou=automapper, dc=owl, dc=local 下面
用ADSI工具增加autofs条目
-
打开ADSI工具,连接到 Default naming context
-
在OU=automapper之下添加auto.master和auto.h3c两个nisObject. auto.master必须是这个名字,auto.h3c可以自定义,需要在auto.master配置的过程中指向这个新名称即可。两个Object的类型都是nisMap, nisMapName分别是auto.master和auto.h3c
-
在auto.master下创建 一个名字叫 "/-" 的indirect map
- new Object -> nisObject
- cn: /
- nisMapName:auto.master
- nisMapEntry: auto.h3c
-
在auto.h3c下创建多条实际的NFS挂点,以/tools为例,它来自x10000.owl-nas.local:/NFS/CAPFS/nfs_tools
-
new Object -> nisObject
-
cn:/tools
-
nisMapName:auto.h3c
-
nisMapEntry:-rw,relatime,sync,rsize=131072,wsize=131072,hard,bg,intr,vers=3,tcp x10000.owl-nas.local:/NAS/CAPFS/data/nfs_tools
其实不用指这么些参数, rw, hard, bg, intr, vers=3 即可,IC设计平台推荐用nfs3
-
-
按同样的方法配置/home和/proj
-
在所有需要挂载nfs的主机上执行systemctl restart autofs && automount -m 可以完成挂载。 因为涉及到home目录的问题,所以这些配置要在最开始配置环境的时候用root做,做完了重启服务器。
-
本例子中使用的存储设备是一台分布式存储,仅用于演示搭建过程设备,不要在你的生产环境中用它, 你会后悔的。在生产环境中只推荐NETEAPP, POWERSCALE, 华为DORAODO或者自建NFS服务器
owl Nest 环境中的环境变量
cd /etc/profile.d/
#modules
ln -s /tools/misc/modules/init/profile.sh ./profile.sh
ln -s /tools/misc/modules/init/profile.csh ./profile.csh
#lsf
ln -s /tools/misc/lsf/conf/profile.lsf profile.lsf.sh
ln -s /tools/misc/lsf/conf/cshrc.lsf cshrc.lsf.csh
# 针对编译安装的bison
mv /usr/bin/bison /usr/bin/bison.bak
update-alternatives --install /usr/bin/bison bison /tools/swtools/bison/3.5.1/bin/bison 1
# 针对编译安装的ycc
mv /usr/bin/yacc /usr/bin/yacc.bak
update-alternatives --install /usr/bin/yacc yacc /tools/swtools/bison/3.5.1/bin/yacc 1
# 针对编译安装的git
mv /usr/bin/git /usr/bin/git.bak
update-alternatives --install /usr/bin/git git /tools/swtools/git/2.9.5/bin/git 1
# 针对编译安装的flex
mv /usr/bin/flex /usr/bin/flex.bak
update-alternatives --install /usr/bin/flex flex /tools/swtools/flex/2.6.4/bin/flex 1
# 针对编译安装的valgrind
echo "export PATH=\$PATH:/tools/swtools/valgrind/3.19/bin" > /etc/profile.d/valgrind.sh
echo "setenv PATH \"/tools/swtools/valgrind/3.19/bin:\$PATH\"" > /etc/profile.d/valgrind.csh
代理服务器squid
IC设计平台因为代码保护和其它安全原因,不能开放公网访问。为了方便开发人员临时从常用python、操作系统、开发工具的升级站点拉取一些工具包,我们配置了一个基于squid的代理服务器。 通过域名白名单可以使开发者访问有限的域名。
squid安装不在此说明。
此服务器主机名为: owlproxy01, 在客户环境使用时可以用以下命令生效
# csh
setenv all_proxy http://owlproxy01:3128
# bash
export all_proxy=http://owlproxy01:3128
/etc/squid/squid.conf
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 8481 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
#在此指定白名单文件
acl whitelist dstdomain "/etc/squid/whitelist.txt"
http_access allow CONNECT whitelist
http_access deny CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access allow whitelist
http_access deny all
http_port 3128
cache_dir ufs /var/spool/squid 4096 16 256
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
/etc/squid/whitelist.txt
.centos.org
fedoraproject.org
mirror.aliun.com
mirrors.cloud.aliyuncs.com
.gnu.org
#Visual Code
marketplace.visualstudio.com
vscodeexperiments.azureedge.net
update.code.visualstudio.com
.gallerycdn.azure.cn
.gallery.vsassets.io
.exp-tas.com
az764295.vo.msecnd.net
#Eclipse
.eclipse.org
#Xilinx
.xilinx.com
.entitlenow.com
#OpenCV
.githubusercontent.com
#pip3
.pypi.python.org
.pypi.org
.pythonhosted.org
配置变更生效
squid -k reconfig
Windows AD
创建用户一定要写得整齐划一
# 以下是一个示例,账户的创建与更新可以用powershell来批量实现, 对于办公地点,公司,部门的定义要早规划和定义好,在IT管理领域,我们是很经常针对公司、部门、办公地点等信息对人员和设备进行分组和批量管理的;人员、部门、实体公司要有唯一编码;办公地点也可以有编码,但它本身就比较简短而且数量可以不多,可以起用办公地点的名称同时也做编码
First name: Owl
Last name: Hero
Display name: Owl Hero 陈大玉
E-Mail: owl.hero@owlchip.com
Office: OWL HQ
User logon name: owlhero
UPN: @owlchip.com
Job Title: Manager - Software Platform
Department: D100107 Software Platform
Company: owlChip
Manager: Michael Jackson
City: Shanghai
State/province: Shanghai
Country/region: China
DN名: Owl Hero
Home Folder Connect to Drive H: \\owlfile01\homes$\%username%
#非Linux用户保持Domain Users
Primary Group: hardware/software/application
AD组策略
组织的AD至少要以下策略:
- 密码复杂度策略,密码要复杂且有过期时间
- 屏保策略,电脑不操作10分钟内要锁屏
- 本地登录策略,只有本地管理员才能登录本人电脑
- Bitlocker全盘加密,配置密钥备份在AD,本地硬盘进行加密,这样电脑丢了也不会泄露数据
- 证书策略,自动针对用户和计算机颁发域内信息的证书
- 补丁更新策略,工作站和服务器分别制定强制安装更新并计划重启的策略
- USB策略,禁止写入外部存储设备
与外部系统的认证整合
Office 365可以与AD整合,如果已经有很多人在用云端的office 365账户,可以分批处理,对于新人使用同步,对于现存用户可以逐渐迁移。
或者也可以用联合验证,不过开销有些大,也可以参考。
站点与子网
1. 各地的办公场所要有本地的DC
1. 配置本地的DHCP在DC上
1. DNS要配置Reverse Lookup Zones
1. 新的站点要在AD Sites and Service里面注册,确保每一个子网都落入正确的DC
GitLab 安装 (Ubuntu 18.04)
# 信任GitLab的GPG公钥
curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
vi /etc/apt/sources.list.d/gitlab-ce.list
#添加此一行到gitlab-ce.list
deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu bionic main
apt-get update
EXTERNAL_URL="https://gitlab.owl.local" apt-get install gitlab-ce
#如果你是用的代理,注册在Ubuntu18.04下, all_proxy 对于apt-get 不起作用,你可以用 apt-get -o Acquire::http::proxy="http://proxyserver:3128" update 来使用代理
#也可以vi /etc/gitlab/gitlab.rb
#配置gitlab
gitlab-ctl reconfigure
# 配置完成后,root的初始密码保存在/etc/gitlab/initial_root_password 24小时有效
#启动gitlab
gitlab-ctl start
# 用root账户登录网页,修改root密码
# 配置LDAP
# vi /etc/gitlab/gitlab.rb
gitlab_rails['ldap_enabled'] = true
gitlab_rails['prevent_ldap_sign_in'] = false
##! **remember to close this block with 'EOS' below**
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
main:
label: 'RAWSTONE LDAP'
host: 'shadc01.owl.local'
port: 389
uid: 'sAMAccountName'
bind_dn: 'CN=dirlookup,OU=ServiceAccounts,OU=Shanghai,OU=China,DC=owl,DC=local'
password: 'Very-Good-Password1#'
encryption: 'plain' # "start_tls" or "simple_tls" or "plain"
active_directory: true
allow_username_or_email_login: true
base: 'dc=owl,dc=local'
user_filter: '(memberOf:1.2.840.113556.1.4.1941:=CN=gitlab-external-users,ou=Groups,ou=shanghai,ou=china,dc=owl,dc=local)'
EOS

浙公网安备 33010602011771号