X-Window를 실행하면 기본 한글 입력이 불가합니다.

Linux 특성상 여러 종류에 한글 입력기(IME 종류 : nabi, fcitx, uim, nimf, ibus)가 존재합니다.

우리는 CentOS(RedHat)에서 기본으로 제공하는 ibus를 설치하여 운용하는걸로 하겠습니다.

 

 

** IBUS 패키지 설치(설치는 root 계정으로)

# yum install ibus* ibus-*

 

** 한글 입력 필요한 계정에 ibus 설정하기(필요한 계정마다 설정 필요)

$ ibus-setup




 

    ① 영어 - 영어(미국) ② 제거(R) 하고 ③ 추가(A) 버튼을 클릭하여 한글을 추가한다. 

   


 

   위에서 추가(A)를 클릭하면 나라별 문자 입력기를 추가할 수 있다. ①을 클릭하면 새로운 창에서 ② 한국어를 선택하고 ③ 추가(A)를 클릭하여 저장한다.

   


 

    한국어 - Hangul이 추가되었는지 확인하고 선택한다. 선택한뒤 기본 설정(P) 버튼을 클릭하여 환경설정으로 진입한다.

   


 

   한글 설정부분 창에서 화면에 내용만 남기고 모두 제거한뒤 확인 버튼을 클릭하여 저장한다.(확인 및 닫기를 모든 화면을 닫는다.)

   



 

 

** ibus 기본 환경 설정(root 권한)

# vi /etc/bashrc

    export GTK_TM_MODULE=ibus
    export QT_TM_MODULE=ibus
    export XMODIFIERS=@im=ibus
    
    if test `ps axo user:20,pid,tty,cmd | grep -v grep | grep "/usr/libexec/ibus-dconf" 2> /dev/null | grep $USER | grep "pts/" | wc -l` -eq 0;
    then
        ibus-daemon --xim &
    fi

 

** ibus 입력기 테스트
  - 해당 서버에 접속했던 모든 콘솔은 Client 툴은 접속을 종료하고 다시 접속한다.(또는 $ source /etc/bashrc)
  - MobaXterm 툴을 사용하여 또는 X-Window를 실행할 수 있는 환경(Xming, VcXsrv, XManager)으로 접속을 한다.
  - 일반계정(nextguide)으로  firefox 실행

$ firefox

파이어폭스가 X-Window환경 내에서 본인 PC에 실행되면 URL 입력란에 Shift + Space 키로 한글/영문 변환해서 입력이 가능한지 확인해 본다.









** 그냥 편하게 스크립트로 모든 계정의 적용하기

yum install ibus* ibus-*
# vi /etc/bashrc  (아래에 추가)

export GTK_TM_MODULE=ibus

export QT_TM_MODULE=ibus

export XMODIFIERS=@im=ibus

if test `ps axo user:20,pid,tty,cmd | grep -v grep | grep "/usr/libexec/ibus-dconf" 2> /dev/null | grep $USER | grep "pts/" | wc -l` -eq 0; 

then

    ibus-daemon --xim &

fi



# mkdir -p /etc/dconf/profile
#
cat <<EOF > /etc/dconf/profile/user

user-db:user

system-db:local

EOF


# mkdir -p /etc/dconf/db/local.d
# cat <<EOF > /etc/dconf/db/local.d/00-ibus-input

[desktop/ibus/general]

preload-engines=['hangul']

EOF

# dconf update




   

블로그 이미지

유효하지않음

,


** 큐브리드 다운로드
http://www.cubrid.com/downloads

** 큐브리드 JDBC 다운로드
https://www.cubrid.org/downloads/os-select/64-bit/drivers/jdbc

    driverClassName="cubrid.jdbc.driver.CUBRIDDriver"
    URL="jdbc:CUBRID:192.168.0.xxx:33000:
dbname:public::?charSet=utf-8"


** 매뉴얼
    한글 : https://www.cubrid.org/manual/ko/9.3.0/
    최신버전(영문) : https://www.cubrid.org/manual/en/10.0

 

 

** 큐브리드 설치
# yum install glibc ncurses libgcrypt libstdc++
# useradd -g dba -G dba cubrid
# su - cubrid
$ sh CUBRID-10.1-latest-Linux.x86_64.sh

    라이선스 및 모든 내용에 대해 Y 입력



** 서비스 실행환경 구성
$ vi .bashrc
    . .cubrid.sh

$ . .bashrc


** 서비스 실행
$ cubrid service start

    @ cubrid master start
    ++ cubrid master start: success
    @ cubrid broker start
    ++ cubrid broker start: success
    @ cubrid manager server start
    ++ cubrid manager server start: success

 


** 서비스 종료
$ cubrid service stop

    @ cubrid broker stop
    ++ cubrid broker stop: success
    @ cubrid manager server stop
    ++ cubrid manager server stop: success
    @ cubrid master stop
    ++ cubrid master stop: success



** 서비스 상태 확인
$ cubrid service status

    @ cubrid master status
    ++ cubrid master is running.
    @ cubrid server status
    @ cubrid broker status
    NAME PID PORT AS JQ TPS QPS SELECT INSERT UPDATE DELETE OTHERS LONG-T LONG-Q ERR-Q UNIQUE-ERR-Q #CONNECT #REJECT
    ==============================================================================================================================================================
    * query_editor 15397 30000 5 0 0 0 0 0 0 0 0 0/60.0 0/60.0 0 0 0 0
    * broker1 15408 33000 5 0 0 0 0 0 0 0 0 0/60.0 0/60.0 0 0 0 0
    @ cubrid manager server status
    ++ cubrid manager server is running.

 

** 데이터베이스 생성
$ cubrid createdb --db-volume-size=250M 
dbname ko_KR.utf8

    Creating database with 256.0M size using locale ko_KR.utf8. The total amount of disk space needed is 1.2G.

    CUBRID 10.1

 

** 생성한 데이터베이스 서비스 시작
$ cubrid server start dbname

    @ cubrid server start: dbname

    This may take a long time depending on the amount of recovery works to do.

    CUBRID 10.1

    ++ cubrid server start: success

 


** 생성한 데이터베이스 서비스 종료
$ cubrid server stop dbname

    @ cubrid server stop: dbname

    Server dbname notified of shutdown.
    This may take several minutes. Please wait.
    ++ cubrid server stop: success

 

** 생성한 데이터베이스 서비스 자동시작 처리
$ vi $CUBRID/conf/cubrid.conf

    [service]
    service=server,broker,manager
    server=dbname

 

