개념 사전 · 개념

파일 시스템과 inode

File System · 파일시스템 · inode · 아이노드

파일 시스템은 저장 공간을 파일과 디렉터리로 조직하고 이름·내용·메타데이터를 관리하는 규칙과 구현이다. 의 는 파일 객체의 정보를 나타내며, 디렉터리 이름과 열린 는 이 객체를 가리키는 서로 다른 층이다.

밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.

01무엇이고, 어떤 일을 하나

  • 경로 이름을 파일 객체에 연결하고 계층적인 디렉터리 탐색을 제공한다.
  • 소유권·접근 모드·크기·시간·데이터 위치 정보를 관리한다.
  • 를 통해 여러 파일 시스템을 공통 파일 연산으로 사용할 수 있게 한다.

02어떤 순서로 동작하나

  1. 탐색 기준 선택

    절대 경로는 루트에서, 일반 상대 경로는 현재 작업 디렉터리에서 탐색을 시작한다.

  2. 구성 요소 탐색

    디렉터리 이름을 차례로 따라가며 탐색 권한과 링크·마운트 경계를 적용한다.

  3. 파일 객체 확인

    최종 에서 를 찾아 파일 유형과 요청 접근을 검사한다.

  4. 열린 참조 사용

    open이 성공하면 fd를 반환하고 이후 read·write는 열린 참조를 통해 실제 파일 시스템 연산을 수행한다.

03먼저 알아둘 용어와 구성요소

에는 파일 종류, 소유 UID와 GID, 접근 모드, 크기, 시간 정보, 링크 수와 데이터 위치를 찾기 위한 정보가 들어간다. 파일 이름 자체를 안에 하나만 저장하는 구조가 아니므로 서로 다른 두 이름이 같은 파일 객체를 가리킬 수 있다.
는 해당 파일 시스템 안에서만 의미가 있다. 다른 장치의 가 같다고 같은 파일은 아니다.
디렉터리 안에서 파일 이름을 등 파일 객체의 식별 정보에 연결하는 항목이다. 커널은 경로 구성요소를 차례로 탐색하여 마지막 이름이 가리키는 객체를 찾는다.
는 이 과정을 공통 인터페이스로 제공하며 실제 디스크 배치는 ext4, XFS 등 파일 시스템 구현이 맡는다.
open이 성공하면 는 정수인 를 받는다.
의 fd 테이블은 작은 정수 번호를 에 연결한다. 에는 현재 오프셋·파일 상태 플래그가 있고 그 아래 파일 객체가 연결된다.
LEARN THROUGH PRACTICE

102MiB 디스크에서 101MiB 파티션이 나오는 이유 계산하기

디스크 크기·논리 섹터·파티션 시작과 끝을 계산하고, 파티션 생성과 파일 시스템 준비를 구별한다.

