Search
Duplicate
📒

[Linux CLI] 03-x. 파일 시스템 - POSIX

상태
미진행
수업
Linux
주제
4 more properties
참고

POSIX(Portable Operating System Inerface + UNIX)

NOTE
POSIX는 운영체제 간의 호환성을 증진하기 위해 IEEE에서 정의한 표준이며, 서로 다른 Unix기반 OS의 공통 API를 정리하고 표준화 하기 위해서 책정한 인터페이스입니다.

Linux & Unix

Unix: 1960년대에 개발된 운영체제이며, 여러 플랫폼에서 실행할 수 있는 최초의 운영체제이며 지금까지도 표준으로 쓰이고 있습니다.
Linux: 1990년대 초 Unix를 기반으로 만들어진 오픈소스이며, Unix의 파생물입니다.
Unix를 기반으로 만든 수많은 Linux기반 운영체제들의 표준을 만들기 위한 목적으로 제작된 것이 POSIX입니다.
파일 시스템이 POSIX와 호환되려면 아래와 같은 조건을 충족해야 합니다.
일관성 제공: read전에 write가 발생한 경우, read는 write가 적용된 데이터 반환
atomic writes: write는 원자적으로 실행되도록 한다. (즉 write 작업이 완전히 처리되거나 실행되지 않아야 한다)
random read, write, truncate(자르기) 또는 fsync*와 같은 특정 작업 구현
권한을 사용하여 파일에 대한 접근제어 및 chmod, chown을 통한 권한수정
Linux는 파일 시스템과 관련하여 POSIX와 부분적으로 호환된다고 본다.POSIX에서 요구하는 IO작업에 필요한 격리 가능성을 성능상의 이유로 제공하지 않기 때문
read및 write가 페이지 수준(4kb)에서는 원자적이지만, 동시성 쓰기 작업중에 일부 페이지에 대한 읽기가 가능하다.
만약 해당 파일에 대한 불완전한 읽기/쓰기를 방지하려면 애플리케이션단에서 lock을 적용해야 한다.
POSIX는 Interface라고 했다. 즉, System Call에 대한 표준을 제공하고, 이 표준에 따라 System Call을 구현한다. 

기본개요

NOTE
파일시스템에서 사용되는 용어를 간단하게 설명해보자!
lsblk # 모든 블록 디바이스 나열 # 파일 시스템을 나열, 스쿼시FS 유형은 제외 findmnt -D -t nosquashfs fdisk, parted # 디스크 파티션 관리 blkid # UUID와 같은 블록 디바이스 속성 hwinfo # 하드웨어 정보 file -s # 파일시스템과 파티션 정보 stat, df -i, li -i # 아이노드 정보
Bash
복사
파일시스템과 블록 디바이스 명령어 모음
드라이브
하드 디스크, 솔리드 스테이트 드라이브와 같은 블록 디바이스
가상 머신의 드라이브는 애뮬레이션될 수도 있다. ex) /dev/sda (SCSI 디바이스), /dev/sdb(SATA 디바이스)와 같은 식
파티션
드라이브 스토리지를 섹터의 집합인 파티션으로 논리적으로 분할한다.
ex) HDD에 2개의 파티션을 생성하면 /dev/sdb1 , /dev/sdb2로 표시
볼륨
파티션과 비슷하지만 더 유연하며, 특정 파일시스템용으로 포맷되기도 한다.
슈퍼 블록
시스템이 포맷되면 파일시스템의 시작 부분에 파일시스템의 메타데이터를 캡쳐하는 특수 섹션
파일시스템의 유형, 블록, 상태, 블록당 inode 수 등이 담긴다.
inode
파일 시스템의 아이노드는 크기, 소유자, 위치, 날짜, 권한과 같은 메타데이터 저장

inode / link

NOTE
inodelink는 파일 시스템에서 파일/디렉토리를 관리 하는데 중요한 역할을 수행합니다.

inode

inode는 파일 시스템 내의 파일과 디렉토리에 대한 메타 데이터를 저장하는 데이터 구조체이며 파일이 들어있는 주소를 찾아주는 노드입니다.
컴퓨터에서 용량이 큰 파일을 삭제할때 휴지통 비우기에서 완전히 비우기를 했을때 드라이브 용량이 실제로 지워지는걸 확인할 수 있다. 이처럼 파일이 휴지통에만 버려진것이 inode를 삭제한것이다.
# 텍스트 파일 생성 echo "Hello, inode!" > example.txt # ls -i (inode 표시) ls -i example.txt # 790205 example.txt # stat: 파일에 대한 상세정보(inode를 통해 조회한다.) stat example.txt
Bash
복사
inode는 파일의 유형, 소유자 및 그룹정보, 크기, 권한 등 다양한 정보를 가지고 있습니다.
리눅스의 파일은 “파일명 + inode + 데이터 블록”으로 구성된다.

