Reminiscence

ZFS on Centos6

Linux2013.04.19 11:37

약 30TB 정도의 데이터 백업을 위해 백업 서버를 한대 구성하고 XFS로 포맷하고 데이터를 저장..

파일 개수가 약 1억개 정도 되다보니.. 데이터를 백업 하는 과정에서 계속 XFS 파티션이 깨지는 현상이 발생..

거기다 설상가상으로 서버이전이다 뭐다 해서 용량이 갑자기 10TB가 추가되어버린..

ㅠ_ㅠ 아.. 서버 재구성해야 하나.. 했는데..

 

이번기회에 ZFS로 가보자 하고 결정..

아래 내용은 Onenote에 정리해둔 내용을 옮겨적음..

 

[기본환경]

  • OS : CentOS release 6.3 (Final) 64Bit
  • Kernel : 2.6.32-279.19.1.el6.x86_64

 

[설치]

  • Linux 시스템에서 ZFS 사용하기 위해서는 Native ZFS 이용하는 방법과 ZFS-FUSE 이용하는 방법이 있으며, 각각의 방법에 따라 ZFS 버전이 달라질 있습니다.

 

  1. 먼저 ZFS 구성을 위해 기본적으로 필요한 항목들을 설치 합니다.

Shell > yum install kernel-devel zlib-devel libuuid-devel libblkid-devel libselinux-devel parted lsscsi

Native ZFS Kernel 모듈 방식으로 동작 하기 때문에 위와 같이 kernel-devel 반드시 설치해 주어야 합니다.

 

  1. ZFS패키지인 SPL ZFS 패키지를 다운로드 합니다.

다운로드는 http://www.zfsonlinux.org 에서 받을 있습니다.

 

  1. 다운로드한 패키지의 압축을 해제 설치를 진행 합니다.

# spl install

Shell > tar xvfz spl-0.6.0-rc13.tar.gz

Shell > cd spl-0.6.0-rc13

Shell > ./configure && make rpm

Shell > rpm -Uvh *.x86_64.rpm

Shell > cd ..

 

# zfs install

Shell > tar xvfz zfs-0.6.0-rc13.tar.gz

Shell > cd zfs-0.6.0-rc13

Shell > ./configure && make rpm

Shell> rpm -Uvh *.x86_64.rpm

Shell > cd ..

 

  1. 설치된 zfs 커널 모듈을 인식시켜 줍니다.

Shell > modprobe zfs

Shell > lsmod | grep -i zfs

 

  1. ZFS Spool 생성 합니다.

여기서 ZFS Spool 만들때 단일 디스크를 사용할 것인지 아니면 여러 개의 단일 디스크를 소프트웨어 레이드 방식으로 구성 것인지를 결정 있습니다. ZFS Spool 생성할 때에는 zpool 명령어를 사용하며, 해당 명령어에는 다양한 기능들이 포함되어 있으므로 자세한 내용은 공식 Document 참조하시기 바랍니다.

아래에서는 단일 디스크와 2 디스크를 미러링 하는 방법, 그리고 4 이상의 디스크를 Raid5 구성하는 방법을 설명 하겠습니다.

# EX : zpool [명령어] [옵션] spool

# CREATE EX : zpool create [-f|-n] [-o property=value] [-m mountpoint] pool vdev

 

# /dev/sdb 디스크를 backup 스풀로 생성하며, compress option 기본설정 하도록 한다.

Shell > zpool create -o compress=on backup disk /dev/sdb

 

# /dev/sdb 디스크와 /dev/sdc 디스크를 Backup 스풀로 생성하며, Raid1 구성 Compress option 설정 하도록 한다.

Shell > zpool create -o compress=on backup mirror /dev/sdb /dev/sdc

 

# /dev/sd[b-f] 디스크( 5) 4개를 Raid5 (Parity Disk 1)구성하고 나머지 1개의 디스크는 Hot Spare 구성을 Backup 스풀을 구성하고 /backup_spool 이라는 디렉토리에 마운트 되도록 한다.

Shell > zpool create -m /backup_spool backup raidz1 /dev/sdb /dev/sdc /dev/sdd /dev/sde spare /dev/sdf

 

  1. ZFS Spool ZFS 파일 시스템을 생성 합니다.

ZFS Spool 공간을 이용하여 파일시스템을 생성할 있으며, 각각의 파일시스템은 Spool 적용된 property Option 상속하게 됩니다.

# EX : zfs [명령어] [옵션]

# CREATE EX : zfs create [-p] [-o] filesystem

 

# backup 스풀의 공간을 이용하여 maildata 라는 파일시스템을 생성하고 자동 압축되지 않도록 구성 한다.

Shell > zfs create -o compress=off backup/maildata

 

# Backup 스풀의 공간을 이용하여 mysql 라는 파일시스템을 생성하고 자동압축되지 않으며, /data/mysql 마운트 되도록 한다.

Shell > zfs create -o compress=off -o mountpoint=/data/mysql backup/mysql

 

# Backup 스풀의 공간을 이용하여 user 라는 파일시스템을 생성하고 자동압축되며, 500GB 쿼터를 설정하고 /home/user 디렉토리에 마운트 되도록 한다.

Shell > zfs create -o compress=on -o mountpoint=/home/user -o quota=500GB backup/user

 

ZFS로 구성한 후 Compression 옵션 덕분에 실제 8TB 정도 되는 데이터는 5.6TB 정도로 압축되어 저장되었다는 후문이...

 

ZFS 사랑해요~!

저작자 표시 비영리
신고

댓글 0개가 달렸습니다.

Centos 6.4로 OS를 올리고나서 Dell의 OMSA를 설치하고 실행하니 아래와 같이 실패하는 메세지가 나온다..

 # srvadmin-services.sh start 

 Starting Systems Management Device Drivers: 

 Starting dell_rbu:                     [ OK ] 

 Starting ipmi driver:                   [FAILED] 

 Starting Systems Management Device Drivers: 

 Starting dell_rbu: Already started             [ OK ] 

 Starting ipmi driver:                   [FAILED] 

 Starting DSM SA Shared Services:              [ OK ] 

 /var/log/messages reports :  

 instsvcdrv: /etc/rc.d/init.d//dsm_sa_ipmi start command failed with status 1 

 

알고 보니 사전 패키지 설치 과정에서 OpenIPMI가 빠져서 그렇다고 하네...

해결 방법은

# yum -y install OpenIPMI

 

설치하고 재시작 하면 깔끔하게 동작한다.

저작자 표시 비영리
신고

댓글 0개가 달렸습니다.

관리중인 10대의 서버중 4대의 서버에서 아래와 같은 에러가 발생하였다. 

/usr/local/bin/rsync: symbol lookup error: /usr/local/bin/rsync: undefined symbol: locale_charset


구글신님께 문의한 결과 일본 블로그중에 유사한 문제를 해결한 내용이 있어 여기에도 기록한다. 

위와 같은 문제가 발생한 경우 Make시 locale_charset에 대한 부분을 참조 할 수 있도록 Makefile에서 아래와 같이 수정 한다. 

Shell# cd /root/rsync-3.0.9

Shell# vi Makefile

------

# Makefile


prefix=/usr/local

datarootdir=${prefix}/share

exec_prefix=${prefix}

