๐Ÿ’ฟ Storage

ext4 ์ƒ์„ธ

๊ฐœ์š”

ext4๋Š” ๋ฆฌ๋ˆ…์Šค ์ปค๋„ 2.6.28(2008๋…„)์—์„œ ์ฒซ ๋„์ž…๋œ ํ™•์žฅ ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋„ค ๋ฒˆ์งธ ๋ฒ„์ „์œผ๋กœ, ๊ธฐ์กด ext3์—์„œ ๋””์Šคํฌ ํฌ๋งท๊ณผ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋Œ€ํญ ๊ฐœ์„ ํ•œ ๋ฒ”์šฉ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด๋‹ค. Extent ๊ธฐ๋ฐ˜ ํ• ๋‹น, ๋‹ค์ค‘ ๋ธ”๋ก ํ• ๋‹น์ž(MBAlloc), ์ง€์—ฐ ํ• ๋‹น(Delayed Allocation) ๋“ฑ์„ ํ†ตํ•ด ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ๊ณผ ์กฐ๊ฐํ™” ๋ฐฉ์ง€ ๋Šฅ๋ ฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œ์ผฐ์œผ๋ฉฐ, ์ตœ๋Œ€ 1EB ํŒŒ์ผ ์‹œ์Šคํ…œ ํฌ๊ธฐ์™€ 16TB ๋‹จ์ผ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ง€์›ํ•œ๋‹ค.

ext4๋Š” ์•ˆ์ •์„ฑ๊ณผ ํ˜ธํ™˜์„ฑ์„ ์ตœ์šฐ์„ ์œผ๋กœ ์„ค๊ณ„๋˜์–ด ๊ฑฐ์˜ ๋ชจ๋“  ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์˜ ๊ธฐ๋ณธ ๋˜๋Š” ์„ ํƒ ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ํŠนํžˆ RHEL/CentOS ๊ณ„์—ด์—์„œ ๊ธฐ๋ณธ ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ ์ฑ„ํƒ๋˜์–ด ์šด์˜ ํ™˜๊ฒฝ์—์„œ ๋„๋ฆฌ ํ™œ์šฉ๋˜๋ฉฐ, ext3์—์„œ ๋ฌด์†์‹ค ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•˜์—ฌ ๊ธฐ์กด ์ธํ”„๋ผ์—์„œ์˜ ์ „ํ™˜ ๋น„์šฉ์ด ๋‚ฎ๋‹ค. ์ €๋„๋ง ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฒดํฌ์„ฌ, ์˜จ๋ผ์ธ ๋””ํ”„๋ž˜๊ทธ๋ฉ˜ํ…Œ์ด์…˜, ๋น ๋ฅธ fsck ๋“ฑ์˜ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋™์‹œ์— ํ™•๋ณดํ•œ๋‹ค.

ํ•ต์‹ฌ ๊ฐœ๋…

Extent ๊ธฐ๋ฐ˜ ํ• ๋‹น

ext3๊นŒ์ง€๋Š” ๊ฐ„์ ‘ ๋ธ”๋ก ๋งคํ•‘(indirect block mapping) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์— ๋Œ€ํ•ด ๊ฐœ๋ณ„์ ์œผ๋กœ ๋งคํ•‘ ์ •๋ณด๋ฅผ ์ €์žฅํ–ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ์—์„œ ๋งคํ•‘ ํ…Œ์ด๋ธ”์ด ๋น„๋Œ€ํ•ด์ง€๊ณ  ์‚ญ์ œ/ํŠธ๋ ํฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ext4๋Š” ์ด๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ extent ๊ธฐ๋ฐ˜ ํ• ๋‹น์„ ๋„์ž…ํ–ˆ๋‹ค.

Extent๋Š” ์ธ์ ‘ํ•œ ์—ฐ์† ๋””์Šคํฌ ๋ธ”๋ก์˜ ๋ฒ”์œ„๋ฅผ ํ•˜๋‚˜์˜ ์—”ํŠธ๋ฆฌ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 100MB ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ extent๋กœ ํ• ๋‹นํ•˜๋ฉด 25,600๊ฐœ์˜ ๊ฐœ๋ณ„ ๋ธ”๋ก ๋งคํ•‘ ๋Œ€์‹  ํ•˜๋‚˜์˜ ์—”ํŠธ๋ฆฌ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ext4์˜ inode๋Š” ์ตœ๋Œ€ 4๊ฐœ์˜ direct extent๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ extent tree(Internal Node)๋กœ ํ™•์žฅ๋œ๋‹ค.

