쉘 스크립트에서의 사칙연산과 문자열 자르기

Posted by taeho Tae-Ho
2013.10.08 10:00 운영체제

쉘에서 문자열 자르기를 설명하기 전에 쉘에서의 변수의 특징을 먼저 알아 보자.


일반적인 Java나 C와 같은 프로그래밍 언어에서는 변수의 선언과 타입(type)이 무척 중요하다. 선언하지 않고 사용하거나 잘못 참조하거나 잘못 연산하게 되면 엉뚱한 값이 출력되거나 컴파일 시 에러를 팍팍~뿌려댄다. 하지만 쉘스크립트에서는 변수는 선언하지 않으며 타입을 지정하지 않고 사용해도 된다. 


이따금씩 쉘 스크립트를 짜다보면 문자열과 숫자의 취급이 헷갈리곤 한다. C언어나  Java언어에서는 변수에 저장될 값이 숫자냐 문자냐를 무척 따져 형변환을 안해주게 되면 가차없이 컴파일 시 에러를 뿌려주는데 반해 쉘 스스크립트는 거침없이 알아서 연산을 한다.


아래 두 스크립트를 비교해보자.


a=10

b=10


let c=a+b


echo $a+$b=$c                                                                                  --> 출력결과 :  10+10=20


c=$a$b


echo $c                                                                                            --> 출력결과 : 1010


변수 a,b에 10이라는 숫자가 저장된 것으로 생각하겠지만 변수 a와 b는 숫자형으로도 사용이 가능하고 문자열로도 사용이 가능하다. 즉 산술연산식에 변수를 사용하면 숫자로 인식되어 계산되고 문자열 연산에 사용되면 문자열로 인식되어 합쳐지게 된다. 또한 연산의 결과를 받는 변수 c도 연산의 결과에 따라 숫자로 사용되기도 하고 문자로 사용되기도 한다.


아래의 스크립트도 앞의 스크립트와 같은 결과를 보여준다.


a="10"

b="10"


let c=a+b


echo $a+$b=$c                                                                          --> 출력결과 : 10+10=20


c=$a$b


echo $c                                                                                    --> 출력결과 : 1010


