리눅스의 파일 권한

일반 파일 권한

  • 모든 파일과 디렉터리는 접근 권한과 소유권이 부여됨
  • 사용자별 권한은 기호 모드(symbloic)와 8진수 숫자 모드(numeric)로 표시
  • ls -al 결과 표시 내용: 파일 유형 + 접근 권한, 물리적 파일 연결개수(하드링크), 소유자, 소유 그룹, 크기, 마지막 변경 날짜+시간, 파일명
  • 디렉토리의 x 권한: 해당 디렉터리 안에서 작업이 가능하다는 의미

 

리눅스 파일의 특수 권한

  • 프로세스가 실행되는 동안 해당 프로세스의 root 권한을 임시로 가져오는 기능
  • 프로세스가 사용자보다 높은 수준의 접근을 요구할 때 접근 제한 때문에 원활한 기능을 제공할 수 없기 때문에 이를 해결하기 위함
  • SetUID: 사용자가 소유할 때만 소유자 권한으로 파일을 실행 시킴
  • SetGID: 소유자 그룹 권한으로 실행
  • s(실행파일), S(일반 파일)
  • 예시: 일반 계정의 비밀번호를 변경할 경우, root 권한으로 /etc/passwd 파일 접근

 

Sticky Bit

  • 주로 공용 디렉터리를 사용할 때 사용
  • 폴더에 대하여 소유자 혹은 root만 파일을 수정하거나 삭제 가능
chmod +t tmp
ls -al
> drwxrwxr-t root root 4096 tmp

 

디스크 쿼터(Disk Quota)

  • 파일 시스템마다 사용자나 그룹이 생성할 수 있는 파일의 용량 및 개수를 제한하는 것
  • 주로 block 단위의 용량 제한과 inode의 개수를 제한함
  • 쿼터는 사용자별, 파일 시스템별로 동작함
  • 디스크 쿼터 설정 파일 및 관련 명령어
    • quotaoff: 쿼터 서비스 비활성화
    • qoutaon: 활성화
    • quotacheck: 파일시스템의 디스크 사용 상태 점검
    • edquota: 편집기를 이용한 사용자/그룹 쿼터 설정
    • setquota: 명령어를 이용한 사용자/그룹 쿼터 설정

 


권한 및 그룹 설정 명령어

chown

  • 사용자(그룹) 소유권 변경
  • -R 옵션: 하위 디렉터리도 동일하게 변경(소유권의 상속)
chown root:root test.txt
chown root  test.txt  # 소유자
chown :root test.txt  # 소유 그룹

 

chgrp

  • 소유 그룹 변경
  • chgrp <옵션> [그룹명] [파일명]
  • -R: 하위 디렉터리 포함

 

chmod

  • 접근 권한 변경
  • chmod <옵션> [권한] [파일명]
  • -R: 하위 디렉터리 포함
chmod +x file  # 모든 유저에게 실행 권한 추가
chmod -x file
chmod u+x file  # 소유자에게 실행 권한 추가
chmod g=rx file  # 그룹에 read, write권한 추가
chmod o-x file  # 기타 다른 사람들은 실행할 수 없도록 설정
chmod a+r file
chmod 766 file  # rwx를 이진수로 계산한 것

 

unmask

  • 파일/디렉터리 생성 시 기본으로 적용할 접근 권한을 지정
  • 파일은 (666 - umask값), 디렉터리는 (777 - umask) 값으로 설정됨
  • umask <옵션>[설정값]
  • -S: 문자로 표시
umask  # 기존값 조회
umask 002  # umask값 설정

 


파일 시스템의 관리

파일 시스템의 개요

  • 파일 시스템이란? 스토리지 장치(디스크) 상에 파일을 관리할 수 있도록 만들어 놓은 구조 혹은 관리 방식
  • 최근에는 서버 파일과 가상 파일까지 접근할 수 있도록 개념이 확대됨

  • 슈퍼 블록: 파일 시스템 관련 정보(블록 크기 및 개수, inode 개수)
  • Group Descriptor: 각 블록 그룹을 관리하는 정보를 저장
  • Block Bitmap: 블록의 사용 상태를 나타냄
  • inode: 파일 이름을 제외한 정보(고유 번호, 파일 형태, 크기, 위치, 소유자 등)
    • inode bitmap: inode의 상태 정보
    • inode table: 각 inode에 대한 정보를 나타내는 descriptor로 구성

 

파일 시스템의 종류

저널링이란?
- 로그와 유사한 개념
- 특정 정보 관리를 통해 파일 시스템에 문제가 생길 경우 복구 진행

1. 저널링 파일 시스템

2. 네트워크 파일 시스템

 

3. 지원 가능한 기타 파일 시스템

 


파일 시스템 관련 명령어

/etc/fstab 파일
- 파일 시스템 정보 저장 및 관리하는 설정 파일
- 부팅 시 마운트 정보 포함

mount

  • 스토리지 장치를 연결하여 디렉토리처럼 사용
  • 설정 파일: /etc/fstab(부팅 시 참조하여 마운트), /etc/mtab(마운트된 블록 시스템 정보)
  • mount <옵션> [장치명] [디렉터리명]

 

unmount

  • 마운트 해제
  • unmount <옵션> [장치명] [디렉터리명]

 

