파일 시스템

디스크 기반 파일 시스템

디스크 기반 파일 시스템은 하드디스크나 SSD와 같은 물리적 저장장치에 데이터를 구조화하여 저장하고 관리하는 시스템. -> 흔히 사용하는 파일 시스템 유형

디스크 기반 파일 시스템의 주요 특징은 데이터의 영구성이다. 컴퓨터의 전원이 꺼져도 데이터가 보존, 다시 전원을 켜면 저장된 데이터를 그대로 사용할 수 있다.

리눅스의 ext4는 현재 가장 널리 사용되는 리눅스 파일 시스템이다. 대용량 파일 처리가 가능하고, 저널링 기능을 통해 시스템 충돌 시에도 데이터의 안정성을 보장한다.

  • 저널링이란 파일 시스템의 변경 사항을 로그에 기록해두었다가, 시스템 충돌이 발생해도 복구할 수 있게 하는 기능

이러한 파일 시스템들은 모두 데이터를 블록 단위로 관리한다. 하나의 파일이 여러 블록에 나뉘어 저장될 수 있으며, 파일 시스템은 이러한 블록들의 위치 정보를 관리하여 필요할 때 파일을 재구성할 수 있게 한다.

또한 디스크 기반 파일시스템은 메타데이터도 관리한다. 파일의 이름, 크기, 생성 시간, 수정 시간, 접근 권한 등의 정보가 여기에 포함. 이러한 메타데이터는 파일 시스템이 파일을 효율적으로 관리하고 사용자가 필요한 파일을 쉽게 찾을 수 있게 해준다.

네트워크 기반 파일 시스템

네트워크 기반 파일 시스템은 네트워크를 통해 다른 컴퓨터(원격 컴퓨터 혹은 서버)의 파일에 접근할 수 있게 해주는 시스템이다. 대표적인 네트워크 파일 시스템으로는 NFS(Network File System)와 SMB(Server Message Block)가 있다.

  • NFS는 주로 리눅스 시스템에서 사용, SMB는 윈도우에서 사용

네트워크 기반 파일 시스템이 제대로 작동하려면 네트워크를 통해 저장 장치를 제공하는 서버와 저장 장치를 제공 받는 클라이언트에 적절하게 설정해야 한다. 서버는 서버 컴퓨터에 직/간접적으로 연결된 저장 장치의 일부를 네트워크 기반 파일 시스템으로 제공할 수 있도록 설정하고, 클라이언트는 서버 컴퓨터의 네트워크 주소, 네트워크 기반 파일 시스템의 경로, 로컬 시스템의 경로 등을 설정한다. 서버와 클라이언트 모두 제대로 설정되면 클라이언트는 원격 저장 장치를 마치 로컬 저장 장치처럼 사용할 수 있다.

클라이언트가 네트워크 기반 파일 시스템에 파일을 저장하면 파일에 대한 여러 정보를 포함한 파일 저장이 요청 서버로 전달된다. 서버는 클라이언트가 보낸 요청을 받아 서버의 저장 장치에 파일을 저장한다. 클라이언트가 네트워크 파일 시스템의 파일에 읽기를 시도하면 파일 읽기 요청이 서버로 전달된다. 서버는 클라이언트가 보낸 파일 읽기 요청을 받아 저장 장치로부터 파일을 읽어 클라이언트로 전달한다.

NFS의 작동 방식을 보면, 서버는 특정 디렉토리를 공유하고 , 클라이언트는 이 공유된 디렉토리를 자신의 파일 시스템의 한 지점에 마운트한다. 마운트가 완료되면 사용자는 마치 로컬 디렉토리를 사용하는 것처럼 원격 파일에 접근할 수 있다.

예를 들어, 회사에서 팀원들과 문서를 공유해야 하는 상황이 있다면, 한 대의 서버 컴퓨터에 모든 문서를 저장해두고, 각 팀원들의 컴퓨터에서 이 서버의 디렉토리를 마운트하면 모든 팀원이 같은 문서에 접근하여 작업할 수 있다.