** 커맨드라인 접속
$ csql 
dbname

    CUBRID SQL Interpreter

    Type `;help' for help messages.

csql> ;exit

 


** 계정 생성(DBA 권한으로 접속)
$ csql --CS-mode
dbname --user=dba
csql> CREATE USER username PASSWORD 'userpasswd';
csql> ;exit

 

** 생성한 User로 접속 확인 및 테이블 생성
$ csql -u
username -p userpasswd dbname
csql> CREATE TABLE test(t1 VARCHAR(10));

    Execute OK. (0.013104 sec) Committed.

    1 command(s) successfully processed.

 

** SQL 스크리트 파일 적용
csql> ;read cubrid_script.sql
csql> ;run

 

** 테이블 목록 확인
csql> show tables;


** 컬럼 목록 확인
csql> SELECT class_name as "table_name", attr_name as "column_name", prec "column_size", data_type, is_nullable as "nullable", default_value FROM DB_ATTRIBUTE WHERE class_name = 'table_name';

블로그 이미지

유효하지않음

,



※ClamAV 특장점

  • ClamAV(Clam AntiVirus)는 네트워크 장비로 유명한 시스코 시스템즈에서 지원하는 오픈소스 소프트웨어로 자유 크로스플랫폼
    형식의 바이러스 검사 소프트웨어 
툴킷이다.

  • 바이러스를 비롯한 수많은 종류의 악성 소프트웨어를 찾아낼 수 있다.

  • 주된 목적 가운데 하나는 서버 측면의 전자 메일 바이러스 검사기의 역할을 하면서 메일 서버에 이용

  • 닉스 아니라AIX, BSD, HP-UX, 리눅스, OS X, 오픈VMS, OSF, 솔라리스 같은 서드파티 버전용으로 개발됨

  • 0.96 버전부터 ClamAV는 마이크로소프트 윈도에서 빌드한 다음 실행할 수 있음

  • ClamAV와 소프트웨어 업데이트는 비용을 내지 않고도 이용할 수 있다.

  • 클램AV(ClamAV.net)의 데이터 센터는 전 세계에서 발생하는 바이러스 구조에 대한  방대한 자료를 확보

  • 확보한 방대한 자료를 주기적으로 업데이트 및 공개

  • 데이터베이스는 클램AV 엔진의 핵심으로 유닉스계열에 사용됨

  • 공개자료로서는 사실상 표준처럼 사용됨

  • 메일 게이트웨이 검색 소프트웨어의 오픈 소스 표준

  • 멀티 스레드 스캐너 데몬주문형 파일 검사 및 자동 서명 업데이트를 위한 명령 줄 유틸리티가 포함

  • 여러 파일 형식파일 및 아카이브 압축 풀기 및 여러 서명 언어를 지원

  • 트로이 목마바이러스악성 프로그램 및 기타 악의적 인 위협을 탐지하는 오픈소스  바이러스 백신 엔진

  • 바이러스 서명을 정기적으로 업데이트하는 유틸리티를 제공

 

 

※ ClamAV 설치

** ClamAV 설치를 위한 SELinux 비활성화 처리
# vi /etc/selinux/config
  SELINUX=disabled


** ClamAV 설치를 위한 yum 레파지토리 설치
# yum -y install epel-release


** ClamAV 패키지 설치
# yum install clamav-server clamav-data clamav-update clamav-filesystem clamav clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd


** ClamAV 환경파일 복사 및 수정처리
# cp /usr/share/clamav/template/clamd.conf /etc/clamd.d/clamd.conf
# sed -i -e "s/^Example/#Example/" /etc/clamd.d/clamd.conf
# sed -i -e "s/^Example/#Example/" /etc/clamd.d/scan.conf
# sed -i -e "s/^Example/#Example/" /etc/freshclam.conf

# vi /etc/clamd.d/scan.conf (# 주석제거)
  LocalSocket /var/run/clamd.scan/clamd.sock


** ClamAV 데이터베이스 업데이트
# freshclam


** ClamAV 데이터베이스 데몬작업(자동 업데이트)
# vi /usr/lib/systemd/system/clam-freshclam.service
  [Unit]
  Description = freshclam scanner
  After = network.target

  [Service]
  Type = forking
  ExecStart = /usr/bin/freshclam -d -c 4
  Restart = on-failure
  PrivateTmp = true
  RestartSec = 20sec

  [Install]
  WantedBy=multi-user.target

 

** ClamAV 서비스 활성화
# systemctl enable clam-freshclam
# systemctl enable clamd@scan

** ClamAV 서비스 실행
# systemctl start clam-freshclam
# systemctl start clamd@scan

** ClamAV 서비스 확인
# systemctl status clam-freshclam
# systemctl status clamd@scan

** ClamAV 바이러스 스캔 확인
# clamscan -r /home/nextguide

  ----------- SCAN SUMMARY -----------
  Known viruses: 6349098
  Engine version: 0.101.4
  Scanned directories: 100
  Scanned files: 66
  Infected files: 0
  Data scanned: 85.75 MB
  Data read: 92.75 MB (ratio 0.92:1)
  Time: 72.517 sec (1 m 12 s)


** ClamAV 검사 스크립트 생성 및 주기적 처리(1회/일)
# vi /usr/local/bin/clamscan.sh

  #!/bin/sh

  SDATE=$(date "+%Y-%m-%d %H:%M:%S")
  echo $'\n\nStart Date :' $SDATE >> /var/log/clamscan.log
  clamscan -ri / >> /var/log/clamscan.log

# chmod 755 /usr/local/bin/clamscan.sh

# crontab -e
  00 04 * * * /usr/local/bin/clamscan.sh

블로그 이미지

유효하지않음

,

** 상위 디렉토리 접근 및 shell 접속 불가등

   

** 디렉토리는 운영서버 환경에 맞도록 수정한다.

# mkdir /data
# groupadd sftp
# useradd -g sftp -G sftp -d /data/nextbsc -s /bin/false nextbsc
# echo "nextbsc" | passwd --stdin nextbsc
# chown -R nextbsc.sftp /data/nextbsc
# chown root /data/nextbsc
# chmod 755 /data/nextbsc
# mkdir /data/nextbsc/upload
# chown nextbsc.sftp /data/nextbsc/upload

# vi /etc/ssh/sshd_config(# 주석처리)
  #Subsystem sftp /usr/libexec/openssh/sftp-server 
  Subsystem sftp internal-sftp -l VERBOSE
 
  # Example of overriding settings on a per-user basis
  Match Group sftp
      ChrootDirectory /data/%u
      X11Forwarding no
      AllowTcpForwarding no
      #PermitTTY no
      #ForceCommand cvs server
      ForceCommand internal-sftp -l VERBOSE


# systemctl restart sshd
 

** 테스트 방법
  1. SSH 접속 확인
  2. SFTP 접속 확인(change directory 여부 점검등)

블로그 이미지

유효하지않음

,

** 리눅스 본딩(Bonding)이란

   여러개의 NIC(랜카드)를 논리적으로 묶어서 한 개의 NIC의 개수만큼 대역폭을 확장하는 기술

   Fault Tolerance(결함 감내)와 같은 기능을 하며 2개의 NIC를 한 개의 NIC로 묶어서 Active와 Stand By로 

   구성하기도 한다.

 

 

 

** O/S 별 설명

    - HP-UX    : APA

    - SUN      : SunTrunking(IPMP)

    - IBM      : EtherChannel

    - Cisco    : EtherChannel

    - Windows  : Teaming

    - Linux    : Bonding(RedHat(CentOS) 7버전 이상은 Teaming이 별도로 추가됨)

    - 표준용어  : Link Aggregation

 

 

 

**Bonding mode 설명

 

0 : Balance-round robine 정책 : 2개의 NIC를 통한 분배

   첫 번째 가능한 슬레이브부터 마지막까지 순차적으로 전송하며

   이 모드는 부하분산과 장애 감내를 제공합니다.

 

1 : Active-standby 정책 : Active상태의 NIC에 문제 발생시 Fault Tolerance 

    bond에서 하나의 슬레이브만 활성화되며 다른 슬레이브는 활성화된 슬레이브가

    fail 된 경우에만 활성화 됩니다.

 

2 : Balance-XOR 정책 : 0과 비슷하지만 xor연산을 이용한 목적지 Mac과 근원지 Mac을 이용한 분배

    [(출발지 MAC 주소와 도착지 MAC 주소의 XOR) modula 슬레이브 1개]에 기초하여 전송합니다.

    이것은 도착지 MAC 주소에 대해서 동일한 슬레이브를 선택하게 된다. 이 모드는 부하분산과 장애감지를 제공합니다.

  

3 : Broadcast 정책 : 2개의 NIC에 어떤 규칙 없이 데이터 통신 모든 슬레이브 인터페이스에 모든 것을 전송합니다.

 

4 : 802.3ad (link aggregation) - switch에 aggregation 그룹생성이 필요함.

    IEEE 802.3ad dynamic link aggregation정책을 설정하며

    전송과 받는 것은 active aggregator 안에서 모든 slaves 위에서 됩니다.

 

5 : transmit load 밸런스로써 보내는 패킷만 밸런스 합니다.

    outgoing traffic은 각 slave 인터페이스에 현재의 부하에 따라서 분배됩니다.

    incoming traffic는 현재의 slave로 받음. 

 

6 : receive와 transmit패킷을 밸런스 하며 이때 5,6 은 하나의 스위치에 있을때만 동작합니다.

 

    이 mode는 load balancing를 더하여 balance-tlb를 포함 합니다.

 

 

 

 

 

/*--------------------------------------------------*/

/* 본딩 설정(운영서버 적용시 붉은색 수정필요)               */

/*--------------------------------------------------*/

 

 

# cd /etc/sysconfig/network-scripts/

# vi ifcfg-bond0

 

    DEVICE="bond0"

    TYPE="Bond"

    NAME="bond0"

    ONBOOT="yes"

    BOOTPROTO="none"

    IPADDR="192.168.0.190"

    NETMASK="255.255.255.0"

    GATEWAY="192.168.0.1"

    DNS1="8.8.8.8"

    DNS2="168.126.63.1"

    BONDING_MASTER="yes"

    BONDING_OPTS="mode=1 miimon=100 fail_over_mac=1 primary=eno1"

 

 

** 가상화(VirtualBox, vmware등) 서버에서 작업 및 테스트시는 fail_over_mac=1 primary=eno1 옵션이 추가되어야
본딩 운영이 가능하다.

 

 

 

* 내용 추가 및 수정(IPADDR, NETMASK, GATEWAY, DNS1, DNS2 삭제 또는 주석처리)

 

# vi ifcfg-eno1

 

    MASTER="bond0"

    SLAVE="yes"

    DEFROUTE="no"

 

 

 

# vi ifcfg-eno2

 

    MASTER="bond0"

    SLAVE="yes"

    DEFROUTE="no"

 

 

 

# systemctl restart NetworkManager

 

# systemctl restart network

 

# nmcli d (or nmcli c) 

 

  bond0 활성화 여부 확인

 

 

 

 

 

** 본딩 테스트

콘솔 화면을 3개를 접속하거나 연다.

콘솔 1번은 gateway에 ping을 날린다.


# ping 192.168.0.1

 

 

 

콘솔 2번은 bonding 상태를 확인한다.

# watch -d -n 1 "cat /proc/net/bonding/bond0"

 

 

 

 

 

콘솔 3번은 Active된 NIC를 임의로 다운시켜 콘솔 2번, 1번 화면을 확인한다.(또는 랜선을 제거해 본다)

 

 

# ifdown eno1

 

 

 

* 본딩 환경설정 파일

ifcfg-bond0
다운로드
ifcfg-enp0s3
다운로드
ifcfg-enp0s8
다운로드

 

 

 

 

/*--------------------------------------------------*/

/* Teaming 설정(운영서버 적용시 붉은색 수정필요)          */

/* Redhat/CentOS 7.x 이상 버전                        */

/*--------------------------------------------------*/

 

** 기존 NIC 접속 종료
# nmcli con mod enp0s3 connection.autoconnect no
# nmcli con mod enp0s8 connection.autoconnect no

** 티밍 추가 (nmcli 명령어 가각 한줄로 실행)
# nmcli con add con-name team0 type team ifname team0 config 

  '{

    "runner":{"name":"activebackup","hwaddr_policy":"by_active"},

    "link_wath":{"name":"ethtool","delay_up":2500,"delay_down":1000},

     "ports":{"enp0s3":{"prio":-10,"sticky":true},"enp0s8":{"prio":100}}

  }'

 

# nmcli con add con-name team0-port1 type team-slave ifname enp0s3 master team0
# nmcli con add con-name team0-port2 type team-slave ifname enp0s8 master team0
# nmcli con mod team0 ipv4.addresses 192.168.0.186/24
# nmcli con mod team0 ipv4.gateway 192.168.0.1
# nmcli con mod team0 ipv4.dns "8.8.8.8 168.126.63.1"
# nmcli con mod team0 ipv4.method manual
# nmcli con down team0 && nmcli con up team0

본딩 설정과 마찬가지로 티밍 구성시 강상화서버 추가 옵션 "hwaddr_policy":"by_active" 적용해야 정상 적으로 운영(테스트)이 가능하다.

 


** 티밍 상태 확인
teamdctl team0 state

** 티밍 포트 상태 확인
teamnl team0 ports

** 티밍 액티브 포트 상태 확인
teamnl team0 getoption activeport

** NIC 다운
nmcli dev dis enp0s3

** NIC 업
nmcli dev con enp0s3

 

 

* 티밍 환경설정 파일

ifcfg-team0
0.00MB
ifcfg-team0-port1
0.00MB
ifcfg-team0-port2
0.00MB

블로그 이미지

유효하지않음

,

라즈베리 파이에 카메라 모듈+문자인식 관련 설치 목적으로 한번 컴파일 해봄

아~ 정말... 내 일도 아닌데 간만에 삽질했네.. 시간되면 정리하고 우선 여기까지만....


Ubuntu-12.04.4-desktop-amd64로 작업함


** 관련 패키지 설치

$ sudo apt-get install build-essential

$ sudo apt-get install cmake

$ sudo apt-get install git

$ sudo apt-get install g++-arm-linux-gnueabi

$ sudo apt-get install gcc-arm-linux-gnueabi

$ sudo apt-get install g++-arm-linux-gnueabihf

$ sudo apt-get install gcc-arm-linux-gnueabihf

$ sudo apt-get install cmake-curses-gui

$ sudo apt-get install libpng12-dev

$ sudo apt-get install libjpeg62-dev 

$ sudo apt-get install libtiff4-dev

$ sudo apt-get install zlib1g-dev

$ sudo apt-get install autoconf automake libtool autotools-dev




** 혹씨모를 컴파일시 오류발생 방지를 위해 계정의 .bashrc 에 추가함
export LD_LIBRARY_PATH="/usr/local/lib:/usr/local/arm/opencv/lib:/usr/local/arm/leptonica/lib:/usr/local/arm/tesseract-ocr/lib:$LD_LIBRARY_PATH"



** 패키지 다운로드 디렉토리 생성(계정의 홈디렉토리에서 생성함)

$ pwd

/home/계정명


$ mkdir down

$ cd down




** opencv 소스 다운로드

wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip

$ unzip opencv-2.4.9.zip


** ARM gcc 컴파일 버전 확인(주버전.부버전만 확인한다 4.8)

$ arm-linux-gnueabihf-gcc --version

arm-linux-gnueabihf-gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

Copyright (C) 2011 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


arm-linux-gnueabihf-gcc (Ubuntu/Linaro 4.8.2-16ubuntu4) 4.8.2

Copyright (C) 2013 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.





** opencv 컴파일 버전 변경

$ pwd

/home/계정명/down


$ vi opencv-2.4.9/platforms/linux/arm-gnueabi.toolchain.cmake

5라인 정도에...

set(GCC_COMPILER_VERSION "4.6" CACHE STRING "GCC Compiler version")

--> set(GCC_COMPILER_VERSION "4.8" CACHE STRING "GCC Compiler version")




** opencv 빌드 디렉토리 생성

$ cd

$ cd down

$ mkdir build

$ cd build

$ pwd

/home/계정명/down/build




** opencv 컴파일 옵션 설정

$ rm -rf CMakeCache.txt

$ cmake \

    -DCMAKE_INSTALL_PREFIX=/usr/local/arm/opencv \

    -DWITH_FFMPEG=ON \

    -DWITH_JASPER=ON \

    -DWITH_JPEG=ON \

    -DWITH_PNG=ON \

    -DWITH_TIFF=ON \

    -DWITH_VFW=ON \

    -DWITH_WEBP=ON \

    -DWITH_TBB=ON \

    -DWITH_V4L=ON \

    -DWITH_OPENEXR=ON \

    -DWITH_OPENGL=ON \

    -DBUILD_JASPER=ON \

    -DBUILD_JPEG=ON \

    -DBUILD_PNG=ON \

    -DBUILD_OPENEXR=ON \

    -DBUILD_PACKAGE=ON \

    -DBUILD_TIFF=ON \

    -DBUILD_WITH_DEBUG_INFO=ON \

    -DBUILD_WITH_STATIC_CRT=ON \

    -DBUILD_ZLIB=ON \

    -DBUILD_EXAMPLES=ON \

    -DBUILD_NEW_PYTHON_SUPPORT=ON \

    -DINSTALL_PYTHON_EXAMPLES=ON \

    -DINSTALL_C_EXAMPLES=ON \

    -DSOFTFT=ON \

    -DUSE_NEON=ON \

    -DCMAKE_TOOLCHAIN_FILE=../opencv-2.4.9/platforms/linux/arm-gnueabi.toolchain.cmake \

    ../opencv-2.4.9



** opencv 컴파일 수행, 설치

$ make

$ sudo make install




** opencv cross 컴파일된 오브젝트 버전확인(32bit ARM, 확인해 보니 git로 받은 opencv는 3.0 인가보네...)

cd /usr/local/arm/opencv/lib

file libopencv_videostab.so.2.4.9 

libopencv_videostab.so.2.4.9: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=8be58a40b52473a2002b969a369fabf1b4aeba8d, not stripped



** 문자인식 관련 패키지  디렉토리 생성(계정의 홈디렉토리에서 생성함)

$ cd

$ cd down

$ mkdir ocr

$ cd ocr

$ pwd

/home/계정명/down/ocr




** 문자인식 관련 패키지 다운로드

$ wget http://www.leptonica.org/source/leptonica-1.70.tar.gz

$ wget https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.02.tar.gz

$ wget https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.kor.tar.gz




** 문자인식 관련 패키지 압축풀기

$ tar xvf tesseract-ocr-3.02.02.tar.gz

$ tar xvf tesseract-ocr-3.02.kor.tar.gz

$ tar xvf leptonica-1.70.tar.gz




** leptonica 패키지 이동

$ cd leptonica-1.70

$ pwd

/home/계정명/down/ocr/leptonica-1.70




** leptonica 컴파일 옵션 정의

CC="arm-linux-gnueabihf-gcc" CXX="arm-linux-gnueabihf-g++" \

./configure \

    --prefix=/usr/local/arm/leptonica \

    --target=arm-linux \

    --host=arm-linux




** leptonica 컴파일 수행, 설치

$ make

$ sudo make install




** leptonica cross 컴파일된 오브젝트 버전확인(32bit ARM)

cd /usr/local/arm/leptonica/lib

file liblept.so.4.0.1

liblept.so.4.0.1: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=358f8173e43fa39cabe5331a71b7ec3dc7c8a812, not stripped




** tesseract 패키지 이동

$ cd

$ cd down/ocr/tesseract-ocr/

$ pwd

/home/계정명/down/ocr/tesseract-ocr




** tesseract 컴파일 옵션 정의

$ ./autogen.sh


LIBLEPT_HEADERSDIR=/usr/local/arm/leptonica/include \

 CC="arm-linux-gnueabihf-gcc" CXX="arm-linux-gnueabihf-g++" \

./configure \

    --prefix=/usr/local/arm/tesseract-ocr \

    --target=arm-linux \

    --host=arm-linux \

    --with-extra-libraries=/usr/local/arm/leptonica/lib




** tesseract 컴파일 수행, 설치

$ make

$ sudo make install




** tesseract cross 컴파일된 오브젝트 버전확인(32bit ARM)

cd /usr/local/arm/tesseract-ocr/lib

file libtesseract.so.3.0.2 

libtesseract.so.3.0.2: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=18c1b84e4915b1ceeacf568cde32b7ad10be073e, not stripped




** openalpr 패키지 이동

$ cd 

$ cd down/ocr

$ pwd

/home/계정명/down/ocr




** openalpr git 소스 다운로드

$ git clone https://github.com/openalpr/openalpr.git --depth=1




** openalpr 컴파일 옵션 변경

$ pwd

/home/계정명/down/ocr


$ cd openalpr/src

$ vi CMakeLists.txt


*17라인 정도 opencv, tesseract-ocr path변경

SET(OpenCV_DIR "${CMAKE_SOURCE_DIR}/../libraries/opencv/")

SET(Tesseract_DIR "${CMAKE_SOURCE_DIR}/../libraries/tesseract-ocr")


-->  SET(OpenCV_DIR "/usr/local/arm/opencv/lib")

       SET(Tesseract_DIR "/usr/local/arm/tesseract-ocr")


* 20라인 컴파일중 에러가 난다면 include path추가
 include_directories(
         /usr/local/arm/opencv/include
         ${Tesseract_DIR}/include
         ${Tesseract_DIR}/api
         ${Tesseract_DIR}/ccutil/
         ${Tesseract_DIR}/ccstruct/
         ${Tesseract_DIR}/ccmain/
 )

 * 48라인 변경 l
ink_directories( ${Tesseract_DIR}/.api/libs/ )
--> link_directories( ${Tesseract_DIR}/lib/)



** openalpr 컴파일 옵션 정의

$ pwd

/home/계정명/down/ocr/openalpr/src


$ mkdir build

$ cd build

$ pwd

/home/계정명/down/ocr/openalpr/src/build


$ cmake \

    -DCMAKE_INSTALL_PREFIX=/usr/local/arm/openalpr \

    -DCMAKE_PREFIX_PATH=/usr/local/arm/opencv \

    -DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/arm-linux-gnueabihf-g++ \

    -DCMAKE_C_COMPILER:FILEPATH=/usr/bin/arm-linux-gnueabihf-gcc \

    ../



** openalpr 컴파일 수행, 설치

$ make

$ sudo make install



** openalpr 컴파일시 /usr/local/arm/tesseract-ocr/lib/libtesseract.so: undefined reference ... 에러메세지 출력시

$ cd /usr/arm-linux-gnueabihf/lib

$ sudo cp -r /usr/local/arm/tesseract-ocr/lib/* .

$ sudo cp -r /usr/local/arm/leptonica/lib/* .



** openalpr ract cross 컴파일된 오브젝트 버전확인(32bit ARM)

cd /usr/local/arm/openalpr/bin

file alpr

alpr: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0dd51f34e6b0e3902773df82aaa039cd3de50033, not stripped



** traineddata 파일 복사

cd ~/down/ocr/openalpr/runtime_data/ocr/tessdata

$ sudo cp *.traineddata /usr/local/ocr/tesseract-ocr/share/tessdata/

$ sudo cp *.traineddata /usr/local/share/tessdata/



블로그 이미지

유효하지않음

,

[출처] http://kldp.org/node/103288

Fedora 10 패키지 목록을 살펴보던 중 호기심을 자극하는 패키지가 하나 있었다. 뭔가하고 살펴보니 ext3 파일 시스템에서 지워진 파일의 복구를 해주는 놈이다.

ext2와 다른 특성으로 인해 ext3에서 지워진 파일의 복구는 꽤 어려운 명령어들을 알아야했고 복구율도 좋지 않았었다. 하지만 ext3grep은 이러한 생각을 바꾸게 만들기에 충분했다.

소스 다운로드는 http://code.google.com/p/ext3grep/ 에서 할 수 있고 Fedora나 Debian의 최신 버전에는 포함되어 있으니 해당 배포판의 패키지 관리자로 설치하면 된다.

설치를 하고 간단한 테스트를 해보았다. 시간상 1GB정도의 파티션을 만들고 테스트를 진행했다.

    # mkfs.ext3 /dev/sdb1
    # mount /dev/sdb1 /mnt/test/
    # df -h
    /dev/sdb1             966M   18M  899M   2% /mnt/test

몇개의 디렉토리와 파일을 만들었다.

    # ls *
    test1.txt  test2.txt  테스트.txt  테스트2.txt

    dir1:
    dir1.txt

    dir2:
    dir2.txt

    dir3:
    dir3.txt

    lost+found:

    디렉토리1:
    디렉토리1.txt

    디렉토리2:
    디렉토리2.txt

    디렉토리3:
    디렉토리3.txt


그 중에 몇개를 삭제했다.

# rm -rf dir2 dir3 test2.txt 디렉토리1 디렉토리3 테스트.txt


이제 unmount 하고 실제 ext3grep 을 사용할 차례다.

    # umount /mnt/test


–dump-names 로 경로를 포함한 파일들의 경로를 알 수 있다.

    # ext3grep –dump-names /dev/sdb1
    Running ext3grep version 0.10.1
    Number of groups: 8
    Minimum / maximum journal block: 562 / 4664
    Loading journal descriptors… sorting… done
    The oldest inode block that is still in the journal, appears to be from 1235694214 = Fri Feb 27 09:23:34 2009
    Number of descriptors in journal: 269; min / max sequence numbers: 2 / 40
    Finding all blocks that might be directories.
    D: block containing directory start, d: block containing more directory entries.
    Each plus represents a directory start that references the same inode as a directory start that we found previously.

    Searching group 0: DDD+DD+++++++++++++++++D+DD+++++++++
    Searching group 1: +
    Searching group 2: +
    Searching group 3: +
    Searching group 4: +
    Searching group 5: +
    Searching group 6: +
    Searching group 7:
    Writing analysis so far to ’sdb1.ext3grep.stage1′. Delete that file if you want to do this stage again.
    Result of stage one:
    8 inodes are referenced by one or more directory blocks, 4 of those inodes are still allocated.
    7 inodes are referenced by more than one directory block, 3 of those inodes are still allocated.
    0 blocks contain an extended directory.
    Result of stage two:
    4 of those inodes could be resolved because they are still allocated.
    4 inodes could be resolved because all refering blocks but one were journal blocks.
    All directory inodes are accounted for!

    Writing analysis so far to ’sdb1.ext3grep.stage2′. Delete that file if you want to do this stage again.
    dir1
    dir1/.dir1.txt.swp
    dir1/dir1.txt
    dir2
    dir2/.dir2.txt.swp
    dir2/dir2.txt
    dir3
    dir3/.dir3.txt.swp
    dir3/dir3.txt
    lost+found
    test1.txt
    test2.txt
    디렉토리1
    디렉토리1/.디렉토리1.txt.swp
    디렉토리1/디렉토리1.txt
    디렉토리2
    디렉토리2/.디렉토리2.txt.swp
    디렉토리2/디렉토리2.txt
    디렉토리3
    디렉토리3/.디렉토리3.txt.swp
    디렉토리3/디렉토리3.txt
    테스트.txt
    테스트2.txt


위 명령어를 실행한 후 ext3grep.stage1, ext3grep.stage2 파일이 생성되는데 inode와 block의 정보를 담고 있다. 한번 생성되면 다른 명령어를 실행할때 재사용되기 때문에 검색에 소요되는 시간이 줄어든다.

    # cat sdb1.ext3grep.stage1
    # Stage 1 data for /dev/sdb1.
    # Inodes and directory start blocks that use it for dir entry ‘.’.
    # INODE : BLOCK [BLOCK ...]
    2 : 556 573 597 605 610 682 688 698 703 713 719 732 859
    11 : 557
    15713 : 740 792 800 805 40960
    31425 : 582 659 666 671 79872
    47137 : 571 620 628 633 112640
    62849 : 578 645 651 145408
    78561 : 736 774 780 172032
    94273 : 730 749 757 762 204800
    # Extended directory blocks.
    # END

    # cat sdb1.ext3grep.stage2
    # Stage 2 data for /dev/sdb1.
    # Inodes path and directory blocks.
    # INODE PATH BLOCK [BLOCK ...]
    2 ” 556
    11 ‘lost+found’ 557
    15713 ‘디렉토리3′ 40960
    31425 ‘dir3′ 79872
    47137 ‘dir1′ 112640
    62849 ‘dir2′ 145408
    78561 ‘디렉토리2′ 172032
    94273 ‘디렉토리1′ 204800
    # END


–restore-all 은 해당 장치의 모든 파일을 명령어가 실행된 위치에 RESTORED_FILES라는 디렉토리를 생성하고 그 안에 복구해준다. 명령어를 실행하기 전에 충분한 공간이 있는지 확인하자.

    # ext3grep –restore-all /dev/sdb1
    Running ext3grep version 0.10.1
    Number of groups: 8
    Minimum / maximum journal block: 562 / 4664
    Loading journal descriptors… sorting… done
    The oldest inode block that is still in the journal, appears to be from 1235694214 = Fri Feb 27 09:23:34 2009
    Number of descriptors in journal: 269; min / max sequence numbers: 2 / 40
    Writing output to directory RESTORED_FILES/
    Finding all blocks that might be directories.
    D: block containing directory start, d: block containing more directory entries.
    Each plus represents a directory start that references the same inode as a directory start that we found previously.

    Searching group 0: DDD+DD+++++++++++++++++D+DD+++++++++
    Searching group 1: +
    Searching group 2: +
    Searching group 3: +
    Searching group 4: +
    Searching group 5: +
    Searching group 6: +
    Searching group 7:
    Writing analysis so far to ’sdb1.ext3grep.stage1′. Delete that file if you want to do this stage again.
    Result of stage one:
    8 inodes are referenced by one or more directory blocks, 4 of those inodes are still allocated.
    7 inodes are referenced by more than one directory block, 3 of those inodes are still allocated.
    0 blocks contain an extended directory.
    Result of stage two:
    4 of those inodes could be resolved because they are still allocated.
    4 inodes could be resolved because all refering blocks but one were journal blocks.
    All directory inodes are accounted for!

    Writing analysis so far to ’sdb1.ext3grep.stage2′. Delete that file if you want to do this stage again.
    Restoring dir1/.dir1.txt.swp
    Restoring dir1/dir1.txt
    Restoring dir2/.dir2.txt.swp
    Restoring dir2/dir2.txt
    Restoring dir3/.dir3.txt.swp
    Restoring dir3/dir3.txt
    Restoring test1.txt
    Restoring test2.txt
    Restoring 디렉토리1/.디렉토리1.txt.swp
    Restoring 디렉토리1/디렉토리1.txt
    Restoring 디렉토리2/.디렉토리2.txt.swp
    Restoring 디렉토리2/디렉토리2.txt
    Restoring 디렉토리3/.디렉토리3.txt.swp
    Restoring 디렉토리3/디렉토리3.txt
    Restoring 테스트.txt
    Restoring 테스트2.txt

    # cd RESTORED_FILES/

    # ls *
    test1.txt  test2.txt  테스트.txt  테스트2.txt

    dir1:
    dir1.txt

    dir2:
    dir2.txt

    dir3:
    dir3.txt

    lost+found:

    디렉토리1:
    디렉토리1.txt

    디렉토리2:
    디렉토리2.txt

    디렉토리3:
    디렉토리3.txt


–restore-all 명령어와 함께 사용할 수 있는 필터가 여러개 있는데 –after 옵션을 주면 그 시간 이후의 파일들만 복구해준다. unix time을 적어주면 된다.

    # ext3grep –restore-all –after=1235694514 /dev/sdb1
    Running ext3grep version 0.10.1
    Only show/process deleted entries if they are deleted on or after Fri Feb 27 09:28:34 2009.

    Number of groups: 8
    Minimum / maximum journal block: 562 / 4664
    Loading journal descriptors… sorting… done
    The oldest inode block that is still in the journal, appears to be from 1235694214 = Fri Feb 27 09:23:34 2009
    Number of descriptors in journal: 269; min / max sequence numbers: 2 / 40
    Loading sdb1.ext3grep.stage2… done
    Not undeleting “dir1/.dir1.txt.swp” because it was deleted before 1235694514 (32767)
    Restoring dir1/dir1.txt
    Not undeleting “dir2/.dir2.txt.swp” because it was deleted before 1235694514 (1235694303)
    Not undeleting “dir2/dir2.txt” because it was deleted before 1235694514 (1235694303)
    Not undeleting “dir3/.dir3.txt.swp” because it was deleted before 1235694514 (1235694303)
    Not undeleting “dir3/dir3.txt” because it was deleted before 1235694514 (1235694303)
    Restoring test1.txt
    Not undeleting “test2.txt” because it was deleted before 1235694514 (1235694287)
    Not undeleting “디렉토리1/.디렉토리1.txt.swp” because it was deleted before 1235694514 (1235694287)
    Not undeleting “디렉토리1/디렉토리1.txt” because it was deleted before 1235694514 (1235694287)
    Not undeleting “디렉토리2/.디렉토리2.txt.swp” because it was deleted before 1235694514 (1235694287)
    Restoring 디렉토리2/디렉토리2.txt
    Not undeleting “디렉토리3/.디렉토리3.txt.swp” because it was deleted before 1235694514 (1235694404)
    Not undeleting “디렉토리3/디렉토리3.txt” because it was deleted before 1235694514 (1235694404)
    Not undeleting “테스트.txt” because it was deleted before 1235694514 (1235694404)
    Restoring 테스트2.txt


특정 이름의 파일만 복구 하려면 –restore-file 다음에 파일명을 써주면 된다.

    # ext3grep –restore-file 테스트.txt /dev/sdb1
    Running ext3grep version 0.10.1
    Number of groups: 8
    Minimum / maximum journal block: 562 / 4664
    Loading journal descriptors… sorting… done
    The oldest inode block that is still in the journal, appears to be from 1235694214 = Fri Feb 27 09:23:34 2009
    Number of descriptors in journal: 269; min / max sequence numbers: 2 / 40
    Writing output to directory RESTORED_FILES/
    Loading sdb1.ext3grep.stage2… done
    Restoring 테스트.txt

    # cd RESTORED_FILES/
    # ls
    테스트.txt


디렉토리 밑에 있는 파일이라면 경로까지 정확하게 써주면 된다. 경로를 포함한 파일명은 위에서 한번 실행했던 –dump-names로 알 수 있다.

    # ext3grep –restore-file dir2/dir2.txt /dev/sdb1
    Running ext3grep version 0.10.1
    Number of groups: 8
    Minimum / maximum journal block: 562 / 4664
    Loading journal descriptors… sorting… done
    The oldest inode block that is still in the journal, appears to be from 1235694214 = Fri Feb 27 09:23:34 2009
    Number of descriptors in journal: 269; min / max sequence numbers: 2 / 40
    Loading sdb1.ext3grep.stage2… done
    Restoring dir2/dir2.txt


더 많은 옵션이 있지만 일반적인 사용자라면 이정도만 알아도 충분히 복구할 수 있을 것이다. 이름처럼 ext3에 대해서 복구를 해주기 때문에 포맷이 되었거나 다른 파일시스템에서는 복구가 안된다.

마지막으로 노파심에서 한마디 하자면 실수로 파일을 삭제했을때에는 최대한 빨리 해당 장치를 unmount 해서 덮어써지지 않게 해야한다.

자세한 정보는 저자의 홈페이지에서 확인하자.

블로그 이미지

유효하지않음

,

[출처] http://www.cyberciti.biz/tips/howto-setup-linux-iscsi-target-sanwith-tgt.html

Linux target framework (tgt) aims to simplify various SCSI target driver (iSCSI, Fibre Channel, SRP, etc) creation and maintenance. The key goals are the clean integration into the scsi-mid layer and implementing a great portion of tgt in user space.

The developer of IET is also helping to develop Linux SCSI target framework (stgt) which looks like it might lead to an iSCSI target implementation with an upstream kernel component. iSCSI Target can be useful:

a] To setup stateless server / client (used in diskless setups).
b] Share disks and tape drives with remote client over LAN, Wan or the Internet.
c] Setup SAN - Storage array.
d] To setup loadbalanced webcluser using cluster aware Linux file system etc.

In this tutorial you will learn how to have a fully functional Linux iSCSI SAN using tgt framework.

iSCSI target (server)

Storage resource located on an iSCSI server known as a "target". An iSCSI target usually represents nothing but hard disk storage. As with initiators, software to provide an iSCSI target is available for most mainstream operating systems.

iSCSI initiator (client)

An initiator functions as an iSCSI client. An initiator typically serves the same purpose to a computer as a SCSI bus adapter would, except that instead of physically cabling SCSI devices (like hard drives and tape changers), an iSCSI initiator sends SCSI commands over an IP network.

Debian / Ubuntu Linux Install tgt

Type the following command to install Linux target framework user-space tools:
$ sudo apt-get install tgt

CentOS / RHEL / Red Hat Linux Install tgt

RHEL 5.2 and older version do not have tgt tools. However, RHEL 5.3 (preview version) comes with tgt tools.

tgtadm - Linux SCSI Target Administration Utility

tgtadm is used to monitor and modify everything about Linux SCSI target software: targets, volumes, etc. This tool allows a system to serve block-level SCSI storage to other systems that have a SCSI initiator. This capability is being initially deployed as a Linux iSCSI target, serving storage over a network to any iSCSI initiator.

Start tgtd

To start the tgtd, enter:
# /usr/sbin/tgtd
Under RHEL 5.3 to start the tgtd service, enter:
# /etc/init.d/tgtd start

Define an iscsi target name

The following example creates a target with id 1 (the iqn is 19 iqn.2001-04.com.example:storage.disk2.amiens.sys1.xyz) and adds a 20 logical unit (backed by /dev/hdc1) with lun 1.
# tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2001-04.com.example:storage.disk2.amiens.sys1.xyz

To view the current configuration, enter:
# tgtadm --lld iscsi --op show --mode target
Sample output:

Target 1: iqn.2001-04.com.example:storage.disk1.amiens.sys1.xyz
    System information:
        Driver: iscsi
        Status: running
    I_T nexus information:
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: deadbeaf1:0
            SCSI SN: beaf10
            Size: 0
            Online: No
            Poweron/Reset: Yes
            Removable media: No
            Backing store: No backing store
    Account information:
    ACL information:

Add a logical unit to the target (/dev/sdb1):
# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sdb1

A note about home computer / test system

Most production boxes will only use iSCSI root with real iSCSI devices, but for testing purposes it can be quite useful to set up an iSCSI target on your image server. This is useful for testing and learning iSCSI target and iSCSI initiator at home, simply use filesystem for testing purpose. Usedd command to create diskbased filesystem:
# dd if=/dev/zero of=/fs.iscsi.disk bs=1M count=512
Add /fs.iscsi.disk as a logical unit to the target:
# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /fs.iscsi.disk
Now, you should able to view details:
# tgtadm --lld iscsi --op show --mode target
Sample output:

Target 1: iqn.2001-04.com.example:storage.disk1.amiens.sys1.xyz
    System information:
        Driver: iscsi
        Status: running
    I_T nexus information:
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: deadbeaf1:0
            SCSI SN: beaf10
            Size: 0
            Online: No
            Poweron/Reset: Yes
            Removable media: No
            Backing store: No backing store
        LUN: 1
            Type: disk
            SCSI ID: deadbeaf1:1
            SCSI SN: beaf11
            Size: 512M
            Online: Yes
            Poweron/Reset: Yes
            Removable media: No
            Backing store: /fs.iscsi.disk
    Account information:
    ACL information:

Accept iSCSI Target

To enable the target to accept any initiators, enter:
# tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL
This should open network port # 3260:
# netstat -tulpn | grep 3260
Sample output:

tcp        0      0 0.0.0.0:3260            0.0.0.0:*               LISTEN      27328/tgtd
tcp6       0      0 :::3260                 :::*                    LISTEN      27328/tgtd      

And you are done. Your system is configured as iSCSI Target. Remote client computer can access this computers hard disk over network. Your can use cluster aware filesystem to setup real shared storage for small business. Open TCP port 3260 in your firewall, if required.

How do I access iSCSI Target (server) via iSCSI initiator (client)?

See detailed os specific iSCSI initiator instuctions:

  1. RHEL 4 or RHEL 5 Linux iSCSI initiator tutorial.
  2. Debian Linux iSCSI initiator tutorial.
  3. FreeBSD iSCSI initiator tutorial.
  4. Windows iSCSI initiator tutorial.

Following is a quick way to access iSCSI target, under RHEL 5. Let us say your server iSCSI Target IP is 192.168.1.2. Type the following command to discover targets at a given IP address such as 192.168.1.2 (use 127.0.0.1 if you are testing it from same computer):
# iscsiadm --mode discovery --type sendtargets --portal 192.168.1.2
OR
# iscsiadm --mode discovery --type sendtargets --portal 127.0.0.1
Sample output:

127.0.0.1:3260,1 iqn.2001-04.com.example:storage.disk1.amiens.sys1.xyz

Login to the iscsi target session:
# iscsiadm --mode node --targetname iqn.2001-04.com.example:storage.disk1.amiens.sys1.xyz --portal 192.168.1.2:3260 --login
OR
# iscsiadm --mode node --targetname iqn.2001-04.com.example:storage.disk1.amiens.sys1.xyz --portal 127.0.0.1:3260 --login
Verify that login was successful:
# tail -f /var/log/messages
Sample output:

Nov 11 07:34:04 vivek-desktop kernel: [ 9039.562312] scsi 6:0:0:1: Direct-Access     IET      VIRTUAL-DISK     0001 PQ: 0 ANSI: 5
Nov 11 07:34:04 vivek-desktop kernel: [ 9039.572268] sd 6:0:0:1: [sdc] 1048576 512-byte hardware sectors (537 MB)
Nov 11 07:34:04 vivek-desktop kernel: [ 9039.572374] sd 6:0:0:1: [sdc] Write Protect is off
Nov 11 07:34:04 vivek-desktop kernel: [ 9039.572530] sd 6:0:0:1: [sdc] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
Nov 11 07:34:04 vivek-desktop kernel: [ 9039.572715] sd 6:0:0:1: [sdc] 1048576 512-byte hardware sectors (537 MB)
Nov 11 07:34:04 vivek-desktop kernel: [ 9039.572790] sd 6:0:0:1: [sdc] Write Protect is off
Nov 11 07:34:04 vivek-desktop kernel: [ 9039.572940] sd 6:0:0:1: [sdc] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
Nov 11 07:34:04 vivek-desktop kernel: [ 9039.572946]  sdc: unknown partition table
Nov 11 07:34:04 vivek-desktop kernel: [ 9039.573492] sd 6:0:0:1: [sdc] Attached SCSI disk
Nov 11 07:34:04 vivek-desktop kernel: [ 9039.573593] sd 6:0:0:1: Attached scsi generic sg4 type 0

sdc is new scsi disk. You may need to restart iSCSI to probe partition and check disks:
# service iscsi restart
# partprobe
# fdisk -l

You can now create parition and mount file system using usual fdisk and mkfs.ext3 commands:
# fdisk /dev/sdc
# mkfs.ext3 /dev/sdc1mkdir /iscsi
# mkdir /iscsi
# mount /dev/sdc1 /iscsi
# df -H

Sample output:

Filesystem             Size   Used  Avail Use% Mounted on
/dev/sda2               99G    30G    64G  32% /
tmpfs                  1.1G      0   1.1G   0% /lib/init/rw
varrun                 1.1G   361k   1.1G   1% /var/run
varlock                1.1G      0   1.1G   0% /var/lock
udev                   1.1G   2.9M   1.1G   1% /dev
tmpfs                  1.1G   312k   1.1G   1% /dev/shm
/dev/sda1              105G    32G    73G  31% /media/sda1
/dev/sda5              294G   275G    20G  94% /share
/dev/sdb2              247G   119G   116G  51% /disk1p2
/dev/sdc1              520M    11M   483M   3% /iscsi
블로그 이미지

유효하지않음

,

[출처] http://www.cyberciti.biz/tips/howto-centos-rhel4-iscsi-initiators.html

I've received a couple of email about setting up iSCSI under CentOS 4 or RHEL ES 4 server. Previously, I wrote about iSCSI under CentOS 5 / RHEL 5 server.

Requirements

[a] Following instructions tested on RHEL ES 4 and CentOS 4 only. (See RHEL 5/ CentOS 5 / Debian/ Ubuntu Linux specific instructions here).
[b] You need following information
[c] ISCSI Username
[d] ISCSI Password
[e] ISCSI Server IP / hostname

CentOS Linux v4.x - Install iscsi-initiator-utils

Type the following command:
# yum install iscsi-initiator-utils

Redhat ES Linux v4.x - Install iscsi-initiator-utils

Type the following command:
# up2date iscsi-initiator-utils

Configure iSCSI

Open /etc/iscsi.conf file, enter:
# vi /etc/iscsi.conf
Setup it as follows:

DiscoveryAddress=ISCSI_TARGET_HOST_OR_IP
 OutgoingUserName=ISCSI_USER_NAME
 OutgoingPassword=ISCSI_PASSWORD
 LoginTimeout=15

Save and close the file.

Start the iscsi service

Type the following command to start iscsi service so that you can see block device:
# chkconfig iscsi on
# /etc/init.d/iscsi start

Run any one of the following to find out new block device name:
# fdisk -l
# tail -f /var/log/messages
# find /sys/devices/platform/host* -name "block*"

Format iSCSI device

Use fdisk and mkfs.ext3 commands. First, create a partition (assuming that /dev/sdc is a new block device assigned to iscsi) :
# fdisk /dev/sdc
# mkfs.ext3 /dev/sdc1

Create /mnt/iscsi directory:
# mkdir -p /mnt/iscsi
Open /etc/fstab file and append config directive:
/dev/sdc1 /mnt/iscsi ext3 _netdev 0 0
Save and close the file. Mount the parition /dev/sdc1:
# mount -a
# df -H

블로그 이미지

유효하지않음

,

[출처] http://www.cyberciti.biz/tips/rhel-centos-fedora-linux-iscsi-howto.html

Internet SCSI (iSCSI) is a network protocol s that allows you to use of the SCSI protocol over TCP/IP networks. It is good alternative to Fibre Channel-based SANs. You can easily manage, mount and format iSCSI Volume under Linux. It allows access to SAN storage over Ethernet.

Open-iSCSI Project

Open-iSCSI project is a high-performance, transport independent, multi-platform implementation of iSCSI. Open-iSCSI is partitioned into user and kernel parts.

Instructions are tested on:
[a] RHEL 5
[b] CentOS 5
[c] Fedora 7
[d] Debian / Ubuntu Linux

Install Required Package

iscsi-initiator-utils RPM package - The iscsi package provides the server daemon for the iSCSI protocol, as well as the utility programs used to manage it. iSCSI is a protocol for distributed disk access using SCSI commands sent over Internet Protocol networks. This package is available under Redhat Enterprise Linux / CentOS / Fedora Linux and can be installed using yum command:
# yum install iscsi-initiator-utils

A note about Debian / Ubuntu Linux

If you are using Debian / Ubuntu Linux install open-iscsi package, enter:
$ sudo apt-get install open-iscsi

iSCSI Configuration

There are three steps needed to set up a system to use iSCSI storage:

  1. iSCSI startup using the init script or manual startup. You need to edit and configure iSCSI via /etc/iscsi/iscsid.conf file
  2. Discover targets.
  3. Automate target logins for future system reboots.
  4. You also need to obtain iSCSI username, password and storage server IP address (target host)

Step # 1: Configure iSCSI

Open /etc/iscsi/iscsid.conf with vi text editor:
# vi /etc/iscsi/iscsid.conf
Setup username and password:
node.session.auth.username = My_ISCSI_USR_NAME
node.session.auth.password = MyPassword
discovery.sendtargets.auth.username = My_ISCSI_USR_NAME
discovery.sendtargets.auth.password = MyPassword

Where,

  • node.session.* is used to set a CHAP username and password for initiator authentication by the target(s).
  • discovery.sendtargets.* is used to set a discovery session CHAP username and password for the initiator authentication by the target(s)

You may also need to tweak and set other options. Refer to man page for more information. Now start the iscsi service:
# /etc/init.d/iscsi start

Step # 2: Discover targets

Now use iscsiadm command, which is a command-line tool allowing discovery and login to iSCSI targets, as well as access and management of the open-iscsi database. If your storage server IP address is 192.168.1.5, enter:
# iscsiadm -m discovery -t sendtargets -p 192.168.1.5
# /etc/init.d/iscsi restart

Now there should be a block device under /dev directory. To obtain new device name, type:
# fdisk -l
or
# tail -f /var/log/messages
Output:

Oct 10 12:42:20 ora9is2 kernel:   Vendor: EQLOGIC   Model: 100E-00           Rev: 3.2
Oct 10 12:42:20 ora9is2 kernel:   Type:   Direct-Access                      ANSI SCSI revision: 05
Oct 10 12:42:20 ora9is2 kernel: SCSI device sdd: 41963520 512-byte hdwr sectors (21485 MB)
Oct 10 12:42:20 ora9is2 kernel: sdd: Write Protect is off
Oct 10 12:42:20 ora9is2 kernel: SCSI device sdd: drive cache: write through
Oct 10 12:42:20 ora9is2 kernel: SCSI device sdd: 41963520 512-byte hdwr sectors (21485 MB)
Oct 10 12:42:20 ora9is2 kernel: sdd: Write Protect is off
Oct 10 12:42:20 ora9is2 kernel: SCSI device sdd: drive cache: write through
Oct 10 12:42:20 ora9is2 kernel:  sdd: unknown partition table
Oct 10 12:42:20 ora9is2 kernel: sd 3:0:0:0: Attached scsi disk sdd
Oct 10 12:42:20 ora9is2 kernel: sd 3:0:0:0: Attached scsi generic sg3 type 0
Oct 10 12:42:20 ora9is2 kernel: rtc: lost some interrupts at 2048Hz.
Oct 10 12:42:20 ora9is2 iscsid: connection0:0 is operational now

/dev/sdd is my new block device.

Step # 3: Format and Mount iSCSI Volume

You can now partition and create a filesystem on the target using usual fdisk and mkfs.ext3 commands:
# fdisk /dev/sdd
# mke2fs -j -m 0 -O dir_index /dev/sdd1

OR
# mkfs.ext3 /dev/sdd1

Tip: If your volume is large size like 1TB, run mkfs.ext3 in background using nohup:
# nohup mkfs.ext3 /dev/sdd1 &

Mount new partition:
# mkdir /mnt/iscsi
# mount /dev/sdd1 /mnt/iscsi

Step #4: Mount iSCSI drive automatically at boot time

First make sure iscsi service turned on at boot time:
# chkconfig iscsi on
Open /etc/fstab file and append config directive:
/dev/sdd1 /mnt/iscsi ext3 _netdev 0 0

블로그 이미지

유효하지않음

,

folding linux lines

OS/Linux 2008. 11. 25. 16:05

fold : 접다, 우리안에 넣다.
80 컬럼이 넘는 긴 라인을 갖는 파일을 80컬럼으로 만들고자 한다면 다음의 명령어를
사용할 수 있다.

$ fold -w 60 filename

60 컬럼으로 만들고 싶은 경우 위의 명령어를 사용할 수 있다.

자세한 옵션은 man page 참조. 원문에는 Linux 명령어라고 하는데 Solaris에서도
명령어가 작동한다.
블로그 이미지

유효하지않음

,
[출처] http://pgclks.tistory.com/140

host login: root
configuration error - unknown item 'PASS_MIN_LEN' (notify administrator)
Password:

o 참고 URL

http://kldp.org/files/______________________________520.doc http://www.puschitz.com/SecuringLinux.shtml#EnablingPasswordAging
http://www.puschitz.com/SecuringLinux.shtml#EnforcingStrongerPasswords

o 사용예 설명

다음 예제는 어떻게 다음의 패스워드 규칙을 적용시키는가를 보여준다.
- 패스워드의 최소길이 8자
    pam_cracklib.so minlen=8
- 소문자 최소 1자
    pam_cracklib.so lcredit=-1
- 대문자 최소 1자
    pam_cracklib.so ucredit=-1
- 숫자 최소 1자
    pam_cracklib.so dcredit=-1
- 문자와 숫자이외의 문자 최소 1자(특수문자를 말하는 듯..)
    pam_cracklib.so ocredit=-1

이 패스워드 제한을 설정하려면 /etc/pam.d/system-auth 파일을 열어 파란색으로 된 부분을 추가하거나
변경을 하라

auth           required       /lib/security/$ISA/pam_env.so
auth           sufficient      /lib/security/$ISA/pam_unix.so likeauth nullok
auth           required       /lib/security/$ISA/pam_deny.so
account      required       /lib/security/$ISA/pam_unix.so
account      sufficient      /lib/security/$ISA/pam_succeed_if.so uid < 100 quiet
account      required       /lib/security/$ISA/pam_permit.so
password   requisite       /lib/security/$ISA/pam_cracklib.so retry=3 minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1
password   sufficient      /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
password   required       /lib/security/$ISA/pam_deny.so
session      required       /lib/security/$ISA/pam_limits.so
session      required       /lib/security/$ISA/pam_unix.so

password aging은 /etc/shadow 파일을 직접 수정해서 변경할 수도 있지만
chage 명령을 이용하면 좀더 쉽게 사용할 수 있습니다.

chage -l ID : 현재의 에이징 정보
chage -m mindays ID : 암호 의무사용기간 수정
chage -M maxdays ID : 암호 유효기간 수정
chage -d lastdays ID : 암호 변경일 수
chage -E expiredays ID : 계정 만료일 수정

블로그 이미지

유효하지않음

,

VIM을 사용하자

OS/Linux 2008. 11. 24. 13:42

[출처] http://teamblog.joinc.co.kr/yundream/3

VIM을 사용하자

윤 상배

dreamyun@yahoo.co.kr

고친 과정
고침 0.9 2004년 3월 10일 17시
vim 모드와 관련된 부가내용 추가
고침 0.8 2003년 3월 1일 23시
최초 문서작성

차례

1. vim 이란

vim 은 유닉스 계열에서 전통적으로 널리 사용도던 vi 의 improve 즉 undo, syntax coloring, split windows 등의 기능을 포함시킨 vi 의 보강된 프로그램이다.

이 문서는 vim 의 기본적인 사용법과, 프로그래밍을 위한 여러가지 팁을 담고 있다. vim 버젼은 6.0 을 기준으로 한다. vim(vi)에 대한 자세한 사용방법은 여기에서는 제시하지 않을것이다. 가장 기본적인 사항만 언급할것이며, 자세한 사용법은 vi 사용자그룹 사이트를 참고하기 바란다.


2. VIM의 기본사용법 익히기

이번장에서는 vim의 기본적인 사용법에 대해서 알아보도록 하겠다. 위에서 언급했듯이, 이문서는 VIM의 레퍼런스 가이드는 아니다. 기본적인 사용이 가능하도록 가장 기초적인 내용들만 다룰것이다.


2.1. vim 모드

다른 에디터를 사용하던 유저가 vim을 처음 접하면서 가장 난감해 하는 부분이 vim의 상태(mode)개념이다.vim은 다른 에디터들과 달리, 실행을 시켰다고 해서 즉시 입력이 이루어지지 않는다. 많은 vim을 처음 접하는 유저는 어떻게 글을 입력할지 몰라서 vim의 사용을 접게되는 경우가 발생하는데, 여기에 그 이유가 있다. vi 는 크게 세가지 상태로 나뉘어진다. 첫번째가 명령어 모드로 키입력이 바로 실행되는 상태이며, 다음은 상태모드로 실제 문서를 편집하는 모드 마지막이 ex 상태로 ex 명령을 실행시키는 상태이다.

vi 를 처음실행시키면 입력모드가 아닌 명령모드 상태에 놓이게 된다. 이 상태에서는 문자의 입력이 이루어지지 않으며, 찾기등과 같은 간단한 문서관련 명령을 실행할 수 있다. 이 명령모드 상태에서 ":" 키를 누르면 ex 상태로 a, i, o 키 등을 누르면 입력 상태로 넘어가게 된다. 일단 입력상태로 들어가게 되면 문서 편집을 할수 있게 되는데, 이때 ESC 키를 누르면 명령모드 상태로 넘어가게 된다.

표 1. vim의 상태(mode)

명령 상태 처음 vim을 실행했을때, 입력상태/명령상태에서 ESC입력시 간단한 찾기, 커서 이동, ex 상태로 넘어가기
ex 상태 명령 상태에서 (":") 각종 치환, 저장, 파일읽기, vim설정등과 같은 대부분의 작업들
입력 상태 명령 상태에서 (a,i,o 키 입력) 내용 입력


2.2. 명령어모드의 사용

우리는 명령모드에서 여러가지 명령을 입력함으로써, 복사, 붙이기, 삭제 문서입력, 문서저장, 문서불러오기, 커서이동 등의 작업을 할수 있다. 이번 장에서는 이러한 명령모드에서 사용되는 각종 명령어에 대해서 알아보도록 하겠다.


2.2.1. 커서 이동

기본적으로 vi 는 입력모드에서 방향키를 이용해서 커서 이동을 하지 못하도록 되어있다. 비록 최근의 vim 이 입력모드에서 방향키를 이용한 커서 이동을 지원하고 있기는 하지만, 명령모드에서의 키이동이 훨씬 빠르고 편하므로, 처음에는 좀 어색하더라도 명령모드에서의 키 이동을 익히도록 하자.

표 2. 커서 이동

k 커서를 위로 움직임
j 커서를 아래로 움직임
h 커서를 왼쪽으로 움직임
l 커서를 오른쪽으로 움직임
- 커서를 줄의 처음으로 옮김
e, E 다음단어의 끝으로, 문자단위 이동
w, W 다음단어의 처음으로, 문자단위 이동
$ 줄의 마지막으로
0 줄의 처음으로
^ 줄의 처음으로(공백이 아닌 처음시작되는 문자)
Shift+g 문서의 마지막으로 이동한다.
gg, 1g 문서의 처음으로 이동한다. 1대신 다른 숫자를 입력하면 해당 숫자의 라인으로 이동한다.
), ( 다음, 이전 문장의 처음으로
}, { 다음, 이전문단의 처음으로
]], [[ 다음, 이전 구절의 처음으로


2.2.2. 화면 스크롤

위의 커서명령 이동이 매우 편하기는 하지만, 만약 페이지가 한 2000라인 될경우, 위의 커서를 이용해서 한줄씩 이동하는데에는 너무 많은 시간이 걸릴것이다. 그래서 vi 에서는 화면 단위의 스크롤이 가능한 명령들을 제공한다. 아래의 화면 스크롤 명령어들을 익히면 빠른 위치이동을 위해 매우 유용하게 사용할수 있다. ^F 는 CTRL+F 를 의미한다.

표 3. 화면 스크롤

^F 한 화면 을 앞으로 스크롤
^B 한 화면 을 뒤로 스크롤
^D 반 화면 을 앞으로 스크롤
^U 반 화면 을 뒤로 스크롤
^E 한줄 앞으로 스크롤
^Y 한줄 뒤로 스크롤
Shift + h 화면의 맨 윗줄로
Shift + m 화면의 중간줄로
Shift + l 화면의 맨 아랫줄로


2.2.3. 마크 이동

일종의 책갈피 기능이라고 보면 된다. 자주 참조해야할 라인에 마크를 해놓고 필요할때 곧바로 마크된 영역으로 이동하기 위해서 사용한다. 마크는 mx 형식으로 사용할수 있다. x 는 (a~z)까지의 문자로 마크된 영역의 이름을 지정하기 위해서 사용한다. 마크된 영역으로 이동하기 위해서는 'x 와 `x 를 사용한다. 'x 는 마크된 라인의 가장 앞으로 이동하고, `x 는 마크된 라인의 정확한 위치로 이동한다.