eject

  • 미디어 장치를 해제하고 장치를 제거
  • eject <옵션> [디바이스명]

 

fdisk

  • 새로운 파티션의 생성, 기존 파티션의 삭제, 파티션의 타입 결정
  • 한 번에 한 디스크에 대해서만 작업을 수행
  • fdisk <옵션> [디바이스명]
  • fdisk를 실행하기 위해서는 어떤 디스크의 파티션을 나눌 것인지 지정 필요

 

mkfs

  • 파일 시스템 생성
  • 파티션 생성 뒤 원하는 파일 시스템 구축 필요
  • mkfs <옵션> [디바이스명]

 

mkfs2

  • ext2, 3, 4 리눅스 파일 시스템 생성
  • mkfs2 <옵션> [디바이스명]

 

 

fsck

  • 파일 시스템 점검 및 복구
  • /lost+found 디렉터리에 손상된 파일 관리 → 정상 복구된 후 삭제됨
  • fsck <옵션> [디바이스명]

 

 

e2fsck

  • ext2, 3, 4 리눅스 파일 시스템 점검 및 복구
  • e2fsck <옵션> [디바이스명]

 

du(disk use)

  • 디렉터리 별 디스크 사용량 확인
  • du <옵션> [디바이스명]

 

df

  • 시스템에 마운트된 하드 디스크의 남은 용량을 확인
  • 파티션 단위로 사용량 확인
  • 기본 1024bte 블록 단위로 출력
  • df <옵션> [디바이스명]

 


References

네트워크 관련 명령어

ping

  • 외부 호스트와 IP 통신이 가능한지 확인
  • ping <옵션> [P 주소/도메인명]

 

traceroute

  • 목적지 호스트까지의 경로 표시
  • 목적지까지의 패킷 전송 지역을 측정하거나 경로 상에 어떤 장애가 있는 경우 위치를 파악
  • traceroute [IP주소/도메인명]

 

nslookup

  • 도메인명으로 IP주소를 조회하거나 IP 주소로 도메인명을 조회
  • nslookup <옵션> [도메인명]
  • 옵션: -type=레코드 타입

 

dig(domain information groper)

  • 호스트명에 대한 IP 주소 정보 또는 IP 주소에 대한 호스트명을 조회
  • 서버명은 확인하고자 할 네임 서버를 지정하는 것
  • 지정하지 않을 경우 /etc/resolv에 등록된 네임서버를 이용하여 루트 서버를 조회함
  • dig [서버명] [도메인명] [타입]

 

host

  • 호스트명과 IP 주소 중 하나를 모를 때 사용
  • 호스트명을 이용하면 IP주소 뿐 아니라 하위 호스트명도 조회 가능
  • 호스트는 시스템에 등록된 DNS 서버를 이용하여 검색함. 별도 DNS 서버 지정도 가능
  • host <옵션> [도메인명/IP주소] <DNS서버>

 

hostname

  • 시스템(호스트) 이름 확인 및 변경
  • 해당 명령어로 설정한 경우에는 리부트 시 사라짐
  • 영구적으로 유지하기 위해서는 /etc/sysconfig/network에 HOSTNAME 설정
  • hostname <옵션> [파일명]

 


시스템 종료 명령어

shutdown

  • 시스템을 종료 혹은 재부팅
  • sync를 수행하여 저장되지 않은 데이터를 디스크에 저장하고 모든 파일 시스템을 mount한 후 종료
  • root 계정만이 사용 가능
  • shutdown <옵션> [시간] <메세지>

shutdown -h now  # 즉시 종료
shutdown -r 10:00  # 10시에 재부팅

 

init

  • shutdown과 동일한 기능
  • 런레벨을 이용한 shutdown 수행(런레벨: 0~6)
  • init [런레벨]

 

reboot

  • 시스템 재부팅
  • reboot <옵션>
  • -f: 강제 재부팅

 

halt

  • 시스템 종료
  • half <옵션>
  • -f: 강제 종료

 


기타 유틸리티 명령어

cal(calender)

  • 시스템에 설정된 달력을 출력
  • 옵션 없이 실행하면 현재 날짜로 기록된 달을 출력
  • cal <옵션> [날짜]
  • -i: 1월 1일 이후 날짜 수
    -y: 올해 달력 표시

 

date

  • 시스템 날짜 표시 혹은 변경
  • date <옵션> [날짜]

 

clear

  • 터미널의 내용을 지움

 

tty

  • 현재 사용하고 있는 단말기 장치의 경로명과 파일명을 표시
  • 보통 텔넷 등에서 동일한 계정으로 여러 개 로그인한 경우 확인 시 유용함
$ tty
> /dev/pts/0

 

time

  • 특정 프로그램 수행에 소요된 시간을 측정하여 출력
  • 쉘 스크립트 간단 성능 체크에 유용함

 

wall

  • 로그인한 모든 사용자에게 메세지 전송
  • wall [메세지]

 

write

  • 특정 사용자에게 메세지 전송
  • write [계정명] <터미널 이름> ⇒ 메세지 입력 후 Ctrl+D

 

mesg

  • write로 들어오는 메세지 수신 여부 확인 및 제어
  • mesg [y|n]

 


References

