본문 바로가기

OS

[OS] 리눅스1급_리눅스의 구조1

728x90

#####. 리눅스의 구조

###. 부트매니저

#. 부트매니저의 개요

 - 부트매니저의 정의

 : 부트 매니저(Boot Manager)는 보조기억장치에 위치한 운영체제를 주기억장치로 로드하기 위한 프로그램이며 부트로더(Boot Loader)라고 부른다.

#. 부트 매니저의 동작 원리

  - 시스템이 켜지면서 BIOS는 디스크의 첫 번째 섹터(0번 섹터)인 부트 섹터에서 512바이트의 MBR(Master Boot Record)를 읽음

 - MBR의 크기가 제한되기 때문에 IPL(Initial Program Loader)라고 불리는 부트로더의 일부가 먼저 실행

 - IPL은 파티션 테이블을 검사하여 부트로더의 나머지 코드를 알아내 실행

 - 리눅스의 대표적인 부트 매니저 프로그램은 LILO(Linux LOader)와 GRUB(Grand Unified BootLoader) GRUB2

 

###. 부트매니저의 종류

#. LILO

 - 모든 리눅스의 배포판의 표준 가장 오래된 부트로더 

#. GRUB(Grand Unified Boot Loader)

 - GNU프로젝트에서 만든 부트로더

 - LILO와 달리 대화형, 네트워크 부팅 제공

 - CentOS6의 경우 /boot/grub/grub.conf 설정 파일

#. GRUB2

 - 기존의 GRUB의 한계를 해결하기 위해 작성

 - BIOS, EFI, OpenFirmware같은 다양한 유형 지원

 

###. GRUB 직접 사용

#. GRUB 초기화면

 - 설치된 운영체제를 선택 가능

 - e : 부트로더 설정 변경

 - a : 부트로더 설정 커널에게 인자 수정

 - c : 명령줄 모드

#. GRUB 변수, 설명

 - boot : 부팅 디스크를 설정

 - default : 사용자가 순서를 정하지 않으면 기본 부팅할 운영체제 순서

 - timeout

 - splashimage : GRUB 화면 배경 이미지를 설정하며 형식은 xpm.gz파일을 사용

 - title : GRUB 부팅 메뉴에 표시되는 이름

 - root : 루트 디바이스 설정

 - kernel : 부팅에 사용할 커널 이미지 파일 경로를 지정

 - lnitrd : 리눅스가 부팅하기 위해 필요한 프로그램 및 실행 스크립트가 포함된 이미지를 설정

 - rootnoverify : 루트와 유사하나 해당 파티션을 마운트하지 않는다. NTFS 파티션과 같이 GRUB이 인식할 수 ㅇ없는 파티션을 루트 디바이스로 지정할 때 사용

 - chainloader+1 : 지정한 파티션의 첫 번째 섹터를 읽어들여 부팅하라는 의미

 

###. GRUB2 사용해보기

#. GRUB2 초기 부팅화면

 

#. GRUB2 편집화면

 - e키를 누르면 선택한 메뉴 항목에 대한 하ㅗㄴ경설정이 화면에 표시되며 수정 가능

 - 변경을 원하는 항목 수정 후 컨트롤 x로 수정내용 부팅 시작

 - /boot/grub2/grub.cfg 파일에 적용 되는 것이 아니라 임시 수정

 - GRUB2 환경 설정 파일은 /boot/grub2/grub.cfg이며 /etc/grub2.cfg에 심볼릭 링크 되어있음

#. GRUB2 환경설정 파일

 - set 키워드를 통해 각 옵션 설정

 - timeout : 사용자가 선택하기를 기다리는 시간

 - default : 0은 첫번째, 1은 2번째

 -  linux16은 커널 이미지 경로를 설정하며 GRUB 환경설정 파일의 kernεl 항목과 동일한 역할을 수행

