Notice
Recent Posts
Recent Comments
Link
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

우당탕탕 개발일지

[Linux] 리눅스 파일과 파일 시스템 본문

Server/Linux, C

[Linux] 리눅스 파일과 파일 시스템

YUDENG 2025. 5. 11. 22:18

리눅스 파일 종류

1. 일반 파일

  • 데이터를 저장하는 용도로 사용되며, ls -l 명령어로 확인할 때 -로 시작한다.
  • 텍스트 파일, 실행 파일, 이미지 파일 등 리눅스에서 사용하는 대부분의 파일은 일반 파일에 해당한다.
  • 실행 또는 이미지 파일 같은 경우 데이터가 바이너리(이진) 형태로 저장되어 바이너리 파일이라고도 하며, 텍스트 파일을 읽을 때 처럼 vi나 cat 명령어로 사용할 수 있다.
  • 리눅스에서는 해당 파일이 텍스트인지 바이너리인지 구분을 하지 않고, 응용프로그램 단에서 파일의 형식을 결정한다.

 

2. directory

  • Linux는 Unix 파일 시스템 계층 구조를 기반으로 사용한다.
  • man hier 명령어를 치면 디렉토리 구조에 대한 정보를 확인할 수 있다.

  • ls -l 명령어로 확인할 때 d로 시작한다.
  • 디렉토리 파일은 다른 파일의 이름과 그 파일들에 대한 정보를 가르키는 포인터를 담은 파일이다.
  • 리눅스는 전체 파일을 용도에 따라 계층 디렉토리로 구분하여 관리하며 이것을 파일 시스템이라고 한다.
 

✅ 루트 디렉토리(/)

  • 리눅스 파일 시스템의 최상위에 위치한 디렉토리이다.
  • bin, lib 등의 모든 하위 계층의 정보를 담고 있다.
  • rm 명령어를 통해 디렉토리를 지울 때 rm -rf / 는 사용하지 않도록 주의해야 한다.

 

✅ /bin 디렉토리

  • ls, cp, mv 등 기본 내장이 된 쉘 명령의 실행 파일을 갖고 있는 디렉토리이다.
  • 사용자별 제한 없이 함께 사용할 수 있는 디렉토리이다.
실행파일을 저장한 후, 어느 path에서든 파일명을 명령어로 입력하면 실행이 되는데 그 저장위치는 /bin, /usr/bin, /sbin, /usr/sbin 4가지가 있다.일반적으로 다운 받은 명령어들은 /usr/bin에 넣어서 사용한다./bin은 아주 기본적인 리눅스가 돌아가기 위해 최소한으로 필요한 것들이 포함되어 있다.
디렉토리
 
디렉토리 용도 사용권한
/bin 기본적인 명령어 일반 사용자
/sbin 시스템 관리를 위한 명령어 슈퍼유저(root)
/usr/bin /bin에 있는 명령을 제외한 기본적인 명령어 일반 사용자
/usr/sbin /sbin에 있는 명령을 제외한 시스템 관리를 위한 명령어 슈퍼유저(root)
 

 

✅ /sbin 디렉토리

  • /bin처럼 명령어를 저장하고 있는 디렉토리이다.
  • 다른 점은 시스템 관리자용 명령어를 저장하고 있어 root 권한이 필요하다는 점이다.
/bin과 /sbin은 운영체제 별로 구별하는 방식이 차이가 있다.
CentOS는 디렉토리 구조 단순화를 위해 bin과 sbin을 심볼릭 링크로 공유.MacOS는 bin과 sbin을 모두 분리하여 사용. 맥에서 패키지 관리자인 brew를 사용하면 Cellar라는 별도의 디렉토리에 저장되며, usr/local/bin에 심볼릭 링크 형태로 관리

 

 

✅ /dev 디렉토리

  • 하드웨어 장치와 관련된 특수 파일이 존재하는 디렉토리이다.
  • 물리적으로 디스크에 있는 것이 아닌 가상 파일이라고 보면 된다.

 

✅ /etc 디렉토리

  • 암호 파일 및 네트워크 파일과 같은 관리 시스템의 핵심 구성 파일이 있다.
  • 시스템의 대부분 설정파일이 존재하는 디렉토리라고 보면 된다.

 

