LVM๊ณผ Matryoshka์˜ ๊ณตํ†ต์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”.
md RAID + LVM์„ ์‚ฌ์šฉํ•˜์—ฌ KVM์šฉ ๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•œ ์‹ค์ œ ๊ฒฝํ—˜์„ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • NVMe SSD์—์„œ md RAID 1์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.
  • SATA SSD ๋ฐ ์ผ๋ฐ˜ ๋“œ๋ผ์ด๋ธŒ์—์„œ md RAID 6์„ ์กฐ๋ฆฝํ•ฉ๋‹ˆ๋‹ค.
  • SSD RAID 1/6์˜ TRIM/DISCARD ์ž‘์—… ๊ธฐ๋Šฅ.
  • ๊ณตํ†ต ๋””์Šคํฌ ์„ธํŠธ์— ๋ถ€ํŒ… ๊ฐ€๋Šฅํ•œ md RAID 1/6 ์–ด๋ ˆ์ด ์ƒ์„ฑ.
  • BIOS์— NVMe ์ง€์›์ด ์—†๋Š” ๊ฒฝ์šฐ NVMe RAID 1์— ์‹œ์Šคํ…œ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • LVM ์บ์‹œ ๋ฐ LVM ์”ฌ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • BTRFS ์Šค๋ƒ…์ƒท์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐฑ์—…์„ ์œ„ํ•ด ๋ณด๋‚ด๊ธฐ/๋ฐ›๊ธฐ.
  • BTRFS ์Šคํƒ€์ผ ๋ฐฑ์—…์„ ์œ„ํ•ด LVM ์”ฌ ์Šค๋ƒ…์ƒท๊ณผ Thin_delta๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ด€์‹ฌ์ด ์žˆ์œผ์‹œ๋ฉด ๊ณ ์–‘์ด๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์„ฑ๋ช…์„œ

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

  • ๋ฐ”์‚ญํ•˜๊ฒŒ ํŠ€๊ธด NVMe SSD.
  • ๋…นํ™” ๋ฆฌ์†Œ์Šค๋ฅผ ์™„์ „ํžˆ ์‚ฌ์šฉํ•˜๊ณ  SSD ๋“œ๋ผ์ด๋ธŒ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐฑ์—… ๋ณต์‚ฌ๋ณธ์„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ๋“œ๋ผ์ด๋ธŒ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์™„์ „ํžˆ ์†์‹ค๋ฉ๋‹ˆ๋‹ค.
  • ์ปดํ“จํ„ฐ ํ•˜๋“œ์›จ์–ด์— ๊ฒฐํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„, ์‹ ๊ฒฝ, ๋ˆ์„ ๋‚ญ๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์œ„์— ๋‚˜์—ด๋˜์ง€ ์•Š์€ ๊ธฐํƒ€ ๊ฒฐ๊ณผ.

์ฒ 

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•ญ๋ชฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Z2013 ์นฉ์…‹์„ ํƒ‘์žฌํ•˜๊ณ  Intel Core i87/Haswell์„ ๊ฐ–์ถ˜ 7๋…„๊ฒฝ ๋งˆ๋”๋ณด๋“œ.

  • ํ”„๋กœ์„ธ์„œ 4์ฝ”์–ด, 8์Šค๋ ˆ๋“œ
  • 32GB DDR3 RAM
  • 1๊ฐœ์˜ 16 ๋˜๋Š” 2๊ฐœ์˜ 8 PCIe 3.0
  • 1x4 + 1x1 PCIe 2.0
  • 6 x 6GBps SATA 3 ์ปค๋„ฅํ„ฐ

SAS ์–ด๋Œ‘ํ„ฐ LSI SAS9211-8I๊ฐ€ IT/HBA ๋ชจ๋“œ๋กœ ํ”Œ๋ž˜์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. RAID ์ง€์› ํŽŒ์›จ์–ด๋Š” ์˜๋„์ ์œผ๋กœ HBA ํŽŒ์›จ์–ด๋กœ ๊ต์ฒด๋˜์–ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์–ธ์ œ๋“ ์ง€ ์ด ์–ด๋Œ‘ํ„ฐ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์–ด๋Œ‘ํ„ฐ๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. TRIM/Discard๋Š” ๋””์Šคํฌ์—์„œ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด... RAID ํŽŒ์›จ์–ด์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ช…๋ น์ด ์ „ํ˜€ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ HBA๋Š” ๋ฒ„์Šค๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๋ช…๋ น์ด ์ „์†ก๋˜๋Š”์ง€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜๋“œ ๋“œ๋ผ์ด๋ธŒ - ๋…ธํŠธ๋ถ์˜ ๊ฒฝ์šฐ 8 ํผ ํŒฉํ„ฐ์— 7TB ์šฉ๋Ÿ‰์„ ๊ฐ–์ถ˜ HGST Travelstar 1000K1 2.5๊ฐœ. ์ด๋Ÿฌํ•œ ๋“œ๋ผ์ด๋ธŒ๋Š” ์ด์ „์— RAID 6 ์–ด๋ ˆ์ด์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋˜ํ•œ ์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ์—์„œ๋„ ์‚ฌ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌ ๋ฐฑ์—…์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋กœ ๋‹ค์Œ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

6๊ฐœ SATA SSD ๋ชจ๋ธ Samsung 860 QVO 2TB. ์ด๋Ÿฌํ•œ SSD์—๋Š” ๋Œ€์šฉ๋Ÿ‰์ด ํ•„์š”ํ•˜๊ณ , SLC ์บ์‹œ์˜ ์กด์žฌ, ์‹ ๋ขฐ์„ฑ, ์ €๋ ดํ•œ ๊ฐ€๊ฒฉ์ด ์š”๊ตฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ๊ธฐ/XNUMX ์ง€์›์ด ํ•„์š”ํ•˜๋ฉฐ ์ด๋Š” dmesg์˜ ์ค„๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

kernel: ata1.00: Enabling discard_zeroes_data

NVMe SSD ๋ชจ๋ธ Samsung SSD 2 EVO 970GB 500๊ฐœ.

์ด๋Ÿฌํ•œ SSD์˜ ๊ฒฝ์šฐ ํ•„์š”์— ๋งž๋Š” ์ž„์˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์†๋„์™€ ๋ฆฌ์†Œ์Šค ์šฉ๋Ÿ‰์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์„ ์œ„ํ•œ ๋ผ๋””์—์ดํ„ฐ. ๋ฐ˜๋“œ์‹œ. ์ „์ ์œผ๋กœ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ฒซ ๋ฒˆ์งธ RAID ๋™๊ธฐํ™” ์ค‘์— ๋ฐ”์‚ญํ•ด์งˆ ๋•Œ๊นŒ์ง€ ํŠ€๊ฒจ์ฃผ์„ธ์š”.

PCIe 8 2x ์Šฌ๋กฏ์— ์„ค์น˜๋œ 2 x NVMe SSD์šฉ StarTech PEX2M3.0E8 ์–ด๋Œ‘ํ„ฐ. ์ด๊ฒƒ์€ ๋‹ค์‹œ HBA์ผ ๋ฟ์ด์ง€๋งŒ NVMe์šฉ์ž…๋‹ˆ๋‹ค. ๋‚ด์žฅํ˜• PCIe ์Šค์œ„์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ๋”๋ณด๋“œ์—์„œ PCIe ๋ถ„๊ธฐ ์ง€์›์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์—์„œ ์ €๋ ดํ•œ ์–ด๋Œ‘ํ„ฐ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. x1 PCIe 1.0 ์Šฌ๋กฏ์ด๋”๋ผ๋„ PCIe๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ์‹œ์Šคํ…œ์—์„œ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์—ฐํžˆ ์ ์ ˆํ•œ ์†๋„๋กœ. ๊ฑฐ๊ธฐ์—๋Š” RAID๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ณด๋“œ์—๋Š” ๋‚ด์žฅ BIOS๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ์Šคํ…œ์€ NVMe๋กœ ๋ถ€ํŒ…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋ฐฐ์šฐ์ง€ ์•Š์œผ๋ฉฐ, ์ด ์žฅ์น˜ ๋•๋ถ„์— NVMe RAID๋„ ํ•™์Šตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์‹œ์Šคํ…œ์— ๋ฌด๋ฃŒ 8x PCIe 3.0์ด ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ, ์—ฌ์œ  ์Šฌ๋กฏ์ด 2๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ 4ํŽ˜๋‹ˆ PEX2M1E600 ๋˜๋Š” ์œ ์‚ฌ ์ œํ’ˆ์œผ๋กœ ์‰ฝ๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์–ด๋””์—์„œ๋‚˜ XNUMX๋‹ฌ๋Ÿฌ์— ๊ตฌ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฃจ๋ธ”.

๋ชจ๋“  ์ข…๋ฅ˜์˜ ํ•˜๋“œ์›จ์–ด๋‚˜ ๋‚ด์žฅ ์นฉ์…‹/BIOS RAID๋ฅผ ์˜๋„์ ์œผ๋กœ ๊ฑฐ๋ถ€ํ•œ ์ด์œ ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์กดํ•˜๋ฉด์„œ SSD/HDD ์ž์ฒด๋ฅผ ์ œ์™ธํ•œ ์ „์ฒด ์‹œ์Šคํ…œ์„ ์™„์ „ํžˆ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ์™„์ „ํžˆ ์ƒˆ๋กญ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํ•˜๋“œ์›จ์–ด๋กœ ์ด๋™ํ•  ๋•Œ ์„ค์น˜๋œ ์šด์˜ ์ฒด์ œ๋„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ SATA ๋ฐ PCIe ํฌํŠธ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ CD๋‚˜ ๋ถ€ํŒ… ๊ฐ€๋Šฅํ•œ ํ”Œ๋ž˜์‹œ ๋“œ๋ผ์ด๋ธŒ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋งค์šฐ ๋น ๋ฅด๊ณ  ์•ฝ๊ฐ„ ๋ถ€ํ”ผ๊ฐ€ ํฝ๋‹ˆ๋‹ค.

ะฎะผะพั€๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ๊ธด๊ธ‰ํ•˜๊ฒŒ ์ „์ฒด ์–ด๋ ˆ์ด๋ฅผ ๊ฐ€์ ธ๊ฐ€์•ผ ํ•  ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์žƒ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์–ธ๊ธ‰๋œ ๋ชจ๋“  ๋ฏธ๋””์–ด๋Š” ํ‘œ์ค€ ์ผ€์ด์Šค์˜ 5.25 ๋ฒ ์ด ์Šฌ๋ผ์ด๋“œ์— ํŽธ๋ฆฌํ•˜๊ฒŒ ์œ„์น˜ํ•ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก , Linux์—์„œ SSD ์บ์‹ฑ์˜ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์‹คํ—˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

ํ•˜๋“œ์›จ์–ด ์Šต๊ฒฉ์€ ์ง€๋ฃจํ•ฉ๋‹ˆ๋‹ค. ์ „์›์„ ์ผœ์‹ญ์‹œ์˜ค. ์ž‘๋™ํ•˜๊ฑฐ๋‚˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  mdadm์—๋Š” ํ•ญ์ƒ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋“œ๋Ÿฌ์šด

์ด์ „์—๋Š” EOL์— ๊ฐ€๊นŒ์šด ํ•˜๋“œ์›จ์–ด์— Debian 8 Jessie๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. RAID 6์€ LVM๊ณผ ์Œ์„ ์ด๋ฃจ๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ HDD๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. kvm/libvirt์—์„œ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ์ €์ž๋Š” ํœด๋Œ€์šฉ ๋ถ€ํŒ… ๊ฐ€๋Šฅํ•œ SATA/NVMe ํ”Œ๋ž˜์‹œ ๋“œ๋ผ์ด๋ธŒ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์ ํ•ฉํ•œ ๊ฒฝํ—˜์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ๋˜ํ•œ ์ผ๋ฐ˜์ ์ธ ์ ์ ˆํ•œ ํ…œํ”Œ๋ฆฟ์„ ๊นจ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋Œ€์ƒ ์‹œ์Šคํ…œ์œผ๋กœ ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ์•ˆ์ •ํ™”๋˜์—ˆ์ง€๋งŒ ์•„์ง 18.04๋…„์ด ๋„˜๋Š” Ubuntu 3๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋„ ์ง€์›.

์–ธ๊ธ‰๋œ ์‹œ์Šคํ…œ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ชจ๋“  ํ•˜๋“œ์›จ์–ด ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์‚ฌ ์†Œํ”„ํŠธ์›จ์–ด๋‚˜ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„ค์น˜ ์ค€๋น„

์‹œ์Šคํ…œ์„ ์„ค์น˜ํ•˜๋ ค๋ฉด Ubuntu Desktop Image๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‹œ์Šคํ…œ์—๋Š” ์ผ์ข…์˜ ๊ฐ•๋ ฅํ•œ ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ๋Š”๋ฐ, ์ด๋Š” UEFI ์‹œ์Šคํ…œ ํŒŒํ‹ฐ์…˜์„ ๋””์Šคํฌ ์ค‘ ํ•˜๋‚˜์— ๋ฐ€์–ด ๋„ฃ์–ด ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†๋Š” ๊ณผ๋„ํ•œ ๋…๋ฆฝ์„ฑ์„ ๋ณด์—ฌ ๋ชจ๋“  ์•„๋ฆ„๋‹ค์›€์„ ์†์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ UEFI ๋ชจ๋“œ์—์„œ๋งŒ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์˜ต์…˜๋„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์— ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?๋ถˆํ–‰ํ•˜๊ฒŒ๋„ UEFI ๋ถ€ํŒ…์€ ๋ถ€ํŒ… ์†Œํ”„ํŠธ์›จ์–ด RAID์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š”... UEFI ESP ํŒŒํ‹ฐ์…˜์— ๋Œ€ํ•œ ์˜ˆ์•ฝ์„ ์ œ๊ณตํ•˜๋Š” ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์Šต๋‹ˆ๋‹ค. USB ํฌํŠธ์˜ ํ”Œ๋ž˜์‹œ ๋“œ๋ผ์ด๋ธŒ์— ESP ํŒŒํ‹ฐ์…˜์„ ๋ฐฐ์น˜ํ•˜๋„๋ก ์ œ์•ˆํ•˜๋Š” ๋ ˆ์‹œํ”ผ๊ฐ€ ์˜จ๋ผ์ธ์— ์žˆ์ง€๋งŒ ์ด๋Š” ์‹คํŒจ ์ง€์ ์ž…๋‹ˆ๋‹ค. UEFI BIOS๊ฐ€ ์ด ํŒŒํ‹ฐ์…˜์„ ๋ณด๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์ง€ ์•Š๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฒ„์ „ 1์˜ ์†Œํ”„ํŠธ์›จ์–ด mdadm RAID 0.9์„ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ์‹œํ”ผ๊ฐ€ ์žˆ์ง€๋งŒ ์ด๋Š” BIOS ๋˜๋Š” ๋‹ค๋ฅธ ํ•˜๋“œ์›จ์–ด OS๊ฐ€ ESP์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์“ฐ๊ณ  ๋‹ค๋ฅธ ํ•˜๋“œ์›จ์–ด์™€ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ฆฌ๋Š” ํ–‰๋ณตํ•œ ์ˆœ๊ฐ„๊นŒ์ง€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๊ฑฐ์šธ.

