F2FS

F2FS
F2FS
개발자삼성전자, Motorola Mobility, Huawei 및 Google
풀네임플래시 친화적인 파일 시스템
소개했다v3.8, 2012-12-20[1] Linux 지원
구조물들
디렉토리 내용다단계 해시 테이블
파일 할당비트맵(사용 가능한 공간), 표
부터블네, GRUB 2.04(2019-07-05) 이후
한계
최대 볼륨 크기16 TB
최대 파일 크기3.94 TB
최대 파일 수볼륨 크기에 따라 다름
최대 파일 이름 길이512[2] 바이트
특징들
기록된 날짜변경(mtime), 속성 변경(ctime), 액세스(atime)
날짜 해결1 ns
특성POSIX, 확장 어트리뷰트
파일 시스템 권한POSIX, ACL
투과적 압축LZO, LZ4(Linux 5.[3]6 이후), zstd(Linux 5.[4]7 이후)
투과적 암호화네.
다른.
지원되는 운영 체제Linux 및 Android
웹 사이트f2fs.wiki.kernel.org

F2FS(Flash-Friendly File System)는 삼성전자리눅스 [5]커널용으로 처음 개발한 플래시 파일 시스템이다.

F2FS의 동기는 처음부터 모바일 장치에서 서버에 이르는 컴퓨터 시스템에서 널리 사용되는 NAND 플래시 메모리 기반 스토리지 장치(솔리드 스테이트 디스크, eMMC, SD 카드 등)의 특성을 고려한 파일 시스템을 구축하기 위한 것이었습니다.

F2FS는 새로운 형태의 스토리지에 맞게 조정된 로그 구조 파일 시스템 접근 방식을 기반으로 설계되었습니다.F2FS의 주요 저자인 김재극은 떠돌이 나무눈덩이 효과와 높은 청소 오버헤드 같은 오래된 로그 구조 파일 시스템의 알려진 문제들을[5] 해결한다고 말했다.또한 NAND 기반 스토리지 장치는 내부 지오메트리 또는 플래시 메모리 관리 방식(예: Flash Translation Layer 또는 FTL)에 따라 서로 다른 특성을 나타내기 때문에 온디스크 레이아웃 구성뿐만 아니라 할당 및 클리닝 알고리즘 선택에도 다양한 매개 변수를 지원합니다.

특징들

  • 멀티헤드 로깅
  • 디렉토리 엔트리에 대한 다단계 해시 테이블
  • 정적/동적 핫/콜드 데이터 분리
  • 적응형 로깅 방식
  • 구성 가능한 운영 단위
  • 듀얼 체크 포인트
  • 롤백 및 롤포워드 리커버리
  • 힙 스타일의 블록 할당
  • 트림/핏림 지원[6]
  • 온라인 FS 조각 모음/파일[7] 조각 모음
  • 인라인 xattrs[8]/data[9]/dir[10]
  • 오프라인 파일 시스템 검사(부정합[11] 검사 및 수정)
  • 원자 작전[12]
  • 파일 시스템 수준의 암호화[13]
  • 오프라인 크기 조정(수축은 지원되지 않습니다.)[14]
  • 내부 정기 데이터[15] 플러시
  • 익스텐트[16] 캐시
  • LZO 또는 LZ4(Linux 5.6)[3] 또는 zstd(Linux 5.7)[4]를 사용한 투과적인 파일 압축

설계.

온디스크 레이아웃

F2FS는 볼륨 전체를 여러 개의 세그먼트로 분할합니다.각 세그먼트는 2MB로 고정됩니다.섹션은 연속된 세그먼트로 구성되며 존은 섹션 세트로 구성됩니다.디폴트로는 섹션과 존사이즈는 같은 사이즈로 설정되어 있습니다만, 유저는 다음의 방법으로 사이즈를 간단하게 변경할 수 있습니다.mkfs.

F2FS는 전체 볼륨을 6개의 영역으로 분할하며, 슈퍼블록 영역을 제외한 모든 영역은 아래와 같이 여러 세그먼트로 구성됩니다.

