삽질기행/잡다정보2006. 10. 18. 23:43
- 알아두면 편리한 경로 변수들 %{buildroot} 빌드경로
%{_bindir} /usr/bin
%{_libdir} /usr/lib
%{_includedir} /usr/include
%{_sbindir} /usr/sbin
%{_mandir} /usr/share/man
%{_docdir} /usr/share/doc
%{_sysconfdir} /etc
%{_tmppath} /var/tmp
Posted by freezn
CPU : AMD64 x86_64
OS : RHEL 4.1
smtp/current 에러 내용 :
@400000004461b5440c073364 tcpserver: fatal: temporarily unable to figure out IP address for 0.0.0.0: file does not exist

결론은 qmail-smtpd, checkpassword 가 64로 컴파일 할 경우 정상동작하지 않는다.

결국 저 두파일만 32비트 머신에서 컴파일한 버전으로 끼워 맞췄다. (설정들을 똑같게 하도록 64비트에서 패치한 소스를 그대로 가져다가 빌드했다.)

해결책 출처 :
http://qmail.kldp.org/phpbb/viewtopic.php?t=5809&highlight=amd64



qmail용 64비트 패치를 어디선가 본 것 같은데...

Posted by freezn
메일이 안가길래 로그를 확인해보니 너무 많아서-_-; 아예 최소로 돌리고 다음과 같이 직접 실행으로 테스트해봤다.

명령 :
/usr/local/bin/tcpserver -vHRl 0 -x /etc/tcp.smtp.cdb 0 25 cat

에러 :
tcpserver: fatal: temporarily unable to figure out IP address for 0.0.0.0: file does not exist

qmail 관련 forum들을 찾아보면 AMD64(옵테론,Opteron)인 경우 이 상황을 자주 만나는 듯 하다.
황당하지만 이렇게 하면 해결된다.

해결 :
touch /etc/dnsrewrite


정보 출처 :
http://forums.gentoo.org/viewtopic-p-2639199.html#2639199

qmail은 AMD64랑 궁합이 잘 맞지 않는가보다 ㅡㅜ
...옵테론 미워할거야 ㅡㅜ

- AMD64 에서만 이 문제가 나는 이유는 뭘까?? 자동으로 파일을 생성하지 못하나??
Posted by freezn
2가지 방법
- 인터럽트로 받기
- 그냥 받기 -_-;

#include <iom128.h>
#include <ina90.h>
#include <sig-avr.h>
#include <interrupt.h>

#define SYSTEM_CLOCK 8000000 // CLOCK (X-tal frequency) (128L : 8Mhz)

typedef unsigned char BYTE;

volatile BYTE RS0_Char=0x00;
volatile BYTE RS1_Char=0x00;

void SendByte0(BYTE data)
{
while (!(inp(UCSR0A) & (1<<UDRE)));
outp(data, UDR0);
}

void SendByte1(BYTE data)
{
while (!(inp(UCSR1A) & (1<<UDRE)));
outp(data, UDR1);
}


SIGNAL(SIG_UART0_RECV) // UART0 수신 인터럽트
{
RS0_Char=inp(UDR0);
SendByte0(RS0_Char);
}

SIGNAL(SIG_UART1_RECV) // UART1 수신 인터럽트
{
RS1_Char=inp(UDR1);
SendByte0(RS1_Char);
}



void UART_Init(unsigned long BaudRate)
{
// Not Double mode, Not multi_communication
outp(0x00, UCSR0A);
// 0b 1001 1000 RXCIE,TXCIE,UDRIE,RxEN,TxEN,xxx
outp(0x98, UCSR0B);
outp(0x06, UCSR0C);
// Setting BaudRate
outp(0x00, UBRR0H);
outp((SYSTEM_CLOCK/BaudRate/16 - 1),UBRR0L);

// Not Double mode, Not multi_communication
outp(0x00, UCSR1A);
// 0b 1001 1000 RXCIE,TXCIE,UDRIE,RxEN,TxEN,xxx
outp(0x98, UCSR1B);
outp(0x06, UCSR1C);
// Setting BaudRate
outp(0x00, UBRR1H);
outp((SYSTEM_CLOCK/BaudRate/16 - 1),UBRR1L);
}

int main(void)
{
// External Memory Disable
outp(0x00, MCUCR);
UART_Init(9600);
sei();

while(1);

return 0;
}


uart0이나 uart1이 수신인터럽트가 발생할때마다 다시 각각 uart0/1에 같은 내용을 바이트단위로 전송해준다.

지금 사용중인 보드의 제조사 http://myavr.co.kr 의 자료를 이해하느라 아주 조금 수정했다 ;
Posted by freezn
error: Installed (but unpackaged) file(s) found:
/usr/lib/libxerces-depdom.so.26.0
Installed (but unpackaged) file(s) found:
/usr/lib/libxerces-depdom.so.26.0


이런 메세지를 만나게 된다.

