[Linux, OS] 파일 접근 권한 | Process | Process 관리 명령

pos++·2023년 11월 4일
0

Linux

목록 보기
5/16
post-thumbnail

2023.10.30 TIL

파일의 속성과 접근 권한

user1@myubuntu:$ ls -l /etc/hosts
-rw-r--r-- root root 223 November 8 23:13 /etc/hosts
  • - : 일반 파일
  • d : 디렉토리

파일 소유자의 로그인 ID

리눅스에서 모든 파일은 소유자가 있다.

파일 소유자의 그룹 이름

  • ls -l 명령에서 출력되는 그룹명은 파일이 속한 그룹
  • 사용자가 속한 기본 그룹은 시스템 관리자가 사용자를 등록할 때 결정
  • 모든 그룹명 출력 : groups
  • 사용자가 속한 그룹을 알려주는 명령 : groups [username]

접근 권한의 종류

권한파일디렉토리
read (r)파일을 읽거나 복사 가능ls 명령으로 디렉토리 목록 보기 가능(옵션은 execute 권한이 있어야함)
write (w)파일을 수정, 이동, 삭제 가능 (디렉터리에 write 권한이 있어야함)파일 생성, 삭제 가능
execute(x)파일 실행 가능cd 명령 사용 가능

접근 권한의 표기 방법

-rw-r--r-- 의 의미

  • - → 파일의 속성
    • - → 일반 파일
    • d → 디렉토리
  • rw- → 소유자, read 가능, write 가능, execute 불가
  • r-- → 그룹, read 가능, write 불가, execute 불가
  • r-- → 기타 사용자, read 가능, write 불가, execute 불가

접근 권한의 변경 명령

chmod [권한표기] test.txt

-R 옵션 → 하위 디렉토리까지 모두 변경

기호를 이용한 파일 접근 권한 변경 : 기호 모드

  • 사용자 카테고리

    • u → 파일 소유자
    • g → 소유자가 속한 그룹
    • o → 기타 사용자
    • a → 전체 사용자
  • 연산자 기호

    • + → 권한 부여(추가)
    • - → 권한 제거
    • = → 권한 설정
  • 접근 권한 문자

    • r → 읽기 권한
    • w → 쓰기 권한
    • x → 실행 권한
  • u+w → 소유자에게 write 권한 부여

  • u-x → 소유자의 execute권한 제가

  • g+w → 그룹에 write권한 부여

  • o-r → 기타 사용자의 read권한 제거

  • g+wx → 그룹에 write, execute 권한 부여

  • +wx → 모든 사용자에게 umask에 따라 권한 부여

  • a+rwx → 모든 사용자에게 read, write, execute 권한 부여

  • u=rwx → 소유자에게 read, write, execute 권한 설정

  • go+w → 그룹과 기타사용자에게 write 권한 부여

  • u+x, go+w → 소유자에게 execute권한 부여하고 그룹과 기타사용자에게 write 권한 부여

숫자를 이용한 파일 접근 권한 변경 : 숫자 모드

chmod 644 a.txt → a.txt에 대해 rw-r--r-- 로 권한 설정

  • 777 == 111111111 → rwxrwxrwx

  • 755 == 111101101 → rwxr-xr-x

  • 666 == 110110110 → rw-rw-rw-

  • 555 == 101101101 → r-xr-xr-x

  • 644 == 110100100 → rw-r--r--

  • 700 == 111000000 → rwx------

  • 640 == 110100000 → rw-r-----

  • 400 == 100000000 → r--------

  • 7 == 111 → rwx

  • 6 == 110 → rw-

  • 5 == 101 → r-x

  • 4 == 100 → r--

  • 3 == 011 → -wx

  • 2 == 010 → -w-

  • 1 == 001 → --x

  • 0 == 000 → ---

기본 접근 권한 설정