네트워크 파일 시스템의 주요 장점은
첫째, 중앙 집중식 데이터 관리가 가능. -> 모든 파일을 한 곳에서 관리할 수 있어 백업이나 보안 관리 용이
둘째, 저장 공간 효율적 사용. 같은 파일을 여러 컴퓨터에 중복해서 저장할 필요가 없다.

클라우드 스토리지 서비스 vs 네트워크 파일 시스템

클라우드 스토리지 서비스와 네트워크 파일 시스템은 비슷한 개념을 가지고 있지만, 몇 가지 중요한 차이점 존재.
둘 다 원격지에 있는 파일에 접근한다는 기본 개념은 같다. 하지만 구현 방식과 사용 목적에서 차이가 있다.

네트워크 파일 시스템은 주로 로컬 네트워크 환경(ex. 회사 내부 네트워크)에서 사용된다. 파일을 직접 마운트해서 사용하기 때문에 마치 자신의 컴퓨터에 있는 파일처럼 즉각적으로 접근하고 수정할 수 있음.

반면, 클라우드 스토리지 서비스는 인터넷을 통해 전 세계 어디서나 접근 가능하도록 설계되었다. (ex. 구글 드라이브나 드롭박스) 클라우드는 파일 동기화, 버전 관리, 공유 기능 더 많은 기능을 제공하며 웹 브라우저를 통해 접근할 수 있어 더 편리함.

-> 쉽게 비유하면 네트워크 파일 시스템은 회사 내 공용 문서함과 같고 클라우드는 어디서나 접근할 수 있는 디지털 보관소와 같다.

가상 파일 시스템

가상 파일 시스템은 실제 디스크에 저장되지 않는 시스템 정보나 하드웨어 정보를 파일과 디렉토리 형태로 보여주는 특별한 파일 시스템.

일반적인 파일은 하드디스크나 SSD에 실제로 저장되어 있는 데이터. (워드 문서나 사진 파일 등)
하지만 가상 파일 시스템은 조금 다르다. 컴퓨터의 CPU 사용량이나 메모리 상태 같은 정보는 계속 변하는 실시간 정보이다. 이런 정보들을 실제 파일로 저장하면 금방 outdated 될 것. 그래서 리눅스는 실시간 정보들을 가상의 파일처럼 보이게 만들었다.

실제 사례
/proc/cpuinfo라는 '파일'을 열어본다고 가정해보면. 이 파일은 실제로 하드디스크에 존재하지 않는다. 대신, 이 '파일'을 읽으려고 할 때 운영체제가 그 순간의 CPU 정보를 보여준다. 마치 실제 파일인 것처럼.

이렇게 시스템 정보를 파일처럼 보이게 만드는 이유는 간단하다. 리눅스에서는 모든 것을 파일처럼 다루면 프로그래머가 더 쉽게 시스템을 제어할 수 있기 때문이다. 복잡한 시스템 명령어를 새로 배울 필요 없이, 파일을 읽고 쓰는 것처럼 간단하게 시스템 정보를 다룰 수 있는 것.

리눅스 파일 계층 구조

윈도우와의 차이점.
윈도우에서는 각 드라이브(C:, D: 등) 독립적인 최상위 디렉토리를 가진다. 반면 리눅스는 모든 것이 하나의 루트 디렉토리(/)에서 시작하는 단일 계층 구조를 가진다.

리눅스의 루트 디렉토리 아래에는 각각의 목적을 가진 표준 디렉토리들이 있음.
/bin은 기본적인 명령어들이 저장되는 곳. ls, cp와 같이 시스템 운영에 필수적인 프로그램들이 여기에 위치한다.

/home은 일반 사용자들의 개인 디렉토리가 위치하는 곳이다. 각 사용자는 자신만의 공간(/home/사용자이름)을 가지게 되며, 여기에 개인 파일들을 저장할 수 있음

/etc는 시스템의 설정 파일들이 저장되는 곳. 네트워크 설정, 사용자 계정 정보 등 시스템 전반의 설정이 이곳에 있다.

/var는 시스템 운영 중에 자주 변경되는 파일들이 저장되는 곳. 로그 파일이나 메일 큐등이 여기에 위치. 업무 기록 보관하는 장소라고 생각.

