일상의 정리

CentOS 6 inittab 설정

리눅스/설치

CentOS 6.x 부터는 SysV init 스크립트를 Upstart 라는 새로운 스크립트 시스템으로 변경하였다고 함

Upstart 는 이벤트 방식의 스크립트 시스템으로 SysV init 보다 빠르다고 하는 데 


문제는 기존에 잘 사용하던 inittab 을 어떻게 옮기고 관리할 것인가 하는 것...


기존에 Fax Modem 용 getty 스크립트가 있었는 데 inittab 이 더 이상 동작 않음


CentOS 6.x 에서는 아래와 같이 처리


/etc/init  디렉토리 아래에

원하는 서비스명.conf 파일 생성

예를 들어 faxgetty.conf 라는 파일을 만들고

아래와 같이 스크립트를 작성


start on runlevel [2345]

stop on runlevel [S016]

respawn

exec /usr/sbin/faxgetty ttyS0


스크립트를 실행하는 방법은 2가지

1. reboot

2. /sbin/initctl


2번의 initctl 은 작업을 start, stop, reload 할 수 있음


위의 경우에는 먼저 기존 스크립트를 종료 한 후 시작

/sbin/initctl  stop faxgetty

/sbin/initctl  start faxgetty


ps -ef | grep fax

로 프로세스가 정상적으로 실행 되는 지 확인


SVN 무시할 파일/폴더 설정

리눅스/설치

Ignore file

To ignore all files with the ending .o use:

Ignore dir

If you want to ignore folder tmp

Ignore multiple files/dirs

If you want to ignore tmp,obj,bin dirs and all files with *.o
*.lib,*.la
extension. Save this file

and name it svnignore.txt, the following command will do the job !

Ignore multiple files/dirs via command line

This will bring up list of files or directories to ignore.

Find files that are not under version control

To find such files:


Ubuntu 12.04 콘솔 모드로 시작하기

리눅스/설치

Ubuntu 의 기본 runlevel 은 2로 설정되어 있다.

근데 Ubuntu 클라이언트 버전인데도 불구하고 콘솔 모드로 시작해서 서버처럼 사용하고 싶다면...


다음 작업을 수행하면 된다.

1. /etc/default/grub 파일을 열어서

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

라인을 

GRUB_CMDLINE_LINUX_DEFAULT="text"

바꾼다.

그리고 

GRUB_HIDDEN_TIMEOUT=0

라인 앞에 #을 넣어 코멘트 아웃한다.

저장하고 종료


2. 다음 명령으로 GRUB 설정을 저장한다.

sudo update-grub


리부팅하면 다음부터 명령어 라인으로 실행된다.


만약 계속 그래픽 모드로 동작한다면


sudo apt-get install lightdm


으로 이전 버전을 업데이트 해 본다.


마운트 되지 않은 파티션이 이미 마운트 되어 있다고 나오는 경우 해결 방법

리눅스/설치
마운트 되지 않은 HDD 의 파티션을 마운트 하려하니 이미 마운트 되어 있다고 나오고

fsck -f -y /dev/sda1

명령을 실행하니 아래와 같이 이미 마운트 되어 있다고 나온다.

fsck 1.39 (29-May-2006)
e2fsck 1.39 (29-May-2006)
fsck.ext3: Device or resource busy while trying to open /dev/sda1
Filesystem mounted or opened exclusively by another program?

이 에러는 대개의 경우 2가지 이다..

실제로 언마운트 되지 않아서 에러를 리포트 하는 경우 

이 경우는  /proc/mounts 파일을 보면 해제 되지 않을 경우 내용이 있다.

실제로 누가 이 파티션을 사용중인지 
lsof 와 fuser 로 확인할 수 있다.

위의 경우가 아니라면... (예를 들어 fstab 에 등록 되어 있지 않으며 부팅하자 마자 )

레이드 파티션으로 인식 되어 있지 않은 지 의심해 보는 것이 좋다.

dmraid -r
명령을 내려 보면 RAID 로 인식되는 파티션이 표시된다.

만약 RAID 구성으로 인식되어 있다면

dmraid -rE

명령으로 RAID 구성을 해제하고 리부팅 해 주면 정상적으로 사용할 수 있다.
 

qmail CNAME_lookup_failed_temporarily. 에러 발생시 조치 방법

리눅스/설치
qmail 서버 운영 시 

상대방 서버에 메일이 전송되지 않을 때
/var/log/qmail/qmail-send/current 로그에
CNAME_lookup_failed_temporarily