✅ /usr 디렉토리

  • 시스템 관리자가 아닌 일반 사용자들이 사용하는 디렉토리다. 하위에는 /bin, /sbin , /local 등이 있다.
  • /usr/bin 디렉토리는 일반 사용자에게 기본적으로 필요한 유틸리티성 디렉토리이다. 

 

✅ /home 디렉토리

  • 사용자 개인의 디렉토리가 들어가 있다. 즉, 개별 사용자에 대한 구성 파일이 포함되어 있다.
  • 리눅스에서 사용자를 생성할 때 /home/userA , /home/userB 등과 같이 여러 사용자를 생성해서 구분한다.

 

✅ /lib 디렉토리

  • 시스템 부팅과 /bin과 /sbin 디렉토리에 있는 바이너리 파일들을 실행해주는 공유 라이브러리를 보유하고 있다.
  • /usr/bin, /usr/sbin에는 /usr/lib 디렉토리가 있고, /usr/local/bin 에는 /usr/local/lib 가 존재하며 디렉토리에 맞게 존재하고 있다.

 

✅ /var 디렉토리

  • variable을 뜻하는 /var 디렉토리는 로깅, 사용자 추적, 캐시 등의 시스템 프로그램이 만들고 관리하는 기타 파일 들의 정보들을 저장한다.

 

✅ /opt 디렉토리

  • 외부 응용프로그램을 설치 및 저장할 때 사용된다.
  • 일반적인 관행으로는 opt에 프로그램을 유지하고, 모든 사용자가 실행할 수 있도록 바이너리 파일을 /bin에 심볼릭 링크하는 것이다.

 

✅ /tmp 디렉토리

  • 각종 프로그램이나 프로세스 작업을 할 때 임시로 생성되는 파일 저장
  • 시스템이 다시 시작되면 /tmp 디렉토리 포함 항목이 삭제된다.
  • Sticky bit 설정을 하면 파일의 소유자만이 자신의 소유 파일을 지울 수 있다.

 

3. 하드 링크(hard link)

  • 하드 링크를 생성할 땐 ln 을 사용한다.
  • 하드 링크는 원본 파일과 동일한 inode를 직접적으로 가리킨다.
  • 원본 파일과 하드 링크된 파일은 완전히 같다. 원본 파일이 사라지더라도 데이터만 살아 있다면 원본 파일에 접근이 가능하다.
  • 하드 링크는 동일한 inode를 공유하기 때문에 별도의 저장 공간을 필요로 하지 않는다. “이름이 다른” 똑같은 파일을 만드는 것이다.
  • 원본 파일을 삭제하거나 이름을 바꾸거나 이동해도 하드 링크는 기본 inode에 연결되므로 영향을 받지 않는다.

 

4. 심볼릭 링크(symbolic Link)

  • 원본 파일을 대신하도록 원본 파일을 다른 파일명으로 지정한 것으로 윈도우의 바로가기와 비슷하다.
  • 심볼릭 링크의 경우 만들게 되면 또 다른 inode 를 생성해서 원본 파일의 변경 사항을 반영한다.
  • 심볼릭 링크를 생성할 땐 ln -s 옵션을 사용한다
  • 원본 파일이 사라지면 해당 데이터에 접근할 수 없다. (No such file or directory)
  • 특정 데이터에 접근할 때, 심볼릭 링크를 통해 접근할 경우 다시 원본 파일을 거치게 된다.
  • 가리키는 이름을 저장하기 위해 자체 inode가 필요하다.

 

5. special file

  • 파일 형태로 표현된 커널 내 객체, 즉 OS의 자원이다. (OS 자원 = 디스크, CPU, 네트워크, RAM)
  • 특수 파일은 장치와 데이터를 주고 받는 통로이다. 디스크에 저장하지 않으며, 장치 번호를 inode에 저장한다.
  • 두 가지 종류의 문자 특수 파일(character special file)과 블록 특수 파일(block special file)이 존재한다.
  • 차이점은 운영체제와 하드웨어가 처리하는 데이터 읽기/쓰기 방식이다.

  문자 특수 파일 (Character Special File)

  • 데이터를 바이트 단위로 전송하며, ls -l 명령어로 확인할 때 c로 시작한다.
  • 일반적으로 순차적으로 데이터를 처리하며, 대표적인 예로 키보드나 마우스가 있다.

 

  블록 특수 파일 (Block Special File)

  • 데이터를 블록 단위로 전송하며, ls -l 명령어로 확인할 때 b로 시작한다.
  • 크기가 고정된 블록을 사용하여 데이터를 저장하고, 비순차적 접근이 가능하여, 하드 드라이브, CD-ROM 드라이브 등의 장치에 사용된다.
  • 데이터를 저장하고 빠르게 접근할 수 있는 구조를 가졌다.

