PART 01 > ch 02 리눅스 시스템의 이해

정희수·2021년 2월 10일

리눅스 설치를 위한 HW 정보 파악

  • 메모리(RAM): 32bit 리눅스 OS에서는 페이징 기법 차이로 4GB 이상의 RAM 인식 못 한다. 즉 한 프로세스가 4GB 이상의 메모리를 요구하는 경우 사용 못 한다. 이 경우에는 64bit를 사용해야한다. 64bit 리눅스 OS는 물리적 메모리 16TB 이상 지원한다.
  • 하드 디스크 드라이브: 리눅스는 모든 장치를 파일화하여 관리한다. 하드 디스크 인터페이스에 따라 파일명이 달라진다.
    IDE, ATA : /dev/hdx
    USB,SSD,SCSI,S-ATA : /dev/sdx

HW 선택 => RAID, LVM

1. RAID

여러 개의 하드 디스크가 있을때 동일 데이터를 다른 위치에 중복으로 저장하는 방법이다.
HW적, SW적 방법이 있다. HW 수준의 RAID에서 전원이 켜져있을때 하드 드라이브를 교체할 수 있는 핫스왑 베이가 있다.

  • RAID 기술
    (1) 스트라이핑: 연속 데이터를 여러 디스크에 Round Robin 방식으로 기록하는 기술
    (2) 미러링: 에러 발생시 데이터 손실을 막기 위해, 하나 이상의 장치에 중복 저장하는 기술 (='결함 허용'이라고도 부른다)

  • RAID 종류(p52)
    - RAID-0: 스트라이핑
    - RAID-1: 미러링, 동시 읽기+쓰기는 단일 디스크와 같음
    - RAID-2: 스트라이핑+ECC(에러 감지&수정)
    - RAID-3: 스트라이핑+parity용 디스크 하나
    - RAID-4: 블록형태의 스트라이핑 기술, 병목형상 발생할 수 있다.
    - RAID-5: 최소 3개 디스크, RAID-0단점과 RAID-1단점 보완하여 저장 공간의 효율성 높다.
    - RAID-6: 최소 4개 디스크, 2차 패리티 포함한다. RAID-5에 비해 공간 효율성은 떨어지고 처리속도 떨어지나 데이터 신뢰도는 높다.
    - RAID-7: 실시간 운영체제를 사용하여 속도 빠른 버스 이용
    - RAID 0+1: 반을 스트라이핑=>반은 미러링
    - RAID-10: 미러링=>스트라이핑
    - RAID-53: RAID-3에 스트라이프 어레이를 구성한다.

2. LVM (logical volume manager)

여러개의 하드디스크를 하나로 뭉쳐서 하나의 디스크처럼 만들 수 있고 또는 2개 하드 디스크를 3개의 하드 디스크인 것처럼 사용 할 수도 있다. LVM은 파티션 대신 Volume이란 단위로 저장 장치를 다룬다.

  • LVM 구성 순위: 물리적 볼륨(PV) => 볼륨그룹(VG) => 논리적 볼륨(LB)
    논리적 볼륨은 디스크 구조와 상관없이 원하는 크기로 생성 가능하다. 특정 시점 데이터 보존하는 snapshot 기능, 데이터 유지한 상태로 디스크 확장 및 제거 가능하다.
    물리적확장(PE)은 PV에서 나누어 사용하는 일종의 Block같은 영역을 말한다. 1PE가 보통 4MB정도 할당된다.

부트 매니저

  • 부팅 도와주는 프로그램 (= 부트로더)
  • 하드디스크 맨 앞쪽 영역 MBR(master boot record)에 설치됨. MBR은 부트섹터로 디스크 첫 섹터(0번)에 해당한다.
  • LILO와 GRUB가 있는데, CentOS 7부터 GRUB2버전 사용

GRUB

  • 환경 설정 파일 '/boot/grub2/grub.cfg' (심볼릭 링크 파일인 /etc/grub2.cfg) => grub.cfg는 셸 스크립트 형태
    grub.cfg는 /etc/default/grub와 /etc/grub.d 안의 파일을 참고한다.
    GRUB 운영에 관한 주요 설정은 /etc/default/grub파일에 있다.
    환경설정 변경 후에는 반드시 grub2-mkconfig명령 실행해야한다.
    - default=1: 부트 화면에 제시된 목록 중 기본적으로 부팅할 모드를 선택, 0부터 N까지 => 두번째 항목의 OS 부팅한다.
    - timeout=100: GRUB 부트 화면에서 대기 시간을 초단위로 지정 => 100초 후에 자동으로 부팅한다.

