[Linux, OS] Foreground, Background Process | 작업 예약 | Linux File System, Mount, Disk 관리 | Booting, Daemon, GRUB

pos++·2023년 11월 5일
0

Linux

목록 보기
6/16
post-thumbnail

2023.10.31 TIL

Foreground, Background Process

Foreground Process

사용자가 입력한 명령이 실행되어 결과가 출력될 때까지 기다려야 하는 foreground 방식으로 처리되는 process

$ sleep 100 → Foreground로 실행. sleep 명령이 끝날 때까지 기다려야 한다.

Background Process

명령을 실행하면 명령의 처리가 끝나는 것과 관계없이 곧바로 prompt가 출력되어 사용자가 다른 작업을 계속할 수 있음

$ sleep 100 & → Background로 실행. Prompt가 바로 나와 다른 명령 실행 가능

Background로 처리할 때는 주로 출력과 오류 방향 전환을 하여 실행 결과와 오류 메세지를 파일로 저장

$ find / -name passwd > pw.dat 2>&1 & → pw.dat에 결과와 오류 저장

작업 제어

  • 작업 전환 : Foreground 작업 ↔ Background 작업
  • 작업 일시중지
  • 작업 종료

작업 목록 보기

jobs [%작업 번호] → Background로 실행되고 있는 작업 출력

+ → 가장 최근에 접근한 작업

-+ 작업보다 바로 전에 접근한 작업

작업 전환

bg [%작업 번호] → Background 작업으로 전환

fg [%작업 번호] → Foreground 작업으로 전환

작업 정지

control+Z, stop [%작업 번호] → 작업을 잠시 중단. 종료가 아니다

작업 종료

control+C → Foreground 작업 종료

kill [%작업 번호] → Background 작업 강제 종료


로그아웃 후에도 백그라운드 작업 계속 실행하기

nohup find / -name passwd & → find 명령을 계속 실행, 자동으로 nohup.out 생성

more nohup.out → 다시 로그인하여 파일 내용 확인

nohup find / -name passwd > pw.dat 2>&1 & → nohup.out 파일을 생성하지 않고 지정한 파일 pw.dat에 결과와 오류메세지 출력



작업 예약

특정한 시간에 작업을 수행하도록 예약할 수 있는 두가지 방법

정해진 시간에 한번만 수행 → at

at 10:15 pm June 18 → Enter → 명령 입력

at 4pm + 3days → 지금부터 3일 후 오후 4시에 작업 수행

at 1am tomorrow → 내일 오전 1시에 작업 수행

-l, $ atq → 현재 실행 대기중인 명령의 전체 목록 출력

-r [작업 번호] → 현재 실행 대기중인 명령 중 해당 작업번호를 삭제

-d [작업 번호], $ atrm [작업 번호] → 설정한 작업이 실행되기 전에 삭제

-m → 출력 결과가 없더라도 작업이 완료되면 사용자에게 메일로 알림

-f [파일] → 표준 입력 대신 실행할 명령을 파일로 지정
명령 입력 마지려면 control+D

at 작업파일 확인
sudo ls -l /var/spool/cron/atjobs

daemon 그룹의 사용자만 해당 디렉토리 확인 가능

at 명령 사용 제한하기

  • /etc/at.allow 파일과 /etc/at.deny 파일에 한 줄에 하나의 사용자명 쓰기
  • /etc/at.allow 파일이 존재한다면 이 파일에 있는 사용자만이 at 사용 가능
  • /etc/at.deny 파일은 2순위

at 설치

sudo apt-get install at, sudo apt-get install mailutils

정해진 시간에 반복 수행 → crontab

crontab -u user1 -e → user1의 crontab 파일 편집

-u → 특정 사용자에 대해 적용. 생략시 현재 사용자

-e → 사용자의 crontab 파일 생성, 편집. vi 편집기 열림

-l → crontab 파일 내용 확인

-r → crontab 파일 삭제

crontab 파일 확인
sudo ls -l /var/spool/cron/crontabs

crontab 명령 사용 제한하기

  • /etc/cron.allow 파일과 /etc/cron.deny 파일에 한 줄에 하나의 사용자명 쓰기
  • /etc/cron.allow 파일이 존재한다면 이 파일에 있는 사용자만이 crontab 사용 가능
  • 둘중 하나만 쓰도록 하자


Linux File System

Linux File System의 종류

File System

파일과 디렉토리의 집합을 구조적으로 관리하는 체계이다.

ext3