파일 소유자, 그룹

  • ls -l 명령을 통해 파일의 권한과 소유자를 확인할 수 있다.
  • 리눅스는 다중 사용자를 지원하는 운영체제이기 때문에, 다른 사용자가 내 파일을 마음대로 접근하지 못하게 하는 기능이 존재한다.
  • 기본적으로 해당 파일을 생성한 사용자가 소유자가 된다.
  • 리눅스에는 파일마다 해당 파일의 읽기, 쓰기, 실행 권한이 존재하는데, 이 권한을 사용자에 따라 다르게 부여할 수 있다.

 

 

 파일 소유자 변경

chown [옵션] [소유자(:소유그룹)] [파일 또는 디렉토리]
옵션 설명
-h 심졸릭 링크 파일 자체의 소유주나 그룹을 변경
-R 하위 디렉토리와 디렉토리 하위의 모든 파일의 소유자를 변경
 
 
 

 파일 소유 그룹 변경

chgrp [옵션] [소유그룹] [파일 또는 디렉토리]
옵션 설명
-h 심졸릭 링크 파일 자체의 소유주나그룹 소유권 변경
-R 하위 디렉토리와 디렉토리 하위의 모든 파일의 그룹 소유권 변경
 

파일 모드

cat /etc/passwd
  • /etc/passwd 파일에는 리눅스 계정 하나당 한 줄씩 정보가 저장된다.

 

User

리눅스에서는 사용자를 root와 일반 사용자로 구분하며, UID(User Identity)로 관리한다.

  • root (Super User) 계정은 UID값이 0으로 지정된 관리자 계정으로, 모든 권한을 가진 계정이다.
  • 일반사용자(Normal user)는 관리자에게 권한을 부여받아 사용한다.
  • 하나의 user는 여러 그룹에 동시에 소속될 수 있다.

✅ Group

  • 리눅스에서는 계정별로 권한을 부여할 수 있다. 하지만 계정이 많을 수록 하나 하나 권한을 변경하기는 쉽지 않기에 group이라는 개념이 존재한다.
  • 기본적으로 계정이 생성될 때 group을 따로 지정해주지 않으면 해당 계정의 이름으로 그룹을 하나 만들고 그곳에 들어가게 된다.
 

 

Others

  • 파일이나 디렉토리에 대해 소유자나 그룹에 속하지 않는 나머지 사용자들이다.

특수 권한

사용자가 간혹 root 권한이 필요할 때, 특수 권한을 설정하여 일부 권한만 허용할 수 있다. rwx 외에도 권한에는 세가지 속성이 있다.

  • 04000 : set-user-id
  • 02000 : set-group-id
  • 01000 : sticky bit

 

set-user-id bit (SUID)

SUID를 설정하게 되면 user는 해당 파일을 실행할 때 해당 파일의 소유자(owner) 와 같은 권한을 갖는 채로 실행이 가능해진다.

  • 설정 시 소유자 권한 부분의 x자리에 s가 표기된다.
  • 실행 권한이 없는 파일에 부여 시 대문자 S로 표기된다.
  • 해당 권한 관리가 필요한 대표적인 경우로는 passwd 명령어가 있다.
- user는 passwd 명령어로 패스워드를 설정/변경하는 경우에 자동으로 etc/passwd, /etc/shadow 파일도 변경하게 된다. 이 두 파일은 root가 생성한 파일이기에 root 권한이 없으면 수정할 수 없다.
- passwd는 SUID가 설정된 명령어이기 때문에 실행되는 순간 owner인 root 권한을 획득한다. 따라서 일반 user가 etc/passwd, /etc/shadow 파일을 수정(w)할 수 있게 된다.

 

✅ set-group-id bit (GUID)