2.2.4. 입력 명령

지금 vi 를 실행시켜보자. vi 는 기본적으로 명령모드로 실행되므로, 지금상태에서는 문서 작성을 할수 없을것이다. 우리는 다음과 같은 키입력을 통해서 입력모드 상태로 전환할수 있다.

표 4. 입력 명령

i 현재위치에서 삽입
I 현재줄의 처음위치에서 삽입
a 현재위치에서 한칸앞으로 이동해서 삽입
A 현재줄의 마지막위치에서 삽입
o 새로운 줄을 커서 아래에 연다
O 새로운 줄을 커서 위연다
s 현재 위치의 문자를 지우고 입력모드로 들어간다.
S 현재위치의 라인을 지우고 입력모드로 들어간다.


2.2.5. 편집명령

여기에서는 vi의 편집기능인 복사, 붙이기, 삭제에 대해서 알아 보도록 하겠다. 다른 에디터들은 보통 마우스를 이용해서 블럭을 지정해서 편집을 하는 반면, vi 는 명령어 모드에서 키보드 만을 이용해서 편집이 가능하므로, 매우 편리하고 빠르게 편집작업들이 가능하다. 또한 라인단위 블럭, 블럭단위 블럭등의 선택 모드를 지원함으로써, 문서에서 원하는 부분에 대한 작업을 좀더 쉽게 할수 있다.