#. /etc/default/grub 파일

 - /etc/sysconfig/grub 파일은 /etc/default/grub 파일에 대한 심볼릭 링크

 - GRUB_TIMEOUT : 메뉴가 표시되고 사용자의 입력을 기다리는 시간

 - GRUB_DISTRIBUTOR : 제목

 - GRUB_DISABLE_SUBMENU : 메뉴 항목 하위에 서브 메뉴로 표시할 것인지 결정

 - GRUB_CMDLINE_LINUX 커널 부트 파라미터를 설정

 - GRUB_DISABLE_RECOVERY : true면 복구를 ㅜ이한 메뉴 항목이 기본으로 보여짐

 - grub2-editenv 명령어 사용

 - vi /boot/grub2/grub.cfg에서 파일 수정함ㅋㅋ (부팅 안되면 어캄....ㅋㅋㅋ)

 

###. 주요 디렉토리 구조

#. 리눅스 파일시스템 표준 (FHS : File system Hierarchy Standard)

 - BSD 리눅스 파일 시스템의 표준

#. 리눅스의 주요 디렉토리

 - / : 리눅스 파일 시스템의 최상위 디렉토리

 - /bin : 모든 사용자가 사용할 수 잇는 주요 명령어들이 위치. 대표적으로 ls, cp, mkdir, mv, rm, cat, tar등

 - /boot/ : 커널 파일이나 initrd(이닛로더) 등 부팅에 필요한 파일 위치. grub관련 파일

 - /dev/ : 하드디스크, CPU, Network, STDIO 등 디바이스 파일

 - /etc/ : Editable Tex Configuration : 시스템 환경설정 파일, 시스템 초기화 시 수행되는 여러 스크립트 파일들이 위치. 가령 init 프로세스가 수행하는 환경 설정 파일도 위치

 - /home/ : 로그인한 사용자들의 파일, 개인설정, 기타 등을 포함하는 사용자 전용 홈 디렉토리. 이 디렉토리 이하에는 각 사용자 계정으로 폴더가 생성 되고 사용자별 데이터가 저장

 - /lib/ : 시스템에 설치되어 있는 각종 라이브러리가 저장되는 디렉토리. 특히 /lib/modules에는 설치된 커널의 모듈이 위치

 - /media/ : CD-ROM이나 이동식 디스크가 시스템에 마운트시 이 디렉토리를 사용

 - /mnt/ : 다양한 디바이스가 마운트 할 떄 사용하는 임시 디렉토리

 - /opt/ : 추가 애플리케이션 소프트웨어 패키지

 - /proc/ : 메모리에 존재하는 모든 프로세스들이 파일형태로 매핑. 디스크 상에 실재 존재하는 것이 아닌 가상 파일 시스템으로 구현. 프로세스의 상태 정보, 하드웨어 정보, 기타 시스템 정보를 출력

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

 - /sbun/ : 시스템 종료 명령어인 shutdown, 네트워크 인터페이스 관련 명령어인 ifconfig, 시스템 점검과 복구 등  root가 사용하는 시스템 관리 명령어가 포함. system binary의 약자

 - /tmp/ : /var/tmp와 같은 공용 디렉토리로서 퍼미션은 1777이고 sticky bit가 설정됨. 각종 프로그램들이 임시 파일을 생성하는 디렉토리

 - /usr/ : 사용자들이 사용하기 위해 설치한 주요 명령어들이 위치

 - /usr/bin/ : 대부분의 사용자 명령어를 포함. Perl과 같은 명령어가 위치

 - /usr/sbin/ : 다양한 바이너리의 소스코드가 위치. 리눅스 커널의 소스코드도 이곳에 위치

 - /var/ : 로그, 스풀 파일 등 임시로 생성되거나 상황에 따라 생성되거나 삭제될 수 있는 데이터가 보관. 가령 로그 파일은 /var/log/에 위치하고 메일은 /var/spool/mail에 저장되고 cron의 설정파일은 /var/spool/cron에 위치

 - /sys/ : 핫 플러그 장치를 위한 sysfs 가상 파일 시스템을 통해 장치 정보를 제공. 프로세스를 위한 정보를 제공하는 /proc과 비슷한 방식

 - /run/ : 부팅 이후 시스템의 실행 중인 프로세스 또는 로그인한 사용자와 같은 런타임 데이터를 포함하고 있는 디렉토리 /var/run은 /run의 심볼릭 링크

 

###. 부팅과 셧다운