link

link는 파일 시스템에서 파일이나 디렉토리를 참조할 수 있는 방법을 제공하는 방식입니다. 링크를 통해서 파일/디렉토리에 대한 바로가기를 만들 수 있다.
심볼릭 링크 vs 하드 링크
# 원본 파일 생성 echo "This is a test file." > original.txt # 하드링크 생성 ln original.txt hardlink.txt # 소프트 링크 생성 ln -s original.txt softlink.txt # 파일 inode 출력 ls -i *.txt ## 790242 hardlink.txt 790242 original.txt 790244 softlink.txt
Bash
복사
심볼릭 링크(소프트 링크)
파일을 가리키는 포인터가 있는 작은 파일을 생성한다.
새로운 inode를 생성하며, 원정을 수정하면 수정된 내용이 보인다.
원본이 삭제되어도 살아는있지만, 원본을 참조할 수 없어 없는거와 마찬가지이다.
하드링크
기존 파일에 새로운 파일의 이름을 추가로 생성한다.
원본 수정 시 하드 링크도 수정되며, 원본이 삭제되도 살아있다.

EXT 파일시스템

NOTE
EXT는 Linux의 대표적인 파일 시스템이며, 초기 유닉스중 하나인 MINIX에서 사용하던 파일시스템을 보완하며 설계되었습니다.
MINIX
최대 파일이름 크기: 14bytes
최대 크기: 64MB
EXT
255 bytes
2 GB
EXT는 data 수정 타임스탬프와 inode수정을 지원하지 않으며, linked list를 통해 free block과 inode
를 추적하기 때문에 성능이 저하된다는 문제점이 존재하며 이를 극복하기 위해 EXT2가 등장했다.
디스크에서 파일 시스템은 파티션 당 하나씩 생성되며, 파티션에서 EXT2를 구축하면 파티션은 다수의 블록 그룹으로 나뉜다.
파일시스템을 블록 그룹으로 분할하면 같은 파일에 대한 inode, data block이 인접한 실린더에 위치하게 되어 디스크 탐색 시간을 줄일 수 있다.
EX2는 부트스트랩 코드가 존재하는 부트블록과 여러 개의 블록 그룹으로 구성되며 또한 블록그룹은 6가지 영역으로 다시 구분된다.
EX3
EX3에서는 폴더 검색성능을 높이기 위해 hash기반 HTree 기술이 도입되었다.
EX2에서는 폴더를 단순 연결리스트로 관리해서 내부 파일이 증가하면 검색시간또한 증가했지만, HTree구조를 도입하면서 많은 파일이 존재해도 상수 시간안에 접근이 가능해졌다.
HTree란?
B-Tree와 유사하게 사전 인덱싱을 사용하는 특수 트리 데이터 구조
filename의 hash를 사용하며, 최대 2level이므로 거의 상수시간안에 탐색이 가능하다.
EX3에서는 journaling 기능을 지원한다.
journaling이란 시스템 충돌과 같은 손상을 신속하게 복구하는 기능이다.
EX4
EX4에서는 48bit 블록 주소지정을 사용하기 때문에 훨씬 큰 파일시스템을 지원합니다.
사전 할당 기능지원, 파일 생성시 미리 일정 개수의 블록을 보장하는 기법이다.
Extent사용, 100번 블록부터 50개 블록을 연속 할당한 경우 (100,50)의 정보만을 유지해 메타데이터의 양을 줄이고, 인덱싱하는 시간을 줄인다.
XFS
64비트의 저널링 파일 시스템, 대규모 데이터 처리에 특화된 파일 시스템이다.
B+tree를 사용하여 우수한 IO확장성을 제공한다.
파일 시스템의 크기는 줄일 수 없다. 작은 사이즈의 파일에서는 실행이 느려진다.
Btrfs(B-tree-filesystem)
2013년에 리눅스 커널에 포함된 만큼 최신 파일 시스템이다.
Btrfs는 스냅샷 기능을 지원하고, 여러 장점이 존재하지만, EXT4가 오래된 만큼 안전성이 더 놓고, FreeBSD도 지원한다.
ZFS
128비트 파일 시스템

가상 파일시스템(VFS)

