본문 바로가기
CS

리눅스 OS 기본 이론

by wwns 2024. 1. 12.
반응형

  • 다양한 배포판이 존재하는 OSS(Open Source Software) 운영체제
    • e.g CentOS, Ubuntu, RHEL, SLES ...
  • UNIX와 유사한 구조
  • 뛰어난 이식성
    • 다양한 하드웨어에 호환
  • 유연성과 확장성
    • 오픈소스이기 때문에 소스코드를 수정하여 사용할 수 있음
  • 안전성과 보안성
    • 커널 소스가 공개되어 있어 윈도우와 같은 폐쇄형 운영체제에 비해 보안상의 보안 취약점이 쉽게 노출될 가능성이 있으나 OSS로 인해 수많은 전문 프로그래머들이 빠르게 오류 수정, 보안 패치에 대응하여 안정성을 확보한 버전을 발표
    • 버전 및 패치의 신속성이 오히려 시스템의 안정성을 해칠 수도 있음

리눅스 구성 요소

 

OS (운영체제)

  • 응용프로그램의 수행을 제어하고, 사용자와 하드웨어 사이의 인터페이스 역할을 하는 프로그램
  • 기능
    • 프로세스 관리, 인터럽트, 메모리 관리, 파일시스템, 드라이버, 네트워크, 보안, 입출력
  • 구성요소
    • Kernel, Shell, File System

https://www.fun-coding.org/post/linux_basic1.html#gsc.tab=0
https://www.fun-coding.org/post/linux_basic1.html#gsc.tab=0

 

  • Kernel
    •  프로세스 처리에 필요한 하드웨어 자원을 관리하는 OS의 핵심 부분
    • 서버 부팅 시부터 종료 시까지 계속 메모리에 상주하는 프로그램
    • 한정된 시스템 자원을 효율적으로 관리하고 스케쥴링함
    • 다양하고 복잡한 하드웨어를 추상화하여 일관성 있는 인터페이스 제공
    • 커널과 사용자 영역을 분리하여 보안성 제공
    • 단일형, 마이크로, 혼합형 커널이 있음
  • Shell
    • 사용자와 커널 사이에서 인터페이스
    • 사용자가 입력한 명령어를 해석하여 시스템 기능을 설정하거나 프로그래밍(Shell Script) 기능 제공
  • FileSystem
    • OS 내에서 파일을 저장하고 관리할 수 있도록 만들어 놓은 체계
    • 파일의 저장/읽기를 위해 파일의 물리적 위치, 소유자, 권한 등의 다양한 정보가 필요하며, 이를 규약으로 관리하는 것
    • etx4, xfs(최근에 많이 사용)

리눅스 부팅

 

리눅스 부팅과정을 알아보다 보니 4개의 Stage로 정리한 사진이 있어 가져왔다

https://yonlog.tistory.com/59

  • 하드웨어 Stage
    • BIOS 혹은 UEFI POST(Power On Self Test)
      • 전원이 들어오면 하드웨어가 초기화됨
      • BIOS 혹은 UEFI (최신 OS는 UEFI 펌웨어를 많이 사용, 아래서 더 알아본다) 펌웨어를 부트 섹터(MBR, .efi) 파일을 찾음
    • BIOS (Basic Input Output Stream)
      • 전통적인 펌웨어로 UEFI에 비해 부팅 속도가 느림
        • 16 bit 모드로 실행되며 실행 공간이 1MB
        • 디스크의 MBR 파티션으로 부팅하며 MBR(Master Boot Record)가 있는 파티션은 2TB 이하로 제한
    • UEFI (United Extensible Firmware Interface)
      • BIOS의 단점을 보완하여 개발된 펌웨어
      • 32 bit or 64 bit 모드로 실행 가능
      • 디스크의 MBR 섹터를 거치지 않고 바로 부트 로더를 실행할 수 있음
      • GPT 파티션으로 부팅 (2TB 초과 가능)

  • 부트로더 Stage
    • 부트로더(LILO or GRUB 대부분 GRUB)가 메모리에 적재되면, 부트 로더가 시스템 제어권을 갖게 됨
    • 부트로더가 커널을 메모리에 적재함
    • GRUB
      • 디스크에 설치된 운영체제의 부팅을 제어
      • 부팅
        • 기본 운영체제가 5초 뒤에 자동 시작되며 5초 안에 키를 누르면 선택항목들이 나타남
        • /etc/grub.conf에 설정 파일로 부팅 옵션이 설정되어 있음
          • default : 첫 번째 파티션이 기본으로 부팅
          • timeout : x초간 대기하다가 기본 파티션으로 부팅
          • splashimage, root 파일시스템 위치, initramfs 등
    • GRUB2
      • etc/grub.cfg 파일이 있으나 텍스트로 수정이 불가하고 grub2-mkconfig 명령어로 리빌딩해야 함

  • 커널 Stage
    • 커널이 메모리에 적재 및 실행되면 하드웨어를 점검하고 /var/log/dmesg 파일에 내용을 기록
    • initrd (read only) 또는 initramfs(RAM FileSystem)을 참고하여 필요한 파일시스템을 마운트
    • /var, /usr 등이 다른 파일시스템으로 분리되어 있다면 initrd/initramfs가 적절히 파일시스템을 마운트 해줌
    • 하드웨어 드라이버를 가지고 있어 하드웨어를 매핑함

  • 초기화 Stage
    • 초기화 데몬(init 혹은 systemd)을 실행
      • Upstart 형식의 init 데몬, Systemd 형식의 systemd(최신) 데몬이 있음
      • 서비스제어 -> initctl, systemctl
        • start, stop, restart, reload, status, enable, disable, list...
      • 초기화 데몬 별 서비스 관리도 구분 지어보면 좋다
    • 기본 런레벨을 확인하고, 기본 런레벨에서 자동으로 시작되도록 정의된 프로세스들을 실행
      • 기본 Run Level을 정의할 수 있으며, 레벨에 따른 기동 서비스를 알아보면 좋다 기본적으로 3 Level