변수 a와 b의 초기화에 큰따옴표(")가 사용되어 언뜻 문자열로 사용될 것 같지만 연산식에 따라 숫자로도, 문자열로도 그때 그때 알아서(?) 쉘이 연산을 해준다.


쉘에서 변수의 특징을 이해하였다면 문자열 자르기로 넘어가자.


많은 스크립트 언어와 컴파일 언어에서는 문자열을 합치고 자르는 다양한 이해하기 쉬운 함수를 제공한다. 하지만 쉘에서는 조금 어렵다. 아니 어렵다기보다는 설명이 없이는 난해하다.


자릿수에 의한 문자열 자르기


${var:start:length} 

var : 문자열이 포함된 변수

start : 변수로부터 잘라낼 문자의 시작 번호 (0부터 시작됨)

length : start부터의 잘라낼 문자 갯수. length가 기술되지 않으면 끝까지.


예제 : 

IP="192.168.100.10"


echo "IP : "$IP


echo "12 to 2 : "${IP:12:2}


예제는 위의 하나로 충분하다고 본다.

IP라는 변수에 저장된 문자열 중에서 13번째 부터 2개의 문자열을 잘라내겠다는 의미다. 13번째인데 12가 쓰인 이유는 잘라내기 시작할 start는 0에서 부터 시작하기 때문이다. 일반적인 상식에서는 1이 숫자의 시작으로 생각하겠지만 프로그래밍에서 숫자의 시작은 0인 경우가 많다. 


패턴(구분자) 의한 문자열 자르기


 ${var%pattern}

문자열 변수 var의 끝에서 부터 pattern을 찾아 첫번째로 나타나는 패턴 문자열을 버린다.

 ${var%%pattern}

문자열 변수 var의 끝에서 부터 pattern을 찾아 마지막으로 나타나는 패턴 문자열을 버린다.

 ${var#pattern}

문자열 변수 var의 앞에서부터 pattern을 찾아 첫번째로 나타나는 패턴 문자열을 버린다.

 ${var##pattern}

문자열 변수 var의 앞에서부터 pattern을 찾아 마지막으로 나타나는 패턴 문자열을 버린다. 


음...이해가 쉽게 된다면 당신에게 경의를 표한다. -.- 내 머리는 나빠서인지 왜 이렇게 난해한 기호들을 나열하여 만들었는지 쉘이나 펄을 만든 이들에게 경외심마저 생긴다. 


${     } 는 중괄호{ } 안의 문자열을 처리를 수행하는 연산식이라는 것을 의미한다. 

var는 문자열이 저장된 변수다.

%와 #는 변수(var)에서 pattern을 찾기 시작하는 위치다. %는 문자열의 끝에서부터 pattern을 찾기 시작하며 #은 문자열의 처음부터 pattern을 찾기 시작한다.

pattern 은 잘라낼 패턴이다. 


가장 중요한 것은 pattern인데..... 여기가 좀 헷갈릴 수 있다. 예제를 보자.

[taeho@ncsd shell]$ cat str.sh

IP="192.168.100.10"

echo "IP : "$IP

echo ${IP%.*}


[taeho@ncsd shell]$ ./str.sh

IP : 192.168.100.10

192.168.100


가장 뒷부분을 잘라내서 버린다는 의미에서 패턴에 %를 사용했다.

다음과 같이 문자열을 자를 때 패턴으로 사용될 구분자.(마침표) 로 지정했다. 

와일드카드로 *을 사용했다. 즉 . 으로 시작하는 문자열 패턴이라는 의미에서 .* 인 것이다.

${IP%.*}


 192.168.100.10 에서 .으로 시작하는 문자열 패턴을 찾아 가장 마지막 패턴을 포함하는 문자들을 잘라내 버리는 것이다.


%를 두번쓰면 즉 %%를 사용하면 반대로 처음으로 .* 패턴이 나타나는 부분부터 끝까지를 버린다.

[taeho@ncsd shell]$ cat str.sh

IP="192.168.100.10"

echo "IP : "$IP

echo ${IP%%.*}

[taeho@ncsd shell]$ ./str.sh

IP : 192.168.100.10

192

[taeho@ncsd shell]$ 


pattern에서 %와 #의 차이는 패턴을 찾기 시작하는 문자열의 위치라고 앞에서 이야기했다.

일반적인 문자열이라면 %와%% #과 ##을 써서 동일한 결과를 뽑아낼 수 있지만 특이한 문자열 (예를 들면 맨 앞에 구분자로 사용할 특수문자(/,.| 등)가 있는 경우도 있고 없는 경우도 있을 경우...) 의 경우에는 구별하여 사용해야 한다.


정확한 의미를 이해하려면 여러가지 경우로 테스트해보기 바란다.


이전 포스트 보기 : [unix / linux] shell (쉘)을 이해하자.


신고
이 댓글을 비밀 댓글로

메모리 부하 테스트 프로그램 작성하기 (C언어, malloc()) - 가상메모리의 마술

Posted by taeho Tae-Ho
2013.09.28 15:33 운영체제

또 간만에 C 코딩할 일이 생겼다. 어쩌다 한번씩 코딩을 하다보니 실력이 늘지를 않는건 당연한 일이고 뭐하나 짜려면 시간이 꽤나 걸린다. 하지만 어쩌다 한번 코딩을 하니 재미가 있는건 사실이다. 


이번에 짤 프로그램은 서버의 메모리를 고갈시키는 프로그램이다. 메모리를 할당받았다가 릴리즈하는 작업을 반복하는 프로그램이다. 예를 들어 10개의 프로세스가 각 10 M Byte의 메모리를 100번씩 할당받았다 해제하는 것이다. 


즉 10 M Byte * 10 * 100 = 1 Tera Byte 를 할당받았다 해제했다를 반복하는 프로그램이다. 하지만 메모리의 할당과 해제 만으로는 서버에 거의 부하를 줄 수 없다는 것이 중요하다. 실제로 4G Byte의 메인메모리를 가진 서버에서 1 Tera Byte의 메모리를 할당 받는 프로그램을 실행해도 아무런 문제가 없었다. (CPU 사용율이 1%도 증가하지 않을 것이다. 또한 할당(malloc()) 만으로는 실제 메모리 액세스도 거의 발생하지 않는다. 즉, 부하가 없다.) 


이 포스트를 방문할 정도의 사람이라면 대부분 "가상 메모리 관리"라는  운영체제의 개념을 알고 있을 것이다. 


10개의 프로세스가 10 M Byte의 메모리를 각각 100번 씩 할당 받으면 운영체제는 가상메모리에 우선 할당하고(몇바이트 몇페이지만 할당했다고 표시만 하는 듯..) 프로세스 영역에는 할당된 가상메모리의 각각의 페이지를 관리하기 위한 오버헤드만 기록하고 만다. 그래서 실제로 아래 화면과 같이 ps aux 명령을 실행했을 때 표시되는 메모리 항목 2개의 값중 RSS (RSZ라고도 함) 실제 램에 상주하여 차지하고 있는 메모리의 크기)는 약 4K 정도의 오버헤드 정도만 malloc()에 의해 할당 받을 때 증가한다. 


10개의 프로세스가 10 M Byte를 100번 할당 받는 동안 메모리 사용율은 보통 다음 방법으로 모니터링할 수 있다.


첫번째가 ps aux 명령이다. 그 중에서도 VSZ와 RSS 두 항목이 프로세스별 메모리 사용량가 비율을 표시해준다. 하지만 실제로 해당 프로세스에 할당된 메모리의 양이 아니라 현재 실제로 사용중인 메모리의 양이라고 봐야한다.  즉, 할당 받은 메모리를 언제 사용할지 알 수 없는 것이다.  또한 할당 받은 메모리를 어떻게 사용하고 있는지도 알 길이 없다.



두번째는 vmstat다. vmstat는 ps aux와는 달리 프로세스별 메모리가 아닌 시스템 전체의 메모리 사용량을 보여준다. 



일반적으로 사용하는 세번째 방법이 바로 top 명령이다.

top은 시스템 전체의 메모리 사용율과 CPU사용율이 상위에 랭크되는 프로세스의 메모리 사용량을 모두 보여준다. 단, 여기서도 할당받은 메모리양이 아닌 할당 받은 뒤 실제 사용되는 메모리 사용량을 보여준다는 것을 꼭 기억해야 한다.



이 세가지 툴로 아무리 봐도 할당만 했을 때는크게 달라지는 점이 없다. 1 Tera의 무지막지한 메모리를 할당해달라고 하면 군소리 없이 할당해준다. 그리고 위의 top 화면에서 보이는 Mem의 Used 항목은 할당 받은 양에 비해 너무 작은 양이 증가한다. 


이렇게 많은 메모리를 할당 받았음에도 해당 프로세스의 메모리 사용량을 보면 할당받은 메모리 양보다 너무도 작게 보이는 이유는 할당만 받아놓고 실제 사용하지(접근하지) 않기 때문이다. 또한 실제 접근(사용)하지 않으면 메인메모리(RSS)나 가상메모리(VSZ)를 차지하지 않는다.


할당 받은 메모리를 실제 메모리에 로드하는 방법은 ?


방법은 간단하다. 실제 할당 받은 메모리에 4 K byte 영역마다 한번 씩 실제 액세스를 하는 것이다. 이렇게 4K(1개의 페이지) 마다 실제 액세스(값을 쓰기)하기 시작하면 top의 Mem항목에서 Used 항목의 값이 급격하게 증가하기 시작한다. (당연히 free는 줄어듦) 가상메모리에 할당만 해놨던 메모리의 각 페이지에 값이 저장되므로 실제 메모리에 페이지를 올리기 시작함.)


그리고 실제 메모리가 모두 차게되면 그때부터 Swap의 Used가 증가하기 시작한다. 즉 실제 메모리가 부족하므로 이미 값을 쓴 페이지를 swap 공간으로 내리고 내린만큼 메인메모리를 확보하여 계속 쓰기를 수행하는 것이다. 그리고 Swap의 Used가 Total과 같아지는 순간 더 이상 메인메모리를 확보할 수 없으므로 시스템은 멈춘다. (vi실행 등등 어떠한 작업도 불가능 하다.)


할당만 받았을 때는 실제 데이터가 없으므로 할당받은 것으로 표시만 해둠으로 해서 실 메모리는 4G Byte밖에 없지만 2의64제곱에 해당되는 번지수 만큼 메모리를 할당 받을 수 있지만 4 K마다 실 데이터를 Write 해서 해당 페이지를 실제 사용하면 운영체제는 해당 페이지를 실메모리(램)에 올려두거나 스왑공간에 유지해야 하는데 더 이상 스왑공간조차 모두 사용하게 되면 더 이상 메모리를 확보하지 못하는 상태가 되어 완전한 메모리 사용률 100%를 만들 수 있다.


이제 프로세스의 개수와 하나의 프로세스가 할당 받을 메모리의 양을 적절하게 조절하고 할당과 해제를 반복하면 메모리의 부하를 주는 아주 기본적인 프로그램이 완성된다. 


#include <sys/types.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>


int main(void)

{

  pid_t pid, ppid;

  int intTmp, intTmp2;


  // 생성할 자식 프로세스의 개수

  int intChildsCt = 10;

  //자식프로세스의 PID저장할 목록(불필요)

  int intChilds[10];

  // 프로세스 당 메모리를 할당 받을 횟수

  int intMemAllocCt = 100;

  // 위의 횟수만큼 할당받은 메모리의 포인터를 저장할 포인터배열

  char *cpStr[100];

  // 한번 메모리 할당 받을 때의 메모리 크기(Byte)

  int intMemSize=10240000;


  // 한번 할당받은 메모리를 4K Byte 단위로 나누었을 때의 조각의 개수

  int intPageCt = intMemSize/4096;


  // 부모의 PID 획득

  ppid = getpid();


  pid = 1;


  // 자식 프로세스를 intChildsCT에서 지정한 만큼 반복하여 생성

  for (intTmp=0; intTmp < intChildsCt; intTmp++)

  {

     if (pid != 0) // 부모만 fork()가 실행되도록

     {

        // 자식을 생성(fork())하고 부모프로세스는 pid에 자식 pid를 받음. 자식에게는 0이 리턴됨.

        if ((pid=fork()) < 0)

        {

           printf("%d'th child process fork error\n", intTmp);

           return 2;

        }

        else if (pid != 0) // 부모는 pid를 배열에 저장.

        {

           intChilds[intTmp] = pid;

        }

     }

  }


  // for() 후 부모프로세스가 실행할 루틴.

  if ( pid != 0 )

  {

     printf ("==== ChildProcess List====\n");

     for (intTmp=0; intTmp < intChildsCt; intTmp++)

     {

        printf ("%d'st Child process pid : %d\n", intTmp, intChilds[intTmp]);

     }

  }


  // fork() 후 자식 프로세스가 실행할 루틴.

  if ( pid == 0 )

  {


     printf ("Child Routine...\n");


     // 생성된 자식은 intMemAllocCt에서 지장한 횟수만큼 반복하여 메모리 할당

     // 총 할당받는 메모리는 intChildsCt(자식의 개수) * intMemAlloct(자식 당 할당받을 횟수)  * intMemSize(1회에 할당받을 메모리) 만큼 임.

     for (intTmp2=0; intTmp2<intMemAllocCt; intTmp2++)

     {

        // 메모리를 할당하고 첫 주소를 cpStr[]에 저장. (포인터를 이해하려면 아래 라인을 완전하게 이해해야 함.)

        cpStr[intTmp2] = (char *)malloc(intMemSize);

        // 할당받은 메모리의 모든 바이트에 알파벳 K를 쓴다. (이 라인을 활성화하면 CPU 100% 침.

        // 단, 시스템이 금방 멈추지는 않지만 메모리가 부족하게 되면 멈출 수도 있음.

        //for (intTmp=0; intTmp<intMemSize; ++intTmp) *((char *)cpStr+intTmp)='K';

      

        printf("Child %d , Memory Allocate : %d\n", getpid(), intTmp2);

        sleep(1);


     }

     printf("ppid = %d, getpid = %d\n", ppid, getpid());

     //printf("%s\n", (char*)cpStr);


     // 10초간 대기

     sleep (10);


     // 각 자식 프로세스는 자신이 할당받은 메모리 횟수 만큼에 대해

     for (intTmp2=0; intTmp2<intMemAllocCt; intTmp2++)

     {

        할당받은 메모리를 4096바이트(page (4K))로 나눈 몫의 횟수만큼 (즉 할당받은 페이지의 수 만큼) 반복

        for (intTmp=1; intTmp<intPageCt; intTmp++)

        {

           //각 페이지의 첫번째 바이트에 'K'를 쓴다. 즉 할당받은 모든 페이지를 실제로 접근 발생시켜 실제 사용하는 페이지로 만든다.

 // 아래 라인의 의미를 이해하고 원하는 동작을 하도록 수정할 수 있다면 포인터의 기본을 이해하고 사용할 수 있는 수준이라 볼 수 있음.)

           *((char *)cpStr[intTmp2]+(4096*intTmp)) = 'K';

        }

     }

     // 할당받은 메모리의 모든 페이지를 한번씩 액세스하고 2초간 대기

     sleep (2);


     // 할당받은 메모리를 반환한다.

     for (intTmp2=0; intTmp2<intMemAllocCt; intTmp2++) {

        free(cpStr[intTmp2]);

        printf("pid=%d, %d is free...\n", getpid(), intTmp2);

     }

  }

  //프로그램 종료

  return 0;

}


이 소스를 기반으로 메모리에 다양한 부하를 주는 프로그램을 구미(?)에 맞게 만들면 되겠다.

신고
이 댓글을 비밀 댓글로

쉘 스크립트란 무엇인가?

Posted by taeho Tae-Ho
2013.09.17 10:24 운영체제

예전의 포스트에서 운영체제의 쉘(shell)에 대해 설명했다.


이전 글 : [Unix / Linux] 쉘을 이해하자. 


그리고 간단하게 쉘의 환경변수에 대한 설명도 했다. 운영체제의 개념과 쉘의 개념에 대해 이해했다면 다음은 쉘스크립트를 공부하는 것이 일반적인 Unix/Linux 운영체제를 공부하는 순서라고 할 수 있다.


  • 쉘 스크립트(Shell Script)란 ?

쉘 스크립트를 이해하려면 먼저 스크립트(Script)가 무엇인지 이해해야 한다. 스크립트란 일반적으로 인터프리트(interpret) 방식으로 동작하는 컴파일되지 않은 프로그램이라고 이해하면 된다. 즉 "프로그램의 한 라인을 읽어 해석하고 실행하는 과정을 반복하도록 만들어진 프로그래밍 언어로 작성된 컴파일되지 않은 파일에 저장된 프로그램"이라는 의미다. 조금 어려운가? 그렇다면 다음과 같이 이해하자.


텍스트 형식으로 저장되는 프로그램으로서 한줄씩 순차적으로 읽어 실행되도록 작성된 프로그램이다.


스크립트는 위의 정의(?)와 같다. 그렇다면 쉘 스크립트는 스크립트와 무엇이 다를까? 아마도 이런 말들을 들어보았을 것이다.


쉘 스크립트, 펄 스크립트, 자바 스크립트 등등등....


스크립트라는 단어 앞에 여러가지 수식어(?)가 붙는다. 이 수식어는 바로 스크립트를 읽어 실행해주는 인터프리트 엔진을 말한다고 이해하면 된다. 즉 쉘스크립트는 운영체제의 쉘 즉 bash, ksh, csh 등이 읽어 실행해주는 스크립트 언어이고 펄 스크립트는 perl 이라고하는 인터프리트 엔진이 읽어 실행해주는 스크립트 언어다. 그렇다면 자바 스크립트는 누가 읽어 실행해 주는 스크립트 언어일까? 그것은 바로 인터넷익스플러어와 같은 웹브라우저다. 물론 크롬 브라우저도 자바스크립트를 읽어 실행해준다.


각각의 스크립트 언어들은 문법이 모두 다르기 때문에 호환되지 않는다. 또한 실행파일을 만들때 작성되는 C언어와도 다르다. 


다음은 C언어와 쉘스크립트로 된 똑같은 기능을 하는 프로그램이다.



C 언어와 Shell스크립트 비교


두 프로그램 모두 실행하면 화면에 "hello~ c~"와 "hello~ script~" 한줄을 출력하는 프로그램이다.  하지만 두 프로그램이 파일로 저장된 뒤 실행되기 까지는 여러 차이점이 있다. 그 차이점을 알아보면 다음과 같다.


  • C언어로 작성된 프로그램은 컴파일(Compile)하여 기계어로 변환된 목적파일(Object File)로 만들어준 뒤 링크(Link)과정을 거치고 실행퍼미션(x)을 주어야만 실행이 가능하지만 쉘스크립트로 작성된 파일은 이러한 과정이 필요없고 실행퍼미션만 주면 된다.
  • C언어로 작성된 프로그램은 실행을 위해 컴파일되면 vi, cat 과 같은 명령으로 내용을 확인할 수 없는 바이너리 구조로 변형되지만 쉘 스크립트는 파일의 변환과정이 없다.
  • C언어로 작성된 프로그램은 기계어로 변환되었기 때문에 커널에 의해 실행되지만 쉘 스크립트는 쉘(bash, sh, ksh) 이 한줄씩 읽어 실행한다.
  • C언어로 작성된 프로그램은 정식 프로세스로 생성되지만 쉘 스크립트로 작성된 프로그램은 이름은 보이지만 정식 프로세스는 아니다.

아래는 위의 두 프로그램의 작성과 파일정보를 확인하는 화면이다. 초심자라면 리눅스에서 똑같이 한번 테스트해보는 것도 좋겠다.


hello.c 의 컴파일은  hello.c를 작성한 뒤 다음의 명령을 통해 수행하면 된다.


#  gcc -o hello hello.c

이 명령을 수행하면 실행파일 hello 가 생성된다.


이 내용을 완전하게 이해했다면 쉘 스크립트 작성을 공부할 준비가 어느정도 되었다고 할 수 있다.


다음글 : 쉘스크립트에서의 사칙연산과 문자열 자르기

신고
이 댓글을 비밀 댓글로

FTP 프토로콜의 Active Mode와 Passive 모드

Posted by taeho Tae-Ho
2013.07.28 12:34 운영체제

얼마 전 1회 정보보안기사 필기시험을 치렀다. 시험 준비를 하면서 평소의 내 좌우명(?) 처럼 좋은 남편, 좋은 아빠, 좋은 회사원을 추구하면서 개인적으로 시험공부까지 하려니 하루를 32시간으로 늘리거나 잠안자고도 멀쩡할 수 있는 초능력을 갖고 싶은 마음이 굴뚝 같았다. (물론 이 세가지를 모두 만족할 만큼 하고 있지는 못하다.. -.-)

그런데.. 정보보안기사 시험에 FTP 프로토콜에 대한 문제가 출제되었고 별다른 생각없이 평소 알고 있는 지식을 이용해 가볍게 문제를 맞췄다. 이 문제는 "FTP프로토콜에서 Passive 모드는 서버가 클라이언트에게 알려준 임의의 포트번호로 클라이언트가 접속하는 방식" 이라는 것과 "패시브 모드는 FTP 클라이언트가 서버에게 pasv 커맨드를 보내 설정한다"는 것을 알면 쉽게 풀 수 있는 문제였다.

그런데 시험을 본 뒤 의외로 많은 논란이 일고 있어 깜짝 놀라게 되었다. 

이슈는 "FTP의 패시브모드 사용을 누가 정하느냐?" 였다. 문제상에 분명 "프로토콜 에서" 라고 명시하고 있는데 FTP서버의 설정에서 패시브 모드의 사용 여부를 정하니 답이 "서버" 라고 많은 사람들이 이해하고 있다는데 놀랄 수 밖에 없었다.

이런 논란은 프로토콜이라고 문제에서 제한하고 있는 것을 못보았거나 Protocol과 Client/Server의 개념에 대한 정확한 이해 부족 그리고 Application의 Configuration에 따른 Daemon의 동작방식"에 대해 정확하게 개념을 잡지 못하고 있기 때문에 발생하는 것이 아닐까 생각된다.

FTP의 Active Mode와 passive 모드에 대해 간단하게 정리한다.


FTP는 기본적으로 서버가 TCP/21 포트에서 Listen하고 있는 상태에서 FTP 클라이언트 프로그램이 서버의 TCP/21 포트에 접속한다. 이 때 맺어진 세션을 Control Session 이라고 한다(혹은 Command Session이라고도 함). 그리고 이 세션에서는 실제 파일의 전송이 이루어지지 않는다. 이 세션은 클라이언트와 서버간에 명령과 명령에 대한 응답이 오가는 역할만을 수행한다.

일단 FTP클라이언트가 FTP서버와 Control Session을 맺고 클라이언트가 dir, get, put 등의 명령을 수행하면 실제 데이터를 전송할 Data Session을 생성하게 되는데 이때 부터 Active Mode냐 Passive Mode냐에 따라 통신 구조가 달라지게 된다.

기본적으로 FTP클라이언트가 FTP서버에 접속하면 Active 모드로 동작하게 된다. 만약 패시브모드로 접속하고 싶다면 FTP서버에 로그인한 뒤 명령행에 pasv 명령을 실행하여야 한다. 알FTP등 클라이언트 도구에서 passive 옵션을 체크한 뒤 접속하면 로그인 뒤 pasv 명령을 클라이언트 프로그램에서 자동으로 실행시켜 주는 것이다.

-       Active Mode

클라이언트가 서버의 21(Control Session)에 접속한 뒤 클라이언트가 1024번 이상의 포트를 열고 Listen한 뒤 해당 포트 번호를 서버에게 알려준다. 서버는 전달받은 포트로 20번 포트에서 클라이언트로 접속을 시도하여 데이터 세션을 생성한다.

따라서 서버가 공인망에 있고 클라이언트가 사설망 혹은 방화벽 안쪽에 있을 경우 접속이 불가한 문제가 있다. 

-       Passive Mode

클라이언트가 서버의 21(Control Session)에 접속한 뒤 클라이언트가 서버에게 pasv 명령을 전달하면 서버는 해당 클라이언트의 데이터세션 생성을 위해 1024 이상의 임의의 포트를 열고 Listen한 뒤 해당 포트번호를 클라이언트에게 알려준다. 클라이언트는 전달받은 서버의 포트번호로 접속하여 데이터세션을 생성한다.

따라서 서버 측에서 클라이언트가 접속할 수 있도록 21번 포트 외에 일정 범위의 포트를 Open해 주어야 한다.


끝...


신고
이 댓글을 비밀 댓글로

[unix / linux] shell (쉘)을 이해하자.

Posted by taeho Tae-Ho
2013.07.17 09:32 운영체제

 유닉스나 리눅스를 공부하는 많은 초심자들이 처음으로 부닥치는 어려움이 바로 Shell(쉘) 이다. 이 쉘을 정확하게 이해하지 않으면 유닉스나 리눅스 서버에서 주로 업무를 하는 엔지니어가 되고자 하나 초심자 수준를 벗어날 수 없다. 그만큼 쉘을 정확하게 이해한다는 것은 유닉스나 리눅스의 운영체제를 얼마나 이해하고 있는지에 대한 수준을 가늠하는 하나의 지표로 써도 될만큼 중요하다.

  • 쉘의 정의

쉘(Shell)은 운영체제에서 사용자가 입력하는 명령을 읽고 해석하여 대신 실행해주는 프로그램이다. 여기서 쉘을 Unix나 리눅스에만 있는 것으로 생각한다면 오산이다. Windows 운영체제나 다른 운영체제에도 Shell은 필수적으로 존재한다.

운영체제는 로그인한 사용자가 없다면 하나의 쉘도 실행되지 않는 상태다. 

사용자가 로그인을 시도하면 운영체제는 ID와 패스워드를 받아들이는 로그인 프로그램을 실행하게 되고 사용자가 입력한 ID와 패스워드를 검증한 뒤 정상적인 사용자라면 쉘을 실행하여 사용자 세션을 쉘에게 넘겨준다.

쉘의 역할은 사용자가 입력한 명령을 해석하여 대신 실행해주는 것이다. 쉘의 내부 명령어라면 스스로 실행한 뒤 결과를 화면에 표시해주고 내부 명령어가 아니라면 PATH 환경변수에 지정된 경로에서 입력받은 명령과 같은 파일을 찾아 exec() 시스템콜을 호출하여 실행한 뒤 키보드와 마우스 등의 입력장치와 모니터에 해당하는 표준 출력장치의 제어권을 해당 프로그램에게 넘겨준 뒤 프로그램이 끝날 때 까지 대기하는 역할을 수행한다.

  • 쉘의 종류

Unix나 Linux의 경우 ps 명령을 실행하면 보이는 프로세스 중에서 bash, sh, ksh, csh 등이 쉘 프로그램이고 Windows의 경우 작업관리자에서 볼 수 있는 explorer.exe 가 쉘이라고 보면 된다. Windows의 경우 Explorer.exe 이외에도 cmd.exe가 추가적인 쉘로 지원되는데 이는 원래 DOS 시절의 잔재로서 DOS 호환을 위해 지원된다고 생각하면 된다.

위의 화면이 쉘이 실행중인 화면이다. 위의 화면에선 id 라는 명령어와 ps 라는 명령어 2개가 실행되었고 그 실행결과가 표시되었다. 그리고 각 명령이 실행된 뒤 다시 프롬프트 (#)이 표시되어 다음 명령을 기다리는 화면이다. 이렇게 입력과 실행을 반복하는 형태의 쉘을 대화형 쉘이라고 한다.

ps 명령이 실행된 결과를 보게되면 bash 라는 프로세스가 보이는데 bash가 바로 쉘이다. 프롬프트인 #이나 $를 화면에 보여주고 명령의 입력을 기다리는 역할을 수행한다. 서버에서 사용자 계정을 생성하게 되면 사용자가 로그인할 때 어떤 쉘을 실행시켜주어야 하는지를 지정하도록 되어 있다.bash는 리눅스에서 지원되는 기본 쉘로서 사용자 계정을 생성할 때 쉘을 특별히 지정하지 않으면 기본적으로 지정되는 기본 쉘이다.

여담으로 아주 오래전~?? 서비스되던 천리안이나 하이텔, 나우누리를 기억하는가? 파란 화면에 글자로만 가득찬 화면.. 그 화면이 바로 쉘을 대신하는 프로그램이 실행된 화면이다. 천리안이나 하이텔, 나우누리는 사용자가 텔넷 접속을 할 경우 ID와 패스워드를 검증한 뒤 bash와 ksh 같은 프로그램을 쉘로 지정하여 실행하는 대신 천리안이나 하이텔의 화면을 보여주는 직접 개발한 프로그램을 쉘로 지정하여 서비스를 했던 것이다. 이해가 되는가?



  • 쉘의 환경변수

쉘을 공부함에 있어 가장 중요한 것중 하나가 환경변수의 이해다. 쉘은 여러가지 환경변수를 사용하는데 이 환경변수는 사용자가 임의로 본인의 의지에 따라 값의 변경이 가능하다. 하지만 미리 정의된 환경변수의 이름을 변경해서는 안된다.(변경할 수도 없지만..) 환경변수는 쉘의 종류에 다라 설정하는 방법과 확인하는 방법이 다르다. 리눅스의 기본 쉘인 bash (본어게인쉘)에서는 아래와 같이 env 명령으로 확인할 수 있다. (csh의 경우 set 명령)

쉘은 사용자와 운영체제의 사이에 위치하는 프로그램이다. 사용자가 입력한 명령어를 신속하게 찾고 운영체제와 사용자 그리고 사용자가 실행한 다른 프로그램과의 소통을 위해 사용하는 것이 환경변수다. 

이 환경변수들은 사용자가 읽을 수만 있는 것과 변경이 가능한 것이 있다. 그 중에서 가장 대표적인 환경변수는 PATH가 있다.

 환경변수 PATH는 사용자가 명령을 입력하였을 경우 쉘은 내부 명령어 인지 확인하고 아닐 경우 해당 명령은 외부명령어 즉 실행파일인 것으로 간주한다. 만약 사용자가 /usr/bin/df 와 같이 Full Path를 입력하였다면  /usr/bin 디렉토리에 있는 df란 명령을 바로 실행할 수 있으나 사용자가 df 라고만 입력하였다면 쉘은 df라는 명령어가 어느 디렉토리에 있는지 알 수 없다. 이때 쉘이 df 라는 명령어를 어디에서 찾을 수 있는지를 정의해주는 환경변수가 바로 PATH 다. 위의 화면에서 보면 PATH 환경변수는 다음과 같다. ( echo 명령으로 특정 환경변수만 조회할 수 있다.)

[root@CentOS_100 ~]# echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

PATH 환경변수에는  : (콜론)을 구분자로 하여 여러개의 디렉토리가 나열되어 있는 것을 볼 수 있다. 쉘은 df 라는 명령이 입력되면 해당 명령어의 위치를 찾기 위해 가장 먼저 /usr/kerberos/sbin 디렉토리에 df 가 있는지 확인한다. 만약 없다면 다음에 있는 /usr/kerberos/bin 에서 찾고 거기에도 없다면 /usr/local/sbin 에서 찾게 된다. 이렇게 순서대로 PATH 변수 내의 디렉토리에서 명령을 찾다가 df 라는 명령어가 발견되면 그 파일을 실행시켜주는 것이다.

만약 PATH 환경변수에 지정된 경로에 해당 명령어가 없다면 명령어를 찾을 수 없다는 메시지를 뿌리며 에러를 리턴해준다.

모든 환경변수는 의미를 갖고 있으며 사용법과 환경변수를 참조하는 프로그램도 다양하다. 그리고 환경변수의 값이 잘못되어 있으면 오작동을 하는 경우도 많다. 특히 날짜와 시간을 사용하는 프로그램의 경우 환경변수 TZ (time zone), 펑션키를 사용하는 프로그램의 경우 TERM (Terminal) 환경변수, 한글을 사용하는 프로그램의 경우 LANG (Language) 환경변수 등은 잘못 설정될 경우 문제가 발생하는 경우가 많다.

  • 쉘 환경변수의 설정

쉘의 환경변수는 로그인 할 때 설정된다. 사용자 환경은 프로파일에서 설정되는데 프로파일은 글로벌 프로파일과 계정 프로파일 두가지가 있다. 그리고 이 프로파일의 파일위치와 이름은 운영체제와 쉘의 종류에 따라 조금씩 다르다.

sh, ksh 은 /etc/profile 과 사용자 홈디렉토리의 .profile 이다. 

리눅스의 bash는 /etc/profile과 /etc/bashrc 두개의 파일과 사용자 홈디렉토리의 .bashrc 가 환경변수가 설정될 수 있는 파일이다.

csh 은 /etc/csh.login (Unix 종류와 버전에 따라 다르나 대체로 login 이라는 이름이 붙음. 내용을 보면 확인 가능함)과 사용자 홈디렉토리의 .cshrc 이다.

이 프로파일의 내용을 보면 환경변수를 설정할 수 있는 방법을 짐작할 수 있다. 미리 정의된 환경변수 이외에도 사용자 환경변수를 추가하여 사용할 수 있다. 이 파일에 환경변수를 추가하고 다시 로그인한 뒤 env 명령을 실행하면 추가한 새로운 환경변수가 표시되는 것을 확인할 수 있다.

쉘에 대해 서술하자면 너무도 분량이 많아진다. 하지만 중요한 것은 쉘의 원리를 이해하는 것이 중요하다. 모든 지식이 그렇듯 단편적인 커맨드나 변수 이름만 딸랑 암기하는 것은 운영체제를 이해하는데 전혀 도움이 안되고 그런 지식은 죽은 지식이다. 쉘과 쉘의 환경변수가 어떤 역할을 하는지를 개념부터 이해하는 것이 중요하다. 쉘을 이해하였다면 쉘의 인터프리터 방식의 언어인 쉘스크립트에 대해 공부하는 것이 순서다.

다음편 - 쉘스크립트란 무엇인가?

신고
이 댓글을 비밀 댓글로
  1. 감사합니다
  2. 쉘에대한 상세하고 쉬운 설명 감사합니다!! 자주들를것 같네요 ㅎ

Windows 7에서 노트북의 인터넷 공유하기 (ad-hoc 설정)

Posted by taeho Tae-Ho
2013.06.22 08:31 운영체제

연관포스트 ) 노트북에 추가적인 USB타입 인터넷 공유기 사용하기

오래전에 Windows XP 운영체제에서 유선을 통해 인터넷에 연결된 노트북의 무선랜카드를 adhoc 모드로 바꾸어 다른 무선랜카드가 장착된 노트북을 인터넷에 연결하는 인터넷 공유 설정에 대한 포스트를 올린적이 있다. (http://blogger.pe.kr/82)

그 이후 오랜 시간이 흘러 내가 사용하는 노트북에는 Windows 7 운영체제가 설치되어 있다. Windows 7의 경우 유선인터넷을 공유하고 무선랜카드를 adhoc 모드로 변경하는 작업이 훨씬 쉬워졌다. 


아래 화면처럼 제어판을 통해 네트워크 및 공유센터까지 들어간다.

연결옵션에서 가장 아래쪽에 있는 "무선 애드혹"을 선택한다.

adhoc 연결은 9미터 이내에 있어야 한다고 친절하게 알려준다.. (너...블루투스냐..??)

네트워크 이름과 암호화 방법을 선택한다. 보안키는 잊어버리면 안된다.

준비가 완료되었다고 나온다. 여기서 마치면 안되고... "인터넷 연결 공유 켜기"를 클릭해서 유선 인터넷을 공유하는 설정을 해주어야 한다. Windows XP에서는 수동으로 해주어야 했는데... Windows 7은 자동으로 설정해준다.

완료되었다.

이제 공유된 adhoc 무선 연결을 통해 인터넷에 연결할 노트북에서 무선랜 검색을 하면 지정한 이름의 adhoc 무선랜이 보일 것이다.

그런데....

아뿔싸.... 안드로이드 스마트폰에서는 이 adhoc 무선에 접속할 수 없다. 아무리 와이파이를 검색해도 내가 공유하도록 설정한 adhoc 무선랜이 검색되지 않는다.

구글에게 물어보니...

안드로이드는 초기버전부터 adhoc 무선랜에 연결을 지원을 하지 않는다고 한다. 루팅을 하고 몇몇 설정을 건드리면 adhoc에 접속할 수 있다고는 하는데... 루팅..?? 썩..하고 싶지 않다. 스마트폰의 보안을 약화시기키는 주범이기도 하니 말이다.

노트북의 무선 랜카드가 adhoc 모드와 AP모드를 모두 지원하면 좋겠는데 그렇지는 않고... 방법을 찾아보았다. 역시..방법은 있었다. 그 방법은 다음 포스트에.... ^^


신고
이 댓글을 비밀 댓글로

Solaris10에서 컴파일러 설치하기 및 CD롬 마운트하기

Posted by taeho Tae-Ho
2013.04.02 07:54 운영체제
Solaris 10 x86 을 설치 할 때 몇가지 옵션이 있다. 그 옵션에 따라 1G 남짓의 VMWare 이미지를 만들 수도 있고 7G 이상의 큰 용량의 VMWare 이미지를 만들 수도 있다.
여러 사람에게 배포하는 교육용 VMWare 이미지는 작을 수록 배포가 쉽고 관리도 쉽기 때문에 좋긴 하지만 여러 S/W들.. 예를 들면 Apache라든가 MySQL 이라든가... 컴파일러를 Solaris 10 설치 옵션에서 일일이 골라서 설치하기는 쉽지 않다.

서버보안 교육용 Solaris 10 x86 이미지를 만들 때 확인한 바로는 1G 정도의 용량을 갖는 기본 설치 형태와 5G 정도를 갖는 설치 옵션이 있다. 개발자 용 설치 용량은 6G byte가 넘고 전체 설치는 7G byte가 넘는다. 2~3 G byte 정도의 컴파일러 옵션이 있으면 좋을 텐데...없었다.

그래서 1G byte 남짓의 용량으로 설치하고 Apache, PHP, MySQL을 수동으로 설치 했다

더보기


그리고 나서 간단한 C 소스를 컴파일 할 수 있는지 확인했는데...
이런... 또 오류가 발생한다.


as가 뭔데... 실행을 못한다는 걸까... 이 끝없는 에러와의 싸움은 이제 지겹기도 하지만 모든 IT 업체에서는 기본적으로 이런 문제에 언제나 직면하게 된다. 그래서 엔지니어라는 직업이 필요한 것인데 도대체 엔지니어가 왜 필요한지 모르는 IT업체의 CEO도 있다는 것이 한심하기만 하다.

이쯤에서 필요한 gcc의 옵션하나. 바로 -v 옵션이다. gcc에 -v 옵션을 주면 gcc가 컴파일 하는 과정을 적나라하게 보여준다.


위를 보면 gcc가 컴파일 하는 마지막 단계에서 as라는 프로그램을 실행한다. 아마도 목적코드를 만드는 마지막 단계에서 호출하는 것으로 보아 어셈블러(assembler)가 아닌가 해서 찾아보기로 했다.

그래서 네이년 검색 시작... 그렇지... 이 에러메시지로 검색해보니 쓸만한 정보가 하나도 없다. 도대체 네이년의 검색 DB엔 뭐가 들어있는 건지... 혹시 똥만 들은 건 아닌지 ... -.- 없는게 왜이리도 많은지. 네이면이 문제가  아니면 우리나라엔 정보를 공유하는 엔지니어가 없던가 그것도 아니면 제대로 일하지 않는 엔지니어들만 있는게 틀림없다.

그래서 구글을 뒤져봤다. 역시... 구글의 검색 DB가 훌륭하던가 아니면 외국의 하얀피부의 엔지니어들이 훨씬 일을 열심히 하고 정보공유도 잘하는게 틀림없다.

Solaris 10 의 최소형태로 설치하다 보니 어셈블러가 없는 것이었다. 어셈블러인 binutils 패키지를 설치하라고 친절하게 구글 검색엔진이 알려준다.

어셈블러를 설치하기 위해 sunfreeware.com 에서 어셈블러가 포함되어 있는 binutils 패키지를 다운받았다.

sunfreeware


서버에 FTP로 업로드 한 뒤 gzip으로 압축 풀고  pkgadd -d ./패키지명 으로 설치 했다.
그리고 다시 컴파일을 시도했다.
이번엔 정말 될 줄 알았다. 그런데... 오마이 갓...!!!
또 에러다.


음... 이번엔 뭔가... 살펴보니 values-Xa.o 파일을 Open할 수 없단다. 도대체 이건 또 무슨 파일인가.... 이번에도 네이년부터 검색해봤다. 오~~~ 우리나라 엔지니어 중에도 나와 같이 이 문제를 경험한 엔지니어가 있다. 그리고 정보공유까지 하고 있다. 훌륭한 분이다..

이건 SUNWarc 패키지를 설치해야 한단다. -.-
도대체 몇개를 더 설치해야 하는 건지... 오기가 생긴다.. 끝까지 해보련다.
그런데 이 SUNWarc 패키지는 Sunfreeware.com에 없다. 이 패키지는 Solaris 10 설치 DVD에 있다.
CD를 마운트해야한다.

VMWare에서 CD 마운트는 가상머신 구동중에도 할 수 있다.

vmware cdrom mount


이 화면에서 설치 이미지를 지정하거나 CD롬 드라이브를 지정하면 구동중인 가상머신에서 CD드라이브로 마운트할 수 있다.

VMWare에서 Solaris10 에 Connected 된 CD롬은 볼륨매니저에 의해서도 마운트할 수 있지만 최소설치로 Solaris를 설치하면 볼륨매니저가 설치되지 않는것 같다. 이때는 iostat 명령으로 사용중인 디바이스 이름을 확인할 수 있다.

iostat


iostat -En 명령을 사용하면 위와 같이 연결되어 있는 디스크들의 정보가 나온다. VMWare IDE CDR10 이라고 되어 있는 디바이스, 즉 c1t0d0가 CD롬이다. 용량도 2.1G로 Solaris 10 ISO파일의 크기다.

하지만 mount 할 때는 이 이름을 그대로 사용하면 CD롬을 찾지 못한다고 나온다. 제대로 사용하기 위해서는 위의 디바이스 이름 뒤에 첫번째 슬라이스 즉 s0을 붙여주어야 인식이 된다.

마운트하고나서 다음과 같이 설치한다. 가능하다면 SUNWarc 패키지가 있는 디렉토리를 /var/spool/pkg에 복사하고 pkgadd를 설치하라. 왜냐고..?? 궁금하면 위 DVD의 Solaris_10 디렉토리에 가서 해봐라...

pkgadd


이제 다 끝났을까....
컴파일을 해봤다. 오예~~~ 잘 된다.

이제 교육준비는 다 끝났다.
신고
이 댓글을 비밀 댓글로

[램디스크] 8G 램 활용방법

Posted by taeho Tae-Ho
2012.07.15 20:15 운영체제

PC나 노트북의 하드웨어 가격이 낮아지면서 컴퓨터에 대한 지식을 조금이라도 갖고 있는 사람이라면 무작성 고성능의 CPU와 비디오카드, 대용량의 메모리(램)를 선호하곤 한다. 하지만 정작 고사양의 CPU와 RAM을 제대로 활용하는 사람은 드물다. 디아블로나 스타크래프트 등의 고성능의 VGA를 필요로하는 게임을 하는 것이 그나마 투자대비 잘~(?) 활용하는 경우겠지만 웹서핑이나 동영상 및 음악감상, 그리고 문서작성 정도를 하는 경우라면 사실 4G byte의 램도 충분하다 못해 남아돈다고 할 수 있다.

하지만 그렇게 남아도는 CPU의 성능과 RAM의 용량에 비해 체감적으로 느끼게 되는 컴퓨터의 속도는 사실 그리 빠르지 못하다. CPU도 고사양의 CPU이고 램도 4G 혹은 8G를 달아놨는데 웹브라우징 속도나 부팅속도 그리고 여러 프로그램을 실행시켰을 때의 체감속도는 느리기만 하다. 

그 이유는 대부분 CPU나 RAM에 비해 CPU와 하드디스크, RAM과 하드디스크 간의 굼뜨기만한 데이터 전송 및 읽기/쓰기 속도 때문이다. 이 느린 속도를 개선하기 위해 최근에는 SSD (Solid State Disk or Drive)와 같은 아직은 고가의 디스크를 장착하기도하지만 아직은 가격대비 용량이 일반 하드디스크에 비해 비싸기 때문에 보급형 PC나 노트북에는 장착되지 못하고 있다.

만약 PC나 노트북에 램의 용량이 충분하다면 램디스크를 사용해 볼 것을 권한다. 램 디스크는 SSD보다도 속도가 빠르고 전력도 덜 소비하기 때문에 인터넷 서핑, 프로그램 설치와 제거와 같은 불필요하게 디스크를 지속적으로 사용하면서 컴퓨터의 성능을 저하시키는 작업에 적합하다. 노트북에서 사용한다면 당연히 배터리 사용시간을 늘리는 데도 적합하다고 할 수 있다.

램디스크를 사용하기 위해서는 일단 충분한 램(RAM)을 확보해야 한다.

아래 화면처럼 8GB 혹은 적어도 4GB 이상의 램이 장착되어 있다면 사용할 수 있다고 보면 된다.

64bit 운영체제라면 더 쉽게 램디스크를 만들 수 있다. 32bit xp나 7 운영체제에서는 간혹 트러블로 인해 3GB 이상의 램 영역이 잘 인식되지 않는 경우가 있다.

램디스크를 만들어 주는 프로그램으로는 "램디스크플러스(RamDisk Plus)" 혹은 "데이터램(DataRam)"과 같은 프로그램들이 있다. 본인의 블로그에도 두 프로그램에 대한 소개가 있으므로 참고하기 바란다.

램디스크플러스를 이용해 램디스크를 만들면 아래 화면처럼 생성이 된다.

램디스크

1024 MB 즉 1GB의 램디스크가 X: 드라이브로 생성이 된 화면이다. 탐색기에서는 다음과 같이 보이게 된다.

이렇게 만들어 놓기만 하면 컴퓨터가 알아서 이 램디스크를 사용하는 것은 절대 아니다. 윈도의 여러 설정과 프로그램들의 설정을 변경해 이 램디스크를 임시작업용 디스크로 활용하도록 지정해주어야 한다.


** 계정 및 시스템의 임시폴더(Temp) 변경 **

많은 프로그램들은 윈도에서 지정한 계정 및 시스템의 임시폴더(Temp)에 파일들을 생성하고 관리한다. 이 파일들은 프로그램이 실행될 때 계속 만들어지고 삭제되고 읽고 쓰기 때문에 하드디스크의 속도가 느리거나 운영체제의 하드디스크 읽고 쓰기 작업과 겹치게 되면 프로그램의 실행속도가 답답할 정도로 느리게 느껴진다.

이 임시폴더의 변경은 아래 화면처럼 "환경변수"를 변경해주어야 한다.

램디스크 TEMP

임시폴더(Temp)의 설정은 계정과 시스템 두가지가 있다. 모두 4개 항목의 값을 램디스크 드라이브인 X:로 변경한 화면이다.

이 임시폴더 환경변수는 컴퓨터를 리부팅해야 변경이 되므로 램디스크를 먼저 만들고 환경변수를 변경한 뒤 리부팅하면 된다.


** 인터넷익스플로어의 "임시 인터넷 파일" 폴더 변경 **

대부분의 웹브라우저들은 인터넷 서핑도중 브라우저 화면에 보여주는 웹페이지들을 컴퓨터에 저장해 둔다. 이 때 발생되는 하드디스크의 읽기와 쓰기는 무시하지 못할 수준이 되었다. 특히 우리나라의 웹페이지들 처럼 플래시와 이미지가 많은 웹페이지들은 그 용량도 꽤나 크기 때문에 웹서핑을 많이 하는 사용자라면 이 웹페이지들을 저장하는 임시인터넷파일 폴더를 변경하는 것이 속도 향상에 꽤 도움이 될 것이다.

이 설정은 아래 화면처럼 IE의 설정창을 열어 변경해주면 된다.

램디스크 활용

"폴더 이동" 버튼을 눌러 램디스크의 드라이브로 이동시켜주면 된다. 단, 램디스크의 크기보다 임시 인터넷 파일 폴더의 크기가 당연히 작아야 한다.


** 크롬의 "임시 인터넷 파일" 폴더 변경 **

만약 사용하는 웹브라우저가 크롬이라면 크롬의 단축아이콘에 옵션을 주어야 한다. 크롬의 설정 창을 아무리 뒤져도 별도의 옵션 설정 항목을 찾을 수가 없었다. 

다음 화면과 같이 크롬 실행 단축아이콘에 옵션을 주고 실행하면 자동으로 해당 폴더가 생성된다.

램디스크 크롬


이렇게 윈도의 시스템 설정과 주로 사용하는 응용프로그램들의 설정을 변경해주어야만 힘들여 만들어 놓은 램디스크를 사용하여 PC의 성능을 향상시켜줄 수 있다.

이렇게 생성하고 설정을 변경하면 다음 화면처럼 윈도와 프로그램들이 램디스크를 사용하기 시작한다.


그냥 램디스크만 생성해둔다고 성능개선 효과가 있는 것은 절대 아니다. "구슬이 서말이라도 꿰어야 보배다"라는 옛말이 있듯 갖고만 있는다고 다 좋은 것은 아니다. 잘 활용하기 위해 자신이 사용하는 운영체제와 프로그램에 대해 공부하는 자세가 꼭 필요하다.

-----

2015.04.02 : Windows 8.1에서 램디스크 사용하기 (Temp, 인터넷 캐시 활용 포함)

신고
이 댓글을 비밀 댓글로
  1. 남아도는 램을 활용하는 정말 좋은 팁이네요~^^
    • 퍼온모양
    • 2012.08.18 02:31 신고
    없어
    • kdw959
    • 2012.10.19 15:13 신고
    좋은정보 감사합니다
    램디스크가 이렇게빠른줄은 몰랐네요 ㅎㅎㅎㅎㅎㅎㅎ
  2. 이미 64비트운영체제로 모두 바꾸었습니다. ㅎㅎ

    하지만 32비트 운영체제 쓰는데 메모리 많이 달아 놓으신 분은 유용한 정보겠네요.
    • 64bit 윈도를 써도 8G 정도 램이라면... 램디스크를 쓰시는게 더 효과적일 수 있습니다~

[hiberfil.sys] C 드라이브의 정체불명의 hiberfil.sys 파일 없애기

Posted by taeho Tae-Ho
2012.04.03 11:37 운영체제

노트북을 사용하다보면 C: 드라이브의 용량을 어떻게 설정해야할지가 중요한 이슈로 부각되곤 한다. 노트북에는 일반적으로 하나의 HDD가 설치되기 때문에 초심자들은 중요한 문서파일, MP3 등등 데이터 파일을 C: 드라이브에 운영체제와 함께 보관하곤 한다.

하지만 PC를 조금 써본 사람들은 C: 드라이브를 C:와 D: 드라이브로 분리하여 C:에는 운영체제와 기본적인 프로그램들을 설치하고 D: 드라이브에 문서나 이메일 등등 파일을 저장한다.  이때 C: 드라이브의 크기는 Windows 7의 경우 60G Byte 정도면 충분하다고 보는 것이 일반적이다.

내 노트북의 경우....

 

위와 같이 운영체제와 기본적인 프로그램들(Office, HWP, VMWare 등등) C:에는 약 38G 바이트 정도를 차지하고 있다. (개발툴 제외) 그리고 여유공간으로 20G 정도가 남아있는 것을 볼 수 있다.

그런데 대부분의 노트북은 절전모드와 최대절전모드라하여 Windows 운영체제를 종료하지 않고 최소한의 전력만을 유지하는 일종의 Sleep 모드를 지원한다. 이때 노트북은 Windows 및 응용프로그램이 실행중인 상태 그대로를 디스크에 파일로 저장하고 CPU와 메모리의 최소한의 전원만 공급한 채 다른 하드웨어 자원에 공급되는 전원을 모두 차단한다.

하지만 이 기능을 사용하기 위해서는 램의 크기와 동일한 정도의 크기의 임시 저장파일을 유지해야 한다. 그 파일이 바로 hiberfil.sys 파일이며 C: 드라이브에 항상 생성되어 있다. 

 

내 노트북의 경우 램이 8G 이고 램드라이브를 1G를 잡았기 때문에 hiberfil.sys 파일은 약 6G정도로 생성되어 있다. C: 드라이브 60G Byte의 약 10%에 해당되는 거대한(?) 크기다.

만약 절전모드를 사용하지 않는다면 이 파일을 없애도 무방하다. 하지만 이 파일은 그냥 삭제한다고 사라지지는 않는다. 이 파일을 없애기 위해서는 절전모드를 사용하지 않는 것으로 시스템 설정을 변경해주어야 한다.

절전모드를 해제하기 위해서는 CMD 창을 실행한 뒤 관리자 권한에서 다음의 명령을 실행하여야 한다. 

만약 권한 오류가 발생한다면 도스창을 관리자 권한으로 실행하여야 한다. 이 명령을 실행하여 성공하는 순간 hiberfil.sys 파일은 자동으로 삭제되며 디스크의 여유공간은 아래 처럼 hiberfil.sys 파일의 크기만큼 (아래의 경우 6G Byte) 늘어나게 된다.

 

 

신고
이 댓글을 비밀 댓글로
  1. 좋은 정보 잘 얻고 갑니다.^^
  2. 급할때 잘 사용했네요.
    감사합니다.
    :)
    • 감사합니다
    • 2013.05.26 09:29 신고
    덕분에 10GB확보했네요 ㅋㅋ

[램드라이브] Windows 7 64bit 에서 RAMDISK 사용하기

Posted by taeho Tae-Ho
2012.04.02 23:15 운영체제

32bit Windows 운영체제는 기본적으로 3G Byte 이상의 메모리(램) 영역의 주소를 어드레싱 할 수 없다. 하지만  PAE(physical address extend) 기술을 적용하면 3G Byte 이상의 메모리 주소를 접근하여 사용할 수 있다. 하지만 이는 어디까지나 운영체제의 기능일 뿐 32bit 운영체제에서 동작하는 프로그램들은 여전히 단일 프로그램의 주소 영역으로는 3G Byte 이상의 메모리를 사용하는 것은 불가능하다.

때문에 많은 사람들이 운영체제의 기능을 확장하여 3G Byte 이상의 메모리를 운영체제가 RamDisk로 사용하도록 설정하여 놀고 있는 메모리를 활용하고 있다.

하지만 4G Byte가 아닌 8G Byte 혹은 그 이상의 메모리를 모든 어플리케이션들이 직접 액세스할 수 있는 64 bit 운영체제에서는 어떨까? 과연 64bit 운영체제에서 RamDisk의 사용이 효용성이 있을까?

많은 사람들이 64bit Windows에서는 RamDisk를 사용하는 것은 별 효과가 없다고 이야기들을 하고 있다. 하지만 난 64bit Windows에서도 메모리만 충분하다면 RamDisk(램드라이브)를 사용하는 것이 좋다고 말하고 싶다. 아무리 64bit Windows를 사용한다해도 디스크의 IO속도는 램의 액세스속도를 따라가지 못한다. 그것은 SSD를 쓴다해도 마찬가지다. SSD도 램디스크의 속도는 따라갈 수 없다.

따라서 Temporary Internet 폴더나 운영체제의 TEMP 폴더, 그리고 사용자 계정의 TEMP 폴더를 램디스크로 지정하여 사용하는 것을 권하고 싶다.

Windows 7 32bit 운영체제에서 램디스크를 사용하는 방법은 앞의 포스트에서 설명하였으므로 생략하고 Windows 7 64bit 운영체제에서 RamDisk를 설정하여 사용하는 것을 바로 설명하겠다.

이번에 사용하게 될 RamDisk S/W는 프리웨어다. 이름은 Dataram 사의 RAMDisk다.


먼저 다음의 주소에서 다운로드를 받는다. ( http://www.dataram.com ) 그리고 다음과 같이 다운로드 링크를 찾아 다운로다 받고 저장한다.


다운로드 받고 설치는 아주 단순하다.

설치를 한 뒤 "시작" 메뉴에 들어가보면 다음 화면과 같이 램디스크 프로그램이 설치되어 있다.


설치된 램디스크 프로그램의 설정 유틸리티를 실행한다. 설정 유틸리티를 실행하면 아래 창과 같이 광고가 하느 뜬다. 설정한 이후에는 볼일이 거의~ 없으므로 무시하고 지나간다.


먼저  Settings 메뉴를 실행하여 아래와 같이 램디스크의 용량과 파티션 타입, 그리고 부트섹터 선택 창이 뜬다. 본인은 램이 8G Byte이어서 1024 M Byte만 램디스크로 설정하였다. 파일시스템 포맷은 당연 FAT32 설정하고 부트섹터세팅은 Windows boot Sector로 지정한다.

다음 페이지는 운영체제의 TEMP 폴더를 만들 것인지를 정의한다. 또한 생성된 램디스크의 이름도 지정하도록 한다. 만약 PC를 끄기전의 램디스크에 저장된 파일의 상태를 보존하기 위해서는 Load Disk image at Startup과 Save Disk Image on Shutdown 메뮤를 클릭해주면 된다.

다음은  Options 페이지이다. 백업과 램디스크의압축에 관한 옵션이다. 난..그냥 체크를 없애버렷다. ㅋㅋ


그리고 난 뒤 위의 화면에 있는 "Start RAMDisk" 버튼을 클릭하여 실행하면 잠시 후 아래화면과 같이 RAMDISK 드라이브가 잡힌다. 그리고 아래 오른쪽 화면은 IE의 임시 인터넷 파일 폴더를 램디스크로 이동한 화면이다.

만약 운영체제의 TEMP 폴더와 사용자 계정의 임시폴더를 세팅하기 위해서는 "내 컴퓨터"의 속성, 그리고 "고급" 시스템 설정에서 "환경변수"로 가서 사용자 계정의 TEMP, TMP 그리고 운영체제의  TEMP 폴더를 변경해주면 된다.

이후에는 리부팅 될 때마다 자동으로 램디스크가 생성된다.




신고
이 댓글을 비밀 댓글로