NOTE
가상 파일시스템은 실제 파일 시스템을 추상화하여 운영체제가 이들을 통일된 방식으로 다룰 수 있게 해준다!
가상 파일시스템 → 실제 파일시스템 → 하드웨어 순으로 접근된다고 보면된다. (커널 - 사용자 공간 사이의 중재자!)
기본 개념은 클라이언트(시스템 콜)개별 파일시스템 사이에 간접 계층을 도입하는 것이다.
개별 파일시스템은 구체적인 디바이스 또는 리소스 유형을 위한 연산을 구현한다.
VFS 인터페이스를 구성하는 시스템콜
관련 시스템콜은 거의 100개가 넘어가며 아래에는 핵심 명령어들과, bash코드 예시를 정리
카테고리
시스템 콜 예시
아이노드
chmod, chown, stat
파일
open, close, seek, truncate, read, write
디렉터리
chdir, getcwd, link, unlink, rename, symlink
파일시스템
mount, flush, chroot
그 외
mmap, poll, sync, flock
# 1. 파일 생성 echo "This is a test file." > original.txt # 2. inode 관련 명령어 # 1-1. 파일 권한 변경 chmod 755 original.txt # 1-2. 파일 소유자 변경 (root 권한 필요) chown user:group original.txt # 1-3. 파일 상태 확인 stat original.txt # 3. file 관련 명령어(bash가 아닌 C와 같은 언어에서 실행) # 4. directory 관련 명령어 # 4-1. 하드 링크 생성 ln original.txt hardlink.txt # 4-2. 심볼릭 링크 생성 ln -s original.txt symlink.txt # 4-3. 파일 삭제 (하드 링크와 심볼릭 링크 삭제) rm hardlink_file.txt rm symlink_file.txt # 4-3. 디렉토리 생성 mkdir example_dir echo "Directory created: example_dir" # 4-4. 디렉토리 이름 변경 mv example_dir renamed_dir # 5. filesystem 관련 명령어 # 5-1. 파일 시스템 마운트 mount /mnt # 5-2 동기화 sync # 5-3 파일 시스템 언마운트 umount /mnt
Bash
복사
VFS 데이터 구조
inoide
file
dentry
super_block
그외(vfsmount, file_system_type 포함)
VFS는 파일 체계를 기반으로 클라이언트가 동일한 방법으로 리소스에 접근할 수 있게 해주는 커널의 추상화 계층이다.
리눅스의 파일에는 규정된 구조가 없으며, 그저 바이트 스트림일뿐이다.
바이트의 의미를 결정하는 것은 클라이언트에게 달려있다.

논리 볼륨 관리자(Logical Volume Manager)

NOTE
논리 볼륨 관리자는 리눅스 시스템에서 스토리지 관리를 유연하고 효율적으로 해준다!
파티션으로 드라이브를 분할하는 방법은 크기 조정이 필요할 때 사용하기가 어렵다. 논리 볼륨 관리자는 파일 시스템과 물리 개체간의 간접 계층을 사용하게 한다.
논리 볼륨 관리자 개요
논리 볼륨 관리자(LVM)은 파일시스템과 물리 개체간의 간접 계층을 사용하며, 이렇게 하면 리소스 풀링을 통해 위험이 없고 중단 시간도 없는 확장과 자동 스토리지 증설이 가능해진다.
논리 볼륨(LV): 볼륨 그룹에 생성된 블록 디바이스
개념적으로 파티션과 비슷하며 논리 볼륨을 사용하려면 먼저 논리 볼륨에 파일시스템을 생성해야 한다.
사용 중에 논리 볼륨의 크기를 쉽게 조정할 수 있디.
볼륨 그룹(VG): 물리/논리 볼륨 사이의 중개자, 공동으로 리소스를 제공하는 물리 볼륨 풀
물리 볼륨(PV): 디스크 파티션, 전체 디스크 드라이브, 기타 디바이스
# Lv(논리 볼륨) 관리도구 lvs lvscan lvcreate # VG(볼륨 그룹) 관리도구 vgs vgdisplay vgcreate vgextend # PV(물리 볼륨) 관리도구 lvmdiskscan pvdisplay pvcreate pvscan
Bash
복사
# 디스크 초기화 및 파티션 # fdisk: 디스크 파티션을 생성하는 명령어 fdisk /dev/sdb fdisk /dev/sdc # 파티션 결과 sdb 8:16 0 50G 0 disk └─sdb1 8:17 0 50G 0 part sdc 8:32 0 20G 0 disk └─sdc1 8:33 0 20G 0 part # 1. pvcreate: 물리적 볼륨 생성 sudo pvcreate /dev/sdb /dev/sdc # 2. vgcreate: 볼륨 그룹 생성 sudo vgcreate my_volume_group /dev/sdb1 /dev/sdc1 # 3. lvcreate: 논리 볼륨(LV) 생성 lvcreate -L 50G -n my_logical_volume my_volume_group # 4. mkfs: 파일 시스템 생성, mkfs.[파일 시스템 유형] [장치] or mkfs -t [파일시스템] [장치] sudo mkfs.ext4 /dev/my_volume_group/my_logical_volume # 5. 마운트할 디렉토리 생성 sudo mkdir /mnt/my_mount_point # 6. mount: 논리 볼륨 마운트 sudo mount /dev/my_volume_group/my_logical_volume /mnt/my_mount_point # 7. 마운트 확인 df -h | grep /mnt/my_mount_point # 8. 논리 볼륨 확장(50+10 = 60 조정) lvextend -L +10GB /dev/my_volume_group/my_logical_volume resize2fs /dev/my_volume_group/my_logical_volume
Bash
복사