#. 부팅의 개요

 - 부팅이란 컴퓨터의 전원이 켜진 후 사용자가 시스템을 사용할 수 있도록 운영체제를 기동하는 절차, 과정을 의미

 - 부팅을 위해서 BIOS는 MBR로부터 부트로더를 실행. 부트로더는 지정된 위치에서 커널을 메모리에 읽어 들인 후 초기화 프로세스를 실행. 특히 리눅스의 겨웅 사용자가 지정한 실행 레벨에 따라 지정된 스크립트를 수행하여 운영체제의 나머지 초기화를 완료

#. 부팅의 상세 절차

 - 시스템 시작 및 하드웨어 초기화 : 메인보드 ROM 영역에 저장된 프로그램으로 가장 먼저 실행

 - 1단계 부트로더 : 하드디스크의 0번 섹터를 득별히 MBR이라 부르며 운영체제 로드를 위한 1단계 부트로더인 boot.img가 위치 0번 섹터는 512바이트로 작아서 2단계로 가기 위해 1.5단계를 거치는데 1.5단계는 core.img이며 1단계는 core.img까지 깨운다.

 - 2단계 부트로더 : 파일 시스템 상에 위치. GRUB legacy 및 GRUB2는 grub.conf의 설정에 따라 선택할 수 있는 운영체제 목록을 표시

 - 커널 : 하드웨어와 소프트웨어를 관장하는 핵심 모듈.  한번 로드되면 종료까지 상주, GRUB로부터 제어권을 이어받은 커널은 /sbin/init의 프로그램을 실행. Linux 버전에 따라 차이가 있는데 CentOS6에서는 init 프로세스를 그대로 실행하도 CentOS7에서는 심볼릭 링크되어 있는 systemd 프로세스를 실행

 - INIT 프로세스 : 부팅을 위해 필요한 초기화 작업을 실제로 수행, 가장 먼저 모든 시스템의 프로퍼티, 하드웨어, 디스플레이, SELinux, 커널모듈, ㅅ파일시스템 마운트 등을 체크하기 위해 /etc/rc.d/rc.sysinit 스크립트를 수행. INIT 프로세스는 /etc/inittab 파일을 읽어 실행 레벨을 확인하고 그에 맞는 스크립트를 실행. 5렙인 경우 /etc/rc5.d 디렉토리에 위치한 스크립트가 실행. 

  

레벨 설명
0 시스템의 종료
1 단일 사용자 모드, 시스템 복원모드
2 다중 사용자 모드, 네트워크 기능을 제공 않는 텍스트 기반 유저모드
3 네트워크 기능을 제공하는 다중 사용자 모드
4 현재 사용되고 있지 않는 모드
5 X윈도우를 사용하는 다중 사용자 모드
6 시스템을 재부팅할 때 실행되는 레벨

#. systemd (CentOS7)

 - systemd는 유닛이라는 단위로 시스템 및 서비스를 제어하는 관리자

 - 기존에는 /sbin/init 경로에 위치하는 System V계열의 INIT 프로세스가 PID 1을 가졌지만 CentOS7부터는 ./sbin/init에 심볼릭 링크가 걸려 있는 /usr/lib/system/sytemd가 그 열할을 수행

 - systemd는 기존의 system V의 init 스크립트와 호환성을 가졌지만 몇 옵션에서 제약이 존재

 - systemd는 다양한 유닛을 제공하며 INIT 프로세스의 실행 레벨의 개념에 대응하는 Target 유닛에 대해 알아둘 필요 있음, systemd는 부팅 시에 default.target 유닛에 심볼릭 링크되어 있는 Target 유닛을 실행. 만약 default.target 유닛이 multi-user.target으로 심볼링 링크 되어 있다면 부팅 시 multi-user.target과 연관된 유닛들이 실행 됨

#. 사용자 프롬프트

 - 모든 초기화가 완되면 실행 레벨에 따라 다르지만 X-window가 표시되거나 terminal을 통해 사용자의 입력을 받을 준비가 완료 됨

 

###. 로그인과 로그아웃