디렉터리 관련 명령어

pwd

  • 현재 작업 디렉터리명 표시

cd(change directory)

  • 디렉토리를 이동할 때 사용

mkdir(make directory)

  • 새로운 디렉터리를 생성
  • mkdir <-옵션> [디렉터리명]

rmdir(remove directory)

  • 디렉터리 삭제
  • 내부에 파일이 존재하는 경우 삭제 불가능
  • rmdir [디렉터리명]

 


파일 관리 관련 명령어

ls

  • 특정 디렉터리의 파일 목록 조회
  • ls <-옵션> [경로명]

 

cp

  • 파일 또는 디렉터리 복사
  • cp <-옵션> [원본파일/디렉터리] [대상파일/디렉터리]

 

rm

  • 파일 또는 디렉터리 삭제
  • rm <-옵션> [파일/디렉터리명]

 

mv

  • 파일 또는 디렉터리 이동하거나 파일명을 변경
  • mv <-옵션> [원본파일/디렉터리] [대상파일/디렉터리]

 

touch

  • 크기가 0바이트인 빈 파일을 생성 혹은 파일의 시간(time stamp) 변경
  • touch <-옵션> [파일명]

 

file

  • 파일의 종류 및 파일의 속성값을 표시

file <-옵션> [파일명]
$ file hi.txt
> hi.txt: ASCII text
$ file -i hi.txt
> hi.txt:text/plain;charset=us-ascii
$ file -b hi.txt
ASCII text

 

find

  • 지정된 조건에 따라 파일을 검색(지정한 경로 및 하위 경로를 대상으로 검색)
  • find [경로] <-옵션> <정규표현식> [파일명]

 

locate

  • 파일의 위치 검색
  • locate [파일명]

파일 출력 관련 명령어

cat

  • 파일의 내용을 출력
  • cat <-옵션> [파일명]

 

head

  • 파일의 앞 부분만 출력
  • head <-옵션> [파일명]
  • -c: 지정 숫자의 바이트만큼 출력
    -n: 지정 줄 수만큼 출력(기본 10줄)

 

tail

  • 파일의 마지막 부분만 출력
  • tail <-옵션> [파일명]

 

more

  • 화면 단위로 파일의 내용을 출력
  • 위에서 아래 방향으로만 출력되기 때문에 지나간 내용을 다시 볼 수는 없음
  • more <-옵션> [파일명]
  • 옵션: -숫자 (페이지 당 표시할 줄 수)

 

less

  • 텍스트 파일을 한 화면씩 표시
  • more와 다르게 커서를 이동할 수 있음

 

wc

  • 파일의 라인 수, 단어 수, 알파벳 수 표시
  • wc <-옵션> [파일명]

 

grep

  • 특정 문자열 패턴, 정규식을 이용하여 단어를 검색
  • grep <-옵션> [문자열] [파일명]

grep '"[AB]' sample.txt  # A 혹은 B로 시작하는 모든 라인
grep 'fine$' sample.txt  # fine으로 끝나는 모든 라인

 

 

sort

  • 명령어 결과나 문서 내용을 정렬
  • sort <-옵션> [파일명]

 

cut

  • 파일에서 구분자를 이용하여 특정 필드를 추출

cut <-옵션> [파일명]
$ cut -c 1-5 /etc/httpd/conf/httpd.conf | grep '^[a-z|A-Z]'  # 1~5 범위만 출력
> Serve
> Liste
> Inclu
> User
> Group

 

split

  • 하나의 파일을 여러 개의 파일로 분리하여 저장
  • split <-옵션> [파일명]
  • -b: 바이트 단위로 분할
    -l: 라인 단위로 분할

파일 비교 명령어

diff

  • 두 개의 파일을 행 단위로 비교하여 다른 부분을 출력
  • diff <-옵션> [파일/디렉터리명1] [파일/디렉터리명2]

 

cmp

  • 두 개의 파일을 바이트(문자) 단위로 비교하여 출력
  • cmp <-옵션> [파일명1] [파일명2]

 

comm

  • 두 개의 파일을 라인 단위로 비교하여 출력
  • comm <-옵션> [파일명1] [파일명2]


리다이렉션과 정규 표현식

리다이렉션(redirection)

  • 표준 입력 장치(키보드), 표준 출력 장치(모니터), 표준 에러 장치(모니터)
  • 이러한 표준 입력과 표준 출력의 방향을 재지정하는 것
  • ls -al > out.txt

 

파이프(pipe)

  • 둘 이상의 명령을 함께 묶어 현재 명령의 표준 출력을 다음 명령의 표준 입력으로 사용하는 것
  • 명령어와 명령어의 연결은 ‘|’ 기호를 사용
  • 더 이상 처리할 명령어가 없으면 결과를 화면으로 출력

 

정규 표현식

  • 특정한 규칙을 갖는 문자열의 집합을 표현

 


References

사용자 관련 정리

