personal library를 사용해서 net-snmp cross-compile 하기기
안녕하세요.
저희 회사에서 사용하는 라이브러리를 이용하여 net-snmp를 크로스 컴파일 하려고 하고 있습니다.
1. 환경 : fedora11
2. net-snmp 버젼 : 5.3.2
3 cross-compiler : ppc_82xx-gcc
1. personal library 만들기
1.1. 정적 라이브러리 만들기
아래와같이 하여 libnexcmd.a를 만들었습니다.
ppc_82xx-ar rc libnexcmd.a nex_common.o nex_config.o nex_dtag.o nex_fan.o nex_filter.o nex_http.o nex_igmp.o nex_image.o nex_interface.o nex_log.o nex_module.o nex_password.o nex_pme.o nex_port.o nex_qos.o nex_snmp.o nex_sntp.o nex_system.o nex_tm.o nex_vlan.o
1.2 공유라이브러리 만들기
아래와 같이 하여 공유라이브러리 libnexcmd.so.1.01 를 만들었습니다.
ppc_82xx-gcc -fPIC -c nex_common.c nex_config.c nex_dtag.c nex_fan.c nex_filter.c nex_http.c nex_igmp.c nex_image.c nex_interface.c nex_log.c nex_module.c nex_password.c nex_pme.c nex_port.c nex_qos.c nex_snmp.c nex_sntp.c nex_system.c nex_tm.c nex_vlan.c ppc_82xx-gcc -shared -Wl,-soname,libnexcmd.so.1 -o libnexcmd.so.1.0.1 nex_common.o nex_config.o nex_dtag.o nex_fan.o nex_filter.o nex_http.o nex_igmp.o nex_image.o nex_interface.o nex_log.o nex_module.o nex_password.o nex_pme.o nex_port.o nex_qos.o nex_snmp.o nex_sntp.o nex_system.o nex_tm.c nex_vlan.o
2. 라이브러리 설치하기
2.1. 라이브러리 링크
ln -s libnexcmd.so.1.01 libnexcmd.so
2.2 라이브러리 설치하기
cp libnexcmd.so.1.01 /usr/lib
cp libnexcmd.so.1.01 /usr/local/lib
cd /usr/local/lib
ldconfig
2.3 라이브러리 패스 설정하기
export LD_LIBRARY_PATH=/home/psyche/sychoi/lib/libnexcmd:$LD_LIBRARY_PATH
3. net-snmp 설치하기
3.1. net-snmp install script
CFLAGS="-I/home/psyche/sychoi/net-snmp-5.3.2/agent/mibgroup/nexlib" LDFLAGS="-L/home/psyche/sychoi/lib/libnexcmd -lnexcmd" ./configure --host=i386-linux --build=ppc-linux --target=ppc-linux --prefix=/usr --exec-prefix=/usr --enable-shared --disable-debugging --enable-mini-agent --with-mibs="IP-MIB:IF-MIB:TCP-MIB:UDP-MIB:SNMPv2-MIB:RFC1213-MIB:NEXCOMM-FAN-MIB:NEXCOMM-LOG-MIB:NEXCOMM-SMI:NEXCOMM-MODULE-MIB" --with-mib-modules="agentx ucd-snmp/dlmod snmp_fan snmp_log snmp_module" --with-enterprise-notification-oid=.1.3.6.1.4.1.5927.99.12.1 --sysconfdir=/etc --localstatedir=/var --enable-internal-md5 --enable-snmpv1 --enable-snmpv2c --disable-embedded-perl --with-cc=ppc_82xx-gcc --with-linkcc=ppc_82xx-gcc --with-ar=ppc_82xx-ar --with-endianness=big --with-install-prefix=/home/psyche/sychoi/install --without-rpm | tee snmp.config.log make | tee snmp.config.log perl -pi -e "s|^prefix=/usr|prefix=/home/psyche/sychoi/install/usr|" net-snmp-config perl -pi -e "s|^exec_prefix=/usr|exec_prefix=/home/psyche/sychoi/install/usr|" net-snmp-config make install | tee snmp.intall.log
인스톨 스크립트를 실행했을때 net-snmp-5.3.2 폴더에 생긴 Makefile 입니다. Makefile의 일부만 가져왔습니다.
위의 설정이 적용된 부분만 보여드립니다.
CFLAGS = -I/home/psyche/sychoi/net-snmp-5.3.2/agent/mibgroup/nexlib -Dlinux EXTRACPPFLAGS = -x c LDFLAGS = -L/home/psyche/sychoi/lib/libnexcmd -lnexcmd LIBTOOL = $(SHELL) $(top_builddir)/libtool EXEEXT =
이렇게 하면 무사히 설치는 되는데 snmp명령을 내리면 응답이 안옵니다.
[root@localhost net-snmp-5.3.2]# snmpwalk -v 1 -c public 172.16.0.100 system SNMPv2-MIB::sysDescr.0 = STRING: n5000 SNMPv2-MIB::sysObjectID.0 = OID: NEXCOMM-SMI::n5000 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (106114) 0:17:41.14 SNMPv2-MIB::sysContact.0 = STRING: <a href="http://www.nexcomm.com" rel="nofollow">http://www.nexcomm.com</a> SNMPv2-MIB::sysName.0 = STRING: N5000 SNMPv2-MIB::sysLocation.0 = STRING: nexcomm systems Inc. SNMPv2-MIB::sysORLastChange.0 = Timeticks: (3) 0:00:00.03 SNMPv2-MIB::sysORID.1 = OID: SNMPv2-MIB::snmpMIB SNMPv2-MIB::sysORID.2 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance SNMPv2-MIB::sysORID.4 = OID: SNMP-MPD-MIB::snmpMPDCompliance SNMPv2-MIB::sysORID.5 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance SNMPv2-MIB::sysORDescr.1 = STRING: The MIB module for SNMPv2 entities SNMPv2-MIB::sysORDescr.2 = STRING: View-based Access Control Model for SNMP. SNMPv2-MIB::sysORDescr.3 = STRING: The SNMP Management Architecture MIB. SNMPv2-MIB::sysORDescr.4 = STRING: The MIB for Message Processing and Dispatching. SNMPv2-MIB::sysORDescr.5 = STRING: The management information definitions for the SNMP User-based Security Model. SNMPv2-MIB::sysORUpTime.1 = Timeticks: (3) 0:00:00.03 SNMPv2-MIB::sysORUpTime.2 = Timeticks: (3) 0:00:00.03 SNMPv2-MIB::sysORUpTime.3 = Timeticks: (3) 0:00:00.03 SNMPv2-MIB::sysORUpTime.4 = Timeticks: (3) 0:00:00.03 SNMPv2-MIB::sysORUpTime.5 = Timeticks: (3) 0:00:00.03 [root@localhost net-snmp-5.3.2]# snmpwalk -v 1 -c public 172.16.0.100 fan [root@localhost net-snmp-5.3.2]# snmpwalk -v 1 -c public 172.16.0.100 log [root@localhost net-snmp-5.3.2]# snmpwalk -v 1 -c public 172.16.0.100 module [root@localhost net-snmp-5.3.2]#
보시다시피 system 그룹같은 것은 응답이 오는데 그 외 personal module로 포함시킨 부분 위의 스크립트를 보시면 아시겠지만
"with-mib-modules="snmp_fan snmp_log snmp_module" 이 부분이 private MIB 소스 부분을 지정해 주는 부분인데요...
여기에 포함시킨 Private MIB 에 대해서는 응답이 없다는 거죠..
소스는 이미 아무런 문제가 없다는 것을 다른 형태의 snmp test(agentx 방식)를 통해서 알아봤습니다.
agentx 방식으로 하면 위의 MIB에서도 응답이 옵니다.
단지 agenx 와 다른 점은 역시 라이브러리문제인데요... 거기서는 저의 personal library가 잘 적용되었던 것 같습니다.
예로 보여드리지요..
PROJDIR = /home/psyche/sychoi INSTDIR = $(PROJDIR)/rootfs/usr/sbin SNMPINC = /home/psyche/sychoi/install/usr CC=ppc_82xx-gcc STRIP=ppc_82xx-strip OBJS += agentx.o OBJS += snmp_fan.o OBJS += snmp_log.o OBJS += snmp_module.o OBJS += snmp_efmoam.o OBJS += snmp_interface.o OBJS += snmp_pme.o OBJS += snmp_port.o OBJS += snmp_qos.o OBJS += snmp_software.o OBJS += snmp_statistics.o OBJS += snmp_system.o OBJS += snmp_vlan.o TARGETS = agentx LIBS=$(PROJDIR)/lib/libnexcmd/libnexcmd.a -lpthread CFLAGS = -I. -I$(PROJDIR)/include/libnexcmd -I$(PROJDIR)/include CFLAGS+= -O2 -Dlinux -I. -I$(SNMPINC)/include BUILDLIBS = -L$(SNMPINC)/lib -lnetsnmp -lcrypto -lm BUILDAGENTLIBS = -L$(SNMPINC)/lib -lnetsnmpmibs -lnetsnmpagent -lnetsnmphelpers -lnetsnmp -ldl -lcrypto -lm # shared library flags (assumes gcc) DLFLAGS=-fPIC -shared -lpthread all: $(TARGETS) agentx: $(OBJS) $(CC) -o agentx $(OBJS) $(LIBS) $(BUILDLIBS) $(BUILDAGENTLIBS) $(STRIP) agentx install: cp -a agentx $(INSTDIR)
제가 아무래도 라이브러리 링크를 잘못해서 그런 것 같은데요..
라이브러리 만들기와 설치하는 부분에서 혹시 잘못한 부분이 있는 지 좀 봐주시겠습니까?
대체로 메뉴얼대로 했다고 생각하는데요... 역시나 미흡한 부분이 있나 봅니다.
그럼 수고하십시요..
첨부 | 파일 크기 |
---|---|
![]() | 1.27 MB |
![]() | 10.74 KB |
![]() | 101.47 KB |
![]() | 108.66 KB |
ppc_82xx-gcc -shared
libnexcmd.so.1.0.1 을 만드셨지만 컴파일 타임엔 libnexcmd.so 를 찾고, 런타임엔 libnexcmd.so.1 을 찾습니다.
그러니 컴파일(링크)를 위해서
실행을 위해서
shard object 로 사용하기 위해서 빼먹을 수 없는 컴파일 옵션을 예로 들라면 -fPIC 을 들겠습니다.
libnexcmd.a 를 사용해서 바로 libnexcmd.so 를 만드려면
agentx 를 비롯한 net-snmp 의존적인 다른 것들을 컴파일하기 위한 Makefile 은,
이전에 드린 스크립트 중 net-snmp tutorial 빌드 부분을 보면 됩니다.
애초에 그 스크립트를 만든 것도 ...
어느 분이 net-snmp 튜토리얼을 보고 공부하는 도중에 크로스 컴파일에서 갈팡질팡 하시는 걸 보고...
말로 설명드리려니 재주가 모자라서 만든거였습니다.
대강.. 이렇게 되겠죠
빌드는
요컨데
OTL
답글 달아주셔서 감사합니다.
일목요연하게 설명해주셔서 저처럼 기본이 없는 사람도 잘 이해가 되는 군요...
말씀해 주신 바에 따르면 제가 실수한 부분이 분명있습니다.
일단 라이브러리 링크에서도 잘못했군요..
agentx 만드는 것도 간단하게 만들수 있는 Makefile 정말 감사합니다..
정말 많은 도움이 되었습니다.
말씀해 주신 대로 라이브러리를 링크하고 나서 실제로 라이브러리가 제대로 포함되었는지 확인하기 위하여 아래와 같이 실행하였습니다.
제가 보기에 libnexcmd 의 폴더위치가 제대로 나오는 것 같아서 괜찮다고 생각하고 위의 install script로 설치를 했는데요...
결과는 예전과 똑같습니다...
라이브러리 문제가 아니란 말인가.. ㅠㅠ
제가 뭔가 더 잘못한게 있는 가 봅니다... ㅠㅠ
무슨 옵션이 더 필요하단 말인가...
snmp에 경험이 있으시고.. 혹시나 저와 같은 작업을 해보셨다면 혹시나 해서 드리는 말씀인데..
역시 라이브러리 문제가 아닐수도 있나요?
뭔가 다른 옵션이 배제되었을 수도 있나요?
net-snmp-coder mailing list에도 같은 질문을 던져 놓았습니다.
그러나 아직까지 답변이 없군요...ㅠㅠㅠ
아시는 데까지 조금의 코멘트라도 개의치 않겠습니다...
다시 한 번 친절하고 정확한 답변에 감사드립니다..
제가 라이브러리를 링크하며서 뭔가 잘못한 것 같군요.
1. 아래와 같이 공유라이브러리를 만들었습니다.
2. 링크를 다음과 같이 했습니다.
답글 달아주신 글에는 아래와 같이 되어 있는데 말이죠.
그래서 인스톨하고 난 뒤 Private MIB을 콜하니까 안되난 싶은 생각이 들더라구요..
그래서 아래와 같이 고쳤습니다.
1. 공유 라이브러리를 만든 다음에 아래 4개의 폴더에 라이브러 파일(libnexcmd.so.1.0.1)을 두었습니다.
2. c, d의 디렉토리에서만 링크를 만들고 ldconfig를 해줬습니다.
3. 아래의 install script를 실행하였습니다.
그랬더니 아래와 같은 에러가 나왔습니다.
위의 에러는 CFLAGS 와 LDFLAGS를 빼면 나타나지 않습니다.
라이브러리 링크를 제대로 했더니 make시에 에러가 난다 .
일단은 make error에 대해서 제가 문제점을 찾을 수 없어서 글을 올립니다.
인스톨 스크립트에서 문제점을 찾을 수 없었고 compiler path로 제대로 설정되어 있는 상황입니다.
저의 경우는 /opt/eldk/usr/bin/ppc_82xx-gcc 인데 이것이 PATH에 제대로 잡혀 있는 것을 확인하였습니다.
make 에러나 나는 이유를 모르겠고 이것이 라이브러리를 include 해서 컴파일하려 해서 생기는 오류인가도 싶구요..
정확한 원인을 알 수 없어 여기다 올립니다.
고수님들 한 번만 봐주세요..
LDFLAGS="-L/home/psyche/sycho
config.log 파일을 찾아서 들여다보면 정확하게 알 수 있습니다.
간단히 테스트 해 보실 수 있습니다.
OTL
라이브러리 자체 문제였습니다.
말씀해 주신대로 config.log 파일을 살펴봤는데요..
라이브러리 자체에 인식하지 못하는 참조가 있었습니다.
아래와 같은데요..
여기서 문제되는 참조 'crypt' 'snmp_varlist_add_variable', 'snmp_free_varbind', 'send_v2trap'
이것들은 snmp 자체에서 참조하는 라이브러리들입니다.
경로는
/home/psyche/sychoi/net-snmp-5.3.2/include/net-snmp/library/snmp_api.h
/home/psyche/sychoi/net-snmp-5.3.2/include/net-snmp/agent/agent_trap.h
입니다.
궁금한 것은 snmp 라이브러리 파일들인데 이것을 libnexcmd.so.1.0.1을 만들때 넣어줘야 하나요?
분명히 라이브러리 파일들 중에 위의 함수들을 참조하는 애는 없는 것 같거든요..
상식적으로 snmp library들이라면 init_함수를 포함하는 소스안에 있어야 불러올 수 있지 않아요..
저는 잘 모르겠습니다.
뭐가 잘못되었는지..
그렇지만 이상한 에러가 자꾸나오네요..
닭이 먼저냐 달걀이
닭이 먼저냐 달걀이 먼저냐의 문제네요.
A 라이브러리를 만들기 위해 B 라이브러리가 필요한데 B 라이브러리를 만드려면 A 라이브러리가 필요한...
근본적으론... libnexcmd.so 를 참조하도록 하기 위해 꼼수를 사용했기 때문입니다.
snmp configure 실행할 때 환경변수로 CFLAGS 와 LDFLAGS 를 넘기는 방법으로 추가적인 라이브러리가 기본으로 포함되도록 사파의 초식을 펼쳤는데,
그 추가적인 라이브러리 자체가 이미 snmp 를 참조하도록 되어있으니... 이건 말이 안됩니다.
이제 사마외도의 길은 그만...
정석대로 가세요.
1. snmp 빌드
2. snmp 를 이용해서 libnexcmd 빌드
3. snmp 와 libnexmd 를 이용해서 agentx 빌드
OTL
busi님 한 가지만 더 질문드릴께요..^^;
1. snmp 빌드 : CFLAGS와 LDFLAGS를 빼고 private MIB을 빼고 private module을 빼고 설치하라는 말씀으로 이해해서 그렇게 했습니다.
아래가 설치 스크립트 입니다.
2. snmp빌드를 이용해서 libnexcmd를 빌드하라....
이 부분은 이해가 좀 안가는데요..
저 같은 경우 이것을 어떻게 해석했냐 하면.. 1과 같이 빌드한 후 예전의 인스톨 스크립트대로 빌드하라고 이해했거든요.
CFLAGS, LDFLAG가 포함되고 private MIB module이 포함된 형태죠...
근데 그렇게 인스톨 해보면 make 에러는 일어나지 않지만 실제로 결과는 예전과 마찬가지입니다.
혹시라도 snmp 빌드를 이용하여 libnexcmd를 빌드하는 다른 방법이 있는가요?
제가 잘못 이해하고 있는 것 같아서.. 그리고 다른 방법에 대해서 잘 몰라서 질문올립니다..
모쪼록 염치없지만 아시고 계시면 간단하나마 코멘트라도 남겨주시면 안될까요?
net-snmp 설치시에 personal 라이브러리 포함하면 안되다는데데
net-snmp mailing list에 상기의 내용을 질문올려서 받은 답변입니다.
================================================================
You can't include them as a library since the base agent won't know what
init_ functions to call to start you code.
Instead, put your code in the agent/mibgroup directory and use
--with-mib-modules="file1 file2" etc to get them to compile in and the
init_ routines to be found and used.
===================================================================
내용인 즉슨 personal library를 net-snmp install 시에 include 할 수 없다는 내용입니다.
대신 라이브러리 소스 파일을 agent/mibgroup 에 복사해서 컴파일 하면 가능하다는 얘기입니다.
그리하여 아래와 같이 저의 인스톨 스크립트를 수정하였습니다.
기존의 라이브러리 추가했던 부분을 빼구요.
대신 --with-mib-modules 부분에 nex 로 시작하는 라이브러리 소스 파일을 포함시켜 주었습니다.
라이브러리 파일은 다음과 같습니다.
그리고 나서 설치했는데요.. 설치시에는 별 문제가 없었던 것 같습니다.
아래는 snmp test 화면인데요.. 테스트 해보면 예전하고 하나도 달라지지 않은 ...
문제점이 그대로 입니다..
여기에서 문제점은 제가 혹시나 설정에서 빠트린 부분이 있나 하는 것입니다.
물론 여기에 대해서 저 분에게 다시 질문해 놓았지만 답변이 온다는 보장이 없기에 ...
혹시나 해서 설치시 log 파일을 올려봅니다.
내용이 많지만 염치불구하고 올립니다...
로그 파일은 원글에다가 올리겠습니다.
그리고 net-snmp를 설치하면서 저처럼 회사 라이브러리를 포함해서 설치해 보신 분은 아무도 안계신가요?
코멘트 해주신 분의 이야기를 들어보면 소스의 init_함수 부분을 찾지 못해서 안된다는데..
저 같은 문제로 고민해 보신 분이 아무도 안계신다는 것이 의아하네요...
모두다 라이브러리 같은 것은 안만들고 소스만으로 충분한 겁니까.. ㅠㅠㅠ
..............................
================================================================
You can't include them as a library since the base agent won't know what
init_ functions to call to start you code.
Instead, put your code in the agent/mibgroup directory and use
--with-mib-modules="file1 file2" etc to get them to compile in and the
init_ routines to be found and used.
===================================================================
위의 코멘트 때문에 저의 라이브러리 파일을 include 하지 않고 라이브러리 소스를 컴파일 소스에 넣어서 인스톨하는 방법도 같이
해보고 있습니다.
제가 다시 검토해 보니 제가 처음 이 방식을 사용할 때 저의 라이브러리 파일에 포함하지 않은 소스가 있다는 것을 알아챘습니다.
물론 이것들이 반드시 필요하고 있다는 정도는 알고 있었는데요..
이것들의 Path는 CFLAGS로 경로를 설정해 주었더랬습니다.
아래가 제가 라이브러리 파일을 만들때 필요한 소스들 전부입니다
보시면 아시겠지만 *.h 으로 헤더만 있는 파일들이 있습니다.
저는 일단 *.c, *.h 한 쌍으로 있는 애들은 무조건 아래 인스톨 파일에 첨가시켰습니다.
근데 *.h 만 있는 애들은 어떻게 추가 시켜야 할 지 모르겠더라구요..
일단 라이브러리 형태로 하는 것들은 에러가 나타나고 있습니다. CFLAG에서 에러가 난 것은 없었지만요...
그리고 지금 라이브러리 소스를 원래 --with-mib-modules에 추가시켜서 하는 것은 *.h 만 있는 애들은 어떻게 추가 시켜주느냐의 문제가 있군요....
만약.. 라이브러리 문제도 결국 위의 *.h 형태의 애들을 추가 시켜서 라이브러리를 만들지 않아서 문제가 된 거라면요....
라이브러리를 만들때 *.c 와 *.h 이렇게 한 쌍으로 있는 애들만 가지고 라이브러리를 만들었는데요. 만약 위의 *.h 만 있는 애들이 없어서 라이브러리에서 문제가 발생한 거라면 이 *h 만 있는 애들을 추가 시켜서 라이브러리를 만드는 방법을 고수님들은 알고 계시나요?
줄여서 말하자면 라이브러리 만들때 *.h 만 있는 애들을 원래 소스에 추가시켜서 라이브러리를 만드는 방법을 알고 싶다는 얘기입니다.
제가 길게 얘기했지만 위의 두가지 질문이 잘 전달되었으면 하는 바램입니다...
고수님들 검토해 보시고 의견있으시면 의견 좀 남겨주세요..
댓글 달기