실습 구성과 전제

  • 작은 가상 디스크 여러 개를 연결한 실습 화면이다. /dev/sda 같은 장치 이름은 환경마다 달라지므로 실제 대상은 크기와 식별자로 확인한다.
  • 아래 명령은 조회용이다. 파티션 생성·포맷 명령은 기존 자료를 손상시킬 수 있으므로 이 실습에 포함하지 않는다.
  1. 디스크 전체를 섹터 수로 환산한다

    • 첫 화면의 한 디스크는 106,954,752바이트, 208,896섹터다. 논리 섹터 512바이트를 곱하면 두 값이 일치한다.
    • 106,954,752 ÷ 1,048,576 = 102이므로 이 도구의 102MiB 표시는 2의 거듭제곱 단위에 따른 값이다. MB와 MiB를 같은 수치 단위로 섞지 않는다.
    bash
    lsblk -o NAME,SIZE,TYPE,LOG-SEC,PHY-SEC,FSTYPE,MOUNTPOINTS
    sudo fdisk -l /dev/sda

    장치 이름을 확인한 뒤 해당 디스크의 섹터·파티션 정보를 읽는다.

    5/28-raid · 실습·개념 참고 화면 6원본 크기로 보기 ↗
    • 각 가상 디스크는 102MiB와 106954752 bytes로 표시된다.
    • Sector size 줄은 logical/physical 모두 512 bytes이고 총 208896 sectors가 보인다.
    확인 기준

    계산에는 실제 출력의 논리 섹터 크기를 사용한다. 모든 디스크가 항상 512바이트라고 일반화하지 않는다.

  2. 포함 범위의 끝을 반영해 파티션 크기를 계산한다

    • 두 번째 화면의 시작은 2048, 끝은 208895이다. 양 끝을 포함하므로 섹터 수는 208895−2048+1 = 206848이다.
    • 206848×512 = 105906176바이트 = 101MiB다. 앞의 2048섹터는 1MiB에 해당하지만 그 전체가 MBR 자체인 것은 아니다. 전통적인 MBR 레코드는 첫 섹터에 있고 시작 정렬 여유 등이 별도로 존재한다.
    5/28-raid · 실습·개념 참고 화면 15원본 크기로 보기 ↗
    • Disklabel type은 dos이고 sda1의 Start=2048, End=208895, Sectors=206848이 보인다.
    • 크기는 101M, Id는 83, Type은 Linux로 표시된다.
    확인 기준

    Id 83 표시는 파티션 타입이다. 이것만으로 구성··ext4 포맷이 완료되었다고 판단하지 않는다.

  3. 파일 시스템과 마운트 상태를 별도로 연결한다

    • 파티션은 사용할 블록 범위를 정한다. 파일 시스템은 그 범위에 디렉터리··데이터 배치를 만들며, 마운트는 이를 경로 트리에 연결한다.
    • lsblk의 TYPE, FSTYPE, MOUNTPOINTS를 차례로 읽으면 파티션만 생성된 상태인지, 포맷되었지만 마운트되지 않았는지 구분할 수 있다.
    bash
    lsblk -f
    findmnt --source /dev/sda1

    파일 시스템 종류와 현재 마운트를 조회하는 예시다.

    확인 기준

    파티션이 보이는데 디렉터리에서 파일을 못 찾으면 마운트 여부와 실제 원본 장치를 확인한다. 크기 차이를 곧바로 손실이나 오류라고 판단하지 않는다.

실습에서 확인한 동작 원리

  • 바이트 수는 섹터 수×논리 섹터 크기로 검산하고, 파티션의 시작·끝은 포함 범위로 계산한다.
  • 디스크, 파티션, 파일 시스템, 마운트는 별도의 준비 단계다.
관련 개념·전체 실습 화면 이어서 읽기 →
동작·명령 참고 문서
LEARN THROUGH PRACTICE

RAID 1의 정상·저하·멤버 교체 상태 읽기

같은 MD 배열의 멤버 수와 역할을 추적해, 데이터가 읽히는 상태와 중복성이 복구된 상태를 구별한다.