๋˜ํ•œ UEFI ๋ถ€ํŒ…์€ NVRAM์— ์˜์กดํ•˜๋ฉฐ ์ด๋Š” ๋””์Šคํฌ์™€ ํ•จ๊ป˜ ์ƒˆ ์‹œ์Šคํ…œ์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งˆ๋”๋ณด๋“œ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ UEFI ํ˜ธํ™˜ ์‹œ์Šคํ…œ์—์„œ CSM์ด๋ผ๋Š” ์ž๋ž‘์Šค๋Ÿฌ์šด ์ด๋ฆ„์„ ์ง€๋‹Œ ๋ ˆ๊ฑฐ์‹œ/BIOS ๋ถ€ํŒ…์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ธฐ์„ฑํ’ˆ์˜ ์˜ค๋žœ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ํ• ์•„๋ฒ„์ง€์˜ ์ž์ „๊ฑฐ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ๋ฐ˜์—์„œ ๊บผ๋‚ด์„œ ์œคํ™œ์œ ๋ฅผ ๋ฐ”๋ฅด๊ณ  ํƒ€์ด์–ด์— ๊ณต๊ธฐ๋ฅผ ์ฃผ์ž…ํ•œ ๋‹ค์Œ ์ –์€ ์ฒœ์œผ๋กœ ๋‹ฆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Ubuntu์˜ ๋ฐ์Šคํฌํ†ฑ ๋ฒ„์ „๋„ ๋ ˆ๊ฑฐ์‹œ ๋ถ€ํŠธ ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๋Œ€๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์—†์ง€๋งŒ ์—ฌ๊ธฐ์—๋Š” ์ตœ์†Œํ•œ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ํ•˜๋“œ์›จ์–ด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  Ubuntu Live ๋ถ€ํŒ… ๊ฐ€๋Šฅํ•œ ํ”Œ๋ž˜์‹œ ๋“œ๋ผ์ด๋ธŒ์—์„œ ์‹œ์Šคํ…œ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ท€ํ•˜์—๊ฒŒ ์ ํ•ฉํ•œ ๋„คํŠธ์›Œํฌ๋ฅผ ์„ค์ •ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ๋ฏธ๋ฆฌ ํ”Œ๋ž˜์‹œ ๋“œ๋ผ์ด๋ธŒ์— ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์Šคํฌํƒ‘ ํ™˜๊ฒฝ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ํ„ฐ๋ฏธ๋„ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

#sudo bash

์–ด๋–ป๊ฒŒโ€ฆ?์œ„์˜ ์ค„์€ sudo์— ๋Œ€ํ•œ holiwars์˜ ์ •์‹ ํŠธ๋ฆฌ๊ฑฐ์ž…๋‹ˆ๋‹ค. Cbะพ๋” ํฐ ๊ธฐํšŒ๊ฐ€ ๋‹ค๊ฐ€์˜ค๊ณ ะพ๋” ํฐ ์ฑ…์ž„. ๋ฌธ์ œ๋Š” ์Šค์Šค๋กœ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š๋ƒ๋Š” ๊ฒƒ์ด๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ sudo๋ฅผ ์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ ์–ด๋„ ์กฐ์‹ฌ์Šค๋Ÿฝ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ:

#apt-get install mdadm lvm2 thin-provisioning-tools btrfs-tools util-linux lsscsi nvme-cli mc

์™œ ZFS๊ฐ€ ์•„๋‹Œ๊ฐ€...?์ปดํ“จํ„ฐ์— ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค์น˜ํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ•˜๋“œ์›จ์–ด๋ฅผ ๋นŒ๋ ค์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ์˜ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ์ด ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‹ ๋ขฐํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์›ํ•˜๋Š” ๋น„์šฉ์— ํ•ด๋‹นํ•˜๋Š” ๋Œ€์ถœ์„ ๋ฐ›๊ฒŒ ๋˜๋ฉฐ, ์ด๋Š” ์–ธ์  ๊ฐ€ ๊ฐš์•„์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ZFS๋Š” ํŽ˜๋ผ๋ฆฌ์ด๊ณ  mdadm+lvm์€ ์ž์ „๊ฑฐ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ BTRFS...?์šด์˜ ์ฒด์ œ๋ฅผ ๋ถ€ํŒ…ํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ Legacy/BIOS GRUB์—์„œ ์ง€์›๋˜๊ณ  ๋™์‹œ์— ๋ผ์ด๋ธŒ ์Šค๋ƒ…์ƒท์„ ์ง€์›ํ•˜๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. /boot ํŒŒํ‹ฐ์…˜์— ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ €์ž๋Š” /(๋ฃจํŠธ)์— ๋Œ€ํ•ด ์ด FS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋ฉฐ ๋‹ค๋ฅธ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ฒฝ์šฐ LVM์— ๋ณ„๋„์˜ ํŒŒํ‹ฐ์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ํ•„์š”ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์žŠ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด FS์—๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด FS๋Š” ์‹œ์Šคํ…œ์„ ๋„์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ์˜ ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ ๋ณด๋‚ด๊ธฐ/๋ฐ›๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์Šค๋ƒ…์ƒท์„ ๋ฐฑ์—… ๋””์Šคํฌ๋กœ ์ „์†กํ•˜๋Š” ๋ฐ์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ €์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์†Œํ•œ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ•˜๋“œ์›จ์–ด์— ์ง์ ‘ ์œ ์ง€ํ•˜๊ณ  IOMMU๋ฅผ ํ†ตํ•ด GPU ๋ฐ PCI-USB ํ˜ธ์ŠคํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ KVM์— ์ „๋‹ฌํ•˜๋Š” ๋“ฑ์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋“œ์›จ์–ด์— ๋‚จ์€ ๊ฒƒ์€ ๋ฐ์ดํ„ฐ ์ €์žฅ, ๊ฐ€์ƒํ™”, ๋ฐฑ์—…๋ฟ์ด๋‹ค.

ZFS๋ฅผ ๋” ์‹ ๋ขฐํ•œ๋‹ค๋ฉด ์›์น™์ ์œผ๋กœ ์ง€์ •๋œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ์ƒํ˜ธ ๊ตํ™˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ €์ž๋Š” ZFS, BRTFS ๋ฐ LVM์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋‚ด์žฅ๋œ ๋ฏธ๋Ÿฌ๋ง/RAID ๋ฐ ์ค‘๋ณต์„ฑ ๊ธฐ๋Šฅ์„ ์˜๋„์ ์œผ๋กœ ๋ฌด์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ฃผ์žฅ์œผ๋กœ BTRFS์—๋Š” ๋ฌด์ž‘์œ„ ์“ฐ๊ธฐ๋ฅผ ์ˆœ์ฐจ์  ์“ฐ๊ธฐ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉฐ ์ด๋Š” HDD์˜ ์Šค๋ƒ…์ƒท/๋ฐฑ์—… ๋™๊ธฐํ™” ์†๋„์— ๋งค์šฐ ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์žฅ์น˜๋ฅผ ๋‹ค์‹œ ๊ฒ€์ƒ‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#udevadm control --reload-rules && udevadm trigger

์ฃผ์œ„๋ฅผ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#lsscsi && nvme list
[0:0:0:0] disk ATA Samsung SSD 860 2B6Q /dev/sda
[1:0:0:0] disk ATA Samsung SSD 860 2B6Q /dev/sdb
[2:0:0:0] disk ATA Samsung SSD 860 2B6Q /dev/sdc
[3:0:0:0] disk ATA Samsung SSD 860 2B6Q /dev/sdd
[4:0:0:0] disk ATA Samsung SSD 860 2B6Q /dev/sde
[5:0:0:0] disk ATA Samsung SSD 860 2B6Q /dev/sdf
[6:0:0:0] disk ATA HGST HTS721010A9 A3J0 /dev/sdg
[6:0:1:0] disk ATA HGST HTS721010A9 A3J0 /dev/sdh
[6:0:2:0] disk ATA HGST HTS721010A9 A3J0 /dev/sdi
[6:0:3:0] disk ATA HGST HTS721010A9 A3B0 /dev/sdj
[6:0:4:0] disk ATA HGST HTS721010A9 A3B0 /dev/sdk
[6:0:5:0] disk ATA HGST HTS721010A9 A3B0 /dev/sdl
[6:0:6:0] disk ATA HGST HTS721010A9 A3J0 /dev/sdm
[6:0:7:0] disk ATA HGST HTS721010A9 A3J0 /dev/sdn
Node SN Model Namespace Usage Format FW Rev
---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1 S466NXXXXXXX15L Samsung SSD 970 EVO 500GB 1 0,00 GB / 500,11 GB 512 B + 0 B 2B2QEXE7
/dev/nvme1n1 S5H7NXXXXXXX48N Samsung SSD 970 EVO 500GB 1 0,00 GB / 500,11 GB 512 B + 0 B 2B2QEXE7

๋””์Šคํฌ ๋ ˆ์ด์•„์›ƒ

NVMe SSD

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ์‹์œผ๋กœ๋“  ํ‘œ์‹œํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ BIOS์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋“œ๋ผ์ด๋ธŒ๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์™„์ „ํžˆ ์†Œํ”„ํŠธ์›จ์–ด RAID๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—๋Š” ์„น์…˜๋„ ๋งŒ๋“ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. "ํ‘œ์ค€" ๋˜๋Š” "์›์น™"์„ ๋”ฐ๋ฅด๋ ค๋ฉด HDD์™€ ๊ฐ™์€ ํ•˜๋‚˜์˜ ํฐ ํŒŒํ‹ฐ์…˜์„ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.

SATA HDD

์—ฌ๊ธฐ์„œ๋Š” ํŠน๋ณ„ํ•œ ๊ฒƒ์„ ๊ณ ์•ˆํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ์„น์…˜์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. BIOS๊ฐ€ ์ด๋Ÿฌํ•œ ๋””์Šคํฌ๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ฌ์ง€์–ด ๋ถ€ํŒ…์„ ์‹œ๋„ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ํŒŒํ‹ฐ์…˜์„ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ๊ฐ‘์ž๊ธฐ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‚˜์ค‘์— ์ด ๋””์Šคํฌ์— GRUB๋ฅผ ์„ค์น˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

#cat >hdd.part << EOF
label: dos
label-id: 0x00000000
device: /dev/sdg
unit: sectors

/dev/sdg1 : start= 2048, size= 1953523120, type=fd, bootable
EOF
#sfdisk /dev/sdg < hdd.part
#sfdisk /dev/sdh < hdd.part
#sfdisk /dev/sdi < hdd.part
#sfdisk /dev/sdj < hdd.part
#sfdisk /dev/sdk < hdd.part
#sfdisk /dev/sdl < hdd.part
#sfdisk /dev/sdm < hdd.part
#sfdisk /dev/sdn < hdd.part

SATA SSD

์ด๊ฒƒ์ด ์šฐ๋ฆฌ์—๊ฒŒ ํฅ๋ฏธ๋กœ์šด ์ผ์ด ๋˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

์ฒซ์งธ, ๋“œ๋ผ์ด๋ธŒ ํฌ๊ธฐ๋Š” 2TB์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  MBR์˜ ํ—ˆ์šฉ ๋ฒ”์œ„ ๋‚ด์— ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ GPT๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GPT ๋””์Šคํฌ์—๋Š” MBR ํ˜ธํ™˜ ์‹œ์Šคํ…œ์ด ์ฒ˜์Œ 4ํ…Œ๋ผ๋ฐ”์ดํŠธ ๋‚ด์— ์žˆ๋Š” ๊ฒฝ์šฐ ์ฒ˜์Œ 2๊ฐœ์˜ ํŒŒํ‹ฐ์…˜์„ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ˜ธํ™˜์„ฑ ๋ ˆ์ด์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ ์ด๋Ÿฌํ•œ ๋””์Šคํฌ์˜ ๋ถ€ํŒ… ํŒŒํ‹ฐ์…˜๊ณผ bios_grub ํŒŒํ‹ฐ์…˜์ด ์‹œ์ž‘ ๋ถ€๋ถ„์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด GPT ๋ ˆ๊ฑฐ์‹œ/BIOS ๋“œ๋ผ์ด๋ธŒ์—์„œ ๋ถ€ํŒ…ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ๋‘ ๊ฐœ์˜ ์„น์…˜์„ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํฌ๊ธฐ๋Š” 1GB์ด๋ฉฐ RAID 1 /boot์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ๋Š” RAID 6์— ์‚ฌ์šฉ๋˜๋ฉฐ ๋“œ๋ผ์ด๋ธŒ ๋์— ํ• ๋‹น๋˜์ง€ ์•Š์€ ์ž‘์€ ์˜์—ญ์„ ์ œ์™ธํ•˜๊ณ  ๋‚จ์€ ์—ฌ์œ  ๊ณต๊ฐ„์„ ๋ชจ๋‘ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์€ ์˜์—ญ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?๋„คํŠธ์›Œํฌ ์†Œ์Šค์— ๋”ฐ๋ฅด๋ฉด ๋‹น์‚ฌ์˜ SATA SSD์—๋Š” 6~78GB ํฌ๊ธฐ์˜ ๋™์ ์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ SLC ์บ์‹œ๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋“œ๋ผ์ด๋ธŒ ๋ฐ์ดํ„ฐ ์‹œํŠธ์˜ "๊ธฐ๊ฐ€๋ฐ”์ดํŠธ"์™€ "๊ธฐ๋น„๋ฐ”์ดํŠธ"์˜ ์ฐจ์ด๋กœ ์ธํ•ด "๋ฌด๋ฃŒ"๋กœ 6๊ธฐ๊ฐ€๋ฐ”์ดํŠธ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ 72GB๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ณต๊ฐ„์—์„œ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” SLC ์บ์‹œ๊ฐ€ ์žˆ๊ณ  ๊ณต๊ฐ„์€ 4๋น„ํŠธ MLC ๋ชจ๋“œ์—์„œ ์ ์œ ๋œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์‹ค์ƒ 4GB์˜ ์—ฌ์œ  ๊ณต๊ฐ„๋งˆ๋‹ค 1GB์˜ SLC ์บ์‹œ๋งŒ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

72GB์— 4๋ฅผ ๊ณฑํ•˜๋ฉด 288GB๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋“œ๋ผ์ด๋ธŒ๊ฐ€ SLC ์บ์‹œ๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ‘œ์‹œํ•˜์ง€ ์•Š์„ ์—ฌ์œ  ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด 312๊ฐœ์˜ ๋“œ๋ผ์ด๋ธŒ์—์„œ ์ตœ๋Œ€ 2GB์˜ SLC ์บ์‹œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋“œ๋ผ์ด๋ธŒ ์ค‘ XNUMX๊ฐœ๋Š” ์ค‘๋ณต์„ฑ์„ ์œ„ํ•ด RAID์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ์ •๋„์˜ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ œ ์ƒํ™œ์—์„œ ์“ฐ๊ธฐ๊ฐ€ ์บ์‹œ์— ์ €์žฅ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์ด ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” QLC ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ€์žฅ ์Šฌํ”ˆ ๋‹จ์ , ์ฆ‰ ์บ์‹œ๋ฅผ ์šฐํšŒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ ์“ฐ๊ธฐ ์†๋„๊ฐ€ ๋งค์šฐ ๋Š๋ฆฐ ๊ฒƒ์„ ๋งค์šฐ ์ž˜ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ถ€ํ•˜๊ฐ€ ์ด์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์‹œํŠธ์˜ TBW๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํ•ด๋‹น ๋ถ€ํ•˜์—์„œ SSD๊ฐ€ ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ์ง€์†๋˜๋Š”์ง€ ์ž์„ธํžˆ ์ƒ๊ฐํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

#cat >ssd.part << EOF
label: dos
label-id: 0x00000000
device: /dev/sda
unit: sectors

/dev/sda1 : start= 2048, size= 2097152, type=fd, bootable
/dev/sda2 : start= 2099200, size= 3300950016, type=fd
EOF
#sfdisk /dev/sda < ssd.part
#sfdisk /dev/sdb < ssd.part
#sfdisk /dev/sdc < ssd.part
#sfdisk /dev/sdd < ssd.part
#sfdisk /dev/sde < ssd.part
#sfdisk /dev/sdf < ssd.part

๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ

๋จผ์ € ์ปดํ“จํ„ฐ์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ด mdadm ๋‚ด๋ถ€ ์–ด๋”˜๊ฐ€์— ์žˆ๋Š” ๋ฐฐ์—ด ์ด๋ฆ„์˜ ์ผ๋ถ€์ด๊ณ  ์–ด๋”˜๊ฐ€์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‚˜์ค‘์— ๋ฐฐ์—ด ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ๋ถˆํ•„์š”ํ•œ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

#mcedit /etc/hostname
#mcedit /etc/hosts
#hostname
vdesk0

NVMe SSD

#mdadm --create --verbose --assume-clean /dev/md0 --level=1 --raid-devices=2 /dev/nvme[0-1]n1

์™œ ๊นจ๋—ํ•˜๋‹ค๊ณ  โ€‹โ€‹๊ฐ€์ •ํ•ฉ๋‹ˆ๊นŒ...?๋ฐฐ์—ด ์ดˆ๊ธฐํ™”๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” RAID ๋ ˆ๋ฒจ 1๊ณผ 6 ๋ชจ๋‘์— ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์ด๋ผ๋ฉด ์ดˆ๊ธฐํ™” ์—†์ด ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ SSD ์–ด๋ ˆ์ด ์ƒ์„ฑ ์‹œ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์€ TBW ์ž์› ๋‚ญ๋น„์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์กฐ๋ฆฝ๋œ SSD ์–ด๋ ˆ์ด์—์„œ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ TRIM/DISCARD๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ "์ดˆ๊ธฐํ™”"ํ•ฉ๋‹ˆ๋‹ค.