2.2.5.1. 편집(none visual block 모드)

visual block 모드가 아닌 상태에서이 편집에 관한 내용이다.

표 5. 복사,삭제,붙이기

y 한줄 복사
yn 현재 라인에서부터 n라인만큼을 복사
p 복사된 내용 붙이기
dd 한줄삭제
dw 한단어 삭제
Shift+d, d$ 현재커서 위치에서 마지막까지 삭제
Shift+j 현재 행의 개행문자를 제거한다. 즉 아래라인을 현재라인에 덧붙인다.


2.2.5.2. Undo (되돌리기)

vim 은 다중의 undo 기능을 지원한다. 뒤로 되돌리고 싶다면 단지 'u'키만 입력하면 된다.


2.2.5.3. 블럭 지정

이번엔 블럭지정, 그중에서도 vim 에서 지원하는 visual 블럭 지정에 대해서 알아보겠다. vim visual 블럭 지정 기능을 사용할경우 지정범위가 반전되면서 눈에 보이기 때문에, 효과적인 블럭지정이 가능하도록 도와준다. 범위지정을 위해서 'hjkl', 'Shift+g,GG' 과 같은 이동명령 과 화면스크롤 명령을 사용해서 범위지정을 좀더 빠르게 할수 있다.

표 6. 블럭지정