파일이나 디렉토리가 생성될 때 자동으로 설정되는 기본 접근 권한이다.

  • 일반 파일 → 644, rw-r--r--
  • 디렉토리 → 755, rwxr-xr-x

기본 접근 권한 확인하고 변경하기

umask → 기본 접근 권한을 출력

umask [마스크 값] → 파일이나 디렉터리 생성 시 부여하지 않을 권한 지정

umask 022----w--w-, 그룹과 기타사용자에게 w 권한 부여하지 않음

umask

마스크 값 변경하기

umask 077000111111, 그룹과 기타사용자에게 rwx 권한 모두 부여하지 않음

마스크 값의 적용 과정

  1. 최대 권한
    • 일반 파일 : rw-rw-rw-
    • 디렉토리 : rwxrwxrwx
  2. 2진수로 변환
    • 일반 파일 : 110 110 110
    • 디렉토리 : 111 111 111
  3. 마스크 값 (ex: 002와 XOR 연산)
    • 일반 파일 : 000 000 010
    • 디렉토리 : 000 000 010
  4. 마스킹 결과
    • 일반 파일 : 110 110 100
    • 디렉토리 : 111 111 101
  5. 부여된 권한
    - 일반 파일 : 664
    - 디렉토리 : 775

여러가지 마스크 값

  • 022 → 그룹, 기타사용자는 read만 가능
  • 077 → 그룹, 기타사용자는 접근권한 모두 제거
  • 027 → 그룹은 read만 가능, 기타사용자는 접근권한 모두 제거

특수 접근 권한

접근 권한은 원래 4자리 → 생략된 맨 앞자리는 특수 접근 권한이다.

  • 0 → 일반적인 접근 권한
  • 1 → Sticky bit
  • 2 → SetGID
  • 4 → SetUID

SetUID

해당 파일이 실행되는 동안에는 파일을 실행한 user의 권한이 아니라 파일 소유자의 권한으로 실행된다.

• 설정 : chmod 4755 set.exe
설정된 후 : -rw**s**r-xr-x → 소유자의 실행 권한에 ‘s'가 표시

passwd 명령은 SetUID가 설정되어 있기 때문에 소유자인 root 권한으로 실행되어 암호변경이 가능하다.

SetGID

해당 파일이 실행되는 동안에는 파일 소유 그룹의 권한으로 실행된다

• 설정 : chmod 2755 set.exe

Sticky bit

이 비트가 디렉토리에 설정되어 있으면 그 디렉토리에는 누구나 파일 생성이 가능하다

파일을 생성한 계정이 소유자로 설정되고,
다른 사용자가 생성한 파일은 설정 불가하다.

/tmp 디렉토리가 대표적

•설정 : chmod 1755 set.exe 접근 권한에서 1을 설정
설정된 후 : drwxrwxrw**t** → 소유자의 실행 권한에 ‘t'가 표시



OS Process

Program

순서가 있는 Instruction set + Data 값

Processor

Hardware, CPU

Task, Job (≈ Process)

  • 여러 process들이 모여 처리해야할 작업들
  • 현재 시스템에서 실행중인 프로그램
  • control flow의 encapsulation
  • execution, scheduling의 기본적인 단위

PID라는 것을 별도로 가지고, 운영체제가 이를 이용해 프로세스를 구분힌다.

  • CPU contexts (registers)
  • OS resources (memory, open files, etc.)
  • PID, state, owner, etc.

a.exe 실행되는 과정

  1. 새로운 Virtual Adress Space를 만든다.
  2. code의 binary와 data를 읽어 memory의 특정 영역에 올린다.
  3. stack, heap을 사용한다.

Process Hierarchy

Parent-Child 관계로, 하나의 process는 다른 하나의 process를 생성할 수 있다.

$ ./99.exe → Bash(Parent Process) 가 99.exe(Child Process) 생성

Process creation events

  • Calling a system call

    • fork()
    • Shell은 내부에서 fork()를 하는것
  • System initialization

    • init process
    • PID 1 process
    • 모든 process는 이 init의 child로 만들어진다