bindir=${exec_prefix}/bin

mandir=${datarootdir}/man


#LIBS=-lacl -lpopt -liconv

LIBS=-lacl -lpopt -lcharset -liconv

CC=gcc -std=gnu99

CFLAGS=-g -O2 -DHAVE_CONFIG_H -Wall -W

CPPFLAGS=

EXEEXT=

LDFLAGS=

-------
Shell# make clean
Shell# make && make install


 위와 같이 처리 하니 잘 된다. 


#참조 : http://jptrans.naver.net/webtrans.php/korean/blog.heartofsword.net/archives/562

저작자 표시 비영리
신고

댓글 0개가 달렸습니다.

 

multidump.zip

 

제목은 거창한데.. 내용은 별거 없네요.. ^^;

우리 회사에서 운영중인 특정 시스템의 경우 하나의 MySQL DB 서버에 약 2천여개의 DB를 가지고 있습니다.

뭐.. 용량은 서버마다 각각 다르지만, 대략 300GB ~ 500GB 사이를 왔다갔다 하는 서버죠

그런데 이 DB 엔진이 MyISAM으로 되어 있고, 이걸 InnoDB로 변경하면서 서버 교체까지 한번에 진행해야 하는 문제가 생깁니다.

이에 mysqldump로 힘들게 덤프 떠보니 속도가 너무 꽝이네요 .. -ㅠ - ;;

그래서 만들었습니다. 멀티쓰레드 덤프 ㅡ.,ㅡ;;

 

내용은 별거 없고 기본적인 흐름은 다음과 같습니다.

1. 현재 DB 서버 내 전체 데이터베이스 목록을 파일로 만든다.

2. 각 데이터베이스 이름마다 child process를 생성한다.

3. 각 child process에서 백업 작업이 끝나면, 목록에서 자신의 DB 명을 지우고 종료 한다.

 

간단한 스크립트라 공개하기에도 민망한데 필요하신 분들이 혹(?) 계실지도 모르니.. ^^;

 

###############

## multidump.sh  #

###############

## 4core MULTIDUMP SCRIPT

#!/bin/bash

 

remove_list() {

        sed -e "/^${DBNAME}$/d" $DB_LIST_FILE >> TMPFILE1;

        rm -f $DB_LIST_FILE;

        mv TMPFILE1 $DB_LIST_FILE;

echo "$DBNAME" >> RESTORE_LIST;

}

 

export c_black='\033[0m'

export c_boldblack='\033[1;0m'

export c_red='\033[31m'

export c_boldred='\033[1;31m'

export c_green='\033[32m'

export c_boldgreen='\033[1;32m'

export c_yellow='\033[33m'

export c_boldyellow='\033[1;33m'

export c_blue='\033[34m'

export c_boldblue='\033[1;34m'

export c_magenta='\033[35m'

export c_boldmagenta='\033[1;35m'

export c_cyan='\033[36m'

export c_boldcyan='\033[1;36m'

export c_white='\033[37m'

export c_boldwhite='\033[1;37m'

export c_colorend='\033[0m'

 

cecho ()

{

        local default_msg="No Message Passed."

 

        message=${1:-$default_msg}

        color=${2:-black}

 

        case $color in

                black)

                         printf "$c_black" ;;

                boldblack)

                         printf "$c_boldblack" ;;

                green)

                         printf "$c_green" ;;

                boldgreen)

                         printf "$c_boldgreen" ;;

                red)

                         printf "$c_red" ;;

                boldred)

                         printf "$c_boldred" ;;

                yellow)

                         printf "$c_yellow" ;;

                boldyellow)

                         printf "$c_boldyellow" ;;

                blue)

                         printf "$c_blue" ;;

                boldblue)

                         printf "$c_boldblue" ;;

                magenta)

                         printf "$c_magenta" ;;

                boldmagenta)

                         printf "$c_boldmagenta" ;;

                cyan)

                         printf "$c_cyan" ;;

                boldcyan)

                         printf "$c_boldcyan" ;;

                white)

                         printf "$c_white" ;;

                boldwhite)

                        printf "$c_boldwhite" ;;

        esac

        printf "%s$c_colorend\n" "$message"

}

 

dump_list(){

 

DISABLE_DB_LIST="information_schema mysql performance_schema sysbench test vsftp webmail webmail_admin wordlist";

 

mysql -h $DUMP_HOST -Ne "show databases" >> db_list;

for INF in $DISABLE_DB_LIST;do

        sed -e "/^${INF}$/d" db_list >> tmp_list

        rm -f db_list;

        mv tmp_list db_list;

done;

 

}

 

# 임시 파일 생성

cecho "==== Temporary file create ====" boldgreen

echo "1" >> PROC_TMP1;

echo "1" >> PROC_TMP2;

echo "1" >> PROC_TMP3;

echo "1" >> PROC_TMP4;

 

CNT="0"

DB_LIST_FILE="./db_list"

CHILD_BIN="./multidump_child.sh"

DUMP_HOST="192.168.1.15"

S_DATE=`date +"%Y-%m-%d %H:%M:%S"`

 

# DB LIST OUTPUT

cecho "==== START TIME : ${S_DATE} ====" boldgreen

cecho "==== Backup target listing ====" boldgreen

dump_list;

TOTAL_RUN=`cat $DB_LIST_FILE | wc -l`

sleep 1;

 

 

while (( `cat $DB_LIST_FILE | wc -l` ))

do

        sleep 1;

 

        DBNAME=`tail -n 1 $DB_LIST_FILE`;

 

        if [ -s PROC_TMP1 ]

        then

                cat /dev/null > PROC_TMP1;

                CNT=`expr $CNT + 1`

                cecho "  * ($CNT/$TOTAL_RUN) : $DBNAME DUMP 실행 " boldblue

                $CHILD_BIN $DBNAME PROC_TMP1 $DUMP_HOST &

                remove_list

        elif [ -s PROC_TMP2 ]

        then

                cat /dev/null > PROC_TMP2;

                CNT=`expr $CNT + 1`

                cecho "  * ($CNT/$TOTAL_RUN) : $DBNAME DUMP 실행 " boldblue

                $CHILD_BIN $DBNAME PROC_TMP2 $DUMP_HOST &

                remove_list

        elif [ -s PROC_TMP3 ]

        then

                cat /dev/null > PROC_TMP3;

                CNT=`expr $CNT + 1`

                cecho "  * ($CNT/$TOTAL_RUN) : $DBNAME DUMP 실행 " boldblue

                $CHILD_BIN $DBNAME PROC_TMP3 $DUMP_HOST &

                remove_list

        elif [ -s PROC_TMP4 ]

        then

                cat /dev/null > PROC_TMP4;

                CNT=`expr $CNT + 1`

                cecho "  * ($CNT/$TOTAL_RUN) : $DBNAME DUMP 실행 " boldblue

                $CHILD_BIN $DBNAME PROC_TMP4 $DUMP_HOST &

                remove_list

        else

                cecho "==== 현재 모든 프로세스가 처리 중입니다. ====" boldwhite

        fi

done

 

rm -f PROC_TMP*;

 

cecho "==== START TIME : ${S_DATE} ====" boldgreen

S_DATE=`date +"%Y-%m-%d %H:%M:%S"`

