제2장 리눅스 활용을 위한 기본 지식
2.1 리눅스의 사용자 계정
리눅스는 전술한 바와 같이 다중 사용자를 위한 운영체제이다.
여러 사용자가 사용하는 시스템은 비적절한 접근으로부터 시스템을 보호하여야 한다. 따라서 사용자는 사용자 식별자(username 또는 id)와 접속키(password) 입력에 의한 접근 허가를 받아야 한다.
이러한 과정을 로그인(login) 절차라 한다. 사용자의 이름과 접속키는 /etc/passwd 파일에 수록된다.
접속 키의 경우는 물론 암호화 되어 저장된다. 접속한 사용자의 id는 사용자가 실행시키는 여러 프로그램(프로세스)들에 대해 시스템의 자원 사용 때의 권한을 결정하는 요소가 된다.
일반 사용자 이외에 시스템의 관리를 위해 시스템 자원에 모두 접근할 수 있는 특수 사용자(super user)가 있는 이는 root라는 지정된 이름으로 로그인하게 된다.
사용자들은 어떤 자원에 대해 같은 권한(파일 공유 등)을 갖게 하려고 그룹에 소속될 수 있다. 따라서 사용자는 로그인 후 그룹 식별자(id)도 갖게 되는데 사용자의 그룹 id는 /etc/group에 지정된다.
사용자의 식별자나 그룹 식별자로 보호 시스템의 의해 주어지는 접근 권한의 대표적인 예는 파일에 대한 접근 권한을 들 수 있다.
2.2 리눅스의 부팅 과정
일반적으로 운영체제는 항상 메모리에 상주하는 핵심 부분인 커널과 필요 시에만 메모리에 로딩되는 여러가지 형태의 모듈, 커널 프로세스 및 기본적 응용 서비스 프로그램들로 구성된다. 부팅은 운영체제의 핵심인 커널을 메모리로 로딩하는 과정을 말한다.
하드웨어 시스템의 종류에 따라 부팅 방법은 여러가지다.
가장 많이 사용되는 x86 계열의 부팅(booting) 과정
시스템의 전원이 켜지면 ROM에 저장된 BIOS(Basic Input/Output Service) 프로그램이 실행되어 시스템의 메모리나 입출력 장치 등에 대한 기본적인 테스트와 초기화가 이루어진다.
그 이후 BIOS는 지정된 부팅 매체(하드 디스크, CD, Flash Memory)의 정해진 장소에서 커널을 메모리로 적재하는 일을 하는 부스트랩(bootstrap) 로더(또는 부트 로더) 프로그램을 메모리로 읽어 들인다.
이러한 부트 로더(Boot Loader)는 대표적인 것들로 LILO(Linux Loader), GRUB(GNU gRand Unified Bootloader), RedBoot 등 여러 가지가 있다.
부트 로더가 실행되면 사용자와의 대화를 통해 원하는 커널을 적재할 수 있으나 일반적으로는 /boot 디렉토리의 vmlinuz는 커널 이미지 파일이 로드된다. vmlinuz는 리눅스 커널의 압축 이미지며,
사용자가 새로 구성한 커널이 있을 때는 대화식으로 그 파일 이름을 주게 된다.
커널 이미지가 메모리로 적재되면 다음과 같은 초기화 과정을 거쳐 시스템을 실행 상태로 만든다.
1. 커널 기본 자료 구조, 클럭, 입출력 장치 등을 초기화 한다. 2. 가상 메모리 시스템(페이지 매핑)을 초기화한다. 3. 최초의 커널 프로세스로서 가상 메모리 관리를 위한 스와퍼(swapper) 프로세스를 생성한다. 4. 프로세스 식별자가 1이며 최초의 사용자 프로세스인 init 프로세스가 생성 실행된다. init 프로세스는 이후의 모든 사용자 프로세스의 선조가 되는 프로세스로, 프로세스를 생성하고 동작을 감시하기 때문에 절대로 끝나지 않는다. |
2.3 GNU gcc 컴파일러
GCC는 GNU의 C, C++, Objective C, FORTRAN, Java, Ada 언어를 위한 컴파일러들과 각 언어를 위한 libgcc 등의 라이브러리 모음으로 역시 오픈 소스 소프트웨어이다.
GCC는 C와 C++에 대해 ANSI C 표준 등을 선택 사항으로 제공하고 그 이외에도 여러 형태의 확장된 기능을 제공한다. 또한 GCC는 사용하는 CPU를 위한 코드 뿐만 아니라 다른 타켓 CPU를 위한 코드 생성 즉, 크로스 컴파일(cross compile) 기능도 제공하여, 여러 환경에서의 개발에 필수적으로 사용되는 대표적인 유닉스와 리눅스에서의 개발도구라 할 수 있다.
GCC의 실행 단계는 매크로 등을 처리하는 전처리기(preprocessor), 문법 체크와 중간 코드를 생성하는 front-end 처리, 타겟 CPU를 위한 기계어 코드를 생성하는 back-end 처리, 여러 개의 오브젝트 프로그램을 하나의 실행 파일로 결합 생성하는 링킹(linking) 단계 등으로 나누어 진행한다.
GCC는 또한, 언어의 표준에 관한 선택, 코드 생성의 최적화에 관한 선택, 디버깅을 위한 코드 생성에의 선택 등 다양한 선택 사항을 컴파일 단계에서 제공하여 개발자의 편의를 제공한다.
일반적으로 C 프로그램을 위해서는 gcc, C++ 프로그램을 위해서는 g++를 명령어로 입력한다.
1) 소스 파일의 컴파일
현 디렉토리에 있는 어떤 프로그램 myprog.c를 컴파일 하여 실행 파일을 생성하려면 다음의 쉘 명령을 수행시킨다.
$ gcc myprog.c
이 명령어가 성공적으로 수행되면 현 디렉토리에 “a.out”라는 이름의 실행 파일이 생성된다. 이러한 a.out을 실행하려면 다음의 쉘 명령을 입력한다.
$ ./a.out
이러한 gcc나 g++는 수많은 종류의 컴파일 선택 사항을 제공하는데 이에 대한 상세한 사항은
http://gcc.gnu.org 를 참조.
2) 출력 제어 옵션
-c : 입력 파일을 컴파일이나 어셈블(assemble)만 하여 확장자 .o의 파일로 생성한다.
파일들에 대한 링크를 수행하지 않아 실행 파일은 생성되지 않는다.
-s : 기계어 코드 생성 이전의 어셈블리어 파일 생성 단계까지 수행한다.
확장자를 .s로 하는 어셈블리어 파일 생성된다.
-o : a.out 대신에 주어진 이름의 실행 파일을 생성한다.
3) 디버깅 옵션
-g : 운영체제에 정해진 형태의 실행 프로그램 디버깅 정보를 생성하여 프로그램 실행 단계에서 GDB 디버거가 동작할 수 있도록 한다.
4) 최적화 관련 옵션
-0 (또는 -01) : 컴파일 시간이 그리 많이 걸리지 않는 정도에서 프로그램의 실행 시간과 공간을 줄이기 위한 최적화 컴파일을 수행한다. 이러한 최적화는 디버깅 단계에서는 구지 사용할 필요가 없고 프로그램의 테스팅이 종료된 뒤에는 사용하는 것이 좋다.
-02와 -03 : 0 뒤의 숫자가 클수록 최적화를 위해 많은 요소를 반영한다.
5) 전처리기 옵션
-D name : name 매크로의 값을 1로 저장한다.
-D name=definition : name 매크로의 값을 definition으로 정의한다.
-i dirname : 헤더 파일을 찾는 시스템의 정해진 디렉토리에 dirname을 추가한다.
6)링킹 옵션
-library : 실행 파일 링킹 시에 지정된 라이브러리에서 필요함 수들을 찾아 링킹 한다.
지정한 라이브러리는 /usr/lib고 같은 시스템 라이브러리 및 사용자에 의해 지정된 디렉토리에서
차례대로 찾는다.
$ gcc myprog.c -lm
2.4 쉘
시스템에 로그인하게 되면 제일 처음 접하게 되는 것이 쉘이다. 쉘은 입력하는 모든 명령을 해석하고 실행한다. 현재 시스템에서 사용할 수 있는 쉘은 /etc/shells에 등록되어야 한다.
특정 쉘을 사용하고 싶다면 쉘의 설치 후 /etc/shells에 등록해주어야 한다.
사용자 각각의 쉘은 /etc/passwd 파일의 username 필드 뒤쪽에 등록되어야 한다.
1) 리눅스에서 사용 가능한 쉘의 종류
Bash : Bourne Again 쉘. 리눅스에서 가장 많이 사용되고 있다.
csh : C 쉘. 버클리 개발
ksh: Korn 쉘. 유닉스에서 가장 많이 사용되고 있다.
2) 현재 사용 중인 쉘의 확인
$ echo $SHELL
3) 쉘 바꾸기
$ chsh
Changing shell for userID.
Password:
New shell [/bin/csh]: /bin/bash
Shell Changed.
$
2.5 환경 설정
X 윈도우 설정하는 과정은 하드웨어, 일반적인 환경 설정이 있다.
1) 하드웨어 설정
리눅스가 지원하는 하드웨어 검색 프로그램으로 쉽게 설치할 수 있어 간단해졌다. 찾지 못하는 하드웨어는
직접 설정해주어야 한다.
$ Xconfigurator -> 안됨
2) 환경 설정
배포판에 따라서 윈도우 매니저가 다르지만, 일반적으로 사용되는 것은 Gnome, KDE일 것이다.
로그인 창에서 윈도우 매니저를 설정하거나, 로그인 후에 설정 가능하다.
2.6 계층 구조적 파일 시스템
/bin : 일반적인 리눅스 명령어 수행을 위한 실행 파일이 이 디렉토리에 있으며, login, shell 등의 파일도 여기에 있다.
/boot : LILO나 GRUB 같은 부트 로더가 부팅 시 이 디렉토리에 있는 커널 이미지를 사용한다.
커널 이미지 및 System.map과 같은 파일이 위치한다.
/dev : 이름 그대로 디바이스(장치) 노드가 위치한다. 이 디렉토리의 파일은 메이저(Major)와 마이너(Minor Number) 넘버로 각 장치를 구별하며, mknod 명령으로 노드를 만들 수 있다. 리눅스는 입출력 장치를 일반적인 파일과 같이 취급할 수 있도록 이 디렉토리를 통해 Devfs(디바이스 파일시스템)을 제공한다.
/etc : 여러 설정 파일들이 위치하여 sysinit 스크립트 및 마운트(mount)할 디스크 파티션 및 파일 시스템을 포함하고 있는 fstab 등이 위치하는 필수적인 디렉터리들이다.
/lib : 시스템에 있어서 가장 중요한 glibc(C 라이브러리)를 포함하여 모든 라이브러리 파일이 위치하는 곳이다. 어떠한 리눅스 명령어도 glibc가 없다면 실행될 수 없다.
/proc : 가상 파일 시스템으로 /proc 내의 파일은 커널이 만들어 준다. 이 디렉토리는 CPU, 프로세스, 메모리, 디바이스, 인터럽트 등과 관련된 여러 가지 유용한 정보를 파일 형태로 가지고 있다.
/sbin : /bin 디렉토리와 마찬가지로 리눅스 명령어가 위치하지만, 이 디렉토리에 위치한 명령어는 시스템
관리와 관련된 것들이다. 따라서 일반 사용자의 실행 PATH의 경로에는 기본적으로 포함되지 않는다.
init, reboot 등의 명령어들이 여기에 위치한다.
/tmp : 이 디렉토리는 각종 작업에서 사용되는 임시 파일들을 위한 디렉토리
/usr : 사용자를 위한 공간으로 일반적으로 새로운 프로그램 설치 시에 사용하는 공간이다.
/var : 시스템과 관련된 로그나 파일, 메일이나 lock 파일 등이 위치하는 곳이다.
참고 문헌
'Linux' 카테고리의 다른 글
리눅스 스케줄링 (0) | 2015.12.19 |
---|---|
프로세스와 쓰레드 (0) | 2015.12.19 |
Linux Overview (0) | 2015.12.19 |
01 서론 (0) | 2015.08.18 |
System Mangement (0) | 2015.01.27 |