77
Host Host 컴컴컴 컴컴컴컴 컴컴 컴컴컴 컴컴컴컴 컴컴 Lecture #3 Lecture #3 ( ( 컴컴컴 컴컴컴 컴컴컴 컴컴컴 ) )

Host 컴퓨터 개발환경 이해

  • Upload
    hye

  • View
    83

  • Download
    0

Embed Size (px)

DESCRIPTION

Host 컴퓨터 개발환경 이해. Lecture #3 ( 리눅스 관하여 …). 목 차. 리눅스 부팅 과정 리눅스 소스 트리 리눅스 파일 시스템 쉘 , vi, 기본 명령어 프로그램 컴파일하기 make 와 Makefile. process 1. User Space. process 2. process 3. process n. System Call Interface. Filesystem Manager. Process Manager. Task Management Scheduler - PowerPoint PPT Presentation

Citation preview

Page 1: Host  컴퓨터 개발환경 이해

Host Host 컴퓨터 개발환경 컴퓨터 개발환경 이해이해

Lecture #3Lecture #3

(( 리눅스 관하여리눅스 관하여…… ))

Page 2: Host  컴퓨터 개발환경 이해

2

목 차 리눅스 부팅 과정 리눅스 소스 트리 리눅스 파일 시스템 쉘 , vi, 기본 명령어 프로그램 컴파일하기 make 와 Makefile

Page 3: Host  컴퓨터 개발환경 이해

3

리눅스 운영체제 구조

(Source : Linux Kernel Internals)

System Call Interface

Buffer Cache

Memory Manager

Process ManagerFilesystem Manager

Device Manager Network Manager

Ext2fs proc xiafs

nfs msdos ntfs

Console KBD SCSICD-ROM PCI ethernet

socket Ipv6 IrDA Bluetooth

Paging/Segmentation

Task ManagementSchedulerSignalingIPC

Hardware Interface

process 3

dev1 dev2 dev3 dev4 devn

block character

User Space

Kernel Space

process nprocess 2process 1

Page 4: Host  컴퓨터 개발환경 이해

4

리눅스 부팅 과정 (1)시작

System Bios

* ROM 에 위치해 있음* 메모리 체크 및 하드웨어 초기화* Boot Manager 실행

Boot manager

* 부팅매체의 0 번 섹터 (MBR) 에 위치 ,* 운영체제 선택* Linux kernel 압축을 풀고 메모리에 로딩* 커널 실행 (Boot Loader)

Linux kernel * vmlinuz 라는 파일 이름을 가지고 있음* pid 0 인 swapper 가 시스템 체크 및 초기화 (dmesg 명령 또는 /var/log/dmesg 파일 )* pid 1 인 init 를 실행 시킴

Initd

* 파일시스템 구조 검사* 파일시스템 마운트* 서버데몬 실행* 사용자 로그인 및 쉘 실행

klogd xinetd xfs

(pstree 명령어 )

Page 5: Host  컴퓨터 개발환경 이해

5

리눅스 부팅 과정 (2)1) BIOS 가 시스템 이상 여부 태스트 -> 부트로더에서 수행2) 부팅할 드라이브 선택 -> 커널의 플래쉬 위치 선택3) 선택된 드라이브의 MBR 읽어 드림 -> 수행 불필요4) MBR 의 파티션 테이블을 읽어 부팅할 파티션을 선택 -> 수행 불필요5) 커널 로드 -> 커널을 램상으로 복사6) 커널 압축 해제 / 재배치7) 장착된 하드웨어 검사 , 장치 드라이버 설정8) 파일 시스템 검사 -> 램디스크 , jffs 이미지에 포함9) 파일 시스템 마운트10) /etc/inittab 에서 init 실행을 위한 설정 내용 확인11) /sbin/init 실행 (PID 가 1 이됨 )12) /etc/rc.d/rc.sysinit 실행 (hostname, 시스템 점검 , 모듈 로딩 )13) /etc/rc.d/rc 실행 (runlevel 에 따른 스크립트 실행 )14) /etc/rc.d/rc.local( 매번 실행할 내용 입력 )15) /etc/rc.d/rc.serial ( 시리얼 포트 초기화 )16) login

Page 6: Host  컴퓨터 개발환경 이해

6

Bootloader: LILO (1) bootloader: 부팅에 사용될 커널을 선택하고 실행한다 . / etc/lilo.conf

timeout=60default=linuximage=/boot/vmlinuz-2.4.18-50

label=linuxread-onlyroot=/dev/hda1

image=/boot/vmlinuz-2.4.19label=linux_2_4read-onlyroot=/dev/hda1

other=/dev/hda1label=dos

60 초 후에는 자동으로 label=linux 인리눅스 커널이미지를 실행한다 .

label=linux 인 리눅스 커널이미지에 대한 정보

label=linux_2_4 인 리눅스 커널이미지에 대한 정보

label=dos 인 커널이미지에 대한 정보( 리눅스 이외의 다른 운영체제 )

Page 7: Host  컴퓨터 개발환경 이해

7

Bootloader: LILO (2) 부팅시 다음과 같은 메세지가 나타난다 . (label=linux 인 커널을 선택하여 실행하는 예 )

LILO: [TAB]linux linux_2_4 dosLILO: linux [Enter]Booting Linux......

Page 8: Host  컴퓨터 개발환경 이해

8

새로운 리눅스 커널 추가하기 기존의 커널소스를 바꾸거나 새로운 커널소스를 설치한 다음

컴파일하여 새로운 리눅스 커널이미지를 생성한다 .

( 새로운 커널이미지가 / boot/vmlinuz-2.4.19 에 있다고 가정한다 .)

/ etc/lilo.conf 에 다음을 추가한다 .

shell 에서 lilo 라는 명령을 입력하여 하드디스크의 부팅과 관련된 MBR(Master Boor Record) 를 갱신한다 .

재부팅하고 LILO: 프롬프트가 나오면 linux_2_4_19 를 선택한다 .

image=/boot/vmlinuz-2.4.19label=linux_2_4_19read-onlyroot=/dev/hda1

Page 9: Host  컴퓨터 개발환경 이해

9

리눅스 전체 디렉토리 구조 / etc - 시스템 설정 파일 디렉토리 (ex: /etc/lilo.conf, /etc/fstab ..) /bin - 시스템의 기초 명령 (ex: gzip, su, tar, rpm, vi, mount..) /dev - 장치파일 (ex: /dev/hda, /dev/cdrom..) /lib - 시스템 공유 라이브러리 디렉토리 / home - 사용자 홈 디렉토리 (ex: /home/ssyoo, /home/pirami..) /root - 루트사용자의 홈 디렉토리 / proc - 시스템 정보 디렉토리 (ex: /proc/cpuinfo,

proc/meminfo..) /sbin - 시스템 관리 명령 디렉토리 / tmp - 임시파일 생성 디렉토리 / var - 시스템 가동 중 가변 자료 저장 디렉토리 / usr - 애플리케이션이 설치되는 디렉토리 , 커널소스는 보통

/ usr/src 에 설치

Page 10: Host  컴퓨터 개발환경 이해

10

Linux 커널 소스 트리 구조

임베디드 시스템 소프트웨어의 주 관심 영역을 노란색으로 표식

/usr/src/linux

Doc

arch

includeinit fs

kernel ipc lib mm

net

scripts

driver

alpha

arm

m68k

mips

ppc

sparc

i386

boot

kernellib

math-emu

mm

asm-alpha

asm-arm

asm-i386

.. .

linux

net

scsi

video

802

appletalk

decnet

ethernet

ipv4

unix

sunrpc

x25.. .

block

cdrom

char

net

pci

pnp

sbus

scsi

.. .

sound

video

coda

ext2

hpfs

msdos

nfs

isofs

.. .ntfs

Page 11: Host  컴퓨터 개발환경 이해

11

각 디렉토리 설명 (1) arch/

CPU 종속적인 부분 , 각 처리기 마다 하위 디렉토리로 구성됨 (arch/arm, arch/i386, arch/alpha … )

arch/arm/boot/ 부트스트랩핑 코드

arch/arm/kernel/ 하드웨어 종속적인 (hardware dependent) 커널 관리 루틴 트랩 , 인터럽트 처리 루틴 문맥 교환 루틴 장치 구성 , 초기화 루틴

arch/arm/mm/ 하드웨어 종속적인 메모리 관리 루틴

init/ 하드웨어 독립적인 커널 초기화 루틴 (start_kernel) 태스크 0 (init_task or task[0]) 생성 태스크 1, 2, 3 등 데몬 프로세스 생성