Journaling 기능 도입하여 Disk 복구기능을 강화하였다.
최대 32TB까지 지원한다.

ext4

현재 주로 default로 쓰이는 파일 시스템이다.
1EB 이상의 볼륨, 16TB 이상의 파일을 지원한다.

XFS

최대 16EB까지 지원한다.

특수 용도의 가상 File System

swap → swap 영역을 관리하기 위한 것

tmpfs → 메모리에 임시 파일을 저장하기 위한 것, 시스템이 재시작할때마다 내용 삭제됨

proc → /proc 디렉토리, 커널의 현재 상태를 나타내는 파일을 가짐

ramfs → 램디스크를 지원

cat /proc/filesystems → 현재 커널이 지원하는 file system의 종류 출력

Linux File System의 구조

Linux의 모든 File System

  • 파일은 inode로 관리
  • 디렉토리는 단순히 파일의 목록을 가지고 있는 파일이다
  • 특수 파일을 통해 장치에 접근할 수 있다

ext4 file system의 구조

  • 효율적으로 disk를 사용하기 위해 저장장치를 논리적인 block group으로 구분
  • Block은 4KB, 실제 크기는 시스템 설정에 따라 변경가능
  • Block group 유형
    • Block group 0
      • File system의 첫번째 block group
    • Block group a
      • Super block, Group descriptor의 copy를 가짐
    • Block group b
      - Data block bitmap으로 시작함

Super Block

전체 file system을 관리하기 위한 block으로,
File system과 관련된 다양한 정보를 저장한다.

→ 전체 inode 개수, 전체 block의 개수, free block의 개수, free inode의 개수, block의 크기, mount 시간 등등

Super block에 문제가 생길 경우 복사본을 사용하여 복구 가능하다.

inode의 구조


File System Mount

Mount

파일 시스템을 디렉토리 계층 구조의 특정 디렉토리와 연결하는것

Mount Point

디렉토리 계층 구조에서 파일 시스템이 연결되는 디렉토리

파일 시스템 Mount 설정 파일

리눅스에서 시스템이 부팅될 때 자동으로 파일 시스템이 마운트되게 하려면 /etc/fstab 파일에 설정

/etc/fstab 파일의 구조
장치명, 마운트포인트, 파일 시스템 종류, 옵션, 덤프 관련 설정, 파일 점검 옵션

UUID

Universally Unique IDentifier, 로컬 시스템과 다른 시스템에서 파일 시스템을 유일하게 구분해주는 128bit 숫자

UUID로 저장된 장치는 /dev/disk/by-uuid 디렉토리에 들어간다.

mount /dev/sdb1 /mnt → /dev/sdb1 이라는 device를 /mnt에 mount

mount -t ext3 /dev/sdb1 / → /dev/sdb1을 root에 ext3 파일시스템으로 mount

mount -t iso9660 /dev/cdrom /mnt/cdrom → cdrom 장치를 /mnt/cdrom에 mount

-t [파일시스템 종류] → 파일 시스템 종류 지정

-o [마운트옵션] → mount 옵션을 지정

-f → mount 할수 있는지 점검만 한다

-r → read-only로 mount

mount 명령으로 출력되는 정보는 /etc/mtab 파일의 내용과 동일하다.

unmount

umount /dev/sdb1 → /dev/sdb1 device를 unmount

-t [파일시스템 종류] → 파일 시스템 종류 지정

USB 메모리 연결

VMWare Player → Player → ‘Removable Devices-Silicon Motion USB Mass Storage Device-Connect(Disconnect from host)’ 를 선택

USB 장치를 host OS에서 분리하여 가상 머신에 연결한다는 메세지 출력

sudo fdisk -l → 장치명 확인 (Device 항목)

mount 실행 → 마지막에 장치가 추가되었는지 확인

unmount [장치명] → 마운트 해제해보기

USB 메모리에 파티션 생성하기

sudo fdisk /dev/sdb

→ Command (m for help): n → 새로운 파티션 생성 → Enter * 3 (default로)
→ Command (m for help): p → 파티션 설정 정보 출력
→ Command (m for help): d → 파티션 제거

sudo mke2fs -t ext4 /dev/sdb1 → 생성한 파티션을 포맷하여 파일 시스템 생성

sudo mount /dev/sdb1 /mnt → USB 마운트

mount 로 확인

USB에 파일 복사

cd /mnt → USB로 이동

장치 연결 해제하기

sudo umount /mnt → USB 제거 → ‘busy’ 라고 뜨면 해당 디렉토리를 누가 사용중