ํ•ญ๋ชฉ ext3 ext4
ํ• ๋‹น ๋ฐฉ์‹ ๊ฐ„์ ‘ ๋ธ”๋ก ๋งคํ•‘ Extent ๊ธฐ๋ฐ˜
๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ํšจ์œจ ๋‚ฎ์Œ (๋งคํ•‘ ํ…Œ์ด๋ธ” ๋น„๋Œ€) ๋†’์Œ (๋ฒ”์œ„ ๋‹จ์œ„ ๊ด€๋ฆฌ)
์กฐ๊ฐํ™” ๋†’์Œ ๋‚ฎ์Œ (์—ฐ์† ํ• ๋‹น ์ด‰์ง„)
์ตœ๋Œ€ ํŒŒ์ผ ํฌ๊ธฐ 2TB 16TB

๋‹ค์ค‘ ๋ธ”๋ก ํ• ๋‹น์ž (MBAlloc)

ext3์˜ ๋ธ”๋ก ํ• ๋‹น์ž๋Š” ํ˜ธ์ถœ๋‹น ๋‹จ์ผ ๋ธ”๋ก(4KB)๋งŒ ํ• ๋‹นํ•˜์˜€๋‹ค. 100MB ๋ฐ์ดํ„ฐ ๊ธฐ๋ก ์‹œ 25,600๋ฒˆ์˜ ํ• ๋‹น ํ˜ธ์ถœ์ด ํ•„์š”ํ–ˆ์œผ๋ฉฐ, ํ• ๋‹น์ž๊ฐ€ ์ „์ฒด ํ• ๋‹น ํŒจํ„ด์„ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ•ด ์ตœ์ ํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋‹ค. ext4๋Š” multiblock allocator(MBAlloc)๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋‹จ์ผ ํ˜ธ์ถœ๋กœ ์—ฌ๋Ÿฌ ๋ธ”๋ก์„ ํ•œ ๋ฒˆ์— ํ• ๋‹นํ•œ๋‹ค.

MBAlloc์€ ํ• ๋‹น ์ •์ฑ…์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด(์ „์ฒด ํ• ๋‹น ํฌ๊ธฐ, ํŒŒ์ผ์˜ ์ ‘๊ทผ ํŒจํ„ด ๋“ฑ)๋ฅผ ํ™•๋ณดํ•˜๋ฏ€๋กœ, ์—ฐ์† ๋ธ”๋ก ํ• ๋‹น๊ณผ extent ๊ธฐ๋ฐ˜ ํ• ๋‹น์˜ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค. ํŠนํžˆ ์ง€์—ฐ ํ• ๋‹น๊ณผ ๊ฒฐํ•ฉ๋˜์–ด ๋ถˆํ•„์š”ํ•œ ํ• ๋‹น์„ ์ค„์ด๊ณ  ์กฐ๊ฐํ™”๋ฅผ ์ตœ์†Œํ™”ํ•œ๋‹ค.

์ง€์—ฐ ํ• ๋‹น (Delayed Allocation)

๊ธฐ์กด ํŒŒ์ผ ์‹œ์Šคํ…œ์€ write() ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์‹œ ์ฆ‰์‹œ ๋ธ”๋ก์„ ํ• ๋‹นํ•˜์˜€๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ํŽ˜์ด์ง€ ์บ์‹œ์— ๋จธ๋ฌผ ๋™์•ˆ์—๋„ ๋ธ”๋ก์ด ํ• ๋‹น๋˜๋ฏ€๋กœ, ํŒŒ์ผ์ด ๊ณ„์† ์„ฑ์žฅํ•  ๊ฒฝ์šฐ ํ• ๋‹น์ž๊ฐ€ ์ตœ์ ์˜ ์œ„์น˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ext4๋Š” ์ง€์—ฐ ํ• ๋‹น(Delayed Allocation)์„ ์ ์šฉํ•˜์—ฌ write() ์‹œ ๋ธ”๋ก ํ• ๋‹น์„ ์—ฐ๊ธฐํ•˜๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ๋””์Šคํฌ์— ๊ธฐ๋ก๋  ๋•Œ๊นŒ์ง€ ํ• ๋‹น์„ ๋ฏธ๋ฃฌ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด:

  • ํ• ๋‹น ์‹œ์ ์— ํŒŒ์ผ์˜ ์ตœ์ข… ํฌ๊ธฐ๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ์ตœ์  ํ• ๋‹น ๊ฐ€๋Šฅ
  • MBAlloc๊ณผ extent๊ฐ€ ๊ฒฐํ•ฉ๋˜์–ด ์—ฐ์† ํ• ๋‹น ํ™•๋ฅ  ์ฆ๊ฐ€
  • ์กฐ๊ฐํ™” ํ˜„์ƒ ๋Œ€ํญ ๊ฐ์†Œ