이러한 단일 계층 구조의 장점은 파일 시스템을 일관되게 관리할 수 있다는 것. 새로운 저장 장치를 추가하더라도, 이를 기존 디렉토리 구조의 적절한 위치에 마운트하여 통합적으로 관리할 수 있다.

  • 마운트는 파일 시스템이 설치된 디스크를 특정 디렉토리에 연결하는 작업

디렉토리

디렉토리는 파일 시스템을 계층화할 때 사용하는 도구.

루트 디렉토리

루트 디렉토리는 파일 시스템의 최상단에 위치한 디렉토리로, /로 표기한다.시스템의 모든 파일과 디렉토리가 루트 디렉토리 하위에 구성된다.
루트 딜게토리의 바로 아래에 생성된 디렉토리는 전통적으로 그 이름과 역할이 정해져 있다. 반드시 지켜야 하는 규칙은 아니지만, 전통적으로 그래 왔고, 앞으로도 그럴 것이다.

루트 디렉토리 하위의 주요 디렉토리

디렉토리용도
/bin기본 실행 명령어가 저장된 디렉토리
- ls, cp, mv 등 필수적인 실행 파일들이 위치
/dev디바이스 파일이 저장된 디렉토리
하드디스크, 키보드 등의 하드웨어를 파일로 표현
/etc시스템 설정 파일이 저장된 디렉토리
네트워크 설정, 사용자 계정 정보 등
/home일반 사용자의 홈 디렉토리
각 사용자별로 독립된 공간 제공
/lib프로그램이 공통으로 사용하는 라이브러리 파일 저장
시스템 운영에 필요한 핵심 라이브러리 포함
/mnt다른 파일 시스템을 임시로 마운트하는 디렉토리
CD-ROM, USB 등 외부 저장장치 마운트에 사용
/proc프로세스 정보와 시스템 정보를 담은 가상 파일 시스템
실시간으로 변하는 시스템 정보 제공 (CPU, 메모리..)
/rootroot 사용자의 홈 디렉토리
일반 사용자의 /home과 구분된다.
/sbin시스템 관리용 명령어가 저장된 디렉토리
시스템 재부팅 시 내용이 삭제된다.
/sys시스템 하드웨어 정보와 커널 정보를 포함하는 가상 파일 시스템
디바이스 드라이버와 커널 기능 제어에 사용
/tmp시스템 임시 파일이 위치한다.
/usr일반 사용자들이 주로 사용하는 프로그램과 데이터 저장
용량이 큰 프로그램들이 주로 설치됨
/srv(service)시스템에서 제공하는 서비스의 데이터 저장
웹 서버, FTP 서버 등의 데이터가 위치

홈 디렉토리

홈 디렉토리는 리눅스에 사용자를 추가하면 사용자별로 할당하는 디렉토리로 추가한 사용자를 위한 공간.
일반 사용자는 모두 사용자만의 홈 디렉토리가 존재한다.
-> 홈 디렉리에는 사용자별 설정이나 데이터가 저장된다.

사용자가 터미널을 실행하거나 SSH로 리눅스 시스템에 접속하면 로그인한 사용자의 홈 디렉토리를 현재 작업 디렉토리로 설정해 시작한다.

Bash에는 홈 디렉토리를 나타내는 특수한 표현이 있다. 바로 ~이다. ~사용자_이름은 해당 사용자의 홈 디렉토리를 나타낸다.

일반 사용자 (예: alice)
위치: /home/alice
홈 디렉토리 표현: ~alice 또는 ~
접근 방법: cd ~ 또는 cd /home/alice


root 사용자
위치: /root
홈 디렉토리 표현: ~root 또는 ~
접근 방법: cd ~ 또는 cd /root

상대 경로와 절대 경로

리눅스에서 모든 파일은 루트 디렉토리 아래 어딘가에 위치한다. 파일마다 위치가 다른데, 파일의 위치 정보를 표현한 것을 경로라고 한다. 경로는 디렉토리 구조를 기반으로 파일 위치를 나타낸다.

  • 리눅스에서 경로를 나타내는 방법은 상대 경로와 절대 경로가 있음

상대 경로