사용자 설정 관련 환경 구성 파일

  • /etc/default/useradd
    • 사용자 추가 시 기본 설정 정보로 활용
    • vi 편집기나 -D 옵션으로 변경 가능
    $ cat /etc/default/useradd
    > GROUP=100
    > HOME=/home
    INACTIVE=-1
    SHELL=/bin/bash
    SKEL=/etc/skel  # 사용자 홈 디렉터리로 복사될 초기 환경 설정 파일이 저장된 디렉터리
    
  • /etc/passwd
    • 사용자 계정 정보를 담고 있으며 리눅스 로그인 시 사용됨
    • 비밀번호 뿐 아니라 여러 필드가 콜론(:)으로 구분됨
    • username:password:uid:gid:comment:home-directory:shell
    • 패스워드 필드는 “x”로 표시되며 pwconv ↔pwunconv로 설정 가능
  • /etc/shadow
    • 패스워드 정보가 암호화되어 저장
    • username:password:lastchange:mindays:maxdays:warndays:inactive:expire:flag
    • mindays: 비밀번호 변경 후 재설정 가능한 최소 기간
    • inactive: 비밀번호 만료 후 계정 사용 불가능까지 유예 기간
  • etc/login.defs
    • 사용자 계정 설정 시 기본값
    • 새로운 계정을 생성할 때 반드시 참조하는 파일임

 

useradd, adduser

  • 사용자 계정과 관련 정보를 생성
  • 기본 홈 디렉터리: /home/계정명
  • 계정 정보 파일: /etc/passwd, /etc/shadow, /etc/group
  • useradd <-옵션> [계정명]

 

passwd

  • 계정의 패스워드 입력 및 변경
  • /etc/shadow 파일에 패스워드 변경 및 저장
  • passwd <-옵션> [계정명]

 

su(switch user)

  • 로그아웃 없이 다른 사용자의 계정으로 로그인하여 해당 사용자의 권한을 획득
  • su <옵션> [계정명] <쉘변수>

 

usermod

  • 사용자 홈 디렉터리, 그룹, 유효 기간, 쉘 정보를 변경
  • usermod <-옵션> [계정명]

 

userdel

  • 사용자 계정 정보 삭제
  • /etc/passwd, shadow, group에서 사용자 정보 삭제
  • usermod <-옵션> [계정명]
  • -r: 사용자의 메일 파일과 홈 디렉터리 모두 삭제

 

chage

  • 패스워드 만료 정보를 변경
  • change <-옵션> [명령어]

 


그룹 관련 정리

그룹 설정 관련 환경 구성 파일

  • /etc/group
    • 사용자 그룹에 대해 정의
    • 모든 계정은 한 개 이상의 그룹에 포함되어 있음
    • 해당 파일을 이용하여 계정자의 그룹 정보를 직접 변경 가능
    • groupname:password:gid:users
    • users: 콤마(,)로 구분된 사용자 계정 나열
  • /etc/gshadow
    • 그룹의 패스워드를 MD5로 암호화하여 저장
    • 그룹의 소유주, 구성원 설정 가능
    • groupname:password:owner:users
    • password: !이면 암호가 없는 상태
    • users: 콤마(,)로 구분된 사용자 계정 나열

 

groupadd

  • 새로운 그룹 생성
  • group add <-옵션> [그룹명]
  • -g: GID 지정
    -r: 시스템 그룹 시 500번 이하의 값 중 가장 높은 범위를 할당

 

groupdel

  • 기존 그룹 삭제
  • 소속된 유저가 있을 경우 삭제 불가능
  • groupdel [그룹명]

 

groupmod

  • 그룹 설정 변경
  • groupmod <-옵션> [그룹명]
  • -g: GID 변경
    -n: 새로운 그룹명 설정

 


접속 정보 조회 정리

users

  • 시스템에 로그인한 사용자 정보를 출력
  • users <-옵션>

 

who

  • 현재 시스템에 접속해 있는 사용자들을 조회
  • 사용자 계정명, 터미널 정보, 접속 시간 등 확인 가능
  • 관리자 root와 일반 사용자 모두 사용 가능
  • who am i 혹은 whoami로 자신의 정보 조회 가능
  • who <-옵션>

 

w

  • 현재 접속 중인 사용자들의 정보를 나타냄
  • 현재 서버 시간, 부팅 후 작동 시간, 접속자 수, 접속자별 평균 부하율, 접속자별 계정명, TTY 이름, 로그인 시간 등
  • JDPU: TTY 장치명에서 사용되는 모든 프로세스의 CPU 사용 시간
  • PCPU: 해당 프로세스 결과값에서 WHAT 필드에 표시된 프로세스에서 사용하는 CPU 총 시간

 

id

  • uid, gid, group 정보 표시

id <-옵션> [계정명]
$ uid=0(root) gid=0(rooT) groups=0(root)

 

groups

  • 계정이 속한 그룹 목록을 확인
  • groups [계정명]

 


References

환경변수 PATH 개념

  • 명령어(프로그램)이 위치한 경로를 찾는 순서 지정
  • 해당 환경 변수에 지정된 디렉터리를 순서대로 탐색하여 명령어를 찾고 실행함
  • 각 경로는 콜론(:)으로 구분
echo $PATH
export PATH = [설정값:설정값:...]
$ export PATH = $PATH:/var/myfile

 

기본 명령어

which

  • PATH 환경변수의 경로에 따라 사용자가 실행할 명령어의 위치 혹은 alias를 표시
  • PATH에 검색 대상 명령어가 설정되어 있지 않은 경우 찾을 수 없음