Resource sharing

Parent process는 모든 resource와 권한을 child에게 물려준다.

  • User ID, open files, etc.

Execution

Parent process는 child가 끝날때까지 기다리거나, parallel하게 실행된다.

Address space

Child가 parent의 address space를 복제한다.

Process termination events

  • Normal exit
  • Error exit
  • Fatal error (involuntary)
  • Killed by another process (involuntary)

fork() system call

  • Child process를 만드는 유일한 방법
  • Parent의 address space를 복제해 child process 생성
  • Internal data structure를 복사
  • Parent는 child의 PID를 return받음
  • Child는 0을 return받음

Process State Transition

새로 만들어진 Child → new

PCB (Process Control Block)

각 PCB는 하나의 process를 대표한다.

Process의 모든 정보를 담고있다.

  • state, PC, CPU registers, CPU scheduling information, Accounting information, I/O status inforrmation, etc.

task_struct → PCB 정보 관리

  • When a process is running
    • CPU에 hardware state가 있음 (PC, SP, registers)
  • When the OS stops running a process
    • PCB에 registers’ 값들을 저장
  • When the OS puts the process in the running state
    • 해당 process의 PCB에 저장된 값들로부터 hardware registers을 load

Context Switch

CPU를 하나의 process에서 다른 process로 전환하는것

  • Administrative overhead

    • Registers and Memory map들을 save, load
    • Memory cache의 flush, reload
    • 각종 Table, list 등등 update
  • Context switch overhead는 Hardware support에 dependent

    • Multiple register sets in UltraSPARC
    • Advanced memory management techniques may require extra data to the switched with each context
  • 100s or 1000s of switches/s typically

cat /proc/stat → process 정보들 볼수있음

Process State Queues

OS는 queue들의 collection을 가지고 있다 → system의 모든 process를 나타낸다

  • Ready queue
  • Wait queue

각 PCB는 현재 state에 따라 state queue에 들어가게 되고,
Process state가 바뀌면 해당 PCB는 queue들 사이를 왔다갔다하게 된다

  • PCB는 data structure
    • Dynamic하게 OS memory에 할당됨
  • Process가 생성되면
    • OS는 PCB를 할당
    • OS는 PCB를 초기화
    • OS는 PCB를 해당되는 queue에 추가
  • Process가 실행되는 동안
    • OS는 PCB를 queue들 사이에서 이동시킴
  • Process가 종료되면
    • OS는 PCB를 deallocate

fork()

  • PCB를 생성, 초기화
  • 새로운 address space를 생성, 초기화
  • Address space를 부모 address space 내용을 통째로 복사하여 초기화
  • Kernel resource를 부모가 쓰는 resource를 가리키도록 초기화
  • PCB를 ready queue에 넣음
  • 부모에게 자식의 PID를 return, 자식에게 0을 return
  • 왜 쓰는가?
    - Child → parent와 cooperate해야하는 경우가 있음
    - Ex: Web Server

exec()

  • int exec(char *prog, char *argv[])
  • 현재 proces를 멈춤
  • Program prog를 process의 address space에 load
    • sh이 cat을 불러서 사용 → sh를 멈춤 → cat의 code와 data로 덮어씀 → 이제 이 process는 sh이 아니라 cat
  • Hardware context, args를 새로은 program으로 초기화
  • PCB를 ready queue에 넣음
  • exec()은 새로운 process를 생성하는 것이 아닌, 현재 process를 다른 process로 변신시키는 것
int main()
{
	while(1) {
    	char *cmd = read_command();
        int pid;
        if ((pid = fork()) == 0) {
        	/* pope, redirection 등을 위한 stdin/stdout/stderr 처리*/
            exec(cmd);
            panic("exec failed");
        } else {
        	wait (pid);
        }
    }
}