GUID가 설정된 파일은 실행할 때 해당 파일을 소유한 그룹의 권한으로 실행된다.

  • 주로 디렉토리에 설정되며, 그룹 소유권 부분의 x자리에 s로 표기된다.
  • 실행 권한이 없을 경우 대문자 S로 표기된다.
  • 해당 권한 관리가 필요한 대표적인 경우로는 /var/mail 디렉토리 관리가 있다.
/var/mail 디렉토리는 mail group owner를 가지고 있는데 이 하위에 생성되는 모든 디렉토리는 mail group owner를 갖도록 생성되어야 mail 그룹을 통해 관리가 가능하다.

 

✅ sticky bit

  • 자신의 소유가 아닌 파일을 삭제, 이동, 덮어쓰기 등을 하려고 할 때 실행하지 못하게 하는 보호 기능을 부여한다.
  • 디렉토리에 설정되는 특수 권한 other 계층 권한 부분이 x자리가 t로 표시된다.
사용 이유
- /tmp와 같은 공유 디렉토리의 경우 목적상 other 영역에 write 권한이 있다.
- /tmp 디렉토리는 자신의 소유가 아닌 파일도 영향을 줄 수 있게 세팅이 되어 있기 때문에 보호가 필요하다. 자칫 잘못하면 좀비 프로세스가 발생할 수 있다.

파일 시스템

파일시스템(File System)이란 파일을 효율적으로 기록 및 검색할 수 있도록 만들어진 체계로, 저장매체나 운영체제에 따라 파일시스템의 사용이 제한된다.

 

  • Window : FAT16, FAT21, exFAT, NTFS
  • Linux : ext2, ext3, ext4, XFS, ZFS, ReiserFS
  • Solaris : UFS, VxFS, QFS, ZFS
  • Macintosh : HFS, HFS+
 

✅ ext4

  • 기본 ext3 파일 시스템의 확장 버전으로, 저널링 파일시스템이다.
    • 저널링 파일시스템 : 백업 및 복구 능력이 있는 파일 시스템
    • 디스크에 기록하기 전에 먼저 저널에 수정 사항을 기록
  • 대용량 파일 지원 및 디스크 공간의 빠른 할당
  • 디렉토리에 있는 하위 디렉토리 수 제한이 없다.
  • 최대 16TB까지 지원한다. (16GB~16TB)
16TB보다 큰 파일 시스템의 경우 XFS와 같은 확장 가능한 고가용성 파일 시스템을 사용할 것을 권장한다.

 

✅ xfs

  • Redhat7 출시 이후에는 ext 시리즈가 아닌 XFS를 기본 파일시스템으로 채택하고 있다.
  • 리눅스 커널에 내장 된 64 비트 저널링 파일 시스템이며 대용량 파일시스템과 높은 성능과 높은 동시성을 제공한다. (16TB~16EB)
  • 디렉토리 구조를 b+tree 로 관리하여 영역 검색이 효율적이다.
  • XFS는 안정적이지만 작은 사이즈 파일에서는 성능이 저하된다.

 

✅ btrfs (B-Tree File System)

  • b-tree 기반의 최신 파일시스템으로, 기록 중 복사 방식을 사용한다.
  • 스냅샷, 데이터 복제, 동적 볼륨 관리, 온라인 파일 시스템 조정 등 고급 기능을 지원한다.
  • 여러 디스크를 하나의 스토리지 풀로 관리할 수 있다.

마운트

파일시스템이 생성된 파티션에 디렉토리 형태로 접근할 수 있도록 연결하는 작업을 수행하는 것. 즉, 디스크와 디렉토리를 연결하는 것

 

✅ 마운트 포인트

  • 디스크가 연결되는 디렉토리 위치를 의미한다.
  • 마운트된 파일시스템의 루트 디렉토리 역할을 한다.

 

✅ 파일 시스템 마운트 설정 파일

  • 부팅 시 정의된 파일시스템을 자동으로 지정된 마운트 포인트에 마운트한다.
  • 위치: /etc/fstab

 

✅ /etc/fstab 파일 구조