cdsudo umount /mnt → 정상적인 마운트 해제 가능 → USB 제거 가능

디스크 관리

파일 시스템별 디스크 사용량 확인하기

df -Th → 파일시스템 장치명, 전체 용량, 사용량, 남은 용량, %, 마운트포인트

-a → 모든 파일 시스템을 대상으로 디스크 사용량 확인

-k → 디스크 사용량을 KB 단위로 출력

-m → 디스크 사용량을 MB 단위로 출력

-h → 알기 쉬운 단위(GB, MB, KB 등)로 출력

-t [파일시스템] → 파일시스템 종류에 해당하는 디스크 사용량 출력

-T → 파일시스템 종류도 출력

du [directory] → 디렉토리별 디스크 사용량 출력

du -s → 현재 디렉토리의 디스크 사용량 출력

du -s ~user1 → /home/user1 밑의 디렉토리 탐색해서 디스크 사용량 출력

-s → 특정 디렉토리의 전체 사용량 출력

-h → 알기 쉬운 단위(GB, MB, KB 등)로 출력

파일 시스템 검사하고 복구하기

inode, block, 디렉토리, 파일 링크 등을 검사, 필요시 복구 작업도 수행
❗️반드시 unmount된 장치에 대해서만 fsck 사용 ❗️

sudo fsck /dev/sdb1 → /dev/sdb1 검사

sudo fsck.ext4 /dev/sdd3 → 파일 시스템 종류를 지정해 검사

-f → 강제로 점검

-b [Super Block] → Super block으로 지정한 백업 super block 사용

-y → 모든 질문에 yes로 대답하게 한다

-a → 파일 시스템 검사에서 문제 발견시 자동으로 복구

sudo e2fsck /dev/sdd1 → 리눅스의 확장 파일 시스템(ext2, ext3, ext4) 점검

-f → 강제로 점검

-b [Super Block] → Super block으로 지정한 백업 super block 사용

-y → 모든 질문에 yes로 대답하게 한다

-j ext3/ext4 → ext3나 ext4 를 검사할 때 지정

sudo badblocks -v /dev/sdd1 → 장치의 Bad block을 검색

sudo badblocks -v -o bad.out /dev/sdb1 → 장치의 Bad block 검색 결과를 bad.out에 저장

-v → 자세히 출력

-o [출력 파일] → 지정한 출력 파일에 검색한 Bad block 목록 저장

백업 Super Block을 이용해 파일 시스템 복구하기

sudo dumpe2fs → 백업 Super block의 위치 확인

sudo dumpe2fs /dev/sdb1 → 백업 Super block의 정보 출력

sudo dumpe2fs /dev/sdd1 | grep superblock → Super block에 관한 정보만 추출 (위치 확인)

sudo e2fsck -b 8193 -y /dev/sdd1 → 8193 위치에 있는 백업 Super block 이용해 파일시스템 복구

리눅스 시스템의 부팅

부트 로더 단계

  • 바이오스 단계에서 MBR는 부트 로더를 찾아 Memory에 load → 바이오스 : ROM에 있는 프로그램, CPU, Mem, Disk를 체크함
  • 여러 OS 중에서 부팅할 OS를 선택할 수 있도록 메뉴를 제공
  • 리눅스 커널을 메모리에 load
  • 리눅스 커널은 /boot 아래에 ‘vmlinuz-버전명' 의 형태로 제공
  • 리눅스의 대표적인 부트 로더는 GRUB, LILO (ls /boot/vm*)

커널 초기화 단계

  • 시스템에 연결된 Memory, Disk, Keyboard, Mouse 등 장치들을 검사
  • 장치검사 등 기본적인 초기화 과정이 끝나면 커널은 fork 없이 생성되는 process와 thread 생성
    • 이 process들은 메모리 관리 등 커널의 여러가지 동작 수행
    • 이 process들은 일반적인 process와 구분되도록 []로 표시, 주로 PID 번호가 낮게 배정됨

systemd 서비스 단계

  • 우분투에서 systemd 서비스는 기존의 init 스크립트를 대체한 것, 다양한 서비스를 동작
  • 각 서비스 시작 과정은 화면에 출력됨
  • 부트 스플래시 화면이 바로 종료되고 메세지가 출력되는 화면으로 전환

부팅 후 메세지 확인하기

dmesg | more, more /var/log/boot.log → 부팅시 출력된 메세지 확인 가능

1번 Process

init process가 처음 생성된 process로서 PID가 1번

로그인 프롬프트 출력