리눅스 디렉터리 구조 및 역할

/bin: 실행파일, 명령어 cp, mkdir 등이 들어있다.
/boot: 시스템 부팅 시 필요한 파일
/dev: 하드 디스크 등 실제로 존재하는 물리적 장치 등을 파일화 하여 관리하는 디렉터리
/etc: 시스템 환경 설정 파일 및 부팅과 관련된 여러 스크립트 파일
/home: 개인 사용자들이 파일이나 디렉터리 만들어 사용할 수 있는 홈 디렉터리가 위치 (ex) heesu 계정 만들면 /home/heesu 생기고 이를 홈 디렉터리라 한다.
/lib: 라이브러리가 저장, 커널 모듈도 이 디렉에 있다.
/mnt: CD_ROM, 하드디스크 등을 마운트할때 포인터가 되는 디렉터리
/opt: 응용 프로그램들의 설치를 위해 사용된다
/proc: 가상 파일 시스템으로 다양한 프로세스의 상태정보, 하드웨어 정보 등을 담는다
/root: 시스템 관리자인 root 사용자의 홈 디렉터리
/sbin: system binary약자로 시스템 관리에 대한 명령어, root가 사용한다. 시스템 종료 및 점검, 복구 등의 명령어
/tmp: 임시 저장 디렉터리, 임시로 생성되는 파일을 저장한다.
/usr: 시스템 운영에 필요한 명령 및 응용 프로그램들이 위치하는 디렉터리,
C 언어 헤더 파일, 커널소스, X-window, 아파치, mysql 등이 위치한다.
응용프로그램 명령어들이 들어있는 /usr/bin, /usr/sbin
로컬에서 추가로 설치할때 사용되는 /usr/local
/var: 로그나 스풀링과 같은 가변적인 데이터를 보관, 메일
/media: 이동식 장치(cdrom, floppy)등을 마운트하기 위해, RHEL 4부터
/srv: www등 사이트에서 생성되는 데이터를 저장, RHEL 4부터
/sys: /proc 디렉터리에서 기본적인 HW 정보를 제공한다
/run: 부팅 이후 동작중인 프로세스의 런타임 데이터를 저장

부팅과 셧다운

부팅

컴퓨터 전원 켜지고 OS가 가동되어 사용자가 컴퓨터 사용할 수 있도록 하는 과정
CentOS 7부터는 시스템 부팅 및 서비스 관리 프로그램으로 systemd를 사용한다.(이전은 init)

로그인

(1) x 윈도 기반의 그래픽 및 (2) 텍스트 기반의 콘솔에 로그인하는 두 가지 경우가 있다.
텍스트 기반의 콘솔창에서는 CTRL+ALT+F1~6으로 6개의 가상 콘솔을 통해 로그인 할 수 있었다.
X 윈도 기반의 그래픽 로그인을 사용하는 경우, 첫번째 창인 CTRL+ALT+F1에 그래픽 로그인 창을 사용 => 나머지 5은 콘솔 로그인 창으로 제공된다.

콘솔 기반으로 로그인시 게정 맞으면 Shell 실행시키고 틀리면 종료된다.

  • 콘솔 기반, 로그인 메시지 관련 파일
    /etc/issue: 로컬의 터미널로 사용자가 로그인할 때 'login:' 메시지 이전에 출력되는 내용
    /etc/issue.net: 텔넷을 통한 네트워크 접속할때 사용, 위 역할과 같다.
    /etc/motd: message of the day 약어로 성공적으로 로그인 되었을때 사용자에게 보여주는 메시지

로그아웃

콘솔모드나 터미널 창에서 logout또는 exit 명령어 혹은 CTRL+D
일정시간 작업 안 하는 사용자 강제적으로 로그아웃 시키려면 root 상태에서 /etc/profile에 'TMOUT=초' 지정하면된다.

systemd

