Chapter2.2 Linux 파일 종류

2025. 5. 9. 00:17·Linux/Linux 기초

리눅스는 모든 것을 “파일”로 취급하며, 이 파일들은 파일 타입에 따라 나뉘게 된다. 따라서 리눅스에서 파일은 단순히 텍스트나 실행 파일만 의미하지 않게되는데, 주요 파일 종류를 정리하자면 다음과 같다.

기호 이름 설명
- 일반 파일 (Regular File) 텍스트, 바이너리, 실행 파일 등 일반적인 데이터 파일
d 디렉토리 (Directory) 폴더, 다른 파일들을 포함하는 공간
l 심볼릭 링크 (Symbolic Link) 다른 파일을 가리키는 포인터 (바로가기)
b 블록 디바이스 (Block Device) HDD, SSD, USB, SD카드처럼 블록 단위 입출력 장치
c 문자 디바이스 (Character Device) 직렬 포트, 키보드 등 문자 단위 입출력 장치
p FIFO 프로세스 간 통신용, 선입선출 방식의 특수 파일
s 소켓 (Socket) 네트워크 통신이나 IPC에 사용하는 특수 파일

 

이 중에서 일반 파일(-)과 디렉토리(d)를 제외한, 리눅스에서 특수한 목적을 가진 파일 타입들만 설명해보고자 한다. 이들은 주로 디바이스 I/O, 시스템 통신, 파일 시스템 유연성을 위해 존재한다.


1. Hard Link / Soft Link

  • 하드링크: 여러 이름이 같은 데이터 블록(inode)를 가리킴 → 하나라도 남아 있으면 파일 내용은 살아있다. 어떻게 보면 해리포터의 호크룩스와 비슷하다고 생각하면 될듯? 실제 예시를 통해 살펴보자.

우선 test 라는 내용을 담고있는 "test.txt"파일을 만든다.

ln 명령어를 통해 하드링크를 생성 후, ls -il로 inode 값을 확인해보면 같은 inode 값을 갖는 "test_hl.txt" 파일이 생성된 것을 확인할 수 있다.

"test.txt"와 "test_hl.txt"는 동일한 inode를 공유하며, 같은 inode를 참조하므로 어느 한 쪽의 내용을 변경하면 다른 파일에서도 동일한 변경이 반영되는 것을 확인할 수 있다.

또한, 원본 파일 "test.txt"을 삭제한 후에도 하드링크로 생성된 파일 "test_hl.txt"은 여전히 존재하며 정상적으로 내용을 출력하는 것을 통해, 하드링크는 원본 파일의 경로가 사라지더라도 실제 데이터(inode)는 유지된다는 것을 확인할 수 있다.


  • 소프트링크: 원본 파일의 경로(path)만 가리킴 → 원본이 없어지면 링크는 깨진다. 윈도우의 바로가기를 생각하면 된다.

ln -s 명령어로 소프트링크를 생성한 후 ls -l 명령어로 확인해 보면, 링크 파일의 항목 앞에 l이 표시되고 -> 기호를 통해 원본 파일의 경로를 가리키는 심볼릭 링크가 생성된 것을 확인할 수 있다.

test_sl.txt 파일은 test.txt를 가리키는 심볼릭 링크이므로, 링크 파일을 통해 내용을 수정하면 실제로는 test.txt 파일의 내용이 변경되는 것을 확인할 수 있다.

원본인 test.txt가 삭제되면 test_sl.txt는 더 이상 유효한 경로를 참조하지 못하게 되며, 링크는 깨진 상태가 되어 사용할 수 없게 된다.


그렇다면 이런 링크 개념은 왜 필요한걸까? 시스템 설계, 운영, 유지보수, 유연성 확보 측면에서 링크는 굉장히 강력한 도구로 사용된다.

  1. 경로 고정 + 내부 파일 구조 유연화 (소프트링크)
    예: /usr/bin/python은 사실 /usr/bin/python3.11을 가리키는 symlink
    🔸 즉, 프로그램은 /usr/bin/python만 쓰면 되는데,
    → 실제 파이썬 버전은 symlink만 바꾸면 됨 (python3.9 → 3.11로 쉽게 전환)
    $ ls -l /usr/bin/python
    lrwxrwxrwx 1 root root 18 Apr 10 10:00 /usr/bin/python -> /usr/bin/python3.11
  2. 버전 관리 및 롤백 지원 (소프트링크)
    current → v1.2.3 링크 구조
    🔸 사용자 앱은 /opt/myapp/current를 참조
    → 새 버전 배포 시 symlink만 바꾸면 전체 앱이 새 버전으로 전환됨
    → 롤백도 symlink만 이전 버전으로 돌리면 끝
    /opt/myapp/
    ├── v1.2.2/
    ├── v1.2.3/
    └── current -> v1.2.3/
  3. 동일한 파일을 여러 경로에서 접근 (하드링크)
    예: 로그 파일 또는 설정 파일을 동기화된 상태로 유지
    🔸 두 파일 중 어느 쪽을 수정해도 내용은 항상 동일
    → 파일을 복사하는 것보다 디스크 공간도 절약