SSD ์–ด๋ ˆ์ด์˜ ๊ฒฝ์šฐ RAID 1 DISCARD๊ฐ€ ์ฆ‰์‹œ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

SSD RAID 6 DISCARD ์–ด๋ ˆ์ด์˜ ๊ฒฝ์šฐ ์ปค๋„ ๋ชจ๋“ˆ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ์ด๋ฅผ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์Šคํ…œ์˜ ๋ ˆ๋ฒจ 4/5/6 ์–ด๋ ˆ์ด์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  SSD๊ฐ€ Discard_zeroes_data๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ์ปค๋„์— ์ด ๊ธฐ๋Šฅ์ด ์ง€์›๋œ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ง€์›๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ธฐ๋Šฅ์ด ํ•ญ์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์ƒํ•œ ๋“œ๋ผ์ด๋ธŒ๋ฅผ ๋ฐœ๊ฒฌํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ฑฐ์˜ ๋ชจ๋“  ๊ณณ์—์„œ ์ง€์›์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์˜ค๋ž˜๋œ ๋“œ๋ผ์ด๋ธŒ์™€ ํŽŒ์›จ์–ด์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ RAID 6์—์„œ๋Š” DISCARD ์ง€์›์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜: ๋‹ค์Œ ๋ช…๋ น์€ "XNUMX"์œผ๋กœ ์–ด๋ ˆ์ด๋ฅผ "์ดˆ๊ธฐํ™”"ํ•˜์—ฌ NVMe ๋“œ๋ผ์ด๋ธŒ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

#blkdiscard /dev/md0

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹จ๊ณ„๋ฅผ ์ง€์ •ํ•ด ๋ณด์„ธ์š”.

#blkdiscard --step 65536 /dev/md0

SATA SSD

#mdadm --create --verbose --assume-clean /dev/md1 --level=1 --raid-devices=6 /dev/sd[a-f]1
#blkdiscard /dev/md1
#mdadm --create --verbose --assume-clean /dev/md2 --chunk-size=512 --level=6 --raid-devices=6 /dev/sd[a-f]2

์™œ ์ด๋ ‡๊ฒŒ ์ปค...?์ฒญํฌ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๋ฉด ์ฒญํฌ ํฌ๊ธฐ๋ฅผ ํฌํ•จํ•œ ๋ธ”๋ก์˜ ๋ฌด์ž‘์œ„ ์ฝ๊ธฐ ์†๋„์— ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ ์ ˆํ•œ ํฌ๊ธฐ ์ดํ•˜์˜ ํ•˜๋‚˜์˜ ์ž‘์—…์„ ๋‹จ์ผ ์žฅ์น˜์—์„œ ์™„์ „ํžˆ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์žฅ์น˜์˜ IOPS๊ฐ€ ํ•ฉ์‚ฐ๋ฉ๋‹ˆ๋‹ค. ํ†ต๊ณ„์— ๋”ฐ๋ฅด๋ฉด IO์˜ 99%๋Š” 512K๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์“ฐ๊ธฐ๋‹น RAID 6 IOPS ํ•ญ์ƒ ํ•œ ๋“œ๋ผ์ด๋ธŒ์˜ IOPS๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌด์ž‘์œ„ ์ฝ๊ธฐ์˜ ๊ฒฝ์šฐ IOPS๊ฐ€ ํ•œ ๋“œ๋ผ์ด๋ธŒ์˜ IOPS๋ณด๋‹ค ๋ช‡ ๋ฐฐ ๋” ํด ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์„œ๋Š” ๋ธ”๋ก ํฌ๊ธฐ๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
์ €์ž๋Š” RAID 6์˜ ์„ค๊ณ„์ƒ ์ž˜๋ชป๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ตœ์ ํ™”ํ•˜๋ ค๋Š” ์‹œ๋„์˜ ์š”์ ์„ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋Œ€์‹  RAID 6์˜ ์žฅ์ ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.
NVMe ์บ์‹œ์™€ ์”ฌ ํ”„๋กœ๋น„์ €๋‹ ํŠธ๋ฆญ์„ ํ†ตํ•ด RAID 6์˜ ์—ด์•…ํ•œ ๋ฌด์ž‘์œ„ ์“ฐ๊ธฐ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„์ง RAID 6์— ๋Œ€ํ•ด DISCARD๋ฅผ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ง€๊ธˆ์€ ์ด ์–ด๋ ˆ์ด๋ฅผ "์ดˆ๊ธฐํ™”"ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— OS๋ฅผ ์„ค์น˜ํ•œ ํ›„์— ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

SATA HDD

#mdadm --create --verbose --assume-clean /dev/md3 --chunk-size=512 --level=6 --raid-devices=8 /dev/sd[g-n]1

NVMe RAID์˜ LVM

์†๋„๋ฅผ ์œ„ํ•ด ๋ฃจํŠธ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ /dev/md1์ธ NVMe RAID 0์— ๋ฐฐ์น˜ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์Šค์™‘, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, LVM ์บ์‹œ ๋ฐ LVM ์”ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์œ„ํ•ด์„œ๋Š” ์ด ๋น ๋ฅธ ์–ด๋ ˆ์ด๊ฐ€ ์—ฌ์ „ํžˆ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ด ์–ด๋ ˆ์ด์— LVM VG๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

#pvcreate /dev/md0
#vgcreate root /dev/md0

๋ฃจํŠธ ํŒŒ์ผ ์‹œ์Šคํ…œ์šฉ ํŒŒํ‹ฐ์…˜์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#lvcreate -L 128G --name root root

RAM ํฌ๊ธฐ์— ๋”ฐ๋ผ ์Šค์™‘์šฉ ํŒŒํ‹ฐ์…˜์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#lvcreate -L 32G --name swap root

OS ์„ค์น˜

์ „์ฒด์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ์„ ์„ค์น˜ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Ubuntu Live ํ™˜๊ฒฝ์—์„œ ์‹œ์Šคํ…œ ์„ค์น˜ ๋งˆ๋ฒ•์‚ฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์„ค์น˜. ์„ค์น˜ํ•  ๋””์Šคํฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๋‹จ๊ณ„์—์„œ๋งŒ ๋‹ค์Œ ์‚ฌํ•ญ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • /dev/md1, - ๋งˆ์šดํŠธ ์ง€์  /boot, FS - BTRFS
  • /dev/root/root(์ผ๋ช… /dev/mapper/root-root), - ๋งˆ์šดํŠธ ์ง€์  /(๋ฃจํŠธ), FS - BTRFS
  • /dev/root/swap (์ผ๋ช… /dev/mapper/root-swap) - ์Šค์™‘ ํŒŒํ‹ฐ์…˜์œผ๋กœ ์‚ฌ์šฉ
  • /dev/sda์— ๋ถ€ํŠธ๋กœ๋” ์„ค์น˜

BTRFS๋ฅผ ๋ฃจํŠธ ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ ์„ ํƒํ•˜๋ฉด ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์€ /(๋ฃจํŠธ)์˜ ๊ฒฝ์šฐ "@", /home์˜ ๊ฒฝ์šฐ "@home"์ด๋ผ๋Š” ๋‘ ๊ฐœ์˜ BTRFS ๋ณผ๋ฅจ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜๋ฅผ ์‹œ์ž‘ํ•ด๋ณด์ž..

๋ถ€ํŠธ๋กœ๋” ์„ค์น˜ ์ค‘ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ชจ๋‹ฌ ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด์„œ ์„ค์น˜๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ ํ‘œ์ค€ ์ˆ˜๋‹จ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋Œ€ํ™” ์ƒ์ž๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ์„ค์น˜๋ฅผ ๊ณ„์†ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์—์„œ ๋กœ๊ทธ์•„์›ƒํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•˜๋ฉด ๊นจ๋—ํ•œ Ubuntu Live ๋ฐ์Šคํฌํƒ‘์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ๋‹ค์‹œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

#sudo bash

์„ค์น˜๋ฅผ ๊ณ„์†ํ•˜๋ ค๋ฉด chroot ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค.

#mkdir /mnt/chroot
#mount -o defaults,space_cache,noatime,nodiratime,discard,subvol=@ /dev/mapper/root-root /mnt/chroot
#mount -o defaults,space_cache,noatime,nodiratime,discard,subvol=@home /dev/mapper/root-root /mnt/chroot/home
#mount -o defaults,space_cache,noatime,nodiratime,discard /dev/md1 /mnt/chroot/boot
#mount --bind /proc /mnt/chroot/proc
#mount --bind /sys /mnt/chroot/sys
#mount --bind /dev /mnt/chroot/dev

chroot์—์„œ ๋„คํŠธ์›Œํฌ์™€ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ๊ตฌ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#cat /etc/hostname >/mnt/chroot/etc/hostname
#cat /etc/hosts >/mnt/chroot/etc/hosts
#cat /etc/resolv.conf >/mnt/chroot/etc/resolv.conf

chroot ํ™˜๊ฒฝ์œผ๋กœ ๋“ค์–ด๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#chroot /mnt/chroot

์šฐ์„ , ์šฐ๋ฆฌ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค:

apt-get install --reinstall mdadm lvm2 thin-provisioning-tools btrfs-tools util-linux lsscsi nvme-cli mc debsums hdparm

๋ถˆ์™„์ „ํ•œ ์‹œ์Šคํ…œ ์„ค์น˜๋กœ ์ธํ•ด ์ž˜๋ชป ์„ค์น˜๋œ ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ์ˆ˜์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#CORRUPTED_PACKAGES=$(debsums -s 2>&1 | awk '{print $6}' | uniq)
#apt-get install --reinstall $CORRUPTED_PACKAGES

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฉด ๋จผ์ € /etc/apt/sources.list๋ฅผ ํŽธ์ง‘ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

TRIM/DISCARD๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋„๋ก RAID 6 ๋ชจ๋“ˆ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์กฐ์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#cat >/etc/modprobe.d/raid456.conf << EOF
options raid456 devices_handle_discard_safely=1
EOF

๋ฐฐ์—ด์„ ์•ฝ๊ฐ„ ์กฐ์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#cat >/etc/udev/rules.d/60-md.rules << EOF
SUBSYSTEM=="block", KERNEL=="md*", ACTION=="change", TEST=="md/stripe_cache_size", ATTR{md/stripe_cache_size}="32768"
SUBSYSTEM=="block", KERNEL=="md*", ACTION=="change", TEST=="md/sync_speed_min", ATTR{md/sync_speed_min}="48000"
SUBSYSTEM=="block", KERNEL=="md*", ACTION=="change", TEST=="md/sync_speed_max", ATTR{md/sync_speed_max}="300000"
EOF
#cat >/etc/udev/rules.d/62-hdparm.rules << EOF
SUBSYSTEM=="block", ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", RUN+="/sbin/hdparm -B 254 /dev/%k"
EOF
#cat >/etc/udev/rules.d/63-blockdev.rules << EOF
SUBSYSTEM=="block", ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", RUN+="/sbin/blockdev --setra 1024 /dev/%k"
SUBSYSTEM=="block", ACTION=="add|change", KERNEL=="md*", RUN+="/sbin/blockdev --setra 0 /dev/%k"
EOF

๊ทธ๊ฒŒ ๋ญ์˜€์ง€..?์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ผ๋ จ์˜ udev ๊ทœ์น™์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

  • RAID 2020์˜ ๋ธ”๋ก ์บ์‹œ ํฌ๊ธฐ๋ฅผ 6๋…„์— ์ ํ•ฉํ•˜๋„๋ก ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. ๊ธฐ๋ณธ๊ฐ’์€ Linux๋ฅผ ๋งŒ๋“  ์ดํ›„๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์˜ค๋žซ๋™์•ˆ ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์–ด๋ ˆ์ด ํ™•์ธ/๋™๊ธฐํ™” ๊ธฐ๊ฐ„ ๋™์•ˆ ์ตœ์†Œ IO๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋กœ๋“œ ์‹œ ์–ด๋ ˆ์ด๊ฐ€ ์˜๊ตฌ ๋™๊ธฐํ™” ์ƒํƒœ์— ๋น ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์–ด๋ ˆ์ด ํ™•์ธ/๋™๊ธฐํ™” ์ค‘ ์ตœ๋Œ€ IO๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” SSD RAID ๋™๊ธฐํ™”/ํ™•์ธ์œผ๋กœ ์ธํ•ด ๋“œ๋ผ์ด๋ธŒ๊ฐ€ ๋ฐ”์‚ญ๋ฐ”์‚ญํ•ด์ง€์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ NVMe์˜ ๊ฒฝ์šฐ์— ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. (๋ผ๋””์—์ดํ„ฐ ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”? ๋†๋‹ด์ด ์•„๋‹ˆ์—ˆ์–ด์š”.)
  • APM์„ ํ†ตํ•ด ๋””์Šคํฌ๊ฐ€ ์Šคํ•€๋“ค ํšŒ์ „(HDD)์„ ์ค‘์ง€ํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•˜๊ณ  ๋””์Šคํฌ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ ˆ์ „ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ 7์‹œ๊ฐ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋“œ๋ผ์ด๋ธŒ์—์„œ APM์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ APM์„ ์™„์ „ํžˆ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(-B 255). ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ๋“œ๋ผ์ด๋ธŒ๊ฐ€ XNUMX์ดˆ ํ›„์— ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ OS๋Š” ๋””์Šคํฌ ์บ์‹œ๋ฅผ ์žฌ์„ค์ •ํ•˜๋ ค๊ณ  ํ•˜๊ณ  ๋””์Šคํฌ๊ฐ€ ๋‹ค์‹œ ํšŒ์ „ํ•˜๋ฉฐ ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์‹œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋””์Šคํฌ์—๋Š” ์ตœ๋Œ€ ์Šคํ•€๋“ค ํšŒ์ „ ์ˆ˜๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ„๋‹จํ•œ ๊ธฐ๋ณธ ์ฃผ๊ธฐ๋กœ ์ธํ•ด ๋ช‡ ๋…„ ์•ˆ์— ๋””์Šคํฌ๊ฐ€ ์‰ฝ๊ฒŒ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋””์Šคํฌ๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์šฐ๋ฆฌ ๋””์Šคํฌ๋Š” ์ ์ ˆํ•œ ๊ธฐ๋ณธ ์„ค์ •์„ ๊ฐ–์ถ˜ "๋…ธํŠธ๋ถ" ๋””์Šคํฌ์ด๋ฏ€๋กœ RAID๊ฐ€ ๋ฏธ๋‹ˆ MAID์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
  • ๋””์Šคํฌ์— ๋ฏธ๋ฆฌ ์ฝ๊ธฐ ์„ค์น˜(ํšŒ์ „) 1MB - 6๊ฐœ์˜ ์—ฐ์† ๋ธ”๋ก/์ฒญํฌ RAID XNUMX
  • ์–ด๋ ˆ์ด ์ž์ฒด์—์„œ ๋ฏธ๋ฆฌ ์ฝ๊ธฐ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

/etc/fstab์„ ํŽธ์ง‘ํ•ด ๋ด…์‹œ๋‹ค:

#cat >/etc/fstab << EOF
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
# file-system mount-point type options dump pass
/dev/mapper/root-root / btrfs defaults,space_cache,noatime,nodiratime,discard,subvol=@ 0 1
UUID=$(blkid -o value -s UUID /dev/md1) /boot btrfs defaults,space_cache,noatime,nodiratime,discard 0 2
/dev/mapper/root-root /home btrfs defaults,space_cache,noatime,nodiratime,discard,subvol=@home 0 2
/dev/mapper/root-swap none swap sw 0 0
EOF

์™œ ๊ทธ๋Ÿฐ ๊ฒ๋‹ˆ๊นŒ..?UUID๋กœ /boot ํŒŒํ‹ฐ์…˜์„ ๊ฒ€์ƒ‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด ์ด๋ฆ„ ์ง€์ •์€ ์ด๋ก ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