실습 구성과 전제

  • 화면은 가상 디스크로 만든 1 배열 /dev/md1의 장애 주입 및 멤버 교체 실습이다. 실제 운영 장치에 장애 명령을 적용하지 않는다.
  • 세 화면은 배열 식별 정보와 멤버 표를 대조해 읽는다. 아래에서는 조회 명령만 제시한다.
  1. 정상 배열의 기준을 기록한다

    • Level이 raid1이고 두 멤버가 active sync라면 같은 논리 데이터를 두 장치에 유지하는 구성을 읽을 수 있다. usable 용량은 두 디스크 용량의 단순 합이 아니다.
    • State뿐 아니라 Devices, Active Devices, Failed Devices, 멤버 역할을 기록해야 이후 변화가 분명해진다.
    bash
    sudo mdadm --detail /dev/md1
    cat /proc/mdstat

    배열 상태와 커널의 MD 요약을 조회한다.

    5/28-raid · 명령·상태 출력 28원본 크기로 보기 ↗
    • 배열 상태는 clean, Active Devices는 2, Failed Devices는 0이다.
    • sda1과 sdb1이 각각 active sync로 표시되고 배열 크기는 약 100MiB다.
    확인 기준

    clean 한 단어만 확인하지 말고 기대 멤버 수와 실제 active 수가 일치하는지 본다.

  2. 장애 이후 읽기 가능성과 중복성 손실을 분리한다

    • 장애를 주입한 뒤 State는 clean, degraded로 바뀐다. surviving 멤버가 남아 서비스가 이어질 수 있지만 추가 장애에 대한 보호는 줄어든다.
    • clean은 기록된 배열 상태를 설명하며, degraded와 함께 나올 수 있다. 파일이 읽힌다는 사실만으로 두 복제본이 모두 정상이라고 판단하지 않는다.
    5/28-raid · 명령·상태 출력 35원본 크기로 보기 ↗
    • Active Devices는 1, Failed Devices는 1로 바뀐다.
    • sdb1은 faulty로, 한 RAID 슬롯은 removed로 나타나고 sda1이 active sync로 남아 있다.
    확인 기준

    이 실습의 faulty 표시는 의도한 장애 주입 결과다. 실제 장치 고장 원인을 이 화면만으로 진단한 것은 아니다.

  3. 교체 후 배열 참여와 재동기화 완료를 확인한다

    • 새 장치를 추가하면 재구축 중 상태를 거쳐 동기화된 멤버가 된다. 두 번째 장치를 인식했다는 사실만으로 복구가 끝났다고 판단하지 않는다.
    • 마지막 화면은 sde1이 active sync로 참여하고 Active Devices 2, Failed Devices 0으로 돌아온 결과를 보여 준다. 재구축 진행률 자체는 이 정지 화면에 보이지 않는다.
    5/28-raid · 명령·상태 출력 41원본 크기로 보기 ↗
    • sda1과 sde1이 active sync로 나열된다.
    • State는 clean이고 Active Devices=2, Failed Devices=0으로 표시된다.
    확인 기준

    멤버 수와 역할, /proc/mdstat의 재동기화 표시, 파일 시스템 접근을 모두 확인한다. 는 실수 삭제까지 되돌리는 백업이 아니다.

실습에서 확인한 동작 원리

  • 1은 한 멤버가 고장 나도 동작할 수 있지만 degraded 동안 중복 보호가 약해진다.
  • 장치 추가, 재구축 진행, active sync 복귀는 서로 다른 상태이며 백업 복원과도 다르다.
관련 개념·전체 실습 화면 이어서 읽기 →
동작·명령 참고 문서
LEARN THROUGH PRACTICE

smbclient 전송과 CIFS 마운트를 같은 파일 서비스의 두 경로로 읽기

SMB 인증·파일 전송·로컬 마운트 표시를 구별하고 각 결과가 증명하는 접근 범위를 정한다.