상대 경로는 현재 작업 디렉토리를 기준으로 파일 경로를 나타낸다.
특수 기호 사용

  • . : 현재 디렉토리
  • .. : 상위 디렉토리

예시:
./file.txt : 현재 디렉토리의 file.txt
../documents : 상위 디렉토리의 documents 폴더
../../file.txt : 상위의 상위 디렉토리의 file.txt

# 절대 경로
cd /home/user/documents

# 상대 경로
cd ../downloads
cd ./images

파일과 디렉토리 다루기

디렉토리 생성

디렉토리는 mkdir(make directory) 명령어로 생성할 수 있다.
기본 문법 : mkdir [옵션] 디렉토리명

주요 옵션:

  • -p(parents) : 상위 경로도 함께 생성
  • 예 : mkdir -p dir1/dir2/dir3
    • dir1, dir2가 없어도 한 번에 생성 가능 (즉 dir1 > dir2 > dir3 각각 생성)
  • -m(mode) : 디렉토리 권한 설정 (리눅스에서 해당 디렉토리에 대한 접근과 권한을 설정)
    • 예 : mkdir -m 755 testdir

디렉토리 삭제

디렉토리는 삭제할 때는 rmdir 명령어로 삭제할 수 있다.
기본 문법 : rmdir [옵션] 디렉토리명
rmdir은 여러 디렉토리를 입력하면 입력한 디렉토리를 모두 삭제한다. 단, rmdir은 빈 디렉토리만 삭제할 수 있다.

주요 옵션:

  • p : 부모 디렉토리(상위 디렉토리)도 함께 삭제
rmdir testdir           # 빈 디렉토리 삭제
rmdir -p a/b/c         # 경로의 모든 빈 디렉토리 삭제
rm -r directory        # 디렉토리와 내부 파일 모두 삭제

rm : 디렉토리와 파일 모두 삭제 가능

  • 기본 문법 : rm [옵션] 디렉토리명
  • 주요 옵션:
    -r : 디렉토리와 하위 디렉토리 모두 삭제
    -f : 강제삭제
    -i : 삭제 전 확인

파일 복사하기

파일을 복사할 때는 cp 명령어 사용. cp명령어는 복사 대상 파일을 자동으로 생성. 파일이 이미 존재하면 덮어쓰고, 없으면 새로 만든다.
기본 문법 : cp [옵션] 원본파일 대상파일/디렉토리

cp명령어는 2가지 형식이 있는데, 흔히 사용하는 형식은
cp [옵션] 원본 복사본 이렇게 사용. 원본 부분에는 원본 파일의 경로를, 복사본 부분에는 복사한 파일을 저장할 경로를 지정.

두 번째 형식은 여러 파일을 한 디렉토리로 복사할 때 사용한다.
cp [옵션] 원본1 원본2 ... 디렉토리 : 원본 부분에는 원본 파일들의 경로를, 디렉토리 부분에는 복사본을 저장할 디렉토리를 지정한다.

주요 옵션

  • -i(interactive) : 덮어쓰기 전 사용자에게 확인
  • -f(force) : 강제로 덮어쓰기
  • -r(recursive) : 디렉토리와 하위 내용 모두 복사
  • -p(preserve) : 원본 파일의 속성(소유권, 권한 등) 유지
  • -v(verbost) : 진행 상황 표시

사용 예시

# 단일 파일 복사
cp file1.txt file2.txt              # file1.txt를 file2.txt로 복사
cp file1.txt /home/user/documents/  # file1.txt를 지정 디렉토리로 복사

# 디렉토리 복사
cp -r dir1 dir2                     # dir1과 모든 내용을 dir2로 복사

# 다중 파일 복사
cp file1.txt file2.txt file3.txt /backup/  # 여러 파일을 backup 디렉토리로 복사

# 속성 유지하며 복사
cp -p source.txt destination.txt    # 파일 속성 유지하며 복사

파일 이동하기

파일 이동 방법. 여기서 이동은 2가지 의미가 있다.
첫 번째는 파일 위치를 변경하는 것. 어떤 파일의 저장 위치를 A 디렉토리에서 B 디렉토리로 옮기는 것을 의미한다.
두 번째는 파일 이름을 변경하는 것. 이동이라는 단어와는 조금 어울리지 않지만 리눅스에서는 파일 이름을 변경할 때 파일 위치를 변경하는 것과 같은 명령어를 사용한다.