๋‹ค๋งŒ data=journal ๋ชจ๋“œ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋„ ์ €๋„์— ๋จผ์ € ๊ธฐ๋กํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ง€์—ฐ ํ• ๋‹น๊ณผ O_DIRECT๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ๋‹ค. ๋”ฐ๋ผ์„œ ext4์˜ ์ผ๋ฐ˜์ ์ธ ์„ฑ๋Šฅ ํŠน์„ฑ์€ ๊ธฐ๋ณธ๊ฐ’์ธ data=ordered๋‚˜ data=writeback ๋ชจ๋“œ์—์„œ ๊ฐ€์žฅ ์ž˜ ๋“œ๋Ÿฌ๋‚œ๋‹ค.

์ €๋„๋ง (Journaling)

ext4๋Š” jbd2(Journaling Block Device 2)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €๋„๋ง์„ ๊ตฌํ˜„ํ•œ๋‹ค. ์ €๋„๋ง ๋ชจ๋“œ๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค:

๋ชจ๋“œ ๊ธฐ๋ก ๋Œ€์ƒ ํŠน์ง•
data=writeback ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ์„ฑ๋Šฅ ์ตœ๊ณ , ๋ฐ์ดํ„ฐ ์†์‹ค ์œ„ํ—˜
data=ordered ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ + ๋ฐ์ดํ„ฐ ์ˆœ์„œ ๋ณด์žฅ ์•ˆ์ „์„ฑ๊ณผ ์„ฑ๋Šฅ์˜ ๊ท ํ˜• (๊ธฐ๋ณธ๊ฐ’)
data=journal ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ + ๋ฐ์ดํ„ฐ ๋ชจ๋‘ ๊ฐ€์žฅ ์•ˆ์ „, ์„ฑ๋Šฅ ์ €ํ•˜

ext4๋Š” ์ €๋„ ๋ธ”๋ก ์ฒดํฌ์„ฌ์„ ์ง€์›ํ•˜์—ฌ ์ €๋„ ์†์ƒ ์‹œ ๋น ๋ฅด๊ฒŒ ๊ฐ์ง€ํ•˜๊ณ  ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ด์ง„ ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹์„ ๋‹จ์ผ ์ปค๋ฐ‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ตœ๋Œ€ 20% ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ธ”๋ก ๊ทธ๋ฃน (Block Group)

ext4 ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ์ „์ฒด ๋””์Šคํฌ๋ฅผ ๊ณ ์ • ํฌ๊ธฐ์˜ ๋ธ”๋ก ๊ทธ๋ฃน์œผ๋กœ ๋ถ„ํ• ํ•œ๋‹ค. ๊ธฐ๋ณธ ๋ธ”๋ก ํฌ๊ธฐ 4KB ๊ธฐ์ค€์œผ๋กœ ๊ฐ ๊ทธ๋ฃน์€ 32,768๊ฐœ์˜ ๋ธ”๋ก์„ ํฌํ•จํ•˜๋ฉฐ(128MB), ํ• ๋‹น์ž๋Š” ๊ฐ™์€ ํŒŒ์ผ์˜ ๋ธ”๋ก์„ ๋™์ผ ๊ทธ๋ฃน ๋‚ด์— ์œ ์ง€ํ•˜์—ฌ ํƒ์ƒ‰ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•œ๋‹ค.