파일시스템 작업

NOTE
파일 시스템 명령어

mkfs

# mkfs -t [파일시스템 유형] [장치] # -t 파일시스템 유형 # -L 라벨 # -b 블록 크기 # -m 블록비율 # ext4 생성 mkfs.ext4 /dev/sdb1 # 블록크기 4096으로 생성 mkfs.ext4 -b 4096 /dev/sdb1 # 라벨 지정 mkfs.ext4 -L mylabel1 /dev/sdb1
Bash
복사
파일 시스템을 생성하려면 파티션이나 볼륨을 입력으로 받아 파일 시스템을 구성하는 관리적인 부분을 설정해야한다.

mount

# mount [옵션] [장치] [마운트 포인트] # -t 파일시스템 유형 # -o 마운트 옵션(ro - 읽기 전용, rw - 읽기/쓰기) # -L 라벨 # 마운트 mount /dev/sdb1 /mnt/mount_point # 블록크기 4096으로 생성 mount -t ext4 /dev/sdb1 /mnt/my_mount_point # 라벨 지정 mkfs.ext4 -L mylabel1 /dev/sdb1
Bash
복사
파일 시스템을 마운트 한다는 말은 파일 시스템 트리에 연결한다는 의미이다.
option 리스트
defaults - rw, suid, dev, exec, auto, nouser, async 모든 속성을 지닌다.
auto: 부팅시 자동 마운트
noauto: 부팅시 자동마운트 x
dev / nodev : 파일 시스템 상의 문자, 블럭 특수장치를 해석여부
exec / noexec : 바이너리 실행파일 허가여부
suid, nosudi : setuid, setgit 사용가능 여부
ro / rw : 읽기 전용, 읽기/쓰기 가능
sync / async : 파일시스템 I/O 비동기화, 동기화
sync: 데이터가 즉시 기록되므로, 성능이 저하될 수 있다.
async: 변경 사항이 캐시에 유지되었다가 나중에 기록된다. 기록되는 메커니즘은 플러시를 하거나, 버퍼가 가득차거나 혹은 명시적으로 요청할수 있다. (sync, fsync)

/etc/fstab

# /etc/fstab : 시스템 부팅시 파일 시스템 자동 마운트를 위한 설정파일 # 파일시스템 UUID # / 마운트 포인트 # ext4 시스템 유형 # default 마운트 옵션(rw, suid, dev, auto, sync - 변경사항 즉각 반영) # 0 백업필요 여부 # 1 검사 순서 UUID=12345678-1234-1234-1234-1234567890ab / ext4 defaults 0 1 # /dev/sdb1 /mnt/data ext4 defaults 0 2
Bash
복사
# 1. 파일 시스템 생성 # ex4 유형의 파일시스템 생성 (/dev/sda1이 가능한지는 확인할것) sudo mkfs.ext4 /dev/sda1 # 2. 파일 시스템 마운트 sudo mount /dev/sda1 /data # 3. 부팅 시 자동 마운트 설정 vi /etc/fstab /dev/sda1 /data ext4 default 0 2
Bash
복사

범용 파일시스템 레이아웃(FHS)

파일시스템이 준비하고 나서 다음으로 풀어야할 과제는 그 내용을 구조화할 방법을 찾는것이다.
프로그램이 저장된 위치, 구성 데이터, 시스템 데이터, 사용자 데이터와 같은 항목을 구조화할 수 있다. 이런 디렉터리의 구성과 그 내용을 파일시스템 레이아웃이라고 부른다.

의사파일 시스템