/dev/mapper/vg-lv ํ‘œ๊ธฐ๋ฒ•์—์„œ LVM ์ด๋ฆ„์œผ๋กœ ๋‚˜๋จธ์ง€ ์„น์…˜์„ ๊ฒ€์ƒ‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ํŒŒํ‹ฐ์…˜์„ ๋งค์šฐ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” LVM์— UUID๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. LVM ๋ณผ๋ฅจ๊ณผ ํ•ด๋‹น ์Šค๋ƒ…์ƒท์˜ UUID๋Š” ๋™์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค./dev/mapper/root-root..๋ฅผ ๋‘ ๋ฒˆ ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๊นŒ?์˜ˆ. ์ •ํ™•ํžˆ. BTRFS์˜ ํŠน์ง•. ์ด ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ๋‹ค๋ฅธ ํ•˜์œ„ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ฒˆ ๋งˆ์šดํŠธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด ํ™œ์„ฑ BTRFS ๋ณผ๋ฅจ์˜ LVM ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์žฌ๋ถ€ํŒ…ํ•˜๋ฉด ๋†€๋ž„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

mdadm ๊ตฌ์„ฑ์„ ๋‹ค์‹œ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#/usr/share/mdadm/mkconf | sed 's/#DEVICE/DEVICE/g' >/etc/mdadm/mdadm.conf

LVM ์„ค์ •์„ ์กฐ์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#cat >>/etc/lvm/lvmlocal.conf << EOF

activation {
thin_pool_autoextend_threshold=90
thin_pool_autoextend_percent=5
}
allocation {
cache_pool_max_chunks=2097152
}
devices {
global_filter=["r|^/dev/.*_corig$|","r|^/dev/.*_cdata$|","r|^/dev/.*_cmeta$|","r|^/dev/.*gpv$|","r|^/dev/images/.*$|","r|^/dev/mapper/images.*$|","r|^/dev/backup/.*$|","r|^/dev/mapper/backup.*$|"] issue_discards=1
}
EOF

๊ทธ๊ฒŒ ๋ญ์˜€์ง€..?๋ณผ๋ฅจ์˜ 90%๋กœ ์ ์œ  ๊ณต๊ฐ„์˜ 5%์— ๋„๋‹ฌํ•˜๋ฉด LVM ์”ฌ ํ’€์˜ ์ž๋™ ํ™•์žฅ์„ ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

LVM ์บ์‹œ์˜ ์ตœ๋Œ€ ์บ์‹œ ๋ธ”๋ก ์ˆ˜๋ฅผ ๋Š˜๋ ธ์Šต๋‹ˆ๋‹ค.

LVM์ด ๋‹ค์Œ์—์„œ LVM ๋ณผ๋ฅจ(PV)์„ ๊ฒ€์ƒ‰ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ฐจ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

  • LVM ์บ์‹œ(cdata)๋ฅผ ํฌํ•จํ•˜๋Š” ์žฅ์น˜
  • LVM ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹œ๋œ ์žฅ์น˜, ์บ์‹œ๋ฅผ ์šฐํšŒ( _์ฝ”๋ฆฌ๊ทธ). ์ด ๊ฒฝ์šฐ ์บ์‹œ๋œ ์žฅ์น˜ ์ž์ฒด๋Š” ์—ฌ์ „ํžˆ ์บ์‹œ๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰๋ฉ๋‹ˆ๋‹ค(๋‹จ์ง€ ).
  • LVM ์บ์‹œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(cmeta)๊ฐ€ ํฌํ•จ๋œ ์žฅ์น˜
  • ์ด๋ฆ„์ด image์ธ VG์˜ ๋ชจ๋“  ์žฅ์น˜. ์—ฌ๊ธฐ์—๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์˜ ๋””์Šคํฌ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ ํ˜ธ์ŠคํŠธ์˜ LVM์ด ๊ฒŒ์ŠคํŠธ OS์— ์†ํ•œ ๋ณผ๋ฅจ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฆ„์ด backup์ธ VG์˜ ๋ชจ๋“  ์žฅ์น˜. ์—ฌ๊ธฐ์—๋Š” ๊ฐ€์ƒ ๋จธ์‹  ์ด๋ฏธ์ง€์˜ ๋ฐฑ์—… ๋ณต์‚ฌ๋ณธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฆ„์ด "gpv"(๊ฒŒ์ŠคํŠธ ๋ฌผ๋ฆฌ ๋ณผ๋ฅจ)๋กœ ๋๋‚˜๋Š” ๋ชจ๋“  ์žฅ์น˜

LVM VG์—์„œ ์—ฌ์œ  ๊ณต๊ฐ„์„ ํ™•๋ณดํ•  ๋•Œ DISCARD ์ง€์›์„ ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์กฐ์‹ฌํ•˜์„ธ์š”. ์ด๋กœ ์ธํ•ด SSD์—์„œ LV๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ SSD RAID 6์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณ„ํš์— ๋”ฐ๋ฅด๋ฉด ์”ฌ ํ”„๋กœ๋น„์ €๋‹์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ ์ „ํ˜€ ๋ฐฉํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

initramfs ์ด๋ฏธ์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#update-initramfs -u -k all

Grub์„ ์„ค์น˜ํ•˜๊ณ  ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

#apt-get install grub-pc
#apt-get purge os-prober
#dpkg-reconfigure grub-pc

์–ด๋–ค ๋””์Šคํฌ๋ฅผ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ์š”?sd*์ธ ๋ชจ๋“  ์‚ฌ๋žŒ. ์‹œ์Šคํ…œ์€ ์ž‘๋™ ์ค‘์ธ SATA ๋“œ๋ผ์ด๋ธŒ ๋˜๋Š” SSD์—์„œ ๋ถ€ํŒ…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์™œ os-prober๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‚˜์š”..?๊ณผ๋„ํ•œ ๋…๋ฆฝ์„ฑ๊ณผ ์žฅ๋‚œ์Šค๋Ÿฌ์šด ์†์„ ์œ„ํ•œ ์ œํ’ˆ์ž…๋‹ˆ๋‹ค.

RAID ์ค‘ ํ•˜๋‚˜๊ฐ€ ์„ฑ๋Šฅ ์ €ํ•˜ ์ƒํƒœ์— ์žˆ์œผ๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ํ•˜๋“œ์›จ์–ด์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒํ‹ฐ์…˜์—์„œ OS ๊ฒ€์ƒ‰์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•˜์‹œ๋ฉด ๋‚จ๊ฒจ๋‘์…”๋„ ๋˜์ง€๋งŒ, ์œ„์˜ ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์—ผ๋‘์— ๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ฒ„๋ฆ‡์—†๋Š” ์†์„ ์—†์• ๋Š” ๋ฐฉ๋ฒ•์„ ์˜จ๋ผ์ธ์—์„œ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด๋กœ์จ ์ดˆ๊ธฐ ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ƒˆ๋กœ ์„ค์น˜๋œ OS๋กœ ์žฌ๋ถ€ํŒ…ํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ๋ถ€ํŒ… ๊ฐ€๋Šฅํ•œ Live CD/USB๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”.

#exit
#reboot

SATA SSD ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ถ€ํŒ… ์žฅ์น˜๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

SATA SSD์˜ LVM

์ด ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ƒˆ OS๋กœ ๋ถ€ํŒ…ํ•˜๊ณ , ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ํ„ฐ๋ฏธ๋„ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์—ด๊ณ , ๋‹ค์Œ์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

#sudo bash

์šฐ๋ฆฌ๋Š” ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

SATA SSD์—์„œ ์–ด๋ ˆ์ด "์ดˆ๊ธฐํ™”":

#blkdiscard /dev/md2

์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

#blkdiscard --step 65536 /dev/md2
SATA SSD์— LVM VG๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

#pvcreate /dev/md2
#vgcreate data /dev/md2

์™œ ๋˜ VG..?์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ root๋ผ๋Š” ์ด๋ฆ„์˜ VG๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ VG์— ๋ชจ๋“  ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”?

VG์— PV๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ VG๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ™œ์„ฑํ™”๋˜๋ ค๋ฉด ๋ชจ๋“  PV๊ฐ€ ์˜จ๋ผ์ธ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. LVM RAID๋Š” ์˜ˆ์™ธ์ด๋ฉฐ ์˜๋„์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” RAID 6 ์–ด๋ ˆ์ด ์ค‘ ํ•˜๋‚˜์— ์˜ค๋ฅ˜(์ฝ๊ธฐ ๋ฐ์ดํ„ฐ ์†์‹ค)๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์šด์˜ ์ฒด์ œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ถ€ํŒ…๋˜์–ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ๋ฅผ ์ •๋ง๋กœ ์›ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์ฒซ ๋ฒˆ์งธ ์ถ”์ƒํ™” ์ˆ˜์ค€์—์„œ ๊ฐ ์œ ํ˜•์˜ ๋ฌผ๋ฆฌ์  "๋ฏธ๋””์–ด"๋ฅผ ๋ณ„๋„์˜ VG๋กœ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ณผํ•™์ ์œผ๋กœ ๋งํ•˜๋ฉด, ๋‹ค์–‘ํ•œ RAID ์–ด๋ ˆ์ด๋Š” ๋‹ค์–‘ํ•œ "์‹ ๋ขฐ์„ฑ ๋„๋ฉ”์ธ"์— ์†ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•˜๋‚˜์˜ VG์— ๋ฐ€์–ด ๋„ฃ์–ด ์ถ”๊ฐ€์ ์ธ ๊ณตํ†ต ์‹คํŒจ ์ง€์ ์„ ์ƒ์„ฑํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

"ํ•˜๋“œ์›จ์–ด" ์ˆ˜์ค€์— LVM์ด ์žˆ์œผ๋ฉด ๋‹ค์–‘ํ•œ RAID ์–ด๋ ˆ์ด๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ ์ž„์˜๋กœ ์ž˜๋ผ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด - ์‹คํ–‰ ๋™์‹œ์— bcache + LVM ์”ฌ, bcache + BTRFS, LVM ์บ์‹œ + LVM ์”ฌ, ์บ์‹œ๊ฐ€ ํฌํ•จ๋œ ๋ณต์žกํ•œ ZFS ๊ตฌ์„ฑ ๋˜๋Š” ๊ธฐํƒ€ ์ง€์˜ฅ ๊ฐ™์€ ํ˜ผํ•ฉ์„ ์‹œ๋„ํ•˜๊ณ  ๋น„๊ตํ•ด ๋ณด์„ธ์š”.

"ํ•˜๋“œ์›จ์–ด" ์ˆ˜์ค€์—์„œ๋Š” ์˜ค๋ž˜๋œ "thick" LVM ๋ณผ๋ฅจ ์ด์™ธ์˜ ๋‹ค๋ฅธ ๋ณผ๋ฅจ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ทœ์น™์˜ ์˜ˆ์™ธ๋Š” ๋ฐฑ์—… ํŒŒํ‹ฐ์…˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์—” ์ด ์ˆœ๊ฐ„์ฏค์ด๋ฉด ์ด๋ฏธ ๋งŽ์€ ๋…์ž๋“ค์ด ์ค‘์ฒฉ ์ธํ˜•์— ๋Œ€ํ•ด ๋ญ”๊ฐ€๋ฅผ ์˜์‹ฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

SATA HDD์˜ LVM

#pvcreate /dev/md3
#vgcreate backup /dev/md3

๋˜ ์ƒˆ๋กœ์šด VG..?์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ๋ฐฑ์—…์— ์‚ฌ์šฉํ•  ๋””์Šคํฌ ์–ด๋ ˆ์ด์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์šด์˜ ์ฒด์ œ๊ฐ€ ๊ณ„์† ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋ฉด์„œ ๋ฐฑ์—…์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ํ‰์†Œ์™€ ๊ฐ™์ด ์œ ์ง€ํ•˜๊ธฐ๋ฅผ ์ •๋ง๋กœ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ VG ํ™œ์„ฑํ™” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ VG๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

LVM ์บ์‹œ ์„ค์ •

NVMe RAID 1์— LV๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์บ์‹ฑ ์žฅ์น˜๋กœ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

#lvcreate -L 70871154688B --name cache root

์™œ ์ด๋ ‡๊ฒŒ ์ ์ง€...?์‚ฌ์‹ค ์šฐ๋ฆฌ์˜ NVMe SSD์—๋„ SLC ์บ์‹œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 4๋น„ํŠธ MLC์—์„œ ์ฐจ์ง€ํ•˜๋Š” ์—ฌ์œ  ๊ณต๊ฐ„์œผ๋กœ ์ธํ•ด 18GB์˜ "๋ฌด๋ฃŒ" ๋ฐ 3GB์˜ ๋™์  ๊ณต๊ฐ„์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ด ์บ์‹œ๊ฐ€ ์†Œ์ง„๋˜๋ฉด NVMe SSD๋Š” ์บ์‹œ๊ฐ€ ์žˆ๋Š” SATA SSD๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ LVM ์บ์‹œ ํŒŒํ‹ฐ์…˜์„ NVMe ๋“œ๋ผ์ด๋ธŒ์˜ SLC ์บ์‹œ ํฌ๊ธฐ์˜ ๋‘ ๋ฐฐ๋ณด๋‹ค ํ›จ์”ฌ ํฌ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋œ NVMe ๋“œ๋ผ์ด๋ธŒ์˜ ๊ฒฝ์šฐ ์ €์ž๋Š” 32~64GB์˜ ์บ์‹œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ํŒŒํ‹ฐ์…˜ ํฌ๊ธฐ๋Š” 64GB์˜ ์บ์‹œ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์บ์‹œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฐฑ์—… ๋ณต์‚ฌ๋ณธ์„ ์ˆ˜์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ๋”ํ‹ฐ ์‹œ์Šคํ…œ ์ข…๋ฃŒ ํ›„ LVM์€ ์ „์ฒด ์บ์‹œ๋ฅผ ๋”ํ‹ฐ๋กœ ํ‘œ์‹œํ•˜๊ณ  ๋‹ค์‹œ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹œ์Šคํ…œ์ด ๋‹ค์‹œ ์žฌ๋ถ€ํŒ…๋  ๋•Œ๊นŒ์ง€ ์ด ์žฅ์น˜์—์„œ lvchange๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ด ์ž‘์—…์ด ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ ์ ˆํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฆ‰์‹œ ์บ์‹œ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

SATA RAID 6์— LV๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์บ์‹œ๋œ ์žฅ์น˜๋กœ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

#lvcreate -L 3298543271936B --name cache data

์™œ XNUMXํ…Œ๋ผ๋ฐ”์ดํŠธ๋งŒ..?๋”ฐ๋ผ์„œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์š”๊ตฌ ์‚ฌํ•ญ์— SATA SSD RAID 6์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์บ์‹œ๋œ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๋Š” ์‹œ์Šคํ…œ์„ ์ค‘์ง€ํ•˜์ง€ ์•Š๊ณ ๋„ ์ฆ‰์„์—์„œ ๋™์ ์œผ๋กœ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ์บ์‹œ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์ค‘์ง€ํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•˜์ง€๋งŒ, ์˜ˆ๋ฅผ ๋“ค์–ด bcache์— ๋น„ํ•ด LVM ์บ์‹œ์˜ ๋…ํŠนํ•œ ์žฅ์ ์€ ์ด ์ž‘์—…์„ ์ฆ‰์‹œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์บ์‹ฑ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด VG๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#pvcreate /dev/root/cache
#pvcreate /dev/data/cache
#vgcreate cache /dev/root/cache /dev/data/cache

์บ์‹œ๋œ ์žฅ์น˜์— LV๋ฅผ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#lvcreate -L 3298539077632B --name cachedata cache /dev/data/cache

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์ฆ‰์‹œ /dev/data/cache์˜ ๋ชจ๋“  ์—ฌ์œ  ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“  ํ•„์ˆ˜ ํŒŒํ‹ฐ์…˜์ด /dev/root/cache์— ์ฆ‰์‹œ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ์œ„์น˜์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ pvmove๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์บ์‹œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#lvcreate -y -L 64G -n cache cache /dev/root/cache
#lvcreate -y -L 1G -n cachemeta cache /dev/root/cache
#lvconvert -y --type cache-pool --cachemode writeback --chunksize 64k --poolmetadata cache/cachemeta cache/cache
#lvconvert -y --type cache --cachepool cache/cache cache/cachedata