시스템 부팅 및 서비스 관리해주는 프로그램이다. CentOS 6까지 init 역할을 대신한다.
systemd의 핵심은 unit이라 부르는 대상(object)으로 나뉜다. 유닛은 service, target, socket, path 등의 다양한 type을 가진다.

  • 관련 디렉터리
    /etc/systemd/system: 유닛의 환경 설정 파일, .wants라는 디렉터리가 존재하는데 해당 디렉터리는 특정 유닛의 구동에 필요한 유닛의 설정파일을 심볼릭 링크로 담는다.
    /run/systemd/system: 런타임 유닛 파일이 위치
    /usr/lib/systemd/system: 서비스 및 타깃 유닛 파일이 위치 (/usr은 생략가능)

  • systemd 구조
    systemd는 unit이라 부르는 대상(object)으로 나뉜다. 유닛은 service, target, socket, path 등의 다양한 type을 가진다.
    man systemd.unit에서 유닛 관련 정보 확인 할 수 있다.

  • service: 관련파일이 .service로 끝나는데(생략 가능) 서버에서 제공하는 웹 서버나 메일 서버 등이 해당된다. 보통 데몬이라 부른다.
    systemctl이라는 명령으로 제어된다.
    [서비스 상태에 따른 주요값]
    loaded: 프로세스 로드되는 유닛의 환경설정 파일
    enabled/ disabled: 부팅 시에 활성화/비활성화 됨
    active(running): 동작중
    active(exited): 일회성 프로세스가 성공적으로 실행한 경우
    active(waiting): 동작중이나 특정 이벤트에 의해 대기중
    inactive(dead): 프로세스가 종료
    static: 비활성화 상태이지만, 활성화되는 다른 유닛에 의해 활성화가 가능한 상태

  • target: 부팅 레벨, 특정 동기화 지점과 같이 유닛을 그룹화할때 사용한다. /lib/systemd/system에서 심볼릭 링크를 확인 가능
    [주요 target] .target은 생략해서 정리함
    poweroff: 시스템을 종료 (0)
    rescue: 응급 복구 모드 (runlevel 1)
    emergency: rescue 타깃과 유사하고 /를 읽기 전용으로 마운트한다
    multi-user: 콘솔모드로 전환, 텍스트 기반 로그인만 지원(3)
    graphical: X 윈도모드로 전환, 텍스트 기반 이외에 X 기반 로그인도 지원(5)
    reboot: 재부팅시키는 타깃 (init 6)

  • socket: 소켓 기반으로 동작하는 파일 시스템 FIFO, 네트워크 소켓, IPC 등이 해당된다.
    xinetd 기반으로 동작하는 텔넷 서비스를 systemd에서는 telnet.socket이라는 유닛으로 제공한다.

systemd 관련 명령어 p75

  • systemctl: systemd기반 시스템 및 서비스 제어하는 명령어 (이전 init 체계에서의 service,chkconfig,init 등 합쳐놓은 역할)
    systemctl [option] 명령 [서비스명]
    [option]
    [런레벨 관련 주요 명령]
    get-default: 현재 시스템에 설정된 런레벨 target 정보를 출력
    set-deault 타깃명: 시스템의 런레벨을 변경
    isolate 타깃명: 런레벨로 즉시 변경

시스템 종료(Shutdown)

시스템 전원을 끄거나 종료하는 행위
시스템 재부팅 및 종료하는 방법으로 (1) X윈도에서 [끄기] 메뉴 (2) 터미널 환경에서 shutdown, halt, reboot, poweroff, systemctl 등의 명령어를 이용하는 방법이다.

  • shutdown: 재시작 or 전원 종료, root 권한자만 가능, 안정적인 방법, 해당 옵션에 따라 적당한 실행레벨을 인식하고 init 프로세스를 호출하여 요청한다.
    shutdown [option] 시간 [경고메시지]
    [option]
    -r 재부팅 -h 종료(=halt) -c 예약된 셧다운 종료 -k 사용자들에게 경고메시지 전송(실제로 종료X)
  • reboot: 재시작, 모든 사용자 모두 가능
    reboot [option]
    [option]
    -w 재부팅하지 않고 셧다운 기록만 저장 -f init호출하지 않고 즉시 재부팅
  • halt: 시스템 종료, 모든 사용자 사용 가능
    halt [option]
    [option]
    -p 시스템 종료하고 전원까지 끄는 경우(--poweroff)
  • poweroff: 시스템 종료하고 전원을 끈다
    poweroff
  • init, telinit: init 프로세스에 요청하여 실행레벨 변경할때 사용하는 명령어, 빠르지만 실행중 프로세스 무조건 종료한다.

    init 실행레벨
    init 0 즉시 종료
    init 6 즉시 재부팅
    init 1 즉시 단일 사용자모드로 전환

파일시스템