which [명령어]
$ which bash
> /usr/bin/bash

 

alias/unalias

  • alias: 지주 사용하는 명령어를 특정 문자로 입력해두고 대신 사용
  • unalias: alias 기능을 해제함
alias [별명='명령어']
$ alias showa='ls -al'

unalis [옵션] [단축명령어]
$ unalias showall
$ unalias -a  # 모든 별칭 삭제

 

whereis

  • 대상 명령어의 절대 경로, 소스 파일, 설정 파일, 매뉴얼 등 정보를 찾아 출력

where is <-옵션> [명령어]
$ whereis find
> find: /usr/bin/find /usr/share/man/man1/find.gz

 

man

  • 리눅스에서 사용하는 명령어들의 메뉴얼을 제공

man [섹션] <-옵션> [명령어]
$ man find

 

info

  • 리눅스 명령어의 사용 방법, 옵션 등을 나타냄
  • man에 비해 제공되는 명령어가 한정적임
  • info [명령어]

 

whatis

  • 명령어의 기능을 간략하게 표시
  • whatis 데이터베이스에서 키워드가 완전히 일치하면 해당 명령어의 기능을 표시
  • whatis [명령어]

 

manpath

  • man 명령이 참조하는 메뉴얼의 경로 표시
  • manpath [명령어]

 

apropos

  • 명령어 메뉴얼에서 지정한 키워드를 포함된 것을 검색
  • whatis DB를 참조하여 해당 문자열을 포함한 것을 검색하여 표시
  • whatis DB가 만들어져 있어야 사용 가능한 명령어임
apropos [문자열]
$ apropos find
> ffs(3)   - find first bit set in a word
> ffsl(3)  - find ...
> tfind(3) - manage a binary tree

 


References

리눅스 개요

리눅스의 특징

  • 오픈소스 소프트웨어
  • 멀티유저, 멀티태스킹 지원
  • 다중 스레드 지원
  • 다양한 파일 시스템 지원

 

장단점

  • 장점
    • POSIX(Portable Operation System Interface) 표준 기반으로 유닉스와 호환 가능
    • 안정적인 동작
    • swap 방식을 통한 효율적인 하드웨어 활용
  • 단점(최근에는 많이 보완됨)
    • 오픈소스로 기술 지원의 한계 존재
    • 보안 상 취약점 노출 가능성
    • 한글 지원 미흡

 

배포판의 종류와 특징

💡 리눅스 배포판이란?
리눅스 커널, GNU 소프트웨어, 응용 프로그램 등을 함께 묶어서 구성한 리눅스 OS. 목적에 따라 다양한 배포판이 존재함
  • 슬랙웨어 리눅스: 1992년에 등장하여 가장 먼저 대중화
  • 데비안: GNU의 공식 후원을 받는 유일한 배포판
  • 우분투: 데비안 GNU/리눅스에 기초. 사용자 편의성에 초점을 맞춤
  • 레드햇
    • RHEL(기업용): subscript 형태로 요금을 지불
    • 페도라: 레드햇과 커뮤니티의 지원으로 개발
  • CentOS: RHEL과 완벽하게 호환, 무료 기업용 OS
  • 수세(Suse): 독일에서 출시된 배포판으로 유럽에서 인기

 

리눅스의 역사

  1. 켄 톰슨: 유닉스 개발(어셈블리 언어 기반, 호환성 이슈 존재)
  2. 데니스 리치: UNIX를 C언어로 재개발. 이후 BSD 계열과 시스템 V 계열로 분리
  3. 리처드 스톨먼: 시스템 V측의 소스 코드 비공개 및 상업적 이용 제한에 반발하여 GNU 프로젝트 시작
  4. 앤드류 타넨바움: 미닉스 개발(오픈소스)
  5. 리눅스 토발즈: 미닉스의 커널 소스를 수정하여 GNU 시스템에 적합한 커널을 제작(+유닉스와 호환)

 

디렉터리 종류와 특징

💡/bin vs /usr/bin
- /bin: 시스템 부팅 및 복구에 필요한 최소한의 필수 명령어 저장 (ex: ls, cp, mv, cat, sh, mkdir)
- /usr/bin: 부팅 후 일반 작업에 필요한 다양한 명령어 저장 (ex: vim, python, gcc, tar, curl)

 

 


리눅스 설치

리눅스 설치 개요

  • 리눅스의 종류가 다양하고, 배포판마다 설치 환경 및 과정이 다름
  • 설치 유형은 데스크탑형, 서버형, 사용자 정의형(취향에 따라 설치)으로 구분됨
  • 하드디스크 재구성이 진행되기 때문에 백업 필수
  • 부팅 드라이브를 다시 파티션하는 경우라면 os의 부트 로더를 다시 설치해야 할 수 있음

 

파티션

💡 파티션이란?
- 하나의 물리적 디스크를 여러 개의 논리적인 디스크로 분할하는 것
- 각 파티션마다 독립적인 파일 시스템을 만들 수 있음 → 관리 효율성 증가(부팅 시간, 오류 점검, 백업/복구 시간 단축)
- 시스템 손상 시 영향 최소화

 

