리눅스 스터디 - 5

2018. 1. 21. 23:10

리눅스 입문은 다끝났고(하나는 아직 적지는 않았지만..)

이제 시스템 프로그래밍을 하려고 합니다.

앞의 입문과 겹치는 부분들이 꽤많이 있을겁니다.



1. 리눅스 디렉터리 구조

    

 

 - 상세정보(=>은 리눅스 마스터 2급책에 적혀있는 내용)

    /: Root Directory


    /bin, /sbin: 시스템을 사용하기 위한 기본적인 명령어들이 시스템 관리 명령어와 시스템을 복구할 때 사용하는 필수 명령어 등이 존재.

    => 실행파일들이 들어있다. 흔히 말하는 명령어가 들어있는 디렉터리로 보통 PATH가 설정되어있다


    /boot: PC 전용으로 일반적으로 사용되는 디렉토리며, 부팅에 필요한 커널등이 존재.

    => 부팅 이미지 파일이나 커널 등 시스템 부팅시 필요한 파일이 있는 디렉터리, 최근 리눅스 버전에서 부트로더로 사용되는 grub관련파일도 이 디렉터리에 들어있음


    /dev: Device driver관련된 모든 장치 파일이 위치한다. (2.6버전 부터는 udev, sysfs와 연동)

    => hdd, cd-rom, 터미널 등과 같이 실제로 존재하는 물리적인 장치등을 파일화 하여 관리하는 디렉터리


    /etc: 시스템 설정파일들이 위치

    => 시스템 환경설정 파일 및 부팅과 관련된 여러 스크립트 파일들이 존재, 이들 파일에 설정된 내용을 읽어 관련프로그램들이 실행된다


    /home: 개인 사용자들의 홈 디렉토리가 위치한다(ftp, mysql, tomcat 등 별도의 공간을 요구하는 서비스를 위한 디렉토리로 사용할 수도 있다.)


    /lib: 공유 라이브러리와 부팅할 때 사용되는 커널 모듈(가징 필수적인)이 위치한다.
    => 각종 라이브러리가 저장되어있는 디렉터리, 커널모듈도 이 디렉터리에 들어있다

    /lost+found: fsck가 파일시스템을 점검할 때 손상된 데이터를 복구하지 못했다면 lost+found 디렉토리에 복구하지 못한 데이터 파일을 위치시킨다. 일반적으로 특정 파일시스템으로 포맷되거나 마운트되면서 생기는 경우가 많다.

    => fsck 명령어를 이용하여 파일시스템을 복구할 때 작업하는 디렉터리, RHEL 7버전 부터는 사용되지 않음

 

    /mnt: 저장 장치를 일시적으로 마운트하기 위한 마운트 포인트를 제공, 일반적으로 해당 디렉토리는 비어 있음
    => cd-rom, hdd, 네트워크 파일시스템(nfs) 등을 마운트할때 포인터가 되는 디렉터리. 최근 리눅스 버전에서는 마운트할 장치가 늘어남에 따라 /media, /net등을 추가로 제공한다

 

    /opt: 애드온 패키지가 설치되는 디렉토리, 임베디드 시스템에서는 주로 툴 체인 등이 위치
    => 응용프로그램들의 설치를 위해 사용되는 디렉터리

 

    /proc: 프로세스와 시스템 정보를 제공하기 위한 목적으로 설계된 가상 파일 시스템을 사용하는 디렉토리
     - (내부 파일은 cat 혹은 more 명령어로 읽을 수 있으며 특정 파일의 경우 echo 같은 명령어로 내용을 변경할 수도 있다. 주로 디버깅 용도로 많이 사용)

    => 가상파일시스템으로 시스템에서 운영되고있는 다양한 프로세스의 상태정보, 하드웨어 정보, 기타 시스템 정보등을 담고있다

    /root: 루트 사용자의 홈 디렉토리


    /sbin

    => system binary의 약자로 주로 시스템 관리에 대한 명령어들이 들어있다. 보통 슈퍼유저인 root가 사용한다. 시스템 종료명령, 네트워크 인터페이스 설정명령, 시스템 점검과 복구 등의 명령어들이 들어있다.


    /tmp: 임시 파일을 저장하는 디렉토리.(수시로 생성되고 삭제되기 때문에 NAND나 NOR를 이용한 root filesystem에서는 주의)
    => 임시 저장디렉터리, 각종프로그램이나 소켓파일, 프로세스 작업을 할 때 임시로 생성되는 파일을 저장하는공간. 일반적으로 모든사용자에게 접근을 허용한다

 

    /usr: 과거에는 시스템 부팅에 반드시 필요하지 않은 유틸리티 파일들이 존재하는 디렉토리였으나, 최근에는 부팅시 필요한 패키지들도 존재하게 됨으로써 반드시 구성해 주어야 하는 디렉토리
    => 시스템 운영에 필요한 명령, 응용프로그램들이 위치하는 디렉터리. 커널소스, c언어 헤더파일, c컴파일러와 같은 개발도구, x-window, (리눅스에서 서버관리를 위해 사용하는)아파치나 mysql, phq등이 존재한다. 이 디렉터리의 주요 하위디렉터리로는 응용프로그램의 명령어들이 들어있는 /usr/bin, /usr/sbin등과 로컬에서 추가로 설치할 때사용되는 /usr/local등이 있다.


    /var: 내용이 자주 변경되는 가변 자료가 저장되는 디렉토리
     - (시스템 운영할 때 발생되는 로그(log), 메일 송/수신할 때 임시로 저장되는 스풀(spool), 프린터로 전송하기 위해 임시로 저장하는 프린트 스풀 데이터 등이 저장된다)

    => 시스템 운영 로그(log)파일과 스풀링(spooling)과 같은 가변적인 데이터를 보관하는 디렉터리, 메일서버로 운영하는 경우 도착한 메일이 이 디렉터리의 하위 디렉터리에 존재하게 된다

 

 

  ※ 추가된 디렉터리
    /media: 이동식 장치인 cdrom, floppy등을 마운트하기 위해 제공되는 디렉터리. RHEL 3버전까지는 모든 장치들이 /mnt디렉터리를 이용하였으나, 2.6커널기반인 RHEL 4부터 이 디렉터리가 추가되어 사용된다

 

    /selinux: RHEL 4부터 보안강화를 위해 사용되는 SELinux관련 디렉터리이다

 

    /srv: RHEL 4부터 등장한 디렉터리, 사이트에서 생성되는 데이터를 저장하는 디렉터리. 앞으로 /var을 /srv로 대체할 가능성이 있다

 

    /sys: 2.6 버전 커널에서 새로 생겨난 kernel device model지원을 위해 사용되는 디렉토리

    => (2.6커널에서 사용되는)가상파일시스템인 sysfs에서 사용하는 디렉터리이며, usb처럼 hot plug 하드웨어 정보를 가지고 있는 디렉터리이다. /proc디렉터리에서 기본적인 하드웨어 정보를 제공하나 이 디렉터리에서는 계층적인 구조로 정보를 제공한다

 

    /cgroup: cgroup(control group)은 시스템 상에 동작중인 태스크들을 임의로 그룹지어 제어할 수 있도록 도와주는 기능을 제공하는데, 이러한 관련정보를 담고 있는 디렉터리이다.

 

    /lib64: 64비트용 리눅스(x86_64)를 설치하는 경우에 생성되는 디렉터리로 64비트 기반의 라이브러리 관련 디렉터리이다

 

    /run: 부팅이후에 동작중인 프로세스의 런타임(runtime)데이터를 저장하고 있는 디렉터리. RHEL 7버전 부터 등장, 프로세스 아이디(PID) 파일과 락파일(rock file)이 생성되고, 재부팅하면 다시생성된다. RHEL 6이전 버전에서 사용되었던 /var/run, /var/lock을 합병하였다.

 

 

 

 

