- 다양한 배포판이 존재하는 OSS(Open Source Software) 운영체제
- e.g CentOS, Ubuntu, RHEL, SLES ...
- UNIX와 유사한 구조
- 뛰어난 이식성
- 다양한 하드웨어에 호환
- 유연성과 확장성
- 오픈소스이기 때문에 소스코드를 수정하여 사용할 수 있음
- 안전성과 보안성
- 커널 소스가 공개되어 있어 윈도우와 같은 폐쇄형 운영체제에 비해 보안상의 보안 취약점이 쉽게 노출될 가능성이 있으나 OSS로 인해 수많은 전문 프로그래머들이 빠르게 오류 수정, 보안 패치에 대응하여 안정성을 확보한 버전을 발표
- 버전 및 패치의 신속성이 오히려 시스템의 안정성을 해칠 수도 있음
리눅스 구성 요소
OS (운영체제)
- 응용프로그램의 수행을 제어하고, 사용자와 하드웨어 사이의 인터페이스 역할을 하는 프로그램
- 기능
- 프로세스 관리, 인터럽트, 메모리 관리, 파일시스템, 드라이버, 네트워크, 보안, 입출력
- 구성요소
- Kernel, Shell, File System
- Kernel
- 프로세스 처리에 필요한 하드웨어 자원을 관리하는 OS의 핵심 부분
- 서버 부팅 시부터 종료 시까지 계속 메모리에 상주하는 프로그램
- 한정된 시스템 자원을 효율적으로 관리하고 스케쥴링함
- 다양하고 복잡한 하드웨어를 추상화하여 일관성 있는 인터페이스 제공
- 커널과 사용자 영역을 분리하여 보안성 제공
- 단일형, 마이크로, 혼합형 커널이 있음
- Shell
- 사용자와 커널 사이에서 인터페이스
- 사용자가 입력한 명령어를 해석하여 시스템 기능을 설정하거나 프로그래밍(Shell Script) 기능 제공
- FileSystem
- OS 내에서 파일을 저장하고 관리할 수 있도록 만들어 놓은 체계
- 파일의 저장/읽기를 위해 파일의 물리적 위치, 소유자, 권한 등의 다양한 정보가 필요하며, 이를 규약으로 관리하는 것
- etx4, xfs(최근에 많이 사용)
리눅스 부팅
리눅스 부팅과정을 알아보다 보니 4개의 Stage로 정리한 사진이 있어 가져왔다
- 하드웨어 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에 비해 부팅 속도가 느림
- UEFI (United Extensible Firmware Interface)
- BIOS의 단점을 보완하여 개발된 펌웨어
- 32 bit or 64 bit 모드로 실행 가능
- 디스크의 MBR 섹터를 거치지 않고 바로 부트 로더를 실행할 수 있음
- GPT 파티션으로 부팅 (2TB 초과 가능)
- BIOS 혹은 UEFI POST(Power On Self Test)
- 부트로더 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
- 초기화 데몬(init 혹은 systemd)을 실행
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
- Bourne Shell
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 상태로 변환됨
- 현재 쉘에서 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
리눅스 시스템 부팅 프로세스(리눅스 부팅과정)
요약 리눅스 시스템이 올바로 시동하려면 일련의 과정이 올바로 수행되어야 한다. 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 |