v 단어단위로 블럭지정이 가능하다. 블럭범위는 이동명령인 'hjkl' 로 원하는 범위 만큼 지정할수 있다.
Shift+v 라인단위 블럭지정이다. 라인전체가 선택되며, 위아래 이동명령 'hj' 으로 범위 지정이 가능하다.
Ctrl+v 블럭단위 블럭지정이다. 4각형의 블럭지정이 가능하며 이동명령인 'hjkl' 로 원하는 범위를 지정할수 있다.
Shift+v 와 같이 블럭지정을 한후 Shift+G 를 입력하면 현재라인부터 마지막 라인까지가 블럭 지정이 될것이다.


2.2.5.4. 편집(visual block 모드)

일단 vim 의 visual 블럭 지정 기능을 이용해서 편집하기 원하는 블럭을 지정했다면, 각종 편집명령을 이용해서 복사, 붙이기, 삭제 작업이 가능하다. 블럭을 지정한 상태에서 아래의 명령을 이용해서 편집을 하면 된다. 명령어는 기본적으로 none visual block 모드의 편집 명령어과 같다.

표 7. 편집(복사, 삭제, 붙이기)

y 지정된 블럭을 복사한다.
p 복사된 블럭을 현재라인(커서) 아래에 붙인다.
d 지정된 블럭을 삭제한다.
dd 현재라인을 삭제한다.