파일시스템 구성은 OS 설치시 일이넌다. OS 설치시 1. 파티션 분할 작업 2. 포맷 행위 가장 먼저한다.
포맷: 파일을 저장하기 위해 디스크를 일정 크기로 분할하고 주소를 설정하는 작업

리눅스 파일 시스템의 개요

minix: 초기 리눅스 파일 시스템이 모태
ext: 초기 리눅스 파일시스템
ext2:
ext3: 리눅스의 대표적인 저널링 파일 시스템이다.
ext4:
Reiserfs: 저널링 파일 시스템
XFS: RHEL 7의 기본 파일 시스템이다.
JFS: IBM에서 개발한 저널링 파일 시스템
xlafs:

  • 저널링 기술 적용된 파일시스템: ext3~JFS

저널링 파일 시스템

파일 시스템에 대한 변경사항을 반영하기 전에 저널이라 부르는 로그에 변경사항을 저장하여 추적이 가능하게 만든 파일 시스템이다. 파일을 실제로 수정하기 전에(데이터를 디스크에 저장하기 전에) 로그에 데이터를 남겨 비정상적인 종료에도 fsck보다 빠르고 안정적인 복구 기능을 제공한다.

ext 파일 시스템 구조 (p89 그림)

I-list는 아이노드 번호 목록, 지정되는 정보는 Directory Blocks and Data Blocks에 저장된다.
Directory Block에는 아이노드 번호와 파일명 저장되고, Data Block에 파일이 보관할 정보를 저장한다.

  • inode: 파일시스템에서 사용하는 일종의 자료구조, 각각의 파일은 하나의 아이노드를 할당받아 관리된다.

ext4는 ext2기반이므로 ext2 구조를 살펴보자.

부트블록(=부트섹터)과 블록그룹으로 구성된다.
Block이란 파일시스템에서 데이터 저장하는 단위로서 메모리에서 입출력 작업시 읽거나 쓰여지는 단위이기도 하다. 최근 리눅스는 기본 4KB로 지정한다.
블록그룹은 슈퍼블록, 그룹 기술자, 블록 비트맵, 아이노드 비트맵, 아이노드 테이블(=아이노드 블록), 데이터 블록으로 구성되어있다.

  • 슈퍼블록: 아이노드 및 블록 등의 파일 시스템 전체적인 정보를 가지고 있다.
  • 그룹기술자: 각각의 블록 그룹을 기술하는 자료구조인데, 블록 비트맵, 아이노드 비트맵, 아이노드 테이블 등을 가지고 있다.
    - 블록비트맵: 0=>할당됨, 1=> 자유공간
    - 아이노드 비트맵: 아이노드 할당 상태
    - 아이노드 테이블: ls -l 명령 실행시 보이는 정보를 저장한다. 아이노드에 대한 정보가 들어있다.

슈퍼블록과 그룹기술자는 마운트될때 첫번째 그룹은 Group-0 정보 가져오지만 손상을 대비하여 모든 Group에 저장되어있다.

  • 데이터블록: 파일의 데이터가 존재한다. 추가적으로 간접블록과 홀이 있다.
    간접블록: 아이노드는 적은 수의 데이터 블록을 가지고 있기 때문에 더 많은 데이터 블록 필요한 경우에 이를 지정할 포인터가 필요하는데, 이 포인터들이 사용할 동적인 블록이 간접블록이다.
    홀: 아이노드나 간접 블록 안의 데이터 블록의 주소로 특별한 값을 저장한다. (p91)

XFS

고성능 64비트 저널링 파일시스템을 구현하기 위해 개발되었고 RHEL 7(CentOS 7)에서 기본 파일 시스템이다.
블록 기반의 한계를 극복하기 위해 익스텐트(extent)기반을 사용하여 여러 할당 체계(지연할당, 사전 할당)을 제공한다.

  • 지연할당: 파일이 연속적인 블록 그룹에 기록되도록하여 단편화 줄이고 성능 up
  • 사전할당: 앱이 사전에 기록해야 할 데이터 양을 알고 있는 경우 완전히 조각화하는 것을 방지하는데 사용된다.

XFS의 자료구조
B-Tree: 자식 노드가 2개 이상 가능한 트리, 정렬된 상태로 저장된다.
B+트리: 모든 레코드는 leaf node에 정렬되어있고 리프 노드는 linked list로 연결되어있다. (ex) XFS, ReiserFS, JFS, NTFS등이 있다.

XFS 데몬
XFS는 기본적으로 4 종류 데몬 이용한다.