Shell

쉘은 사용자가 명령어로 커널에 명령을 내릴 수 있게 해 주는 인터페이스이다

  • Shell은 /etc/password 파일에서 사용자별 로그인 시 사용할 Shell 종류를 설정할 수 있음
  • Shell 프롬프트 상에서 다른 Shell로도 변경 가능 ex: sh
  • 종류
    • Bourne Shell
      • 가장 기본적인 Shell로 Unix 초기부터 사용됨
      • 실행 명령: sh
    • C Shell
      • 프로그램 작성에 적합
      • Bourne Shell에 Alias, History 등의 기능을 추가함
      • 실행 명령: csh
    • Korn Shell
      • Unix에서 널리 사용됨
      • Bourne Shell에 Alias, History, 명령행 편집 등의 기능을 추가
      • 실행 명령: ksh
    • Bash Shell
      • Linux에서 가장 널리 사용됨
      • Bourne Shell의 변형
      • 실행 명령: bash

Linux Shell 명령어 입력을 통해 실행되는 순서가 있다

 

  • Alias
    • 옵션을 포함한 특정 명령을 짧고 쉽게 사용하기 위함
    • 위험한 명령을 잘못 실행하는 것을 대비하기 위해 명령어 대체
    • alias rm = 'rm -i' : i 옵션을 통해 삭제하기 전에 확인
  • Shell 예약어
    • do, while, else 등 Shell이 특별한 목적을 위해 예약해 둔 단어
    • 스크립트 작성에 사용
  • Function
    • 일련의 명령어를 함수로 정의
    • reboot와 같이 OS를 그냥 재실행하면 안 되는 위험한 명령어를 함수로 정의해 놓고 일련의 과정을 통해 대비
  • 내장 명령
    • Shell에 통합된 Built in 명령
    • 일부는 명령어 파일이 /usr/bin에 존재하지만 실제 수행되는 것은 내장 명령
    • man cd로 매뉴얼이 출력됨
  • 파일시스템 명령
    • 실제 파일로 존재하는 명령
    • $PATH에 경로가 포함되어 있으면 경로 없이 실행됨
    • date와 같은 명령을 실행하고자 할 때 $PATH 환경변수가 설정되어 있으면 바로 실행
      • 없으면 /ISC/sorc../../CheckTime.sh와 같이 경로를 입력해줘야 함