아마도 RPM 빌드시 spec파일에 정의된대로 chroot 과정을 거치거나 할때 이미 파일이 설치된 걸로 착각하는(?) 등등일 경우 나는 문제 같은데,

%define _unpackaged_files_terminate_build 0


spec의 맨 위쪽 define이 열거된곳에 위 라인을 삽입하여 무시할 수 있다.


---------------------------
정보 출처 :
http://linux.i-heart.co.kr/viewtopic.php?t=39 의 siteadmin인 nopain님의 팁
Posted by freezn
error: Package already exists: %package debuginfo


같은 메세지만 나오고 헷소리를 낸다면

홈디렉토리의 .rpmmacros 파일이나 /var/lib/rpm/배포판/macros 파일을 열어서

ex)
vi ~/.rpmmacros

%debug_package %{nil}를 추가하자.

echo "%debug_package %{nil}" >> /root/.rpmmacros


이런 식으로 간단히도 가능.

그러면 정상적인 에러메세지를 보여줄 것이다.

내 경우는 %changelog에 %install이 한번 더 등장한다는 것이었는데
changelog부터는 무조건 주석처럼 무시될거라 생각한 실수.
%install에서 뭘 고쳤다는 로그를 남기다보니 이런 실수가 있었다.

주의하자.
Posted by freezn
삼성 PC에 CentOS 4.2 를 설치했다. (모델명은 M2950. P4 1.6 모델이다.)

여튼 설치가 다 되고 부팅을 시켜보니

이게 왠걸

Initializing hardware: storage network (그대로 멈췄음)


음.. audio가 떠야하는데 안뜨는걸 보니 오디오와 충돌인가? 라는 생각은 오산이었다. 서버 전용으로 사용할거라 내장 오디오를 disable 시켰더니 이제 부팅은
Initializing hardware: storage network audio ...


오.. 잘되는군

근데 왜 네트웍이 안되지?ㅡㅡ;

찾아보니... 노트북(laptop) 쪽에서 자주 나는 문제인 것 같은데...
ACPI랑 관련이 있나보다.

grub 부팅 옵션에 다음 2가지를 추가해줬다.

acpi=off amp=off


잘 된다.
(하지만 ACPI를 꺼버렸으므로 시스템 halt 시 전원 버튼을 눌러야 끌 수 있는 작은 문제가 있다.)

ps. 이와 비슷하거나 이상해지는 상황은 FC3/4에서도 마찬가지인데...
그럼 이 PC모델이 문제인 거겠지? :(
Posted by freezn
RPM들의 SPEC파일을 보면 Copyright와 License가 같은 용도로 사용되는 경우가 있다.

예를 들면 Troy Engel 씨가 패키징한 libnet 패키지에서는
Copyright: BSD 으로 되어있고

RHEL3에 포함된 레드헷에서 패키징한 diskdumputils 패키지에서는
License: GPL 으로 되어있다.

당연히(?) License 라는 택을 사용하다가 생각해보니 분명 나도 maximum rpm에서 Copyright로 읽은 기억이 나서 Copyright로 써봤더니 vi가 빨간 배경을 깔아버린다. -_-;
음 설마 syntax 오류라는걸까나 :)
(물론 빌드는 잘 됐다.)

주) maximum rpm 의 관련 부분 : http://www.rpm.org/max-rpm/s1-rpm-build-creating-spec-file.html

- maximum rpm이 작성된지도 오래되었으니 바뀌었을 수 도 있겠군.. :)

그래서 찾아보니 페도라 메일링 리스트 로그에 다음과 같은 내용이 있었다.
jove라는 소스를 -tb옵션으로 빌드하려고하니 다음과 같은 에러메세지가 발생한 다는 것이다.
"error: Legacy syntax is unsupported: copyright"


D. Hugh Redelmeier씨에 의하면
레드헷 리눅스 6.2 전에는 License라는 태그가 없었고 지원되지 않았지만 이후 변경되었다고 한다.
때문에 이전 버전과 이후 버전에서 동시에 사용하기 위한 방법을 제시하고 있는데...

%define ancient_OS 1

%if %{ancient_OS}
Copyright: foo
%else
License: foo
%endif


뭐... 귀찮겠다 -_-;
(결국 6.2면 대체 rpm/build 버전이 몇이 들어가 있는거냐... 싶어 License택만 사용하기로 했다.)

해당로그 : https://www.redhat.com/archives/fedora-test-list/2005-May/msg00963.html

Vender, Packager, License는 있지만 Copyrighter가 없는게 좀 찜찜한 구석이 있다보니 이에 대한 것도 문제가 되는가보다.

--------------------------------------------------------

재밌는건 Copyright를 License로 인식하여 지원하는 것 같다는 것이다.

Troy Engel의 libnet 패키지(Source RPM: libnet-1.1.2.1-1.rh.el.um.1.src.rpm)를 보면 Copyright: BSD 라고 되어있지만
-qi옵션으로 정보를 보면 License: BSD 로 출력된다.

결국 옛날 패키지가 아니면 License로 쓰면 된다는 것이다.
Posted by freezn
heartbeat.