디스크와 장치명

  • 파티션 이름: 디스크의 장치 파일명 + 숫자
  • /dev/hda3 → /dev + /hd + 3
    • /dev: 시스템 디바이스 파일들이 저장되는 디렉터리
    • /hd: IDE 혹은 ATA 방식 /sd: SCSI 혹은 USB 방식
    • a: 하나의 케이블에 연결된 디스크의 우선순위
    • 3: 파티션 번호
  • 마운트 시 지정된 장치명을 사용(ex: /dev/hda)

 

파일 시스템

  • 파일 시스템은 디스크의 파티션에 파일을 사용할 수 있도록 구성해놓은 것 또는 구성 방식
  • 리눅스는 고유 파일 시스템 뿐 아니라 다양한 파일 시스템을 지원하고 있음
  • 파일 시스템의 종류
    • 리눅스 전용(ext1~4)
    • 저널링 파일 시스템(JFS, XFS): 파일 시스템에 오류가 생기더라도 복구가 가능하도록 만든 것
    • 네트워크 파일 시스템(SMB, NFS): 다른 pc에 있는 파일 시스템을 내 것처럼 쓸 수 있도록 함
    • 클러스터링 파일 시스템(GFS)
    • 장치 파일 시스템(IS9660, UDF)
    • OS별 파일 시스템(윈도우: FAT32, NFTS/NET OS: HPFS)

 

LVM(Logical Volume Manager)

 

  • 작은 용량의 하드디스크 여러 개를 큰 용량의 하나의 하드디스크처럼 사용
  • 다수 개의 디스크를 묶어 사용함으로써 파티션의 크기를 유연하게 조절할 수 있음
  • LVM 구성 볼륨의 종류
    • 물리 볼륨: 개별 물리적인 디스크
    • 볼륨 그룹: 여러 개의 물리 볼륨을 하나의 그룹으로 구성
    • 논리 볼륨: 볼륨 그룹의 일부를 논리 그룹으로 나누어 사용

 

RAID(Redundant Array of Independent Disks: 복수 배열 독립 디스크)

 💡 LVM vs RAID
- LVM은 단순히 용량을 늘리는 것이 목적
- RAID는 시스템 에러 발생 시 가용성을 보장하는 것이 목적(안정성)
  • 여러 개의 물리적 디스크를 하나의 논리적 디스크로 인식하여 작동하게 하는 기술
  • 특징: 데이터 분할 저장, 데이터 중복 저장, 오류 관리 → 고용량, 신뢰성, 성능 향상
  • RAID의 종류
    • 하드웨어 RAID: 하드웨어 제작 업체에서 장비 자체를 여러 디스크를 꽂을 수 있도록 구성. 안정적
    • 소프트웨어 RAID: 하드웨어보다 저렴하지만 안정성은 떨어짐
  • 구성(데이터 저장) 방식에 따라 레벨을 붙임. 숫자가 클수록 신뢰성이 높거나 성능이 향상됐음을 의미
    • RAID 0(스트라이핑 방식): 여러 디스크에 데이터를 나눠 저장 → 고용량, 빠른 I/O but 고장에 취약
    • RAID 1(미러링 방식): 디스크에 중복 데이터 저장 → 결함 허용 but 저장 공간 2배 필요
    • RAID 0 + 1: 스트라이핑 후 미러링 → 빠른 I/O but 느린 복구 시간
    • RAID 1 + 0: 미러링 후 스트라이핑 → 손실된 데이터의 빠른 복원

 

fdisk

  • fdisk란 파티션 테이블을 관리하는 명령어
  • 리눅스의 디스크 파티션을 생성, 수정, 삭제할 수 있는 일종의 유틸리티
  • fdisk [장치명] 입력 후 명령어 입력

 

 

부트 로더(Bootstrap Loader) = 부트 매니저

  • 컴퓨터를 사용자가 사용할 수 있도록 디스크에 저장된 OS를 주기억장치로 적재해주는 프로그램
  • 필요한 초기 작업, OS(멀티부팅)을 주 메모리로 복사, 운영체제 실행 등의 기능을 수행
  • 부트 로더의 저장 위치
    • MBR(Master Boot Record): 하드디스크의 첫 번째 섹터로, 디스크 전체에 1개만 존재함. 512Byte의 크기로, 파티션 테이블 정보를 저장함. 어느 파티션을 부팅할지 설정하고 해당 섹터로 점프하는 역할
    • 각 주 파티션의 부트 섹터: 해당 파티션의 첫 번째 섹터(부트 섹터). os 커널을 메모리에 로드하는 역할
  • 임베디드 시스템 부트로더: PC BIOS와 OS Loader 기능을 수행하는 프로그램으로, 시스템 부팅 시 가장 먼저 수행됨

 

부트로더의 종류

  • LILO(Linux Loader): 리눅스 전용
  • GRUB2(Grand Unified Bootloader version2)
    • 리눅스 뿐 아니라 다른 os에서도 사용 가능
    • 편리한 설정 및 사용, 대화형 UI 가능
    • 부팅 시 부트 정보 수정. 멀티 부팅 지원
    • 파일 시스템과 커널 실행 형식 인식 후 부팅

 

