고성능
많은 수의 파일을 지원해야함
일관성
스토리지 인식
스몰 스토리지 지원
Example of FS in Linux
Ext2/3/4: block group, journaling, extent-based FS
FAT, exFAT: FAT based FS
F2FS: Flash friendly FS
Btrfs: COW based FS, strong consistency
NFS, GFS, Ceph, ..: FS for distributed systems
XFS: Extent and journaling based FS, Parallel I/Os (scalable)
Nilfs: LFS in Linux
Fuse: User-level FS
NOVA: NVM-aware FS
Zonefs: FS for ZNS SSDs
QNX4/QNX6: FS for QNX OS
Logical: proc, sysfs, debugfs,
플래터 : 원판
실린더 : 원판 모음
섹터 - 512B
스핀들 : 축
arm 앞에 head로 데이터 센싱
디스크 접근 : 섹터 어드레싱 : 어떤 헤드를 사용해서 섹터 위, 아래쪽에 데이터를 저장할 수 있기 때문에 각각 서피스마다 헤드가 필요. 어느 헤드로 가서 어느 트랙으로 가서 섹터를 읽어달라. 요청을 하게됨.
디스크 디바이스 드라이버: 복잡한 물리디스크를 논리적인 디스크로 추상화
논리적인 디스크는 원기둥 형태로 그려진다. 이걸 나눠서 디스크 블럭이라 한다.
디스크블럭 : 보통 4KB or 8KB
섹터 512B => 0.5KB => 8x0.5 = 4KB
하나의 디스크블럭은 섹터가 8개 있어야한다.
디스크 블럭이 어느 섹터에있는지 매핑하는게 디스크 디바이스 드라이버
디스크 초기화 , 에러핸들링, 스케줄링 => 디스크 디바이스 드라이버
그 위에 파일시스템이 존재
파일시스템은 디스크 블럭들을 파일이라는 개념으로 추상화
offset : 읽거나 쓰려는 위치
파일의 크기가 10000바이트라 가정. 10000바이트를 집어넣으려면 디스크블럭이 3개필요
0번은 다른 파일이 사용하고 있다.
1번은 free상태다.
1,5,6에 할당을 하게 될 걸로 예상됨 (불연속 할당)
만약 13,14,15로 할당을 하면? (연속 할당)
원본 파일에서 append 할 경우 연속적으로 할당이 불가능해진다!
그래서 불연속 할당을 사용한다. => inode , fat으로
int main(int argc, char *argv[])
{
int fd, read_size, write_size;
char buf[MAX_BUF];
if (argc !=2){
printf("USAGE: %s file_name\n", argv[0]);
exit(-1);
}
fd = open(argv[1], O_RDONLY);
if(fd < 0){
printf("Open Error\n");
exit(-1);
}
while(1) {
read_size = read(fd,buf,MAX_BUF);
if(read_size == 0){
break;
}
write_size = write(STDOUT_FILENO, buf, read_size);
}
close(fd);
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#define MAX_BUF 512
int main(int argc, char *argv[])
{
int fd, read_size, write_size;
int fd1; // for redirection
char buf[MAX_BUF];
if (argc != 3) {
printf("USAGE: %s input_file_name output_file_name\n", argv[0]);
exit(-1);
}
fd = open(argv[1], O_RDONLY);
if(fd < 0){
perror("Open Error");
exit(-1);
}
fd1 = open(argv[2], O_WRONLY | O_CREAT | O_APPEND, 0641); // 원본파일 보존+ 내용추가
if (fd1 < 0) {
perror("Open Error");
close(fd);
exit(-1);
}
dup2(fd1, STDOUT_FILENO);
while(1) {
read_size = read(fd,buf,MAX_BUF);
if(read_size == 0){
break;
}
write_size = write(fd1, buf, read_size);
if(write_size == -1){
perror("Write Error");
close(fd);
close(fd1);
exit(-1);
}
}
close(fd);
close(fd1);
return 0;
}