그래픽 로그인 시스템 GDM(GNOME display manager) 동작, 로그인 프롬프트 출력

systemd 서비스

init Process

스크립트를 순차적으로 실행하여 다른 process를 동작한다.
현재는 systemd로 대체되었다.

init과 관련된 스크립트 파일 : /etc/init.d 디렉토리에 아직 일부 서비스의 스크립트 파일이 남아있다.

Ubuntu의 Run Level (0 ~ 6)

  • 0 : 시스템 종료
  • 1 : 응급 복구 모드 (단일 사용자 모드)
  • 2/3/4 : 다중 사용자 모드
  • 5 : 그래피컬 다중 사용자 모드
  • 6 : 재시작

systemd

  • Socket 기반으로 동작하여 inetd(Super service daemon)와 호환성을 유지
  • Shell과 독립적으로 부팅 가능
  • 마운트 제어 가능
  • fsck 제어 가능
  • 시스템 상태에 대한 snapshot 유지
  • SELinux와 통합 가능
  • 서비스에 signal 전달 가능
  • shutdown 전에 사용자 session의 안전한 종료 가능

systemd unit

  • 전체 시스템을 시작하고 관리하는데 unit이라는 구성 요소를 사용
  • systemd는 관리 대상의 이름을 ‘서비스명.유닛종류’의 형태로 관리
  • 각 유닛은 같은 이름,종류로 구성된 설정 파일과 동일한 이름 사용
  • man systemd.[유닛이름] 으로 자세한 내용 확인

systemctl → 현재 동작중인 unit 목록 출력

sudo systemctl start cron → cron unit을 시작한 후 systemctl is-active cron → active

systemctl status cron → cron.service의 상태 출력

systemctl start atd.service → atd.service 시작

sudo systemctl stop cron → cron.unit을 정지한 후 systemctl status cron → inactive (dead)

-a → 상태와 관계없이 unit 전체를 출력

-t [unit종류] → 지정한 종류의 unit만 출력

start → unit을 시작

stop → unit을 정지

reload → unit의 설정파일을 다시 읽어옴

restart → unit restart

status → unit 상태 출력

q → 출력 목록에서 다시 prompt로 나오기

enable → 부팅 시 unit이 시작하도록 설정

disable → 부팅 시 unit이 시작하지 않도록 설정

is-active → unit이 동작하고 있는지 확인

is-enabled → unit이 시작되었는지 확인

isolate → 지정한 unit 및 이와 관련된 unit만 start, 나머지는 stop

kill → unit에 signal 전송

systemd의 Run Level (0 ~ 6)

runlevel 로 현재 Run Level을 확인할 수 있다.

Run Leveltarget 파일 (Symbolic Link)target 원본 파일
0runlevel0.targetpoweroff.target
1, Srunlevel1.targetrescue.target
2runlevel2.targetmulti-user.target
3runlevel3.targetmulti-user.target
4runlevel4.targetmulti-user.target
5runlevel5.targetgraphical.target
6runlevel6.targetreboot.target

부팅할 때 동작할 기본 Run Level → 기본 target 지정하기

systemctl set-default [target name].target → /etc/systemd/system 아래의 symbolic link인 default.target이 가리키는 target 파일 변경

sudo systemctl set-default multi-user.target → 현재 target인 graphical.target(Run Level 5) 에서 multi-user.target(Run Level 3)로 변경

target 변경하기

systemctl isolate multi-user → multi-user.target(Run Level 3)로 변경

systemctl isolate runlevel3 → multi-user.target(Run Level 3)로 변경

systemctl isolate graphical → graphical.target(Run Level 5)로 변경

systemctl isolate runlevel5 → graphical.target(Run Level 5)로 변경

set-default를 사용하는게 더 일반적이긴 함

telinit, init 으로도 변경 가능하긴 함

단일 사용자 모드(Run Level 1)로 변경하기

systemctl isolate rescue → rescue.target(Run Level 1)로 변경

systemctl isolate runlevel1 → rescue.target(Run Level 1)로 변경

init 1 → rescue.target(Run Level 1)로 변경

telinit S → rescue.target(Run Level 1)로 변경

Linux System의 종료

sudo shutdown -r +3 "System is going down" → 3분 뒤 reboot, 해당 메세지 출력

sudo shutdown -h now → 현재 시간, 시스템 즉시 종료

sudo shutdown -c → shutdown 명령 취소

sudo shutdown -k 2 → 사용자들에게 2분 후 shutdown 된다는 메세지 전달만 함