Page 12: Host  컴퓨터 개발환경 이해

12

각 디렉토리 설명 (2) kernel/

리눅스 커널의 가장 중심적인 디렉토리 (central section of the kernel) 하드웨어 독립적인 커널 관리 루틴 ( 하드웨어 종속적인 커널 관리 루틴은

arch/arm/kernel 디렉토리에 존재 ) fork, exit 등 태스크 관련 시스템 호출 처리 루틴 스케줄러 (scheduler) 루틴 시그널 처리 (signal handling)/ 시간 관리 (time management) 루틴

mm/ 하드웨어 독립적인 메모리 관리 루틴 ( 하드웨어 종속적인 메모리 관리

루틴은 arch/arm/mm 디렉토리에 존재 ) 가상 메모리 관리 , 페이징 (paging), 스와핑 (swapping)

fs/ 가상 파일 시스템 (virtual file system ) 관리 루틴 open, read 등 태스크 관련 시스템 호출 처리 루틴 특정 파일 시스템 관리 루틴은 하위 디렉토리에 존재 (ext2, ext3, ramfs,

minix, jffs2, proc, nfs, msdos, coda, .. )

Page 13: Host  컴퓨터 개발환경 이해

13

각 디렉토리 설명 (3) drivers/

개개의 장치를 제어하기 위한 장치 드라이버 루틴 디바이스 드라이버는 크게 문자 / 블록 / 네트워크 드라이버로 구분 drivers/block/ : 블록 장치 드라이버 . 예를 들어 IDE 디스크 (hd) drivers/char/ : 문자 장치 드라이버 . serial ports, tty, modem, ..) drivers/net : 네트웍 장치 드라이버 . 예를 들어 3C509, ... drivers/pci/ : PCI bus 제어 drivers/sound/ : sound card 드라이버 drivers/cdrom/ : CD-ROM 드라이버 drivers/scsi/ : SCSI 인터페이스 관리

ipc/ 프로세스간 통신을 지원하기 위한 루틴 세마포어 (semaphores), 공유 메모리 (shared memory), 메시지 큐

(message queues)

Page 14: Host  컴퓨터 개발환경 이해

14

각 디렉토리 설명 (4) net/

TCP/IP, ARP 등 네트웍 통신 프로토콜 ( 네트웍 장치 드라이버는 drivers/net 에 존재 )

소켓 인터페이스 include/

커널 헤더 하드웨어 독립적인 헤더 : include/linux/ 하드웨어 종속적인 헤더 : include/asm-***/ ( 예를 들어 ARM CPU

종속적인 헤더는 include/asm-arm/ 디렉토리에 존재 ) modules/

커널 모듈 루틴 모듈은 insmod(modprobe), rmmod 등의 명령으로 동적 적재 / 제거

가능 lib/

커널 라이브러리 루틴 doc/ or Documentation/

커널 문서 디렉토리 .

Page 15: Host  컴퓨터 개발환경 이해

15

리눅스 파일 시스템 전체 구조

Virtual File System

ext2 nfs coda dosfs …. ntfs procfs

buffer cache File System

device driver

User mode

System mode

task 1 task 2 task n….

System call interface

Page 16: Host  컴퓨터 개발환경 이해

16

리눅스 파일 시스템 정의

파티션 안에 정보를 저장하고 관리하는 실질적 방법을 제공 즉 , 파일을 저장하는 방식을 지칭

종류 ext 시스템 : Extended File System

초기 minix 의 제한을 극복하고자 개발 255 자의 파일 이름과 2GB 의 파티션 지원

ext2 : Second Extended File System 최대 64GB 의 파티션 허용

FAT (File Allocation Table) : 클러스터 크기 고정 도스에서 사용 , 2GB 의 파티션 및 8 자의 파일 이름 지원

FAT32 윈도우에서 사용 최대 2TB 의 파티션을 지원

Page 17: Host  컴퓨터 개발환경 이해

17

리눅스 파일 시스템 현재 리눅스에서 지원되는 파일 포맷 : 10 여 종 임베디드 시스템을 위한 파일 시스템

EXT2 : 리눅스 전용 , 임베디드 시스템에서도 일반적으로 지원 cramfs(Compressed ROM File System)

롬 기반의 임베디드 시스템에 사용되는 읽기 전용의 압축 파일 시스템 내용 변경이 불가능

XIP(Execute-in-Place) 롬이나 플래쉬롬에 있는 프로그램을 램에 적재하지 않고 그곳에서 바로 실행 램에 대한 메모리 요구량을 줄여 줌 많은 응용프로그램을 동시에 실행 가능

실행 파일 포맷 : ELF(Executable and Linking Format) 하나만을 지원하는 것이 일반적임 ELF : USL 에서 개발한 바이너리 형식

Page 18: Host  컴퓨터 개발환경 이해

18

리눅스 사용을 위한 준비 SHELL 이해 리눅스 명령어 이해

시스템 관리 명령어 네트웍 관리 명령어 파일 관리를 포함한 다양한 리눅스 명령어 에디터 , 컴파일러 이해

Page 19: Host  컴퓨터 개발환경 이해

19

Shell (1) Shell

Command interpreter 로서 user 와 kernel 을 연결 사용자가 명령어를 입력하면 shell 은 특정한 작업을 수행하기

위하여 요구된 기계어의 집합 (System Call) 으로 명령어를 변환하여 실행

bourne shell(sh), C shell(csh), Bash, Ksh 등 리눅스의 기본 shell : Bash(Bourne Again Shell) 셸은 인식할 수 있는 " 스크립트 (Script)" 파일을 만들어서

리눅스의 일반적인 명령어뿐만 아니라 shell script 언어도 포함시킬 수 있음

Shell 스크립트는 "ed", "vi" 편집기를 사용하여 작성 가능

Page 20: Host  컴퓨터 개발환경 이해

20

Shell (2) Shell 선택

사용자 생성시 선택 명시 ( /etc/passwd 파일 안에 shell 정보 ) 환경 변수를 이용해서 자신의 login shell 을 확인

$ echo $SHELL Shell 호출

자동 호출 login 시에 / etc/passwd 파일의 정보 읽어서 지정된 shell 을 시작

수동 호출 특정 shell 로 변경하기 위해서는 단지 해당 shell 프로그램을

실행시키면 되고 , 종료 시에 “ exit" 명령 입력 Bourne Again shell – bash C shell - csh

Page 21: Host  컴퓨터 개발환경 이해

21

Shell (3) Bash 설정 방법

Bash 와 관련된 파일들 - .bashrc, .bash_logout, .bash_profile

.bashrc 자주 사용하는 명령어의 alias 설정

.bash_profile program 이나 library 에 대한 path 설정

# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then      ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin:/usr/local/arm-linux/bin:BASH_ENV=$HOME/.bashrc USERNAME=""         export USERNAME BASH_ENV PATH

# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then      ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin:/usr/local/arm-linux/bin:BASH_ENV=$HOME/.bashrc USERNAME=""         export USERNAME BASH_ENV PATH

arm-linux 관련 명령어 path 설정 (/usr/local/arm-linux/bin)

# .bashrc # User specific aliases and functions

alias ifc=‘ifconfig’

# Source global definitions if [ -f /etc/bashrc ]; then         . /etc/bashrc fi export

# .bashrc # User specific aliases and functions

alias ifc=‘ifconfig’

# Source global definitions if [ -f /etc/bashrc ]; then         . /etc/bashrc fi export

ifconfig 에 대한 alias 설정

Page 22: Host  컴퓨터 개발환경 이해

22

Shell Script Programming shell script

Shell 명령들을 포함하는 실행 가능 상태의 파일 Shell script 예제 프로그램

파일 확장자 바꾸기

#!/bin/bash #         rfe old_extension new_extension # 예제 : # 현재 디렉토리의 모든 *.gif 파일을 *.jpg 로 바꾸기 #          rfe gif jpg