Linux Bash Shell의 주요 기능

 

  • 파이프라인 ( | )
    • 출력값을 다음 명령의 입력으로 전달함
    • cat /etc/password | sort
      • 정보를 읽어와서 그 라인들을 정렬하여 보여줌
  • 입력 리다이렉션 ( <, << )
    • <는 파일의 내용을 앞의 명령어에 전달
      • bc < test.txt
    • <<는 여러 줄을 앞의 명령에 입력으로 전달
    • cat << EOF
      • EOF를 작성하기 전까지 입력한 값이 cat에 입력으로 들어감
  • 출력 리다이렉션 ( >, >>, >&, >>& )
    • 출력을 텍스트 형식으로 파일에 저장
      • > : 덮어쓰기
      • >> : 추가해서 쓰기
    • File Descriptor 사용 -> 표준 출력과 표준 에러를 파일에 저장
      • 0 = 표준 입력, 1 = 표준 출력, 2 = 표준 에러 
      • >& : 덮어쓰기
      • >>& : 추가해서 쓰기
      • /ISC/test.sh > result.txt 2 >& 1
        • test.sh 결과를 result에 저장하고, 표준 에러가 발생하면  표준 출력으로 저장
        • 여기서 표준 출력은 result.txt로 리다이렉트 됨
        • 실행 결과와 표준 에러가 모두 result.txt에 저장됨
  • 순차명령 ( ;, & )
    • ; : 여러 명령을 하나의 Line에 입력하여 모두 수행
    • && : 앞의 명령이 성공 해야 뒤의 명령 실행
  • 백그라운드 명령 ( & )
    • 명령어를 백그라운드에서 수행하고 프롬프트를 반환함
      • 백그라운드로 실행하더라도 터미널을 종료하면 함께 종료
      • 터미널 종료해도 지속되게 하려면 nohup으로 수행한다
        • nohup ./mv_file_sh &
  • 명령 대체 ( &( ), ` ` )
    • 명령어의 결과를 텍스트로 전달
  • 산술식 대체 ( $[ ] )
    • 산술 결과를 텍스트로 전달

Shell의 동작 방식

  • 쉘은 명령어를 실행할 때 SubShell을 fork 하여 SubShell을 호출한 후 waiting 상태로 변환됨

https://rhrhth23.tistory.com/85

  • 현재 쉘에서 shell script 파일을 실행하면 fork를 통해 서브 쉘을 생성
  • 서브 쉘에서 exec()를 호출하여 수행
  • 수행을 완료한 후 exit()를 통해 종료
  • 현재 쉘로 돌아와 waiting 상태를 마침

Shell - 변수

  • 리눅스 쉘은 변수에 특정 값을 저장하여 사용할 수 있음
  • 저장
    • TEST="text"
  • 호출
    • $TEST

 

스크립트를 실행시키거나, 쉘을 추가로 호출(서브쉘)하면 변수가 유지되지 않는다

  • 서브쉘이 종료되고 원래 Shell로 돌아올 때 서브쉘에서 정의한 변수는 유지되지 않음
  • export 명령을 사용하면 변수가 `환경 변수`가 되어서 변수가 유지됨
    • export TEST = "test"
  • 스크립트를 실행할 때 맨 앞에 dot(.)을 붙이면 현재 쉘에서 스크립트가 실행되므로 변수가 유지됨

쉘을 종료하면 사라지는 지역변수와 모든 쉘에 적용되는 전역 변수, 터미널을 종료해도 유지되는 전역 환경변수로 구분할 수 있다

 

  • 지역변수
    • set 명령어를 통해 만들 수 있음
    • 위에서 처럼 그냥 TEST="text"로 설정할 수 있음
    • 쉘 종료 시 삭제됨
  • 전역변수
    • export 명령어로 만들 수 있음
    • 현재 터미널에서 생성된 모든 쉘에 적용됨
    • 터미널이 종료되면 사라짐
    • env 명령으로 확인가능
  • 전역 환경변수
    • /usr/bin/env 파일에서 만들 수 있음
    • 모든 쉘에 적용되며 터미널이 종료되어도 남아있음
    • env 명령으로 확인 가능

References

https://inpa.tistory.com/category/OS/Linux?page=1

 

'OS/Linux' 카테고리의 글 목록

성장 욕구가 가파른 초보 개발자로서 공부한 내용을 쉽게 풀어쓴 기술 개발자 블로그를 운영하고 있습니다.

inpa.tistory.com

https://yonlog.tistory.com/59

 

리눅스 시스템 부팅 프로세스(리눅스 부팅과정)

요약 리눅스 시스템이 올바로 시동하려면 일련의 과정이 올바로 수행되어야 한다. PC 아키텍처에 직접 설치된 리눅스 시스템은 다음 과정을 거쳐 시동한다. 전원을 켬 하드웨어를 시작함(BIOS 또

yonlog.tistory.com

 

반응형

'CS' 카테고리의 다른 글

쉘 스크립트  (0) 2024.01.16
네트워크 구성  (0) 2024.01.11
네트워크 기본  (0) 2024.01.09
OS - Virtual Memory  (0) 2023.11.06
OS - Memory Management2  (0) 2023.11.01