์™œ ์ด๋ ‡๊ฒŒ ์ฒญํฌ์‚ฌ์ด์ฆˆ๊ฐ€..?์‹ค์ œ ์‹คํ—˜์„ ํ†ตํ•ด ์ €์ž๋Š” LVM ์บ์‹œ ๋ธ”๋ก์˜ ํฌ๊ธฐ๊ฐ€ LVM ์”ฌ ๋ธ”๋ก์˜ ํฌ๊ธฐ์™€ ์ผ์น˜ํ•  ๋•Œ ๊ฐ€์žฅ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋˜ํ•œ, ํฌ๊ธฐ๊ฐ€ ์ž‘์„์ˆ˜๋ก ๋žœ๋ค ๋…นํ™” ๊ตฌ์„ฑ์ด ๋” ์ž˜ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

64k๋Š” LVM ์”ฌ์— ํ—ˆ์šฉ๋˜๋Š” ์ตœ์†Œ ๋ธ”๋ก ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.

ํ›„๊ธฐ ์ฃผ์˜ํ•˜์„ธ์š”..!์˜ˆ. ์ด ์œ ํ˜•์˜ ์บ์‹œ๋Š” ์บ์‹œ๋œ ์žฅ์น˜์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ๋™๊ธฐํ™”๋ฅผ ์—ฐ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์บ์‹œ๊ฐ€ ์†์‹ค๋˜๋ฉด ์บ์‹œ๋œ ์žฅ์น˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์ €์ž๋Š” ์ด๋Ÿฌํ•œ ์œ„ํ—˜์„ ๋ณด์ƒํ•˜๊ธฐ ์œ„ํ•ด NVMe RAID 1 ์™ธ์— ์–ด๋–ค ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์บ์‹œ ์œ ํ˜•์€ RAID 6์˜ ์—ด์•…ํ•œ ๋ฌด์ž‘์œ„ ์“ฐ๊ธฐ ์„ฑ๋Šฅ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์–ป์€ ๊ฒƒ์„ ํ™•์ธํ•ด ๋ด…์‹œ๋‹ค:

#lvs -a -o lv_name,lv_size,devices --units B cache
LV LSize Devices
[cache] 68719476736B cache_cdata(0)
[cache_cdata] 68719476736B /dev/root/cache(0)
[cache_cmeta] 1073741824B /dev/root/cache(16384)
cachedata 3298539077632B cachedata_corig(0)
[cachedata_corig] 3298539077632B /dev/data/cache(0)
[lvol0_pmspare] 1073741824B /dev/root/cache(16640)

/dev/data/cache์—๋Š” [cachedata_corig]๋งŒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด pvmove๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ ๋ช…๋ น ํ•˜๋‚˜๋กœ ์บ์‹œ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#lvconvert -y --uncache cache/cachedata

์ด๊ฒƒ์€ ์˜จ๋ผ์ธ์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. LVM์€ ์บ์‹œ๋ฅผ ๋””์Šคํฌ์— ๋™๊ธฐํ™”ํ•˜๊ณ  ์ œ๊ฑฐํ•œ ๋‹ค์Œ, ์บ์‹œ๋ฐ์ดํ„ฐ_corig์˜ ์ด๋ฆ„์„ ๋‹ค์‹œ ์บ์‹œ๋ฐ์ดํ„ฐ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

LVM ์”ฌ ์„ค์ •

LVM ์”ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ํ•„์š”ํ•œ ๊ณต๊ฐ„์„ ๋Œ€๋žต์ ์œผ๋กœ ์ถ”์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#thin_metadata_size --block-size=64k --pool-size=6terabytes --max-thins=100000 -u bytes
thin_metadata_size - 3385794560 bytes estimated metadata area size for "--block-size=64kibibytes --pool-size=6terabytes --max-thins=100000"

4GB๋กœ ๋ฐ˜์˜ฌ๋ฆผ: 4294967296B

LVM PV ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด 4194304๋ฅผ ๊ณฑํ•˜๊ณ  8594128896B๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค: XNUMXB
NVMe RAID 1์— ๋ณ„๋„์˜ ํŒŒํ‹ฐ์…˜์„ ์ƒ์„ฑํ•˜์—ฌ LVM ์”ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฐฑ์—… ๋ณต์‚ฌ๋ณธ์„ ๋ฐฐ์น˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#lvcreate -L 8594128896B --name images root

๋ฌด์—‡ ๋•Œ๋ฌธ์—..?์—ฌ๊ธฐ์„œ ์งˆ๋ฌธ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LVM ์”ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ NVMe์— ๊ณ„์† ์บ์‹œ๋˜๊ณ  ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•œ๋‹ค๋ฉด ์™œ ๋ณ„๋„๋กœ ๋ฐฐ์น˜ํ•ด์•ผ ํ• ๊นŒ์š”?

์—ฌ๊ธฐ์„œ๋Š” ์†๋„๊ฐ€ ์ค‘์š”ํ•˜์ง€๋งŒ ์ฃผ๋œ ์ด์œ ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์บ์‹œ๊ฐ€ ์‹คํŒจ ์ง€์ ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, LVM ์”ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹œ๋˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์™„์ „ํžˆ ์†์‹ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์”ฌ ๋ณผ๋ฅจ์„ ์กฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œ๋˜์ง€ ์•Š์ง€๋งŒ ๋น ๋ฅธ ๋ณ„๋„์˜ ๋ณผ๋ฅจ์œผ๋กœ ์ด๋™ํ•จ์œผ๋กœ์จ ์บ์‹œ ์†์‹ค ๋˜๋Š” ์†์ƒ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ์•ˆ์ „์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์บ์‹œ ์†์‹ค๋กœ ์ธํ•œ ๋ชจ๋“  ์†์ƒ์€ ์”ฌ ๋ณผ๋ฅจ ๋‚ด๋ถ€์— ๊ตญํ•œ๋˜๋ฏ€๋กœ ๋ณต๊ตฌ ์ ˆ์ฐจ๊ฐ€ ๋ช‡ ๋ฐฐ๋‚˜ ๋‹จ์ˆœํ™”๋ฉ๋‹ˆ๋‹ค. ๋†’์€ ํ™•๋ฅ ๋กœ ์ด๋Ÿฌํ•œ ํ”ผํ•ด๋Š” FS ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์›๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด์ „์— ์”ฌ ๋ณผ๋ฅจ์˜ ์Šค๋ƒ…์ƒท์„ ์ดฌ์˜ํ•œ ํ›„ ์บ์‹œ๊ฐ€ ์ ์–ด๋„ ํ•œ ๋ฒˆ ์™„์ „ํžˆ ๋™๊ธฐํ™”๋œ ๊ฒฝ์šฐ LVM ์”ฌ์˜ ๋‚ด๋ถ€ ์„ค๊ณ„๋กœ ์ธํ•ด ์บ์‹œ ์†์‹ค ์‹œ ์Šค๋ƒ…์ƒท์˜ ๋ฌด๊ฒฐ์„ฑ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. .

์”ฌ ํ”„๋กœ๋น„์ €๋‹์„ ๋‹ด๋‹นํ•  ์ƒˆ VG๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#pvcreate /dev/root/images
#pvcreate /dev/cache/cachedata
#vgcreate images /dev/root/images /dev/cache/cachedata

ํ’€์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#lvcreate -L 274877906944B --poolmetadataspare y --poolmetadatasize 4294967296B --chunksize 64k -Z y -T images/thin-pool
์™œ -Z y์ด ๋ชจ๋“œ์˜ ์‹ค์ œ ๋ชฉ์ ์€ ๊ณต๊ฐ„์„ ์žฌ๋ถ„๋ฐฐํ•  ๋•Œ ํ•œ ๊ฐ€์ƒ ๋จธ์‹ ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ๊ฐ€์ƒ ๋จธ์‹ ์œผ๋กœ ์œ ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ 64k๋ณด๋‹ค ์ž‘์€ ๋ธ”๋ก์˜ ๋ฌด์ž‘์œ„ ์“ฐ๊ธฐ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ œ๋กœํ™”๋ฅผ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์”ฌ ๋ณผ๋ฅจ์˜ ์ด์ „์— ํ• ๋‹น๋˜์ง€ ์•Š์€ ์˜์—ญ์— ๋Œ€ํ•œ 64k ๋ฏธ๋งŒ์˜ ์“ฐ๊ธฐ๋Š” ์บ์‹œ์—์„œ 64K ์—์ง€ ์ •๋ ฌ์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์บ์‹œ๋œ ์žฅ์น˜๋ฅผ ์šฐํšŒํ•˜๊ณ  ์บ์‹œ๋ฅผ ํ†ตํ•ด ์ž‘์—…์„ ์™„์ „ํžˆ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

LV๋ฅผ ํ•ด๋‹น PV๋กœ ์ด๋™ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#pvmove -n images/thin-pool_tdata /dev/root/images /dev/cache/cachedata
#pvmove -n images/lvol0_pmspare /dev/cache/cachedata /dev/root/images
#pvmove -n images/thin-pool_tmeta /dev/cache/cachedata /dev/root/images

๊ฒ€์‚ฌ:

#lvs -a -o lv_name,lv_size,devices --units B images
LV LSize Devices
[lvol0_pmspare] 4294967296B /dev/root/images(0)
thin-pool 274877906944B thin-pool_tdata(0)
[thin-pool_tdata] 274877906944B /dev/cache/cachedata(0)
[thin-pool_tmeta] 4294967296B /dev/root/images(1024)

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์”ฌ ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#lvcreate -V 64G --thin-pool thin-pool --name test images

ํ…Œ์ŠคํŠธ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

#apt-get install sysstat fio

๋‹ค์Œ์€ ์Šคํ† ๋ฆฌ์ง€ ๊ตฌ์„ฑ์˜ ๋™์ž‘์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

#watch 'lvs --rows --reportformat basic --quiet -ocache_dirty_blocks,cache_settings cache/cachedata && (lvdisplay cache/cachedata | grep Cache) && (sar -p -d 2 1 | grep -E "sd|nvme|DEV|md1|md2|md3|md0" | grep -v Average | sort)'

๊ตฌ์„ฑ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

#fio --loops=1 --size=64G --runtime=4 --filename=/dev/images/test --stonewall --ioengine=libaio --direct=1
--name=4kQD32read --bs=4k --iodepth=32 --rw=randread
--name=8kQD32read --bs=8k --iodepth=32 --rw=randread
--name=16kQD32read --bs=16k --iodepth=32 --rw=randread
--name=32KQD32read --bs=32k --iodepth=32 --rw=randread
--name=64KQD32read --bs=64k --iodepth=32 --rw=randread
--name=128KQD32read --bs=128k --iodepth=32 --rw=randread
--name=256KQD32read --bs=256k --iodepth=32 --rw=randread
--name=512KQD32read --bs=512k --iodepth=32 --rw=randread
--name=4Kread --bs=4k --rw=read
--name=8Kread --bs=8k --rw=read
--name=16Kread --bs=16k --rw=read
--name=32Kread --bs=32k --rw=read
--name=64Kread --bs=64k --rw=read
--name=128Kread --bs=128k --rw=read
--name=256Kread --bs=256k --rw=read
--name=512Kread --bs=512k --rw=read
--name=Seqread --bs=1m --rw=read
--name=Longread --bs=8m --rw=read
--name=Longwrite --bs=8m --rw=write
--name=Seqwrite --bs=1m --rw=write
--name=512Kwrite --bs=512k --rw=write
--name=256write --bs=256k --rw=write
--name=128write --bs=128k --rw=write
--name=64write --bs=64k --rw=write
--name=32write --bs=32k --rw=write
--name=16write --bs=16k --rw=write
--name=8write --bs=8k --rw=write
--name=4write --bs=4k --rw=write
--name=512KQD32write --bs=512k --iodepth=32 --rw=randwrite
--name=256KQD32write --bs=256k --iodepth=32 --rw=randwrite
--name=128KQD32write --bs=128k --iodepth=32 --rw=randwrite
--name=64KQD32write --bs=64k --iodepth=32 --rw=randwrite
--name=32KQD32write --bs=32k --iodepth=32 --rw=randwrite
--name=16KQD32write --bs=16k --iodepth=32 --rw=randwrite
--name=8KQD32write --bs=8k --iodepth=32 --rw=randwrite
--name=4kQD32write --bs=4k --iodepth=32 --rw=randwrite
| grep -E 'read|write|test' | grep -v ioengine

์ฃผ์˜ํ•˜์—ฌ! ์ž์›!์ด ์ฝ”๋“œ๋Š” ๊ฐ๊ฐ 36์ดˆ ๋™์•ˆ ์‹คํ–‰๋˜๋Š” 4๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์˜ ์ ˆ๋ฐ˜์€ ๊ธฐ๋ก์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. NVMe์— 4์ดˆ๋งŒ์— ๋งŽ์€ ๋‚ด์šฉ์„ ๋…น์Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๋‹น ์ตœ๋Œ€ 3GB. ๋”ฐ๋ผ์„œ ๊ฐ ์“ฐ๊ธฐ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ตœ๋Œ€ 216GB์˜ SSD ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๊ฐ€ ํ˜ผํ•ฉ๋˜์–ด ์žˆ๋‚˜์š”?์˜ˆ. ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณ„๋„๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด์ „์— ์ž‘์„ฑ๋œ ์“ฐ๊ธฐ๊ฐ€ ์ฝ๊ธฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ๋ชจ๋“  ์บ์‹œ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋Š” ์บ์‹œ์™€ ์”ฌ ๋ณผ๋ฅจ์ด ์ฑ„์›Œ์ง€๋ฉด์„œ ์ฒซ ๋ฒˆ์งธ ์‹คํ–‰๊ณผ ํ›„์† ์‹คํ–‰ ๋™์•ˆ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง€๋ฉฐ, ์‹œ์Šคํ…œ์ด ๋งˆ์ง€๋ง‰ ์‹คํ–‰ ์ค‘์— ์ฑ„์›Œ์ง„ ์บ์‹œ๋ฅผ ๋™๊ธฐํ™”ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋ฌด์—‡๋ณด๋‹ค๋„ ๋ฐฉ๊ธˆ ์Šค๋ƒ…์ƒท์„ ์ฐ์€ ์ด๋ฏธ ๊ฐ€๋“ ์ฐฌ ์”ฌ ๋ณผ๋ฅจ์˜ ์†๋„๋ฅผ ์ธก์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑ์ž๋Š” ์ฒซ ๋ฒˆ์งธ ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•œ ์งํ›„, ํŠนํžˆ ์บ์‹œ๊ฐ€ ์•„์ง ์™„์ „ํžˆ ๊ฐ€๋“ ์ฐจ์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฌด์ž‘์œ„ ์“ฐ๊ธฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ธ‰๊ฒฉํžˆ ๊ฐ€์†ํ™”๋˜๋Š”์ง€ ๊ด€์ฐฐํ•  ๊ธฐํšŒ๋ฅผ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์“ฐ๊ธฐ ์‹œ ๋ณต์‚ฌ ์˜๋ฏธ ์ฒด๊ณ„, ์บ์‹œ์™€ ์”ฌ ๋ณผ๋ฅจ ๋ธ”๋ก์˜ ์ •๋ ฌ, RAID 6์— ๋Œ€ํ•œ ๋ฌด์ž‘์œ„ ์“ฐ๊ธฐ๊ฐ€ RAID 6์˜ ๋ฌด์ž‘์œ„ ์ฝ๊ธฐ๋กœ ๋ฐ”๋€Œ๊ณ  ์ด์–ด์„œ ์บ์‹œ์— ์“ฐ๊ธฐ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๊ตฌ์„ฑ์—์„œ๋Š” RAID 6์—์„œ ๋ฌด์ž‘์œ„ ์ฝ๊ธฐ๊ฐ€ ์“ฐ๊ธฐ๋ณด๋‹ค ์ตœ๋Œ€ 6๋ฐฐ(์–ด๋ ˆ์ด์˜ SATA SSD ์ˆ˜) ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด CoW์šฉ ๋ธ”๋ก์€ ์”ฌ ํ’€์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ํ• ๋‹น๋˜๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ธฐ๋ก๋„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ด ๋‘ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"์ผ๊ด€์ ์ธ" ์Šค๋ƒ…์ƒท ์บ์‹œ