2.3. ex 모드

2.3.1. 찾기/치환

vim 의 기능중 가장편리한 기능으리면 뭐니뭐니 해도, 정규표현식을 이용한 강력한 찾기기능과 치환기능이라고 할수 있을것이다. 물론 다른 대부분의 에디터들도 찾기기능과 치환기능을 제공하긴 하지만, vim 의 기능은 다른 에디터들에 비해서 정말로 독보적인 편리함과 강력함을 제공한다. vi 사용자가 다른 에디터로 넘어가기 힘든이유중 가장큰 이유가, 바로 "키를 이용한 방향입력" 과 "찾기 및 치환" 기능 때문이다.

사실 찾기 치환의 기능을 제대로 이해하고 사용하기 위해서는 정규표현식(regular expression) 에 대한 이해가 필요로 하는데, 이것은 다음의 사이트를 참조하기 바란다. 정규 표현식의 간략한 소개

먼저 찾기 기능에 대해서 알아보겠다. 찾기기능은 ':/패턴/' 를 이용 하면된다. 찾기 원하는 문자혹은 패턴을 입력하고 엔터키를 누르면 현재 커서위치에서 가장 가까운 곳에 위치한 문자열로 커서를 이동시킨다(문서 아래방향으로). 다음 문자열을 찾기를 원한다면 'n'키를 누르면 된다. 문서에서 가장 마지막에 이르르게 되면, 문서의 가장처음부터 다시 찾기 시작한다. 'Shift+n' 을 이력하면 반대 방향(문서의 위쪽으로)으로 찾기를 시작한다.

치환이야 말로 vim 의 꽃이라고 할수 있다. :[범위]s/[oldpattern]/[newpattern]/ 의 형식으로 사용하면 된다. 범위 지정은 visual block 을 이용할수도 있으며, 직접 범위를 입력할수도 있다. visual block 를 이용한 치환은 visual block 를 지정한다음 ':' 를 입력해서 ex 모드로 넘어가면 된다. 그리고나서 ':'<,'>s/[oldpattern]/[newpattern/' 과 같은 방법으로 치환하면 된다.

visual block 를 사용하지 않고 직접범위를 입력할수도 있다. :[시작],[마지막]s/[old]/[new]/ 식으로 범위를 지정하면 된다. 여기에는 몇가지 지정된 범위를 위한 특수 기호들이 있다. '%' 는 전체문서(처음부터 끝까지), '.' 은 현재, '$' 은 마지막 을 나타낸다. 숫자를 입력할경우 숫자는 라인을 나타낸다. 다음은 간단한 사용예이다.

# 문서 처음부터 마지막까지의 char 를 _char_ 로 치환한다. 
:%s/char/_&_/g

# 현재(커서위치)부터 마지막까지의 char 를 _char_ 로 치환한다.
:.,$s/char/_&_/g

# buf_.*[255], buf_in[255], buf_get[255] 와 같은 문자열을 hello 로 변경한다.  
:1,10s/buf_.*\[255\]/hello/g
				
마지막에 쓰인 'g' 는 global 이다. 즉 해당 라인 전체에 걸쳐서 검색후 치환한다. 'g' 를 사용하지 않을경우 라인에서 처음에 검색된 문자만 치환하고 다음 라인으로 넘어간다.


2.3.2. 파일 저장, 열기, 종료

파일열기의 경우 vi 를 실행시킬대 명령행 옵션으로 열기가 가능하다. 또한 vi 를 이미 실행 시킨후에도 명령모드에서 명령을 입력함으로 파일을 열수 있다. 열고자 하는 파일이 이미 존재할경우에는 존재하는 파일이 열리고, 열고자 하는 파일이 존재하지 않을경우 새로운 파일이 만들어진다.

