模拟IC研发环境配置:Linux NIS服务器与FreeNAS/FreeBSD客户端

模拟IC的研发设计环境基本就是Linux集群+NIS域控制器+LSF任务调度+NFS存储,在IT业内应该是很老的一套架构了,但是在国内的半导体市场里面似乎还有很多小公司没有完善这一套体系,即便有,LSF和NFS也没有针对IC设计去调优,基本就是能用就行。很多公司就是受限于服务器仿真资源,local登录上去,丢几个corner仿真,ssg ffg这些可能也不管,投出去回来OK,至于一些小概率问题等量产再去解决。当然也不是不行吧,相信foundry控制得好或者能筛出来也问题不大。

这次有机会在新的公司新的平台搭建这一套环境,从零开始记录遇到的一些问题吧。

首先为什么用NIS域控制器?我曾经在2019年毕业前搭建过LDAP服务器,可能是当时CentOS 7恰好最新的版本有一些二进制包有BUG,遇到了很痛苦的问题,最后搞了两三天才解决基本的功能,LDAP还是过于复杂了。当然LDAP有一个好处是有WEBGUI来管理用户。后来去了第一家公司工作,发现采用的就是NIS架构,感觉对于中小型公司的Linux集群来说,只服务研发人员,与全公司通用的AD域控制器分开也没什么不妥,于是这次搭建也采用NIS,反正对于半导体业内来说,什么NIS、CSH/TCSH、2.6内核GNOME也不算老

其次为什么用FreeNAS(现在TrueNAS),根本原因还是预算有限,不然可以直接买NETAPP的产品。之前我用过华为的一款存储,感觉就跟个Linux x86 Server然后export几个mount point一样,还不如x86自己搭建呢。于是决定用x86搭建,x86搭建NAS,ZFS总归比BTRFS靠谱一些,硬核方案是自己Linux From Scratch+OpenZSF,或者Unraid+OpenZSF,但是我用Unraid的体验真的是很糟糕,经常网卡就断掉或者内核崩溃,所以FreeNAS就是最佳选择了。TrueNAS Scale还在RC状态,不得不硬着头皮用BSD,于是就遇到了和NIS服务器的问题。

最开始的现象就是配置NIS以后,FreeBSD重启经常卡住,卡在starting mountd,还有dbus等组件。后来发现NIS关掉就不会出现这个问题,而NIS服务器和NIS的Linux客户端经过测试都没什么问题,检索一下发现BSD对用户名密码的要求还真的不一样。

developer’s log: FreeBSD as NIS client of Linux (zbigg.blogspot.com)

For record: FreeBSD has a little different way of storing important login information – Linux stores it in /etc/passwd and /etc/shadow FreeBSD uses only /etc/master.passwd (/etc/passwd is generated from the former for reference).
/etc/master.passwd contains both traditional “passwd” data like name, uid, gid, home shell + password and some administrative values.
So, FreeBSD expects NIS server to provide master.passwd file but and OOB Linux NIS server installation doesn’t have it. One must add it to YP database. It’s not so hard.
At least on Debian/Ubuntu YP domain data are stored in /var/yp. There is one makefile that simply generates all YP server data files from your … (choose passwd, group, shadow, hosts …). Regarding passwords we must generate two databases master.passwd.byuid and master.passwd.byname very similarly as passwd.{byname,byuid} are created. So let’s go: Here is python script that takes custom merger output (shadow+passwd) and makes “master.passwd” compatible file.

参考上面文章的帮助,我们在NIS服务器上新建一个Python脚本

#!/usr/bin/python

shell_map = {
    "/bin/bash": "/usr/local/bin/bash"
}
def map_shell(shell):
    return shell_map.get(shell, shell)

import sys
for line in sys.stdin.readlines():
    line = line.strip();
    name, passwd, uid, gid, desc, home, shell = line.split(':')
    desc_fields = desc.split(",")
    gecos = desc_fields[0]
    class_name = ""
    password_change_time = "0"
    account_expiration_time = "0"
    shell = map_shell(shell)
    all = ":".join([name, passwd, uid, gid, class_name, password_change_time, account_expiration_time, gecos, home, shell])
    print all

然后编辑/var/yp/Makefile

在最后添加

# FREEBSD (FREENAS) support 

master.passwd.byuid: $(PASSWD) $(SHADOW) $(YPDIR)/Makefile
        @echo "Updating $@"
        @$(MERGER) -p $(PASSWD) $(SHADOW) | $(MASTER_PASSWD_CONVERTER) | \
        $(AWK) -F: '!/^[-+#]/ { if ($$1 != "" && $$3 >= $(MINUID) && $$3 != $(NFSNOBODYUID) ) \
        print $$3"\t"$$0 }' | $(DBLOAD) -i $(GROUP) -o $(YPMAPDIR)/$@ - $@
        -@$(NOPUSH) || $(YPPUSH) -d $(DOMAIN) $@

master.passwd.byname: $(PASSWD) $(SHADOW) $(YPDIR)/Makefile
        @echo "Updating $@"
        @$(MERGER) -p $(PASSWD) $(SHADOW) | $(MASTER_PASSWD_CONVERTER) | \
        $(AWK) -F: '!/^[-+#]/ { if ($$1 != "" && $$3 >= $(MINUID) && $$3 != $(NFSNOBODYUID) ) \
        print $$1"\t"$$0 }' | $(DBLOAD) -i $(GROUP) -o $(YPMAPDIR)/$@ - $@
        -@$(NOPUSH) || $(YPPUSH) -d $(DOMAIN) $@

修改Makefile前面把all里面加上master相关的东西

之后重新make即可

我们从linux服务器上yptest试一下,已经有master相关信息

之后再在FreeNAS里面添加NIS服务器,就没有问题了。

参考

发表评论

您的电子邮箱地址不会被公开。