์บ์‹œ ์†์ƒ/์†์‹ค ์‹œ ๋ฐ์ดํ„ฐ ์†์‹ค ์œ„ํ—˜์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ €์ž๋Š” ์ด ๊ฒฝ์šฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์Šค๋ƒ…์ƒท์„ ํšŒ์ „ํ•˜๋Š” ๋ฐฉ์‹์„ ๋„์ž…ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์ฒซ์งธ, ์”ฌ ๋ณผ๋ฅจ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ์บ์‹œ๋˜์ง€ ์•Š์€ ๋””๋ฐ”์ด์Šค์— ์ƒ์ฃผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ์ผ๊ด€๋˜๊ณ  ๊ฐ€๋Šฅํ•œ ์†์‹ค์€ ๋ฐ์ดํ„ฐ ๋ธ”๋ก ๋‚ด์—์„œ ๊ฒฉ๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์Šค๋ƒ…์ƒท ์ˆœํ™˜ ์ฃผ๊ธฐ๋Š” ์บ์‹œ ์†์‹ค ์‹œ ์Šค๋ƒ…์ƒท ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  1. ์ด๋ฆ„์ด <name>์ธ ๊ฐ ์”ฌ ๋ณผ๋ฅจ์— ๋Œ€ํ•ด ์ด๋ฆ„์ด <name>.cached์ธ ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž„๊ณ„๊ฐ’์„ ํ•ฉ๋ฆฌ์ ์ธ ๋†’์€ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. #lvchange --quiet --cachesettings "migration_threshold=16384" cache/cachedata
  3. ๋ฃจํ”„์—์„œ ์บ์‹œ์˜ ๋”ํ‹ฐ ๋ธ”๋ก ์ˆ˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' 100์ด ๋  ๋•Œ๊นŒ์ง€. 100์ด ๋„ˆ๋ฌด ์˜ค๋žซ๋™์•ˆ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ ์บ์‹œ๋ฅผ ์—ฐ์† ์“ฐ๊ธฐ ๋ชจ๋“œ๋กœ ์ผ์‹œ์ ์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ SATA ๋ฐ NVMe SSD ์–ด๋ ˆ์ด์˜ ์†๋„ ํŠน์„ฑ๊ณผ TBW ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ ๋ คํ•˜๋ฉด ์บ์‹œ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์ˆœ๊ฐ„์„ ๋น ๋ฅด๊ฒŒ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ํ•˜๋“œ์›จ์–ด๊ฐ€ ์ „์ฒด ๋ฆฌ์†Œ์Šค๋ฅผ ์™„์ „ํžˆ ์†Œ๋ชจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ช‡ ์ผ. ๋ฆฌ์†Œ์Šค ์ œํ•œ์œผ๋กœ ์ธํ•ด ์‹œ์Šคํ…œ์€ ์›์น™์ ์œผ๋กœ ํ•ญ์ƒ ์“ฐ๊ธฐ ๋ถ€ํ•˜๊ฐ€ XNUMX% ๋ฏธ๋งŒ์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ๋กœ๋“œ๊ฐ€ XNUMX% ๋ฏธ๋งŒ์ธ NVMe SSD๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์™„์ „ํžˆ ์†Œ๋ชจํ•ฉ๋‹ˆ๋‹ค. 3-4 ์ผ. SATA SSD๋Š” ์ˆ˜๋ช…์ด ๋‘ ๋ฐฐ๋ฐ–์— ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋กœ๋“œ๊ฐ€ ์ฝ๊ธฐ์— ์‚ฌ์šฉ๋˜๋ฉฐ ์“ฐ๊ธฐ์— ๋Œ€ํ•œ ํ‰๊ท  ๋กœ๋“œ๊ฐ€ ๋‚ฎ๊ณ  ๋งค์šฐ ๋†’์€ ํ™œ๋™์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋‹จ๊ธฐ์ ์œผ๋กœ ๊ธ‰์ฆํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
  4. XNUMX์„ ํฌ์ฐฉํ•˜๊ฑฐ๋‚˜ ๋งŒ๋“ค์ž๋งˆ์ž <name>.cached์˜ ์ด๋ฆ„์„ <name>.committed๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์ด์ „ <name>.committed๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  5. ์„ ํƒ์ ์œผ๋กœ ์บ์‹œ๊ฐ€ 100% ๊ฐ€๋“ ์ฐฌ ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ๋‹ค์‹œ ์ƒ์„ฑํ•˜์—ฌ ์ง€์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์บ์‹œ๊ฐ€ ๋ฐ˜์ฏค ๋น„์–ด ์žˆ์œผ๋ฉด ์“ฐ๊ธฐ ์‹œ ์‹œ์Šคํ…œ์ด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  6. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž„๊ณ„๊ฐ’์„ XNUMX์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. #lvchange --quiet --cachesettings "migration_threshold=0" cache/cachedata ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์บ์‹œ๊ฐ€ ๊ธฐ๋ณธ ๋ฏธ๋””์–ด์™€ ์ผ์‹œ์ ์œผ๋กœ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  7. ์บ์‹œ์— ๋งŽ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์Œ“์ผ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' ์•„๋‹ˆ๋ฉด ํƒ€์ด๋จธ๊ฐ€ ๊บผ์งˆ ๊ฑฐ์˜ˆ์š”.
  8. ์šฐ๋ฆฌ๋Š” ๋‹ค์‹œ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž„๊ณ„๊ฐ’์— ์–ด๋ ค์›€์ด ์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ...?๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ "๋ฌด์ž‘์œ„" ๋…น์Œ์ด ์‹ค์ œ๋กœ ์™„์ „ํžˆ ๋ฌด์ž‘์œ„๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ 4KB์ธ ์„นํ„ฐ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ผ๋‹ค๋ฉด ๋‹ค์Œ ๋ช‡ ๋ถ„ ์•ˆ์— ๋™์ผํ•œ ์„นํ„ฐ ๋˜๋Š” ์ธ์ ‘(+- 32K) ์„นํ„ฐ ์ค‘ ํ•˜๋‚˜์— ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž„๊ณ„๊ฐ’์„ 64์œผ๋กœ ์„ค์ •ํ•˜์—ฌ SATA SSD์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ๋™๊ธฐํ™”๋ฅผ ์—ฐ๊ธฐํ•˜๊ณ  ์—ฌ๋Ÿฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์บ์‹œ์˜ XNUMXK ๋ธ”๋ก ํ•˜๋‚˜์— ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” SATA SSD์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ํฌ๊ฒŒ ์ ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๋Š” ์–ด๋””์— ์žˆ๋‚˜์š”..?๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ์ €์ž๋Š” 100% ๋…ํ•™ํ•˜๊ณ  "google" ์ค‘์‹ฌ ๊ฐœ๋ฐœ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— bash ์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์— ์ž์‹ ์ด ๋ถ€์กฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋Š” ์ž์‹ ์˜ ์†์—์„œ ๋‚˜์˜ค๋Š” ๋”์ฐํ•œ ์ฝ”๋“œ๋ฅผ ๋ˆ„๊ตฌ๋„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ.

๋‚˜๋Š” ์ด ๋ถ„์•ผ์˜ ์ „๋ฌธ๊ฐ€๋“ค์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ชจ๋“  ๋…ผ๋ฆฌ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฌ˜์‚ฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ฉฐ, ์•„๋งˆ๋„ ์ €์ž๊ฐ€ ์‹œ๋„ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์‹œ์Šคํ…œํ™”๋œ ์„œ๋น„์Šค๋กœ ์•„๋ฆ„๋‹ต๊ฒŒ ๋””์ž์ธํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฐ„๋‹จํ•œ ์Šค๋ƒ…์ƒท ์ˆœํ™˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด SATA SSD์—์„œ ํ•˜๋‚˜์˜ ์Šค๋ƒ…์ƒท์„ ์ง€์†์ ์œผ๋กœ ์™„์ „ํžˆ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, Thin_delta ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ ํ›„ ์–ด๋–ค ๋ธ”๋ก์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์†์ƒ์„ ๊ตญ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต๊ตฌ๋ฅผ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.

libvirt/KVM์—์„œ ๋‹ค๋“ฌ๊ธฐ/์‚ญ์ œํ•˜๊ธฐ

์™œ๋ƒํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋Š” libvirt๋ฅผ ์‹คํ–‰ํ•˜๋Š” KVM์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด VM์ด ์—ฌ์œ  ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ๋„ ํ™•๋ณดํ•˜๋„๋ก ๊ฐ€๋ฅด์น˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๊ฐ€์ƒ ๋””์Šคํฌ์—์„œ TRIM/DISCARD ์ง€์›์„ ์—๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ์ปจํŠธ๋กค๋Ÿฌ ์œ ํ˜•์„ virtio-scsi๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  xml์„ ํŽธ์ง‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

#virsh edit vmname
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='writethrough' io='threads' discard='unmap'/>
<source dev='/dev/images/vmname'/>
<backingStore/>
<target dev='sda' bus='scsi'/>
<alias name='scsi0-0-0-0'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>

<controller type='scsi' index='0' model='virtio-scsi'>
<alias name='scsi0'/>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</controller>

๊ฒŒ์ŠคํŠธ OS์˜ ์ด๋Ÿฌํ•œ DISCARD๋Š” LVM์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋ฉฐ ๋ธ”๋ก์€ ์บ์‹œ์™€ ์”ฌ ํ’€ ๋ชจ๋‘์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ ์Šค๋ƒ…์ƒท์„ ์‚ญ์ œํ•  ๋•Œ ์ฃผ๋กœ ์ง€์—ฐ๋œ ๋ฐฉ์‹์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

BTRFS ๋ฐฑ์—…

๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์Œ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์„ธ์š”. ะบั€ะฐะนะฝะตะน ์ฃผ์˜์™€ ์ž๊ธฐ ์ฑ…์ž„์œผ๋กœ. ์ž‘์„ฑ์ž๋Š” ์ด ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ์ž์‹ ์„ ์œ„ํ•ด ๋…์ ์ ์œผ๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ™๋ จ๋œ Linux ์‚ฌ์šฉ์ž ์ค‘ ๋‹ค์ˆ˜๊ฐ€ ์œ ์‚ฌํ•œ ๋„๊ตฌ๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋„๊ตฌ๋ฅผ ๋ณต์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฑ์—… ์žฅ์น˜์— ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#lvcreate -L 256G --name backup backup

BTRFS๋กœ ํ˜•์‹์„ ์ง€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#mkfs.btrfs /dev/backup/backup

๋งˆ์šดํŠธ ์ง€์ ์„ ์ƒ์„ฑํ•˜๊ณ  ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋ฃจํŠธ ํ•˜์œ„ ์„น์…˜์„ ๋งˆ์šดํŠธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#mkdir /backup
#mkdir /backup/btrfs
#mkdir /backup/btrfs/root
#mkdir /backup/btrfs/back
#ln -s /boot /backup/btrfs
# cat >>/etc/fstab << EOF

/dev/mapper/root-root /backup/btrfs/root btrfs defaults,space_cache,noatime,nodiratime 0 2
/dev/mapper/backup-backup /backup/btrfs/back btrfs defaults,space_cache,noatime,nodiratime 0 2
EOF
#mount -a
#update-initramfs -u
#update-grub

๋ฐฑ์—…์šฉ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#mkdir /backup/btrfs/back/remote
#mkdir /backup/btrfs/back/remote/root
#mkdir /backup/btrfs/back/remote/boot

๋ฐฑ์—… ์Šคํฌ๋ฆฝํŠธ์šฉ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#mkdir /root/btrfs-backup

์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณต์‚ฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌด์„œ์šด bash ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์ฑ…์ž„ํ•˜์— ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ž‘๊ฐ€์—๊ฒŒ ํ™”๋‚œ ํŽธ์ง€๋ฅผ ์“ฐ์ง€ ๋งˆ์„ธ์š”...#cat >/root/btrfs-backup/btrfs-backup.sh << EOF
#!/bin/bash
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

SCRIPT_FILE="$(realpath $0)"
SCRIPT_DIR="$(dirname $SCRIPT_FILE)"
SCRIPT_NAME="$(basename -s .sh $SCRIPT_FILE)"

LOCK_FILE="/dev/shm/$SCRIPT_NAME.lock"
DATE_PREFIX='%Y-%m-%d'
DATE_FORMAT=$DATE_PREFIX'-%H-%M-%S'
DATE_REGEX='[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
BASE_SUFFIX=".@base"
PEND_SUFFIX=".@pend"
SNAP_SUFFIX=".@snap"
MOUNTS="/backup/btrfs/"
BACKUPS="/backup/btrfs/back/remote/"

function terminate ()
{
echo "$1" >&2
exit 1
}

function wait_lock()
{
flock 98
}

function wait_lock_or_terminate()
{
echo "Wating for lock..."
wait_lock || terminate "Failed to get lock. Exiting..."
echo "Got lock..."
}

function suffix()
{
FORMATTED_DATE=$(date +"$DATE_FORMAT")
echo "$SNAP_SUFFIX.$FORMATTED_DATE"
}

function filter()
{
FORMATTED_DATE=$(date --date="$1" +"$DATE_PREFIX")
echo "$SNAP_SUFFIX.$FORMATTED_DATE"
}

function backup()
{
SOURCE_PATH="$MOUNTS$1"
TARGET_PATH="$BACKUPS$1"
SOURCE_BASE_PATH="$MOUNTS$1$BASE_SUFFIX"
TARGET_BASE_PATH="$BACKUPS$1$BASE_SUFFIX"
TARGET_BASE_DIR="$(dirname $TARGET_BASE_PATH)"
SOURCE_PEND_PATH="$MOUNTS$1$PEND_SUFFIX"
TARGET_PEND_PATH="$BACKUPS$1$PEND_SUFFIX"
if [ -d "$SOURCE_BASE_PATH" ] then
echo "$SOURCE_BASE_PATH found"
else
echo "$SOURCE_BASE_PATH File not found creating snapshot of $SOURCE_PATH to $SOURCE_BASE_PATH"
btrfs subvolume snapshot -r $SOURCE_PATH $SOURCE_BASE_PATH
sync
if [ -d "$TARGET_BASE_PATH" ] then
echo "$TARGET_BASE_PATH found out of sync with source... removing..."
btrfs subvolume delete -c $TARGET_BASE_PATH
sync
fi
fi
if [ -d "$TARGET_BASE_PATH" ] then
echo "$TARGET_BASE_PATH found"
else
echo "$TARGET_BASE_PATH not found. Synching to $TARGET_BASE_DIR"
btrfs send $SOURCE_BASE_PATH | btrfs receive $TARGET_BASE_DIR
sync
fi
if [ -d "$SOURCE_PEND_PATH" ] then
echo "$SOURCE_PEND_PATH found removing..."
btrfs subvolume delete -c $SOURCE_PEND_PATH
sync
fi
btrfs subvolume snapshot -r $SOURCE_PATH $SOURCE_PEND_PATH
sync
if [ -d "$TARGET_PEND_PATH" ] then
echo "$TARGET_PEND_PATH found removing..."
btrfs subvolume delete -c $TARGET_PEND_PATH
sync
fi
echo "Sending $SOURCE_PEND_PATH to $TARGET_PEND_PATH"
btrfs send -p $SOURCE_BASE_PATH $SOURCE_PEND_PATH | btrfs receive $TARGET_BASE_DIR
sync
TARGET_DATE_SUFFIX=$(suffix)
btrfs subvolume snapshot -r $TARGET_PEND_PATH "$TARGET_PATH$TARGET_DATE_SUFFIX"
sync
btrfs subvolume delete -c $SOURCE_BASE_PATH
sync
btrfs subvolume delete -c $TARGET_BASE_PATH
sync
mv $SOURCE_PEND_PATH $SOURCE_BASE_PATH
mv $TARGET_PEND_PATH $TARGET_BASE_PATH
sync
}

function list()
{
LIST_TARGET_BASE_PATH="$BACKUPS$1$BASE_SUFFIX"
LIST_TARGET_BASE_DIR="$(dirname $LIST_TARGET_BASE_PATH)"
LIST_TARGET_BASE_NAME="$(basename -s .$BASE_SUFFIX $LIST_TARGET_BASE_PATH)"
find "$LIST_TARGET_BASE_DIR" -maxdepth 1 -mindepth 1 -type d -printf "%fn" | grep "${LIST_TARGET_BASE_NAME/$BASE_SUFFIX/$SNAP_SUFFIX}.$DATE_REGEX"
}

function remove()
{
REMOVE_TARGET_BASE_PATH="$BACKUPS$1$BASE_SUFFIX"
REMOVE_TARGET_BASE_DIR="$(dirname $REMOVE_TARGET_BASE_PATH)"
btrfs subvolume delete -c $REMOVE_TARGET_BASE_DIR/$2
sync
}

