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) 에러 없이 구동이 가능하다.
참고사이트