xfssyncd: 로그정보와 메타 데이터 정보를 기록
xfsbufd: I/O 요청을 처리
xfsdatad, xfslogd: 작업 큐에 수행할 작업이 있는 경우 관련 함수를 호출해서 수행하는 역할 담당

XFS 디스크 구조

  • 할당 그룹: XFS는 할당그룹이라는 단위로 나뉘어있고 각 그룹은 독립적으로 존재하고 병렬적으로 처리된다.
  • 아이노드: 아이노드 구조는 디스크 상에 직접 기록된다. 아이노드를 필요에 따라 증가시킬 수 있는 가변적인 구조로 설계한다.

X윈도

  • 네트워크 프로토콜에 기반한 그래픽 사용자 인터페이스(GUI) 환경이다.

  • 그래픽 시스템이다. XFree86 흥하다가 X.org를 주로 사용한다.
    XFree86은 IBM 호환 시스템을 사용하는 유닉스 계열 OS를 위한 X 윈도 프로젝트이다. 2004년까지 선도적이었다가 4.4.0 버전이 GPL 라이선스와 호환되지 않아 현재는 X.org가 기본적으로 사용된다.

  • X.org는 X 서버 패키지로 소스가 공개된 자유 SW이다. 유닉스 및 리눅스 대부분이 해당 프로젝트 기반의 X윈도 시스템 사용

  • X 윈도 구조: X 서버와 X 클라이언트가 X Protocol을 통해 통신한다.
    X 서버는 그래픽하게 보여주는 시스템, X 클라이언트는 X 서버 위에 동작하는 응용프로그램
    네트워크 기반이기 때문에 사용자가 키보드나 마우스 입력시 tcp통해 전달 => 관련 X 클라이언트가 실행된다.

  • Xlib는 c언어로 구현된 클라이언트 라이브러리로 X 서버와 대화해주는 역할한다. Xlib 기능 포함하는 고수준 라이브러리를 사용하는데 Xt, Xaw, Motif, FLTK, GTK+, Qt, Tk, SDL 등이 있다.
    최근 X.org에서는 XCB로 대체하여 사용한다.
    XCB는 향상된 쓰레딩 기능을 지원하고 확장성 띄어나고 직접 X 프로토콜에 접근 가능하다.

X윈도 실행 방법

  • 실행방법은 (1) 부팅 시 X 윈도 실행 (2) 텍스트 모드에서 실행 => 모드 선택은 systemctl 명령어

(1) systemctl set-default graphical.target (런레벨 5)
- 디스플레이 매니저 실행되면서 로그인창 나타난다. => 사용자 정보 유효하면 세션을 시작해주는 역할을 한다.

(2) systemctl set-default multi-user.target (런레벨 3)
- 텍스트 모드로 부팅된다. 사용자 계정으로 먼저 로그인하고 startx 명령어로 X윈도 실행해야한다.
- startx: x윈도 실행하는 스크립트 => 최종적으로 xinit을 호출한다.
- startx -- :1 두번째 X윈도를 실행시킨다. (=startx)

디스플레이 매니저

X 윈도 구성요소 중 사용자 로그인 및 세션 관리 관리 역할을 수행한다.
런 레벨 5로 부팅할 경우에 사용자 정보 유효하면 세션을 시작해주는 역할을 한다.
리눅스에서 사용하는 디스플레이 매니저: XDM, GDM(GNOME에서 사용), KDM(KDE에서) => CentOS 7에서는 GDM이 기본

데스크톱 환경

GUI의 스타일을 말한다. 보통 윈도매니저를 포함하여 파일관리자, 아이콘, 배경화면, 데스크톱 위젯 등을 지원한다.
대표적으로 KDE와 GNOME이 있다.(p100)

  • KDE: GPL 안 따르는 Qt 라이브러리 기반으로 만들었다.
  • GNOME(GNU Network Object Model Environment): GNU에서 만든 공개형 데스크톱 환경, LGPL 따르는 GTK+ 라이브러리 사용하여 개발
    응용 프로그램은 GPL 따르고 그 외 데스크톱 부분 및 라이브러리는 LGPL을 따른다.(둘 다 따른다)
    초기버전에는 nautilus라는 파일관리자 이용, GNOME 2부터 metacity라는 윈도 매니저를 사용, GNOME 3부터는 Mutter 윈도 매니저 사용

윈도 매니저

