[OS] 운영체제 구조
운영체제 개념
운영체제 또는 오퍼레이팅 시스템 (Operating 은 시스템 하드웨어를 관리할 뿐 아니라 응용 소프트웨어를 실행하기 위하여 하드웨어 추상화 플랫폼과 공통 시스템 서비스를 제공하는 시스템 소프트웨어이다
운영체제 부팅 과정(LINUX)
WINDOW 도 유사한 과정을 거치지만 아래는 LINUX 기준으로 명시함.
- BIOS : ROM BIOS : Basic Input/Output System (CMOS)
- POST (Power On Self Test) 및 물리적 Boot 디바이스 선정 PC 전원이 맨 처음 들어 오게 되면 BIOS란 하드 기능이 탑재된 소프트웨어가 동작하면서 기본적으로 POST 체크하고 물리적으로 동작하는지 체크함
- MBR : MBR Master Boot Record
- HDD의 특정 섹터 (0 번 섹터 512Byte)
위 BIOS 기능에서 문제 없으면 MBR 기능을 수행하게 된다.
- GRUB : 부트로더 : Bootloader
- 소프트웨어 영역 멀티 부트 등 처리를 위한 멀티 스테이지 부트
- LILO, GRUB (Grand Unified Bootloader), GRUB2, uboot
부트로더라는 소프트웨어 읽어서 어느 영역으로 부팅할 건지 결정해준다. (과거에 없던거로 MBR에서 부팅해주는 수가 있었느나 다양한 부팅옵션이나(멀티부팅) 운영체제의 복구옵션이 생기면서 공간이 부족해져서 부트로더라는 소프트웨어로 분리되며 생기게 되었다. )
Kernel: 커널: Linux Kernel
- 운영체제 소프트웨어 메모리에 올려서 구동 HW 디바이스 , FS 등
- sbin init 을 실행하며 initrd 패키지의 실행 pid 1)
커널이 구동되면서 각종 디바이스들을 초기화 하고, 각 벤더사들에서 하드 기능들을 모두 활용하게 할 수 있는 디바이스들을 구성하면서 운영체제가 시작하게 됨.
Init : 부팅 : Init process
- 루트 유저 프로세스로 systemd 등의 부팅 과정 수행
- etc inittab 등 실행
메모리에 운영체제가 다 올라가면 init을 시작함
- Runlevel : 부팅 : Runlevel etc rc.d rc *.
- 소프트웨어 부트 스크립트
각 환경에 맞는 응용 소프트웨어(서비스)들이 시작되는데 이게 Runlevel. 이건 윈도우엔 없고 리눅스 계열 OS만 존재한다.
부트로더는 초급때는 사용하지 않는다.
우분투 운영체제의 부트로더
- grub.cfg : etc grub.d /* 내용들과 etc /default/grub 을 통해 생성
- /etc/fstab : 우분투 리눅스가 부팅과정 거치면서 파일 마운트 하는 과정 파일시스템 마운트 하는 과정 거쳐서 사용자에게 붙여주는 것.
우분투 운영체제의 부팅 프로세스
우분투 과정에 있는 init() 과정
고전적으로는 유닉스 계열에서 출발한 systemfive라는 init과정이였음. 근데 이 부팅 시스템도 요구사항이나 다양한 프로세스가 생겼고 14, 16을 거쳐 업그레이드 되어 갔다.
systemd란
startup 프로세스를 구동하는 시스템
- 기존 init 보다 훨씬 (?) 단순한 프로세스
- 동시성 병행 실행 ) 을 제공하며 부팅 속도를 대폭 향상 시킴
- 프로세스간의 dependency 를 손쉽게 처리 함
- 서비스 모니터링의 편리함 재시작 , Crash 등에 대한 모니터링
- 저널 로깅 시스템을 사용한 편리한 모니터링
- 컴포넌트의 손쉬운 추가 삭제
우분투에서는 부팅 프로세스 명령어가 혼재되어있다(SysV, Upstart, systemd)
- sudo service status all
- sudo service network manager restart
- sudo systemctl restart network manager
이런식으로 어떤 방식의 프로세스 써도 되긴 한다.
그래도 같은 역할을 하는 스크립트의 경우 init 명령어 보다는 systemd 명령어를 사용하는 것을 권장한다.
다중 사용자
여러 명이 컴퓨터를 같이 사용하게 되면 점점 각자의 비밀이 생기고 또 각자가 해야 할 일과 하지 말아야 할 일들에 대한 권한이 생기면서 다중 사용자 시스템이 기능성을 갖게 돼야 되는 상황이 오게 되었다.
각자의 아이디로 로그인해서 컴퓨터를 사용할 수 있다는 장점은 있지만 단점으로 다중사용자 시스템이 되는 순간에 시스템의 복잡도가 높아진다. 이렇게 다중 사용자는 양면성을 가진다.
뭐가 됐건 간에 어쨌든 유닉스 시스템은 다중사용자
윈도우에서는 나 자신이 관리자. 내가 모든걸 사용할 수 있고 설치 할 때 권한 묻긴 하지만 확인만 누르면 뭐든 실행이 가능하다.
사용자 권한
리눅스는 관리자와 사용자가 명확하게 구분이 된다. 다수의 사용자가 있고 시스템 관리자가 있고 권한을 빌려 쓸 수 있는 사용자가 있다.
이 시스템 관리자를 루트 관리자라 부르는데 이 차이를 인지하지 못 하고 시스템 운영이 어렵다 보니 자꾸 루트 사용자로 로그인 해서 작업하는 실수 범함.
그래서 우분투는 root 사용자를 막음(필요하면 활성화는 되나. 사람들이 이 막강한 권한을 남발해서 이걸 막아둠.)
내 PC라고 내가 관리자가 아님. ROOT 관리자를 쓰면 편하기는 하나 추천되지 않는 방식. 나는 그냥 사용자고, 필요할 때 이걸 빌려서 사용한다고 생각하면 되고 이게 리눅스의 철학.
사용자 그룹 및 권한(퍼미션)
사용자와 권한 관련 명령어
- 계정 종류
- root 유저와 사용자 계정
- 계정 살펴보기 (etc /passwd, etc /shadow, etc /group)
- 내 권한 (whoami , id)
- 그룹 계정 및 권한 (sudoer & sudo )
- 사용자 생성과 그룹 생성 (adduser , useradd , usermod , deluser , userdel , addgroup , delgroup)
- 파일 권한 다루기 (chmod , chown , chgrp , umask)
- 파일 다루기 상급
- setuid , setgid
사용자 계정 superuser 와 user
슈퍼유저
시스템 운영 관리자 계정으로 일반적으로 리눅스 운영체제에서는 루트 (root) 유저를 말한다
whoami 내가 누구인지 내 계정 확인
id 내가 갖고 있는 권한 포함된 그룹 확인
사용자 계정 권한의 대여
- sudo
- 슈퍼유저 (su peruser) 의 권한을 수행 (do) 한다
근데 루트 계정을 막 쓰거나 sudo 를 막 쓰는 건 좋지 않다.
su[username]
사용자의 권한을 대여 ()즉 , 사용자로 로그인 한 것과 같은 효과) 언제 사용하느냐 ? 관리자가 사용자 계정을 관리하고 이슈 장애를 분석 할 때
사용방법
- su user2
- user2 의 id 로 로그인 한다 (user2 의 pw 필요
- su - user2
- user2 의 id 로 로그인 한다 (user2 의 pw 필요 , user2 의 home 디렉토리 사용
- su 혹은 su root
- root 의 id 로 로그인 한다 (root 의 pw 필요 . 하지만 우분투는 root 암호 비활성화
- sudo su
- 내 권한을 상승하여 root 사용자의 권한으로 로그인 한다 현재 디렉토리 사용
- sudo su -
- 내 권한을 상승하여 root 사용자의 권한으로 홈 디렉토리 사용 (root 의 home)
- sudo su - user2
- user2 사용자의 권한으로 홈 디렉토리 사용 sudoer ( 의 pw 필요 , user2 의 home)
사용자 계정과 그룹 계정
cat / etc /passwd : 사용자 계정 확인
- cat / etc /shadow : 사용자 암호
- cat / etc /group : 사용자 그룹 확인
사용자 추가 (adduser add user)
adduser [options] home DIR] [ shell SHELL] [ disabled password] [ disabled login] user
사용자 추가 (useradd user add with default (none dialog 방식 ) / adduser 의 아래 레벨 실행파일)
useradd [options] user 사용자 (기본값으로 ) 추가
useradd user3 : 사용자 user3 추가
useradd D : 사용자 생성 기본값 확인
useradd D b / usr : 사용자 기본 홈 디렉토리 usr 로 변경
useradd D s /bin/bash : 사용자 기본 쉘 bash 로 변경
useradd D e 2020 12 31 : 사용자 계정 만료일 설정
사용자 암호 정책 변경 / 암호 변경 chage change age / passwd)
chage [option] user
사용자 암호 정책 변경
passwd [options] user : 암호변경
passwd l user : 계정 잠금
passwd u user : 계정 잠금 해제
passwd S user : 계정 상태 확인
passwd n < mindays > user : 암호 최소 기간
passwd x < maxdays > user : 암호 최대 기간
man passwd
chage user2 : 암호 정책 변경
chage l user2 : 암호 정책 확인
chage E 2020 12 31 m 1 M 90 W 7 user2
사용자 삭제 ( deluser delete user)
deluser [options] user
사용자 계정 삭제
userdel user none interactive 모드로 모두 삭제
deluser user2
deluser user2 remove home
새로운 사용자를 동일 ID 로 만들경우 , 이전 디렉토리에 맵핑
userdel user2 : 사용자 계정 삭제 홈 삭제
userdel f user2 : 로그인 중이더라도 삭제
그룹 생성 addgroup add group)
addgroup [options] group : 그룹 계정 생성 groupadd [options] group : 실제 addgroup 의 바이너리
그룹 삭제 (delgroup delete group)
delgroup [options] group : 그룹 계정 삭제
그룹 계정 / 사용자 할당 또는 사용자 정보 수정 usermod user mod)
usermod [options] user 사용자 계정 정보 수정 moduser 는 없음 (interactive 방식인 사용자를 그룹에 추가
usermod c
user2 : 사용자 이름 수정 - usermod a G sudo user2 : user2 를 sudo 그룹에 추가
- adduser user2 sudo : user2 를 sudo 그룹에 추가
- deluser user2 sudo : user2 를 sudo 그룹에서 제거 (실행후 결과 번역 오류)
파일의 권한
- 사용자 접근 권한의 구분
파일의 생성 권한 (umask user mask)
파일 디렉토리 생성 권한의 확인
파일의 권한 권한 변경 (chmod change mode)
chmod [OPTION]… [MODE]… 파일/디렉토리 권한의 변경
소유자(User) / 그룹 (Group) / 그외 (Other)
chmod 777 hello.txt : 숫자값을 통한 user/group/other 에 rwx 권한 부여
chmod 700 hello.txt : 숫자값을 통한 user 에 rwx 권한 부여 (group/other 에는 권한 부여
chmod u+x hello.txt : user 에 x( 실행 ) 권한 추가
chmod u x hello.txt : user 에 x( 실행 ) 권한 삭제
chmod g+rw hello.txt : group 에 rw 읽기 쓰기 ) 권한 추가
chmod g rx hello.txt : group 에 rw 읽기 쓰기 ) 권한 삭제
chmod o+rwx hello.txt : other 에 rwx 읽기 쓰기 실행 ) 권한 추가
chmod o rwx hello.txt : other 에 rwx 읽기 쓰기 실행 ) 권한 삭제
chmod +x hello.txt : user/group/other 에 x( 실행 ) 권한 추가
파일의 권한 소유권 변경 chown change owner, chgrp change group)
chown [OPTION]… [USER][:GROUP] 파일/디렉토리의 소유자 그룹 변경
chgrp [OPTION]… [GROUP] 파일 디렉토리의 그룹 변경
소유자 (User) / 그룹 (Group) / 그외 (Other)
chown user2 hello.txt : 해당 파일 (hello.txt) 의 소유자를 user2 로 변경
chown user2:user2 hello.txt : 해당 파일 (hello.txt) 의 소유자와 그룹을 모두 user2 로 변경
chown :user2 hello.txt : 해당 파일 (hello.txt) 의 그룹을 user2 로 변경
chgrp user2 hello.txt : 해당 파일 (hello.txt) 의 그룹을 user2 로 변경
파일의 특수 실행 권한 setuid , setgid , sticky
파일의 권한을 일시적으로 소유주 setuid 혹은 소유그룹 setgid 의 권한으로 빌려서 실행함
Sticky bit 은 해당 디렉토리에 생성된 파일은 해당 사용자의 소유주로 저장됨
소유자 (User) / 그룹 (Group) / 그외 (Other)
SetUID 는 4xxx, SetGID 는 2xxx 로 , StickyBit 은 1xxx 로 설정한다 각각 설정 위치는 rw s ————, rwxrw s ——, drwxdrxdw t 로 표시된다
기존 권한의 위치에 덮어쓰기 때문에 , 해당 기능만 존재할 경우 대문자 S/S/T 로 표기 된다 각각 설정 위치는 rw S ————, rwxrw S ——, drwxdrxdw T 로 표시된다 기존 권한 ( 실행권한 ) 을 포함하고 있는 경우 소문자 s/s/t 로 표시된다
chmod u+s filename
chmod g+s filename
chmod +t directoryname
파일의 특수 실행 권한 setuid , setgid , sticky
(다소 복잡한) 실습 시나리오 : 두명의 사용자가 있고 , user1 이 만든 읽기 전용 파일에 user2 가 setuid 권한을 통해 접근 user1, user2 두명의 사용자
user1 의 readonly 파일 생성
/bin/cat 을 복사해서 mycat 으로 생성 및 setuid 를 통해 실행 권한을 부여
user2 가 readonly 파일을 직접 읽을 수는 없지만
setuid 가 실행된 파일로는 읽을 수 있음