에러가 있다면...

다음과 같은 경우 중 하나이다.
1. 내 서버의 dns resolve 문제
2. 상대방 서버의 dns 설정에 문제 (MX는 A여야 함)
3. 잘 되던게 안되거나 대형 포탈 (특히 hanmail 같은 경우)

3 번의 경우에는 qmail 이 사용하는 dns.c 를 패치해 주어야 한다.
기존 dns.c 의 경우 쿼리응답이 512 바이트까지만 처리 가능하지만.
대형 포탈들은 많은 서버로 인해 응답이 512바이트를 초과하기 때문이다.

http://www.ckdhr.com/ckd/qmail-103.patch

패치 후 컴파일 하고 기존 바이너리 파일과 교체하면 정상적으로 메일이 발송된다.

CentOS 5 + SANE + USB Scanner

리눅스/설치

SANE 을 이용하면 Linux 에서도 Scanner 를 사용할 수 있다.

CentOS 5를 설치하면 기본적으로 sane 관련 패키지들이 설치 되어 있다..

만약 설치 되어 있지 않다면 yum 을 이용해서 설치 하도록 하자.

설치 된 상태에서 USB 스캐너를 지원하는 모델이라면

그냥 USB를 꼽기만 하면 된다.

USB를 꼽고 인식 되었는 지 확인 하려면 root 사용자에서

lsusb 명령으로 인식 여부를 확인할 수 있다.

인식 되었다면

scannerimage -L

명령으로 sane 에서 사용가능한 장치로 인식 되었는 지 확인한다

제대로 인식이 되었다면...

X-Windows 시스템이라면 xsane 을 이용해서 스캔 작업을 할 수 있다.

하지만 우리의 목표는 단순하게 윈도에서 터미널을 이용해서 스캐너를 공유하는 것이므로

명령어 모드에서 스캔을 한다.

다음이 스캔 명령이다.

scanimage -d `scanimage -L | cut -c 9-28` --format tiff --mode Color --resolution 200 > 파일명

여기서 scanimage -L | cut -c 9-28  이 부분이 스캐너 이름을 구하는 부분이다.

mode 부분에 GrayScale 이라고 넣으면 흑백으로 스캔이 가능하다.

파일명 을 공유 폴더로 쓰게 만들면 어느 계정이든지 로그인 해서 공유 폴더로 스캔할 수 있다..

단 이때 scanimage 를 root 로 로그인해야 스캐너에 접근이 가능한 문제가 있다.

이걸 해결하기 위해서는 udev 설정을 수정해야 한다.

먼저 scanner 그룹을 추가하고
/etc/group 의 scanner 그룹에 스캐너를 사용할 사용자를 추가한다.

그리고 /etc/udev/rules.d 로 가서
 60-libsane.rules 파일을 수정한다.

해당되는 스캐너 모델에 가서

SYSFS{idVendor}=="04b8", SYSFS{idProduct}=="0104", SYMLINK+="scanner-%k", GROUP="scanner", MODE="660", OPTIONS="last_rule"

와 같이 적어 준다.

이제 USB를 다시 연결하면 스캐너 디바이스의 그룹이 위에서 설정한 데로 root 와 scanner 가 된다.

scanner 그룹에 추가된 사용자로 로그인 한 사용자는 root 권한 없이 스캐너 접근이 가능하다.

BIND 동적 업데이트 하기

리눅스/설치

외부에서 DHCP로 변경되는 IP를 BIND에 동적으로 업데이트 해 주기
기본적인 문서는 아래를 참조
http://bind.cslab.kr/dynamic-update

외부 업데이트를 위해서 TSIG (Transaction Signature)를 이용함
1. 서버측 TSIG 설정
TSIG 키 생성

dnssec-keygen 프로그램으로 키 생성
  • -a hmac-md5 : 알고리즘 종류
  • -b 128 : 키 길이(128 bit) / 최대값 : 512 bits
  • -n HOST : 키 종류(HOST)
# dnssec-keygen -a hmac-md5 -b 128 -n HOST test.com.

  • 생성파일 확인 : 다음 2개의 파일이 생성됨
K{name}.+157.+{random}.key
K{name}.+157.+{random}.private

{name}은 저 위에서 HOST 에 지정한 도메인(test.com) 명임

  • named.conf 수정
zone “test.com" {
    type master;
    file “test.com.external.zone.db";
    // TSIG Key Based Access Control
    allow-update { key test.com.; };
};
key "test.com." {
    algorithm hmac-md5;
    secret "XXXXXXXXXXXXXXXXXXXX";
};