Inter-Process Communication

  • Inside a machine
    • pipe
    • FIFO
    • Shared memory
    • Sockets
  • Across machines
    • Sockets
    • RPCs (Remote Procedure Calls)
    • Java RMI (Remote Method Invocation)

Process의 종류

  • Daemon Process
    • 특정 서비스를 제공하기 위해 존재, 리눅스 커널에 의해 실행
    • Web Server 등
  • Orpham Process
    • Child process가 아직 실행중인데 Parent Process가 먼저 종료됨
    • 1번 process가 orphan process의 새로운 parent process가 됨
  • Zombie Process
    • Child process가 실행을 종료했는데도 process table 목록에 남아있는 경우
    • Process 목록에 defunct process라고 나오기도 함
    • Zombie process가 증가하면 process table의 용량이 부족해 일반 process가 실행되지 않을수도 있음

Process 관리 명령

Process 목록 보기

ps → 현재 실행중인 프로세스 목록 출력

🐚 UNIX (SVR4)

-e → 실행중인 모든 process의 정보 출력

-f → PPID, 터미널 번호, 시작 시간 등 process의 자세한 정보 출력

-u [uid] → 특정 사용자에 대한 모든 process의 정보 출력

-p [pid] → pid로 지정한 특정 process의 정보 출력

🐚 BSD

a → 터미널에서 실행한 process의 정보 출력

u → process 소유자 이름, CPU 사용량, memory 사용량 등 상세정보 출력

x → 시스템에서 실행중인 모든 process의 정보 출력

🐚 GNU

--pid [PID] → 목록으로 지정한 특정 PID의 정보 출력

TTY 값이 ? → Daemon으로 시스템이 실행한 process

보통 그냥 ps -efps aux나 같이 ps -ef aux라고 쓴다

특정 프로세스 정보 검색하기 1

ps -ef | grep bash → bash에 대한 process 정보 출력

특정 프로세스 정보 검색하기 2

pgrep -x bash → 딱 bash인 process의 PID 출력

-x → 패턴과 정확히 일치하는 process의 정보 출력

-n → 패턴을 포함하고 있는 가장 최근 process의 정보 출력

-u [사용자명] → 특정 사용자에 대한 모든 process 출력

-l → PID와 process 이름 출력

-t term → 특정 단말기와 관련된 process의 정보 출력

ps -fp $(pgrep -x bash) → process의 상세 정보, 그중에서 bash의 정보만 출력

Signal

Process에 무언가 발생했음을 알리는 간단한 메세지

kill -l → 리눅스에서 지원하는 signal의 목록 출력

주요 Signal

  • SIGHUP (1) → 터미널과의 연결이 끊어졌을때 발생
  • SIGNT (2) → interrupt로 사용자가 control+c를 입력하면 발생
  • SIGQUIT (3) → 종료 신호로 사용자가 control+\를 입력하면 발생
  • SIGKILL (9) → 이 signal을 받은 process는 무시할 수 없으며 강제로 종료됨
  • SIGALRM (14) → 알람에 의해 발생
  • SIGTERM (15) → kill 명령이 보내는 기본 signal

Process 종료하기

kill -9 1001 → PID 1001번을 SIGKILL, 즉 강제로 종료한다

pkill man → PID를 몰라도, process의 명령 이름으로 process를 찾아 종료

Process 관리 도구

top → 현재 실행중인 process에 대한 정보를 주기적으로 출력

htop 이 더 사용하기에 편라히고 좋음. 별도 설치 필요

Enter, Space Bar → 화면을 즉시 다시 출력

h, ? → 도움말 화면 출력

k → process 종료, 종료할 process의 PID를 물어봄

n → 출력하는 process의 개수를 바꿈

p → CPU 사용량에 따라 정렬하여 출력

q → top 명령 종료

M → 사용하는 메모리 크기에 따라 정렬하여 출력

u → 사용자에 따라 정렬하여 출력



profile
밀린 TIL 업로드 조금씩 정리중...

0개의 댓글