표 8. 저장,열기,종료

:e [filename] filename 으로 파일열기
:q, :q!, :wq 종료, 강제종료, 저장후 종료
:w, :w [filename] 현재파일명으로 저장, filename 로 저장
:<범위>w [filename] 지정한 범위만 다른 파일로 저장
:e [filename] filename 을 편집하기 위해서 연다
ZZ 지금파일을 저장하고 vim 을 종료한다.
:f 현재 작업중인 파일의 이름과, 라인수를 출력한다

3. 개발자를 위한 vim 사용팁

3.1. 화면 나누기

vim 은 수평나누기와 수직나누기를 제공한다. 수평나누기는 ":split [파일이름]" 수직나누기는 "vs [파일이름]" 으로 나눌수 있다. 파일이름을 지정한 경우, 새로 만들어진 창에는 파일이름 을 가지는 파일이 열리고, 파일이름을 지정하지 않을경우 똑같은 파일이 열린다. 이 기능은 현재 파일의 다른 부분을 참조하고 싶을때 유용하게 사용할수 있다(참조하는 부분으로 이동하기 위해서 왔다갔다 하지 않아도 되므로). 또한 ":10split [파일이름]", "10vs [파일이름]" 등으로 창의 크기를 조절해 줄수도 있다. 창 나누기는 2개 이상 나누기도 가능하다.

이렇게 창을 분할시켜 놓으면 쏘쓰를 참조하기도 편하고, 무엇보다 편집(삭제,복사,붙이기)가 가능하므로 훨씬더 작업을 수월하게 할수 있다.


3.1.1. 화면 이동

명령 모드에서 CTRL+ww 를 입력하면 된다. 그러면 아래창으로 이동한다. 임의로 이동하기 위해서는 Ctrl+w 를 입력한 상태에서 이동명령[hjkl]를 이용하면 원하는 방향으로 창이동이 가능하다.


3.1.2. 파일 네비게이션

vim 6.0 부터는 파일네비게이션 기능이 존재합니다. 예를들어 vi 로 파일을 열때 파일을 디렉토리로 지정하면 해당디렉토리의 내용이 네비게이션 되고, 디렉토리 이동및 파일 선택이 가능하다.

	
vi ./   # 현재 디렉토리내용을 네비게이션 해준다. 
				


3.2. 파일 네비게이션 바 만들기

윈도우의 울트라 에디트와 같은 프로그램을 보면 왼쪽에 파일네비게이션이 있어서 원하는 파일을 바로 선택해서 편집하는 기능이 있다. vim 으로도 이러한 기능을 구현할수 있다. 이것은 vim 의 file navigation 기능과 창나누기 기능을 이용해서 구현하면 된다.

vi 가 실행되 상태에서 수직창 나누기 기능을 이용해서 ":20vs ./" 명령을 내려보자 그럼 그림과 같이 오른쪽에 파일 네비게이션 바가 생김을 알수 있다.

그림 1. 파일네비게이션을 만든 화면

이제 열기를 원하는 파일위치에 가서 shift+o 를 입력해보자, 그럼 옆의 편집창에 새로운 파일이 열리는것을 알수 잇을것이다. 여기에 더해서 편집장을 split 로 나누면, 여러개의 파일을 오가면서 편집이 가능해질 것이다.


3.3. 여러개의 파일 편집하기

위에서는 창나누기를 이용한 여러개의 파일편집에 대해서 알아봤는데, 또다른 방법이 있다. 처음에 vim 을 통하여 여러개의 파일을 open 하고 여러개의 열린 파일을 이동하면서 편집하는 방법이다. 먼저 vim을 다음과 같이 실행시킨다.

 
[yundream@localhost test]# vim file1.txt file2.txt ...
			
그러면 처음 화면은 file1.txt 편집화면일것이다. 2번째 파일인 file2.txt 편집화면으로 넘어가길 원한다면(앞에 있는 파일 편집)
:n
			
file2.txt 에서 file1.txt 를 편집하길 원한다면(뒤에 있는 파일편집)
:e#
			
split 를 이용해서 여러개의 파일을 편집할때와 마찬가지로, 각종 편집기능(복사,삭제,붙이기)이 서로 공유되므로 편하게 작업이 가능하다.


3.4. 잠시 쉘로 나가기

보통 vim상에서 쉘명령어를 실행시키기 위해서 :![명령어] 를 사용하는데, 이것 보다는 Ctrl+z 를 이용해서 쉘로 빠져나가서 작업하는게 더 편하다. sehll 이 job control 기능을 이용한것으로, 쉘에서 원하는 작업을 수행하후 fg 명령을 이용해서 다시 vi 편집 상태로 되돌아 올수 있다. vim 사용자를 보면 가끔 쉘작업을 하기 위해서 vim 을 아예 종료 시켜서 쉘로 빠져나간 다음에 작업을 하고 vim 을 다시 실행시키는 경우가 있는데, 이제는 그럴필요가 없이 좀더 편하게 작업을 할수 있을것이다.


3.5. 선택된 block 를 다른 이름으로 저장하기

split 기능을 이용해서 창을 나누고, 원하는 블럭을 선택해서 복사한다음에, 새로만든창에 가져다 붙이기를 하면 된다.

그러나 이방법은 조금 복잡한 감이 없잖아 있다. 이럴때는 블럭을 선택해서 :'<,'>w [파일명] 하면 좀더 간단하게 원하는 작업을 수행할수 있다.


3.6. 빠른 괄호 이동

C나 C++ 을 사용하다보면 제어문이나 함수에서 많은 괄호('{','(')를 만나게 된다. 이때 괄호의 제일 마지막으로 이동하고 싶을때가 있을것이다. 이럴때는 ']}' 를 사용하면 된다. '[{' 를 사용하면 괄호의 처음으로 이동한다.


3.7. 위치 마크(mark)하기

일종의 북마크기능으로 자주참조할만한 라인을 마킹해두고 필요할때 간단히 해당 마킹지역으로 이동하기 위해서 사용한다. 마킹을 위해서는 명령모드에서 m키를 눌러서 마킹모드로 들어가면 된다. 그리고 영문 [a-zA-Z]키중 아무거나 눌러주면 된다. 만약 a를 눌러주었다면, 현재라인은 a이름으로 마킹된다. 이후 작업을하다가 a마킹라인으로 가고 싶다면 'a 해주면된다. 이상태에서 원래라이으로 되돌아가고 싶다면 ''를 눌려주면 된다.

물론 다중마킹도 허용한다. 마킹할수 있는 문자는 단일영문자이다. 마킹에 사용되는 영문자는 대소문자를 구분함으로 최대마킹가능한 수는 27*2가 될것이다.


3.8. 폴더(접기) 기능이용하기

vim 6.0 에 새로이 포함된 좋은 기능으로 코드의 특정영역을 접을수 있다. 그럼으로 코드를 분석할때 쓸데 없는 부분을 감춰줘서 좀더 편하게 분석이 가능합니다. visual block 를 이용해서 원하는 영역을 선택한다음 :zf 를 이용하면 해당영역이 접힌다. :zo 를 사용하면 접힌영영을 원상태로 복구할수 있고 :zc 를 사용하면 해당영역을 다시 접을수 있다. 또한 다중 접기를 허용해서 접근구역을 다시 접을수도 있다.


3.9. 간단한 man 페이지 참조

vim 을 이용 코딩중에 함수의 프로토 타입이 생각나지 않을때 주로 man page 를 참조하게 된다. 보통은 창을 하나따로 띄워서 그곳에서 man page 를 보는데, 코딩중에 간단하게 해당 함수에 대한 man page 를 볼수 있다. man page 를 원하는 함수 위로 커서를 옮긴다음 Shift + k 를 입력하면 함수의 man page 가 뜰것이다. 'q' 를 입력해서 man page 를 종료시키면 원래의 vim 화면으로 되돌아온다.


3.10. 함수/변수명 자동완성

코딩중에 가장 범하기 쉬운 잘못중의 하나가 변수명및 함수명 오타일것이다. 또 변수명이 기억이 잘 나지 않아서 처음 선언한곳을 다시 확인하는 작업역시 코딩을 매우 번거롭게 한다. 이때 함수 자동완성 기능을 이용하면 이러한 염려들을 줄일수 있다.

int client_sockfd 라고 변수 선언을 했다고 하자. 코딩중에 client_sockfd 를 쓸일이 있다면 cli^p 를 입력해보자. 그러면 변수 이름이 자동으로 완성되는것을 볼수 있을것이다. ^p는 Ctrl+p 이다.


3.11. ctags 를 이용한 쏘쓰 분석

쏘쓰를 분석하는데 있어서 가장 중요한 것은 역시 함수를 분석해서, 함수가 어떤일을 하는지 알아내는 것이다. ctags 를 이용하면 이러한 쏘쓰 분석작업을 좀더 수월하게 할수 있다. ctags 와 관련된문서는 ctags 를 이용한 쏘쓰 분석 을 참고하기 바란다.


3.12. 자동들여쓰기

프로그래밍 할때 indent 는 쏘쓰코드를 보기좋게 만들기 위한 필수 사항이다. 보통 tab 을 주로 쓰는데,

:set ai
			
명령을 이용하면 자동적으로 indent (auto indent) 를 적용시켜주므로, 좀더 코딩에만 집중할수 있도록 도와준다.
:set noai 
			
명령을 사용해서 auto indent 상태를 해제할수 있다.

요즘의 vim 은 기본적으로 auto indent 상태이므로, 별다른 설정없이 편하게 사용가능하다. 그러나 웹에서 가져다 붙이기를 할때 여기에 auto indent 가 적용되어서 것잡을수 없이 tab 이 들어가는 경우가 생길때도 있는데, 이럴때 set noai 를 이용해서 auto indent 를 해제하고 가져다 붙이기를 하면 된다.


3.13. 탭사이즈 조정하기

쏘쓰에서 indent 를 위해서 주로 탭을 사용하는데, 보통 이 탭 사이즈는 8로 되어 있다. 그런데 8이란 탭사이즈가 때로는 너무 커서, 쏘쓰가 화면밖으로 나가서 오히려 쏘쓰 보기를 어렵게 만들때도 있다. 이럴때 는 탭사이즈를 줄여야 하는데 다음과 같은 명령을 통해서 탭사이즈 변경이 가능하다.

:set ts=4
			


3.14. 라인 넘버링

코딩하다보면 라인넘버가 있으면 할때가 있다. 그럴때는

:set nu 
			
하면 된다.

그림 2. 라인 넘버링

라인넘버를 없애고 싶다면,
:set nonu
			
하면 된다.


3.15. 코드를 HTML로 저장하기

vim 은 또한 코드를 HTML 형태로 저장하는 기능을 가지고 있다. 이 기능을 이용하면 syntax highlight 된 상태 그대로 HTML로 변환이 가능하다. 쏘쓰코드의 예제를 만들어서 웹상에 올리고자 할때 유용하게 사용할수 있는 기능이다.

:so $VIMRUNTIME/syntax/2html.vim 
			


3.16. vim 설정파일 만들기

지금까지 우리는 다양한 설정을 통해서 vim 을 좀더 쉽게 사용하는 방법을 알아 보았다. 그런데, 탭사이즈를 적용하기 위해서 vim 을 실행시킬때 마다 ":set ts=4" 이런식으로 하면 작업이 매우 귀찮을것이다. 이럴때는 vim 을 위한 설정파일을 만들어서, vim 이 시작할때 설정파일을 읽어들여서 환경이 자동으로 설정되도록 하면된다.

자기의 계정(Home) 디렉토리에 보면, .vimrc 라는 파일이 존재 할것이다. (존재하지 않는다면 만들도록한다) 이것이 설정파일로 아래와 같은 방법으로 자기가 원하는 내용을 설정하면 된다.

set ts=4
set nu
			

블로그 이미지

유효하지않음

,

NSLOOKUP 사용법

OS/Linux 2008. 7. 25. 17:57

8.1. NSLOOKUP

네임서버를 운영하고 관리하는데 있어 문제를 발견하고 해결하기 위해 Resolver의 입장으로 네임서버를 시험해볼 필요가 있다. 대부분의 시스템에 기본 설치되어 있는 nslookup은 dig와 함께 가장 널리 사용되는 네임서버 질의 도구로써, 도메인 메니저의 기본 무기중 하나이다.

$ nslookup
Default Server:  ns.nobreak.com
Address:  210.105.79.2
> exit