์œ ์—ฐํ•œ ๋ธ”๋ก ๊ทธ๋ฃน(Flexible Block Groups, flex_bg)์€ ์—ฌ๋Ÿฌ ๋ธ”๋ก ๊ทธ๋ฃน์„ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ๋น„ํŠธ๋งต, inode ํ…Œ์ด๋ธ” ๋“ฑ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ์† ๋ฐฐ์น˜ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด:

  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์‹œ ๋””์Šคํฌ ํƒ์ƒ‰ ํšŸ์ˆ˜ ๊ฐ์†Œ
  • ํŒŒ์ผ ์‹œ์Šคํ…œ ํ™•์žฅ ์‹œ ์„ฑ๋Šฅ ์ €ํ•˜ ์ตœ์†Œํ™”
  • inode ํ• ๋‹น ํšจ์œจ ํ–ฅ์ƒ

๋””๋ ‰ํ† ๋ฆฌ ์ธ๋ฑ์‹ฑ (HTree)

ext4๋Š” ๋Œ€ํ˜• ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์„ ํ˜• ๊ฒ€์ƒ‰ ๋น„์šฉ์ด ์ปค์ง€๋Š” ๋ฌธ์ œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด HTree ๊ธฐ๋ฐ˜ ๋””๋ ‰ํ† ๋ฆฌ ์ธ๋ฑ์‹ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค. ํŒŒ์ผ ์ด๋ฆ„ ํ•ด์‹œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋””๋ ‰ํ† ๋ฆฌ ์—”ํŠธ๋ฆฌ๋ฅผ ๋ถ„์‚ฐํ•ด ์ €์žฅํ•˜๋ฏ€๋กœ ์ˆ˜๋งŒ ๊ฐœ ์ด์ƒ์˜ ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์—์„œ๋„ ์กฐํšŒ์™€ ์ƒ์„ฑ ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํžˆ ์•…ํ™”๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋ฉ”์ผ ์Šคํ’€, ๋กœ๊ทธ ์ ์žฌ ๋””๋ ‰ํ† ๋ฆฌ, ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ด์–ด ์บ์‹œ์ฒ˜๋Ÿผ ์—”ํŠธ๋ฆฌ ์ˆ˜๊ฐ€ ๋งŽ์€ ์›Œํฌ๋กœ๋“œ์—์„œ ํŠนํžˆ ์ค‘์š”ํ•˜๋‹ค.

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฒดํฌ์„ฌ

ext4๋Š” ๋ชจ๋“  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(inode, ๋””๋ ‰ํ† ๋ฆฌ ์—”ํŠธ๋ฆฌ, extents, ๋น„ํŠธ๋งต ๋“ฑ)์— CRC-32C ์ฒดํฌ์„ฌ์„ ๋„์ž…ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฐ•ํ™”ํ–ˆ๋‹ค. ext3์—์„œ๋Š” ์ฒดํฌ์„ฌ์ด ์—†์–ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์†์ƒ์„ ์ฆ‰์‹œ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

๋น ๋ฅธ fsck

ext3์—์„œ fsck์€ ๋ชจ๋“  inode๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฒ€์‚ฌํ•˜๋ฏ€๋กœ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ํด์ˆ˜๋ก ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค. ext4๋Š” ๊ฐ ๋ธ”๋ก ๊ทธ๋ฃน์˜ inode ํ…Œ์ด๋ธ” ๋์— ๋ฏธ์‚ฌ์šฉ inode ๋ชฉ๋ก(์ฒดํฌ์„ฌ ํฌํ•จ)์„ ์ €์žฅํ•˜์—ฌ, fsck์ด ์‚ฌ์šฉ ์ค‘์ธ inode๋งŒ ๊ฒ€์‚ฌํ•˜๋„๋ก ํ•œ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด fsck ์‹œ๊ฐ„์ด ์ตœ๋Œ€ 20๋ฐฐ ๋‹จ์ถ•๋˜๋ฉฐ, ๋Œ€๊ทœ๋ชจ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ๋„ ๋น ๋ฅธ ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ, ๋ฏธ์‚ฌ์šฉ inode ๋ชฉ๋ก์€ fsck ์‹คํ–‰ ์‹œ ์ƒ์„ฑ๋˜๋ฏ€๋กœ, ์ฒซ ๋ฒˆ์งธ fsck ์‹คํ–‰ ํ›„๋ถ€ํ„ฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.

์˜จ๋ผ์ธ ๋””ํ”„๋ž˜๊ทธ๋ฉ˜ํ…Œ์ด์…˜