[파일 시스템] [마운트 지점] [파일 시스템 유형] [옵션] [덤프] [패스]
 
  • 파일 시스템: 마운트할 장치나 파일 시스템의 경로 (예: /dev/sda1 또는 UUID).
  • 마운트 지점: 파일 시스템이 마운트될 디렉토리 (예: /mnt/data).
  • 파일 시스템 유형: ext4, NTFS, NFS 등.
  • 옵션: 마운트 옵션 설정 (defaults, ro, rw, noexec 등).
  • 덤프: 백업 유틸리티 dump가 사용할지 여부 (0 또는 1).
  • 패스: fsck 명령어로 부팅 시 파일 시스템 검사 순서를 지정 (0은 검사하지 않음).

 

mount [-t 파일시스템타입] [-o 옵션]  장치명  마운트포인트
  • 명령어 위치: /bin/mount/
  • 인수 없이 사용할 경우 현재 연결된 모든 파일 시스템을 표시한다.
옵션 설명
ro 읽기 전용 마운트
rw 읽기/쓰기 가능 마운트
noe 실행 파일이 실행되지 않도록 설정
user 일반 사용자가 마운트 가능하도록 설정

파일 시스템 구조

 

✅ boot block (부트 블록)

파일시스템에 unix 커널을 적재시키기 위해 부팅 시 필요한 코드를 저장하고 있는 영역

  • 리눅스 운영체제가 처음 실행되면 부트 블록을 제일 먼저 읽어 리눅스를 가동한다.
  • 부트블록이 주기억 장치에 모두 올라가게 되면 리눅스 운영체제는 제일 처음 INIT 프로세스를 가동하게 되고, INIT 프로세스의 PID는 1버닝 부여된다.

 

✅ super block (슈퍼 블록)

파일시스템에 있는 총 블록의 개수, 블록 크기 등 전체 파일시스템에 관한 정보를 가진 영역

  • 슈퍼 블록은 파일시스템의 정보를 유지하는 자료구조이다.
  • 파일 시스템의 크기, 블록 수 등 이용 가능한 빈 블록 리스트와 빈 블록 리스트에서 그 다음 빈 블록을 가리키는 인덱스 정보가 있다.
  • 이외에 i-node의 개수와 목록, 슈퍼 블록이 수정되었는지 나타내는 flag, 파일 시스템 이름과 파일 시스템 디스크 이름 등의 정보가 관리된다.

 

✅ inode

각 파일이나 디렉토리에 대한 대부분의 정보를 가지고 있는 레코드

  • 파일 시스템은 데이터(file data) + 파일 속성(file attribute) 로 구성되어 있다. 여기서 파일 속성을 가르키는 값을 아이노드(i-node)라고 한다.
  • 모든 파일 및 디렉토리는 각자 1개의 아이노드를 가지고 있다.
  • 아이노드가 가리키는 파일 속성에는 파일 크기, 접근 모드, 아이노드 넘버, 소유자 그룹 등의 정보가 들어있다.

 data block

파일시스템에서 실제 데이터가 저장되는 공간

  • 데이터 블록은 일반적으로 고정 크기로 나누어져 있으며, 파일의 내용이 각 블록에 분산되어 장된다.
  • 각 파일은 여러 데이터 블록에 나뉘어 저장될 수 있으며, 아이노드는 해당 데이터 블록의 주소를 참조한다.

umask

사용자가 파일과 디렉토리 생성 시 선언되는 기본 권한을 변경해주기 위해 사용한다.

파일 기본 권한 : 666 (rw-rw-rw-)
디렉터리 기본 권한 : 777 (rwxrwxrwx)
  • 기본값으로 설정한 umask 값의 보수와 AND 연산을 통해 지정
  • 보통 umask는 프로파일(환경설정 파일)에 선언된다.
  • umask를 통해서 default 생성되는 파일은 보안상 절대로 실행권한을 받을 수 없다.

umask 사용자 프로파일($HOME/.bash_profile)에 설정 후 로그아웃 한 다음 umask를 확인하면 설정 값으로 바뀐것을 확인할 수 있다.

 

728x90

'Server > Linux, C' 카테고리의 다른 글

[C언어] Thread  (4) 2025.06.25
[C언어] Makefile / GDB  (0) 2025.05.25
[C언어] 전처리기  (0) 2025.05.25
[C언어] 문자열 (feat. strcpy, strtok_r 활용 예제)  (0) 2025.05.11
[C언어] 기본 입출력 및 비트 연산자  (0) 2025.05.11