X 윈도 환경에서 window의 배치와 표현을 담당하는 시스템 소프트웨어이다.
X 윈도 매니저는 직접 마우스, 키보드에 접근하지 않고 Display Server를 통해 접근한다.
대표적으로는 GNOME에 사용되는 Mutter(GNOME 3), Metacity(GNOME 2) / KDE에 사용한는 KWin(KDE 2), KWM(KDE 1)

웨일랜드

skip

원격지에서 X 클라이언트 이용 (1) _ (호스트 기반 인증)

X 윈도는 X 서버와 X 클라이언트가 독립적으로 네트워크 지향 시스템이기 때문에 원격지의 X 클라이언트를 다른 시스템의 X서버에서 실행시킬 수 있다.
X 서버에 접근할 X 클라이언트의 접근을 허가해줘야한다. 그 다음 X 클라이언트에서 X 서버에 프로그램이 전달되기 위해서는 터미널이 정의되어있는 환경변수 DISPLAY를 수정해야한다.
1. xhost: x 서버에 접근할 수 있는 클라이언트를 지정하거나 해제하는 명령어
2. DISPLAY: x 클라이언트 프로그램이 실행될때 표시되는 창을 설정하는 환경변수

  • echo $DISPLAY 하면 :0 이다. :0은 시스템에 실행되고 있는 첫번째 X윈도를 뜻한다. X 윈도를 추가로 실행하면 :1로 표시된다.
export DISPLAY="203.234.34.100:0"
# X 클라이언트 프로그램을 ~로 전송한다.

원격지에서 X 클라이언트 이용 (2) _ (사용자 기반 인증)

  1. xauth:
    특정 사용자가 startx와 같은 명령으로 X윈도를 실행시키면 $HOME/.Xauthority라는 파일이 생성된다. 해당 파일에서 MIT-MAGIC-COOKIE-1 키 값을 가지는데, X 서버의 해당 키 값을 X 클라이언트에 설치한다.
    X 서버 => xauth list $DISPLAY 하면 키 값 보임
    X 클라이언트 => xauth add $DISPLAY 키 값

셸(shell)

커널과 사용자간의 다리역할을 한다. 커널에서 분리된 프로그램이다.
사용자가 시스템에 로그인하면 각 사용자에게 설정된 셸이 부여된다.
bash: ksh와 csh의장점을 결합한 bash가 리눅스의 표준 셸이다.

셸의 확인과 변경

  • 사용 중인 셸을 확인하려면 echo $SHELL
  • 가능한 셸 확인은 chsh -l 명령어 혹은 cat /etc/shells로 확인
  • 사용자가 로그인 셸을 변경하려면 chsh 명령어 사용하면 된다. 다음 로그인부터 유효하다.
    chsh posein #posein의 셸을 변경한다
  • 사용자의 로그인 셸 정보 확인은 grep possein /etc/passwd => /etc/passwd에서 7번째 필드

셸 변수와 환경변수

  • 셸 변수: 특정 셸에서만 적용되는 변수이다. 변수명=값 형태로 지정, 변수값 출력은 echo $변수명
  • 환경변수
    TERM: 로그인한 터미널 종류
    SHELL: 사용자의 로그인 셸
    PS1: 프롬프트 변수
    PS2: 2차 프롬프트 변수
    TMOUT: 로그인 후 일정시간 작업 안 할때 로그아웃시키는 시간(초)
    HOSTNAME: 시스템의 호스트명

    HISTFILE: 히스토리 파일의 절대경로
    HISTSIZE: 히스토리 파일에 저장되는 명령어 수
    HISTFILESIZE: 히스토리 파일의 크기