์ง€์—ฐ ํ• ๋‹น๊ณผ extent๋Š” ์กฐ๊ฐํ™”๋ฅผ ์ค„์ด์ง€๋งŒ, ์žฅ๊ธฐ ์‚ฌ์šฉ ์‹œ ์กฐ๊ฐํ™”๋Š” ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•œ๋‹ค. ext4๋Š” e4defrag ๋„๊ตฌ๋ฅผ ํ†ตํ•œ ์˜จ๋ผ์ธ ๋””ํ”„๋ž˜๊ทธ๋ฉ˜ํ…Œ์ด์…˜์„ ์ง€์›ํ•˜๋ฉฐ, ํŒŒ์ผ ์‹œ์Šคํ…œ ๋งˆ์šดํŠธ ์ƒํƒœ์—์„œ ๊ฐœ๋ณ„ ํŒŒ์ผ ๋˜๋Š” ์ „์ฒด ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ์กฐ๊ฐ ๋ชจ์Œ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Inode ๊ด€๋ จ ๊ธฐ๋Šฅ

  • ํ™•์žฅ๋œ inode ํฌ๊ธฐ: ๊ธฐ๋ณธ 256๋ฐ”์ดํŠธ(ext3 128๋ฐ”์ดํŠธ ๋Œ€๋น„ 2๋ฐฐ)๋กœ, ๋‚˜๋…ธ์ดˆ ํƒ€์ž„์Šคํƒฌํ”„, inode ๋ฒ„์ €๋‹, ํ™•์žฅ ์†์„ฑ(Extended Attributes)์„ ์œ„ํ•œ ๊ณต๊ฐ„์„ ํ™•๋ณด
  • ๋‚˜๋…ธ์ดˆ ํƒ€์ž„์Šคํƒฌํ”„: ์ˆ˜์ • ์‹œ๊ฐ„(mtime) ๋“ฑ์˜ ํ•ด์ƒ๋„๊ฐ€ ์ดˆ ๋‹จ์œ„์—์„œ ๋‚˜๋…ธ์ดˆ ๋‹จ์œ„๋กœ ํ–ฅ์ƒ
  • inode ์˜ˆ์•ฝ: ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ ์‹œ inode๋ฅผ ์‚ฌ์ „ ์˜ˆ์•ฝํ•˜์—ฌ ํŒŒ์ผ ์ƒ์„ฑ/์‚ญ์ œ ์„ฑ๋Šฅ ํ–ฅ์ƒ
  • ์˜์† ์‚ฌ์ „ ํ• ๋‹น(persistent preallocation): posix_fallocate()๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•„์š”๋กœ ํ•  ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ํ™•๋ณด

๋น„๊ต/๋ถ„์„

ext3 vs ext4 ์ฃผ์š” ๊ฐœ์„  ๋น„๊ต

ํ•ญ๋ชฉ ext3 ext4
์ตœ๋Œ€ ํŒŒ์ผ ์‹œ์Šคํ…œ ํฌ๊ธฐ 16TB 1EB
์ตœ๋Œ€ ํŒŒ์ผ ํฌ๊ธฐ 2TB 16TB
๋ธ”๋ก ํ• ๋‹น ๋ฐฉ์‹ ๋‹จ์ผ ๋ธ”๋ก ํ• ๋‹น ๋‹ค์ค‘ ๋ธ”๋ก ํ• ๋‹น(MBAlloc)
ํ• ๋‹น ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๊ฐ„์ ‘ ๋ธ”๋ก ๋งคํ•‘ Extent ๊ธฐ๋ฐ˜
๋””์Šคํฌ ํฌ๋งท ๊ณ ์ • ์œ ์—ฐํ•œ ๋ธ”๋ก ๊ทธ๋ฃน, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฒดํฌ์„ฌ
์ €๋„๋ง jbd jbd2 (์ฒดํฌ์„ฌ ์ง€์›)
inode ํฌ๊ธฐ 128B (๊ธฐ๋ณธ) 256B (๊ธฐ๋ณธ)
ํƒ€์ž„์Šคํƒฌํ”„ ํ•ด์ƒ๋„ ์ดˆ ๋‚˜๋…ธ์ดˆ
fsck ์‹œ๊ฐ„ ์ „์ฒด inode ๊ฒ€์‚ฌ ๋ฏธ์‚ฌ์šฉ inode ๋ชฉ๋ก์œผ๋กœ ์Šคํ‚ต