슈퍼블록(SB)
SB는 파티션의 선두에 있습니다.파일 시스템 손상을 방지하기 위해 두 개의 복사본이 있습니다.여기에는 기본적인 파티션 정보와 일부 기본 F2FS 파라미터가 포함되어 있습니다.
체크포인트(CP)
CP에는 파일시스템 정보, 유효한 NAT/SIT 세트의 비트맵, 분리된 inode 목록 및 현재 활성 세그먼트의 요약 엔트리가 포함됩니다.
세그먼트 정보 테이블(SIT)
SIT에는 모든 메인 영역 블록의 유효한 블록 수 및 유효 비트맵이 포함됩니다.
노드 주소 테이블(NAT)
NAT은 메인 영역 노드블록의 주소 테이블입니다.
세그먼트 요약 영역(SSA)
SSA에는 메인 영역 데이터 및 노드블록의 소유자 정보를 포함하는 엔트리가 포함되어 있습니다.
메인 영역
메인 영역에는 파일 및 디렉토리 데이터와 인덱스가 포함됩니다.

F2FS는 파일 시스템과 플래시 스토리지 간의 오정렬을 방지하기 위해 CP의 시작 블록 주소를 세그먼트 크기에 맞춥니다.또한 SSA 영역에 일부 세그먼트를 예약하여 메인 영역 시작 블록 주소를 구역 크기에 맞춥니다.

메타데이터 구조

F2FS는 체크포인트 방식을 사용하여 파일 시스템의 무결성을 유지합니다.마운트 시 F2FS는 CP 영역을 스캔하여 마지막으로 유효한 체크 포인트데이터를 검출하려고 합니다.스캔 시간을 단축하기 위해 F2FS는 CP 복사본을 2개만 사용합니다.이 중 하나는 항상 마지막으로 유효한 데이터를 나타내며, 이를 섀도 복사 메커니즘이라고 합니다.CP와 더불어 NAT 및 SIT는 섀도 복사 메커니즘도 사용합니다.파일 시스템 일관성을 위해 각 CP는 NAT 및 SIT 복사본이 유효한 위치를 가리킵니다.

색인 구조

주요 데이터 구조는 "노드"입니다.기존 파일 구조와 마찬가지로 F2FS에는 inode, direct node, indirect node의 3가지 노드가 있습니다.F2FS는 다음과 같이 923개의 데이터 블록인덱스, 2개의 직접 노드 포인터, 2개의 간접 노드 포인터 및 1개의 이중 간접 노드 포인터를 포함하는 inode 블록에 4KB를 할당합니다.다이렉트 노드 블록은 1018개의 데이터 블록 인덱스를 포함하고, 간접 노드 블록은 1018개의 노드 블록 인덱스를 포함한다.따라서 하나의 inode 블록(즉, 파일)은 다음을 포함합니다.

4 KiB × (923 + 2 × 1018 + 2 × 101823 ) = 4,228,213,756 KiB = 4,196.996 MiB = 4,032.338863 GiB = 3.937830921 TiB

모든 노드 블록은 NAT에 의해 매핑됩니다.즉, 각 노드의 위치는 NAT에 의해 변환됩니다.F2FS는 리프 데이터 쓰기로 인한 노드 업데이트 전파를 차단할 수 있어 방황하는 트리의 문제를 줄일 수 있습니다.

디렉토리 구조

디렉토리 엔트리(덴트리)는 11바이트를 차지하며, 이는 다음 속성으로 구성됩니다.

디렉토리 엔트리 구조
해시 파일 이름의 해시 값
이노 Inode 번호
파일 이름 길이
유형 디렉토리, 심볼링크 등의 파일 형식

덴트리 블록은 214개의 덴트리 슬롯과 파일명으로 구성됩니다.비트맵은 각 덴트리가 유효한지 여부를 나타내기 위해 사용됩니다.덴트리 블록은 4KB를 차지하며 다음과 같은 구성을 가집니다.

덴트리 블록(4 K) = 비트맵(27 바이트) + 예약된(3 바이트) + 덴트리(11 * 214 바이트) + 파일 이름(8 * 214 바이트)

F2FS는 디렉토리 구조에 대해 멀티 레벨 해시 테이블을 구현합니다.각 레벨에는 다음과 같이 전용 수의 해시 버킷이 있는 해시 테이블이 있습니다."A(2B)"는 버킷에 2개의 데이터 블록이 포함되어 있음을 의미합니다.

용어
A는 버킷을 나타냅니다.
B는 블록을 나타냅니다.
N은 MAX_DIR_HASH_DEpth를 나타냅니다.
레벨 #0 A(2B) 레벨 #1 A(2B) - A(2B) 레벨 #2 A(2B) - A(2B) ... 레벨 #N/2 A(2B) - A(2B) - A(2B) - A(2B)(2B)