cecho "==== END TIME : ${S_DATE} ====" boldgreen

 

여기까지가 메인 스크립트이구요.. 아래는 multidump_child.sh 스크립트 입니다.

####################

## multidump_child.sh ##

####################

## MULTIDUMP CHILD SCRIPT

## Dump 하면서 sed를 이용해 백업되는 데이터의 Engine Type을 InnoDB로 변경한다.

 

#!/bin/bash

/usr/local/mysql/bin/mysqldump -h $3 --force -c $1 | sed "s/ENGINE=MyISAM/ENGINE=InnoDB/g" >> /backup/MULTI_DUMP/${1}_dump.sql

echo "$1" >> $2;

 

지금도 가끔 쓰는 스크립트지만, 그때 그때 수정해서 필요한 부분에 맞게 맞춰서 쓰고 있구요..

그냥 mysqldump로 뜨는것보단 한 2배에서 2.5배 정도 빠르네요..

Sed로 치환처리 안하면 좀 더 빠릅니다. ;;

 

위에는 4개 스레드를 기본으로 한건데 8개로 하면 쪼~~~~끔 더 빨라지니.. 필요에 따라.. =_=;;;

저작자 표시
신고

댓글 0개가 달렸습니다.

Centos6를 설치 하고 나서 ifconfig 명령어를 실행하니 Ethernet Device가 흔히 보던 eth0 또는 eth1이 아닌 경우가 있을 수 있습니다. Centos 5 까지는 이러한 문제가 없었는데 갑자기 6로 올라와서 이러한 문제가 생기니 당황스럽기도하고 막막한 느낌이 듭니다. 하하.. =ㅠ = ..


특히 회사에서 개발한 솔루션에는 Ethernet Device를 체크하는 솔루션이 있는데 이게 동작을 안하네요 허허.. -ㅠ - 


그럼 처리 방법을 보죠.. 


먼저 아래 명령어를 실행해서 biosdevname 이라는 패키지가 설치되어 있는지 확인 합니다. 


Shell > rpm -qa | grep biosdevname

biosdevname-0.3.11-1.el6.x86_64


오오.. 하나 깔려 있네요 -ㅠ- 

이놈이 하는 역활은 Bios상에 지정되어 있는 각 Device들에 대한 명칭을 그대로 OS 상에서 쓸 수 있도록 처리하는 놈입니다. 뭐.. 환경에 따라 또는 사람들에 따라 필요로 하는 기능일 수 있겠지만, 익숙하지 않은걸 받아들이는건 쉽지 않군요.. =ㅠ = 


이제 biosdevname 이라는 패키지를 삭제 하고 /etc/udev/rules.d 로 넘어가서 70-persistent-net.rules 파일이 있는지 확인 합니다. 

Shell > rpm -e biosdevname-0.3.11-1.el6.x86_64

Shell > cd /etc/udev/rules.d/

Shell > ls -al 70-persistent-net.rules

Shell >

네.. 그렇군요. 아무것도 없네요 -ㅠ - .. 


70-persistent-net.rules  파일이 있다면, 해당 파일을 열어서 수정하면 되지만, 없다면, 새로 만들어 주세요. 전 파일이 없었기 때문에 아래와 같이 파일을 만들었습니다. 


SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:22:19:a1:80:df", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"


SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:22:19:a1:80:e1", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"


여기서 값에 대한 부분은 간단 합니다. ATTR{address}== 라고 되어 있는 부분 뒤에 해당 Ethernet Device의 Mac 주소를 적어주시고, Mac 주소에 해당하는 디바이스가 어떤 이름으로 지정 될 것인지 NAME= 다음에 넣어 주시면 됩니다. 위의 내용을 풀자면


MAC Address가 00:22:19:a1:80:df 인 Ethernet Device는 eth0로 설정 한 것이고, 

MAC Address가 00:22:19:a1:80:e1 인 Ethernet Device는 eth1로 설정 한 것 입니다.


위와 같이 설정을 끝냈다면, 저장 한 후 이더넷 디바이스 설정 파일을 열어야 하지만, 우리는 귀찮으니까 이미 생성되어 있는 파일을 쓰도록 하죠.  

Shell > cd /etc/sysconfig/network-scripts

Shell > mv ifcfg-em1 ifcfg-eth0

Shell > mv ifcfg-em2 ifcfg-eth1

Shell > vi ifcfg-eth0

Shell > vi ifcfg-eth1

위와 같이 ifcfg-eth0, ifcfg-eth1 파일을 열어 DEVICE=em1 이라고 되어 있는 부분을 DEVICE=eth0 과 같이 수정 합니다. 물론 자신의 서버에 맞는 설정을 해야겠죠? =ㅠ = 


모든 설정이 완료 되었으면, 서버 재부팅 한번 시원하게 해주시고, 로그인 하셔서 ifconfig를 실행해 보세요. 

그럼 익숙했던 eth0과 eth1이 나를 반기고 있을것입니다. 


참고로 제가 겪은 서버는 Dell 서버에서 위와 같은 현상을 겪었습니다..


[참고]

http://fedoraproject.org/wiki/Features/ConsistentNetworkDeviceNaming

https://www.centos.org/modules/newbb/viewtopic.php?topic_id=35597

http://linux.dell.com/files/whitepapers/consistent_network_device_naming_in_linux.pdf

http://grokbase.com/t/centos/centos/12149ksj15/no-eth0-on-centos-6-2

저작자 표시 비영리
신고

댓글 0개가 달렸습니다.

 

가끔씩 fstab 잘못된 Block Device 정보를 등록하거나, 디스크가 Lable 또는 정보가 변경되어 정상적인 부팅이 되지 않고 Repair Filesystem 모드로 들어가는 경우가 생긴다.

물론 fstab 수정하고 재부팅하면 빠르게 처리가 되지만, Repair Filesystem 상태에서는 Read Only 상태로 마운트가 되기 때문에 수정이 불가능 하다.


이때
아래와 같이 최상위 Root 파티션인 / Read/Write 모드로 다시 마운트 하면 쉽게 수정하여 재부팅을 진행 있다.

 

Repair filesystem # mount -w -o remount /
Repair filesystem
# vi /etc/fstab
--- fstab 내용 수정 후 ---
Repair filesystem
# reboot
저작자 표시 비영리
신고

댓글 0개가 달렸습니다.

- 사건 개요 
  > Centos 6 설치 이후 lftp를 사용하려 하자, 아래와 같은 에러메세지가 출력되면서 동작을 하지 않음.
/usr/lib64/libgnutls.so.26: symbol gcry_cipher_setkey, version GCRYPT_1.2 not defined in file libgcrypt.so.11 with link time reference

     구글이랑 여러군데 검색을 해본 결과 gcrypt 설치 이후 라이브러리 경로가 /usr/lib으로 되어 있을 수 있으나, ldconfig에 해당 내용을 추가하면 될 것이라는 내용을 확인.
이에 아래와 같이 /etc/ld.so.conf에 추가
/usr/lib
/usr/lib64
추가 후 lftp 실행 결과 정상 동작...

이거 하나 해결하려고 2시간 삽질.... 아놔...
저작자 표시 비영리
신고

댓글 0개가 달렸습니다.