named.conf 의 해당 도메인(test.com)에 allow-update 부분에 key로 업데이트 하도록 추가

아래쪽 XXXXX 부분에는 위에서 생성한 .private 파일안의 Key: 이후에 나오는 문자열을 복사해 넣는다.
named.conf 는 다수의 사람에게 공개될 수 있으므로, 위의 key 부분은 별도의 파일로 만들어 주는 것이 좋다
이럴 경우에는 예를 들면 tsig.key 라는 파일에 위 구문을 저장한 후 named.conf 에는
include "/etc/tsig.key";
를 추가해서 Key 파일을 읽어 들이도록 한다.
  • 파일권한설정
/var/named (물론 chroot  설정이 되어 있다면 설정된 디렉토리) 의 사용자 권한이 named 사용자가 write 할 수 있는지 확인하고 안되어 있다면 권한을 부여한다.
chown named named;


2. 클라이언트 측 스크립트
원격지 DNS를 동적으로 업데이트할 때는 nsupdate를 이용한다.
서버에서 만든 2개의 키파일을 복사해 온다.

#!/bin/sh
# Update the name server with our info
HOSTNAME=host.domain.com
PREV_FILE=/root/prev_ip
PREV_IP=`cat $PREV_FILE`
CUR_IP=`/sbin/ifconfig eth0 | head -2 | tail -1 | awk '{ printf("%s\n", $2); }' | sed "s/addr://"`
if [ "$PREV_IP" != "$CUR_IP" ]
then
/usr/bin/nsupdate -d -k /root/keys/Kdomain.com.+157+59903.key <<-EOF
       prereq yxdomain $HOSTNAME
       update delete $HOSTNAME A
       update add $HOSTNAME 60 A $CUR_IP
       send
EOF
echo $CUR_IP > $PREV_FILE
fi
exit 0
다음 명령으로 nsupdate를 실행
nsupdate -d -k K{name}.+157.+{random}.private
>prereq nxdomain <호스트명>.
>prereq yxdomain <호스트명>.
>
위에서 보듯이 prereq 로 호스트명을 지정한다.
이때 호스트명이 이미 존재할 경우 yxdomain 을 없을 경우 nxdomain 을 입력해 주어야 한다..
자세한 건 BIND 문서를 참조

호스트를 추가 하거나 삭제 하는 명령어를 실행하고 최종적으로 send 명령어로 명령을 전송한다.
nsupdate -d -k Ktest.com.+157.+12345.private
>prereq yxdomain new.test.com.
>update delete new.test.com.
>update add new.test.com. 60 IN A 192.168.0.5
>show
>send

아래는 자동으로 IP를 업데이트 하는 스크립트이다.

#!/bin/sh
# Update the name server with our info
HOSTNAME=host.domain.com
PREV_FILE=/root/prev_ip
PREV_IP=`cat $PREV_FILE`
CUR_IP=`/sbin/ifconfig eth0 | head -2 | tail -1 | awk '{ printf("%s\n", $2); }' | sed "s/addr://"`
if [ "$PREV_IP" != "$CUR_IP" ]
then
/usr/bin/nsupdate -d -k /root/keys/Kdomain.com.+157+59903.key <<-EOF
       prereq yxdomain $HOSTNAME
       update delete $HOSTNAME A
       update add $HOSTNAME 60 A $CUR_IP
       send
EOF
echo $CUR_IP > $PREV_FILE
fi
exit 0

위 스크립트를 crontab 에 등록해서 5분마다 실행하게 할 경우 IP 변경시에 자동으로 업데이트 한다.

Linux 상에서 svn 사용하기

리눅스/설치
대개의 프로젝트는 윈도에서 하므로 TortoiseSVN을 사용하지만...
일부 서버는 리눅스 상에서 개발하므로 리눅스에서도 사용해야 되는 경우가....

다음은 리눅스에서 svn 기본 명령 사용법 정리이다.

1. 저장소 만들기
일단 root로 로그인
# cd /home/svn
--> 저장소를 생성
# svnadmin create --fs-type fsfs <repository명>
--> svn group이 저장소에 Access 가능하도록 directory 속성변경
# chmod -R o-x <repository명>
# chmod -R o-r <repository명>
# chmod -R g+w <repository명>
# chgrp -R svn <repository명>