์„ฑ๋Šฅ ํŠน์„ฑ

์›Œํฌ๋กœ๋“œ ext4 ์„ฑ๋Šฅ ํŠน์„ฑ
๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์ˆœ์ฐจ I/O ์šฐ์ˆ˜ (extent + MBAlloc)
๋Œ€๋Ÿ‰ ์†Œ๊ทœ๋ชจ ํŒŒ์ผ ์ƒ์„ฑ ์–‘ํ˜ธ (inode ์˜ˆ์•ฝ, flex_bg)
๋””๋ ‰ํ† ๋ฆฌ ์Šค์บ” ์–‘ํ˜ธ (HTree ์ธ๋ฑ์Šค)
fsck ์‹œ๊ฐ„ ๋น ๋ฆ„ (๋ฏธ์‚ฌ์šฉ inode ์Šคํ‚ต)
์กฐ๊ฐํ™” ๋‚ฎ์Œ (์ง€์—ฐ ํ• ๋‹น + extent)
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ตœ์†Œ

ext4 vs ๋‹ค๋ฅธ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋น„๊ต

๊ธฐ๋Šฅ ext4 XFS Btrfs ZFS
์ตœ๋Œ€ ํŒŒ์ผ ์‹œ์Šคํ…œ 1EB 8EiB 16EiB 256ZiB
CoW ์•„๋‹ˆ์˜ค ๋ฆฌํ”Œ๋ง ์„ ํƒ ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค์ดํ‹ฐ๋ธŒ
๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ƒ…์ƒท ์•„๋‹ˆ์˜ค ์•„๋‹ˆ์˜ค ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค์ดํ‹ฐ๋ธŒ
ํˆฌ๋ช… ์••์ถ• ์•„๋‹ˆ์˜ค ์•„๋‹ˆ์˜ค ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค์ดํ‹ฐ๋ธŒ
์ค‘๋ณต ์ œ๊ฑฐ ์•„๋‹ˆ์˜ค ์‹คํ—˜์  ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค์ดํ‹ฐ๋ธŒ
๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฒดํฌ์„ฌ CRC-32C ๋ฆฌ๋ฒ„์Šค ๋งคํ•‘ B+tree CRC-32C/xxHash/SHA256 ๊ณ„์ธต์ 
์˜จ๋ผ์ธ ์ถ•์†Œ ์•„๋‹ˆ์˜ค ์•„๋‹ˆ์˜ค ์ง€์› ์ง€์›

๋™์ž‘ ์›๋ฆฌ

๋ธ”๋ก ํ• ๋‹น ํ๋ฆ„

  1. write() ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์‹œ ๋ฐ์ดํ„ฐ๋Š” ํŽ˜์ด์ง€ ์บ์‹œ(Page Cache)์— ๊ธฐ๋ก๋จ
  2. ์ง€์—ฐ ํ• ๋‹น์— ์˜ํ•ด ๋ธ”๋ก ํ• ๋‹น์ด ์—ฐ๊ธฐ๋จ (๋””์Šคํฌ ๊ธฐ๋ก ์‹œ์ ๊นŒ์ง€ ๋Œ€๊ธฐ)
  3. ํ”Œ๋Ÿฌ์‹œ(Flush) ์‹œ MBAlloc์ด ํŒŒ์ผ์˜ ์ตœ์ข… ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ตœ์  ๋ธ”๋ก ์œ„์น˜ ๊ฒฐ์ •
  4. Extent ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฐ์† ๋ธ”๋ก์„ ํ• ๋‹นํ•˜๊ณ , inode์— extent ์—”ํŠธ๋ฆฌ ๊ธฐ๋ก
  5. jbd2 ์ €๋„์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ๋ก ํ›„ ์ปค๋ฐ‹
  6. ๋ฐฐ๋ฆฌ์–ด(Barrier)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ €๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋””์Šคํฌ์— ๊ธฐ๋ก๋œ ํ›„ ์ปค๋ฐ‹ ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ก
  7. ์ปค๋ฐ‹ ์ดํ›„ ์ฒดํฌํฌ์ธํŠธ ๋‹จ๊ณ„์—์„œ ์‹ค์ œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ธ”๋ก์ด ๋ณธ๋ž˜ ์œ„์น˜์— ๋ฐ˜์˜๋จ