if [ $# -ne 2 ] then   echo " 사용법 : `basename $0` old_file_suffix new_file_suffix"   exit 1 fi

for filename in *.$1 # 첫 번째 인자로 끝나는 파일들을 찾아서 do   mv $filename ${filename%$1}$2   # 파일 이름에서 첫 번째 인자 부분을 떼어내고 두 번째 인자를 붙인다 . done

#!/bin/bash #         rfe old_extension new_extension # 예제 : # 현재 디렉토리의 모든 *.gif 파일을 *.jpg 로 바꾸기 #          rfe gif jpg

if [ $# -ne 2 ] then   echo " 사용법 : `basename $0` old_file_suffix new_file_suffix"   exit 1 fi

for filename in *.$1 # 첫 번째 인자로 끝나는 파일들을 찾아서 do   mv $filename ${filename%$1}$2   # 파일 이름에서 첫 번째 인자 부분을 떼어내고 두 번째 인자를 붙인다 . done

shell script 의 첫 줄에 사용 shell 명시

Page 23: Host  컴퓨터 개발환경 이해

23

실행 방법 : vi 명령어 뒤에 파일 이름 vi 실행 시 시작하는 모드는 명령 모드 편집기 모드

입력모드 혹은 편집모드 – 글자를 입력할 수 있는 모드 모드변환방법 - 명령모드에서 a,A,i,o,O 를 입력 했을 때

명령모드 혹은 ESC 모드 – 커서이동 및 기타 명령어처리 모드변환방법 - 실행모드 혹은 입력모드에서 ESC 키를 눌렀을 때

실행모드 혹은 콜론모드 – 내용바꾸기 및 기타 모드변환방법 - 명령모드에서 콜론 (:) 을 입력했을 때

ESC

:입력명령

실행완료

실행모드

명령모드

입력모드

vi 편집기

Page 24: Host  컴퓨터 개발환경 이해

24

vi - 명령 모드 입력 모드 전환

커서 이동

a : 커서 위치의 다음 칸부터 입력하기 (append)

A : 커서가 있는 줄의 끝부터 입력하기i : 커서 위치부터 입력하기 ( 키보드의 Insert 도 같은 기능을 합니다 .)

I : 커서가 있는 줄의 맨 앞에서부터 입력하기 o : 커서 바로 아래에 줄을 만들고 입력하기 (open line)

O : 커서 바로 위에 줄을 만들고 입력하기 s : 커서가 있는 단어를 지우고 입력하기S : 커서가 있는 행을 지우고 입력하기

a : 커서 위치의 다음 칸부터 입력하기 (append)

A : 커서가 있는 줄의 끝부터 입력하기i : 커서 위치부터 입력하기 ( 키보드의 Insert 도 같은 기능을 합니다 .)

I : 커서가 있는 줄의 맨 앞에서부터 입력하기 o : 커서 바로 아래에 줄을 만들고 입력하기 (open line)

O : 커서 바로 위에 줄을 만들고 입력하기 s : 커서가 있는 단어를 지우고 입력하기S : 커서가 있는 행을 지우고 입력하기

h : 왼쪽 , j : 위로 , k : 아래로 , l : 오른쪽 ( 방향키 사용 가능 ) - 글자단위w : 다음단어로 , b : 이전단어로 - word 단위^ : 맨 왼쪽의 첫 글자 , $ : 마지막글자의 끝 - 행 단위^F: 한화면 아래로 , ^B: 한 화면 위로 , ^D: 반 화면 아래로 , ^U: 반화면 위로

h : 왼쪽 , j : 위로 , k : 아래로 , l : 오른쪽 ( 방향키 사용 가능 ) - 글자단위w : 다음단어로 , b : 이전단어로 - word 단위^ : 맨 왼쪽의 첫 글자 , $ : 마지막글자의 끝 - 행 단위^F: 한화면 아래로 , ^B: 한 화면 위로 , ^D: 반 화면 아래로 , ^U: 반화면 위로

Page 25: Host  컴퓨터 개발환경 이해

25

vi - 명령 모드 삭제 기능

복사 및 붙여넣기

x : 커서 위치의 글자 삭제 X : 커서 바로 앞의 글자 삭제 dw : 한 단어를 삭제 D : d$ 커서 위치부터 줄의 끝까지 삭제 dd : 커서가 있는 줄을 삭제

x : 커서 위치의 글자 삭제 X : 커서 바로 앞의 글자 삭제 dw : 한 단어를 삭제 D : d$ 커서 위치부터 줄의 끝까지 삭제 dd : 커서가 있는 줄을 삭제

yw : 커서 위치부터 단어의 끝까지 복사하기y0 : 커서 위치부터 줄의 처음까지 복사하기y$ : 커서 위치부터 줄의 끝까지 복사하기yy : 커서가 있는 줄을 복사하기yj : 커서가 있는 줄과 그 다음 줄을 복사하기yk : 커서가 있는 줄과 그 앞줄을 복사하기p : 커서의 다음 위치에 붙여 넣기P : 커서가 있는 위치에 붙여 넣기

yw : 커서 위치부터 단어의 끝까지 복사하기y0 : 커서 위치부터 줄의 처음까지 복사하기y$ : 커서 위치부터 줄의 끝까지 복사하기yy : 커서가 있는 줄을 복사하기yj : 커서가 있는 줄과 그 다음 줄을 복사하기yk : 커서가 있는 줄과 그 앞줄을 복사하기p : 커서의 다음 위치에 붙여 넣기P : 커서가 있는 위치에 붙여 넣기

Page 26: Host  컴퓨터 개발환경 이해

26

vi - 명령 모드 기타

u : 작업 취소하기 (undo)

U : 그 줄에 행해진 작업 모두 취소하기. : 조금 전에 했던 명령을 반복하기~ : 대소문자 전환/ 검색어 : 아래 방향으로 찾기 ( 검색 )

? 검색어 : 위쪽 방향으로 찾기n : 다음 찾기

u : 작업 취소하기 (undo)

U : 그 줄에 행해진 작업 모두 취소하기. : 조금 전에 했던 명령을 반복하기~ : 대소문자 전환/ 검색어 : 아래 방향으로 찾기 ( 검색 )

? 검색어 : 위쪽 방향으로 찾기n : 다음 찾기

Page 27: Host  컴퓨터 개발환경 이해

27

vi - 실행 모드 치환관련 실행

파일 관련 실행

:s/old/new/g - old 를 new 로 치환:s/^old/new/g - 행의 첫 단어가 old 인 것을 new 로 치환:s/old$/new/g - 행의 끝 단어가 old 인 것을 new 로 치환:s/aaa//g - aaa 를 삭제

:s/old/new/g - old 를 new 로 치환:s/^old/new/g - 행의 첫 단어가 old 인 것을 new 로 치환:s/old$/new/g - 행의 끝 단어가 old 인 것을 new 로 치환:s/aaa//g - aaa 를 삭제

:w 파일명 “파일명”으로 저장:q 저장하지 않고 종료:q! 변경 사항을 버리고 종료:e 파일명 “파일명”의 파일을 불러들여 편집:r 파일명 “파일명”의 파일을 읽어서 삽입:! 명령어 외부명령어 실행

:w 파일명 “파일명”으로 저장:q 저장하지 않고 종료:q! 변경 사항을 버리고 종료:e 파일명 “파일명”의 파일을 불러들여 편집:r 파일명 “파일명”의 파일을 읽어서 삽입:! 명령어 외부명령어 실행

Page 28: Host  컴퓨터 개발환경 이해

28

리눅스 기본 명령어 간단한 리눅스 명령어들

ls, more, cat, grep, who, pwd ps(process status), su(super user), chown(change ownership), chmod(change mode) useradd, userdel, passwd

시스템 관리 명령어들 mount - 디바이스 파일 시스템을 리눅스 메인 파일 시스템에 설치 unmount - 디바이스 파일 시스템 해제 e2fsck - 시스템 파일 검사 mke2fs - 새로운 시스템 파일 만들기 mknod - FIFO 파이프나 캐릭터나 블록 모드 디바이스 파일 생성

네트웍 관리 명령어들 ping - 도착지로 요청을 보내고 회신을 받는 일 ( 네트웍 연결 상태 확인 ) ifconfig - 네트웍 인터페이스 구성정보 netstat - 모든 내트워크 연결상태에 대한 요약정보

Page 29: Host  컴퓨터 개발환경 이해

29

홈 (Home) 디렉토리 시스템 관리자가 사용자를 등록할 때 기본적인 전용 공간을

주는데 이를 홈 (Home) 디렉토리 라고 함 기본적으로 “home/ID", "/usr/ID" 형식으로 생성 사용자는 자기의 전용공간에서 새로운 파일을 생성하고 , 지우

고 , 디렉토리를 만들고 데이터를 저장할 수 있음 사용자가 로그인 할 때마다 리눅스 시스템은 사용자의 홈

디렉토리 식별하는 $HOME 이라는 변수를 지정 현재 자신의 홈 디렉토리를 확인하기 위해서는 환경변수

"$HOME" 을 참고 사용자의 작업환경을 결정하는 특별한 파일들은 사용자의 홈

디렉토리에 위치 ( ".bash_profile" , ".bash_logout", ".bashrc" )

Page 30: Host  컴퓨터 개발환경 이해

30

절대경로와 상대경로 경로이름

출발 디렉토리에서 목적지 파일이나 디렉토리까지 계층구조 상에 나타나는 디렉토리 이름의 순서

절대 경로 루트 (root) 디렉토리인 "/" 로 시작하여 해당 파일이나 디렉토리까지의

모든 경로를 표시하는 방법

상대경로 현재 디레토리를 기준으로 상대적인 경로이름을 이용하여 파일이나

디렉토리를 표시하는 방법

# vi /user/ssyoo/test.c

# vi ./ssyoo/test.c

Page 31: Host  컴퓨터 개발환경 이해

31

디렉토리 관련 명령어 디렉토리 만들기

mkdir [OPTION] DIRECTORY... 이름은 대문자와 소문자 , 숫자 , 그리고 쉘에서 사용되는

특별문자를 제외한 모든 문자를 사용하여 작성 디렉토리 제거

rmdir [OPTION]... DIRECTORY... 현재 디렉토리 위치 변경

cd [ directory ] cd .. ( 한 단계 앞 디렉토리로 이동 )

디렉토리 / 파일 이름 변경과 옮기기 mv [OPTION]... SOURCE DEST

Page 32: Host  컴퓨터 개발환경 이해

32

파일 관리 형태 파일 시스템의 기본적인 기능은 디스크나 테이프의 저장

공간을 파일과 디렉토리 개념으로 구성하여 관리 보통 장기간 저장을 위해서 파일을 사용하고 단기간 저장이나

빠른 결과를 얻기 위해서는 RAM 를 사용

종 류 의 미 정규파일

(Regular file) 일반적으로 텍스트 파일이나 이진파일을 나타냄

디렉토리 파일 (Directory file)

특 별 한 형 식 으 로 디 스 크 에 저 장 되 며 디렉토리 명시적 시스템 호출을 통해서만 참조

특수파일 (Special file)

프린터 , CD-ROM, 디스크와 같은 주변장치 , 프로세스간 상호통신

Page 33: Host  컴퓨터 개발환경 이해

33

파일 관련 명령어 파일 삭제

rm [OPTION]... FILE... -r 옵션의 경우 지정된 디렉토리 내에 서브디렉토리를 포함하여

모든 파일과 디렉토리를 지움 파일 복사

cp [OPTION]... SOURCE DEST cp [OPTION]... SOURCE... DIRECTORY

-r 옵션의 경우 해당 디렉토리의 서브 파일까지 복사 파일 내용 보기

cat [OPTION] [FILE]... more [OPTION] [FILE]... head [OPTION]... [FILE]... tail [OPTION]... [FILE]...

Page 34: Host  컴퓨터 개발환경 이해

34

파일 비교 diff : 파일간의 모든 차이점과 비슷한 점을 보여줌

diff [ -i -Dflag ] fileName1 fileName2-i ; 대소문자의 구분을 무시한다 (ignore)-Dflag ; C preprocessor 를 위한 출력을 생성

Page 35: Host  컴퓨터 개발환경 이해

35

파일 탐색 find pathList expression

pathList 파일을 탐색할 경로의 리스트 (recursive search)

expression -name pattern 파일 이름이 pattern 과 일치하면 참 (*, [, ], ? 포함 가능 )-perm oct permission 의 8 진수 표현이 oct 와 일치하면 참-type ch 파일의 유형이 ch 이면 참 (ch: b=block, c=char)-user userId 파일의 소유자가 userId 이면 참-group groupId 파일의 그룹이 groupId 이면 참-atime count 접근 (access) 한 날 수가 count 이내이면 참-mtime count 수정 (modify) 한 날 수가 count 이내이면 참 -ctime count 수정되고 화일의 속성이 바뀐 날수가 count 이내이면 참-exec command 수행 중인 command 의 종료값이 0 이면 참 . \; 로 끝남 command 의 argument 가 {} 이면 , 현재 화일의 이름으로 치환-print 현재 파일명을 프린트하고 참 값을 반환-ls 현재 파일의 속성을 보여주고 참 값을 반환-cpio device 현재의 파일을 cpio 형식 (5120 byte records) 으로 device 에 쓰고 참 값 반환!expression expression 의 논리 부정\( expr1 [-a] expr2 \) 두 expression 의 and\( expr1 [-o] expr2 \) 두 expression 의 or

-name pattern 파일 이름이 pattern 과 일치하면 참 (*, [, ], ? 포함 가능 )-perm oct permission 의 8 진수 표현이 oct 와 일치하면 참-type ch 파일의 유형이 ch 이면 참 (ch: b=block, c=char)-user userId 파일의 소유자가 userId 이면 참-group groupId 파일의 그룹이 groupId 이면 참-atime count 접근 (access) 한 날 수가 count 이내이면 참-mtime count 수정 (modify) 한 날 수가 count 이내이면 참 -ctime count 수정되고 화일의 속성이 바뀐 날수가 count 이내이면 참-exec command 수행 중인 command 의 종료값이 0 이면 참 . \; 로 끝남 command 의 argument 가 {} 이면 , 현재 화일의 이름으로 치환-print 현재 파일명을 프린트하고 참 값을 반환-ls 현재 파일의 속성을 보여주고 참 값을 반환-cpio device 현재의 파일을 cpio 형식 (5120 byte records) 으로 device 에 쓰고 참 값 반환!expression expression 의 논리 부정\( expr1 [-a] expr2 \) 두 expression 의 and\( expr1 [-o] expr2 \) 두 expression 의 or

find . -name "*.txt" -print

Page 36: Host  컴퓨터 개발환경 이해

36

파일 내용 탐색 파일 내용 ( 문자열 ) 탐색 - grep

지정된 문자열이 발견되면 해당라인을 출력 “grep” 옵션

정규식 사용하기 “^”, “$”, “.” 와 같은 메타 문자 사용

파이프라인 이용

"-v"(invert) 는 지정한 문자열과 일치하는 라인을 제외한 모든 라인을 출력 "-n"(number) 는 문자열이나 패턴과 일치하는 라인들의 번호를 표시 "-c"(count) 옵션은 검색 문자열과 일치하는 라인을 화면에 표시되지 못하게 함 "-l"(listfile) 옵션은 특정한 패턴을 찾기 위해 여러 개의 파일을 검색할 때

"-v"(invert) 는 지정한 문자열과 일치하는 라인을 제외한 모든 라인을 출력 "-n"(number) 는 문자열이나 패턴과 일치하는 라인들의 번호를 표시 "-c"(count) 옵션은 검색 문자열과 일치하는 라인을 화면에 표시되지 못하게 함 "-l"(listfile) 옵션은 특정한 패턴을 찾기 위해 여러 개의 파일을 검색할 때

Page 37: Host  컴퓨터 개발환경 이해

37

파일 사용권한 변경 (1) 사용 권한 변경 - chmod

파일이나 디렉토리의 사용권한을 변경 chmod [OPTION]... MODE[,MODE]... FILE... 8 진수를 사용하여 절대값을 주는 절대모드 (Absolute mode) 방법과 이미

가지고 있는 허용상태를 제거하거나 추가하는 방법으로 사용권한을 지정하는 기호모드 방법 Chmod 777 test.c Chmod +a test.c

사용권한을 표시하는 또 다른 방법으로 숫자 사용 가능 숫자는 3 자리로 구성되며 각 자리는 소유자 , 그룹 , 다른 사람들을 뜻함 읽기 및 쓰기 , 실행 권한 모두가 부여된 경우 7(4+2+1) 로 표현

숫자값 권한4 읽기 권한 (100)2 쓰기 권한 (010)1 실행 권한 (001)0 사용권한이 부여되지 않음 (000)

Page 38: Host  컴퓨터 개발환경 이해

38

파일 사용권한 변경 (2) 기호모드를 사용하는 방법

기호 의미 u(user) 소유자 g(group) 파일이 속한 그룹 o(other) 파일의 소유자가 아닌 모든 사용자와 그룹 a(all) 모든 사용자 즉 소유자 , 그룹 , 그리고 다른 사용자 + 권한추가 - 권한제거 = 명시된 특정한 권한만을 할당하고 나머지는 제거 r 읽기 권한w 쓰기 권한x 실행권한

Page 39: Host  컴퓨터 개발환경 이해

39

파일 관련 명령어

파일 소유자 변경 - chown 파일을 작성하면 리눅스 시스템은 그 사용자를 파일의 소유자로

자동으로 지정 "chown" 명령어를 사용하면 이 소유자를 변경할 수 있음 chown [OPTION]... OWNER[:[GROUP]] FILE...

파일 그룹명 변경 - chgrp 어떤 특정한 파일을 자신이 속하고 있는 그룹보다는 , 다른

그룹에 해당하는 사용자가 파일을 읽고 쓰고 기록할 수 있도록 할 때 사용

chgrp [OPTION]... GROUP FILE...

Page 40: Host  컴퓨터 개발환경 이해

40

파일 압축과 복원 gzip - 대표적인 압축 프로그램 ( 복원은 gunzip)

gzip (option) (file or directory)

bzip2 - “bzcat” 명령어로 현재 압축된 파일 내용을 봄

옵션 :-d 압축을 푼다-l 현재 압축된 파일의 내용을 보여준다-r 현재 디렉토리부터 하위 디렉토리까지 전부를 압축한다 .-t 압축 파일의 완전성을 검사한다 . -v 압축 진행 상황을 보여준다 . -9 최대한 압축한다 .

옵션 :-d 압축을 푼다-l 현재 압축된 파일의 내용을 보여준다-r 현재 디렉토리부터 하위 디렉토리까지 전부를 압축한다 .-t 압축 파일의 완전성을 검사한다 . -v 압축 진행 상황을 보여준다 . -9 최대한 압축한다 .

옵션-d 압축을 해제한다 .-z 파일을 압축한다 . -t 압축 파일의 완전성을 검사한다 . -v 압축 진행 상황을 보여준다

옵션-d 압축을 해제한다 .-z 파일을 압축한다 . -t 압축 파일의 완전성을 검사한다 . -v 압축 진행 상황을 보여준다

Page 41: Host  컴퓨터 개발환경 이해

41

파일 압축과 복원 compress

압축이 완료되면 기존 파일이 없어지면서 확장자가 “ .Z"으로 생성된다 .

압축된 파일의 내용을 보기 위해서는 zcat 명령어를 사용 복원을 위해서는 uncompress 를 사용

단독으로는 별로 쓰이지 않고 tar 명령어와 함께 주로 사용

Page 42: Host  컴퓨터 개발환경 이해

42

파일 묶기 (tar) (1) 여러 개의 파일에 대하여 허가권이나 소유권을 유지하면서

하나의 파일로 묶는 아카이브 (archive) 유틸리티 여러 개의 파일을 묶은 다음 압축하는 것이 일반적인 백업 및

프로그램 배포 형태임 명령의 형식 :

tar options archive-file target-files

옵션 및 의미-c 새로운 아카이브 파일을 작성한다 . -t 묶음파일의 내용을 보여준다 .-x 묶음 파일을 해제한다 . -r 묶음 파일에 새로운 파일을 추가한다 . --delete 묶음 파일에서 특정 파일을 삭제한다 . -u 묶음 파일보다 새로운 파일이면 update 한다 .-v 묶음과정을 보여준다 .-f 묵음 파일명을 지정한다 . -z 묶음실행과 동시에 gzip 으로 동시에 압축한다 .

옵션 및 의미-c 새로운 아카이브 파일을 작성한다 . -t 묶음파일의 내용을 보여준다 .-x 묶음 파일을 해제한다 . -r 묶음 파일에 새로운 파일을 추가한다 . --delete 묶음 파일에서 특정 파일을 삭제한다 . -u 묶음 파일보다 새로운 파일이면 update 한다 .-v 묶음과정을 보여준다 .-f 묵음 파일명을 지정한다 . -z 묶음실행과 동시에 gzip 으로 동시에 압축한다 .

Page 43: Host  컴퓨터 개발환경 이해

43

파일 묶기 (tar) (2) source 디렉토리 전체를 묶기 : tar cvf source.tar source 묶은 파일을 압축하기 : gzip source.tar 압축을 해제하기 : gunzip source.tar.gz 묶은 파일에 담긴 파일 이름 보기 : tar tvf source.tar 묶은 파일에서 내용 풀기 : tar xvf source.tar gzip 과 함께 사용하기

tar cvf – files | gzip –9 > tarfile.tar.gz 묶을 결과를 표준 입출력을 사용하여 곧바로 압축할 수 있음 시간을 절약과 함께 중간 결과를 저장하기 위한 공간 불필요 gunzip –9c tarfile.tar.gz | tar xvf – 물론 압축을 해제한 후 곧바로 풀기 실행 tar(gtar) cvzf tarfile.tar.gz files…

Page 44: Host  컴퓨터 개발환경 이해

44

소프트웨어 패키지 ( 배포판 ) 바이너리 패키지

일반적으로 공유 라이브러리 사용 보안에 문제가 생길 수 있음 패키지 시스템 활용하여 설치 쉬움 : RPM 등

소스 패키지 개선을 위한 개발에 이용가능 자신의 환경에 적합한 컴파일 가능 ( 컴파일러 , OS…) 컴파일 환경을 설정해야 하는 등 설치 어려움

Page 45: Host  컴퓨터 개발환경 이해

45

RPM RPM 이란 ?

RedHat Package Manager 레드햇사에서 만들어낸 패키지 관리 툴의 의미 www.rpm.org 에서 GPL 하에서 자유롭게 공개 , 개발

RPM 실행 설치 파일과 설치 정보를 같이 가지고 있슴 설치될 때 설치 정보를 시스템의 설치 데이타베이스에 갱신 의존성 추적으로 설치 요구조건 검증 및 제거시 사용 현황 파악 rpmfind.net 에 거의 모든 rpm 파일이 존재함

RPM 기능 패키지 자동설치 및 제거 업그레이드 기능 패키지 검증 패키지 정보 검색

Page 46: Host  컴퓨터 개발환경 이해

46

RPM 팩키지 파일명

팩키지 이름 (Package name) 팩키지 이름을 나타내는 것으로 우리가 보통 말하는 실행 프로그램 명

버전 (Version) 현재 팩키지의 버전을 나타냄 .

릴리즈 (Release) 이것은 현재 패키지가 몇 번째로 만들어 졌는가를 나타내는 것으로 보통

패치 버전을 나타냄 . 숫자가 높을수록 최신 파일이고 그만큼 또 안정하다는 것을 나타내어 줌 .

사용되는 시스템의 아키텍처 (Architecture) 를 말함 . 즉 어느 플랫폼에서 작동하는 가를 나타내어 줌 .

확장자 RPM 으로 만들어진 팩키지라는 것을 나타내어 줌 .

팩키지 이름 - 버전 - 릴리즈 - 아키텍처 .rpm

Page 47: Host  컴퓨터 개발환경 이해

47

팩키지 설치 / 제거 / 업그레이드 RPM 팩키지를 설치할 때에는 -ivh 옵션을 같이 사용

RPM 패키지를 설치할 경우에는 -i 옵션을 사용 설치시 설치하는 과정을 보고 싶다면 -i 옵션과 함께 -v 옵션을 사용 RPM 설치 시에도 설치경과 막대그래프를 보기 위해서는 -h 옵션을 사용

RPM 팩키지를 제가할 때에는 -e 옵션을 사용 RPM 팩키지를 업그레이드하기 위해서는 -U 옵션을 사용

일반적으로 -Uvh 옵션을 사용 맨 처음 설치 할 때도 -U 선택사항을 써서 설치할 수도 있는데 이때에는 구

버전의 팩키지가 있으면 제거한 후 설치하고 , 구 버전의 패키지가 없을 때에는 일반적인 설치를 하게 됨

시스템에 설치된 패키지를 모두 알고 싶으면 -qa 옵션 사용 현재 시스템에 bootp 관련 패키지의 설치 유무를 알고 싶을 때

예 ) rpm -qa | grep bootp

Page 48: Host  컴퓨터 개발환경 이해

48

팩키지 정보 검색 팩키지 정보 관련 옵션

질문 옵션인 -q 와 함께 사용하여 패키지 정보 추출 가능 rpm -qi gcc-2.95-4.3wow

-a 현재 설치된 모든 팩키지를 보여준다 .

-f < 파일 > < 파일 > 을 포함한 팩키지가 무엇인지 알아낸다 .

-F -f 와 같지만 파일이름이 표준 입력으로 들어온다는 것만 다르다 .

-p < 팩키지파일 > 지정한 팩키지 파일에 대한 정보를 파악한다 .

-P -p 와 같지만 입력만 표준 입력으로부터 받는다-I 팩키지 이름 , 팩키지에 대한 짤막한 설명 , 패키징 버전 , 크기 , 패키징 날짜 , 설치된 날짜 , 패키징한 업체 등의 정보-l 팩키지가 가지고 있는 파일의 목록 -s 설치된 팩키지에 있는 모든 파일의 상태-d 팩키지에서 문서 (man page, readme 등 ) 로 된 파일의 목록-c 설정 파일로 표시된 파일의 목록 (sendmail.cf, passwd, inittab)

-a 현재 설치된 모든 팩키지를 보여준다 .

-f < 파일 > < 파일 > 을 포함한 팩키지가 무엇인지 알아낸다 .

-F -f 와 같지만 파일이름이 표준 입력으로 들어온다는 것만 다르다 .

-p < 팩키지파일 > 지정한 팩키지 파일에 대한 정보를 파악한다 .

-P -p 와 같지만 입력만 표준 입력으로부터 받는다-I 팩키지 이름 , 팩키지에 대한 짤막한 설명 , 패키징 버전 , 크기 , 패키징 날짜 , 설치된 날짜 , 패키징한 업체 등의 정보-l 팩키지가 가지고 있는 파일의 목록 -s 설치된 팩키지에 있는 모든 파일의 상태-d 팩키지에서 문서 (man page, readme 등 ) 로 된 파일의 목록-c 설정 파일로 표시된 파일의 목록 (sendmail.cf, passwd, inittab)

Page 49: Host  컴퓨터 개발환경 이해

49

소프트웨어 인스톨 예제 : Apache 웹서버 설치 RPM(RedHat Package Manage) 를 사용하는 경우

*.rpm 이라는 이름으로 배포된다 .

소스코드를 컴파일하여 수동으로 설치하는 경우 보통 *.tar.gz 라는 이름으로 배포된다 .

#>rpm –Uvh apache_1.3.19.rpm

gzip xvf apache-1.3.19.tar.gztar xvf apache-1.3.19.tarcd apache-1.3.19make; make install

gzip 압축을 푼다 .

tar 압축을 /apache-1.3.19디렉토리에 푼다 .

컴파일 및 설치

Page 50: Host  컴퓨터 개발환경 이해

50

파일 시스템 mount 마운트 (mount): 블록장치를 파일시스템 트리 (tree) 의 하부

디렉토리를 통해 접근하게 해 주는 명령 CD-ROM 과 플로피 디스크 드라이브 마운트

마운트 해제 : / etc/fstab : 파일시스템 마운트 테이블

시스템 부팅과 함께 자동으로 마운트되어야 할 항목과 옵션

/

mnt

src home

usr ...

cdrom

floppy

mount /dev/cdrom /mnt/cdrommount /dev/fd0 /mnt/floppy

장치명 마운트할 위치

umount /mnt/cdrom

/ dev/hda1 / ext2 defaults 1 1/dev/hdb1 /b ext2 defaults 1 1/dev/fd0 /mnt/floppy auto noauto,owner 0 0...

Page 51: Host  컴퓨터 개발환경 이해

51

파일 시스템 관리 새로운 하드디스크 추가

IDE 디스크의 경우 / dev/hda ~ /dev/hdd 중의 하나의 장치명에 할당됨 (IDE 포트와 master/slave 설정에 따라서 )

파티션을 나누는 명령 : 새로운 파일시스템 만들기

파일시스템 수리

proc 파일시스템 : 시스템 정보를 제공 . /proc 을 통해 접근 가능

fdisk /dev/hdb

mkfs –t ext2 /dev/hdb

파일시스템 type 파티션

fsck –t ext2 /dev/hdb

Page 52: Host  컴퓨터 개발환경 이해

52

파일 시스템 복구와 검사 (fsck) 리눅스 파일 시스템은 매우 복잡함 파일 시스템은 데이터 블록 , 사용하거나 사용하고 있지 않은 블록의

리스트 , 디렉토리와 그 디렉토리 구조에 함께 붙어있는 inode 내의 모든 정보를 포함하고 있음

파일 시스템이 정상적인 종료나 특별한 경우에 손상을 입을 경우 위의 구성 요소들이 일치하지 않을 경우가 있음

fsck(for file system consistency check) 명령은 파일 시스템을 조사하여 손상된 파일을 출력해 주며 사용자에게 그것을 복구할 것인지를 질의

fsck 수행은 시스템마다 약간의 차이가 있지만 대부분 다음과 같은 5개 항목에 대하여 검사 Blocks and sizes, Pathname, Connectivity, Reference count,

Free List

Page 53: Host  컴퓨터 개발환경 이해

53

파일 링크 만들기 (ln) (1) 매우 긴 파일이름이 있고 , 사용자는 이 파일을 자주 참고하거나 , 그

파일을 다른 디렉토리에 연결하여 그 디렉토리에서도 그 파일의 경로 이름을 모두 입력하지 않고 파일 이름만을 입력하여 파일을 사용할 필요가 있을 때 사용

최초에는 링크수가 1 개이지만 , 연결관계를 생성하고 나면 같은 크기의 파일이 새로 생성되어 링크수가 증가

ln

일반형식 ln [OPTION]... TARGET [LINK_NAME]ln [OPTION]... TARGET... DIRECTORYln [OPTION]... --target-directory=DIRECTORY TARGET...

주요옵션 -f : 자신이 액세스 할 수 없는 사용권한을 가졌을 때도 링크가 가능하게 함 -s: 하드 링크 대신에 심볼릭 링크 생성

Page 54: Host  컴퓨터 개발환경 이해

54

파일 링크 만들기 (ln) (2) 하드 링크 :

동일한 파일 시스템 내에서의 링크 여러 개의 레이블 생성이 가능하나 , 물리적 파일은 동일함 하드 링크가 추가될 때마다 링크 계수 항목이 증가

소프트 링크 ( 심볼릭 링크 ) 다른 파일 시스템들 간의 링크 링크 계수 항목이 증가하는 대신에 permission 에 l--- 식으로 기록됨 ls -F 로 참조할 때 파일 이름 뒤에 @ 가 표시됨

$ ln -f -s original newLink-f 슈퍼유저가 디렉토리에 하드 링크를 생성할 수 있게 함-s 소프트 링크로서 파일 시스템을 확장 가능

$ ln -f -s { original }+ driectory명시된 파일 (original) 들에 대한 링크를 directory 에 생성

( 예 ) $ ln hold.3 hold $ ln hold.* tmpdir $ ln -s /usr/include/stdio.h stdio.h $ ls -l stdio.h lrwxrwxrwx 1 mjkim 20 Jan 12 17:58 stdio.h -> /usr/include/stdio.h

$ ln -f -s original newLink-f 슈퍼유저가 디렉토리에 하드 링크를 생성할 수 있게 함-s 소프트 링크로서 파일 시스템을 확장 가능

$ ln -f -s { original }+ driectory명시된 파일 (original) 들에 대한 링크를 directory 에 생성

( 예 ) $ ln hold.3 hold $ ln hold.* tmpdir $ ln -s /usr/include/stdio.h stdio.h $ ls -l stdio.h lrwxrwxrwx 1 mjkim 20 Jan 12 17:58 stdio.h -> /usr/include/stdio.h

Page 55: Host  컴퓨터 개발환경 이해

55

디스크 사용관리 (df, du) 리눅스에서는 사용 가능한 디스크 공간을 검사해 주는 유틸리티인 "d

f" 을 제공 사용자들은 수시로 이 유틸리티를 실행시켜 디스크 용량을 확인해야 함 보통은 "cron" 이라는 셸 스크립트를 실행시키는 것도 하나의 방법이 될

수 있음 용량이 "95%" 가 넘어가면 해당 파일시스템을 검사해야 한다 .

왜냐하면 메일이라든가 , 임시파일 등이 계속 생기므로 어느 정도 여유공간이 항상 있어야 함

이외에도 "du" 명령어가 있는데 이는 현재의 디렉토리와 디렉토리 안의 파일들이 얼마나 많은 용량을 차지하고 있는지를 킬로바이트(Kbyte) 또는 512 byte 단위로 보여줌

Page 56: Host  컴퓨터 개발환경 이해

56

시스템 로그 관리 시스템 디버깅 또는 시스템의 사용을 추적하는데 유용 시스템 로그는 콘솔 (console) 화면 또는 / var/log/message 를

통해 모니터 가능 xterm 화면에서 tail –f /var/log/message 를 실행하면 시스템

로그를 모니터할 수 있다 . 시스템 로그를 볼 수 없는 경우

syslogd 프로그램이 실행 안된 경우 . / etc/rc.d/init.d/syslog start 명령을 통해 syslogd

프로그램을 실행시킨다 .

Page 57: Host  컴퓨터 개발환경 이해

57

관리자로 로그인하기 실습에서 다루는 대부분의 명령은 관리자 (super user; root)

권한을 필요로 한다 . 관리자로 로그인하기

관리자에서 로그아웃하기

# suPassword: [root 패스워드 ]

# su -Password: [root 패스워드 ]

디렉토리를 변경하지 않는다 .USER, PATH 등 주요변수를 변경하지 않는다 .

디렉토리를 root 의 홈디렉토리(/root) 로 변경하고 USER, PATH 등 주요변수도 변경한다 .

# exit

Page 58: Host  컴퓨터 개발환경 이해

58

사용자 관리 사용자 추가

사용자 패스워드 지정 ( 변경 )

사용자 제거

useradd –d /home/ssyoo –s /bin/bash –c “SCM-EM helper.” ssyoo

홈 디렉토리 쉘의 종류 사용자명 사용자 ID

passwd ssyoo

userdel ssyoo

Page 59: Host  컴퓨터 개발환경 이해

59

컴파일 하기

Page 60: Host  컴퓨터 개발환경 이해

60

컴파일 과정 전처리 (preprocessing)

#define, #include, #if 와 같은 전처리 지시자 해석 전처리 작업을 위한 cpp 프로그램을 호출

컴파일 (compile) 고급 언어 소스 프로그램을 입력 받아서 어셈블리 파일을 만듬 (.s) 일반적으로 어셈블리 파일은 저장하지 않고 바로 어셈블러를 호출함 여기서 컴파일은 좁은 의미의 컴파일이며 넓은 의미의 컴파일은 모든 과정을

포함함 어셈블 (assemble)

어셈블리 파일을 입력 받아서 오브젝트 파일을 만듬 (.o) 어셈블을 위한 gas 프로그램을 호출함 어셈블러는 플랫폼 (CPU+OS) 마다 다르며 해당 전용 어셈블러 호출 가능

링크 (linking) 오브젝트 파일을 엮어서 실행 파일을 만듬 (.o) 라이브러리 함수도 이 단계에서 사용함 링크를 위한 ld 프로그램을 호출

Page 61: Host  컴퓨터 개발환경 이해

61

gcc 사용법 GNU C Compiler , GNU Compiler Collection 의미 FSF (Free Software Foundation) 의 C, C++ 컴파일러 컴파일러 , 어셈블러 , 로더 역할을 함 한 개의 파일 (hello.c) 를 컴파일 하기

$gcc –o hello hello.c -o 옵션 : 실행파일명을 지정하는 옵션 -S 옵션 : c 언어 컴파일 과정 까지만 처리 -> 어셈블리 코드 출력

모든 컴파일 과정을 한번에 처리하기 $ gcc –o hello hello.c hello_world.c

-o 옵션이 없으면 a.out 이 실행 파일임 컴파일러 매크로

컴파일러가 파일을 제어할 때 사용하는 정보 -D 옵션을 사용한 매크로 정의

$ gcc –c –DEM_FILE=“embedded” helloworld.c -DEM_FILE 은 소스에서 #define EM_FILE embedded 와 동일한 결과

-U 옵션은 매크로 정의를 해제함 - #undef 와 동일한 효과임

Page 62: Host  컴퓨터 개발환경 이해

62

gcc 컴파일러 컴파일러 옵션

-I ( 아이 ) 옵션은 헤더 파일 위치 지정 $ gcc –I../include hello_world.c 비표준 라이브러리를 위한 헤더 파일의 디렉토리를 지정

-l ( 엘 ) 옵션은 라이브러리 지정 $ gcc –o hello hello.o hello_test.o –lm -lm 은 수학 라이브러리를 포함한다는 의미 표준 라이브러리를 담고 있는 디렉토리에서 libm.a 을 찾음

-L 옵션은 비표준 라이브러리 지정 $ gcc –o hello –L/usr/local/mylib hello.o hello_test.o –lx 표준 라이브러리가 아니 비 표준 라이브러리 사용 표준 라이브러리가 이곳에 있으면 우선적으로 사용

Page 63: Host  컴퓨터 개발환경 이해

63

gcc 컴파일러 옵션

옵션 v (verbose) 컴파일러의 버전과 각 단계에서 실행하는 자세한 사항을 출력 Wall - 모호한 코딩에 대하여 자세한 경고 메시지 W - 합법적이지만 다소 모호한 코딩에 대하여 부가적인 경고 메시지 출력 traditional : 전통적인 C 언어 지원 ansi : ANSI C 표준 지원 C : 전처리기에서 주석을 지우지 않음 ( 디버깅 시 필요 ) nostartfiles : 링크할 때 표준 시스템 구동 파일을 사용 안함

크로스 컴파일 시 , 임베디드 프로세서에 사용됨 nostdlib : 링크할 때 표준 라이브러리와 구동 파일을 사용 안함

위와 마찬가지의 경우 타겟 시스템 라이브러리 제공 static : 정적 (static) 라이브러리와 링크 shared : 가능한 한 공유 라이브러리와 링크하고 공유 라이브러리가 없는 경우에만 정적 라이브러리와 링크 ( 기본값 )

옵션 v (verbose) 컴파일러의 버전과 각 단계에서 실행하는 자세한 사항을 출력 Wall - 모호한 코딩에 대하여 자세한 경고 메시지 W - 합법적이지만 다소 모호한 코딩에 대하여 부가적인 경고 메시지 출력 traditional : 전통적인 C 언어 지원 ansi : ANSI C 표준 지원 C : 전처리기에서 주석을 지우지 않음 ( 디버깅 시 필요 ) nostartfiles : 링크할 때 표준 시스템 구동 파일을 사용 안함

크로스 컴파일 시 , 임베디드 프로세서에 사용됨 nostdlib : 링크할 때 표준 라이브러리와 구동 파일을 사용 안함

위와 마찬가지의 경우 타겟 시스템 라이브러리 제공 static : 정적 (static) 라이브러리와 링크 shared : 가능한 한 공유 라이브러리와 링크하고 공유 라이브러리가 없는 경우에만 정적 라이브러리와 링크 ( 기본값 )

Page 64: Host  컴퓨터 개발환경 이해

64

컴파일러 옵션 컴파일러 옵션 : 디버깅과 프로파일링

컴파일할 때 디버깅을 위한 코드와 심볼 테이블을 삽입

컴파일러 옵션 : 최적화 프로그램의 수행속도를 컴파일러가 최적화함 gcc 는 최적화와 디버깅 옵션을 동시 사용하도록 허용 최적화 옵션

O - 옵션 01 과 동일 O0 - 최적화 안함 ( 기본값 ): 정확한 동작 / 컴파일 시간 적음 O1 - 코드 크기와 실행 시간을 줄여 줌 O2 - 더 많은 최적화를 수행함

O - 옵션 01 과 동일 O0 - 최적화 안함 ( 기본값 ): 정확한 동작 / 컴파일 시간 적음 O1 - 코드 크기와 실행 시간을 줄여 줌 O2 - 더 많은 최적화를 수행함

g - 디버거 gdb 에서 쓸 수 있는 확장된 심볼 테이블 생성 p - prof 에서 프로파일링 할 수 있는 프로그램 생성 pg - gprof 에서 프로파일링 할 수 있는 프로그램 생성

g - 디버거 gdb 에서 쓸 수 있는 확장된 심볼 테이블 생성 p - prof 에서 프로파일링 할 수 있는 프로그램 생성 pg - gprof 에서 프로파일링 할 수 있는 프로그램 생성

Page 65: Host  컴퓨터 개발환경 이해

65

컴파일러 최적화 옵션

컴파일러 옵션 : 옵션 넘겨 주기 어셈블러에게 옵션 넘겨주기

-Wa,option-list Option-list 에는 여러 개의 옵션이 콤마 (,) 로 분리되어 들어감

링커에 옵션 넘겨주기 -Wl,option-list Option-list 에는 여러 개의 옵션이 콤마 (,) 로 분리되어 들어감

ffast-math : 부동 소수점 연산에 대하여 최적화를 수행함finline-functions : 단순한 함수의 경우 inline 함수로 변경하여 사용함fno-inline : 모든 inline 을 금지함funroll-loops : 고정된 반복 횟수의 반복문을 모두 전개함

ffast-math : 부동 소수점 연산에 대하여 최적화를 수행함finline-functions : 단순한 함수의 경우 inline 함수로 변경하여 사용함fno-inline : 모든 inline 을 금지함funroll-loops : 고정된 반복 횟수의 반복문을 모두 전개함

Page 66: Host  컴퓨터 개발환경 이해

66

어셈블러 (Assembler)

어셈블리 프로그램에서 오브젝트 모듈 생성

각 플랫폼마다 별도의 GNU 어셈블러 존재

어셈블러 실행 $ as list-of-options list-of-source-files

assemble 옵션

-ah : C 프로그램의 리스트를 생성함

-al: : 어셈블리 언어 코드의 리스트를 생성함

-as : 심볼 테이블에 대한 리스트를 생성함

Page 67: Host  컴퓨터 개발환경 이해

67

링커 (linker) ld 링커

오브젝트 모듈과 라이브러리들을 결합하여 실행 파일 생성 외부 변수 , 외부 함수 , 라이브러리에 대한 참조 위치를 찾아내어 완전한 실행

프로그램 생성 일반적으로 ld 를 직접 수행하지 않고 gcc 로 수행함

모든 라이브러리의 위치를 일일이 적어 줄 필요 없음 기본 라이브러리를 포함 시켜 줌

ld 실행 $ ld list-of-options list-of-files-and-libraries 라이브러리는 – llib-name 형태로 사용 , 파일과 라이브러리 순서 중요 라이브러리의 경우 외부 참조에 의하여 필요한 함수만 추출함

$ ld prog1.o –lm prog2.o ==> prog2 는 math 함수를 사용하지 않음 순서와 관계없이 라이브러리에서 모듈을 찾기 위하여 색인을 생성함

$ ld prog1.o –lat –lfo ==> fo 라이브러리에서 at 함수 사용 시 에러 ranlib 를 사용하여 색인을 만들어 주면 에러 발생 안함

Page 68: Host  컴퓨터 개발환경 이해

68

링커 (linker) ld 실행 파일 만들기

실행 파일 생성시 시작 위치는 첫째 파일의 시작 부분임 C 프로그램의 시작점과 같지는 않음 OS 에서 프로그램 시작 전에 표준 런 타임 초기화 루틴을 실행 플랫폼마다 제공되며 , 보통 유닉스 계열에서는 / lib/crt0.o

gcc 와 ld 다음의 두 표현은 동일

$ ld –dc –dp –e start –X –o a.out /usr/lib/crt0.o test.o -lc

$ gcc test.o

Page 69: Host  컴퓨터 개발환경 이해

69

링커 (linker) ld 옵션들

-o name : 실행 파일 이름 지정-lname : 표준 라이브러리 링크 (/lib /usr/lib)

-Ldir : 표준 라이브러리 디렉토리 추가-s : 실행 파일에 심볼 테이블 제거 (ref. strip 명령 )

-x : 출력 파일에 로컬 심볼 제거-n : 텍스트 영역을 읽기 전용으로 만듦-r : 추후에도 링크 할 수 있도록 오브젝트 파일 만듦-e name: 실행 파일의 시작위치를 name 심볼로 사용-M : 전역 심볼의 값이 어느 함수에 위치하는지 보여주는 로드맵 작성-b format : 오브젝트 파일을 주어진 형식으로 읽어 들임-oformat format: 주어진 형식의 오브젝트 파일을 생성

-o name : 실행 파일 이름 지정-lname : 표준 라이브러리 링크 (/lib /usr/lib)

-Ldir : 표준 라이브러리 디렉토리 추가-s : 실행 파일에 심볼 테이블 제거 (ref. strip 명령 )

-x : 출력 파일에 로컬 심볼 제거-n : 텍스트 영역을 읽기 전용으로 만듦-r : 추후에도 링크 할 수 있도록 오브젝트 파일 만듦-e name: 실행 파일의 시작위치를 name 심볼로 사용-M : 전역 심볼의 값이 어느 함수에 위치하는지 보여주는 로드맵 작성-b format : 오브젝트 파일을 주어진 형식으로 읽어 들임-oformat format: 주어진 형식의 오브젝트 파일을 생성

Page 70: Host  컴퓨터 개발환경 이해

70

라이브러리 만들기 ar 명령으로 오브젝트 모듈의 라이브러리 만듦 하나의 프로젝트를 이루는 여러 목적 모듈들을 만들고 이들을

그룹화시키기 위해 사용 새로운 라이브러리 생성

$ ar rs libname list-of-files r 옵션 : 파일을 추가하고 없으면 새로운 라이브러리 생성 s 옵션 : 정적 라이브러리 색인 생성 (ranlib 불필요 )

라이브러리 갱신 $ ar rus libname list-of-files 라이브러리의 모듈과 파일의 날짜를 비교하여 갱신

라이브러리에서 파일 지우기 $ ar ds libname list-of-files

라이브러리에서 파일 추출 $ ar x libname list-of-files

Page 71: Host  컴퓨터 개발환경 이해

71

공유 라이브러리 업그레이드 공유 라이브러리와 정적인 라이브러리 분리

정적 라이브러리 일반적으로 / usr/lib 에 있으며 libXXX.a 로 존재 컴파일 시에 사용됨

동적 라이브러리 / lib 에 있으며 libXXX.so.version 으로 되어 있음 Version 은 major.minor 로 구성되어 있음 Ld.so 는 version 에서 major 번호만 참조함

정적인 라이브러리는 복사로 완료 동적인 라이브러리는 소프트링크로 연결

Page 72: Host  컴퓨터 개발환경 이해

72

Make(1) Make 기능 및 목적

컴파일을 자동화 하는 프로그램 실행 파일을 만드는 과정 ( 빌드 ) 을 정의하면 필요한 작업만을 수행하여

실행 파일 생성 프로그램 그룹 중에서 어느 부분이 새롭게 컴파일 되어야 하는지를

자동적으로 판단해서 필요한 명령어를 이용해서 그들을 재 컴파일 . 다중 모듈 프로그램의 재사용을 유지하고 , 프로그램 수정에 대한 재번역을

최소화 gmake gnumake 는 make 보다 발전된 것임

Make 사용 입력 파일이 변경되면 자동적으로 결과 파일이 변경되기를 원할 때나 명령어

방식으로 처리되는 모든 곳에 유용하게 사용 가능 . 파일의 상호 의존 관계를 나타내는 목록 파일 (makefile) 이 필요

GNUmakefile, Makefile, makefile 중 하나의 파일이 필요 . makefile 을 참조하여 파일을 최신버전으로 개정

Page 73: Host  컴퓨터 개발환경 이해

73

Make(2)

Make 사용법 make [ -f makefile_name ]

-f : 파일이름 명시 기본이름 : Makefile, 복수개의 파일과 목적 파일 컴파일

makefiles 이름에 제한이 없으나 파일 이름 뒤에 .make 표기 권장

Page 74: Host  컴퓨터 개발환경 이해

74

Make(3) makefiles 작성 및 규칙

targetList : dependencyList

[TAB] commandListtargetList : 목적 파일 목록 dependencyList : 의존 파일 목록 commandList : 명령어 목록

master : master.o pirami.ogcc master.o pirami.o -o master

master.o : master.c pirami.h gcc -c main.cpirami.o : pirami.c pirami.h

gcc -c pirami.c

( 예 )

Page 75: Host  컴퓨터 개발환경 이해

75

Make(4) make 규칙 순서

( 예 )

규칙을 순서대로 조사하면서 상호 의존 트리를 작성 make 는 leaf 노드에서 root 노드까지 진행하면서 부모 노드의

마지막 수정시간이 자식 노드의 수정시간보다 이전이거나 없으면 명령어 목록대로 수행

master

master.o pirami.o

master.c pirami.h pirami.c pirami.h

Page 76: Host  컴퓨터 개발환경 이해

76

Make(5) make 실행

$ make -f main1.make 매크로 (Macros)

make 에서 지원하는 기능 일련의 반복되는 특정 코드를 간단하게 표현 . 사용법

이름 = 내용들… $( 이름 ) , ${ 이름 } , 대문자로 작성 . ( 예 )token = replacementText

make 파일 내에 모든 $(token) 는 replacementText 로 대치 정해진 Macro

ASFLAGS, CFLAGS, CPPFLAGS …

Page 77: Host  컴퓨터 개발환경 이해

77

Makefile 작성 예OBJECTS = main.o helloworld.ohelloworld: $(OBJECTS)

[TAB]gcc –o helloworld ($OBJECTS)main.o: main.c

[TAB]gcc –c main.chelloworld.o: helloworld.h helloworld.c

[TAB]gcc –c helloworld.cclean:

[TAB]rm $(OBJECTS) helloworld

.SUFFIXES: .c.oOBJECTS = main.o helloworld.oCC = gccCFLAGS = -g -cTARGET = helloworld$(TARGET): $(OBJECTS)

$(CC) -o $(TARGET) $(OBJECTS)clean:

rm $(TARGET) $(OBJECTS) coremain.o: main.chelloworld.o: helloworld.h helloworld.c