파일 이동에는 mv 명령어를 사용한다. mv 명령어도 두 가지 형식이 존재

첫 번째 형식은 mv [옵션] 원본 대상 -> 단일 파일 이동/이름 변경
원본 부분에는 이동할 원본 파일을 지정한다. 대상 부분에는 파일을 이동해 저장할 경로를 지정한다. 대상에 디렉토리를 지정하면 원본 파일을 대상 디렉토리로 옮긴다. 대상에 디렉토리와 파일 이름까지 지정하면 원본 파일을 대상 디렉토리로 옮기고 파일 이름도 변경한다.

두 번째 형식은 mv [옵션] 원본1 원본2 ... 디렉토리 -> 다중 파일 이동
원본 부분에는 원본 파일들을 입력한다. 디렉토리 부분에는 파일들을 이동할 디렉토리를 지정한다. 두 번째 형식을 사용하면 파일 저장 위치는 변경되지만, 파일 이름은 변경되지 않는다.

주요 용도

  1. 파일 위치 이동
mv file.txt /home/user/documents/  # 파일을 다른 디렉토리로 이동
  1. 파일 이름 변경
mv oldname.txt newname.txt  # 같은 위치에서 이름만 변경
  1. 이동과 동시에 이름 변경
mv file.txt /home/user/documents/newfile.txt

주요 옵션

  • -i : 덮어쓰기 전 확인
  • -f : 강제 이동
  • -v : 이동 진행 상황 표시
  • -u : 대상파일보다 새로운 경우에만 이동

mv명령어는 디렉토리에도 동일하게 적용됨.

# 디렉토리 이동
mv dir1 /home/user/documents/

# 디렉토리 이름 변경
mv olddir newdir

# 디렉토리 이동 및 이름 변경
mv dir1 /home/user/documents/newdir

파일 삭제하기

파일을 삭제할 때는 rm 명령어를 사용한다.
기본 문법 : rm [옵션] 파일
파일 부분에 파일 이름을 명시하면 해당 파일이 삭제된다. 기본적으로 일반 파일만 삭제되고 디렉토리는 삭제되지 않는다. 디렉토리를 삭제하려면 옵션을 추가해야 함.

주요 옵션

  • -d : 빈 디렉토리 삭제(비어있을 때만 ㅅ가제 가능)
  • -f : 강제 삭제(확인 없이 삭제 진행, 파일이 존재하지 않아도 실패로 처리하지 않고 사용자에게 실행 여부도 묻지 않는다.)
  • -i : 삭제 전 확인. -> 사용자에게 실행 여부를 묻는다.
  • -r : 디렉토리와 그 내용 모두 삭제. 즉 디렉토리와 그 디렉토리에 포함된 모든 파일과 디렉토리를 삭제한다.

-r 옵션 사용시 주의 사항

-r 옵션을 사용하면 디렉토리도 삭제한다. 이때 디렉토리에 포함된 파일과 하위 디렉토리까지 모두 삭제한다. 한 번의 실수로 시스템을 돌이킬 수 없는 상태로 만들 수도 있음. 만약 sudo rm -rf / 명령을 실행하면 .. ? root 사용자의 권한으로 모든 파일을 삭제한다.
-> 절대 해서는 안되는 명령어

소프트 링크와 하드 링크

둘 다 파일의 일종. 링크는 파일을 가리키는 참조와 같은 특별한 형태의 파일이다.
소프트 링크는 유연한 연결, 하드 링크는 견고한 연결 정도로 볼 수 있다. 둘의 다른 점은 파일을 연결하는 방법이다. 이를 설명하기 전에 둘을 이해하는 데 필요한 아이노드와 덴트리 개념부터 살펴보자.

아이노드와 덴트리

