Linux

docker lmgrd server 구축하기

Naan 2022. 9. 21. 00:20
320x100

docker lmgrd server 구축하기

디자인툴이나 여러 업체들이 Network License Manage(LMTOOLS) 를 많이 이용한다.

내부에 구축을 하기 위해서 서버하나는 만들어서 구축을 해야 하는데 docker 를 이용하면 장비 하나를 줄일 수 있다.

LMTOOLS 를 구동 하기 위해서 몇몇 패키지가 필요 하다. 필요 패키지는 아래에..

OS 를 Centos7 으로 한다. Centos8 같은 경우는 지원이 안된다.

# docker run -it --privileged --name lmgrd_server centos:7

이미지 다운 받고 설치가 완료 된다.

Centos7 깡통이라 필수 패키지 설치 해주자.

# yum install -y redhat-lsb

# yum install -y gcc

LMTOOLS 가지고 있는 프로그램을 서버에 넣자.

# docker cp lmgrd_programs lmgrd_server:/data/

snpslmd exited with status 41 (Exited because another server was running)

서버를 구동을 해보면 위와 같이 에러가 발생 한다.

이를 해결 해주기 위해서 scl/linux64/bin/ 폴더로 이동해서 

# vi gen-snpslmd-hack.c 

파일을 생성하고

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <dlfcn.h>
#include <string.h>

static int is_root = 0;
static int d_ino = -1;

static DIR *(*orig_opendir)(const char *name);
static int (*orig_closedir)(DIR *dirp);
static struct dirent *(*orig_readdir)(DIR *dirp);

DIR *opendir(const char *name)
{
if (strcmp(name, "/") == 0)
is_root = 1;
return orig_opendir(name);
}

int closedir(DIR *dirp)
{
is_root = 0;
return orig_closedir(dirp);
}

struct dirent *readdir(DIR *dirp)
{
struct dirent *r = orig_readdir(dirp);
if (is_root && r)
{
if (strcmp(r->d_name, ".") == 0)
r->d_ino = d_ino;
else if (strcmp(r->d_name, "..") == 0)
r->d_ino = d_ino;
}
return r;
}

static __attribute__((constructor)) void init_methods()
{
orig_opendir = dlsym(RTLD_NEXT, "opendir");
orig_closedir = dlsym(RTLD_NEXT, "closedir");
orig_readdir = dlsym(RTLD_NEXT, "readdir");
DIR *d = orig_opendir("/");
struct dirent *e = orig_readdir(d);
while (e)
{
if (strcmp(e->d_name, ".") == 0)
{
d_ino = e->d_ino;
break;
}
e = orig_readdir(d);
}
orig_closedir(d);
if (d_ino == -1)
{
puts("Failed to determine root directory inode number");
exit(EXIT_FAILURE);
}
}

위 코드를 복사후 저장하고 나오자.

# gcc -ldl -shared -fPIC gen-snpslmd-hack.c -o snpslmd-hack.so

위 명렁어로 컴파일 하자.

그리고 라이선스 서버 구동을

LD_PRELOAD=./snpslmd-hack.so ./lmgrd -c /usr/software/synopsys/license/Synopsys.dat -l /synopsys_log.txt

위 형태처럼 구동을 시켜보면

snpslmd exited with status 41 (Exited because another server was running) 에러 없이 구동이 가능하다.

 

참고사이트

https://verdvana.cn/_posts/2021-11-13-Synopsys-EDA-Tools%E5%AE%89%E8%A3%85%E4%B8%AD%E5%87%BA%E7%8E%B0%E7%9A%84%E9%97%AE%E9%A2%98%E5%8F%8A%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/

320x100