Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

터미널의 작업결과를 파일로 남겨야 합니다

  • ps라든지 vmstat(12), time(2) 등의 과정을 파일로 남겨야 합니다(나중에 결과 분석을 위해서). 어떻게 남겨야 할지요.
명령어 라인의 진수에서 interactive 부분을 참고하시길

터미널 종료 후에도 스크립트가 작동되게 하려면

Linux(:12) 운영체제(:12) 경우에는 터미널을 종료하면 쉘 스크립트가 백그라운드로 돌아가는 것을 볼 수 있다. 그러나 솔라리스와 같은 다른 Unix(:12) 운영체제는 터미널의 종료와 함께 쉘 스크립트도 죽어버리는 경우가 있다. 정확히는 운영체제의 차이라기 보다는 쉘의 차이라고 봐야 할것이다. 쉘이 터미널을 잃으면서, 자신의 모든 자식 프로세스에서 SIG_HUP 시그널(:12) 날리는데, 이 시그널을 받으면 기본동작이 프로세스 종료된다. 쉘 스크립트를 데몬(:12)과 같이 작동시키고자 할경우 문제가 된다.

이럴 때는 nohup(1)명령을 사용하도록 한다. 이 명령은 SIG_HUP에 대해서 반응하지 않도록 하므로, 터미널을 빠져나가도 백그라운드 상태에서 계속 실행되게된다.
# ./nohup myshell.sh

nslookup은 되는데 ping "도메인"이 안되는 경우

  • 솔라리스 사용자 입니다. nslookup으로 도메인(:12)명에 대한 IP(:12)를 찾을 수 있는데, 동일한 도메인에 대해서 ping(:12)으로 하면 안되는 군요. 물론 /etc/resolv.conf는 제대로 설정이 되어 있습니다.
/etc/nsswitch.files에 다음과 같이 되어 있는지 확인해 보세요.
... 선략 ...
group:      files
hosts:      files    dns
ipnodes:    files
... 후략 ...
hosts 에 반드시 dns가 포함되어 있어야 합니다. 이 뜻은 호스트이름에 대해서 검색을 할때 우선 파일(/etc/hosts)을 참고하고 그 다음 dns를 참고하라는 뜻입니다. 저도 이것 때문에 고생한 적이 있어서 -.-;;

특정한 문자열을 포함한 파일 출력

  • 보통 grep를 이용해서 특정한 문자열을 포함한 파일을 얻어오는데, 이경우 파일 이름뿐만 아니라 내용까지 몽땅 가져옵니다. 파일이름만 가져올 수 있는 방법이 없나요 ?
# grep -Hl '#include' *.c

특정 디렉토리 밑의 모든 파일에 대한 링크 생성

  • 파일 몇개씩 링크 거는건 문제가 안되는데, 특정 디렉토리 밑에 있는 백수십개의 파일을 링크(:12)걸려니 장난이 아닙니다. 간편하게 링크 걸 수 없을까요 ?
이 경우 스크립트언어를 이용해서 작업을 해야 합니다. shell, perl, python등 다양한 언어중 하나를 선택해서 작업할 수 있는데, 저의 경우 perl이 익숙하기 때문에 perl로된 프로그램을 하나 만들었습니다.
#!/usr/local/bin/perl

($ext,$dir) = @ARGV;

open(FD, "ls -1 $ext |");

while( $line = <FD> )
{
    chop($line);
    $ln_name = $dir."/".$line;
    #print "ln -s $line $ln_name\n";
    system("ln -s $line $ln_name");    
}
# ./makelib.pl \*.so test2_dir

time zone 설정

  • timezone이 ROK가 아니라서 자꾸만 시간이 틀어집니다. timezone을 ROK로 설정하는 법좀 알려주세요.
/usr/share/zoneinfo 밑에 보면 각각의 timezone정보를 저장하고 있는 파일들이 있습니다. 우리나라에 맞는 timezome은 /usr/share/zoneinfo/Asia/Seoul입니다. 이 파일을 /etc/localtime에 링크 시키면 됩니다. 그리고, 이 파일과 /usr/share/zoneinfo/ROK 파일은 완전히 동일합니다. 어느것을 사용하셔도 무방하겠습니다.
# ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

열수 있는 파일 갯수 제한 늘리기

  • 보통 유닉스의 열수 있는 파일 갯수 제한은 1024인걸로 알고 있습니다. 그리 작은 숫자는 아닌것 같은데 네트워크:::프로그래밍(:12)을 하다 보니 1024를 넘기는 경우도 고려해야 하더군요. daemon(:12)을 여러개 띄우는 방법도 있겠지만 프로그램이 복잡해 질것 같고, 제한을 늘리는게 좋을것 같은데 좋은 방법이 있는지요.
  1. 먼저 /etc/security/limits.conf파일을 다음과 같은 내용을 추가합니다.
       *       soft    nofile  1024
       *       hard    nofile  4096