아이노드(inode)는 파일이나 디렉토리의 모든 메타데이터를 저장하는 데이터 구조.
파일의 실제 데이터가 저장된 위치, 크기, 접근 권한, 소유자 정보, 생성 시간 등의 정보가 아이노드에 저장된다 그리고 파일의 실제 내용을 저장하고 있는 데이터 블록을 아이노드에 연결한다. 각 아이노드는 고유한 번호를 가지며, 이를 통해 시스템은 파일을 식별하고 관리한다.

  • 아이노드에는 파일의 경로 정보(위치 + 이름)가 포함되지 않는다. 파일의 경로 정보는 덴트리라는 자료구조에 저장된다.

덴트리(dentry)

덴트리는 디렉토리 엔트리의 줄임말로, 파일이나 디렉토리의 이름과 해당 아이노드를 연결하는 구조. 파일 시스템에서 보는 파일명은 실제로 덴트리를 통해 관리된다. 덴트리는 파일 시스템의 계층 구조를 구현하는 핵심요소이다.
각 덴트리는 파일 경로를 나타내며, 파일의 메타데이터를 저장하는 하나의 아이노드와 연결된다. 즉, 덴트리는 파일의 경로와 파일의 실체(아이노드로 표현되는 파일의 메타데이터)를 연결하는 매개체로 불 수 있다.

파일 시스템 구조 (예시: file.txt)

[덴트리]                [아이노드]              [데이터 블록]
+------------+         +------------+         +------------+
| "file.txt" |  ---->  | inode #123 |  ---->  | 실제 파일  |
|            |         |            |         | 데이터     |
+------------+         | - 파일크기  |         |            |
                     | - 권한      |         |            |
                     | - 수정시간  |         |            |
                     | - 소유자    |         |            |
                     +------------+         +------------+

하드링크의 경우:
[덴트리1]               [아이노드]              [데이터 블록]
"file.txt"     ---+    +------------+         +------------+
                 |--> | inode #123 |  ---->  | 실제 파일  |
[덴트리2]          |    |            |         | 데이터     |
"hardlink.txt" ---+    | - 파일크기  |         |            |
                      | - 권한      |         |            |
                      +------------+         +------------+

소프트링크의 경우:
[덴트리]                [아이노드]              [데이터 블록]
"symlink.txt"  ---->   | inode #124 |  ---->  | 경로:      |
                      |            |         | /path/to/  |
                      | - 링크정보  |         | file.txt   |
                      +------------+         +------------+

여기서 볼 수 있듯이 일반 파일은 하나의 덴트리가 하나의 아이노드를 가리키고, 그 아이노드가 실제 데이터를 가리킨다.
하드링크는 여러 덴트리가 동일한 아이노드를 가리킨다.
소프트 링크는 자신만의 아이노드를 가지며, 데이터 블록에는 원본 파일의 경로가 저장된다.

소프트링크

리눅스에서 소프트링크가 윈도우의 바로가기와 같은 개념.
소프트 링크는 연결할 대상 파일의 경로를 저장한다. 소프트 링크를 조회하거나 실행하면 실제로는 연결된 대상 파일을 조회하거나 실행하게된다. 즉, 소프트 링크는 그 자체로 하나의 파일이다. 파일이므로 파일에 대한 아이노드와 덴트리가 있다.
즉, 원본 파일의 경로를 가리키는 새로운 파일을 생성하는 것이고. 자신만의 아이노드를 가지며, 데이터 영역에는 원본 파일의 경로만 저장된다. 따라서 원본 파일이 삭제되거나 이동되면 소프트링크는 더 이상 유효하지 않게 된다.

하드링크

하드링크는 원본 파일과 동일한 아이노드를 가리킨다. 이는 실제로 같은 데이터를 공유한다는 의미.
하나의 데이터에 여러 개의 이름이 존재하는 것과 같다. (링크드리스트처럼 생각하자)
따라서 원본 파일을 삭제하더라도 하드링크를 통해 여전히 데이터에 접근 가능.

  • 각 하드링크는 동일한 데이터를 참조하기 때문에, 하나의 하드링크를 통해 데이터를 수정하면 모든 하드링크에서 그 변경사항이 반영된다. 하지만 데이터 자체를 직접 삭제하는 것은 불가능. 데이터는 오직 모든 하드링크가 삭제되어 참조 카운트가 0이 될때만 시스템에 의해 삭제된다.
profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글

Powered by GraphCDN, the GraphQL CDN