#. 로그인

 - 리눅스는 멀티 유저를 지원하는 운영체제 이기 때문에 IP/PW를 통해 사용자를 식별, 실행환경을 독립적으로 제공

 - INIT 프로세스 systemd 프로세스의 실행 레벨에 따라 단일 사용자, 멀티유저, X윈도우를 통한 멀티 유저 모드 나눔

 - 단일 사용자 : 실행레벨 1 : 시스템에 연결된 화면과 키보드를 통해 단일 사용자 로그인이 가능

 - 멀티유저 모드 (터미널) : 실행레벨 2.3 : 실행 레벨 2의 경우 네트워크를 통한 로그인이 제공되지 않고, 실행레벨 3의 경우 네트워크를 통한 로그인이 제공

 - 멀티 유저 모드 (X윈도우) : 실행레벨 5 : X 디스플레이 매니저를 통해 구현되는 그래픽 화면을 통해 아이디와 패스워드 입력후 로그인이 가능

 - 로그인 공지 기능

 : 설정파일 /etc/issue, /etc/issue.net, /etc/motd 각 기능은 로컬 접속시도, telnet, ssh 프로토콜 원격 접속시도, motd는 어디서

아무 일도 일어나지 않는다. ㅋㅋㅋ 나중에 해보자고ㅋㅋ

#. 로그아웃

 - 터미널 로그인 시 logout

 - Xwindow의 경우 ctrl + d, exit

 - vi /etc/profile ==> TMOUT=10 ==> 10초후 자동 로그아웃 // source /etc/profile 파일 재로드시 반영

#. 시스템 종료 (shutdown)

 - shutdown, halt, poweroff, init 으로 종료

 : shutdown -h now

 : halt

 : poweroff

 : init 0

 - 재부팅

 : shutdown -r now

 : reboot

 : init 6

 - 예약 종료

 : shutdown -h +5 : 5분 뒤 종료

 : shutdown -h 10:00 // OS 시간 10시 종료

 : shutdown -r +5 : 5분 뒤 재시작

#. GRUB 패스워드 설정 및 복구

centOS 7이라 없다..

 - grub-crypt 명령

 - vi /boot/grub/grub.conf

 - GRUB legacy 패스워드 복구

 : root 암호를 알고 있다면  /boot/grub/grub.conf의 password 줄을 삭제

 : root암호도 모르면 Rescue Installed system ==> /mnt/sysimage/boot/grub/grub.conf의 설정 password 삭제

#. GRUB2 패스워드 설정 및 복구

 - grub2-mkpasswd-pbkdf2 명령어

 - /etc/grub.d/40_custom의 set superusers="root"를 입력하고 다음 줄에 password_pbkdf2 root줄 그리고 생성한 패스워드를 이어서 입력

 - grub2-mkconfig 명령어를 통해 grub.cfg를 갱신. 확인하려면 /boot/grub2/grub.cfg를 열어 확인 가능

생각만큼 적용이 쉽지가 않다 ㅋㅋㅋ

 - GRUB2 패스워드 복구 : Troubleshooting => Rescue a CentOS system => 1) Continue

 

###. systemd

#. systemd의 개요

 - systemd는 이전 버전의 리눅스에서 사용하였던 SysV init 시스템을 대체하기 이한 시스템 및 서비스를 위한 매니저 역할을 수행

 - 레드햇사의 Lennart Poettering과 Kay Sievers가 처음 개발, LGPL 라이센스

#. 특징

 - SysV init과 호환성 유지됨

 - 부팅 시 시스템의 서비스들의 병렬로 시작할 수 있는 기능 제공

 - 데몬이 필요한 순간 실행하여 시스템 리소스를 절약 할 수 있는 온디맨드 액티베이션 기능 제공, 구체적으로 D-Bus, 소켓, 장치, 경로 기반 온디맨드 액티베이션 기능을 제공

 - 서비스 간 의존성을 고려하여 서비스의 시작 순서를 제어할 수 있는 기능을 제공

 - 시스템 서비스, 소켓상 패킷의 수신 대기, 실행 레벨등의 시스템 및 서비스와 관련된 정보를 유닛 이라는 단위로 추상화하여 관리

#. systemd의 구조

 - systemd units

 : 시스템을 관리하기 위해 Service, Target, Automount, Device, Mount, Path, Scope, Slice, Snapshot, Socker, Swap, Timer 등 다양한 유닛을 제공하며 그중 대표적인 유닛을 표로 정리