2. /etc/pam.d/login에 다음 라인을 추가한다.
   session required /lib/security/pam_limits.so
3. /etc/rc.d/rc.local에 다음 라인을 추가해서 시스템이 부팅할 때마다 설정이 적용되도록 한다. 혹은 쉘에서 직접 실행 시켜도 된다.
   echo  8192 > /proc/sys/fs/file-max
   echo 24576 > /proc/sys/fs/inode-max
4. 위의 내용이 시스템에 반영되도록 한다.
   ulimit -n unlimited (bash)
또는
   unlimit descriptors (csh, tcsh).

시스템의 인터넷주소 (IP) 변경

  • 시스템의 IP주소를 변경해야 합니다. 관리도구를 사용할 수도 있지만 배포판 마다 관리도구가 달라서 도대체가 감을 잡을 수가 없군요. 시스템파일과 명령어들을 이용해서 직접 변경가능할 것 같은데, 방법 부탁드립니다.
  1. /etc/sysconfig/network-scripts 밑에 있는 네트워크 인터페이스 설정 파일을 수정하면 됩니다. 이 디렉토리 밑에 보면 인터페이스 이름별로 설정파일이 있습니다. eth0이라면 ifcfg-eth0이런식입니다. 이파일을 아래와 같이 편집한다음
    DEVICE=eth0
    BOOTPROTO=static
    IPADDR=192.168.0.111
    NETMASK=255.255.255.0
    GATEWAY=192.168.0.1
    ONBOOT=yes
ifup, ifdown 이라는 스크립트를 이용해서 인터페이스를 올리고 내리면 됩니다. ifup은 인터페이스를 올릴때, ifdown은 내릴 때 사용합니다. 주소를 변경하기 원한다면 위 설정파일을 편집한다음 ifdown을 이용해서 인터페이스를 내리고 ifup을 이용해서 인터페이스를 올리면 됩니다. 이때 주의할 점은 ifdown을 해버리면 터미널이 끊겨 버리므로 ifup을 못하게 되고.. 결국 원격지 호스트까지 뛰어가서 ifup을 해줘야 하는 사태가 발생할수 있다는 겁니다. 고로 ifdown후 ifup이 자동적으로 실행되도록 해야 합니다.
# ifdown eth0; ifup eth0
이렇게 하면 터미널이 끊기더라도 ifup이 실행되니 새로운 IP로 다시 연결할 수 있습니다.

2. 유닉스는 ifconfig라는 인터페이스 설정도구를 제공하는데 이것을 이용하는 방법도 있습니다.위의 ifup,ifdown스크립트를 이용하는건 편하긴 하지만 솔라리스와 같은 다른 유닉스에는 적용하기가 힘들다는 단점이 있습니다. ifconifg는 대부분의 유닉스에서 공통적으로 사용하는 인터페이스 설정도구이므로 익혀두면 어디에서든지 사용가능합니다. -계속-

하드디스크의 내용을 다른 하드디스크로 전부 복사하기

  • 리눅스가 설치된 하드디스크의 모든 내용을 전부 다른 하드디스크로 복사하고 싶습니다. 단지 데이터만 복사되는게 아닌 실제로 부팅까지 가능하도록 만들고 싶습니다.