F2FS가 디렉토리에서 파일 이름을 찾으면 먼저 파일 이름의 해시 값이 계산됩니다.그런 다음 F2FS는 수준 #0의 해시 테이블을 검색하여 파일 이름과 해당 inode 번호로 구성된 덴트리를 찾습니다.찾을 수 없는 경우 F2FS는 레벨 #1의 다음 해시 테이블을 검색합니다.이와 같이 F2FS는 각 레벨의 해시 테이블을 1부터N까지 증분 스캔 합니다.각 레벨에서 F2FS는 O(log(number of files)의 복잡성을 나타내는 다음 방정식에 의해 결정된 버킷을 1개만 스캔하면 됩니다.

레벨 #n에서 검색할 버킷 번호 = (표준값) %(레벨 #n의 버킷 수)

파일 작성의 경우 F2FS는 파일 이름을 덮는 빈 연속 슬롯을 찾습니다.F2FS는 검색 조작과 같은 방법으로 해시 테이블 의 빈 슬롯을 1부터N까지 전체 레벨로 검색합니다.

기본 블록 할당

실행 시 F2FS는 "메인 영역" 핫/웜/콜드 노드 및 핫/웜/콜드 데이터 내에서 6개의 활성 로그를 관리합니다.

블록 할당 정책
핫 노드 디렉토리의 직접 노드 블록을 포함합니다.
웜 노드 핫 노드 블록을 제외한 직접 노드 블록을 포함합니다.
콜드 노드 간접 노드 블록을 포함합니다.
핫 데이터 덴트리 블록이 포함되어 있습니다.
웜 데이터 핫 및 콜드 데이터 블록을 제외한 데이터 블록을 포함합니다.
콜드 데이터 멀티미디어 데이터 또는 마이그레이션된 데이터 블록을 포함합니다.

LFS에는 여유 공간 관리를 위한 두 가지 방식, 즉 스레드 로그와 복사 및 압축이 있습니다.클리닝이라고 하는 카피 앤 컴파일 스킴은, 새로운 데이터의 기입에 항상 빈 세그먼트가 제공되기 때문에, 시퀀셜 기입 퍼포먼스가 매우 뛰어난 디바이스에 적합합니다.그러나 사용률이 높은 동안에는 청소 오버헤드가 발생합니다.반대로 스레드 로그 스킴에서는 랜덤 쓰기가 발생하지만 클리닝 프로세스는 필요하지 않습니다.F2FS는 기본적으로 복사 및 압축 방식이 채택되는 하이브리드 방식을 채택하지만 정책은 파일 시스템 상태에 따라 스레드 로그 방식으로 동적으로 변경됩니다.

F2FS를 기본 플래시 기반 스토리지에 맞추기 위해 F2FS는 세그먼트를 섹션 단위로 할당합니다.F2FS는 섹션 크기가 FTL의 가비지 수집 단위 크기와 동일해야 합니다.FTL의 매핑 정밀도에 관해 F2FS는 액티브로그의 각 섹션을 가능한 한 많은 다른 존에 할당합니다.FTL은 매핑 입도에 따라 액티브로그 데이터를 1개의 할당 유닛에 쓸 수 있습니다.

청소 과정

F2FS는 온디맨드 및 백그라운드에서 청소를 수행합니다.온디맨드 클리닝은, VFS 콜을 처리할 수 있는 빈 세그먼트가 충분하지 않은 경우에 트리거 됩니다.백그라운드 클리너는 커널 스레드에 의해 실행되며 시스템이 유휴 상태일 때 클리닝 작업을 트리거합니다.

F2FS는 탐욕 알고리즘과 비용 편익 알고리즘의 두 가지 피해자 선택 정책을 지원합니다.그리디 알고리즘에서 F2FS는 유효 블록 수가 가장 적은 피해자 세그먼트를 선택한다.비용 편익 알고리즘에서 F2FS는 그레이디 알고리즘에 존재하는 로그 블록 슬래싱 문제에 대처하기 위해 세그먼트 경과시간 및 유효 블록 수에 따라 피해자 세그먼트를 선택한다.F2FS는 주문형 클리닝에 그리디 알고리즘을 사용하고 백그라운드 클리너는 비용 효율 알고리즘을 사용합니다.