jbd2 ์ €๋„ ๋™์ž‘

jbd2๋Š” ์ˆœ์ฐจ์  ๋กœ๊ทธ ๊ตฌ์กฐ๋กœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ๋กํ•œ๋‹ค:

  1. ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ ์‹œ ์ƒˆ ๋ฒˆํ˜ธ ํ• ๋‹น
  2. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋ธ”๋ก์„ ์ €๋„ ์˜์—ญ์— ์ˆœ์ฐจ ๊ธฐ๋ก
  3. ์ปค๋ฐ‹ ๋ ˆ์ฝ”๋“œ์— ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ์™€ ์ฒดํฌ์„ฌ ๊ธฐ๋ก
  4. ์ปค๋ฐ‹ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋””์Šคํฌ์— ๊ธฐ๋ก๋˜๋ฉด ํŠธ๋žœ์žญ์…˜ ์™„๋ฃŒ
  5. ์ปค๋ฐ‹ ์™„๋ฃŒ๋œ ํŠธ๋žœ์žญ์…˜์€ ์ฒดํฌํฌ์ธํŠธ ์‹œ ์‹ค์ œ ๋ธ”๋ก ์œ„์น˜๋กœ ๋ฐ˜์˜

Inode์™€ Extent Tree ๊ตฌ์กฐ

Inode
โ”œโ”€โ”€ i_block[60 bytes]: Direct extents (์ตœ๋Œ€ 4๊ฐœ)
โ”‚   โ””โ”€โ”€ ๊ฐ extent: [logical_start, length, physical_start]
โ”œโ”€โ”€ Extent Tree (์ดˆ๊ณผ ์‹œ)
โ”‚   โ”œโ”€โ”€ Header (eh_depth, eh_entries)
โ”‚   โ”œโ”€โ”€ Internal Node: [ei_block, ei_leaf_hi, ei_leaf_lo]
โ”‚   โ””โ”€โ”€ Leaf: [ee_block, ee_len, ee_start_hi, ee_start_lo]
โ””โ”€โ”€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ (UID, GID, ๊ถŒํ•œ, timestamps)

์žฅ๋‹จ์ 

์žฅ์ 

์žฅ์  ์„ค๋ช…
์•ˆ์ •์„ฑ๊ณผ ์„ฑ์ˆ™๋„ 2008๋…„ ์ดํ›„ ์ง€์†์ ์ธ ๊ฐœ์„ ๊ณผ ์šด์˜ ํ™˜๊ฒฝ ๊ฒ€์ฆ
๋†’์€ ํ˜ธํ™˜์„ฑ ๊ฑฐ์˜ ๋ชจ๋“  ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ ์ง€์›, ext3์—์„œ ๋ฌด์†์‹ค ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฐ€๋Šฅ
๋‚ฎ์€ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ CPU ์‚ฌ์šฉ์ด ์ตœ์†Œํ™”๋˜์–ด ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ์—๋„ ์ ํ•ฉ
๋น ๋ฅธ fsck ๋ฏธ์‚ฌ์šฉ inode ๋ชฉ๋ก์œผ๋กœ ๋Œ€๊ทœ๋ชจ ํŒŒ์ผ ์‹œ์Šคํ…œ๋„ ๋น ๋ฅธ ๋ณต๊ตฌ
ํ™•์žฅ๋œ ์ธํ”„๋ผ 1EB ํŒŒ์ผ ์‹œ์Šคํ…œ, 16TB ํŒŒ์ผ, ๋‚˜๋…ธ์ดˆ ํƒ€์ž„์Šคํƒฌํ”„ ์ง€์›
์˜จ๋ผ์ธ ๋””ํ”„๋ž˜๊ทธ ๋งˆ์šดํŠธ ์ค‘ ์กฐ๊ฐ ๋ชจ์Œ ๊ฐ€๋Šฅ

๋‹จ์ 

