파일 시스템과 inode
File System · 파일시스템 · inode · 아이노드
파일 시스템은 저장 공간을 파일과 디렉터리로 조직하고 이름·내용·메타데이터를 관리하는 규칙과 구현이다. 의 는 파일 객체의 정보를 나타내며, 디렉터리 이름과 열린 는 이 객체를 가리키는 서로 다른 층이다.
밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.
01무엇이고, 어떤 일을 하나
- 경로 이름을 파일 객체에 연결하고 계층적인 디렉터리 탐색을 제공한다.
- 소유권·접근 모드·크기·시간·데이터 위치 정보를 관리한다.
- 를 통해 여러 파일 시스템을 공통 파일 연산으로 사용할 수 있게 한다.
02어떤 순서로 동작하나
- 탐색 기준 선택
절대 경로는 루트에서, 일반 상대 경로는 현재 작업 디렉터리에서 탐색을 시작한다.
- 구성 요소 탐색
디렉터리 이름을 차례로 따라가며 탐색 권한과 링크·마운트 경계를 적용한다.
- 파일 객체 확인
최종 에서 를 찾아 파일 유형과 요청 접근을 검사한다.
- 열린 참조 사용
open이 성공하면 fd를 반환하고 이후 read·write는 열린 참조를 통해 실제 파일 시스템 연산을 수행한다.
03먼저 알아둘 용어와 구성요소
- 에는 파일 종류, 소유 UID와 GID, 접근 모드, 크기, 시간 정보, 링크 수와 데이터 위치를 찾기 위한 정보가 들어간다. 파일 이름 자체를 안에 하나만 저장하는 구조가 아니므로 서로 다른 두 이름이 같은 파일 객체를 가리킬 수 있다.
- 는 해당 파일 시스템 안에서만 의미가 있다. 다른 장치의 가 같다고 같은 파일은 아니다.
- 디렉터리 안에서 파일 이름을 등 파일 객체의 식별 정보에 연결하는 항목이다. 커널은 경로 구성요소를 차례로 탐색하여 마지막 이름이 가리키는 객체를 찾는다.
- 는 이 과정을 공통 인터페이스로 제공하며 실제 디스크 배치는 ext4, XFS 등 파일 시스템 구현이 맡는다.
- open이 성공하면 는 정수인 를 받는다.
- 의 fd 테이블은 작은 정수 번호를 에 연결한다. 에는 현재 오프셋·파일 상태 플래그가 있고 그 아래 파일 객체가 연결된다.
102MiB 디스크에서 101MiB 파티션이 나오는 이유 계산하기
디스크 크기·논리 섹터·파티션 시작과 끝을 계산하고, 파티션 생성과 파일 시스템 준비를 구별한다.
실습 구성과 전제
- 작은 가상 디스크 여러 개를 연결한 실습 화면이다. /dev/sda 같은 장치 이름은 환경마다 달라지므로 실제 대상은 크기와 식별자로 확인한다.
- 아래 명령은 조회용이다. 파티션 생성·포맷 명령은 기존 자료를 손상시킬 수 있으므로 이 실습에 포함하지 않는다.
디스크 전체를 섹터 수로 환산한다
- 첫 화면의 한 디스크는 106,954,752바이트, 208,896섹터다. 논리 섹터 512바이트를 곱하면 두 값이 일치한다.
- 106,954,752 ÷ 1,048,576 = 102이므로 이 도구의 102MiB 표시는 2의 거듭제곱 단위에 따른 값이다. MB와 MiB를 같은 수치 단위로 섞지 않는다.
bashlsblk -o NAME,SIZE,TYPE,LOG-SEC,PHY-SEC,FSTYPE,MOUNTPOINTS sudo fdisk -l /dev/sda장치 이름을 확인한 뒤 해당 디스크의 섹터·파티션 정보를 읽는다.
원본 크기로 보기 ↗- 각 가상 디스크는 102MiB와 106954752 bytes로 표시된다.
- Sector size 줄은 logical/physical 모두 512 bytes이고 총 208896 sectors가 보인다.
확인 기준계산에는 실제 출력의 논리 섹터 크기를 사용한다. 모든 디스크가 항상 512바이트라고 일반화하지 않는다.
포함 범위의 끝을 반영해 파티션 크기를 계산한다
- 두 번째 화면의 시작은 2048, 끝은 208895이다. 양 끝을 포함하므로 섹터 수는 208895−2048+1 = 206848이다.
- 206848×512 = 105906176바이트 = 101MiB다. 앞의 2048섹터는 1MiB에 해당하지만 그 전체가 MBR 자체인 것은 아니다. 전통적인 MBR 레코드는 첫 섹터에 있고 시작 정렬 여유 등이 별도로 존재한다.
원본 크기로 보기 ↗- Disklabel type은 dos이고 sda1의 Start=2048, End=208895, Sectors=206848이 보인다.
- 크기는 101M, Id는 83, Type은 Linux로 표시된다.
확인 기준Id 83 표시는 파티션 타입이다. 이것만으로 구성··ext4 포맷이 완료되었다고 판단하지 않는다.
파일 시스템과 마운트 상태를 별도로 연결한다
- 파티션은 사용할 블록 범위를 정한다. 파일 시스템은 그 범위에 디렉터리··데이터 배치를 만들며, 마운트는 이를 경로 트리에 연결한다.
- lsblk의 TYPE, FSTYPE, MOUNTPOINTS를 차례로 읽으면 파티션만 생성된 상태인지, 포맷되었지만 마운트되지 않았는지 구분할 수 있다.
bashlsblk -f findmnt --source /dev/sda1파일 시스템 종류와 현재 마운트를 조회하는 예시다.
확인 기준파티션이 보이는데 디렉터리에서 파일을 못 찾으면 마운트 여부와 실제 원본 장치를 확인한다. 크기 차이를 곧바로 손실이나 오류라고 판단하지 않는다.
실습에서 확인한 동작 원리
- 바이트 수는 섹터 수×논리 섹터 크기로 검산하고, 파티션의 시작·끝은 포함 범위로 계산한다.
- 디스크, 파티션, 파일 시스템, 마운트는 별도의 준비 단계다.
동작·명령 참고 문서
RAID 1의 정상·저하·멤버 교체 상태 읽기
같은 MD 배열의 멤버 수와 역할을 추적해, 데이터가 읽히는 상태와 중복성이 복구된 상태를 구별한다.
실습 구성과 전제
- 화면은 가상 디스크로 만든 1 배열 /dev/md1의 장애 주입 및 멤버 교체 실습이다. 실제 운영 장치에 장애 명령을 적용하지 않는다.
- 세 화면은 배열 식별 정보와 멤버 표를 대조해 읽는다. 아래에서는 조회 명령만 제시한다.
정상 배열의 기준을 기록한다
- Level이 raid1이고 두 멤버가 active sync라면 같은 논리 데이터를 두 장치에 유지하는 구성을 읽을 수 있다. usable 용량은 두 디스크 용량의 단순 합이 아니다.
- State뿐 아니라 Devices, Active Devices, Failed Devices, 멤버 역할을 기록해야 이후 변화가 분명해진다.
bashsudo mdadm --detail /dev/md1 cat /proc/mdstat배열 상태와 커널의 MD 요약을 조회한다.
원본 크기로 보기 ↗- 배열 상태는 clean, Active Devices는 2, Failed Devices는 0이다.
- sda1과 sdb1이 각각 active sync로 표시되고 배열 크기는 약 100MiB다.
확인 기준clean 한 단어만 확인하지 말고 기대 멤버 수와 실제 active 수가 일치하는지 본다.
장애 이후 읽기 가능성과 중복성 손실을 분리한다
- 장애를 주입한 뒤 State는 clean, degraded로 바뀐다. surviving 멤버가 남아 서비스가 이어질 수 있지만 추가 장애에 대한 보호는 줄어든다.
- clean은 기록된 배열 상태를 설명하며, degraded와 함께 나올 수 있다. 파일이 읽힌다는 사실만으로 두 복제본이 모두 정상이라고 판단하지 않는다.
원본 크기로 보기 ↗- Active Devices는 1, Failed Devices는 1로 바뀐다.
- sdb1은 faulty로, 한 RAID 슬롯은 removed로 나타나고 sda1이 active sync로 남아 있다.
확인 기준이 실습의 faulty 표시는 의도한 장애 주입 결과다. 실제 장치 고장 원인을 이 화면만으로 진단한 것은 아니다.
교체 후 배열 참여와 재동기화 완료를 확인한다
- 새 장치를 추가하면 재구축 중 상태를 거쳐 동기화된 멤버가 된다. 두 번째 장치를 인식했다는 사실만으로 복구가 끝났다고 판단하지 않는다.
- 마지막 화면은 sde1이 active sync로 참여하고 Active Devices 2, Failed Devices 0으로 돌아온 결과를 보여 준다. 재구축 진행률 자체는 이 정지 화면에 보이지 않는다.
원본 크기로 보기 ↗- sda1과 sde1이 active sync로 나열된다.
- State는 clean이고 Active Devices=2, Failed Devices=0으로 표시된다.
확인 기준멤버 수와 역할, /proc/mdstat의 재동기화 표시, 파일 시스템 접근을 모두 확인한다. 는 실수 삭제까지 되돌리는 백업이 아니다.
실습에서 확인한 동작 원리
- 1은 한 멤버가 고장 나도 동작할 수 있지만 degraded 동안 중복 보호가 약해진다.
- 장치 추가, 재구축 진행, active sync 복귀는 서로 다른 상태이며 백업 복원과도 다르다.
동작·명령 참고 문서
smbclient 전송과 CIFS 마운트를 같은 파일 서비스의 두 경로로 읽기
SMB 인증·파일 전송·로컬 마운트 표시를 구별하고 각 결과가 증명하는 접근 범위를 정한다.
실습 구성과 전제
- 첫 화면은 smbclient의 대화형 파일 전송, 두 번째는 커널 CIFS 마운트 조회 사례다. 화면의 계정과 주소를 아래에서는 실습 예시로 대체한다.
- 준비된 SMB 서버·공유·테스트 파일이 있어야 한다. 암호를 명령 인수나 본문에 적지 않고 대화형 입력 또는 별도 보호된 자격 정보 방식을 사용한다.
공유에 접속한 뒤 실제 파일 전송 결과를 읽는다
- smbclient의 로그인 성공은 세션을 얻었다는 뜻이다. put 이후 전송 바이트와 원격 ls 결과를 확인해야 파일 생성 권한과 결과를 연결할 수 있다.
- 화면에서는 hello.txt 업로드 뒤 목록에 6바이트 파일이 보인다. 공유 전체의 모든 경로에 쓰기가 허용된다는 뜻은 아니다.
bashsmbclient //192.0.2.20/lab-share -U labuser # smb 프롬프트에서: ls # 준비한 무해한 파일만 전송: put lab.txt주소·공유·계정을 재구성한 예시다. 암호는 프롬프트에서 입력한다.
원본 크기로 보기 ↗- smbclient의 대화형 프롬프트에서 put hello.txt가 실행된다.
- 이어지는 ls 목록에 hello.txt 6바이트와 다른 파일 2156바이트가 보인다.
확인 기준업로드가 성공했더라도 서버 파일 소유자··다른 디렉터리 권한은 별도로 확인한다.
마운트가 로컬 경로에 제공하는 인터페이스를 읽는다
- CIFS 마운트는 SMB 파일 서비스를 경로 아래에서 일반 파일 연산처럼 사용하게 한다. 서버 저장 장치의 NTFS를 ext4로 바꾸는 작업은 아니다.
- 마운트 출력의 vers는 협상된 프로토콜, rw는 해당 마운트의 읽기·쓰기 모드다. uid·gid·file_mode 등은 클라이언트가 권한을 표현·검사하는 방식과 관련되며 서버의 접근 허용을 무조건 덮어쓰지 않는다.
원본 크기로 보기 ↗- 원격 공유가 /home/win_share에 type cifs로 연결되어 있다.
- 옵션에는 rw, vers=3.1.1, uid=0, gid=0과 file_mode·dir_mode=0755가 보인다.
확인 기준rw 마운트라는 표시만으로 서버가 쓰기를 허용했다고 단정하지 않는다. 서버 공유 정책·계정 권한과 실제 연산 결과를 함께 본다.
같은 파일을 서비스와 경로 양쪽에서 대조한다
- 원격 목록과 마운트 경로의 stat를 비교하면 같은 파일이 보이는지와 크기를 확인할 수 있다. 필요하면 무해한 테스트 파일을 내려받아 해시로 내용도 대조한다.
- 인증 실패, 공유 경로 오류, 개별 파일 거부를 구별한다. 디렉터리 목록 성공과 새 파일 생성 성공은 서로 다른 요청이다.
bashfindmnt -t cifs stat /mnt/lab-share/lab.txt sha256sum /mnt/lab-share/lab.txt이미 마운트된 실습 경로를 조회하는 예시다.
확인 기준양쪽에서 크기는 같은데 내용이 의심되면 해시와 읽기 결과를 비교한다. 데이터 변경이 동시에 일어나는 환경에서는 관찰 시각도 기록한다.
실습에서 확인한 동작 원리
- SMB 클라이언트 세션과 CIFS 마운트는 같은 파일 서비스에 접근하는 다른 인터페이스다.
- 인증, 공유 접근, 파일별 권한, 실제 전송 결과를 따로 확인해야 성공 범위를 정확히 말할 수 있다.
서로 다른 포트의 가상 서버가 문서 루트를 선택하는 과정
listen 포트와 root·index·try_files를 실제 설정에 대입해 요청할 URL과 파일 경로를 계산한다.
실습 구성과 전제
- 포트 83·84·85를 나눈 설정 화면과 기본 포트의 환영 페이지는 별도 구성 사례다. 환영 페이지를 세 가상 서버의 성공 증거로 사용하지 않는다.
- 예시 경로는 /srv/lab-a로 재구성한다. 설정을 실제 적용한다면 준비된 실습 서버와 파일 접근 권한이 있어야 한다.
요청이 들어올 포트와 server 블록을 대응시킨다
- 화면은 server 블록 세 개에 서로 다른 listen 포트를 둔다. 클라이언트가 어떤 포트로 연결했는지에 따라 먼저 선택 가능한 서버 집합이 달라진다.
- server_name _는 특별한 모든 이름 매칭 연산자가 아니다. 해당 주소·포트의 default_server 또는 기본 서버 선택과 Host 이름 비교 규칙을 함께 읽어야 한다.
원본 크기로 보기 ↗- 세 블록의 listen 값은 83, 84, 85로 나뉘고 IPv6 listen도 각각 있다.
- 블록마다 root 경로가 다르고 index index.html, try_files $uri $uri/ =404가 반복된다.
확인 기준포트를 생략한 http URL은 보통 80으로 연결하므로 83·84·85 서버 확인과 다르다.
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와 접근 거부를 같은 문제로 처리하지 않는다.
응답 화면이 어느 요청을 검증했는지 한정한다
- 환영 페이지는 해당 URL에서 기본 문서가 응답한 결과다. 사용자별 root나 다른 listen 포트가 올바르다는 결과로 확대하지 않는다.
- 구성 검사 후 해당 포트와 Host를 지정해 요청하고 예상 문서의 고유 내용을 확인한다. -t 성공은 문법·참조 파일 검사이며 모든 URL의 정상 응답을 보장하지 않는다.
bashsudo nginx -t curl -i -H "Host: lab.example.test" http://127.0.0.1:8083/guide.html재구성한 포트와 Host를 명시해 실제 문서 응답을 확인한다.
원본 크기로 보기 ↗- 브라우저에는 Nginx 기본 환영 문서가 보인다.
- 주소는 별도 사용자 포트 구분 없이 기본 웹 요청 형태이므로 앞의 83·84·85 블록을 직접 검증한 화면은 아니다.
확인 기준기본 환영 페이지만 나오면 실제 요청의 포트·Host와 선택된 서버를 먼저 확인한다.
실습에서 확인한 동작 원리
- 가상 서버 선택과 파일 경로 계산은 서로 다른 처리 단계다.
- 기본 페이지 한 장의 성공을 모든 포트·도메인·문서 루트의 성공으로 확대하지 않는다.
동작·명령 참고 문서
04예제로 따라가기
- report.txt와 report-copy.txt가 같은 를 가리키는 하드 링크이면 한 이름으로 수정한 내용이 다른 이름에서도 보인다.
- 이름을 지웠어도 서비스가 해당 파일을 열고 있으면 열린 참조가 남아 저장 공간이 즉시 회수되지 않을 수 있다.
- /srv/data에 다른 파일 시스템을 마운트하면 기존 디렉터리 내용은 삭제되는 대신 가려지고 새 파일 시스템의 루트가 보인다.
05혼동하기 쉬운 점과 확인 기준
- a/b/c를 열 때 b가 일반 파일이면 중간 요소를 디렉터리로 통과할 수 없다. 최종 c의 권한을 바꾸어 해결되는 문제가 아니다.
- 경로의 디렉터리 탐색 권한 또는 최종 파일 접근 권한에서 거부될 수 있다. 대상 파일의 mode만 읽지 말고 경로 각 요소의 실행 주체를 대입한다.
- 같은 이름을 재생성했는데 서비스 출력이 보이지 않으면 열린 fd의 대상과 현재 경로의 를 비교한다. 이름이 같아도 기존 서비스가 삭제된 이전 객체를 계속 쓸 수 있다.
06상세 노트 · 실습 자료
헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.
공식 문서 · 표준
기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.