/* ToDo 내일 알아내야 함. dd를 이용할 수 있음

Unix시간 동기화

  • 여러대의 서버에서 프로그램들이 돌아가고 서로 TCP/IP(:12)를 이용해서 통신을 합니다. 문제는 서버의 시간들이 제각기 다르다는 겁니다. 이들 서버를 표준시간으로 동기화 시키고 싶습니다.
이러한 시간동기화 문제를 위해서 time서버가 존재합니다. 클라이언트 측에서는 이 time서버에 연결해서 정확한 현재 시간을 얻어오고 얻어온 시간으로 클라이언트 시스템의 시간을 설정하는 방식으로 시간 동기화를 실현합니다. 유닉스는 rdate라는 명령을 사용하면 됩니다. 각 지역의 time서버를 지정할 수 있습니다.
# rdate -s time.bora.net

호스트에 접근한 IP주소에 대한 정보 알아내기

  • 특정 IP로 부터 계속적인 연결이 있습니다. 이 IP에 대한 자세한 정보(위치, 관리기관)등을 알아낼수 있는 방법이 있는지 궁금합니다.
whois 라는 프로그램을 사용하시면 됩니다. whois는 IP정보를 관리하는 기관에게 해당 IP에 대한 정보를 요청하고 결과를 출력해 줍니다.
# whois -h whois.apnic.net 211.164.22.158 
[whois.apnic.net]
% [whois.apnic.net node-1]
% Whois data copyright terms    http://www.apnic.net/db/dbcopyright.html

inetnum:      211.164.22.0 - 211.164.23.255
netname:      ZHWGNET
descr:        custom of CGWNET in ZHUHAI
country:      CN
admin-c:      LN11-AP
tech-c:       ZF31-AP
mnt-by:       MAINT-CNNIC-AP
changed:      zhoufp@cgw.net.cn 20010320
status:       ALLOCATED PORTABLE
source:       APNIC

person:       Li Nanjin
address:      No. 20,  Fuxing  Road,   Beijing
country:      CN
phone:        +86-010-66816508
fax-no:       +86-010-66813421
e-mail:       lnj@cgw.net.cn
nic-hdl:      LN11-AP
mnt-by:       MAINT-CNNIC-AP
changed:      ipas@cnnic.net.cn 20010112
source:       APNIC
....

CD데이터 굽기

CD를 굽는 여러가지 도구가 있긴 하지만 여기에서는 콘솔프로그램인 cdrecord(:12)를 이용하는 방법에 대해서 알아보도록 하겠다. X를 띄우기 어려운 상황에서 유용하게 사용할 수 있다.

굽고자 하는 데이터를 raw데이터로 만든다.
# mkisofs -R -o cdimage.raw /home/backup_data

CD로 굽기 전에 raw 데이터가 제대로 만들어졌는지 mount를 통해서 확인한다.
# mount cdimage.raw -r -t iso9660 -o loop /mnt/testiso

scanbus 옵션을 이용해서 장치버스를 찾아낸다.
# cdrecord -scanbus                      
Cdrecord 1.10 (i686-pc-linux-gnu) Copyright (C) 1995-2001 Jrg Schilling
Linux sg driver version: 3.1.20
Using libscg version 'schily-0.5'
scsibus0:
        0,0,0     0) 'PLEXTOR ' 'CD-R   PX-W1210A' '1.08' Removable CD-ROM
        0,1,0     1) *
        0,2,0     2) *
        0,3,0     3) *
...

이제 굽는다.
# cdrecord -v sepeed=4 dev=0,0 cdimage.raw
위의 dev에 들어가는 값은 scanbus로 찾아낸 값이다.

시디가 정말로 제대로 구워졌는지 mount시켜서 한번 확인해 보도록 하자.
# mount /dev/scd0 /mnt/cdrom

좀더 자세한 내용은 [mz_cdrw]를 참고하기 바란다.

문제 해결

SUN Os 6 에서 socklen_t undeclared 에러 발생

  • Sun6.0에서 gcc(12)3.3.2를 이용해서 소켓프로그램을 컴파일 하는데 다음과 같은 에러가 발생했습니다. Sun7,8,9 및 linux에서는 문제없이 컴파일 되는 코드입니다. 해결방법을 알려주세요.
    comm.cc:142: error: `socklen_t' undeclared (first use this function)
Sun6.0에는 socklen_t가 선언되어 있지 않습니다. 저는 소스파일에 다음과 같은 라인을 추가하는 걸로 문제를 해결했습니다.
#ifndef socklen_t 
typedef unsigned int socklen_t;
#endif
...

응용프로그램 설정 FAQ

X를 기동하는데 XF86Config의 설정을 전혀 모르겠습니다. 간단하게 할수 있는 방법 없는지요?

  • XFree86 4.x.x 이상에서는 다음과 같이 하여 자동으로 설정파일을 검색하여 얻을수 있습니다.
    bash# XFree86 --configure
    bash# cp /etc/X11/XF86Config /etc/X11/XF86Config.backup
    bash# cp /root/XF86Config.new /etc/X11/XF86Config

apache 서버 디렉토리 인증

  • apache를 웹서버로 사용하고 있습니다. 특정 디렉토리에 대해서 인증을 해야지만 진입하게 하고 싶은데 어떻게 해야 하는지요.
일단 httpd.conf에 다음과 같은 내용을 추가합니다.
...
<Directory />
    Options FollowSymLinks
    AllowOverride AuthConfig 
</Directory>
...

# 인증 디렉토리에 놓일 인증 파일 
# 이 파일의 정보를 토대로 인증을 건다.
AccessFileName .htaccess

이제 인증을 걸고자 하는 디렉토리에 .htaccess파일을 만들면 됩니다.
AuthName "admin"
AuthType Basic
AuthUserFile /usr/myapache/conf/htpass
require valid-user
AuthUserFile를 주의해서 확인하시기 바랍니다. 여기에 설정된 파일이 인증과 관련된 아이디와 패스워드를 저장하는 파일입니다.

이제 AuthUserFile의 파일에 아이디와 패스워드를 저장하면 됩니다. 이것은 htpasswd라는 명령어를 이용하면 됩니다.
# htpasswd -c /usr/myapache/conf/htpass yundream
New password: 
Re-type new password: 
Adding password for user yundream
/usr/myapache/conf 밑에 htpass라는 파일이 생성된걸 확인할 수 있을 겁니다. -c옵션은 인증정보파일을 새로 생성하라는 옵션입니다. 새로 생성하지 않고 유저만 추가하려면 -c 옵션을 빼고 사용하시면 됩니다.

http://www.joinc.co.kr