NOTE
의사 파일 시스템은 실제 디스크가 아닌 메모리나 다른 데이터 소스를 사용하여 파일 시스템 인터페이스를 통해 정보를 제공하는 가상의 파일 시스템입니다.
여기서 인터페이스란 다음정보와 같이 다양한 범위에 이른다.
프로세스에 대한 정보
키보드 같은 디바이스와의 상호작용
데이터 소스나 싱크로 사용할 수 있는 특수 디바이스같은 유틸리티

procfs(/proc)

NOTE
procfs(/proc)는 커널과 프로세스에 관한 정보를 파일 형식으로 제공해준다!
cat /proc/self/status # 현재 실행중인 명령의 프로세스 상태 확인 cat /proc/self/net/arp # 네트워크 공간정보 ls /proc # 실행중인 프로세스( /proc/[PID]로 표시된다. ) cat /proc meminfo # 시스템 메모리 사용량과 상태 cat /proc/cpuinfo # cpu에 대한 상세정보 cat /proc/net/dev # 네트워크 인터페이스 통계 cat /proc/modules # 로드된 커녈 모듈 목록 cat /proc/mounts # 마운트된 파일 시스템 목록
Bash
복사
원래의도는 커널에서 프로세스 관련 정보를 발행하여 ps나 free를 사용하는것이다.
구조에 대한 규칙이 거의 없고, 읽기-쓰기 권한이 허용되면서 수많은 정보가 편입되었다.

sysfs(/sys)

NOTE
sysfs(/sys)는 리눅스 커널의 장치와 드라이버를 제공하는 파일 시스템이다!
ls /sys/block # 발견된 블록 디바이스의 심볼릭 링크 ls /sys/class # 디바이스 클래스 ls /sys/bus # 커널에서 지원하는 각 물리 버스유형 ls /sys/fs # 일부 파일시스템의 하위 디렉토리 cat /sys/power/state # 시스템의 가능한 파워상태
Bash
복사

devfs(/dev)

NOTE
devfs(/dev)는 리눅스 시스템에서 장치 파일을 관리하는 의사 파일 시스템이다!
ls /dev # 시스템에 있는 장치파일 # ex) dev/sda(SATA 하드 드라이브), /dev/tty(터미널 장치) echo "something" > /dev/tty # 터미널에 그대로 출력됨
Bash
복사
물리적 디바이스로부터 난수 생성기나, 전용 데이터 싱크에 따르는 모든 디바이스를 나타내는 디바이스 특수 파일을 호스팅한다. devfs를 통해 사용 가능하고 관리되는 디바이스는 다음과 같다.
블록 디바이스: 저장 디바이스 같은 블록의 데이터 처리
문자 디바이스: 터미널, 키보드, 마우스 같은 디바이스를 문자 단위로 처리
특수 디바이스: 데이터를 생성하거나 조작

일반파일 시스템

범용 파일시스템

NOTE
범용 파일 시스템은 데이터를 효율적으로 저장하고 검색하는데 필수적인 운영체제의 구성요소다!
대표적인 파일 시스템
ext4
오늘날 가장 많이 배포판에서 사용되는 파일시스템
대용량 파일과 디렉터리, 저널링 기능(로깅)을 지원한다.
XFS
대용량 데이터 처리에 특화된 파일 시스템
높은 성능과 신속한 복구가 가능하다.
Btrfs
고급 기능을 제공하는 최신 파일 시스템
스냅샷, 복제, 실시간 오류 정정등을 지원한다.
ZFS
고급 파일 시스템 및 볼륨 관리자
데이터 무결성, 스냅샷, 복제, 대용량 스토리지 관리를 위한 기능을 제공한다.

인메모리 파일시스템

NOTE
인메모리 파일 시스템은 주로 메모리 기반 컴퓨팅 환경에서 사용되는 파일시스템이며, 데이터를 메모리에 직접 저장하고 접근한다!
debugfs
디버깅에 사용되는 특수 목적 파일시스템
일반적으로 mount -t debugfs none /sys/kernel/debug로 마운트된다.
loopfs
디바이스가 아닌 블록에 파일시스템을 매핑할 수 있다.
백그라운드의 메일 스레드도 참조하자.
pipefs
파이프에 마운트된 특수 파일시스템. 파이프를 활성화한다.
sockfs
네트워크 소켓을 파일처럼 보이게 만드는 또 다른 특수 파일시스템.
시스템 콜과 소켓 사이에 있다.
swapfs
스와핑을 실현하는데 사용된다.
tmpfs
파일 데이터를 커널 캐시에 보관하는 범용 파일시스템.
빠르지만 데이터 유지는 되지 않는다. (전원을 끄면 데이터가 손실됨)