실습 구성과 전제

  • 첫 화면은 smbclient의 대화형 파일 전송, 두 번째는 커널 CIFS 마운트 조회 사례다. 화면의 계정과 주소를 아래에서는 실습 예시로 대체한다.
  • 준비된 SMB 서버·공유·테스트 파일이 있어야 한다. 암호를 명령 인수나 본문에 적지 않고 대화형 입력 또는 별도 보호된 자격 정보 방식을 사용한다.
  1. 공유에 접속한 뒤 실제 파일 전송 결과를 읽는다

    • smbclient의 로그인 성공은 세션을 얻었다는 뜻이다. put 이후 전송 바이트와 원격 ls 결과를 확인해야 파일 생성 권한과 결과를 연결할 수 있다.
    • 화면에서는 hello.txt 업로드 뒤 목록에 6바이트 파일이 보인다. 공유 전체의 모든 경로에 쓰기가 허용된다는 뜻은 아니다.
    bash
    smbclient //192.0.2.20/lab-share -U labuser
    # smb 프롬프트에서: ls
    # 준비한 무해한 파일만 전송: put lab.txt

    주소·공유·계정을 재구성한 예시다. 암호는 프롬프트에서 입력한다.

    5/22 - samba / ftp · 실습·개념 참고 화면 30원본 크기로 보기 ↗
    • smbclient의 대화형 프롬프트에서 put hello.txt가 실행된다.
    • 이어지는 ls 목록에 hello.txt 6바이트와 다른 파일 2156바이트가 보인다.
    확인 기준

    업로드가 성공했더라도 서버 파일 소유자··다른 디렉터리 권한은 별도로 확인한다.

  2. 마운트가 로컬 경로에 제공하는 인터페이스를 읽는다

    • CIFS 마운트는 SMB 파일 서비스를 경로 아래에서 일반 파일 연산처럼 사용하게 한다. 서버 저장 장치의 NTFS를 ext4로 바꾸는 작업은 아니다.
    • 마운트 출력의 vers는 협상된 프로토콜, rw는 해당 마운트의 읽기·쓰기 모드다. uid·gid·file_mode 등은 클라이언트가 권한을 표현·검사하는 방식과 관련되며 서버의 접근 허용을 무조건 덮어쓰지 않는다.
    5/22 - samba / ftp · 실습·개념 참고 화면 34원본 크기로 보기 ↗
    • 원격 공유가 /home/win_share에 type cifs로 연결되어 있다.
    • 옵션에는 rw, vers=3.1.1, uid=0, gid=0과 file_mode·dir_mode=0755가 보인다.
    확인 기준

    rw 마운트라는 표시만으로 서버가 쓰기를 허용했다고 단정하지 않는다. 서버 공유 정책·계정 권한과 실제 연산 결과를 함께 본다.

  3. 같은 파일을 서비스와 경로 양쪽에서 대조한다

    • 원격 목록과 마운트 경로의 stat를 비교하면 같은 파일이 보이는지와 크기를 확인할 수 있다. 필요하면 무해한 테스트 파일을 내려받아 해시로 내용도 대조한다.
    • 인증 실패, 공유 경로 오류, 개별 파일 거부를 구별한다. 디렉터리 목록 성공과 새 파일 생성 성공은 서로 다른 요청이다.
    bash
    findmnt -t cifs
    stat /mnt/lab-share/lab.txt
    sha256sum /mnt/lab-share/lab.txt

    이미 마운트된 실습 경로를 조회하는 예시다.

    확인 기준

    양쪽에서 크기는 같은데 내용이 의심되면 해시와 읽기 결과를 비교한다. 데이터 변경이 동시에 일어나는 환경에서는 관찰 시각도 기록한다.

실습에서 확인한 동작 원리

  • SMB 클라이언트 세션과 CIFS 마운트는 같은 파일 서비스에 접근하는 다른 인터페이스다.
  • 인증, 공유 접근, 파일별 권한, 실제 전송 결과를 따로 확인해야 성공 범위를 정확히 말할 수 있다.
관련 개념·전체 실습 화면 이어서 읽기 →
동작·명령 참고 문서
LEARN THROUGH PRACTICE

서로 다른 포트의 가상 서버가 문서 루트를 선택하는 과정

listen 포트와 root·index·try_files를 실제 설정에 대입해 요청할 URL과 파일 경로를 계산한다.