런레벨

  • 리눅스 시스템 부팅 시 어떤 서비스를 자동으로 시작할지 결정하는 단계
  • 0~6개까지 7개의 단계가 존재하며, /etc/inittab 파일에서 설정 가능([런레벨]:[행동]:[명령어] 형식)
  • 주로 3, 5레벨이 많이 사용됨

 

 

로그인과 로그아웃

  • 로그인
    • 리눅스는 X윈도우 상에서 로그인/로그아웃과 콘솔상에서의 로그인/로그아웃이 있음
    • 로그인 과정
      1. 패스워드 확인 → 입력한 패스워드와 /etc/passwd 필드 비교
      2. 쉘 설정 파일 실행 → PATH 경로, 터미널 설정, 환경변수, 로그인 시 실행 명령, 로그인 메세지 출력
      3. 로그인 쉘 실행: /etc/passwd의 마지막 필드에 지정되어 있음
    • 로그인 메세지 설정 파일
      • /etc/issue: 로그인 전 콘솔 접속 시
      • /etc/issue.net: 로그인 전 원격 접속 시
      • /etc/motd: 로그인 후
    • 쉘 종류의 프롬프트
      • sh, csh, ksh, bash
      • shell 프로그램 저장 위치: /bin/bash, /bin/sh..
  • 로그아웃
    • logout, exit, Ctrl+D 사용
    • 전체 사용자 로그아웃 타임아웃: /etc/profile의 TMOUT 설정(초)
    • 특정 사용자 로그아웃 타임아웃: ~/.bashrc의 TMOUT 설정(초)

 


References

DB 스캔 종류

FULL TABLE SCAN

  • 인덱스를 활용하지 않고 테이블을 처음부터 끝까지 전부 탐색하는 방식
  • 매우 비효율적이며 디스크 I/O의 비용이 많이 발생

 

INDEX FULL SCAN

  • 인덱스 테이블을 처음부터 끝까지 전부 탐색하는 방식
  • 실제 테이블보다 상대적으로 적은 양을 차지하므로 일반적으로 full table scan보다 효율적
  • 하지만 index full scan도 결국 인덱스 테이블 “전체”를 읽어야 함
  • B+ 트리에서 첫 번째 leaf 노드를 수직 탐색 후 나머지 leaf 노드에 대해 순차적으로 전체 탐색을 진행

 

INDEX UNIQUE SCAN

  • 조회하고자 하는 1건의 데이터를 단번에 찾아오는 경우
  • 즉 고유 인덱스(UNIQUE)나 PK를 사용해서 1건의 데이터만 조회한 경우에 해당
  • 인덱스를 사용하는 방식 중 가장 효율적인 스캔 방식

 

INDEX RANGE SCAN

  • 인덱스를 활용해 범위 형태의 데이터를 조회하는 경우
  • BETWEEN, 부등호(<, >, ≤, ≥), IN, LIKE이 이에 해당
  • 인덱스를 사용하기 때문에 기본적으로 효율적인 방식이나, 그 범위가 넓을 경우 성능이 저하됨

 

INDEX LOOSE SCAN

  • 인덱스에서 필요한 부분만 선택하여 스캔
  • index range scan처럼 넓은 범위에 전부 접근하지 않고, where 조건문을 기준으로 불필요한 데이터를 구분한 뒤 해당 인덱스 키는 무시

 

INDEX MERGE SCAN

  • 두 개 이상의 인덱스를 병합하여 검색
  • where 문의 조건 열이 서로 다른 인덱스에 존재할 때 사용됨
  • 물리적으로 존재하는 개별 인덱스를 각각 접근하므로 인덱스에 접근하는 시간이 오래 걸림
  • 따라서 보통 별개로 생성된 인덱스들을 하나의 인덱스로 통합하여 튜닝함


EXPLAIN Type 칼럼

스캔 방식과 맵핑

 


References

 

'Computer Science > 데이터베이스' 카테고리의 다른 글

DB Index란?  (0) 2025.04.24
Mysql EXPLAIN/ANALYZE 간단 실습  (0) 2025.02.16
Mysql 옵티마이저와 통계 정보  (0) 2025.02.15

SQL 성능 개선을 위해 가장 많이 활용되는 방법이 인덱스 활용이다. 하지만 단순히 인덱스만 적용한다고 해서 무조건 해결되는 게 아니다. 인덱스를 적절하게 활용해야만 DB 성능이 개선된다.


인덱스란?

개념

  • 추가적인 쓰기 작업과 저장 공간을 활용하여 DB 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조
  • 데이터를 빨리 찾기 위해 특정 칼럼을 기준으로 미리 ‘정렬’해둔 표
  • 인덱스를 활용하면 UPDATE/DELETE 성능도 함께 향상됨. 해당 연산 수행을 위해서는 조회가 먼저 필요하기 때문

 

예시

users 테이블에 1만 개의 row가 있을 때, 23살인 사용자를 조회한다고 해보자. 인덱스가 없다면 만 개의 데이터를 전부 찾아봐야 할 것이다. 이를 Full Scan이라고 한다. 그런데 만약 사전에 나이를 기준으로 데이터를 정렬해둔다면 어떨까? (1)이미 정렬되어 있기 때문에 23살 데이터의 위치를 찾기도 빠르고, (2)24살 이후의 데이터는 볼 필요가 없으므로 모든 데이터를 스캔할 필요가 없다.

인덱스 관리