F2FS는 피해자 세그먼트의 데이터가 유효한지 여부를 식별하기 위해 비트맵을 관리한다.각 비트는 블록의 유효성을 나타내며 비트맵은 메인 영역의 전체 블록을 포함하는 비트스트림으로 구성됩니다.

도입

모토로라 모빌리티는 2012년부터 모토 G/E/X와 드로이드 폰에 F2FS를 사용해 왔다.구글2014년 [17]넥서스9에 F2FS를 처음 사용했다.그러나 구글의 다른 제품들은 F2FS가 인라인 암호화 하드웨어 [18]지원으로 업데이트 된 픽셀 3까지 F2FS를 채택하지 않았다.

화웨이는 2016년 [19][20]화웨이 P9 이후 F2FS를 사용해 왔다.OnePlus는 OnePlus 3T에서 [21]F2FS를 사용하고 있으며, ZTE는 2019년 [22]ZTE Axon 10 Pro 이후 F2FS를 사용하고 있습니다.

Arch[23] Linux와 Gentoo[24] Linux는 F2FS를 지원하며, Debian은 버전 10 이상도 지원합니다.[25]

「 」를 참조해 주세요.

레퍼런스

  1. ^ Michael Larabel (2012-12-22). "F2FS File-System Merged Into Linux 3.8 Kernel". Phoronix. Retrieved 2016-05-25.
  2. ^ Changman Lee (2013-04-03). "f2fs: update f2fs.txt related with discard at mkfs". Retrieved 2020-02-12.
  3. ^ a b Michael Larabel (2019-12-23). "F2FS Data Compression Using LZO/LZ4 + Selective File Extension Handling To Land In 2020". Phoronix. Retrieved 2020-04-07.
  4. ^ a b Michael Larabel (2020-04-07). "F2FS Introduces Zstd Compression Support With The Linux 5.7 Kernel". Phoronix. Retrieved 2020-04-07.
  5. ^ a b Jaegeuk Kim (2012-10-05). "f2fs: introduce flash-friendly file system". Retrieved 2016-05-25.
  6. ^ Jaegeuk Kim (2014-09-22). "f2fs: introduce FITRIM in f2fs_ioctl".
  7. ^ Chao Yu (2015-10-26). "f2fs: support file defragment".
  8. ^ Jaegeuk Kim (2013-08-26). "f2fs: add flags for inline xattrs".
  9. ^ Huajun Li (2013-11-10). "f2fs: Enable f2fs support inline data".
  10. ^ Chao Yu (2014-09-24). "f2fs: support inline dir".
  11. ^ Jaegeuk Kim (2014-09-20). "f2fs-tools: release 1.4.0".
  12. ^ Jaegeuk Kim (2014-09-25). "f2fs: support atomic_write feature for database".
  13. ^ Jaegeuk Kim (2015-06-24). "f2fs updates for v4.2".
  14. ^ Jaegeuk Kim (2016-04-25). "resize.f2fs: support to expand partition size".
  15. ^ Chao Yu (2015-12-17). "f2fs: support data flush in background".
  16. ^ Chao Yu (2015-01-25). "f2fs: enable rb-tree extent cache".
  17. ^ Smith, Joshua Ho, Ryan. "The Google Nexus 9 Review". www.anandtech.com. Retrieved 2019-05-10.
  18. ^ Frumusanu, Andrei (2018-11-02). "The Google Pixel 3 Review". www.anandtech.com. Retrieved 2019-05-11.
  19. ^ Larabel, Michael (2018-12-28). "F2FS Gets More Fixes In Linux 4.21 With The File-System Now Supported By Google's Pixel". www.phoronix.com. Retrieved 2019-05-10.
  20. ^ Humrick, Matt (2017-05-12). "Huawei P10 and P10 Plus". www.anandtech.com. Retrieved 2019-05-11.
  21. ^ Chester, Brandon. "The OnePlus 3T Review". www.anandtech.com. Retrieved 2019-05-10.
  22. ^ "ZTE Axon 10 Pro Officially Uncovered: The First To Use F2FS". Gizchina.com. 2019-05-06. Retrieved 2019-05-10.
  23. ^ "Arch Linux Wiki". wiki.archlinux.org. Retrieved 27 June 2021.
  24. ^ "Gentoo Wiki". wiki.gentoo.org. Retrieved 27 June 2021.
  25. ^ "Debian Wiki". wiki.debian.org. Retrieved 27 June 2021.

외부 링크