bash 주요 기능

  • 명령어 history 기능
    실행했던 모든 명령들을 히스토리 리스트 버퍼에 스택으로 저장한다.
    실행한 명령들은 각 사용자의 홈 디렉터리 안에 .bash_history 파일에 추가로 기록된다. (home/posein/.bash_history) 로그아웃할 때 저장되므로 다음 번 로그인시 확인 가능하다.
    history [숫자값]
    history 5 => 최근 입력한 마지막 5개 명령어 목록 출력
    [!와 히스토리 명령문]
    !!: 마지막에 사용한 명령어 실행
    !n: n번째 사용한 명령어 실행
    !-n: 역순서로 n번째 실행
    !문자열: 가장 최근 사용한 명령어중 '문자열'로 시작한 명령 실행
    !?문자열?: " 포함한
    ^문자열1^문자열2: 마지막에 사용한 명령문의 문자열1을 문자열2로 대체한후 실행

  • alias 기능
    셸 상태에서 설정한 alias는 재로그인하거나 재부팅하면 다시 설정해야한다. 지속적 사용을 위해서는 홈 디렉터리의 .bashrc에 설정해야한다.
    alias 나만의명령어='기존 명령어 조합'
    unalias 나만의명령어
    unalias -a => 모든 alias 해제

    ls명령어에 -alF 옵션이 기본 실행되도록 설정했을때 원래의 명령인 ls를 설정 해제하지 않고 일시적으로 실행하려면
    (1) which 명령어로 ls 명령어의 위치를 파악하고 절대 경로로 실행하는 방법
    (2) (back slash)를 붙여 호출 \ls

  • 명령 대체(명령 치환) 기능
    특정 명령의 결과를 다른 명령어의 인자값으로 사용하는 것을 의미한다.
    백스쿼트$() 사용한다.

  • 그룹 명령 실행
    - ; : 한줄에 여러 명령어 나욜 => 순차적으로 처리된다.
    - || : 앞 명령어 성공시 결과 출력, 그렇지 않으면 뒤의 명령 실행하고 결과 출력
    - && : 앞의 명령어 성공해야 다음 명령어 수행한다.

  • 표준 입출력 제어 기능
    표준 입력(0): 키보드, stdin
    표준 출력(1): 화면, stdout
    표준 에러(2): 에러값이 보여지는 화면, stderr
    abc 2>/dev/null => 없는 명령어 abc 입력시 오류 메시지 발생하지만 숫자2와 리다이렉션 기호로 오류 메시지 없앨 수 있다.

  • 리다이렉션
    표준 입/출력이 아닌 다른 입출력으로 변경할때 사용한다.
    - >: 표준출력에서 다른 출력으로 변경
    - >>: 지정한 출력에 추가한다.
    - <: 표준입력에서 다른 입력으로 변경
    - <<: 기호 뒤에 지정한 ㅁ누자열을 입력으로 받아 해당 문자열 나오기 전까지를 표준 입력 삼아 해당 내용 출력

  • 파이프
    프로세스의 통신을 위해, 어떤 프로세스의 출력이 다른 프로세스의 입력으로 쓰이게 하는 것
    | 사용
    [관련 명령어]
    tee 파이프 연결 출력을 두 갈래로 나눌때 사용하는 명령어
    xargs 표준 입력으로부터 값을 받아 처리하는 명령어
    (ex) find -name '*.txt' | xargs rm -rf => 현 디렉터리 이하에서 .txt 파일이나 디렉터리 전부 삭제

  • 산술 연산 기능
    expr 3 + 3 (띄어쓰기 필수)
    곱하기는 주의 expr 3 \* 3 이 경우에는echo $[값 연산자 값]이 더 편할 수도 있다. (ex) echo $[3**3]

  • 프롬프트 제어 기능
    환경변수 PS1을 이용

bash 관련 파일 및 디렉터리

/etc/profile: 시스템 전체(모든 사용자)에 적용되는 환경 변수와 시작 관련 프로그램
/etc/bashrc: 시스템 전체에 적용되는 alias와 함수
~/.bash_profile: 개인 사용자의 환경 설정과 시작 프로그램 설정과 관련된 파일, 로그인시 읽어들인다.
~/.bashrc: 개인 사용자가 정의한 alias와 함수들
~/.bash_logout: 개인 사용자가 로그아웃시 수행하는 설정을 지정
/etc/profile.d: 몇몇의 응용 프로그램들이 시작할 때 필요한 스크립트가 위치, /etc/profile에서 호출된다.

프로세스

프로세스 정의

메모리(=RAM=주기억장치)에 올라온 프로그램이다. 즉, 실행중인 프로그램을 프로세스라 한다.
PCB 지닌 프로그램
프로그램 카운터(PC) 지닌 프로그램
능동적 개체(entity)로 순차적으로 수행하는 프로그램

실행시 PID가 할당되어 관리된다.

프로세스 생성

p161
하나 프로세스가 다른 프로세스 실행하기 위한 시스템 호출 방법에는 fork와 exec가 있다.
- fork: 새 프로세스를 위해 메모리 할당받고 기존 프로세스는 그대로 실행된다. 원래 프로세스랑 똑같은 코드를 기반으로 실행.
- exec: 원래 프로세스를 대체한다. 기존 프로세스의 메모리에 새 프로세스가 덮는다.
리눅스가 부팅 시작하면 커널이 systemd라는 최초의 프로세스(PID 1번)를 발생시킨다. 이후 다른 프로세스들은 fork 방식으로 systemd의 자식 프로세스로 생성된다.