고가용성을 위한 서비스 어쩌구라는데...

복잡한건 싫으니 쉽게 가자.

Fail Over Cluster 다.

서버 하나가 죽었을때 비상용 서버로 연결하는거다.



수십대씩일때도 가능하겠지만, 이 포스팅으로 정리하려는건 서버가 2대일때 메인서버가 죽은 경우 서브서버로 연결하는 경우다.

----------------------------------------------------------------
환경 :

같은 서브넷에 속한 서버 2대
나같이 빈곤한 (ㅡ_ㅜ) 사람은 서버 1대에 랜카드 2개 준비하기도 까다롭고 서버간에 거리가 좀 될 경우 시리얼(RS232C) 케이블로 서버 두대를 연결하기도 골치아프다.

그래서 이런 상황이다.

A──스위치──B

뭐 간단한 환경 ~_~

스위치를 통해 외부와 연결되어있는거다.

각각 호스트네임과 아이피가 다음과 같다고 하자.
가상으로 줄 아이피 : 192.168.0.201
A : fz1 : 192.168.0.202 <- 메인
B : fz2 : 192.168.0.203 <- 비상용 서브

참고로, 각 서버를 노드로 칭할 수 도 있으니 노드라는 용어를 사용해도 헷갈리지 말자.
----------------------------------------------------------------

heartbeat설치는 그까이꺼 뭐 대충 소스로 깔든 rpm으로 깔든...

설정을 보자
다음 파일들이 필요하다.
/etc/ha.d/authkeys
/etc/ha.d/ha.cf
/etc/ha.d/haresources

나같은 경우 기본 스펙대로 rpm패키지를 만들어서 설치했기 때문에 /usr/share/doc/heartbeat-2.0.2/ 경로에 sample파일이 있었지만,
없어도 이 포스팅에선 별 관계 없다. 간단하기 땜시...
----------------------------------------------------------------

설정 내용은 다음과 같이 했다.
/etc/ha.d/authkeys
auth 1
1 crc

/etc/ha.d/ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
keepalive 2 # 노드간 beat 주기-초
deadtime 10 # 노드 사망 확인 시간-초
udpport 694 # 신호 보낼 포트
udp ech0 # 신호 보낼 장치
node fz1 # 각 노드
node fz2 # 각 노드

/etc/ha.d/haresources
fz1 192.168.0.202 # 메인서버

----------------------------------------------------------------
다 됐다.

이제 fz1 서버 부터 서비스를 시작하다.
/etc/init.d/heartbeat start (혹은 /etc/rc.d/init.d/heartbeat 라도)

꼭 그래야하는건 아니지만 메인 서버를 먼저 켜는게 좋은가보다.

그리고 fz2도 마찬가지로 시작한다.

이제 192.168.0.201으로 접속해보자. (두 서버가 사용할 가상 아이피다.)

192.168.0.201로 접속했을때 우선은 fz1으로 접속될 것이다.

이제 fz1을 끄거나 fz1의 heartbeat서비스를 중지 시켜보자.
/etc/init.d/heartbeat stop

그리고 10~12초 후 -_-a (신호주기2초+사망진단 10초) 192.168.0.201 로 접속하면
fz2 서버로 접속이 된다.

참고로 나같은 경우 httpd에 php로 echo exec("hostname"); 시켜서 확인했다.

----------------------------------------------------------------
주) 두 서버간에 해당 udp포트(이 포스트에서는 694)를 꼭 열어두자. 신호를 주고받지 못해 서로 사망했다고 생각하고 서로 아이피를 잡느라 난리가 날 수 있다.

----------------------------------------------------------------
참고 문헌
아이네트호스팅 - Linux Fail Over Cluster System 구축하기
http://www.inet.co.kr/faq/stories.php?story=03/10/17/7500350

KLTP - heartbeat 를 이용하여 고가용성(High Availability ) 서비스 구현하기
http://kltp.kldp.org/stories.php?story=03/01/07/7241711
Posted by freezn
Apache 웹서버 설정.
당연히 디렉토리를 만들었고 퍼미션도 701~707 까지  다 줘봤는데, 아래와 같은 에러가 나더라.

Starting httpd Syntax error on line 267 of /etc/httpd/conf/httpd.conf:
DocumentRoot must be a directory
                                                                              [FAILED]

OTL...

구글링해본 결과 원인은 SELinux ...아이고 -_-
이놈에 보안정책이 뭔지

chcon -R -t httpd_user_content_t [디렉토리]


해법 출처 :
http://www.superuser.co.kr/home/superuserboard/view.html?id=1628&code=apache&start=0&position=

---

추가 :

403 forbidden 에는..

setsebool -P httpd_enable_homedirs on

(setsebool 명령이 없으면 yum -y install policycoreutils-python )

출처 : http://stackoverflow.com/questions/14786881/apache-restart-causes-documentroot-must-be-a-directory-even-though-it-is-a-dire


Posted by freezn