function removeall()
{
DATE_OFFSET="$2"
FILTER="$(filter "$DATE_OFFSET")"
while read -r SNAPSHOT ; do
remove "$1" "$SNAPSHOT"
done < <(list "$1" | grep "$FILTER")

}

(
COMMAND="$1"
shift

case "$COMMAND" in
"--help")
echo "Help"
;;
"suffix")
suffix
;;
"filter")
filter "$1"
;;
"backup")
wait_lock_or_terminate
backup "$1"
;;
"list")
list "$1"
;;
"remove")
wait_lock_or_terminate
remove "$1" "$2"
;;
"removeall")
wait_lock_or_terminate
removeall "$1" "$2"
;;
*)
echo "None.."
;;
esac
) 98>$LOCK_FILE

EOF

๊ทธ๊ฒƒ์€ ๋ฌด์—‡์„ ํ•˜๋Š”๊ฐ€..?BTRFS ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•˜๊ณ  BTRFS ๋ณด๋‚ด๊ธฐ/๋ฐ›๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ FS์— ๋ณต์‚ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋ช…๋ น ์„ธํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ถœ์‹œ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด... ์ฒ˜์Œ์—๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ถœ์‹œ๋Š” ๋งค์šฐ ๋น ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด... ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.

cron์— ๋„ฃ์„ ๋˜ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ bash ์ฝ”๋“œ#cat >/root/btrfs-backup/cron-daily.sh << EOF
#!/bin/bash
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

SCRIPT_FILE="$(realpath $0)"
SCRIPT_DIR="$(dirname $SCRIPT_FILE)"
SCRIPT_NAME="$(basename -s .sh $SCRIPT_FILE)"

BACKUP_SCRIPT="$SCRIPT_DIR/btrfs-backup.sh"
RETENTION="-60 day"
$BACKUP_SCRIPT backup root/@
$BACKUP_SCRIPT removeall root/@ "$RETENTION"
$BACKUP_SCRIPT backup root/@home
$BACKUP_SCRIPT removeall root/@home "$RETENTION"
$BACKUP_SCRIPT backup boot/
$BACKUP_SCRIPT removeall boot/ "$RETENTION"
EOF

๊ทธ๊ฒƒ์€ ๋ฌด์—‡์„ ํ•˜๋Š”๊ฐ€..?๋ฐฑ์—… FS์— ๋‚˜์—ด๋œ BTRFS ๋ณผ๋ฅจ์˜ ์ฆ๋ถ„ ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•˜๊ณ  ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„์—๋Š” 60์ผ ์ „์— ์ƒ์„ฑ๋œ ๋ชจ๋“  ์‚ฌ์ง„์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ํ›„ ๋‚˜์—ด๋œ ๋ณผ๋ฅจ์˜ ๋‚ ์งœ๊ฐ€ ์ง€์ •๋œ ์Šค๋ƒ…์ƒท์ด /backup/btrfs/back/remote/ ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์‹คํ–‰ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#chmod +x /root/btrfs-backup/cron-daily.sh
#chmod +x /root/btrfs-backup/btrfs-backup.sh

๊ทธ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  cron์— ๋„ฃ์–ด๋ด…์‹œ๋‹ค:

#/usr/bin/nice -n 19 /usr/bin/ionice -c 3 /root/btrfs-backup/cron-daily.sh 2>&1 | /usr/bin/logger -t btrfs-backup
#cat /var/log/syslog | grep btrfs-backup
#crontab -e
0 2 * * * /usr/bin/nice -n 19 /usr/bin/ionice -c 3 /root/btrfs-backup/cron-daily.sh 2>&1 | /usr/bin/logger -t btrfs-backup

LVM ์”ฌ ๋ฐฑ์—…

๋ฐฑ์—… ๋””๋ฐ”์ด์Šค์— ๊ฐ€์ƒ ํ’€์„ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#lvcreate -L 274877906944B --poolmetadataspare y --poolmetadatasize 4294967296B --chunksize 64k -Z y -T backup/thin-pool

ddrescue๋ฅผ ์„ค์น˜ํ•ด ๋ด…์‹œ๋‹ค. ์™œ๋ƒ๋ฉด... ์Šคํฌ๋ฆฝํŠธ๋Š” ์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

#apt-get install gddrescue

์Šคํฌ๋ฆฝํŠธ์šฉ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#mkdir /root/lvm-thin-backup

์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณต์‚ฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด๋ถ€์— ๋ฐฐ์‰ฌ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค ...#cat >/root/lvm-thin-backup/lvm-thin-backup.sh << EOF
#!/bin/bash
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

SCRIPT_FILE="$(realpath $0)"
SCRIPT_DIR="$(dirname $SCRIPT_FILE)"
SCRIPT_NAME="$(basename -s .sh $SCRIPT_FILE)"

LOCK_FILE="/dev/shm/$SCRIPT_NAME.lock"
DATE_PREFIX='%Y-%m-%d'
DATE_FORMAT=$DATE_PREFIX'-%H-%M-%S'
DATE_REGEX='[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
BASE_SUFFIX=".base"
PEND_SUFFIX=".pend"
SNAP_SUFFIX=".snap"
BACKUPS="backup"
BACKUPS_POOL="thin-pool"

export LVM_SUPPRESS_FD_WARNINGS=1

function terminate ()
{
echo "$1" >&2
exit 1
}

function wait_lock()
{
flock 98
}

function wait_lock_or_terminate()
{
echo "Wating for lock..."
wait_lock || terminate "Failed to get lock. Exiting..."
echo "Got lock..."
}

function suffix()
{
FORMATTED_DATE=$(date +"$DATE_FORMAT")
echo "$SNAP_SUFFIX.$FORMATTED_DATE"
}

function filter()
{
FORMATTED_DATE=$(date --date="$1" +"$DATE_PREFIX")
echo "$SNAP_SUFFIX.$FORMATTED_DATE"
}

function read_thin_id {
lvs --rows --reportformat basic --quiet -othin_id "$1/$2" | awk '{print $2}'
}

function read_pool_lv {
lvs --rows --reportformat basic --quiet -opool_lv "$1/$2" | awk '{print $2}'
}

function read_lv_dm_path {
lvs --rows --reportformat basic --quiet -olv_dm_path "$1/$2" | awk '{print $2}'
}

function read_lv_active {
lvs --rows --reportformat basic --quiet -olv_active "$1/$2" | awk '{print $2}'
}

function read_lv_chunk_size {
lvs --rows --reportformat basic --quiet --units b --nosuffix -ochunk_size "$1/$2" | awk '{print $2}'
}

function read_lv_size {
lvs --rows --reportformat basic --quiet --units b --nosuffix -olv_size "$1/$2" | awk '{print $2}'
}

function activate_volume {
lvchange -ay -Ky "$1/$2"
}

function deactivate_volume {
lvchange -an "$1/$2"
}

function read_thin_metadata_snap {
dmsetup status "$1" | awk '{print $7}'
}

function thindiff()
{
DIFF_VG="$1"
DIFF_SOURCE="$2"
DIFF_TARGET="$3"
DIFF_SOURCE_POOL=$(read_pool_lv $DIFF_VG $DIFF_SOURCE)
DIFF_TARGET_POOL=$(read_pool_lv $DIFF_VG $DIFF_TARGET)

if [ "$DIFF_SOURCE_POOL" == "" ] then
(>&2 echo "Source LV is not thin.")
exit 1
fi

if [ "$DIFF_TARGET_POOL" == "" ] then
(>&2 echo "Target LV is not thin.")
exit 1
fi

if [ "$DIFF_SOURCE_POOL" != "$DIFF_TARGET_POOL" ] then
(>&2 echo "Source and target LVs belong to different thin pools.")
exit 1
fi

DIFF_POOL_PATH=$(read_lv_dm_path $DIFF_VG $DIFF_SOURCE_POOL)
DIFF_SOURCE_ID=$(read_thin_id $DIFF_VG $DIFF_SOURCE)
DIFF_TARGET_ID=$(read_thin_id $DIFF_VG $DIFF_TARGET)
DIFF_POOL_PATH_TPOOL="$DIFF_POOL_PATH-tpool"
DIFF_POOL_PATH_TMETA="$DIFF_POOL_PATH"_tmeta
DIFF_POOL_METADATA_SNAP=$(read_thin_metadata_snap $DIFF_POOL_PATH_TPOOL)

if [ "$DIFF_POOL_METADATA_SNAP" != "-" ] then
(>&2 echo "Thin pool metadata snapshot already exist. Assuming stale one. Will release metadata snapshot in 5 seconds.")
sleep 5
dmsetup message $DIFF_POOL_PATH_TPOOL 0 release_metadata_snap
fi

dmsetup message $DIFF_POOL_PATH_TPOOL 0 reserve_metadata_snap
DIFF_POOL_METADATA_SNAP=$(read_thin_metadata_snap $DIFF_POOL_PATH_TPOOL)

if [ "$DIFF_POOL_METADATA_SNAP" == "-" ] then
(>&2 echo "Failed to create thin pool metadata snapshot.")
exit 1
fi

#We keep output in variable because metadata snapshot need to be released early.
DIFF_DATA=$(thin_delta -m$DIFF_POOL_METADATA_SNAP --snap1 $DIFF_SOURCE_ID --snap2 $DIFF_TARGET_ID $DIFF_POOL_PATH_TMETA)

dmsetup message $DIFF_POOL_PATH_TPOOL 0 release_metadata_snap

echo $"$DIFF_DATA" | grep -E 'different|left_only|right_only' | sed 's/</"/g' | sed 's/ /"/g' | awk -F'"' '{print $6 "t" $8 "t" $11}' | sed 's/different/copy/g' | sed 's/left_only/copy/g' | sed 's/right_only/discard/g'

}

function thinsync()
{
SYNC_VG="$1"
SYNC_PEND="$2"
SYNC_BASE="$3"
SYNC_TARGET="$4"
SYNC_PEND_POOL=$(read_pool_lv $SYNC_VG $SYNC_PEND)
SYNC_BLOCK_SIZE=$(read_lv_chunk_size $SYNC_VG $SYNC_PEND_POOL)
SYNC_PEND_PATH=$(read_lv_dm_path $SYNC_VG $SYNC_PEND)

activate_volume $SYNC_VG $SYNC_PEND

while read -r SYNC_ACTION SYNC_OFFSET SYNC_LENGTH ; do
SYNC_OFFSET_BYTES=$((SYNC_OFFSET * SYNC_BLOCK_SIZE))
SYNC_LENGTH_BYTES=$((SYNC_LENGTH * SYNC_BLOCK_SIZE))
if [ "$SYNC_ACTION" == "copy" ] then
ddrescue --quiet --force --input-position=$SYNC_OFFSET_BYTES --output-position=$SYNC_OFFSET_BYTES --size=$SYNC_LENGTH_BYTES "$SYNC_PEND_PATH" "$SYNC_TARGET"
fi

if [ "$SYNC_ACTION" == "discard" ] then
blkdiscard -o $SYNC_OFFSET_BYTES -l $SYNC_LENGTH_BYTES "$SYNC_TARGET"
fi
done < <(thindiff "$SYNC_VG" "$SYNC_PEND" "$SYNC_BASE")
}

function discard_volume()
{
DISCARD_VG="$1"
DISCARD_LV="$2"
DISCARD_LV_PATH=$(read_lv_dm_path "$DISCARD_VG" "$DISCARD_LV")
if [ "$DISCARD_LV_PATH" != "" ] then
echo "$DISCARD_LV_PATH found"
else
echo "$DISCARD_LV not found in $DISCARD_VG"
exit 1
fi
DISCARD_LV_POOL=$(read_pool_lv $DISCARD_VG $DISCARD_LV)
DISCARD_LV_SIZE=$(read_lv_size "$DISCARD_VG" "$DISCARD_LV")
lvremove -y --quiet "$DISCARD_LV_PATH" || exit 1
lvcreate --thin-pool "$DISCARD_LV_POOL" -V "$DISCARD_LV_SIZE"B --name "$DISCARD_LV" "$DISCARD_VG" || exit 1
}

function backup()
{
SOURCE_VG="$1"
SOURCE_LV="$2"
TARGET_VG="$BACKUPS"
TARGET_LV="$SOURCE_VG-$SOURCE_LV"
SOURCE_BASE_LV="$SOURCE_LV$BASE_SUFFIX"
TARGET_BASE_LV="$TARGET_LV$BASE_SUFFIX"
SOURCE_PEND_LV="$SOURCE_LV$PEND_SUFFIX"
TARGET_PEND_LV="$TARGET_LV$PEND_SUFFIX"
SOURCE_BASE_LV_PATH=$(read_lv_dm_path "$SOURCE_VG" "$SOURCE_BASE_LV")
SOURCE_PEND_LV_PATH=$(read_lv_dm_path "$SOURCE_VG" "$SOURCE_PEND_LV")
TARGET_BASE_LV_PATH=$(read_lv_dm_path "$TARGET_VG" "$TARGET_BASE_LV")
TARGET_PEND_LV_PATH=$(read_lv_dm_path "$TARGET_VG" "$TARGET_PEND_LV")

if [ "$SOURCE_BASE_LV_PATH" != "" ] then
echo "$SOURCE_BASE_LV_PATH found"
else
echo "Source base not found creating snapshot of $SOURCE_VG/$SOURCE_LV to $SOURCE_VG/$SOURCE_BASE_LV"
lvcreate --quiet --snapshot --name "$SOURCE_BASE_LV" "$SOURCE_VG/$SOURCE_LV" || exit 1
SOURCE_BASE_LV_PATH=$(read_lv_dm_path "$SOURCE_VG" "$SOURCE_BASE_LV")
activate_volume "$SOURCE_VG" "$SOURCE_BASE_LV"
echo "Discarding $SOURCE_BASE_LV_PATH as we need to bootstrap."
SOURCE_BASE_POOL=$(read_pool_lv $SOURCE_VG $SOURCE_BASE_LV)
SOURCE_BASE_CHUNK_SIZE=$(read_lv_chunk_size $SOURCE_VG $SOURCE_BASE_POOL)
discard_volume "$SOURCE_VG" "$SOURCE_BASE_LV"
sync
if [ "$TARGET_BASE_LV_PATH" != "" ] then
echo "$TARGET_BASE_LV_PATH found out of sync with source... removing..."
lvremove -y --quiet $TARGET_BASE_LV_PATH || exit 1
TARGET_BASE_LV_PATH=$(read_lv_dm_path "$TARGET_VG" "$TARGET_BASE_LV")
sync
fi
fi
SOURCE_BASE_SIZE=$(read_lv_size "$SOURCE_VG" "$SOURCE_BASE_LV")
if [ "$TARGET_BASE_LV_PATH" != "" ] then
echo "$TARGET_BASE_LV_PATH found"
else
echo "$TARGET_VG/$TARGET_LV not found. Creating empty volume."
lvcreate --thin-pool "$BACKUPS_POOL" -V "$SOURCE_BASE_SIZE"B --name "$TARGET_BASE_LV" "$TARGET_VG" || exit 1
echo "Have to rebootstrap. Discarding source at $SOURCE_BASE_LV_PATH"
activate_volume "$SOURCE_VG" "$SOURCE_BASE_LV"
SOURCE_BASE_POOL=$(read_pool_lv $SOURCE_VG $SOURCE_BASE_LV)
SOURCE_BASE_CHUNK_SIZE=$(read_lv_chunk_size $SOURCE_VG $SOURCE_BASE_POOL)
discard_volume "$SOURCE_VG" "$SOURCE_BASE_LV"
TARGET_BASE_POOL=$(read_pool_lv $TARGET_VG $TARGET_BASE_LV)
TARGET_BASE_CHUNK_SIZE=$(read_lv_chunk_size $TARGET_VG $TARGET_BASE_POOL)
TARGET_BASE_LV_PATH=$(read_lv_dm_path "$TARGET_VG" "$TARGET_BASE_LV")
echo "Discarding target at $TARGET_BASE_LV_PATH"
discard_volume "$TARGET_VG" "$TARGET_BASE_LV"
sync
fi
if [ "$SOURCE_PEND_LV_PATH" != "" ] then
echo "$SOURCE_PEND_LV_PATH found removing..."
lvremove -y --quiet "$SOURCE_PEND_LV_PATH" || exit 1
sync
fi
lvcreate --quiet --snapshot --name "$SOURCE_PEND_LV" "$SOURCE_VG/$SOURCE_LV" || exit 1
SOURCE_PEND_LV_PATH=$(read_lv_dm_path "$SOURCE_VG" "$SOURCE_PEND_LV")
sync
if [ "$TARGET_PEND_LV_PATH" != "" ] then
echo "$TARGET_PEND_LV_PATH found removing..."
lvremove -y --quiet $TARGET_PEND_LV_PATH
sync
fi
lvcreate --quiet --snapshot --name "$TARGET_PEND_LV" "$TARGET_VG/$TARGET_BASE_LV" || exit 1
TARGET_PEND_LV_PATH=$(read_lv_dm_path "$TARGET_VG" "$TARGET_PEND_LV")
SOURCE_PEND_LV_SIZE=$(read_lv_size "$SOURCE_VG" "$SOURCE_PEND_LV")
lvresize -L "$SOURCE_PEND_LV_SIZE"B "$TARGET_PEND_LV_PATH"
activate_volume "$TARGET_VG" "$TARGET_PEND_LV"
echo "Synching $SOURCE_PEND_LV_PATH to $TARGET_PEND_LV_PATH"
thinsync "$SOURCE_VG" "$SOURCE_PEND_LV" "$SOURCE_BASE_LV" "$TARGET_PEND_LV_PATH" || exit 1
sync

TARGET_DATE_SUFFIX=$(suffix)
lvcreate --quiet --snapshot --name "$TARGET_LV$TARGET_DATE_SUFFIX" "$TARGET_VG/$TARGET_PEND_LV" || exit 1
sync
lvremove --quiet -y "$SOURCE_BASE_LV_PATH" || exit 1
sync
lvremove --quiet -y "$TARGET_BASE_LV_PATH" || exit 1
sync
lvrename -y "$SOURCE_VG/$SOURCE_PEND_LV" "$SOURCE_BASE_LV" || exit 1
lvrename -y "$TARGET_VG/$TARGET_PEND_LV" "$TARGET_BASE_LV" || exit 1
sync
deactivate_volume "$TARGET_VG" "$TARGET_BASE_LV"
deactivate_volume "$SOURCE_VG" "$SOURCE_BASE_LV"
}