프로세스 종류

사용자의 입력에 관계없이 실행되는 백그라운드 프로세스
명령 입력 후 수행 종료까지 기다려야 하는 포어그라운드 프로세스
기존 포어그라운드 프로세스 실행 명령 뒤에 & 붙이면 백그라운드 프로세스로 실행된다.
[1] 3540 이라 뜨는데 [1]은 작업번호(job number)이고 3540은 PID이다.

멀티태스킹과 작업 전환

멀티태스킹이란 하나 이사의 프로그램을 동시에 실행하는 것을 말한다.

  • 포어그란운드 => 백그라운드 프로세스 전환
    대기상태로 전환해야하는데 CTRL+Z를 누르면 된다. jobs 명령어로 작업 상태를 확인할 수 있다. 작업 상태가 Stopped 되어있다. 이때 bg 명령 입력하면 백그라운드로 전환된다.
  • jobs 명령어로 확인시 + 는 가장 늦게 실행한 프로세스, - 기호는 + 작업의 다음 우선순위 작업이다.
  • 백그라운드 => 포어그라운드 프로세스 전환
    fg %작업번호 명령어로 원하는 작업을 전환시킨다.

프로세스 관리의 이해 _ 시그널, 데몬

  • 시그널: 프로세스끼리 서로 통신할때 사용하는 '신호'이다. 즉, 특정 프로세스가 다른 프로세스에 메시지 보낼때 시그널을 이용한다. (1) 사용자가 인터럽트 키 통해 발생 (2) 프로세스가 발생 (3) HW가 발생하는 시그널 등 다양하다.
    kill -1 로 시그널 목록을 확인 할 수 있다.

    꼭 나온다. 번호와 명령어 매핑, 명령어 기능 암기
    1) SIGHUP(HUP): 로그아웃과 같이 터미널에서 접속이 끊겼을때 시그널, 데몬 관련 환경설정 파일을 변경시키고 변화 내용 적용하기 위해 재시작할때 해당 시그널 사용
    2) SIGINT(INT): 키보드로부터 오는 인터럽트 시그널로 실행을 중지시킨다. CTRL+C 입력시
    3) SIGQUIT(QUIT): 키보드로부터 오는 실행 중지 시그널, CTRL+\ 입력시
    9) SIGKILL(KILL): 무조건 종료, 프로세스 강제 종료, 사용자 시그널 처리 불가
    15) SIGTERM(TERM): 가능한 정상 종료, kill의 기본 시그널
    18) SIGCONT(CONT): 정지된 프로세스를 다시 실행시킬때
    19) SIGSTOP(STOP): 터미널에서 입력된 정지 시그널
    20) SIGTSTP(TSTP): 실행 정지 후 다시 실행 계속하기 위해 대기시키는 시그널, CTRL+Z

  • 데몬(daemon)
    보통 부팅시 실행된다. 지속적인 서비스 요청을 처리하기 위해 계속 실행되는 프로세스로 백그라운드로 실행된다. 보통 이름 뒤에 d 붙인다. (ex) httpd
    부팅과 관련된 정보는 /etc/rc.d 디렉터리에 모아두고, 관련된 데몬들은 rc0.d~rc6.d 디렉터리를 이용하여 데몬의 실행을 조절한다.
    데몬 프로세스 실행 방법에는 standalone방식과 inetd 방식이 있다.
    - standalone: 보통 부팅 시에 실행되어 프로세스가 메모리에 계속 상주한다. 웹, 메일등 빈번한 요청이 들어오는 서비스인 경우 대부분 standalone방식이다. ps 명령으로 확인해보면 항상 동작중이다.
    - inetd: 항상 메모리에 상주하는게 아니라, 클라이언트의 서비스 요청이 들어왔을때 해당 프로세스 실행시키고 종료 후에는 자동으로 프로세스를 종료시킨다.

    데몬의 실행: systemd기반으로 동작하기 때문에 systemctl 명령을 이용해 데몬을 제어한다. xinetd기반으로 동작하는 데몬의 실행방법은 xinetd에서 별도로 설명 ...

  • 데몬 관련 유틸리티 p166
    1) ntsysv
    2) chkconfig

profile
nonstop sw developer

0개의 댓글