2. Character Device, Block Device

Block Device와 Character Device는 리눅스에서 /dev/ 아래에 존재하는 디바이스 파일(device file)의 두 가지 주요 타입이다. 두 타입은 아래와 같은 차이점을 가지고 있다.

 


1) Character Device

Character Deivce를 활용한 간단한 예제를 살펴보자. Character device의 대표적인 예로 TTY 장치를 들 수 있다. 리눅스에서 TTY는 사용자와 커널 사이의 입출력 매개체(터미널 인터페이스)를 의미하며, 모든 종류의 터미널 세션 (물리/가상/가상콘솔/시리얼포트 등) 을 통틀어 TTY라고 부른다.

(자세한 내용은 다음 게시글에서 다뤄보겠다)

이 중 /dev/tty 파일은 현재 사용자가 접속한 쉘 터미널 세션과 연결된 문자 디바이스(Character Device)를 가리킨다. 즉, tty는 현재 세션의 입출력 경로를 의미하며, 이 장치 파일에 echo 명령어를 사용하여 데이터를 보내면 해당 터미널에 바로 출력되는 것을 확인할 수 있다.

$ echo "Hello from Character Device" > /dev/tty

 이를 통해 character device가 실시간 입출력(I/O)을 담당하는 특수한 장치 파일임을 직접적으로 확인할 수 있다.


2) Block Device

Block Device도 살펴보자. Block Device의 대표적인 예로는 sda, loop등이 있다. /dev/sda*는 실제 하드디스크를 뜻하며, /dev/loop*는 일반 파일을 디스크처럼 쓸 수 있게 해주는 가상 장치를 뜻한다. 

 

아래 실습 코드를 이해하기 위해서 필요한 기본적인 개념에 대해 먼저 배워보자.

 

✅ 이미지 파일이란?
디스크(저장장치)의 내용을 그대로 담은 파일로, 즉, 실제 디스크처럼 가상 저장소를 뜻한다.
(disk.img, ubuntu.iso, sdcard.img, backup.raw 등)

✅ loop 디바이스란?
이미지 파일을 마치 실제 디스크처럼 인식하게 해주는 가상 블록 장치를 뜻한다. 즉,

[disk.img (파일)] ──(losetup)──▶ [/dev/loopX (가상 디스크)] ──▶ mount

이 과정을 통해 소프트웨어로 만든 disk.img가 /dev/sda처럼 보이는 장치가 된다.

// 1. 10MB짜리 빈 파일 생성
// /dev/zero에서 1MB 크기의 0으로 채워진 블록을 10개 읽어서, disk.img 파일로 저장한다.
dd if=/dev/zero of=disk.img bs=1M count=10

// 2. loop 디바이스에 연결
sudo losetup /dev/loop10 disk.img

// 3. ext4 파일 시스템 생성
sudo mkfs.ext4 /dev/loop10

// 4. 마운트할 디렉토리 생성
sudo mkdir -p /mnt/loop_test

// 5. 마운트
sudo mount /dev/loop10 /mnt/loop_test

// 6. 파일 생성 및 확인
echo "Hello from loop device!" | sudo tee /mnt/loop_test/hello.txt
sudo cat /mnt/loop_test/hello.txt

// 7. 언마운트
sudo umount /mnt/loop_test

// 8. loop 디바이스 해제
sudo losetup -d /dev/loop10

이미지 파일 생성 → loop 연결 → 파일 시스템 생성이 구현된 모습이다.

  • disk.img라는 이름의 10MB짜리 내용이 전부 0인 파일이 생김
  • 파일을 가짜 디스크(/dev/loop13)에 연결함. 이제 커널은 disk.img 파일을 → 진짜 디스크처럼 취급하게 됨
  • /dev/loop13(사실은 disk.img)은 이제 ext4 파일 시스템이 올라간 디스크가 됨

파일 쓰기 → 언마운트 → loop 해제 과정이다. USB나 하드디스크에 파일을 쓰고, 안전하게 "제거"까지 마친 전 과정을 가상으로 실습한 것으로 생각하자.


3. FIFO