2. 자신의 계정에서 생성한 저장소 Access
--> 자신의 사용자로 로그인
--> ~/.bash_profile 에 다음 줄 추가하여 환경변수 생성
export SVN_EDITOR=vi
--> 원하는 폴더로 감
$ cd ~/gits
--> 요렇게 하면 현재 디렉토리 아래에 <directory명>에 해당되는 directory가 생성되고 그 아래 소스트리를 만들면 된다.
$ svn checkout svn+ssh://localhost/home/svn/<repository명> <directory명>
--> <directory명> 으로 가서 작업
--> 로컬 디렉토리 또는 파일 저장소에 추가하기
$ svn add <파일명>
--> 로컬 디렉토리 또는 파일 커밋하기
$ svn commit
--> 저장소의 최근 내용으로 로컬 파일 업데이트 하기
$ svn update

더 자세한 내용은 아래 페이지 참조

http://www.pyrasis.com/main/Subversion-HOWTO

FreeNX 설치

리눅스/설치

1. http://www.nomachine.com/ 에서 다운로드 받는다.

2. Client, Node, Server 순으로 설치를 한다.
  # sudo rpm -i nxclient-3.3.0-6.x86_64.rpm
  # sudo rpm -i nxnode-3.3.0-12.x86_64.rpm
  # sudo rpm -i nxserver-3.3.0-14.x86_64.rpm

3. 설치 후 /usr/NX/scripts/setup/nxserver --install 실행

4. 키 생성을 위해 /usr/NX/bin/nxserver --keygen 실행

5. /usr/NX/share/keys/default.id_dsa.key 내용을 클라이언트 프로그램 설정 부분에 키 항목에 추가.

6. 만약 별도의 사용자 DB를 유지하고자 한다면 /usr/NX/etc/server.cfg 파일을 수정
EnableUserDB = "1"
EnablePasswordDB = "1"
"1"로 한 경우에는 6-1로..

기존 리눅스 사용자를 그대로 쓰려면 위의 "1"을 "0"으로 바꾼다.
EnableClipboard = "both"

6-1. 계정 추가 및 암호설정을 위해 nxserver --useradd username 실행

7. 데몬 재시작. /etc/init.d/nxserver restart

8. sshd 설정 확인
Load up your /etc/ssh/sshd_config file into an editor:

/etc/ssh/sshd_config 편집

다음 라인을 추가하거나 확인한다.
AuthorizedKeysFile /usr/NX/home/nx/.ssh/authorized_keys2

sshd 데몬을 재시작
sudo /etc/init.d/ssh restart

다음 명령을 쳐서 아래 화면 내용이 나오면 정상적인 상태이다
sudo /usr/NX/bin/nxserver --status

This should return:

NX> 900 Connecting to server ..
NX> 110 NX Server is running.
NX> 999 Bye.

9. 접속 후 한글이 안되는 경우가 있다. 이런 경우 다음과 같이 하면 된다.
사용자 홈 디렉토리에 .bash_history 파일에 다음 내용을 추가 한다.

export LC_CTYPE="ko_KR.UTF-8"
export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE=scim
export QT_IM_MODULE=scim

/tmp 디렉토리 suid 불가능하도록 마운트 하기

리눅스/해킹
이번 해킹 사건으로 더 이상 해킹에 대해 무관심 해서는 안될 거 같다는 교훈을 ...

찾아 보니 /tmp 는 아무나 쓰기 권한이 있으므로 해킹 임시 파일 저장고로 주로 이용된다.

따라서 이 디렉토리에 suid 권한이 없도록 마운트 할 것을 권장한단다.
 

아래는 기존 시스템에 /tmp 를 nosuid 로 마운트 하는 법
 

190Mb partition을 생성
#cd /dev/; dd if=/dev/zero of=tmpMnt bs=1024 count=200000
파티션을 포맷

#mke2fs /dev/tmpMnt

기존 데이터를 백업

#cp -Rp /tmp /tmp_backup

새로운 파티션을 마운트

#mount -o loop,noexec,nosuid,rw /dev/tmpMnt /tmp
권한 설정
#chmod 0777 /tmp
기존 데이터를 다시 리턴
#cp -Rp /tmp_backup/* /tmp/

다음 부팅 때를 위하여 /etc/fstab 에 다음 라인 추가

/dev/tmpMnt /tmp ext2 loop,noexec,nosuid,rw 0 0

 
/var/tmp 디렉토리를 삭제하고 심볼릭 링크를 걸어 줌

#rm -rf /var/tmp/
#ln -s /tmp/ /var/

완료...

이제 백업된 디렉토리를 지워 주자

#rm -rf /tmp_backup