-k → 실제로 시스템을 종료하지 않고 사용자들에게 메세지만 전달

-r → 종료 후 재시작

-h → 종료, halt나 power-off 상태로 이동

-c → 이전에 했던 shutdown 명령 취소

[time] → 종료할 시간 (hh:mm, +mm, now)

[message] → 모든 사용자에게 보낼 메세지

Run Level 변경하여 종료, 재시작

sudo init 0 → 시스템 종료

sudo init 6 → 시스템 재시작

systemctl isolate poweroff.target → 시스템 종료

systemctl isolate renlevel0.target → 시스템 종료

systemctl isolate reboot.target → 시스템 재시작

systemctl isolate runlevel6.target → 시스템 재시작

reboot, halt, poweroff → /var/log/wtmp 파일에 시스템 종료 기록을 남기고 종료, 재시작

-n → 종료, 재시작 전에 sync(메모리의 내용을 disk에 모두 쓰는것) 호출 안함

-w → 실제로 재시작, 종료 안함, wtmp 파일에 기록은 남김

-d → wtmp 파일에 기록을 남기지 않음

-f → 강제로 명령 실행, shutdown 호출 안함

-p → 시스템의 전원을 끔

Daemon Process

Linux의 background에서 동작하면서 각종 서비스를 제공한다.

Daemon의 동작 방식

  • 독자형(standalone)
    • 시스템의 background에서 서비스별로 항상 동작
    • 자주 호출되는 daemon이 아니라면 시스템 자원을 낭비할 우려…
  • Super daemon에 의한 동작 방식
    • 평소에는 super daemon만 동작, 서비스 요청이 오면 super daemon이 해당 daemon을 동작시킴
    • 서비스 응답에 시간이 약간 더 걸릴 수 있지만 자원을 효율적으로 사용

Super Daemon

Unix에서 super daemon의 이름 : inetd

💁‍ Ubuntu에서는 보안 기능이 포함된 xinetd 사용

Daemon의 조상 : systemd와 kernel thread daemon

◽️ systemd daemon 확인 : pstree

◽️ Kernel thread daemon 확인 : ps 명령으로 확인했을때 []로 둘러싸여 있는 process들

sshd daemon

원격 보안 접속 서비스 제공(ssh)

Bootloader - GRUB

GRUB(GRand Unified Bootloader)을 주로 사용한다.

LILO보다 설정과 사용이 편리한다.

부팅시 명령을 사용하여 수정이 가능하고,
멀티 부팅 기능을 지원한다.

💁‍ Ubuntu 기본 bootloader : GRUB2

/etc/grub.d 디렉토리 : GRUB 스크립트를 가지고 있으며, GRUB 명령이 실행될 때 grub.cfg 파일생성됨

/etc/default/grub 파일 : GRUB 메뉴 설정 내용이 저장됨

암호 복구하기

1. 시스템 재시작하기

  • 부팅할 때 GRUB 메뉴 초기화면
  • 빨리 넘어가버리니까 ↑↓ 이용해 찾아가기

2. GRUB 편집 모드로 전환하기

  • GRUB Boot Menu가 출력될때 재빨리 e를 눌러 편집 모드로 전환

3. 단일 사용자 모드로 수정하기

  • 리눅스 커널 정보가 있는 행에서 ro quiet splash $vt_handoffrw init=/bin/bash로 수정

4. F10을 눌러 재시작 → root 계정으로 동작

5. 재부팅하기

  • reboot -f 명령으로 시스템을 재시작했을 때 GRUB 화면 출력
  • 이 상태에서 Enter키를 눌러 Ubuntu 부팅

복구 모드로 부팅하기

어떤 이유든 Ubuntu가 부팅되지 않는다면 복구 모드로 부팅하는 것이 유용하다.

복구 모드 : root 계정으로 로그인하여 시스템의 복구에 필요한 작업 수행가능

1. 시스템 재시작하기

  • 부팅할 때 GRUB 메뉴 초기화면
  • 빨리 넘어가버리니까 ↑↓ 이용해 찾아가기

2. 복구 모드 선택하기

  • GRUB 메뉴 초기 화면 → Ubuntu용 고급 설정 → recovery mode 선택

3. root 항목 선택하기

4. root로 로그인하기

5. 다시 마운트하기

  • root 파일 시스템이 read-only로 마운트되었으므로 read, write가 가능하도록
  • $ mount -o remount,rw /

6. 재시작하기

  • reboot -f
profile
밀린 TIL 업로드 조금씩 정리중...

0개의 댓글