실습 구성과 전제

  • 포트 83·84·85를 나눈 설정 화면과 기본 포트의 환영 페이지는 별도 구성 사례다. 환영 페이지를 세 가상 서버의 성공 증거로 사용하지 않는다.
  • 예시 경로는 /srv/lab-a로 재구성한다. 설정을 실제 적용한다면 준비된 실습 서버와 파일 접근 권한이 있어야 한다.
  1. 요청이 들어올 포트와 server 블록을 대응시킨다

    • 화면은 server 블록 세 개에 서로 다른 listen 포트를 둔다. 클라이언트가 어떤 포트로 연결했는지에 따라 먼저 선택 가능한 서버 집합이 달라진다.
    • server_name _는 특별한 모든 이름 매칭 연산자가 아니다. 해당 주소·포트의 default_server 또는 기본 서버 선택과 Host 이름 비교 규칙을 함께 읽어야 한다.
    5/20 - ip/port (virtual host) · 실습·개념 참고 화면 5원본 크기로 보기 ↗
    • 세 블록의 listen 값은 83, 84, 85로 나뉘고 IPv6 listen도 각각 있다.
    • 블록마다 root 경로가 다르고 index index.html, try_files $uri $uri/ =404가 반복된다.
    확인 기준

    포트를 생략한 http URL은 보통 80으로 연결하므로 83·84·85 서버 확인과 다르다.

  2. URI를 문서 루트 아래 파일로 계산한다

    • 재구성 설정에서 /guide.html은 /srv/lab-a/guide.html로 연결된다. / 요청은 디렉터리와 index 처리까지 이어지므로 파일 요청과 처리 경로가 다를 수 있다.
    • try_files는 정해진 경로에 후보가 존재하는지 확인하고 모두 없으면 지정한 404로 끝낸다. 파일 존재 외에도 웹 서버 계정의 경로 검색·읽기 권한이 필요하다.
    server {
        listen 8083;
        server_name lab.example.test;
        root /srv/lab-a;
        index index.html;
        location / {
            try_files $uri $uri/ =404;
        }
    }

    8083과 /srv/lab-a로 재구성한 독립 server 예시다.

    확인 기준

    요청 URL과 예상 파일 경로를 먼저 적고 실제 파일·권한·접근 로그를 대조한다. 404와 접근 거부를 같은 문제로 처리하지 않는다.

  3. 응답 화면이 어느 요청을 검증했는지 한정한다

    • 환영 페이지는 해당 URL에서 기본 문서가 응답한 결과다. 사용자별 root나 다른 listen 포트가 올바르다는 결과로 확대하지 않는다.
    • 구성 검사 후 해당 포트와 Host를 지정해 요청하고 예상 문서의 고유 내용을 확인한다. -t 성공은 문법·참조 파일 검사이며 모든 URL의 정상 응답을 보장하지 않는다.
    bash
    sudo nginx -t
    curl -i -H "Host: lab.example.test" http://127.0.0.1:8083/guide.html

    재구성한 포트와 Host를 명시해 실제 문서 응답을 확인한다.

    LEMP - Ubuntu · 실습·개념 참고 화면 1원본 크기로 보기 ↗
    • 브라우저에는 Nginx 기본 환영 문서가 보인다.
    • 주소는 별도 사용자 포트 구분 없이 기본 웹 요청 형태이므로 앞의 83·84·85 블록을 직접 검증한 화면은 아니다.
    확인 기준

    기본 환영 페이지만 나오면 실제 요청의 포트·Host와 선택된 서버를 먼저 확인한다.

실습에서 확인한 동작 원리

  • 가상 서버 선택과 파일 경로 계산은 서로 다른 처리 단계다.
  • 기본 페이지 한 장의 성공을 모든 포트·도메인·문서 루트의 성공으로 확대하지 않는다.
관련 개념·전체 실습 화면 이어서 읽기 →
동작·명령 참고 문서

04예제로 따라가기

  • report.txt와 report-copy.txt가 같은 를 가리키는 하드 링크이면 한 이름으로 수정한 내용이 다른 이름에서도 보인다.
  • 이름을 지웠어도 서비스가 해당 파일을 열고 있으면 열린 참조가 남아 저장 공간이 즉시 회수되지 않을 수 있다.
  • /srv/data에 다른 파일 시스템을 마운트하면 기존 디렉터리 내용은 삭제되는 대신 가려지고 새 파일 시스템의 루트가 보인다.

05혼동하기 쉬운 점과 확인 기준

  • a/b/c를 열 때 b가 일반 파일이면 중간 요소를 디렉터리로 통과할 수 없다. 최종 c의 권한을 바꾸어 해결되는 문제가 아니다.
  • 경로의 디렉터리 탐색 권한 또는 최종 파일 접근 권한에서 거부될 수 있다. 대상 파일의 mode만 읽지 말고 경로 각 요소의 실행 주체를 대입한다.
  • 같은 이름을 재생성했는데 서비스 출력이 보이지 않으면 열린 fd의 대상과 현재 경로의 를 비교한다. 이름이 같아도 기존 서비스가 삭제된 이전 객체를 계속 쓸 수 있다.

06상세 노트 · 실습 자료

헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.

공식 문서 · 표준

기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.