๋‹จ์  ์„ค๋ช…
CoW ๋ฏธ์ง€์› ๊ธฐ๋ณธ์ ์œผ๋กœ in-place ์“ฐ๊ธฐ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌ/์Šค๋ƒ…์ƒท ๋ฏธ์ง€์›
๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ƒ…์ƒท ๋ถ€์žฌ LVM ๋“ฑ ๋ณ„๋„ ๋ณผ๋ฅจ ๊ด€๋ฆฌ์ž ํ•„์š”
๋ฐ์ดํ„ฐ ์ฒดํฌ์„ฌ ์—†์Œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ์ฒดํฌ์„ฌ, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ ๋ถˆ์™„์ „
ํˆฌ๋ช… ์••์ถ• ๋ฏธ์ง€์› Btrfs/ZFS ๋Œ€๋น„ ์ €์žฅ ๊ณต๊ฐ„ ํšจ์œจ์„ฑ ๋‚ฎ์Œ
์˜จ๋ผ์ธ ์ถ•์†Œ ๋ถˆ๊ฐ€ ๋ณผ๋ฅจ ํ™•์žฅ๋งŒ ๊ฐ€๋Šฅ, ์ถ•์†Œ ์‹œ ๋ฐฑ์—…/์žฌ์ƒ์„ฑ ํ•„์š”
RAID ๋ฏธํ†ตํ•ฉ mdadm ๋“ฑ ์™ธ๋ถ€ RAID ๊ด€๋ฆฌ ํ•„์š”

๊ด€๋ จ ๊ธฐ์ˆ 

์ฐธ๊ณ  ๋ฌธํ—Œ

  • The Linux Kernel Documentation: Filesystems - ext4
  • The Linux Kernel Documentation: ext4 General Information
  • ext4 Wiki: https://ext4.wiki.kernel.org
  • Kernelnewbies.org: Ext4
  • Rik Van Riel et al., "ext4 Design Documents and Specification"
  • Alex Tomas, "ext4 block and inode allocation"
  • e2fsprogs project: https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git

ํ•ต์‹ฌ ์ •๋ฆฌ

  1. ext4๋Š” ext3์˜ ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•œ ๋ฒ”์šฉ ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ, extent ๊ธฐ๋ฐ˜ ํ• ๋‹น๊ณผ MBAlloc์„ ํ†ตํ•ด ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ๊ณผ ์กฐ๊ฐํ™” ๋ฐฉ์ง€ ๋Šฅ๋ ฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œ์ผฐ๋‹ค.
  2. ์ง€์—ฐ ํ• ๋‹น์€ write() ์‹œ ๋ธ”๋ก ํ• ๋‹น์„ ์—ฐ๊ธฐํ•˜์—ฌ ํ• ๋‹น์ž๊ฐ€ ์ตœ์  ์œ„์น˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ, extent/MBAlloc๊ณผ ๊ฒฐํ•ฉ๋˜์–ด ์กฐ๊ฐํ™”๋ฅผ ๋Œ€ํญ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.
  3. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฒดํฌ์„ฌ๊ณผ jbd2 ์ €๋„์€ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฐ•ํ™”ํ•˜๊ณ , ๋ฏธ์‚ฌ์šฉ inode ๋ชฉ๋ก ๊ธฐ๋ฐ˜ ๋น ๋ฅธ fsck๋กœ ๋Œ€๊ทœ๋ชจ ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋ณต๊ตฌ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•œ๋‹ค.
  4. ๋‹จ์ ์œผ๋กœ๋Š” CoW, ๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ƒ…์ƒท, ๋ฐ์ดํ„ฐ ์ฒดํฌ์„ฌ, ํˆฌ๋ช… ์••์ถ• ๋ฏธ์ง€์› ๋“ฑ์ด ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ Btrfs/ZFS๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
  5. ext4๋Š” ์•ˆ์ •์„ฑ๊ณผ ํ˜ธํ™˜์„ฑ์„ ์ตœ์šฐ์„ ์œผ๋กœ ์„ค๊ณ„๋˜์–ด ๊ฑฐ์˜ ๋ชจ๋“  ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์—์„œ ๊ธฐ๋ณธ ๋˜๋Š” ์„ ํƒ ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ™•์žฅ๋œ ์ธํ”„๋ผ(1EB/16TB)๋กœ ๋Œ€๊ทœ๋ชจ ์Šคํ† ๋ฆฌ์ง€ ํ™˜๊ฒฝ์—์„œ๋„ ํ™œ์šฉ๋œ๋‹ค.
ext4 ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”

ext4 ๋ธ”๋ก ํ• ๋‹น ํ๋ฆ„