유닛 유형 확장자 설명
Service Unit .service 시스템상에서 동작하는 서비스 또는 데몬과 연관된 유닛
Target unit .target 다수의 유닛을 하나의 그룹을 관리할 수 있는 유닛. 대포적 예로 SysV init에 존재하였던 실행 레벨을 Target유닛으로 관리 가능
Device .divice 커널이 인식 가능한 장치와 연관된 유닛, 특정 USB장치가 연결될 떄 특정 서비스를 시작 가능
Muont unit .mount 파일 시스템의 파운트 포인트를 나타내는 유닛
Path unet .path 파일 시스템의 파일과 디렉토리와 연관된 유닛
Socket unit .socket 프로세스 간 통신을 의미하는 IPC를 위해 사용하는 소켓과 연고나된 유닛
Timer unet .timer systemd 타이머와 연관된 유닛

 - 유닛을 위한 파일 경로

 : 각 경로에 동일한 유닛이 발견된다면 표상 아래에 위치한 경로의 유닛이 우선

경로 설명
/usr/lib/systemd/system/ RPM 패키지로 배포되어 설치된 유닛은 이경로에 존재
/run/systemd/system 실행 시 생성된 유닛 파일이 위치하는 곳이며 /usr/lib/systemd/system 경로보다 이 경로에 위치한 유닛이 우선
/etc/systemd/system systemctl enable 명령을 통해 생성된 유닛이 위치하는 경로이며 /run/systemd/system 경로보다 이 경로에 위치한 유닛이 우선

 - 유닛 파일의 구조

 : 유닛 파일은 Unit, Unit type, Install 같이 3개의 섹션으로 구성

섹션 설명
Unit 유닛 공통의 일반적인 사항을 포함. Description은 유닛에 대한 설명 Documentation은 유닛의 설명에 있는 웹경로를 지정. Alter는 유닛이 시작할 순서를 정의하고Requres는 유닛의 의존고나계를 지정. Wants는 Requires보다는 약한 의존성을 지정 가능
Unit type 유닛 유형 마다 특성을 기술. 예를들어 Service 유닛은 Service라는 섹션 이름을 갖음. Service 섹션의 ExecStart는 유닛이 실행할 때 실행할 명령이나 스크립트를 지정. ExecStop은 유닛이 중지할 떄 실행할 명령어나 스크립트를 지정
Install systemctl enable 또는 disable 명령어로 유닛을 제어할 때 필요한 정보를 담고 있다. RequireBy는 해당 유닛에의존하고 있는 유닛의 목록을 지정. WantedBy는 유닛에 의한 의존 관계르 ㄹ갖고 있는 목록을 지정

#. systemd의 주요 명령어

 - 서비스 관리

기능 명령어
서비스 시작 systemctl start name.service
서비스 중지 systemctl stop name.service
서비스 재시작 systemctl restart name.service
서비스 실행 중인 경우만 재시작 systemctl try-restart name.service
서비스 설정 갱신 systemctl reload name.service
서비스 상태 확인 systemctl status name.service
서비스 목록 확인 systemctl list-units--type.service--all

 - 타겟 유닛

기능 명령어
기본 타겟 확인 systemctl get-default
현재 로드된 모든 타겟 확인 systemctl list-units --type target
기본 타겟 변경 systemctl set-default name.target
현재 타겟 변경 systemctl isolate name.target
복구 모드 변경 systemctl rescue
응급 모드 변경 systemctl emergency

 - 전원 관리

기능 명령어
시스템 끄기 systemctl halt
시스템 전원 끄기 systemctl poweroff
시스템 재시작 systemctl reboot
시스템을 서스펜드하기 systemctl suspend
시스템을 하이버네이트하기 systemctl hibernate
시스템을 하이버네이트 및 서스펜드하기 systemctl hybrid-sleep

 - 원격 제어

 : 원격 시스템에 실행중인 sshd 서비스에게 명령어를 전달하여 원격시스템의 서비스를 제어 가능. systemclt --host, --H옵션을 사용하여 원격지의 sshd서비스를 연결 가능

 : systemctl --host root@docker status httpd.service

 

 

 

728x90