function verify()
{
SOURCE_VG="$1"
SOURCE_LV="$2"
TARGET_VG="$BACKUPS"
TARGET_LV="$SOURCE_VG-$SOURCE_LV"
SOURCE_BASE_LV="$SOURCE_LV$BASE_SUFFIX"
TARGET_BASE_LV="$TARGET_LV$BASE_SUFFIX"
TARGET_BASE_LV_PATH=$(read_lv_dm_path "$TARGET_VG" "$TARGET_BASE_LV")
SOURCE_BASE_LV_PATH=$(read_lv_dm_path "$SOURCE_VG" "$SOURCE_BASE_LV")

if [ "$SOURCE_BASE_LV_PATH" != "" ] then
echo "$SOURCE_BASE_LV_PATH found"
else
echo "$SOURCE_BASE_LV_PATH not found"
exit 1
fi
if [ "$TARGET_BASE_LV_PATH" != "" ] then
echo "$TARGET_BASE_LV_PATH found"
else
echo "$TARGET_BASE_LV_PATH not found"
exit 1
fi
activate_volume "$TARGET_VG" "$TARGET_BASE_LV"
activate_volume "$SOURCE_VG" "$SOURCE_BASE_LV"
echo Comparing "$SOURCE_BASE_LV_PATH" with "$TARGET_BASE_LV_PATH"
cmp "$SOURCE_BASE_LV_PATH" "$TARGET_BASE_LV_PATH"
echo Done...
deactivate_volume "$TARGET_VG" "$TARGET_BASE_LV"
deactivate_volume "$SOURCE_VG" "$SOURCE_BASE_LV"
}

function resync()
{
SOURCE_VG="$1"
SOURCE_LV="$2"
TARGET_VG="$BACKUPS"
TARGET_LV="$SOURCE_VG-$SOURCE_LV"
SOURCE_BASE_LV="$SOURCE_LV$BASE_SUFFIX"
TARGET_BASE_LV="$TARGET_LV$BASE_SUFFIX"
TARGET_BASE_LV_PATH=$(read_lv_dm_path "$TARGET_VG" "$TARGET_BASE_LV")
SOURCE_BASE_LV_PATH=$(read_lv_dm_path "$SOURCE_VG" "$SOURCE_BASE_LV")

if [ "$SOURCE_BASE_LV_PATH" != "" ] then
echo "$SOURCE_BASE_LV_PATH found"
else
echo "$SOURCE_BASE_LV_PATH not found"
exit 1
fi
if [ "$TARGET_BASE_LV_PATH" != "" ] then
echo "$TARGET_BASE_LV_PATH found"
else
echo "$TARGET_BASE_LV_PATH not found"
exit 1
fi
activate_volume "$TARGET_VG" "$TARGET_BASE_LV"
activate_volume "$SOURCE_VG" "$SOURCE_BASE_LV"
SOURCE_BASE_POOL=$(read_pool_lv $SOURCE_VG $SOURCE_BASE_LV)
SYNC_BLOCK_SIZE=$(read_lv_chunk_size $SOURCE_VG $SOURCE_BASE_POOL)

echo Syncronizing "$SOURCE_BASE_LV_PATH" to "$TARGET_BASE_LV_PATH"

CMP_OFFSET=0
while [[ "$CMP_OFFSET" != "" ]] ; do
CMP_MISMATCH=$(cmp -i "$CMP_OFFSET" "$SOURCE_BASE_LV_PATH" "$TARGET_BASE_LV_PATH" | grep differ | awk '{print $5}' | sed 's/,//g' )
if [[ "$CMP_MISMATCH" != "" ]] ; then
CMP_OFFSET=$(( CMP_MISMATCH + CMP_OFFSET ))
SYNC_OFFSET_BYTES=$(( ( CMP_OFFSET / SYNC_BLOCK_SIZE ) * SYNC_BLOCK_SIZE ))
SYNC_LENGTH_BYTES=$(( SYNC_BLOCK_SIZE ))
echo "Synching $SYNC_LENGTH_BYTES bytes at $SYNC_OFFSET_BYTES from $SOURCE_BASE_LV_PATH to $TARGET_BASE_LV_PATH"
ddrescue --quiet --force --input-position=$SYNC_OFFSET_BYTES --output-position=$SYNC_OFFSET_BYTES --size=$SYNC_LENGTH_BYTES "$SOURCE_BASE_LV_PATH" "$TARGET_BASE_LV_PATH"
else
CMP_OFFSET=""
fi
done
echo Done...
deactivate_volume "$TARGET_VG" "$TARGET_BASE_LV"
deactivate_volume "$SOURCE_VG" "$SOURCE_BASE_LV"
}

function list()
{
LIST_SOURCE_VG="$1"
LIST_SOURCE_LV="$2"
LIST_TARGET_VG="$BACKUPS"
LIST_TARGET_LV="$LIST_SOURCE_VG-$LIST_SOURCE_LV"
LIST_TARGET_BASE_LV="$LIST_TARGET_LV$SNAP_SUFFIX"
lvs -olv_name | grep "$LIST_TARGET_BASE_LV.$DATE_REGEX"
}

function remove()
{
REMOVE_TARGET_VG="$BACKUPS"
REMOVE_TARGET_LV="$1"
lvremove -y "$REMOVE_TARGET_VG/$REMOVE_TARGET_LV"
sync
}

function removeall()
{
DATE_OFFSET="$3"
FILTER="$(filter "$DATE_OFFSET")"
while read -r SNAPSHOT ; do
remove "$SNAPSHOT"
done < <(list "$1" "$2" | grep "$FILTER")

}

(
COMMAND="$1"
shift

case "$COMMAND" in
"--help")
echo "Help"
;;
"suffix")
suffix
;;
"filter")
filter "$1"
;;
"backup")
wait_lock_or_terminate
backup "$1" "$2"
;;
"list")
list "$1" "$2"
;;
"thindiff")
thindiff "$1" "$2" "$3"
;;
"thinsync")
thinsync "$1" "$2" "$3" "$4"
;;
"verify")
wait_lock_or_terminate
verify "$1" "$2"
;;
"resync")
wait_lock_or_terminate
resync "$1" "$2"
;;
"remove")
wait_lock_or_terminate
remove "$1"
;;
"removeall")
wait_lock_or_terminate
removeall "$1" "$2" "$3"
;;
*)
echo "None.."
;;
esac
) 98>$LOCK_FILE

EOF

๊ทธ๊ฒƒ์€ ๋ฌด์—‡์„ ํ•˜๋Š”๊ฐ€...?์”ฌ ์Šค๋ƒ…์ƒท์„ ์กฐ์ž‘ํ•˜๊ณ  ddrescue ๋ฐ blkdiscard๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Thin_delta๋ฅผ ํ†ตํ•ด ์ˆ˜์‹ ๋œ ๋‘ ์”ฌ ์Šค๋ƒ…์ƒท ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๋‹ค๋ฅธ ๋ธ”๋ก ์žฅ์น˜์™€ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น ์„ธํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

cron์— ๋„ฃ์„ ๋˜ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์กฐ๊ธˆ ๋” ๋ฐฐ์‰ฌ#cat >/root/lvm-thin-backup/cron-daily.sh << EOF
#!/bin/bash
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

SCRIPT_FILE="$(realpath $0)"
SCRIPT_DIR="$(dirname $SCRIPT_FILE)"
SCRIPT_NAME="$(basename -s .sh $SCRIPT_FILE)"

BACKUP_SCRIPT="$SCRIPT_DIR/lvm-thin-backup.sh"
RETENTION="-60 days"

$BACKUP_SCRIPT backup images linux-dev
$BACKUP_SCRIPT backup images win8
$BACKUP_SCRIPT backup images win8-data
#etc

$BACKUP_SCRIPT removeall images linux-dev "$RETENTION"
$BACKUP_SCRIPT removeall images win8 "$RETENTION"
$BACKUP_SCRIPT removeall images win8-data "$RETENTION"
#etc

EOF

๊ทธ๊ฒƒ์€ ๋ฌด์—‡์„ ํ•˜๋Š”๊ฐ€...?์ด์ „ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜์—ด๋œ ์”ฌ ๋ณผ๋ฅจ์˜ ๋ฐฑ์—…์„ ์ƒ์„ฑํ•˜๊ณ  ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” ๋งˆ์ง€๋ง‰ ๋™๊ธฐํ™” ์ดํ›„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‚˜์—ด๋œ ๋ณผ๋ฅจ์˜ ๋น„ํ™œ์„ฑ ์Šค๋ƒ…์ƒท์„ ๋‚จ๊ฒจ ๋‘ก๋‹ˆ๋‹ค.

๋ฐฑ์—… ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ์”ฌ ๋ณผ๋ฅจ ๋ชฉ๋ก์„ ์ง€์ •ํ•˜์—ฌ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํŽธ์ง‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ณต๋œ ์ด๋ฆ„์€ ์„ค๋ช… ๋ชฉ์ ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๋ณผ๋ฅจ์„ ๋™๊ธฐํ™”ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ถŒ๋ฆฌ๋ฅผ ๋ถ€์—ฌํ•ฉ์‹œ๋‹ค :

#chmod +x /root/lvm-thin-backup/cron-daily.sh
#chmod +x /root/lvm-thin-backup/lvm-thin-backup.sh

๊ทธ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  cron์— ๋„ฃ์–ด๋ด…์‹œ๋‹ค:

#/usr/bin/nice -n 19 /usr/bin/ionice -c 3 /root/lvm-thin-backup/cron-daily.sh 2>&1 | /usr/bin/logger -t lvm-thin-backup
#cat /var/log/syslog | grep lvm-thin-backup
#crontab -e
0 3 * * * /usr/bin/nice -n 19 /usr/bin/ionice -c 3 /root/lvm-thin-backup/cron-daily.sh 2>&1 | /usr/bin/logger -t lvm-thin-backup

์ฒซ ๋ฒˆ์งธ ์ถœ์‹œ๋Š” ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—... ์”ฌ ๋ณผ๋ฅจ์€ ์‚ฌ์šฉ๋œ ๋ชจ๋“  ๊ณต๊ฐ„์„ ๋ณต์‚ฌํ•˜์—ฌ ์™„์ „ํžˆ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. LVM ์”ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋•๋ถ„์— ์–ด๋–ค ๋ธ”๋ก์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉ ์ค‘์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋œ ์”ฌ ๋ณผ๋ฅจ ๋ธ”๋ก๋งŒ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.

ํ›„์† ์‹คํ–‰์€ LVM ์”ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ถ”์  ๋•๋ถ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ๋ถ„์ ์œผ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ๋ด…์‹œ๋‹ค:

#time /root/btrfs-backup/cron-daily.sh
real 0m2,967s
user 0m0,225s
sys 0m0,353s

#time /root/lvm-thin-backup/cron-daily.sh
real 1m2,710s
user 0m12,721s
sys 0m6,671s

#ls -al /backup/btrfs/back/remote/*
/backup/btrfs/back/remote/boot:
total 0
drwxr-xr-x 1 root root 1260 ะผะฐั€ 26 09:11 .
drwxr-xr-x 1 root root 16 ะผะฐั€ 6 09:30 ..
drwxr-xr-x 1 root root 322 ะผะฐั€ 26 02:00 .@base
drwxr-xr-x 1 root root 516 ะผะฐั€ 6 09:39 [email protected]
drwxr-xr-x 1 root root 516 ะผะฐั€ 6 09:39 [email protected]
...
/backup/btrfs/back/remote/root:
total 0
drwxr-xr-x 1 root root 2820 ะผะฐั€ 26 09:11 .
drwxr-xr-x 1 root root 16 ะผะฐั€ 6 09:30 ..
drwxr-xr-x 1 root root 240 ะผะฐั€ 26 09:11 @.@base
drwxr-xr-x 1 root root 22 ะผะฐั€ 26 09:11 @home.@base
drwxr-xr-x 1 root root 22 ะผะฐั€ 6 09:39 @[email protected]
drwxr-xr-x 1 root root 22 ะผะฐั€ 6 09:39 @[email protected]
...
drwxr-xr-x 1 root root 240 ะผะฐั€ 6 09:39 @[email protected]
drwxr-xr-x 1 root root 240 ะผะฐั€ 6 09:39 @[email protected]
...

#lvs -olv_name,lv_size images && lvs -olv_name,lv_size backup
LV LSize
linux-dev 128,00g
linux-dev.base 128,00g
thin-pool 1,38t
win8 128,00g
win8-data 2,00t
win8-data.base 2,00t
win8.base 128,00g
LV LSize
backup 256,00g
images-linux-dev.base 128,00g
images-linux-dev.snap.2020-03-08-10-09-11 128,00g
images-linux-dev.snap.2020-03-08-10-09-25 128,00g
...
images-win8-data.base 2,00t
images-win8-data.snap.2020-03-16-14-11-55 2,00t
images-win8-data.snap.2020-03-16-14-19-50 2,00t
...
images-win8.base 128,00g
images-win8.snap.2020-03-17-04-51-46 128,00g
images-win8.snap.2020-03-18-03-02-49 128,00g
...
thin-pool <2,09t

์ด๊ฒƒ์ด ์ค‘์ฒฉ ์ธํ˜•๊ณผ ๋ฌด์Šจ ๊ด€๋ จ์ด ์žˆ๋‚˜์š”?

LVM LV ๋…ผ๋ฆฌ ๋ณผ๋ฅจ์ด ๋‹ค๋ฅธ VG์— ๋Œ€ํ•œ LVM PV ๋ฌผ๋ฆฌ ๋ณผ๋ฅจ์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. LVM์€ ์ค‘์ฒฉ ์ธํ˜•์ฒ˜๋Ÿผ ์žฌ๊ท€์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” LVM์— ๊ทน๋„์˜ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

PS

๋‹ค์Œ ๊ธฐ์‚ฌ์—์„œ๋Š” ํ™ˆ ๋ฐ์Šคํฌํƒ‘, ํ™ˆ ์ธํ„ฐ๋„ท ๋ฐ P2P ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋Œ€๋ฅ™์—์„œ ์ค‘๋ณต์„ฑ์„ ๊ฐ–์ถ˜ ์ง€๋ฆฌ์  ๋ถ„์‚ฐ ์Šคํ† ๋ฆฌ์ง€/VM ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฌ๋Ÿฌ ์œ ์‚ฌํ•œ ๋ชจ๋ฐ”์ผ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ/KVM์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€