회사에서 운영중인 서버중 MySQL을 사용하는 DB 서버만 대략 100여대 가량이다 보니(다 제각각이에요 ㅠ_ㅠ) 가끔씩 오류로 인해 서버가 다운되거나 MySQL 데몬이 죽었을때 테이블이 깨지는 경우가 발생 하곤 합니다. ㅠ _ㅠ

하나하나 찾아서 Repair 하기도 어렵기도 하고 귀찮기도 하고.. 그냥 간단하게 스크립트로 Check 해서 결과를 리턴하는 형식의 스크립트를 짰는데..

결과를 보는게 조금 엉성 하네요.. =ㅠ = ;; 꾸미는데에는 재주가 없어서;; ㅎㅎ

필요하신 분들은 가져가셔서 사용하시고.. 퍼가실때에는 출처만 밝혀주세요 +_+ ㅎㅎ

더보기



이게.. VI에서 탭으로 구분해 놓은걸 그대로 가져왔더니 이렇게 올라가네요;; =ㅠ=;;
저작자 표시 비영리
신고

댓글 0개가 달렸습니다.


PowerShell
이용하면서 PowerShell 내에서 FTP 데이터를 다운 받아 처리 있는 방법은 없을까 고민하던 FTP 관련 함수들을 찾아보기 시작했습니다.

 

PowerShell에서 FTP 대한 기능들을 사용 있도록 해주는 모듈을 판매하는 업체도 있었지만, 해당 모듈을 구매하여 사용하는 것은 의미가 없으므로, 실제 데이터를 주고 받을 있는 함수들을 찾아보았습니다.

 

아래 내용은 FTP 이용하여 파일을 다운로드 하는 스크립트 입니다.

아래 내용에서 가장 중요한 부분은 .NET Component 사용하는 부분이며, 이에 대한 자세한 정보는 http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx 에서 확인 있습니다.

 

 

# Get-FTPfile 함수를 선언

function Get-FTPFile ($Source,$Target,$UserName,$Password) 

{ 

 

# FTP 주소를 .Net 컴포넌트중 FtpWebRequest의 Craete명령을 통해 열어 줍니다.

# 단, 이때 사용되는 $Source 주소의 경우 FTP Web Request이기 때문에 FTP://주소/ 형식으로 입력되어야 합니다.

$ftprequest = [System.Net.FtpWebRequest]::create($Source) 

 

 

# NetworkCredential Class는 기본, 다이제스트, NTLM, Kerberos 인증과 같은 암호 기반의 인증 체계에 자격증명을 제공하기 위해서 사용 합니다.

# 참고 : http://msdn.microsoft.com/ko-kr/library/system.net.networkcredential(v=VS.80).aspx

 

$ftprequest.Credentials = 

    New-Object System.Net.NetworkCredential($username,$password) 

 

# ::DownloadFile : FTP 서버에서 파일을 다운로드 하는데 사용되는 FTP RETR 프로토콜 메서드를 나타냅니다.

$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile 

# UseBinary : FTP 서버에서 파일 전송시 데이터 형식을 지정하는 Boolean 값을 설정 합니다.

$ftprequest.UseBinary = $true 

# KeepAlive : FTP 서버에서 제어 연결이 요청 완료 후 닫히는지 여부를 결정 합니다. 지속적인 세션 유지를 위해 False 값을 줍니다.

$ftprequest.KeepAlive = $false 

 

# FTP 서버에 응답을 반환 하는 메서드를 ftpresponse에 지정합니다.

$ftpresponse = $ftprequest.GetResponse() 

 

# FTP 서버에서 보낸 응답 데이터를 포함하는 스트림을 검색하여 reponsestream에 지정합니다.

$responsestream = $ftpresponse.GetResponseStream() 

 

# System.IO.FileStream 클래스를 사용하여 로컬 시스템의 디렉토리에 파일을 생성 할 수 있도록 준비 합니다.

# 이때 아래 [IO.FileMode]::Create는 로컬 시스템에서 파일을 생성할때 동일한 이름이 있으면 덮어쓰고, 동일한 이름이 없으면 새로 생성 함을 의미 합니다.)

$targetfile = New-Object IO.FileStream ($Target, [IO.FileMode]::Create) 

 

# 파일을 받을 때 버퍼로 사용 할 ByteArray 변수를 생성합니다.

[byte[]]$readbuffer = New-Object byte[] 1024 

 

# ResponseStream.Read 메서드를 이용하여 Response된 Stream의 데이터를 Readbuffer에 저장하고 1024Byte 만큼 저장되면 이를 IO.FileStream의 Write 메서드를 이요하여 파일로 작성 합니다.

# 이 과정은 ResponseStream에서 읽어들인 데이터가 0일때까지 계속 됩니다. (파일을 받아오는 과정)

# 이와 관련된 과정은 http://msdn.microsoft.com/ko-kr/library/yet8z89t.aspx  http://msdn.microsoft.com/ko-kr/library/system.io.stream.read.aspx 를 참조하시기 바랍니다.

do{ 

    $readlength = $responsestream.Read($readbuffer,0,1024) 

    $targetfile.Write($readbuffer,0,$readlength) 

} 

while ($readlength -ne 0) 

# IO.FileStream.Close 메서드를 이용하여 파일을 닫습니다.

$targetfile.close() 

} 

 

# Get-FTPFile 함수 호출을 위한 기본적인 정보들을 입력합니다. 

$sourceuri = "ftp://MyFtpServer/FolderPath\File.txt" 

$targetpath = "C:\temp\MyFile.txt" 

$user = "Username" 

$pass = "Password" 

Get-FTPFile $sourceuri $targetpath $user $pass

 


다음편에서는
FTP 이용하기 (Upload Delete)편을 준비하도록 하겠습니다.

 

감사합니다.


저작자 표시 비영리
신고

댓글 0개가 달렸습니다.


PowerShell을 이용하여 IIS 로그파일 경로를 지정하시면 송/수신된 데이터 량을 확인 할 수 있습니다.
여기서 약간 더 변형을 한다면, IIS의 내용중 로그 디렉토리에 대한 정보를 확인하여 각 사용자 별로 일일 송/수신 데이터 량을 확인 할 수도 있습니다.

우선 소스부터 보시죠..

# 로그 파일 경로를 입력 받습니다.
Param (
  [String] $Path
)
# 필요한 변수들을 미리 지정 합니다.
[INT]$RECV_TOTAL="0"
[INT]$SEND_TOTAL="0"
[INT]$CS_NUM=0;
[INT]$SC_NUM=0;
 