인덱스는 항상 최신의 정렬된 상태를 유지해야 한다. 이에 따라 INSERT/UPDATE/DELETE 연산 수행 시 다음과 같은 연산이 추가적으로 진행되어 오버헤드가 발생할 수 있다.

  • INSERT: 새로운 데이터에 대한 인덱스 추가
  • DELETE: 삭제하는 데이터의 인덱스를 ‘사용하지 않음’ 처리
  • UPDATE: 기존 인덱스를 ‘사용하지 않음’ 처리 후, 갱신된 데이터에 대한 인덱스를 추가

 

장단점

  • 장점: 조회 성능 향상
  • 단점: 쓰기 작업(데이터 삽입, 수정, 삭제) 성능 저하

⇒ 느려지는 이유? 인덱스를 생성한다는 것은 결국 인덱스용 테이블을 추가적으로 생성한다는 뜻이고, 인덱스 관리를 위해서는 DB의 약 10%에 해당하는 저장 공간이 필요하다고 한다. 쓰기 작업 시 원본 테이블 뿐 아니라 인덱스 테이블에도 그 값을 반영해야 한다. 즉 두 개 이상의 테이블에서 처리가 필요하기 때문에 더 느려질 수밖에 없다. 따라서 무분별한 인덱스 사용은 지양해야 한다.

 

인덱스 적용 케이스

  • INSERT, UPDATE, DELETE가 자주 발생하지 않는 칼럼
  • JOIN, WHERE, ORDER BY에 자주 사용되는 칼럼
  • 데이터의 중복도가 낮은 칼럼

 


인덱스의 종류

기본키(Primary Key)

  • PK도 인덱스의 일종이기 때문에, 테이블의 데이터가 이 PK를 기준으로 정렬되어 보관됨
  • 인덱스란 데이터를 빨리 찾기 위해 특정 칼럼을 기준으로 미리 ‘정렬’해둔 표라고 했는데, 그 칼럼이 PK일 경우에는 클러스터링 인덱스라고 부름
  • 클러스터링 인덱스란 “원본 데이터” 자체가 정렬되는 인덱스를 의미함
  • 클러스터링 인덱스에는 PK밖에 없기 때문에, PK = 클러스터링 인덱스 라고 봐도 무방

 

유니크(UNIQUE) 조건

  • MySQL은 UNIQUE 제약 조건 설정 시 자동으로 인덱스가 생성됨
  • 그 이유는 MySQL에서 유니크 조건을 구성하고 사용할 때 기본적으로 인덱스의 원리를 활용하기 때문
  • 즉, 유니크 옵션을 사용한다 = 인덱스를 사용한다 = 조회 성능이 향상된다
  • 유니크 특징으로 인해 생성되는 인덱스를 “고유 인덱스(Unique Index)”라고 부름

 

멀티 칼럼 인덱스(Multiple Column Index)

  • 2개 이상의 칼럼을 묶어서 하나의 인덱스로 설정하는 것
  • 즉 2개 이상의 칼럼에 대해서 미리 정렬해둔 표를 생성하는 것
  • 여러 칼럼을 인덱스로 생성할 때에는 칼럼의 순서도 중요함. 그게 곧 정렬의 우선순위이기 때문
  • (부서, 나이)로 인덱스를 생성했다면, 부서를 기준으로 먼저 정렬되고 동일 부서 내 데이터들 사이에서 나이를 기준으로 다시 정렬됨

 

커버링 인덱스(Covering Index)

  • SQL문을 실행시킬 때 필요한 모든 컬럼을 갖고 있는 인덱스

SELECT id, created_at FROM users는 created_at 칼럼이 인덱스에 없기 때문에 결국 원본 테이블에 접근해야 하지만, SELECT id, name FROM users는 인덱스에 사용자가 요청하는 모든 데이터가 담겨있기 때문에 원본 테이블에 접근할 필요가 없다.

 


인덱스 사용 시 주의점

적절한 활용 필요

앞서 말했듯, 인덱스를 많이 정의한다고 무조건 좋은 것은 아니다. 향상되는 것은 조회 시의 성능일 뿐, 그 외의 쓰기 작업에서는 데이터의 수가 많아질수록 부하가 심해지므로, 인덱스 선언은 꼭 필요한 경우에만 사용해야 한다.

 

멀티 칼럼 인덱스 구성 순서

  1. 처음에 배치된 칼럼만 멀티 칼럼 인덱스에서 일반 인덱스처럼 활용 가능하다.
  2. 칼럼 순서는 소분류 > 중분류 > 대분류 순으로 구성하는 것이 좋다.

정의한 칼럼의 순서에 따라서 성능 차이가 난다. 만약 (부서, 이름) 순으로 인덱스를 정의했다면, ‘인사팀’에 해당하는 데이터를 찾은 후 ‘홍길동’을 찾을 것이다. 하지만 부서는 데이터 중복도가 높기 때문에 비효율적이며, (이름, 부서)순으로 정의하는 것이 더 높은 성능을 보일 수 있다. 즉 데이터 중복도가 낮은(≒ 카디널리티가 높은) 컬럼이 앞쪽으로 오는 게 좋은 경우가 많다. (항상 그런 것은 아니다)

 


References

+ Recent posts