nslookup은 실행후 대화형 프롬프트 '>'를 표시하고 /etc/resolv.conf에 정의된 첫 번째 네임서버를 기본 질의 서버로 설정한다. nslookup은 BIND와 달리 하나의 서버만을 질의에 사용하기 때문에 'Default NS -> Timeout -> Error'와 같이 동작한다.


8.1.1. 도메인 네임 검색

nslookup은 기본적으로 입력된 도메인에 대해 A 레코드를 검색하고, IP 주소(in-addr.arpa)에 대해서는 PTR 레코드를 검색한다. set type=RR 설정으로 A 레코드 이외의 레코드 또한 검색할 수 있으며, RR(Resource Record)에는 A, ANY, CNAME, HINFO, MX, NS, PTR, SOA, TXT 등이 올 수 있다. 이중 ANY는 관련된 레코드들을 모두 출력하라는 약속 기호이다.

> www.kr.freebsd.org.                 # IP 검색
Name:    www.kr.freebsd.org
Address:  150.183.110.39

> ftp.kr.freebsd.org.
Name:    www.kr.freebsd.org           # ftp는 www의 CNAME
Address:  150.183.110.39
Aliases:  ftp.kr.freebsd.org

> 150.183.110.39                      # 도메인 검색
Name:    www.kr.freebsd.org
Address:  150.183.110.39

> set type=MX                         # MX 레코드 검색
> kr.freebsd.org.
kr.freebsd.org  preference = 10, mail exchanger = mail.kr.freebsd.org

> set type=NS                         # NS 레코드 검색
> kr.freebsd.org.                     # 도메인 위임 확인
kr.freebsd.org     nameserver = ns.kr.freebsd.org
kr.freebsd.org     nameserver = ns2.kr.freebsd.org
ns.kr.freebsd.org  internet address = 150.183.110.2
ns2.kr.freebsd.org internet address = 150.183.110.3

> 46.102.39.in-addr.arpa.             # 인버스 도메인 위임 확인
kr.freebsd.org     nameserver = ns.kr.freebsd.org
kr.freebsd.org     nameserver = ns2.kr.freebsd.org
ns.kr.freebsd.org  internet address = 150.183.110.2
ns2.kr.freebsd.org internet address = 150.183.110.3


8.1.2. 기본 쿼리 서버 변경

nslookup은 기본적으로 recurse 모드로 동작하기 때문에, 때론 해당 도메인의 Authority를 갖는 특정 네임서버에 직접 질의를 하여 Authoritative 응답(네임서버의 캐쉬에서가 아닌)을 확인 할 필요가 있다. server, lserver 명령으로 기본 질의 서버를 변경 할 수 있다. 두 명령은 주어진 네임서버의 주소(쿼리가 아닌)를 찾을 때 사용할 질의 서버의 차이인데, server 는 현재의 기본 서버를 통하고, lserver 는 시스템 기본 서버(nslookup 구동시 초기 설정되는)를 사용함이 다르다. lserver 명령은 타 네임서버로 스위칭 한 후, 다시 다른 네임서버로 스위칭하려 하는데, 현재의 네임서버가 동작하지 않아 해당 네임서버의 주소를 검색하지 못할 때 사용한다. 다음을 보자.

$ nslookup
Default Server:  ns.nobreak.com
Address:  210.105.79.2

nslookup 구동시의 기본 서버 ns.nobreak.com 이 lserver 명령에서 주어진 NS의 주소를 찾기위한 질의 서버가 된다.

> server ns.jp.freebsd.org.        # 기본 서버 변경
Default Server:  ns.jp.freebsd.org
Address:  199.100.7.25

> server ns.nobreak.com.
*** Can't find address for server ns.nobreak.com: Non-existent host/domain

ns.jp.freebsd.org를 통해 ns.nobreak.com을 찾을 수가 없다. 이때에는 lserver 명령으로 시스템 기본 서버를 통해 ns.nobreak.com 의 주소를 검색한다.

> lserver ns.nobreak.com.
Default Server:  ns.nobreak.com
Address:  210.105.79.2

루트 네임서버를 질의 서버로 하고자 할 때는, 간단히 root 명령을 사용할 수 있다.

> root
Default Server:  a.root-servers.net
Address:  198.41.0.4


8.1.3. 네임 서버처럼 질의하기

네임서버는 Resolver의 요청을 처리하기 위해, 네임스페이스를 검색하며, 여러 네임서버와 통신을 하는데, nslookup으로 동일한 과정을 밟아보도록 하자. 네임서버가 인터넷상에서 어떻게 동작하며, 네임서버들 간에는 어떤 사건들이 발생하고, 여러분을 위해 무엇을 하는지, 구체적인 느낌을 받을 수 있을 것이다.

그림 8-1. 네임서버처럼 질의하기

사용자 삽입 이미지

(1)
> set norecurse     # Iterative 모드로 전환
> www.kr.freebsd.org.
Server:  ns.nobreak.com
Address:  210.105.79.2

Name:    www.kr.freebsd.org
Served by:
- H.ROOT-SERVERS.NET
          128.63.2.53
          ORG
- B.ROOT-SERVERS.NET
          128.9.0.107
          ORG
...

ORG. 가 관리되는 루트 서버들의 목록을 레퍼런싱 해준다.

(2)
> server h.root-servers.net.
> www.kr.freebsd.org.
Server:  h.root-servers.net
Address:  128.63.2.53

Name:    www.kr.freebsd.org
Served by:
- WHO.CDROM.COM
          204.216.27.3
          FREEBSD.ORG
- NS1.CRL.COM
          165.113.1.36
          FREEBSD.ORG
- NS2.CRL.COM
          165.113.61.37
          FREEBSD.ORG

(3)
> server who.cdrom.com.
> www.kr.freebsd.org.
Server:  who.cdrom.com
Address:  204.216.27.3

Name:    www.kr.freebsd.org
Served by:
- ns.kr.freebsd.org
          150.183.110.2
          kr.freebsd.org
- ns2.kr.freebsd.org
          150.183.110.3
          kr.freebsd.org

(4)
> server ns.kr.freebsd.org.
> www.kr.freebsd.org.
Server:  ns.kr.freebsd.org
Address:  150.183.110.2

Name:    www.kr.freebsd.org
Address:  150.183.110.39


8.1.4. Zone Transfer

해당 도메인의 Zone에 대한 복사본을 얻기위해, Primary로부터 Zone 데이터베이스를 끌어오는 작업을 Zone Transfer라 한다. 이 작업은 주로 Secondary NS 측에서 이루어지며, 때때로 얼마나 많은 수의 호스트가 등록되어 있는지 혹은 Zone의 문법적 오류를 검사하기 위해 관리자가 수동으로 조작하기도 한다. Zone Transfer는 Authority를 갖는 네임서버에 직접 질의하여야 하므로, nslookup 상에서 해당 NS로 질의 서버를 변경한후, ls 명령을 사용한다.

> server ns.kr.freebsd.org.
> ls -t A kr.freebsd.org.      # A 레코드 출력
 kr.freebsd.org.                server = ns.kr.freebsd.org
 kr.freebsd.org.                server = ns2.kr.freebsd.org
 mail                           150.183.110.32
 mqueue                         150.183.110.33
 www                            150.183.110.39
 www2                           150.183.110.40

> ls -d kr.freebsd.org.        # 모든 레코드 출력
 kr.freebsd.org.                SOA   ns.nobreak.com hostmaster.kr.freebsd.org.
                                (1999031501 21600 1800 1209600 86400)
 kr.freebsd.org.                NS    ns.nobreak.com
 kr.freebsd.org.                NS    ns2.nobreak.com
 kr.freebsd.org.                MX    10   mail.kr.freebsd.org
 kr.freebsd.org.                MX    20   mqueue.kr.freebsd.org
 cvsup                          CNAME www.kr.freebsd.org
 mail                           A     150.183.110.32
 mqueue                         A     150.183.110.33
 ftp                            CNAME www.kr.freebsd.org
 ftp2                           CNAME www2.kr.freebsd.org
 ftp3                           CNAME ftp.free.nobreak.com
 www                            A     150.183.110.39
 www                            HINFO Pentium-200  FreeBSD 2.2.8
 www                            TXT  "Korea FreeBSD Users Group"
 www2                           A     150.183.110.40
 www2                           HINFO Pentium-133MHz  FreeBSD 2.2.8
 www2                           TXT  "Korea FreeBSD Users Group"

> ls -t MX kr.freebsd.org > MX-kr.freebsd.org   # 파일로 저장
> view MX-kr.freebsd.org                        # 파일 내용 확인

BIND의 경우 named-xfer라는 외부 프로그램을 사용해 Zone Transfer를 수행한다. 네임서버의 입장에서 부트 파일에 Secondary 설정이 있을 경우의 처리과정을 살펴보자.

secondary       kr.freebsd.org  210.105.79.2    sec-kr.freebsd.org

BIND는 secondary 명령을 만나면 내부적으로 다음과 같이 동작한다.

loop(Interval == TTL) {
        named-xfer -z kr.freebsd.org -f /var/named/sec-kr.freebsd.org -s Current_Serial 210.105.79.2
        switch ( $? ) {      // named-xfer 는 환경 변수 '$?'에 결과를 복귀함
                case 0 : OK; // 시리얼이 같음, Zone Transfer가 필요치 않음
                case 1 : OK; // 시리얼이 증가했음, Zone Transfer가 성공적으로 수행됨
                case 2 : ERROR; // 네임서버를 찾을 수 없음
                                // 혹은 네임서버가 도메인의 Authority를 갖지 않음
                case 3 : ERROR: // 시리얼이 감소했음, 기존의 백업카피 유지
        }
        primary  kr.freebsd.org  sec-kr.freebsd.org
}

보안의 이유로 허락된 곳(예: Secondary NS's IP)에서만 Zone Transfer를 허용하고자 한다면, Primary NS의 부트파일에 다음과 같은 옵션을 준다. (Zone Transfer만을 제한하는 것이기 때문에, 호스트에 대한 개별 쿼리는 허용된다)

xfrnets  210.105.79.3&255.255.255.255  210.105.80.128&255.255.255.128

이것은 BIND-4의 설정예인데, IP 210.105.79.3과 210.105.80.129-254 에서만 Zone Transfer를 허용하라는 의미이다. BIND-4에서는 개별 IP와 서브넷으로 나누어진 블럭에 대해 "IP&Mask"의 형식으로 목록을 작성하며, 클래스 전체를 허용하고자 할 경우엔 210.105.79.0 과 같이 마스크를 생략하여도 된다.

options {
        allow-transfer { localnets; 210.105.79.3; };
};

BIND-8의 경우에 해당 서버가 속한 네트워크와, 210.105.79.3만을 허용한 예이다. localnets는 예약어이며 다른 예약어로는 any, none, localhost 가 있다.


8.1.5. 초기화 파일 .nslookuprc

nslookup은 실행시 ~/.nslookuprc 파일이 존재하면, 내용을 읽어 옵션을 조정한다. 매번 설정하는 옵션이 있다면, 본 파일을 통해 간편화할 수 있겠다.

* .nslookuprc 파일 예
set type=NS
set nosearch
set debug

dig -t AXFR nextguide.net
블로그 이미지

유효하지않음

,

iptables -A INPUT -p tcp --dport 80 -m recent --update --seconds 1 --hitcount 10 --name HTTP -j DROP

- 1초동안 80포트에 똑같은 IP가 10번 이상의 SYN가 들어오면 드랍시킨다.
   이는 정상적인 요청이 아닌 공격으로 간주한다.


iptables -m connlimit -h

# iptables -A FORWARD -m recent --name badguy --rcheck --seconds 300 -j DROP
# iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -m recent
--name badguy --set -j DROP
# iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j DROP
위의 3 줄을 실행하면 가능한데,단순히3번째 룰인
# iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j DROP
만 실행하게 되면,한 IP에서의 동시접속이 30회만 접속을 허용할 뿐 그 이상 접속을 하지
못하지만, 위의 두 룰을 함께 사용하게 되면 동시접속이 30회 이상 초과하는 IP를 dynamic
하게 300초(5분)동안 자동 차단하게 된다. 동시접속수(30) 제한이나 차단시간(5분)은 각자
의 환경에 따라 적절히 설정하면 된다.
이때 과다접속으로 차단된 IP에 대한 정보는 다음과 같이 실시간으로 확인할 수 있다.
# cat /proc/net/ipt_recent/badguy

블로그 이미지

유효하지않음

,