$KB=1024
$MB=1024*1024
$GB=1024*1024*1024
get-content $Path | %{
    #Pattern Check
    if ( $_ | Select-String -Pattern "#Fields" ) {
        # Fields 값에 대한 마이너스 값 처리.
        [INT]$CNT=-1;
        foreach ($element in $_.Split(' '))
        {
           if ( $element -eq "sc-bytes" ){
             $SC_NUM=$CNT;
           }elseif ( $element -eq "cs-bytes" ) {
             $CS_NUM=$CNT;
           }
           $CNT+=1;
        }
     }
     elseif ( $_ | Select-String -Pattern "^[^#]" )
     {
# 실제 송/수신된 값을 Split 명령을 통해 저장합니다.
 [int]$SEND_BYTE=$_.Split(' ')[$SC_NUM];
 [int]$RECV_BYTE=$_.Split(' ')[$CS_NUM];
 [int]$RECV_TOTAL+=$RECV_BYTE;
 [int]$SEND_TOTAL+=$SEND_BYTE;
    }
}
If ( $RECV_TOTAL -gt $GB ){
 $RECV_TOTAL = $RECV_TOTAL / $GB
 Write-Host "Total  In : $RECV_TOTAL GByte"
} elseif ( $RECV_TOTAL -gt $MB){
        $RECV_TOTAL = $RECV_TOTAL / $MB
 Write-Host "Total  In : $RECV_TOTAL MByte"
}elseif ( $RECV_TOTAL -gt  $KB){
 $RECV_TOTAL = $RECV_TOTAL / $KB
 Write-Host "Total  In : $RECV_TOTAL KByte"
}else{
 Write-Host "Total  In : $RECV_TOTAL Byte"
}
If ( $SEND_TOTAL -gt $GB ){
 $SEND_TOTAL = $SEND_TOTAL / $GB
 Write-Host "Total Out : $SEND_TOTAL GByte"
} elseif ( $SEND_TOTAL -gt $MB){
        $SEND_TOTAL = $SEND_TOTAL / $MB
 Write-Host "Total Out : $SEND_TOTAL MByte"
}elseif ( $SEND_TOTAL -gt  $KB){
 $SEND_TOTAL = $SEND_TOTAL / $KB
 Write-Host "Total Out : $SEND_TOTAL KByte"
}else{
 Write-Host "Total Out : $SEND_TOTAL Byte"
}

우선 간단한 소스이니 얼마든지 변형이 가능 합니다.
추가적으로 더 나간다면, 여러대의 서버를 관리하는 관리자의 경우 각 서버들에 대한 FTP 접속 계정을 만들고 FTP로 접속하여 각 로그 파일들을 다운로드 받은 뒤 해당 파일에 대한 체크 후 자동 삭제 하는 과정을 통해 모든 IIS 서버에 대한 각 계정별 트래픽 값을 확인 할 수도 있습니다.

그냥 단순히 참고만.. ^^.
저작자 표시 비영리
신고

댓글 0개가 달렸습니다.


1. PowerShell의 인증

PowerShell
사용하면서 외부의 스크립트를 실행하거나, 로컬에서 스크립트를 실행해야 하는 경우가 발생하게 되는데, 이때 대부분 실행정책(Execution_Policy) 인하여 정상적인 실행이 되지 않는 경우가 발생 합니다.

 

문제를 해결하기 위해서는 Execution Policy RemoteSigned 수정하거나, 인증서를 생성하여 인증 절차를 진행해야 하는데, RemoteSigned 대한 내용은 너무 쉽고 간단하므로, 인증서를 발급받아 처리 하는 과정에 대하여 보도록 하겠습니다.

- RemoteSigned 설정 방법 보기 ▼ more Click!

더보기


우선
인증서를 생성하기 위해서는 인증 과정을 알아야 입니다.

PowerShell 이러한 인증 과정에 대하여 상세하게 매뉴얼로 설명을 하고 있으며, 매뉴얼을 PowerShell 내에서도 확인 수가 있습니다.


- About_Signing
관련 문서 : http://technet.microsoft.com/ko-kr/library/dd347649.aspx

- About_Signing 매뉴얼 명령어 : [Get-Help about_signing]

 

Microsoft에서 제공하는 뉴얼을 보면 스크립트 서명 방법에 대하여 2가지를 제시하고 있습니다.

  • 공인 인증 기관에서 만든 인증서 : 공인 인증기관에서 유료로 사용자에게 발급하는 코드 서명 인증서
  • 사용자가 만든 인증서 :사용자가 자신의 컴퓨터를 인증기관 역할을 있도록 설정하여 자체 서명된 인증서를 발급하므로 무료로 발급하여 사용이 가능.


PowerShell
공부하는데 돈이 들어가면 안되겠죠? 우리는 여기서 사용자가 만든 인증서(개인 인증서)를 이용하도록 하겠습니다.


2. PowerShell의 개인 인증서 만들기
 