2. 리눅스 커널 아키텍쳐

   

 

 

 

 

3. 리눅스 부팅 절차

   

 

 - 참고

    http://www.oss.kr/info_techtip/show/54167d44-ec01-4755-a357-41f3ff1362dd

 

 

 

 

4. GNU(gnu's not unix)

 - 80년대 초 리처드 스톨만에 의해 시작된 라이센스, 소프트웨어의 공개개념을 표방

 - GPL(gnu public license)

    gpl에 의거한 모든 프로세스는 무료

    변경 사항을 포한해 재판매는 가능하나, 소스는 공개해야한다

    프로그래머는 자신의 소프트웨어로 발생하는 어떤 위험이나 손해에 대한 법률적 책임이 없음

 

 

 

 

5. POSIX(portable operating system interface)

 - IEEE(institute of electrical and electronic engineer)에서 제안한 표준 애플리케이션 프로그래밍 인터페이스(API) 규격

 - 대부분의 단제, 회사들이 이를 지원하며, 유닉스(리눅스)또한 posix를 따르고 있다

 - 소스레벨에서 호환성을 보장한다.

 - 이 규격을 따르면 유닉스와 직접적인 연관이 없어도 유닉스 호환(Unix-like) 운영 체제라고 부른다.

 - Windows에서는 유닉스(리눅스)지원을 위한 서브시스템을 탑재하는 경우 posix를 지원한다
 - Windows NT/Windows Server 2003,2008/Windows 7/Windows 10: 지원, Windows XP/Windows 8: 미지원

 - 참조

    https://namu.wiki/w/POSIX

    https://technet.microsoft.com/ko-kr/library/cc754351(v=ws.11).aspx

 

 

 

 

6. 리눅스 문자 표현

 - *(asterisk): 모든 문자와 대응

    ex: ls*.c

 - ?(question mark): 하나의 문자와 대응

    ex: ls test?.?

 - [...](brackets): 괄호 안 문자중 한 문자와 대응

    ex: ls test[1-5].c / ls *[12345].c

 - \(backslash): 특수문자 표현시 사용

    ex: \*.c => 모든 문자가 아닌 이름이 *인 c파일을 의미한다

 

 

 

 

7. vi 찾기 패턴

 - '명령어: 설명' 순으로 기술됨

 - /pattern: 찾기

 - / or n: 찾기 반복(위에서 아래로 진행)

 - ? or N: 찾기 반복(아래에서 위로 진행)

 - :g/pattern/: 파일에서 pattern이 찾아지는 마지막 위치로 이동

 - :g/pattern/p: 파일에서 pattern을 찾아 화면에 출력

 - :1,30 s/aa/bb/gc: 1줄부터 30줄까지 aa를 bb로 확인 및 바꾸기(g는 계속 바꾸기, c는 확인 옵션)

 - fx: 현재줄에서 x문자 찾기(x는 임의의 한개의 글자로 의미한다)

 

 

 

 

8. ctags

 - 리눅스에서 지원하는 tags 데이터베이스를 생성하여 원하는 심볼을 쉽게 탐색할수 있는 기능

 - 방대한 소스코드 작성시 사용한다

 - 함수 검색 및 사용이 간편해진다

 - vim의 taglist를 설치하면 vim내부에서도 태그 검색이 가능하다.

 - cscope: ctags가 지원하지 못하는 함수 콜 등의 탐색이 가능한 도구(마찬가지로 데이터 베이스를 생성해야한다)

 - 참고

    http://bowbowbow.tistory.com/15

 

 

 

 

9. 형상관리

 - 하드웨어에서 출발한 개념으로 부품에 대한 선형상 항목을 관리하기 위한 규칙을 의미한다.

 - 예를 들어 각 부품을 형상 항목으로 관리하며, 기존 인터페이스를 유지하며 특정항목에 대한 기록을 남긴다

 - 소프트웨어 형상관리(SCM, software configuration management)는 버전관리(software version control)라고도 부른다

 - 개발하는 소스에 대한 버전관리 툴로서 사용한다.(cvs, svn, 요즘에는 git 사용)

 - 형상관리 툴을 사용하면 개발 완료된 프로젝트에 대한 유지보수가 용이해진다

 - 버전관리에는 수정병합(복사하여 수정하는 방식, 충돌사항은 사용자끼리 조율), 잠금예약방식(수정시 lock을 걸어 다른사람은 read로만 가능) 등이 있다

 

 

 

 

10. GIT

 - git는 기본적으로 그 시점의 모든 파일의 상태에 대한 snapshot를 찍어 그 snapshot에 대한 정보를 저장한다.(즉 복사x)

 - 변경사항이 없는 파일은 저장하지 않고, 이전 snapshot에서 링크만 하게된다.

 - 위의 특징으로 소스용량이 감소하는 특징있다.

 - 특징

    항상 네트워크에 있는 svn과는 다르게 로컬에서 읽어들이므로 속도가 빠르다

    git에 데이터를 추가하게되면 저장된 데이터를 지우거나 변경하기 어렵다

 - git의 디렉터리

    git: 프로젝트를 위한 메타데이터 디렉터리

    working: 변경된 이력을 모아놓은 디렉터리

    staging: working디렉터리에서 변경된 이력을 모아놓은 집합

 - git 사용법

    개발자는 작업디렉터리에 있는 파일을 수정한다

    수정된 파일을 모아 정리하며 snapshot를 staging 디렉터리에 추가하고 저장한다

    git디렉터리에 저장한다

 - 이 이상은 43.p~, 0424\1progit.ko.pdf를 참조한다

 

 

 

 

11. TFTP와 NFS

 - tftp는 udp를 사용하는 프로토콜로 주로 임베디드 보드의 이미지 다운로드에 쓰이고 있다.

 - nfs(network file system)

    임베디드용 응용 프로그램을 개발하여 테스트하기 위해서는 컴파일한 실행 파일을 램에 로딩해한다. 하지만 사용자가 수정한 응용프로그램을 컴파일할 때마다 램을 host에 mount하기 힘들다. 이때 nfs라는 네트워크를 통해 파일시스템에 접근, 응용프로그램을 mount할 수 있다(즉 편의성 향상)

 - 자세한것은 65.p~참조

 

 

 

 

12. GCC(gnu compiler collection)

 - 리처드 스톨만이 만든 컴파일러

 - binutils(GNU 바이너리 유틸리티)에 들어있는 as를 불러서 목적파일로 만든 후 ld를 불러 최종파일을 만들어낸다

 - 지원 언어: ada, c, c++, fortran, java, objective-c, objective-c++

 - 파일 확장자에 따른 gcc의 동작

    .c - 전처리를 해야하는 c소스

    .C - 전저리를 해야하는 c++소스(.cc, .cpp, .cxx)

    .i - 전처리를 하지 않을 c소스(이미 전처리가 된 소스를 의미)

    .ii - 전처리를 하지않을 c++소스

    .m - 오브젝트 c소스

    .h - c헤더 파일(컴파일과 링크를 안한상태)

    .s - 어셈블리코드

    .S - 전처리를 해야하는 어셈블리코드

 - 컴파일 옵션

    -I - 표준 다렉터리가 아닌 위치에 있는 헤더파일의 디렉터리를 지정

    -o - 출력파일의 이름을 지정

    -c - 링크단계 앞에서 컴파일 과정을 멈춘다(오브젝트파일생성)

    -E - 전처리 과정만 수행

    -l - 라이브러리를 지정(-l파일명)

    -L - 라이브러리 폴더를 찾아 지정(-L경로)

    -D - 심볼에 대한 값을 지정(소스코드의 define와 같다)

    -S - 어셈블리 코드까지만 작성한후 컴파일 종료

    -x - 입력파일에서 쓰이는 언어를 설정

    -X none - -x옵션으로 설정한 정의 해제

 - 기타 옵션참조

    http://egloos.zum.com/program/v/1373351

 

 

 

 

13. 컴파일 과정

 - 과정: 소스파일(.c) -(전처리)-> 전처리된 소스파일(.i) -(컴파일)-> 목적파일(.o) -링크-> 실행파일(.bin, .out, .elf등) 

 - 과정 확장:

    소스파일(.c) -(전처리)-> 전처리된 소스파일(.i) -(컴파일)-> 어셈블리소스파일(.s) -어셈블(어셈블리 컴파일)-> 목적파일(.o)

     -링크(ld)-> 실행파일(.bin, .out, .elf등)

 - 전처리: 필요한 헤더파일을 삽입하고 실행 문장의 매크로를 상수로 변환하고 file.i를 임시 파일로 생성한다

 - 참조

    http://onecellboy.tistory.com/146

 


 

 

'Study > Linux' 카테고리의 다른 글

리눅스 스터디 - 6  (0) 2018.02.04
정적, 동적 라이브러리 실습  (0) 2018.01.22
리눅스 스터디 - 4  (0) 2018.01.21
리눅스 스터디 - 3  (0) 2018.01.15
리눅스에서 c컴파일하고 실행하기(gcc옵션)  (0) 2018.01.12

+ Recent posts