리눅스에서 FIFO는 "named pipe"라고 불린다."익명의 파이프는 따로 이름이 없는 통신 채널인데 비해 FIFO 는 mkfifo 함수에 의해 실제로 생성되는 특수 파일이다." 라고 하는데, 정확한 용도를 알아보자.

 

✅ 먼저, "파이프(pipe)"란?
리눅스에서 | 기호는 익명 파이프 (unnamed pipe)라고 불린다. 우리가 자주 사용하는 명령어 간 출력-입력 연결 방식인 그 파이프가 맞다.

echo "hello" | grep h

 

✅ Named Pipe (FIFO), "이름 있는 파이프"란?
파일 시스템 상에 실제로 존재하는 파이프 파일로, mkfifo로 생성되는 파일이다. 두 개의 서로 다른 시점/터미널/프로세스 간 통신이 필요할 때 사용하게 되는데, 아래 예시를 살펴보자.

우선 mkfifo를 통해 test라고 하는 FIFO 파일을 만들어주자. FIFO는 읽기/쓰기 두 쪽이 동시에 준비되어야 동작하는 통신 채널로, cat / echo 명령어를 통해 간단히 확인할 수 있다.

왼쪽 터미널에서 cat test 명령어를 입력하면, 쓰는 쪽 프로세스가 연결되기 전까지 해당 터미널은 대기 상태(blocking)에 들어간다.
이후 오른쪽 터미널에서 echo "..." > test처럼 쓰기 프로세스를 실행해 데이터를 FIFO에 전달하면, 대기 중이던 cat 명령어가 데이터를 수신하고 종료된다.

반대로, 먼저 echo 명령어로 데이터를 쓰려고 시도하면, 읽기 측 프로세스가 준비되지 않은 상태에서는 echo 명령어 또한 대기 상태에 들어간다. 여기서 cat test 프로세스를 실행하면 데이터 송수신과 함께 종료된다.
이처럼 FIFO(named pipe)는 읽기와 쓰기 측이 모두 연결되어야만 데이터가 전달되며, 이를 통해 FIFO가 양쪽 프로세스의 동기화가 필요한 통신 구조임을 확인할 수 있다.


4. Socket

사실 소켓과 관련해서는 적을 내용이 너무나도 많기에 이 부분에 있어서는 따로 게시글을 작성할 예정이다. 우선은 소켓 파일은 “파일처럼 생긴 통신용 장치”이다. 정도로 파악해두자.

'Linux > Linux 기초' 카테고리의 다른 글

Chapter3. Useful Command Line Techniques  (0) 2025.05.09
Chapter2.3 Systemd에 대하여  (0) 2025.05.09
Chapter2.1 Linux FHS(Filesystem Hierarchy Standard)  (1) 2025.05.08
Chapter2. Linux Basics and System Startup  (0) 2025.05.08
Chapter1. Linux Philosophy and Concepts  (0) 2025.05.07
'Linux/Linux 기초' 카테고리의 다른 글
  • Chapter3. Useful Command Line Techniques
  • Chapter2.3 Systemd에 대하여
  • Chapter2.1 Linux FHS(Filesystem Hierarchy Standard)
  • Chapter2. Linux Basics and System Startup
Dinoj
Dinoj
  • Dinoj
    AlOG
    Dinoj
  • 전체
    오늘
    어제
    • 분류 전체보기 (181)
      • 이론 공부 (63)
        • 기타 학습 (20)
        • UVM (Universal Verification.. (12)
        • AI HARDWARE (12)
        • COMPUTER VISION (18)
        • Python (Pytorch) (1)
      • PROJECTS (29)
        • AI 가속기 (10)
        • 영상 처리 (3)
        • UVM (Universal Verification.. (2)
        • CPU 설계 (5)
        • CMOS VLSI (2)
        • Verilog (2)
        • Firmware (2)
        • C 언어 (2)
        • 기타 프로젝트 (1)
      • Linux (13)
        • Embedded Linux (7)
        • Linux 기초 (6)
      • AMBA BUS (16)
        • AXI BUS (5)
        • APB BUS (2)
        • Vitis (8)
      • AI SOC COURSE (53)
        • 영상 처리 (5)
        • SYSTEM VERILOG (CPU 설계) (20)
        • VERILOG 기초 (5)
        • CMOS VLSI (7)
        • FIRMWARE (9)
        • C PROGRAMMING (1)
        • Python (Keras) (6)
      • 코딩 지식 (5)
        • SYSTEM VERILOG (3)
        • TCL (2)
      • TISTORY (1)
  • 블로그 메뉴

    • 홈
    • 글쓰기
    • 관리
    • Info
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Dinoj
Chapter2.2 Linux 파일 종류
상단으로

티스토리툴바