인증서를 만들기 위해서는 우선 인증서 생성 도구가 있어야 하며, 도구는 .Net Framework SDK 1.1 이상 버전에 포함되어 있으며 아래 URL에서 다운로드 받을 있습니다.

  • .NET Framework SDK 2.0 Download : http://www.microsoft.com/downloads/details.aspx?familyid=fe6f2099-b7b4-4f47-a244-c96d69c35dec&displaylang=en
  • Window SDK Download : http://msdn.microsoft.com/ko-kr/windows/bb980924.aspx
  • MakeCert 관련 문서 : http://go.microsoft.com/fwlink/?LinkId=119097
  •  

     

    저는 제가 사용중인 Windows7 맞는 SDK Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 다운로드 받아 설치하였습니다.

     

    모든 설치가 완료 되었다면, 이제 인증서 생성 도구인 makecert 실행해야 하지만, 그전에 사전 준비 작업을 진행하도록 하겠습니다.

    1) 우선 시
    버튼을 누른 mmc.exe 실행 하도록 합니다.


    2) 콘솔 창이 열리면 [파일] -> [스냅인 추가/제거] 버튼을 눌러 스냅인 페이지를 띄워줍니다. (단축키는 Ctrl + M)
    3)
    [스냅인 추가/제거] 창이 열리면 [인증서] 선택 추가 버튼을 누릅니다.


    4) 스냅인이 관리할 인증서 대상은 [ 사용자 계정] 선택 마침을 눌러 스냅인을 완료 합니다.
     

    스냅인이 완료 되었다면, 이제 실제 개인 인증서를 생성해야 합니다. 이를 생성하기 위해서는 위에서 말씀 드린바와 같이 makecert 툴을 사용해야 합니다.


    Windows SDK
    설치한 경우라면, Windows 7 SDK 포함된 CMD 띄워서 실행하도록 하겠습니다.


     

    위와 같이 makecert 실행되는 것을 확인 했다면, 다음 명령어를 실행하여 인증서를 생성하도록 합니다.
     

    <Root 인증서>

    makecert -n "CN=PowerShell Local Certificate Root" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer -ss Root -sr LocalMachine


    Root
    인증서를 생성하기 위해 위와 같이 명령어를 실행했다면, 아래 그림과 같이 개인키 암호 만들기 라는 창이 보여질 입니다.

     

    보안상 암호를 설정 하도록 하겠습니다.

    2번의 암호 설정 입력이 끝나면, 입력한 암호에 대하여 확인하는 암호 입력창이 다시 한번 출력됩니다.



     정상적으로 Root 인증서와 사용자 인증서가 설치되었다면, MMC에서 해당 내용을 확인 있습니다.

    [MMC 실행 인증서 스냅인 추가] -> [신뢰할 있는 루트 인증기관] -> [인증서] -> [PowerShell Local Certificate Root]


     

    관리자 인증서 생성이 완료되었으니, 이제 사용자 인증서를 생성해 보도록 하겠습니다.


    <사용자 인증서>
     

    makecert -pe -n "CN=PowerShell User" -ss MY -a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer


    Root 인증서를 만들때와 마찬가지로 개인키 암호를 입력하는 창이 출력되며, 해당 창에 개인키에 대한 암호를 입력하시면 정상적으로 생성이 됩니다.


     

    이제 Root 인증서와 사용자 인증서 2 모두 생성이 되었으니, 사용자 인증서에 대한 내용을 PowerShell에서 확인해 보도록 하겠습니다.

     

    PowerShell 창에서 아래 명령어 입력을 통해 확인이 가능 합니다.

    PS C:\Windows\system32> Get-Childitem cert:\CurrentUser\my -codesigning

     

        디렉터리: Microsoft.PowerShell.Security\Certificate::CurrentUser\my

     

    Thumbprint                                                  Subject

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

    A9BB73523B24247BCFBE9B7B7E0B7723F559209C  CN=PowerShell User


    생성된 인증서는 MMC 스냅인을 통해서도 확인이 가능 합니다.

     

    정상적으로 인증서를 만들었다면, 인증서를 이용해서 자신이 실행하고자 하는 스크립트 또는 작성한 스크립트에 Signing 진행해 보도록 하겠습니다.

    아래 내용은 Sign 되지 않은 스크립트와 Sign 스크립트의 실행 결과 차이 입니다.

     

    PS C:\Users\mrmsm.SDS> Set-ExecutionPolicy Allsigned

    PS C:\Users\mrmsm.SDS> .\GetProcess_Script.ps1

    C:\Users\mrmsm.SDS\GetProcess_Script.ps1 파일을 로드할 수 없습니다. C:\Users\mrmsm.SDS\GetProcess_Script.ps1 파일에 디

    지털 서명하지 않았습니다. 스크립트가 시스템에서 실행되지 않습니다. 자세한 내용은 "get-help about_signing"을 참조하십시오..

    위치 줄:1 문자:24

    + .\GetProcess_Script.ps1 <<<<

        + CategoryInfo          : NotSpecified: (:) [], PSSecurityException

        + FullyQualifiedErrorId : RuntimeException

     

    PS C:\Users\mrmsm.SDS> $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]

    PS C:\Users\mrmsm.SDS> Set-AuthenticodeSignature .\GetProcess_Script.ps1 $cert

     

        디렉터리: C:\Users\mrmsm.SDS

     

    SignerCertificate                                             Status                                 Path

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

    79DBB89D221B3B7A4266E39D8F79F049CE03A644  Valid                                  GetProcess_Script.ps1

     

    PS C:\Users\mrmsm.SDS> .\GetProcess_Script.ps1

     

    Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName

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

        420      10     6140       8696    88     9.80   3532 atbsvc

        535       5     1304       1868    49            1356 atieclxx

         97       4      820       1240    27             940 atiesrxx

        118       5    15352      14208    40            5108 audiodg

         74       4     1672       1388    55            4032 CKAgent

         75       7    11044        532    84     0.08   5864 ClientSM

         95       5     4956       9364    64     1.97   6272 conhost

     

                            --- 생략 ---



    위의 내용을 보면 ExecutionPolicy Allsigned 설정함으로써 Sign 스크립트만 실행하도록 설정하였고, Sign되지 않은 스크립트는 로드 되지 않고 에러메세지가 출력됨을 확인 있습니다. 스크립트에 Set-AuthenticodeSignature 명령을 이용하여 Sign 진행 하였고, 실행 결과가 정상적으로 출력됨을 확인 있습니다.

     

    Set-AuthenticodeSignature 명령에 대한 자세한 사용 방법은 [Get-Help Set-AuthenticodeSignature] 명령을 입력하여 확인이 가능 합니다.



    !! 알고 가세요

     PowerShell ISE에서 작성한 스크립트를 Signature 경우 아래 내용과 같이 정상적인 Signing 되지 않는 현상이 발생 있습니다. 이는 PowerShell ISE 버그로 ISE에서 생성된 스크립트는 Signing 되지 않음을 아래 URL에서 확인하실 있습니다.

    # notepad에서 작성한 Script

    PS C:\Users\mrmsm.SDS> Set-AuthenticodeSignature .\GetProcess_Script.ps1 $cert

     

        디렉터리: C:\Users\mrmsm.SDS

     

    SignerCertificate                                         Status                                 Path

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

    79DBB89D221B3B7A4266E39D8F79F049CE03A644  Valid                                  GetProcess_Script.ps1

     

    # PowerShell ISE에서 작성한 Scirpt

    PS C:\Users\mrmsm.SDS> Set-AuthenticodeSignature .\ISE_Script.ps1 $cert

     

        디렉터리: C:\Users\mrmsm.SDS

     

    SignerCertificate                      Status                                     Path

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

                                              UnknownError                           ISE_Script.ps1

    - ISE 버그 관련 참고 URL : http://connect.microsoft.com/PowerShell/feedback/details/483431/set-authenticodesignature-fails-on-scripts-created-from-iSe


    !! 알고 가세요
     Set-ExecutionPolicy 사용하는데에 있어 실행 정책들이 어떤 내용을 가지고 있는지 모르고 설정 하면 안되겠죠?
    다음 내용은 ExecutionPolicy 대한 변수들의 설명입니다.

    • Restricted : 구성 파일을 로드하거나 스크립트를 실행하지 않습니다. 기본값 입니다.
    • AllSigned : 로컬 컴퓨터에 ㅈ가성하는 스크립트를 포함하여 모든 스크립트 구성파일에 신뢰된 게시자가 서명해야 합니다.
    • RemoteSigned : 인터넷에서 다운로드한 모든 스크립트 구성파일에 대해 신뢰된 게시자가 서명해야 합니다. (, 로컬에서 작성한 스크립트는 문제가 없습니다.)
    • Unrestricted : 모든 구성파일을 로드하고 모든 스크립트를 실행합니다. 인터넷에서 다운로드한 서명되지 않은 스크립트를 실행할 경우 실행하기 전에 사용권한을 묻는 메시지가 표시됩니다.
    • ByPass : 아무것도 차단하지 않으며, 경고나 메시지도 표시되지 않습니다.
    • Underfinded : 현재 할당된 실행 정책을 현재 범위에서 제거 합니다. 매개변수는 그룹정책 범위에 설정된 실행 정책을 제거하지 않습니다.

    우리가 흔히 Local 상에서 작성한 스크립트가 실행되지 않을 [Set-ExecutionPolicy RemoteSigned] 실행하라고 합니다. 명령을 실행하면 인터넷에서 다운로드한 모든 스크립트에 대해서만 Signature 필요하기 때문에 Local에서 작성한 스크립트는 아무런 제약 없이 실행 수가 있는 것입니다.

    <참고 URL>
    http://technet.microsoft.com/ko-kr/library/dd347649.aspx
    http://www.hanselman.com/blog/SigningPowerShellScripts.aspx
    http://technet.microsoft.com/ko-kr/library/dd347628.aspx

    저작자 표시 비영리
    신고

    댓글 0개가 달렸습니다.

    잘 동작하던 메일 스팸서버의 DB가 갑자기 데이터가 쌓이지 않기 시작 했다..
    원인은 알 수 없었고.. 이리 저리 뒤져보았더니 MySQL의 경우 Linux 시스템에 따라 MyISAM 엔진이 저장할 수 있는 최대 데테이블 데이터 사이즈가 지정되어 있다고 한다.

    Operating System File-size Limit
    Win32 w/ FAT/FAT32 2GB/4GB
    Win32 w/ NTFS 2TB (possibly larger)
    Linux 2.2-Intel 32-bit 2GB (LFS: 4GB)
    Linux 2.4+ (using ext3 file system) 4TB
    Solaris 9/10 16TB
    MacOS X w/ HFS+ 2TB
    NetWare w/NSS file system 8TB

    - 관련 문서 : http://dev.mysql.com/doc/refman/5.0/en/full-table.html

    우선 서버에서 해당 테이블의 상태를 확인하기 위해 아래와 같이 명령어를 실행..
    mysql> show table status like 'mail_content' \G
    *************************** 1. row ***************************
               Name: mail_content
             Engine: MyISAM
            Version: 9
         Row_format: Dynamic
               Rows: 548249
     Avg_row_length: 7833
        Data_length: 4294967280
    Max_data_length: 4294967295
       Index_length: 40935424
          Data_free: 0
     Auto_increment: NULL
        Create_time: 2008-04-24 11:31:01
        Update_time: 2010-07-27 11:53:13
         Check_time: 2010-05-12 09:50:03
          Collation: utf8_general_ci
           Checksum: NULL
     Create_options:
            Comment:
    1 row in set (0.00 sec)

    상태를 보니 이미 MAX_data_Length값인 4G까지 모두 사용중이네요..
    20G 까지 테이블 사이즈를 늘리기 위해 다음 명령어를 실행...하였습니다.

     alter table mail_content MAX_ROWS=1000000 AVG_ROW_LENGTH=21474;

    위의 내용을 보면 최대 행(Row)는 1,000,000개 까지 저장 가능하도록 하였고, 각 행의 평균 길이는 21474 Byte로 지정 하였습니다.
    이 명령어는 다음 내용을 참조하여 생성 하였습니다.

    MySQL의 MyISAM 스토리지 엔진의 데이터 테이블의 전체 크기는 [SHOW variables]명령을 통해 확인 할 수 있는 myisam_data_pointer_size 라는 값에 의하여 결정 된다고 합니다.

    이 myisam_data_pointer_size는 최소 2부터 최대 7까지 값을 가지고 있으며, 이 값을 참조하여 다음 공식에 의해 테이블 사이즈의 최대 크기를 지정 할 수 있습니다.

    [ 2 ^ ( myisam_data_pointer_size * 8 ) - 1 byte ]

    위의 공식을 따라 기본값인 4를 대입하면 4Gbyte까지 생성 할 수 있음을 알 수 있습니다.
    문제는 이 값을 임의로 수정하는 것이 아닌 Alter Table 또는 Create Table 명령을 사용할 때 MAX_ROWS 와 AVG_ROW_LENGTH 값을 변경 하면 myisam_data_pointer_size 값이 자동으로 변경 된다는 것 입니다.

    그럼 제가 원하는 20G 사이즈의 테이블을 생성하기 위해서는 어떻게 해야 할까요?
    다음의 3가지 방식의 명령 모두 20G 사이즈의 테이블로 수정하는 명령입니다.

    명령 1 : ALTER TABLE mail_content MAX_ROWS=1 AVG_ROW_LENGTH=21474836480
    명령 2 : ALTER TABLE mail_content MAX_ROWS=20971520 AVG_ROW_LENGTH=1024
    명령 3 : ALTER TABLE mail_content MAX_ROWS=1000000 AVG_ROW_LENGTH=21474

    위의 3가지 방식의 명령 모두 20G 사이즈의 테이블을 생성하는 명령어 입니다.
    자신이 원하는 방식을 이용하면 되겠지만, 테이블의 내용에 따라서 이 명령어를 다르게 적용하여 주는 것이 더 좋습니다.

    예를 들어 테이블의 데이터 타입이 BLOB 또는 TEXT 일 경우에는 MAX_ROWS를 일정 수치이하로 줄이고 AVG_ROW_LENGTH 값을 늘려주는 것이 좋습니다.
    다른 예로 테이블의 데이터 타입이 Integer 또는 Boolean과 같은 데이터 사이즈가 작은 경우라면 MAX_ROWS값을 늘리고 AVG_ROW_LENGTH값을 줄이는 것이 더 효과적입니다.


    결론을 내리자면, 테이블의 사이즈를 변경하는 것은 ALTER TABLE 또는 CREATE TABLE 명령을 이용하여 MAX_ROWS값과 AVG_ROW_LENGTH값을 주게되면 myisam_data_pointer_size 값이 변경되면서 자연적으로 적용되게 됩니다.

    만약 ALTER TABLE을 사용하는 경우라면 테이블 사이즈에 따라 또는 테이블 내 행의 개수에 따라 작업 시간을 조율 하시기 바랍니다.

    저같은 경우 4G의 데이터 파일을 ALTER TABLE로 수정하는데 약 12분 가량 소요되었고, 그 시간동안에는 해당 테이블에 Lock이 걸리게 되므로, 약간의 장애 유사한 현상이 발생했었습니다. ^^*

    참고 하세요~ =ㅁ=

    신고

    댓글 0개가 달렸습니다.

    OMSA란?
    Dell 에서 제공하는 서버 관리용 오픈 매니저 프로그램 입니다. Dell 서버의 경우 OMSA 를 설치하여 현재 하드웨어 자원의 상태를 모니터링 할 수 있으며, SNMP와 연계하여 상세 정보들을 가져올 수가 있습니다. 특히, Perc 카드를 이용하여 Raid구성을 하였다면, 구성한 Raid에 문제는 없는지를 한눈에 쉽게 알아 볼 수 있기 때문에 서버 관리자에게는 특히나 유용 합니다.

    기존의 OMSA는 소스 다운로드 후 컴파일 및 기타 여러 프로그램을 추가적으로 설치해야 하며, Centos의 경우 RHEL에 해당하는 Release 네임이 아닐경우 정상적인 설치가 되지 않는 경우가 발생하여, 설치가 굉장히 까다롭고 힘들었었습니다.

    하지만, 여기서 소개할 방법은 Yum을 이용해 Dell의 repository 내용을 다운로드 받아 설치하는 방식으로 위의 참조 URL을 통해 내용을 확인 할 수 있습니다.

    - Quick Install -

    1. Root 계정 로그인
    2. 명령어 실행 : $wget -q -O - http://linux.dell.com/repo/hardware/latest/bootstrap.cgi | bash
    3. 명령어 실행 : $yum install srvadmin-all
    4. 접속 계정 설정 : vi /etc/osarolemap
    5. Root 로그인 할 경우 접속 계정에 대한 수정 없이 다음 명령어 실행
    $/opt/dell/srvadmin/omil/supportscripts/srvadmin-services.sh start
    6. IPTABLE 사용시 IPTABLE에 1311 포트 오픈
    7. https://IP_ADDRESS:1311/ 접속

    - Truble Shooting -

    Q : yum install svradmin-all을 했는데 아무런 패키지도 다운받지 않고, 실행도 되지 않습니다.
    A : Yum의 Cache로 인해 막혀 있어서 그렇습니다. 다음 명령어를 실행하면 정상적으로 처리가 가능 합니다.
        $yum clean all
        $vi /etc/yum.conf
        파일의 내용중 plugins=1이 있는지 확인, 없으면, 추가
        $yum install svradmin-all

    Q : Centos 3.x버전이라 yum 버전이 낮습니다. 어떻게 해야 하나요?
    A : Yum 버전을 2.4.x버전이상 사용하시면 가능 합니다. yum 데몬을 업데이트 하시거나, Rpm으로 받으셔서 재설치 하세요.

    Q : Centos가 아닌 SLES, RHEL3 또는 4입니다 어떻게 해야 하나요?
    A : 참조 URL을 보시면, 각 OS별 설치법이 나와 있습니다. 참고하여 설치하시면 됩니다.

    참조 URL : http://linux.dell.com/wiki/index.php/Repository/hardware

    신고

    댓글 0개가 달렸습니다.

    고객 서버에 mod_jk를 설치...

    내 서버와 테스트 서버에서는 아무런 문제 없이 설치가 되길래..
    그냥 스크립트 만들어서 당직자한테 실행하라고 했는데..

    새벽2시.. 에러난다는 전화..
    컴파일을 아무리 해도 문제 발생... 확인해 보니 mod_jk.so 파일 생성이 안됨..
    make시 에러는

    Warning! dlname not found in /usr/local/apache/modules/mod_jk.la

    라고 출력..
    make install해도.. mod_jk.so파일이 없으므로, 당연 인스톨 안됨..

    이럴때는 2가지 방법으로 해결.
    1. tomcat.apache.org에 들어가서 jk_connector를 바이너리버전으로 다운로드
     > 이미 so파일로 되어 있으므로, 각 플랫폼에 맞는놈으로 다운받은뒤, mod_jk.so로 파일명 변경 후 apache의 module 폴더에 그대로 옮겨줌..

    2. 난 죽어도 컴파일 해서 해야 겠다.
     > libtool의 버전 확인 필요.
     $ /usr/local/apache/build/libtool --version  ( Apache 경로는 각자 경로대로 )
     위와 같이 명령어 실행해서 출력되는 버전이 1.5.22 이면 정상 컴파일 가능하지만, 만약 1.5.20 이면..
     컴파일 안되고, 위와 같은 에러 출력함...
     $ rpm -qa | grep libtool 실행
     설치된 패키지가 1.5.22면 /usr/bin/libtool 의 버전이 1.5.22 이므로, /usr/local/apache/build/libtool을 지우고 심볼릭 링크 연결.
     $ rm -f /usr/local/apache/build/libtool
     $ ln -s /usr/bin/libtool /usr/local/apache/build/libtool
     이후 다시 make 실행하면 정상적으로 컴파일 가능.

    설치는 다 되었는데.. 문제는 mod_jk.so를 연동했음에도 불구하고 소스가 출력되는 문제 발생...
    아놔.. 사람 갖고 장난치나.. ;; -_-..;
    결국은 내 실수로 삽질을 한 꼴이 되어버린...

    문제 해결을 위해 다음과 같이 접근.

    phpinfo();로 apache Handler 및 Module Load 상태 확인.
    mod_jk.so가 보인다면, 모듈은 로드 된 것이므로, 설정 내용 확인.
    설정 내용중 worker를 woker라고 오타 내진 않았는지.. 사소한 오타로 인해 안될 수 있으므로, 재 확인 필요.
    properties 파일과 mod_jk.conf 파일을 따로 만들어서 Include 함..

    == mod_jk.conf ==
    LoadModule jk_module          modules/mod_jk.so
    JkWorkersFile conf/workers.properties
    JkLogFile logs/mod_jk.log
    JkLogLevel info
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
    JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
    JkRequestLogFormat "%w %V %T"
    JkMount /jsp-examples/*.jsp default
    JkMount /servlets-examples/* default
    JkMount /*.jsp default

    Alias /jsp-examples "/usr/local/tomcat/webapps/examples/jsp"
    <Directory "/usr/local/tomcat/webapps/examples/jsp">
            Options Indexes +FollowSymLinks
            AllowOverride None
            Allow From all
    </Directory>

    Alias /servlets-examples "/usr/local/tomcat/webapps/examples/servlets"
    <Directory "/usr/local/tomcat/webapps/examples/servlets">
            Options Indexes +FollowSymLinks
            AllowOverride None
            Allow from all
    </Directory>

    == worker.properties ==
    workers.tomcat_home=/usr/local/tomcat
    workers.java_home=/usr/local/java

    worker.list=ajp13
    worker.ajp13.port=8009
    worker.ajp13.host=localhost
    worker.ajp13.type=ajp13

    파일 생성이 완료되면, httpd.conf를 열어 include함..
    > Include conf/mod_jk.conf

    VirtualHost 설정을 한 경우에는 해당 VirtualHost 안에 JkMount 설정.
    Ex)
    <VirtualHost *:80>
    DocumentRoot /usr/local/tomcat/webapps/ROOT/
    ServerName test.lovetonight.net
    JkMount /*.jsp ajp13
    JkMount /webapps/*.jsp ajp13
    JkMount /ROOT/* ajp13
    </VirtualHost>

    위와 같이 했는데도 안된다면....
    역시 방법은 구글링뿐..

    5시간 삽질 종료.. 아흐..

    신고

    'Linux > Apache' 카테고리의 다른 글

    mod_jk 컴파일 에러 처리... -_-  (0) 2009.04.11
    apache - Suexec 와 Cgi 파일간의 관  (0) 2006.11.13
    [Kisa] Mod_Security Manual  (0) 2006.10.09

    댓글 0개가 달렸습니다.

    mount시 nfs 화일 시스템 타입에 대한 옵션

    텍스트 옵션을 쓰지 않고 nfs 화일 시스템은 struct nfs_mount_data 자료형의 바이너리 옵션을 필요로 한다. mount 프로그램은 `tag=value'라는 형식으로 처리하고 위에서 말한 구조체에 값을 설정한다. rsize=n, wsize=n, timeo=n, retrans=n, acregmin=n, acregmax=n, acdirmin=n, acdirmax=n, actimeo=n, retry=n, port=n, mountport=n, mounthost=name, mountprog=n, mountvers=n, nfsprog=n, nfsvers=n, namlen=n. The option addr=n 을 쓸 수는 있으나 무시된다. 다음의 논리적 참거짓(Boolean) 옵션 앞에는 no 를 붙일 수 있다: bg, fg, soft, hard, intr, posix, cto, ac, tcp, udp. 세부 사항은 nfs(5) 을 보기 바란다.

    특별히 유용한 옵션으로는 다음이 있다.

    rsize=8192,wsize=8192
    기본 버터 사이트 1024 보다는 더 빠른 접속 속도를 위해 필요하다.
    soft
    이 옵션을 주면 일정 시간 동안 반응하지 않는 nfs 서버에 대해서는 타임아웃이 걸리도록 하며 그렇지 않은 경우 계속 마운트하고 있는다. 시간 설정은 timeo=time 을 사용한다. 이 옵션은 때때로 여러분의 nfs 서버
    가 반응하지 않거나 서버로부터 화일을 받는 도중 리부팅할 때 사용된다



    출처 : KLDP Man 한글화 페이지 (http://man.kldp.org/wiki/ManPage/mount.8)
    신고

    댓글 0개가 달렸습니다.