ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Linux] 1. 리눅스 활용을 위한 기본 지식
    CSE/Linux 2015. 8. 10. 15:08

    1.1 리눅스의 사용자 계정

     리눅스(Linux)는 다중 사용자를 위한 운영체제입니다. 여러 사용자가 사용하는 시스템은 비적절한 접근으로부터 시스템을 보호해야 합니다.

     

     따라서 사용자는 사용자 식별자(username or id)패스워드 입력에 의한 접근 허가를 받아야 합니다. 


     사용자의 이름과 패스워드는 /etc/passwd 파일에 수록되어 있습니다. 패스워드의 경우는 암호화되어 저장되어 집니다.


     접속한 사용자의 id는 사용자가 실행시키는 여러 프로그램(프로세스)들에 대해 시스템의 자우너 사용 때의 권한을 결정하는 요소가 됩니다.


     일반 사용자 이외에 시스템의 관리를 위해 시스템 자원에 모두 접근할 수 있는 특수 사용자(super user)가 있는데, 이는 root라는 이름으로 로그인하게 됩니다.


     사용자들은 어떤 자원에 대해 같은 권한을 갖게 하려고 그룹에 소속될 수도 있습니다. 따라서 사용자는 로그인 후 그룹 식별자(id)도 갖게 되는데 사용자의 그룹 id는 /etc/group에 저장됩니다.








    1.2 리눅스의 부팅 과정

     일반적으로 운영체제는 항상 메모리에 상주하는 핵심 부분인 커널(kernel)과 필요 시에만 메모리로 로딩되는 여러 가지 형태의 모듈, 커널 프로세스 및 기본적 응용 서비스 프로그램들로 구성됩니다.


     부팅은 운영체제의 핵심인 커널을 메모리로 로딩하는 과정을 말합니다.


     부팅과정은 하드웨어 시스템의 종류에 따라 방법이 여러가지입니다. 그 중에서 가장 많이 사용되는 x86 계열의 CPU로 예를 들어보겠습니다.


     시스템이 전원이 켜지면 ROM에 저장된 BIOS(Basic Input/Output Service) 프로그램이 실행되어, 시스템의 메모리입출력 장치 등에 대한 기본적인 테스트와 초기화가 이루어 집니다.


     그 이후 BIOS는 지정된 부팅 매체의 정해진 장소(MASTER 부트 레코드로 디스크의 경우 첫 번째 트랙/섹터)에서 커널을 메모리로 적재하는 일을 하는 부트스트랩 로더 프로그램(Bootstrap Loader)을 메모리로 읽어 들입니다.


     이러한 부트 로더는 대표적인 것들로 LILO(LInux LOader), GRUB(GNU GRand Unified Bootloader), RedBoot 등 여러 가지가 있습니다.


     부트 로더가 실행되면 사용자가 원하는 커널을 적재할 수 있습니다. 일반적으로는 /boot 디렉터리의 vmlinuz 커널 이미지 파일이 로드 됩니다.


     vmlinuz는 리눅스 커널의 압축 이미지입니다.


     사용자가 새로 구성한 커널이 있을 때는 대화식으로 그 파일 이름을 주게 됩니다.


     커널 이미지가 메모리로 적재되면 다음과 같은 초기화 과정을 거쳐 시스템을 실행상태로 만듭니다.


      1) 커널 기본 자료 구조, 클럭, 입출력 장치 등 초기화

      2) 가상 메모리 시스템(Page Mapping) 초기화

      3) 최초의 커널 프로세스로서 가상 메모리 관리를 위한 스와퍼(Swapper) 프로세스 생성

      4) 프로세스 식별자가 1이며 최초의 사용자 프로세스인 init 프로세스가 생성, 실행. init 프로세스는 이후의 모든 사용자 프로세스의 선조가 되는 프로세스로, 프로세스를 생성하고 동작을 감시하기 때문에 절대 끝나지 않음.






    1.3 GNU gcc 컴파일러

     GCC는 GNU의 C, C++, Objective-C, FORTRAN, Java, Ada 언어를 위한 컴파일러들과 각 언어를 위한 libstdc++, libgcc 등의 라이브러리 모음으로 오픈 소스 소프트웨어 입니다.

     GCC는 C와 C++에 대해 ANSI C 표준, C99 표준 등을 선택사항으로 제공하고 그 이외에도 여러 형태의 확장된 기능을 제공합니다. 또한, GCC는 사용하는 CPU를 위한 코드뿐만 아니라 다른 타겟 CPU를 위한 코드 생성 즉, 크로스 컴파일(cross compile) 기능도 제공하여, 여러 환경에서의 개발에 필수적으로 사용되는 대표적인 유닉스와 리눅스에서의 개발 도구라 할 수 있습니다.

     GCC의 실행 단계는 매크로 등을 처리하는 전처리(preprocessing), 문법 체크와 중간 코드를 생성하는 front-end 처리, 타겟 CPU를 위한 기계어 코드를 생성하는 back-end 처리, 여러 개의 오브젝트 프로그램을 하나의 실행 파일로 결합 생성하는 링킹(Linking) 단계 등으로 나누어 진행됩니다.


     일반적으로 C 프로그램을 위해서는 gcc, C++ 프로그램을 위해서는 g++를 명령어로 입력합니다.




     1) 소스 파일의 컴파일

       현 디렉터리에 있는 어떤 프로그램 exam1.c 를 컴파일하여 실행 파일을 생성하려면 다음의 쉘 명령을 수행시키면 됩니다.





        $ gcc exam1.c





       이 명령어가 성공적으로 수행되면 현 디렉터리에 "a.out" 이라는 이름의 실행 파일이 생성됩니다. 이러한 a.out을 실행하려면 다음의 쉘 명령을 입력합니다.




        $ ./a.out

       



       이러한 gcc 나 g++는 수 많은 종류의 컴파일 옵션을 제공하는데 이에 대한 상세한 사항은 http://gcc.gnu.org/ 를 참조하기 바라며, 이번 장에서는 중요한 몇 가지의 옵션만 설명하도록 하겠습니다. 

       



     2) 출력 제어 옵션

       gcc의 실행 결과로 생성되는 출력에 대한 제어 옵션들로 구성됩니다.



       -c
         입력 파일을 컴파일이나 어셈블(assemble)만 하여 확장자 .o의 파일로 생성합니다. 파일들에 대한 링크를 수행하지 않아 실행 파일이 생성되지 않습니다.

      
       -S
         기계어 코드 생성 이전의 어셈블리어 파일 생성 단계까지 수행합니다. 확장자를 .s로 하는 어셈블리어 파일이 생성됩니다.


       -o file
         a.out 대신에 주어진 이름의 실행 파일을 생성합니다.

       -v
         컴파일의 각 단계에서 실행되는 명령들과 gcc의 버전 번호를 출력합니다.





     3) 디버깅 옵션

       -g
         운영체제에 정해진 형태의 실행 프로그램 디버깅 정보를 생성하여 프로그램 실행 단계에서 GDB 디버거가 동작할 수 있도록 합니다.




     4) 최적화 관련 옵션

       -O (or -O1)
         컴파일 시간이 그리 많이 걸리지 않는 정도에서 프로그램의 실행 시간과 공간을 줄이기 위한 최적화 컴파일을 수행합니다. 이러한 최적화는 디버깅 단계에서는 굳이 사용할 필요가 없고, 프로그램의 테스팅이 종료된 뒤에 사용하는 것이 좋습니다.

       -O2 and O3
         O 뒤의 숫자가 클 수록 최적화를 위해 많은 요소를 반영하게 됩니다.

       -Os
         프로그램의 크기를 최적화 합니다.


       


     5) 전처리 옵션

       -D name
         name 매크로의 값을 1로 정의합니다.

       -D name=definition
         name 매크로의 값을 definition으로 정의합니다.

       -i dirname
         헤더 파일을 찾는 시스템의 정해진 디렉터리에 dirname을 추가합니다.

     


     6) 링킹 옵션

       -llibrary
         실행 파일 링킹 시에 지정된 라이브러리에서 필요 함수들을 찾아 링킹합니다. 지정된 라이브러리는 /usr/lib와 같은 시트메 라이브러리 및 사용자에 의해 지정된 디렉터리에서 차례대로 찾습니다. 예를 들어 sin 같은 함수를 사용할 경우에는 수학 함수 라이브러리인 libm.a에서 해당 함수를 가져오기 위해 다음과 같은 쉘 명령을 사용합니다.


       $ gcc exam1.c -lm










     

       -Ldirname
         라이브러리를 검색하는 디렉터리 목록에 dirname을 추가합니다. 

       -s
         실행 파일에서 모든 심볼 테이블 정보와 재배치(relocation) 정보를 제거합니다.







    1.4 쉘(Shell)
     시스템에 로그인하게 되면 제일 처음 접하는 게 쉘 입니다. 

     쉘은 입력하는 모든 명령을 해석하고 실행합니다. 현재 시스템에서 사용할 수 있는 쉘은 /etc/shells에 등록되어 있습니다.

     특정 쉘을 사용하고 싶다면 쉘의 설치 후 /etc/shells 에 등록해 주어야 합니다.

     사용자 각자의 쉘은 /etc/passwd 파일의 username 필드 뒤쪽에 등록되어 있습니다.



      1) 리눅스에서 사용 가능한 쉘의 종류
       Bash
         Bourne Again 쉘. 리눅스에서 가장 많이 사용하고 있습니다. POSIX 호환이며 GNU 프로젝트에 의해 만들어지고 배포되고 있습니다.

       csh
         C 쉘. 버클리에서 개발되었습니다.

       ksh
         콘(Korn) 쉘. 유닉스에서 가장 많이 사용되는 쉘입니다. csh로부터 많은 기능을 도입했습니다.

       sh
         Bourne 쉘. 오리지날 쉘.

       tcsh
         확장 C 쉘.

       Zsh
         Z 쉘. 가장 최근에 나온 쉘입니다.



      2) 현재 사용중인 쉘의 확인



       $ echo $SHELL



     


        대부분 리눅스에서는 Bourne Again 쉘인 bash를 사용하고 있을 것입니다. BSD나 다른 계열의 리눅스를 사용하고 있다면 bash가 아닐 수도 있습니다.




      3) 쉘 바꾸기



       $ chsh

       Changing shell for userID.

       Password:

       New shell [/bin/csh]: /bin/bash

       Shell changed.

       $










    1.5 환경정정 설정
     X 윈도우를 설정하는 과정은 크게 두 가지로 나누어집니다. 하나는 하드웨어 설정하는 부분이고 다른 하나는 일반적인 환경 설정입니다.


     1) 하드웨어 설정
      최근 X 윈도우 설정을 위한 하드웨어 설치는 상당히 간단해졌습니다. 

      리눅스가 지원하는 하드웨어 검색 프로그램으로 쉽게 설치할 수 있게 되어 있기 때문입니다. 

      그러나 검색 프로그램에서 찾지 못한 하드웨어는 하나하나 설정해 주어야 하는데 그래픽 카드와 모니터가 그 예가 될 수도 있습니다.


      $ Xconfigurator 를 통해서 X 윈도우에 대해 설정을 할 수 있습니다. 



     2) 환경 설정
    22222  배포판에 따라서 윈도우 매니저가 다르지만, 일반적으로 많이 사용되고 있는 것은 Gnome이나 KDE 일 것입니다. 로그인 창에서 윈도우 매니저를 설정하고 로그인 할 수 있으며 로그인 후 윈도우 매니저의 세부 항목도 개인 취향에 맞도록 수정할 수 있습니다.






    1.6 계층 구조적 파일 시스템

     /bin

      11111일반적인 리눅스 명령어 수행을 위한 실행 파일이 이 디렉터리에 있으며, login, shell 등의 파일도 여기에 있습니다.



     /boot

      LILO 나 GRUB과 같은 부트 로더가 부팅 시 이 디렉터리에 있는 커널 이미지를 사용합니다. 커널 이미지 및 System.map 과 같은 파일이 위치합니다.



     /dev

      이름 그대로 디바이스 노드가 위치합니다. 

      

      이 디렉터리의 파일은 메이저와 마이너 넘버로 각 장치를 구분하며, mknod 명령을 노드를 만들 수 있습니다.


      리눅스는 입출력 장치를 일반적인 파일과 같이 취급할 수 있도록 이 디렉터리를 통해 Devfs(디바이스 파일 시스템)을 제공합니다. 


      Devfs에 대한 상세한 사항은 커널 소스 내의 Documentation//filesystems/devfs 을 참고하시기 바랍니다.




     /etc

      여러 설정파일들이 위치하며 sysinit 스크립트 및 마운트(mount) 할 디스크 파티션 및 파일 시스템을 포함하고 있는 fstab 등이 위치하는 필수적인 디렉터리입니다.




     /lib

      시스템에 있어서 가장 중요한 glibc(c 라이브러리)를 포함하여 모든 라이브러리 파일이 위치하는 곳 입니다. 어떠한 리눅스 명령어도 glibc가 없다면 실행될 수 없습니다.




     /proc

      /proc은 가상 파일 시스템으로 /proc 내의 파일은 커널이 만들어 줍니다. 


      이 디렉터리는 CPU, 프로세스, 메모리, 디바이스, 인터럽트 등과 관련된 여러 가지 유용한 정보를 파일 형태로 가지고 있습니다.


      


     /sbin

      /bin 디렉터리와 마찬가지로 리눅스 명령어가 위치하지만, 이 디렉터리에 위치한 명령어는 시스템 관리와 관련된 것들 입니다. 따라서 일반 사용자의 실행 PATH 경로에는 기본적으로 포함되지 않습니다. init, reboot 등의 명령어들이 여기에 위치합니다.




     /tmp

      이 디렉터리는 각종 작업에서 사용되는 임시 파일들을 위한 디렉터리입니다.




     /usr

      사용자를 위한 공간으로 일반적으로 새로운 프로그램 설치 시에 사용하는 공간입니다.




     /var

      시스템과 관련된 로그파일, 메일이나 lock 파일 등이 위치하는 곳입니다.







    댓글

Designed by Tistory.