LVM እና matryoshka ምን የሚያመሳስላቸው ነገር አለ?

ትክክለኛ ሰዓት.
md RAID + LVMን በመጠቀም ለ KVM የማከማቻ ስርዓት በመገንባት ላይ ያለኝን ተግባራዊ ተሞክሮ ከማህበረሰቡ ጋር ማካፈል እፈልጋለሁ።

ፕሮግራሙ የሚከተሉትን ያደርጋል:

  • md RAID 1 ከNVMe SSD መገንባት።
  • md RAID 6 ከ SATA ኤስኤስዲ እና መደበኛ ድራይቮች መገንባት።
  • በኤስኤስዲ RAID 1/6 ላይ የTRIM/DISCARD ባህሪዎች።
  • በጋራ ዲስክ ስብስብ ላይ ሊነሳ የሚችል md RAID 1/6 ድርድር መፍጠር።
  • በ BIOS ውስጥ የ NVMe ድጋፍ በማይኖርበት ጊዜ ስርዓቱን በ NVMe RAID 1 ላይ መጫን.
  • LVM መሸጎጫ እና LVM ቀጭን በመጠቀም።
  • የBTRFS ቅጽበተ-ፎቶዎችን በመጠቀም እና ለመጠባበቂያ ላክ/ተቀበል።
  • ለBTRFS ቅጥ ምትኬዎች LVM ቀጭን ቅጽበተ-ፎቶዎችን እና ስስ_ዴልታ በመጠቀም።

ፍላጎት ካሎት፣ እባክዎን በድመት ስር።

የማመልከቻ ቅጽ

ደራሲው በዚህ ጽሑፍ ውስጥ ያሉትን ቁሳቁሶች / ምሳሌዎች / ኮድ / ምክሮች / መረጃዎች መጠቀም ወይም አለመጠቀም ለሚያስከትለው መዘዝ ምንም አይነት ሃላፊነት አይወስድም. ይህን ጽሑፍ በማንበብ ወይም በማንኛውም መንገድ በመጠቀም፣ ለእነዚህ ድርጊቶች ሁሉ መዘዞች ኃላፊነቱን ይወስዳሉ። ሊሆኑ የሚችሉ ውጤቶች የሚከተሉትን ያካትታሉ:

  • Crispy የተጠበሰ NVMe SSDs.
  • ሙሉ በሙሉ ጥቅም ላይ የዋለ የጽሑፍ ምንጭ እና የኤስኤስዲ አንጻፊዎች ውድቀት።
  • ምትኬዎችን ጨምሮ በሁሉም ድራይቮች ላይ ያለ ሁሉንም ውሂብ ሙሉ በሙሉ ማጣት።
  • የተሳሳተ የኮምፒውተር ሃርድዌር።
  • የሚባክን ጊዜ, ነርቮች እና ገንዘብ.
  • ከላይ ያልተዘረዘሩ ሌሎች ውጤቶች.

ብረት

የሚገኙ ነበሩ፡-

እ.ኤ.አ. በ 2013 አካባቢ Motherboard ከ Z87 ቺፕሴት ፣ ከኢንቴል ኮር i7 / Haswell ጋር ተጠናቋል።

  • ፕሮሰሰር 4 ኮር, 8 ክሮች
  • 32 ጊባ DDR3 ራም
  • 1 x 16 ወይም 2 x 8 PCIe 3.0
  • 1 x 4 + 1 x 1 PCIe 2.0
  • 6 x 6 GBps SATA 3 ማገናኛዎች

የኤስኤኤስ አስማሚ LSI SAS9211-8I በአይቲ / HBA ሞድ ውስጥ ብልጭ ድርግም ብሏል። በRAID የነቃው ፈርምዌር ሆን ተብሎ ወደ HBA firmware ተቀይሯል፡-

  1. በማንኛውም ጊዜ ይህን አስማሚ ወደ ውጭ መጣል እና በመላ መጣ ማንኛውም ሌላ የመጀመሪያው መተካት ይቻላል ነበር.
  2. TRIM/አስወግድ በዲስኮች ላይ በጥሩ ሁኔታ ሰርቷል፣ ምክንያቱም በ RAID firmware ውስጥ እነዚህ ትዕዛዞች በጭራሽ አይደገፉም ፣ እና HBA ፣ በአጠቃላይ ፣ በአውቶቡስ ላይ ለመላክ ምን ትዕዛዞችን አይመለከትም።

ሃርድ ድራይቮች - 8 pcs HGST Travelstar 7K1000 1 ቲቢ በ 2.5 ፎርም ፣ እንደ ላፕቶፖች። እነዚህ አንጻፊዎች ከዚህ ቀደም በRAID 6 ድርድር ውስጥ ነበሩ። በአዲሱ ስርዓት, መተግበሪያንም ያገኛሉ. የአካባቢ ምትኬዎችን ለማከማቸት።

በተጨማሪ ታክሏል፡-

6 ቁርጥራጮች SATA SSD ሞዴል ሳምሰንግ 860 QVO 2TB. እነዚህ ኤስኤስዲዎች ከፍተኛ መጠን፣ የSLC መሸጎጫ መኖር፣ አስተማማኝነት ተፈላጊ እና ዝቅተኛ ዋጋ ያስፈልጋቸዋል። በ dmesg ውስጥ ባለው መስመር የተረጋገጠ መጣል/ዜሮን መደገፍ ግዴታ ነበር።

kernel: ata1.00: Enabling discard_zeroes_data

2 ቁርጥራጮች NVMe SSD ሞዴል ሳምሰንግ SSD 970 EVO 500GB.

ለእነዚህ ኤስኤስዲዎች በዘፈቀደ የማንበብ/የመፃፍ ፍጥነት እና ለፍላጎትዎ የሚሆን ግብአት አስፈላጊ ናቸው። ለእነሱ ራዲያተር. የግድ። የግድ አስፈላጊ ነው። ያለበለዚያ በመጀመሪያው የRAIDA ማመሳሰል ላይ በደንብ ይጠብሷቸው።

አስማሚ StarTech PEX8M2E2 ለ 2 x NVMe ኤስኤስዲ በ PCIe 3.0 8x ማስገቢያ ውስጥ ከተጫነ። ይህ እንደገና፣ HBA ብቻ ነው፣ ግን ለ NVMe። የተቀናጀ PCIe ማብሪያ / ማጥፊያ በመኖሩ ምክንያት ከማዘርቦርድ የ PCIe bifurcationን ለመደገፍ የሚያስፈልጉ መስፈርቶች ባለመኖሩ ከርካሽ አስማሚዎች ይለያል። የ x1 PCIe 1.0 ማስገቢያ ቢሆንም እንኳ PCIe ባለበት በጣም ጥንታዊው ስርዓት ውስጥ ይሰራል. በተፈጥሮ, በተገቢው ፍጥነት. ምንም RAIDዎች የሉም። በቦርዱ ላይ አብሮ የተሰራ ባዮስ የለም። ስለዚህ፣ ለዚህ ​​መሳሪያ ምስጋና ይግባውና NVMe RAID መስራት ይቅርና ስርዓትህ ከNVMe ማስነሳትን በአስማት አይማርም።

ይህ አካል በስርዓቱ ውስጥ አንድ ነፃ 8x PCIe 3.0 ብቻ በመገኘቱ እና 2 ነፃ ቦታዎች ካሉ በቀላሉ በሁለት ሳንቲም PEX4M2E1 ወይም analogues ሊተካ ይችላል ፣ ይህም በ 600 ዋጋ በማንኛውም ቦታ ሊገዛ ይችላል ። ሩብልስ.

ሁሉንም ዓይነት ሃርድዌር ወይም አብሮገነብ ቺፕሴት / ባዮስ RAIDs ውድቅ የተደረገው ከኤስኤስዲ / ኤችዲዲ እራሳቸው በስተቀር አጠቃላይ ስርዓቱን ሙሉ በሙሉ ለመተካት ፣ ሁሉንም መረጃዎች በማቆየት ነው። በሐሳብ ደረጃ፣ ወደ ሙሉ ለሙሉ አዲስ/የተለያየ ሃርድዌር ሲንቀሳቀሱ የተጫነውን ስርዓተ ክወና እንኳን ማስቀመጥ ይችላሉ። ዋናው ነገር SATA እና PCIe ወደቦች መኖራቸው ነው. ልክ እንደ ቀጥታ ሲዲ ወይም ሊነሳ የሚችል ፍላሽ አንፃፊ ነው፣ በጣም ፈጣን እና ትንሽ ግዙፍ።

ቀልድእና ከዚያ እንዴት እንደሚከሰት ታውቃለህ - አንዳንድ ጊዜ በፍጥነት ለመውሰድ ሙሉውን ድርድር ከእርስዎ ጋር መውሰድ ያስፈልግዎታል። እና ውሂብዎን ማጣት አይፈልጉም። ይህንን ለማድረግ, ሁሉም የተጠቀሱት ሚዲያዎች በመደበኛ መያዣው ክፍል 5.25 ውስጥ ባለው ስላይድ ላይ ምቹ ናቸው.

ደህና ፣ እና በእርግጥ ፣ በሊኑክስ ውስጥ የኤስኤስዲ መሸጎጫ መንገዶችን ለመሞከር።

የሃርድዌር ወረራ አሰልቺ ነው። አብራውታል። ይሰራል ወይ አይሰራም። እና ከ mdadm ጋር ሁል ጊዜ አማራጮች አሉ።

ሶፍትዌር

ከዚህ ቀደም ዴቢያን 8 ጄሲ በሃርድዌር ላይ ተጭኗል፣ እሱም ከኢ.ኤል.ኤል ጋር ቅርብ ነው። RAID 6 የተሰበሰበው ከላይ ከተጠቀሱት ኤችዲዲዎች ከ LVM ጋር ተጣምረው ነው። በ kvm/libvirt ውስጥ ቨርቹዋል ማሽኖችን ሰርቷል።

ምክንያቱም ደራሲው ተንቀሳቃሽ ተንቀሳቃሽ SATA / NVMe ፍላሽ አንፃፊዎችን በመፍጠር ረገድ ተስማሚ ልምድ አለው ፣ እና እንዲሁም የተለመደውን አብነት ላለማስቀደም ፣ ኡቡንቱ 18.04 እንደ ዒላማ ስርዓት ተመርጧል ፣ እሱ ቀድሞውኑ የተረጋጋ ፣ ግን አሁንም የ 3 ዓመታት አለው። ወደፊት ድጋፍ.

የተጠቀሰው ስርዓት ከሳጥኑ ውስጥ የምንፈልጋቸውን ሁሉንም የሃርድዌር ነጂዎችን ይዟል. ምንም የሶስተኛ ወገን ሶፍትዌር እና ሾፌር አንፈልግም።

ለመጫን ዝግጅት

ስርዓቱን ለመጫን የኡቡንቱ ዴስክቶፕ ምስል እንፈልጋለን። የአገልጋይ ስርዓት አንድ ዓይነት ኃይለኛ ጫኝ አለው ፣ ይህም ከመጠን በላይ የማይቀየር ነፃነትን ያሳያል ፣ በግድ የ UEFI ስርዓት ክፍልፍልን ወደ አንዱ ዲስኮች በመግፋት ሁሉንም ውበት ያበላሻል። በዚህ መሠረት በ UEFI ሁነታ ብቻ ተጭኗል. አማራጮችን አያቀርብም።

በዚህ አልረካንም።

ለምን?እንደ አለመታደል ሆኖ የ UEFI ማስነሻ ከ RAID ሶፍትዌር ጋር በጣም ተኳሃኝ አይደለም። ማንም ሰው ለUEFI ESP ክፍል ቦታ ማስያዝ የሚሰጠን የለም። በዩኤስቢ ወደብ ውስጥ የ ESP ክፍልፍልን በፍላሽ አንፃፊ ላይ ለማስቀመጥ የሚጠቁሙ በኔትወርኩ ላይ የምግብ አዘገጃጀት መመሪያዎች አሉ ፣ ግን ይህ የውድቀት ነጥብ ነው። የሶፍትዌር mdadm RAID 1ን ከስሪት 0.9 ሜታዳታ ጋር የሚጠቀሙ የምግብ አዘገጃጀት መመሪያዎች አሉ UEFI BIOS ይህንን ክፍልፍል እንዳያይ የማይከለክለው ነገር ግን ባዮስ ወይም ሌላ ሃርድዌር ላይ ያለው ኦኤስ ከሌላው ጋር ማመሳሰልን እየረሳው ለ ESP አንድ ነገር ሲጽፍ እስከ አስደሳች ጊዜ ድረስ ይኖራል ። መስተዋቶች.

በተጨማሪም, UEFI ማስነሳት በ NVRAM ላይ የተመሰረተ ነው, ይህም ከዲስኮች ጋር ወደ አዲስ ስርዓት አይንቀሳቀስም, ምክንያቱም. የእናትቦርዱ አካል ነው።

ስለዚህ፣ መንኮራኩሩን እንደገና አንፈጥርም። ቀደም ሲል ለዓመታት የተረጋገጠ ዝግጁ የሆነ የአያት ብስክሌት አለን ፣ አሁን Legacy / BIOS boot ተብሎ የሚጠራ ፣ በ UEFI-ተኳሃኝ ስርዓቶች ላይ የ CSM ኩሩ ስም ያለው። ከመደርደሪያው ላይ ብቻ እናውጣለን, ቅባት እናደርጋለን, ዊልስ እናስገባለን እና በደረቅ ጨርቅ እናጸዳዋለን.

የኡቡንቱ የዴስክቶፕ ሥሪት እንዲሁ በ Legacy bootloader እንዴት እንደሚጫን አያውቅም ፣ ግን እዚህ ፣ እነሱ እንደሚሉት ፣ ቢያንስ አማራጮች አሉ።

እና ስለዚህ ሃርድዌርን እንሰበስባለን እና ስርዓቱን ከኡቡንቱ ላይቭ ሊነሳ የሚችል ፍላሽ አንፃፊ እንጭነዋለን። ፓኬጆችን ማውረድ አለብን፣ ስለዚህ ያገኙትን አውታረ መረብ እናዘጋጃለን። ካልሰራ, አስቀድመው አስፈላጊ የሆኑትን ጥቅሎች ወደ ዩኤስቢ ፍላሽ አንፃፊ ማውረድ ይችላሉ.

ወደ ዴስክቶፕ አካባቢ ገብተናል፣ ተርሚናል ኢሙሌተርን አስነሳን እና እንሂድ፡-

#sudo bash

እንዴት…?ከላይ ያለው መስመር ቀኖናዊው ሱዶ ሆሊቫር ቀስቅሴ ነው። ሲ ለоብዙ እድሎች ይመጣሉ እና ለоየበለጠ ኃላፊነት. ጥያቄው በራስዎ ላይ መውሰድ ይችላሉ. ብዙ ሰዎች ሱዶን በዚህ መንገድ መጠቀም ቢያንስ ጥንቃቄ የጎደለው ነው ብለው ያስባሉ። ሆኖም፡-

#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 partition እንጠቀማለን. በተጨማሪም ፣ ደራሲው ይህንን FS ለ / (ሥር) መጠቀምን ይመርጣል ፣ ለሌላ ማንኛውም ሶፍትዌር ፣ በ LVM ላይ የተለየ ክፍሎችን መፍጠር እና ወደሚፈለጉት ማውጫዎች መጫን እንደሚችሉ ልብ ይበሉ።

በዚህ FS ላይ የቨርቹዋል ማሽኖችን ወይም የውሂብ ጎታ ምስሎችን አናከማችም።
ይህ FS ሳይዘጋ የስርዓቱን ቅጽበተ-ፎቶዎችን ለመፍጠር ብቻ የሚያገለግል ሲሆን በመቀጠል እነዚህን ቅጽበታዊ ገጽ እይታዎች መላክ/መቀበልን በመጠቀም ወደ መጠባበቂያ ዲስክ በማስተላለፍ ላይ።

በተጨማሪም ደራሲው በአጠቃላይ ቢያንስ ሶፍትዌሮችን በቀጥታ በሃርድዌር ላይ ማስቀመጥ እና የተቀረውን ሶፍትዌር በቨርቹዋል ማሽኖች ውስጥ ማስኬድ እንደ ጂፒዩ እና PCI-USB አስተናጋጅ መቆጣጠሪያዎችን በIOMMU በኩል ወደ KVM ማስተላለፍ ይመርጣል።

በሃርድዌር ላይ የውሂብ ማከማቻ፣ ምናባዊነት እና ምትኬ ብቻ ይቀራሉ።

ZFS ን የበለጠ የምታምን ከሆነ በመርህ ደረጃ ለተጠቀሰው መተግበሪያ ተለዋጭ ናቸው።

ነገር ግን፣ ደራሲው ሆን ብሎ በZFS፣ BRTFS እና LVM ውስጥ የሚገኙትን አብሮ የተሰራውን የማስታወሻ/RAID እና የድግግሞሽ ባህሪያትን ችላ በማለት ነው።

እንደ ተጨማሪ መከራከሪያ ፣ BTRFS የዘፈቀደ ፅሁፎችን ወደ ተከታታይ ፅሁፎች የመቀየር ችሎታ አለው ፣ ይህም በኤችዲዲ ላይ ቅጽበተ-ፎቶዎችን / ምትኬዎችን የማመሳሰል ፍጥነት ላይ በጣም አወንታዊ ተፅእኖ አለው።

ሁሉንም መሳሪያዎች እንደገና ቃኝ፡

#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

ግን በማንኛውም መንገድ ምልክት አንሆንባቸውም. ሁሉም ተመሳሳይ, የእኛ ባዮስ እነዚህን ድራይቮች አያያቸውም. ስለዚህ፣ ሙሉ በሙሉ ወደ ሶፍትዌር RAID ይሄዳሉ። እዚያ ክፍሎች እንኳን አንፈጥርም. በ "ቀኖና" ወይም "በመሠረቱ" መሰረት ከፈለጉ - አንድ ትልቅ ክፍልፍል ይፍጠሩ, ልክ እንደ HDD.

SATA ኤችዲዲ

እዚህ ለመፈልሰፍ ምንም ልዩ ነገር የለም. ለሁሉም ነገር አንድ ክፍል እንፈጥራለን. ባዮስ እነዚህን ዲስኮች ስለሚመለከት ክፋይ እንፈጥራለን እና ከእነሱ ለመነሳት እንኳን መሞከር ይችላል። ስርዓቱ በድንገት እንዲኖረው 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

እዚህ በጣም አስደሳች ነገር አለን.

በመጀመሪያ፣ 2 የቲቢ አንጻፊዎች አሉን። ይህ ለ MBR ተቀባይነት ባለው ክልል ውስጥ ነው፣ ይህም እኛ የምንጠቀመው። አስፈላጊ ከሆነ, በ GPT መተካት ይችላሉ. የጂፒቲ ዲስኮች MBR ተኳሃኝ ስርዓቶች በመጀመሪያዎቹ 4 ቴራባይቶች ውስጥ የሚገኙ ከሆነ የመጀመሪያዎቹን 2 ክፍልፋዮች ለማየት የሚያስችል የተኳሃኝነት ንብርብር አላቸው። ዋናው ነገር የቡት ክፋይ እና በእነዚህ ድራይቮች ላይ ያለው የባዮስ_ግሩብ ክፍልፍል መጀመሪያ ላይ ነው። እንዲያውም ከ Legacy/BIOS GPT ዲስኮች እንዲነሱ ይፈቅድልዎታል.

ግን ይህ የእኛ ጉዳይ አይደለም.

እዚህ ሁለት ክፍሎችን እንፈጥራለን. የመጀመሪያው መጠን 1GB ይሆናል እና ለRAID 1/boot ጥቅም ላይ ይውላል።

ሁለተኛው ለ RAID 6 ጥቅም ላይ የሚውል ሲሆን በአሽከርካሪው መጨረሻ ላይ ካለ ትንሽ ያልተመደበ ቦታ በስተቀር የቀረውን ነፃ ቦታ ሁሉ ይወስዳል።

ያልተመደበው ቦታ ምንድን ነው?በኔትወርኩ ላይ ያሉ ምንጮች እንደሚሉት፣ የእኛ SATA SSDs ከ6 እስከ 78 ጊጋባይት የሚደርስ መጠን ያለው ተለዋዋጭ በሆነ መልኩ የሚሰፋ SLC መሸጎጫ አላቸው። በአሽከርካሪው የውሂብ ሉህ ውስጥ በ "ጊጋባይት" እና "ጊቢባይት" መካከል ባለው ልዩነት 6 ጊጋባይት "በነጻ" እናገኛለን። ቀሪው 72 ጊጋባይት ጥቅም ላይ ካልዋለ ቦታ ተመድቧል።

እዚህ መሸጎጫው SLC መሆኑን ልብ ሊባል ይገባል, እና ቦታው በ 4 ቢት MLC ሁነታ ተይዟል. ይህ ለእኛ ውጤታማ ማለት ለእያንዳንዱ 4 ጊጋባይት ነፃ ቦታ 1 ጊጋባይት SLC መሸጎጫ ብቻ እናገኛለን።

72 ጊጋባይት በ 4 እናባዛለን እና 288 ጊጋባይት እናገኛለን። ድራይቮች የኤስኤልሲ መሸጎጫውን ሙሉ በሙሉ እንዲጠቀሙ ለማድረግ ይህ ምልክት የማንሰጠው ነፃ ቦታ ነው።

ስለዚህም ከስድስት ድራይቮች በድምሩ እስከ 312 ጊጋባይት የ SLC መሸጎጫ ውጤታማ በሆነ መንገድ እናገኛለን። ከሁሉም ድራይቮች 2 ቱ በ RAID ውስጥ ለተደጋጋሚነት ስራ ላይ ይውላሉ።

እንዲህ ዓይነቱ የመሸጎጫ መጠን ጽሑፉ በእውነተኛ ህይወት ውስጥ ወደ መሸጎጫ በማይሄድበት ጊዜ አንድ ሁኔታን አልፎ አልፎ እንድናገኝ ያስችለናል. ይህ እጅግ በጣም የሚያሳዝነውን የQLC ማህደረ ትውስታ ችግርን - መሸጎጫውን ለማለፍ መረጃ በሚፃፍበት ጊዜ በጣም ዝቅተኛ የመፃፍ ፍጥነትን በደንብ ይሸፍናል። ጭነቶችዎ ከዚህ ጋር የማይዛመዱ ከሆነ፣ ከመረጃ ወረቀቱ የተወሰደውን ቲቢደብሊውውን ከግምት ውስጥ በማስገባት የእርስዎ ኤስኤስዲዎች ለምን ያህል ጊዜ በዚህ ጭነት ውስጥ እንደሚኖሩ በደንብ እንዲያስቡ እመክራለሁ።

#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 ይህ ተቀባይነት አለው. አዲስ ድርድር ከሆነ ሁሉም ነገር ሳይጀመር ሊሠራ ይችላል። ከዚህም በላይ የኤስኤስዲ ድርድርን በፍጥረት ማስጀመር የTBW ሃብትን ማባከን ነው። እነሱን "ለመጀመር" በተሰበሰቡ የኤስኤስዲ ድርድሮች ላይ በተቻለ መጠን TRIM/DISCARD እንጠቀማለን።

ለኤስኤስዲ ድርድር፣ RAID 1 DISCARD ከሳጥኑ ውጭ ይደገፋል።

ለ SSD RAID 6 ድርድር፣ DISCARD በከርነል ሞጁል መለኪያዎች ውስጥ መንቃት አለበት።

ይህ መደረግ ያለበት በአጠቃላይ በዚህ ስርዓት ላይ በደረጃ 4/5/6 ድርድር ላይ ያሉ ሁሉም ኤስኤስዲዎች disard_zeroes_data ድጋፍ የሚሰሩ ከሆነ ብቻ ነው። አንዳንድ ጊዜ ይህ ባህሪ የሚደገፍ መሆኑን ከርነል የሚነግሩ እንግዳ አሽከርካሪዎች ያጋጥሟቸዋል፣ ነገር ግን፣ በእውነቱ፣ እሱ የለም፣ ወይም ባህሪው ሁልጊዜ አይሰራም። በአሁኑ ጊዜ ድጋፍ በሁሉም ቦታ ይገኛል, ሆኖም ግን, የድሮ ድራይቮች እና ስሕተቶች ያላቸው firmware ያጋጥሟቸዋል. በዚህ ምክንያት፣ የDISCARD ድጋፍ ለRAID 6 በነባሪነት ተሰናክሏል።

ትኩረት፣ የሚከተለው ትእዛዝ ድርድርን በ"ዜሮዎች በማስጀመር" በ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 ከሁሉም መሳሪያዎች ተጠቃሏል. በስታቲስቲክስ መሰረት, 99% የ IO ከ 512 ኪ.ሜ አይበልጥም.

RAID 6 IOPS በጽሑፍ ሁልጊዜ በአንድ ድራይቭ ከ IOPS ያነሰ ወይም እኩል ነው። የዘፈቀደ ንባብን በተመለከተ፣ IOPS ከአንድ አንፃፊ በብዙ እጥፍ ሊበልጥ ይችላል፣ እና እዚህ የማገጃው መጠን ቁልፍ ጠቀሜታ አለው።
ደራሲው RAID 6 በንድፍ መጥፎ ነው የሚለውን መለኪያ ለማመቻቸት መሞከሩ ምንም ፋይዳ አይኖረውም እና በምትኩ RAID 6 በጥሩ ሁኔታ የሚሰራውን ማመቻቸት።
የRAID 6 መጥፎ የዘፈቀደ ጽሁፍ በNVMe መሸጎጫ እና በቀጭን አቅርቦት ዘዴዎች እናካሳለን።

DISCARDን ለRAID 6 እስካሁን አላነቃነውም።ስለዚህ ይህን ድርድር እስካሁን “አናስጀምረውም”። ስርዓተ ክወናውን ከጫንን በኋላ ይህን በኋላ እናደርጋለን.

SATA ኤችዲዲ

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

LVM በNVMe RAID ላይ

ለፍጥነት፣ የኤፍኤስን ስርወ በ NVMe RAID 1 ላይ ማስቀመጥ እንፈልጋለን ይህም /dev/md0 ነው።
ነገር ግን፣ አሁንም ይህን ፈጣን ድርድር ለሌሎች ፍላጎቶች ማለትም እንደ ስዋፕ፣ LVM-cache ሜታዳታ እና መሸጎጫ፣ እና LVM-ቀጭን ሜታዳታ እንፈልጋለን፣ ስለዚህ በዚህ ድርድር ላይ LVM VG እንፈጥራለን።

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

ለሥሩ FS ክፍልፍል እንፍጠር።

#lvcreate -L 128G --name root root

እንደ RAM መጠን መለዋወጥ እንፍጠር።

#lvcreate -L 32G --name swap root

የስርዓተ ክወና ጭነት

በአጠቃላይ ስርዓቱን ለመጫን የሚያስፈልጉዎት ነገሮች ሁሉ አሉን.

የስርዓት መጫኛ አዋቂን ከኡቡንቱ የቀጥታ አካባቢ እናስጀምረዋለን። መደበኛ ጭነት. ለመጫን ዲስኮች በሚመረጡበት ደረጃ ላይ ብቻ የሚከተሉትን መግለፅ ያስፈልግዎታል ።

  • / dev/md1, - ተራራ ነጥብ / ቡት, FS - BTRFS
  • /dev/ሥር/ሥር (aka/dev/mapper/ሥር-ሥር)) - ተራራ ነጥብ / (ሥር)፣ FS - BTRFS
  • /dev/root/swap (aka/dev/mapper/ root-swap)፣ - እንደ ስዋፕ ክፍልፍል ተጠቀም
  • ቡት ጫኚን በ/dev/sda ላይ ጫን

BTRFSን እንደ ስርወ FS ሲመርጥ ጫኚው "@" ለ/(root) እና "@home" ለ/ቤት የተሰየሙ ሁለት BTRFS ጥራዞችን በራስ ሰር ይፈጥራል።

መጫኑን እንጀምር...

መጫኑ የቡት ጫኚውን በመጫን ላይ ስህተት እንዳለ በሚያሳውቅ ሞዳል መገናኛ ሳጥን ያበቃል። እንደ አለመታደል ሆኖ፣ መደበኛ መንገዶችን በመጠቀም ከዚህ ንግግር ለመውጣት እና መጫኑን መቀጠል አይችሉም። ከስርአቱ ወጥተን እንደገና እንገባለን፣ ወደ ንጹህ የኡቡንቱ ቀጥታ ዴስክቶፕ እንገባለን። ተርሚናል እና እንደገና ይክፈቱ፡-

#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 በቂ የማገጃ መሸጎጫ መጠን ያዘጋጁ። ነባሪው ዋጋ ሊኑክስ ከተፈጠረ ጀምሮ የተለወጠ አይመስልም፣ እና ለረጅም ጊዜ በቂ አልነበረም።
  • ለቼኮች / ድርድሮች ማመሳሰል ቢያንስ IO ያስያዙ። የእርስዎ ድርድሮች በጭነት ውስጥ ዘላለማዊ በሆነ የማመሳሰል ሁኔታ ውስጥ እንዳይጣበቁ ይህ አስፈላጊ ነው።
  • ለቼኮች/የድርድሮች ማመሳሰል ጊዜ ከፍተኛውን IO ይገድቡ። ይህ የኤስኤስዲ RAID ዎች ማመሳሰል/መፈተሽ ድራይቮችዎን ወደ ጥርት እንደማይጥብስ ለማረጋገጥ ነው። ይህ በተለይ ለNVMe እውነት ነው። (ራዲያተሩን አስታውስ? እኔ እየቀለድኩ አልነበረም።)
  • ዲስኮች ስፒንድልሉን (ኤችዲዲ) በኤፒኤም በኩል እንዳያቆሙ ይከላከሉ እና የእንቅልፍ ጊዜያቸውን ለዲስክ መቆጣጠሪያዎች ለ 7 ሰዓታት ያዘጋጁ። አሽከርካሪዎችዎ ሊያደርጉት ከቻሉ ኤፒኤምን ሙሉ በሙሉ ማሰናከል ይችላሉ (-B 255)። በነባሪ እሴት, ዲስኮች ከአምስት ሰከንዶች በኋላ ይቆማሉ. ከዚያ ስርዓተ ክወናው የዲስክ መሸጎጫውን ማፍሰስ ይፈልጋል, ዲስኮች እንደገና ይሽከረከራሉ, እና ሁሉም ነገር አዲስ ነው. ዲስኮች የተገደበ ከፍተኛ የእሽክርክሪት እሽክርክሪት ቁጥር አላቸው። እንዲህ ዓይነቱ ቀላል ነባሪ ዑደት በጥቂት ዓመታት ውስጥ ዲስኮችዎን በቀላሉ ሊገድል ይችላል። ሁሉም ዲስኮች በዚህ የሚሠቃዩት አይደሉም፣ ነገር ግን የእኛ “ማስታወሻ ደብተር”፣ ከተዛማጅ ነባሪ ቅንጅቶች ጋር፣ ከ RAID ውስጥ ጠማማ አምሳያ የሚኒ-MAIDን ይመስላሉ።
  • በዲስኮች ላይ ንባብ (የሚሽከረከር) ወደ 1 ሜጋባይት ያቀናብሩ - ሁለት ተከታታይ ብሎኮች/ቻንክ RAID 6
  • በእራሳቸው ድርድሮች ላይ ማንበብን ያሰናክሉ።

/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 የ/ቡት ክፍልን እንፈልጋለን። የድርድር ስያሜ በንድፈ ሀሳብ ሊቀየር ይችላል።

የተቀሩትን ክፍሎች በ LVM ስሞች በ/dev/mapper/vg-lv notation ውስጥ እንፈልጋለን፣ ምክንያቱም ክፍልፋዮችን በተለየ ሁኔታ ይለያሉ.

UUID ለ LVM አንጠቀምም። የLVM ጥራዞች UUID እና ቅጽበተ-ፎቶዎቻቸው ተመሳሳይ ሊሆኑ ይችላሉ።/dev/mapper/root-root ሁለት ጊዜ ተራራ..?አዎ. በትክክል። የ BTRFS ባህሪ ይህ FS በተለያየ ንዑስ ቮልት ብዙ ጊዜ ሊሰቀል ይችላል።

በዚህ ባህሪ ምክንያት የነቃ የ 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 ጥራዞችን (PVs) እንዳይፈልግ ከልክለናል።

  • LVM መሸጎጫ (cdata) የያዙ መሣሪያዎች
  • መሸጎጫውን በማለፍ በ LVM መሸጎጫ የተሸጎጡ መሳሪያዎች ( _ኮርግ)። በዚህ አጋጣሚ የተሸጎጠው መሳሪያ ራሱ አሁንም በመሸጎጫው ውስጥ ይቃኛል (ልክ ).
  • LVM መሸጎጫ ሜታዳታ (ሴሜታ) የያዙ መሣሪያዎች
  • ምስሎች ተብለው በቪጂ ውስጥ ያሉ ሁሉም መሳሪያዎች። እዚህ የቨርቹዋል ማሽኖች የዲስክ ምስሎች ይኖረናል፣ እና LVM በአስተናጋጁ ላይ የእንግዳው ስርዓተ ክወና የሆኑትን ጥራዞች እንዲያነቃ አንፈልግም።
  • በ VG ውስጥ ያሉ ሁሉም መሳሪያዎች ምትኬ ይባላሉ። እዚህ የቨርቹዋል ማሽን ምስሎች ምትኬ ቅጂዎች ይኖረናል።
  • ስማቸው በ "gpv" የሚያልቅ ሁሉም መሳሪያዎች (የእንግዶች አካላዊ ድምጽ)

በLVM VG ላይ ቦታ ስንለቅ የDISCARD ድጋፍን አንቅተናል። ጠንቀቅ በል. ይህ LV በኤስኤስዲ ላይ መሰረዝን በቂ ያደርገዋል። ይህ በተለይ ለ SSD RAID እውነት ነው 6. ነገር ግን በእቅዱ መሰረት, ቀጭን አቅርቦትን እንጠቀማለን, ስለዚህ ይህ ምንም አያስጨንቀንም.

የኢንትራምፍስ ምስሉን ያዘምኑ፡-

#update-initramfs -u -k all

ግሩብን ጫን እና አዋቅር፡

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

የትኞቹን ዲስኮች መምረጥ አለብዎት?ሁሉም ኤስዲ* ናቸው። ስርዓቱ ከማንኛውም የሚሰራ SATA ድራይቭ ወይም ኤስኤስዲ መነሳት መቻል አለበት።

ኦስ-ፕሮበርን ለምን ተቸነከረ..?ከመጠን በላይ ነፃነት እና ተጫዋች እጆች.

ከ RAID ዎች አንዱ በተበላሸ ሁኔታ ውስጥ ከሆነ በትክክል አይሰራም። በዚህ ሃርድዌር ላይ በሚሰሩ ምናባዊ ማሽኖች ውስጥ ጥቅም ላይ በሚውሉ ክፋዮች ላይ ስርዓተ ክወናን ለመፈለግ ይሞክራል።

ካስፈለገዎት ሊተዉት ይችላሉ, ነገር ግን ከላይ ያሉትን ሁሉንም ነገሮች ያስታውሱ. በአውታረ መረቡ ላይ ተጫዋች እጆችን ለማስወገድ የምግብ አዘገጃጀት መመሪያዎችን እንዲፈልጉ እመክራለሁ.

ይህ የመጀመሪያውን ጭነት ያጠናቅቃል. ወደ አዲስ የተጫነው ስርዓተ ክወና ዳግም ማስጀመር ጊዜው አሁን ነው። ሊነሳ የሚችል የቀጥታ ሲዲ/ዩኤስቢ ማስወገድን አይርሱ።

#exit
#reboot

እንደ ማስነሻ መሳሪያ ማንኛውንም የ SATA SSD ዎች ይምረጡ።

LVM በ SATA SSD ላይ

በዚህ ነጥብ ላይ፣ አስቀድመን ወደ አዲሱ ስርዓተ ክወና አስነሳን፣ ኔትወርክን አቋቁመናል፣ አፕቲድ፣ ተርሚናል ኢምዩሌተርን ከፍተናል እና ሮጠን፡-

#sudo bash

እንቀጥል።

የSATA SSD ድርድር "ጀምር"

#blkdiscard /dev/md2

ካልሰራ እኛ እንሞክራለን፡-

#blkdiscard --step 65536 /dev/md2
በ SATA SSD ላይ LVM VG ይፍጠሩ፡

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

ለምን ሌላ ቪጂ..?በእርግጥ ሩት የሚባል ቪጂ አስቀድሞ አለን። ለምን ሁሉንም ነገር በአንድ ቪጂ ውስጥ አታስቀምጥ?

በ VG ውስጥ ብዙ ፒቪዎች ካሉ, ሁሉም ፒቪዎች ለ VG ትክክለኛ አግብር (ኦንላይን) መገኘት አለባቸው. ልዩነቱ ሆን ብለን የማንጠቀምበት LVM RAID ነው።

በማንኛውም የ RAID 6 ድርድሮች ላይ ብልሽት (የመረጃ መጥፋት አንብብ) በሚከሰትበት ጊዜ ስርዓተ ክወናው በመደበኛ ሁኔታ እንዲነሳ እና ችግሩን ለመፍታት እድሉን እንዲሰጠን እንፈልጋለን።

ይህንን ለማድረግ በመጀመሪያ የአብስትራክሽን ደረጃ እያንዳንዱን አይነት አካላዊ "ተሸካሚ" ወደ የተለየ ቪጂ እናደርገዋለን።

በሳይንስ አነጋገር፣ የተለያዩ የ RAID ድርድሮች ለተለያዩ “አስተማማኝነት ጎራዎች” ናቸው። ለእነሱ ተጨማሪ የጋራ የውድቀት ነጥብ መፍጠር የለብዎትም, በአንድ ቪጂ ውስጥ ይሞላሉ.

የኤል.ኤም.ኤም በ "ብረት" ደረጃ ላይ መገኘቱ የተለያዩ የ RAID ድርድሮችን በተለያየ መንገድ በማጣመር በዘፈቀደ ለመቁረጥ ያስችለናል. ለምሳሌ ሩጡ በተመሳሳይ ጊዜ። bcache + LVM ቀጭን፣ bcache + BTRFS፣ LVM መሸጎጫ + LVM ቀጭን፣ ውስብስብ የZFS ውቅር ከመሸጎጫ ጋር፣ ወይም ሌላ ማንኛውንም ስሜት ለመሰማት እና ለማወዳደር የገሃነም ድብልቅ።

በ "ብረት" ደረጃ, ከጥሩ "ወፍራም" LVM ጥራዞች በስተቀር ምንም ነገር አንጠቀምም. የዚህ ደንብ ልዩነት የመጠባበቂያ ክፋይ ሊሆን ይችላል.

በዚህ ነጥብ ላይ, ብዙ አንባቢዎች ስለ ማትሪዮሽካ አንድ ነገር መጠራጠር ጀምረዋል.

LVM በ SATA HDD ላይ

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

ሌላ አዲስ ቪጂ..?ለዳታ ምትኬ የምንጠቀምባቸው የዲስኮች ስብስብ ሲከሽፍ ኦፐሬቲንግ ሲስተማችን በመደበኛነት መስራቱን እንዲቀጥል እና የመጠባበቂያ ያልሆኑ መረጃዎችን ማግኘት እንዲችል በእውነት እንፈልጋለን። ስለዚህ, የ VG ማግበር ችግሮችን ለማስወገድ, የተለየ ቪጂ እንፈጥራለን.

LVM መሸጎጫ በማዘጋጀት ላይ

እንደ መሸጎጫ መሳሪያ ለመጠቀም በNVMe RAID 1 ላይ LV እንፍጠር።

#lvcreate -L 70871154688B --name cache root

ለምን ትንሽ...?እውነታው ግን የእኛ NVMe SSDs SLC መሸጎጫም አላቸው። 4 ጊጋባይት "ነጻ" እና 18 ጊጋባይት ተለዋዋጭ በ 3-ቢት MLC ውስጥ በተያዘው ነፃ ቦታ ምክንያት. ይህን መሸጎጫ ካሟጠጠ በኋላ NVMe SSDs ከተሸጎጡ SATA SSDs በጣም ፈጣን አይሆንም። በእውነቱ፣ በዚህ ምክንያት፣ የኤል.ኤም.ኤም መሸጎጫ ክፍልፍሉን ከ NVMe ድራይቭ የኤስኤልሲ መሸጎጫ በእጥፍ የበለጠ እንዲበልጥ ማድረግ ለእኛ ምንም ትርጉም አይሰጠንም። ለ NVMe አንጻፊዎች፣ ደራሲው ከ32-64 ጊጋባይት መሸጎጫ መስራት ምክንያታዊ እንደሆነ ይገነዘባል።

የተሰጠው የክፋይ መጠን 64 ጊጋባይት መሸጎጫ፣ መሸጎጫ ሜታዳታ እና ሜታዳታ መጠባበቂያ ለማደራጀት ያስፈልጋል።

በተጨማሪም፣ ስርዓቱ ከቆሸሸ በኋላ፣ LVM መላውን መሸጎጫ እንደ ቆሻሻ ምልክት እንደሚያደርግ እና እንደገና እንደሚመሳሰል አስተውያለሁ። በተጨማሪም ፣ ይህ አዲስ ስርዓት እንደገና እስኪጀመር ድረስ በዚያ መሣሪያ ላይ lvchange በሚጠቀሙበት ጊዜ ሁሉ ይደገማል። ስለዚህ, ወዲያውኑ መሸጎጫውን በተገቢው ስክሪፕት እንዲፈጥሩ እመክራለሁ.

እንደ መሸጎጫ መሳሪያ ለመጠቀም በSATA RAID 6 ላይ LV እንፍጠር።

#lvcreate -L 3298543271936B --name cache data

ለምን ሶስት ቴራባይት ብቻ..?ስለዚህ, አስፈላጊ ከሆነ, ለአንዳንድ ፍላጎቶች SATA SSD RAID 6 መጠቀም ይችላሉ. የተሸጎጠ የቦታ መጠን በተለዋዋጭ, በበረራ ላይ, ስርዓቱን ሳያቋርጥ ሊጨምር ይችላል. ይህንን ለማድረግ, መሸጎጫውን ለጊዜው ማቆም እና እንደገና ማንቃት አለብዎት, ነገር ግን የ LVM-cache ልዩ ጥቅሞች ለምሳሌ, bcache, በበረራ ላይ ሊከናወን ይችላል.

ለመሸጎጫ አዲስ ቪጂ እንፍጠር።

#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/root/cache ላይ እንዲፈጠሩ ሁሉንም ነፃ ቦታ በ / dev/data/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

ለምንድን ነው እንደዚህ ያለ ቅንጥብ..?በተግባራዊ ሙከራዎች ፣ ደራሲው የኤልቪኤም መሸጎጫ ማገጃው መጠን ከኤልቪኤም ስስ ብሎክ መጠን ጋር ተመሳሳይ ከሆነ ምርጡ ውጤት እንደሚገኝ ለማወቅ ችሏል። በተመሳሳይ ጊዜ, ትንሽ መጠኑ, አወቃቀሩ በዘፈቀደ መዝገብ ላይ እራሱን ያሳያል.

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 በቀላሉ መሸጎጫውን ከዲስክ ጋር ያመሳስለዋል፣ ይሰርዘዋል እና cachedata_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"

ክብ እስከ 4 ጊጋባይት: 4294967296B

ለሁለት በማባዛት እና 4194304B ጨምር ለ LVM PV ሜታዳታ፡ 8594128896B
LVM ቀጭን ሜታዳታ እና ምትኬን በላዩ ላይ ለማስቀመጥ በNVMe RAID 1 ላይ የተለየ ክፍልፍል እንፍጠር፡-

#lvcreate -L 8594128896B --name images root

ለምንድነው..?እዚህ ላይ ጥያቄው ሊነሳ ይችላል፣ ለምን የኤልቪኤም ቀጭን ሜታዳታ በNVMe ላይ ከተሸጎጡ እና በፍጥነት የሚሰሩ ከሆነ ለምን ለየብቻ ያስቀምጣሉ።

እዚህ ፍጥነት በጣም አስፈላጊ ነው, ግን ዋናው ምክንያት አይደለም. ነገሩ መሸጎጫው የውድቀት ነጥብ ነው። የሆነ ነገር ሊደርስበት ይችላል, እና የኤል.ኤም.ኤም ቀጭን ሜታዳታ ከተሸጎጠ, የሁሉንም ነገር ሙሉ በሙሉ ወደ ማጣት ያመራል. ያለ ሙሉ ሜታዳታ፣ ቀጭን ጥራዞች መገንባት የማይቻል ይሆናል።

ሜታዳታውን ወደተለየ፣ ያልተሸጎጠ ነገር ግን ፈጣን የድምጽ መጠን በማንቀሳቀስ መሸጎጫው ከጠፋ ወይም ከተበላሸ የሜታዳታውን ደህንነት እናረጋግጣለን። በዚህ ሁኔታ ፣ በመሸጎጫ መጥፋት ምክንያት የሚደርሰው ጉዳት ሁሉ በቀጭን ጥራዞች ውስጥ የተተረጎመ ይሆናል ፣ ይህም የማገገሚያ ሂደቱን በትእዛዞች ቀላል ያደርገዋል። በከፍተኛ ዕድል፣ እነዚህ ጉዳቶች የኤፍኤስ ሎግዎችን በመጠቀም መልሶ ማግኘት ይችላሉ።

በተጨማሪም ፣ የቀጭን ድምጽ ቅጽበታዊ ገጽ እይታ ቀደም ብሎ ከተወሰደ ፣ እና ከዚያ በኋላ ፣ መሸጎጫው ቢያንስ አንድ ጊዜ ሙሉ በሙሉ ተመሳስሏል ፣ ከዚያ ፣ በ LVM ቀጭን የውስጥ መሣሪያ ተፈጥሮ ምክንያት ፣ የፎቶው ትክክለኛነት የተረጋገጠ ከሆነ የመሸጎጫ መጥፋት.

ለጥቃቅን አቅርቦት ኃላፊነት የሚወስድ አዲስ ቪጂ እንፍጠር፡-

#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 መሸጎጫ ይሆናል። ይህ ክዋኔው የተሸጎጠውን መሳሪያ በማለፍ በመሸጎጫው ውስጥ ሙሉ በሙሉ እንዲከናወን ያስችለዋል.

ኤልቪዎችን ወደ ተገቢው ፒቪዎች እናንቀሳቅሳቸው፡-

#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 ሰከንድ ውስጥ ብዙ መቅዳት ይችላሉ። በሰከንድ እስከ 3 ጊጋባይት. ስለዚህ፣ እያንዳንዱ የጽሁፍ ሙከራ ከእርስዎ እስከ 216 ጊጋባይት የኤስኤስዲ ምንጭ ሊበላ ይችላል።

ማንበብ እና መጻፍ ተቀላቅለዋል?አዎ. የማንበብ እና የመፃፍ ፈተናዎችን በተናጠል ማካሄድ ምክንያታዊ ነው። በተጨማሪም ፣ ሁሉም መሸጎጫዎች የተመሳሰሉ መሆናቸውን ማረጋገጥ ተገቢ ነው ፣ ስለሆነም ያለፈው ጽሑፍ በንባብ ላይ ተጽዕኖ እንዳያሳድር።

መሸጎጫው እና ቀጭን ድምጽ ሲሞሉ ውጤቶቹ በመጀመሪያው እና በቀጣዮቹ ላይ በጣም ይለያያሉ ፣ እና እንዲሁም ስርዓቱ በመጨረሻው ሩጫ የተሞሉ መሸጎጫዎችን ማመሳሰል መቻሉ ላይ በመመስረት።

ከሌሎች ነገሮች በተጨማሪ, ቅጽበታዊ ፎቶ በተወሰደበት ቀደም ሲል በተሞላ ቀጭን ድምጽ ላይ ያለውን ፍጥነት ለመለካት እመክራለሁ. ደራሲው የመጀመሪያውን ቅጽበታዊ ገጽ እይታ ከተፈጠረ በኋላ በተለይም መሸጎጫው ገና ሙሉ በሙሉ ባልሞላበት ጊዜ የዘፈቀደ ጽሁፍ እንዴት በአስደናቂ ሁኔታ እንደሚፋጠን የመመልከት እድል ነበረው። ይህ የሆነበት ምክንያት ኮፒ-ላይ መጻፍ የትርጉም ትርጉም፣ መሸጎጫ እና ቀጭን የድምጽ መጠን ማገጃ አሰላለፍ፣ እና በዘፈቀደ ወደ RAID 6 መፃፉ ከRAID 6 ወደ የዘፈቀደ ንባብ በመቀየር ወደ መሸጎጫው ፃፍ። በእኛ ውቅር ውስጥ፣ ከRAID 6 በዘፈቀደ የሚነበበው ንባብ ከመፃፉ እስከ 6 እጥፍ ፈጣን ነው (በድርድር ውስጥ ያሉት የSATA SSDs ብዛት)። ምክንያቱም ለ CoW ብሎኮች ከቀጭኑ ገንዳ በቅደም ተከተል ይመደባሉ ፣ ከዚያ መዝገቡ ፣ በአብዛኛው ፣ እንዲሁ ወደ ቅደም ተከተል ይቀየራል።

እነዚህ ሁለቱም ባህሪያት ጥቅም ላይ ሊውሉ ይችላሉ.

መሸጎጫ "የተጣጣመ" ቅጽበተ-ፎቶዎች

በመሸጎጫ መበላሸት / መጥፋት ላይ የውሂብ መጥፋት አደጋን ለመቀነስ ደራሲው በዚህ ጉዳይ ላይ ያላቸውን ታማኝነት የሚያረጋግጥ ቅጽበታዊ ማሽከርከርን ለማስተዋወቅ ሀሳብ አቅርቧል ።

በመጀመሪያ፣ የቀጭኑ የድምጽ መጠን ሜታዳታ መሸጎጫ ባልሆነ መሳሪያ ላይ ስለሚኖር ሜታዳታው ወጥነት ያለው ይሆናል እና ሊኖሩ የሚችሉ ኪሳራዎች በመረጃ ብሎኮች ውስጥ ይገለላሉ።

የሚከተለው ቅጽበተ-ፎቶ የማሽከርከር ዑደት የመሸጎጫ መጥፋት በሚከሰትበት ጊዜ በቅጽበተ-ፎቶዎች ውስጥ የውሂብ ታማኝነትን ያረጋግጣል።

  1. ለእያንዳንዱ ቀጭን ድምጽ <ስም> የሚባል ቅጽበታዊ ገጽ እይታ ይፍጠሩ <name> የተሸጎጠ
  2. የፍልሰት ጣራውን በተመጣጣኝ ከፍተኛ ዋጋ ያቀናብሩ፡ #lvchange --quiet --cachesettings "migration_threshold=16384" cache/cachedata
  3. በአንድ ዙር ውስጥ፣ በመሸጎጫው ውስጥ ያሉትን የቆሸሹ ብሎኮች ብዛት እንፈትሻለን፡- #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' ዜሮ እስክናገኝ ድረስ. ዜሮ ለረጅም ጊዜ ከጠፋ፣ መሸጎጫውን በጊዜያዊነት ወደ መጻፍ ሁነታ በማዘጋጀት ሊፈጠር ይችላል። ነገር ግን ከSATA እና NVMe SSD ድርድሮች የፍጥነት ባህሪያት እና ከቲቢደብሊው ሃብታቸው አንፃር የመሸጎጫ ሁነታውን ሳይቀይሩ ጊዜውን በፍጥነት ማግኘት ይችላሉ ወይም ሃርድዌርዎ ሀብቱን በጥቂቱ ይበላል። ቀናት. በንብረት ውሱንነት ምክንያት ስርዓቱ በመርህ ደረጃ ከ 100% በታች መሆን አይችልም ሁል ጊዜ የመፃፍ ጭነት። የኛ NVMe ኤስኤስዲዎች ከ100% የመፃፍ ጭነት በታች ያለውን ሀብቱን ሙሉ በሙሉ ይጠቀሙበታል። 3-4 ቀናት. SATA SSDs የሚቆየው በእጥፍ ጊዜ ብቻ ነው። ስለዚህ፣ አብዛኛው ሸክሙ ወደ ንባብ እንደሚሄድ እንገምታለን፣ እና ለመጻፍ በአንፃራዊነት አጫጭር ፍንዳታዎች እጅግ በጣም ከፍተኛ እንቅስቃሴ እና ከአማካይ ዝቅተኛ ሸክም ጋር ይጣመራሉ።
  4. ልክ ዜሮ እንደያዝን (ወይም እንደሰራን)፣ <ስም> የሚለውን ስም ቀይረናል።የተሸጎጠ ወደ <ስም>። የድሮው <ስም>.የተሰራ ተወግዷል።
  5. እንደ አማራጭ፣ መሸጎጫው 100% ሙሉ ከሆነ፣ በስክሪፕቱ እንደገና ሊፈጠር ይችላል፣ በዚህም ያጸዳዋል። በግማሽ ባዶ መሸጎጫ, ስርዓቱ በመጻፍ ላይ በጣም ፈጣን ነው.
  6. የፍልሰት ጣራውን ወደ ዜሮ ያዘጋጁ፡- #lvchange --quiet --cachesettings "migration_threshold=0" cache/cachedata ይህ ለጊዜው መሸጎጫውን ከዋናው ሚዲያ ጋር እንዳይመሳሰል ይከላከላል።
  7. በመሸጎጫው ውስጥ በቂ ለውጦችን በመጠባበቅ ላይ #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' ወይም ሰዓት ቆጣሪው ይሰራል.
  8. እንደገና እንደግመዋለን.

ለምንድነው የስደት ጣራ ችግር...?ነገሩ በተጨባጭ በተግባር "የዘፈቀደ" መዝገብ በእውነቱ ሙሉ በሙሉ በዘፈቀደ አይደለም. ለ 4 ኪሎባይት ሴክተር የሆነ ነገር ከጻፍን, በሚቀጥሉት ሁለት ደቂቃዎች ውስጥ አንድ አይነት ወይም ከአጎራባች (+ ​​- 32K) ዘርፎች ሪኮርድ የመመዝገብ እድሉ ከፍተኛ ነው.

የፍልሰት ጣራውን ወደ ዜሮ በማዘጋጀት ማመሳሰልን ከSATA SSD ጋር እናስተላልፋለን እና ብዙ ለውጦችን በመሸጎጫው ውስጥ ወደተመሳሳይ 64K ብሎክ እናጠቃላለን። ስለዚህ, የ SATA SSD መርጃው በሚታወቅ ሁኔታ ተቀምጧል.

ኮዱ የት ነው..?እንደ አለመታደል ሆኖ ደራሲው እራሱን በባሽ ስክሪፕቶች እድገት ውስጥ በቂ ብቃት እንደሌለው አድርጎ ይቆጥረዋል ፣ ምክንያቱም እሱ 100% እራሱን ያስተማረ እና በ “google” የሚመራ ልማትን ስለሚለማመድ ከእጁ የሚወጣው አስከፊ ኮድ ላለመሆን የተሻለ እንደሆነ ያምናል ። በሌላ ሰው ጥቅም ላይ ይውላል.

እኔ እንደማስበው በዚህ መስክ ውስጥ ያሉ ባለሙያዎች አስፈላጊ ከሆነ ከላይ የተገለጹትን ሁሉንም አመክንዮዎች እራሳቸውን ችለው ለማሳየት እና ምናልባትም ደራሲው ለማድረግ እንደሞከሩት እንደ ስርዓት አገልግሎት አድርገው ያቀናብሩታል ።

እንዲህ ዓይነቱ ቀላል ቅጽበታዊ የማሽከርከር ዘዴ አንድ ቅጽበተ-ፎቶ ሙሉ በሙሉ በ SATA SSD ላይ እንዲመሳሰል ብቻ ሳይሆን ቀጭን_ዴልታ መገልገያን በመጠቀም ከተፈጠረ በኋላ የትኞቹ ብሎኮች እንደተቀየሩ ለማወቅ ያስችለናል እና በዋናው ላይ የሚደርሰውን ጉዳት መተርጎም ጥራዞች፣ ማገገምን በእጅጉ ያቃልላሉ።

TRIM/DISCARD በlibvirt/KVM

ምክንያቱም የመረጃ ማከማቻው ለ KVM ሩጫ ሊቢቨርት ጥቅም ላይ የሚውል ስለሆነ፣ የእኛ ቪኤምዎች ነፃ ቦታ እንዲይዙ ብቻ ሳይሆን አላስፈላጊ ቦታ ለማስለቀቅ ማስተማር ጥሩ ነው።

ይህ የሚደረገው በቨርቹዋል ዲስኮች ላይ የ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>

ከእንግዳ ስርዓተ ክወናዎች የሚመጡ እንደዚህ ያሉ DISCARDዎች በትክክል በኤል.ኤም.ኤም ይያዛሉ፣ እና ብሎኮች በሁለቱም በመሸጎጫ እና በቀጭኑ ገንዳ ውስጥ በትክክል ተስተካክለዋል። በእኛ ሁኔታ ፣ ይህ በዋነኝነት የሚዘገይ ነው ፣ የሚቀጥለው ቅጽበታዊ ገጽ እይታ ሲሰረዝ።

BTRFS ምትኬ

ዝግጁ የሆኑ ስክሪፕቶችን ይጠቀሙ ጽንፈኛ ጥንቃቄ እና በራሱ ኃላፊነት. ደራሲው ይህንን ኮድ ለራሱ እና ለራሱ ብቻ ጽፏል. ብዙ ልምድ ያላቸው የሊኑክስ ተጠቃሚዎች ተመሳሳይ ክራንች እንዳላቸው እርግጠኛ ነኝ፣ እና ሌሎችን መቅዳት አያስፈልግም።

በመጠባበቂያ መሳሪያው ላይ የድምጽ መጠን እንፍጠር፡-

#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

ስክሪፕቱን እንገልብጠው፡-

ብዙ የሚያስፈራ የባሽ ኮድ። በራስዎ ሃላፊነት ይጠቀሙ። ለጸሐፊው የተናደዱ ደብዳቤዎችን አይጻፉ ...#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 ቅጽበተ-ፎቶዎችን ለመፍጠር እና ወደ ሌላ የፋይል ስርዓት ለመቅዳት ቀላል የሆኑ ትዕዛዞችን ይዟል።

የመጀመሪያው ጅምር በአንጻራዊነት ረጅም ሊሆን ይችላል, እንደ ሁሉም መረጃዎች መጀመሪያ ላይ ይገለበጣሉ. ተጨማሪ ማስጀመሪያዎች በጣም ፈጣን ይሆናሉ, ምክንያቱም. ለውጦች ብቻ ይገለበጣሉ.

ወደ ክሮን የምንገፋው ሌላ ስክሪፕት፡-

አንዳንድ ተጨማሪ የባሽ ኮድ#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

ምን ያደርጋል..?የተዘረዘሩ BTRFS ጥራዞች በመጠባበቂያ FS ላይ ተጨማሪ ቅጽበተ-ፎቶዎችን ይፈጥራል እና ያመሳስለዋል። ከዚያ በኋላ፣ ከ60 ቀናት በፊት የተፈጠሩ ሁሉንም ቅጽበተ-ፎቶዎችን ይሰርዛል። ከተጀመረ በኋላ፣ /backup/btrfs/back/remote/ ንኡስ ማውጫዎች የተዘረዘሩ ጥራዞች ቅጽበተ-ፎቶዎችን ይይዛሉ።

ኮድ የማስፈጸም መብት እንስጠው፡-

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

እንፈትሸው እና ክሮን ውስጥ እናስቀምጠው፡-

#/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

drescue ን ይጫኑ ፣ ምክንያቱም ስክሪፕቶች ይህንን መሳሪያ ይጠቀማሉ፡-

#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

ምን ያደርጋል...?ቀጭን ቅጽበተ-ፎቶዎችን ለመቆጣጠር እና በ thin_delta በኩል በተገኙ ሁለት ቀጭን ቅጽበተ-ፎቶዎች መካከል ያለውን ልዩነት ddrescue እና blkdiscard በመጠቀም ከሌላ የማገጃ መሳሪያ ጋር ለማመሳሰል የትዕዛዝ ስብስብ ይዟል።

ወደ ክሮን የምንይዘው ሌላ ስክሪፕት፡-

ጥቂት ተጨማሪ ባሽ#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

እንፈትሸው እና ክሮን ውስጥ እናስቀምጠው፡-

#/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 LVs ለሌሎች ቪጂዎች አካላዊ LVM ፒቪዎች ሊሆኑ ይችላሉ። LVM እንደ ጎጆ አሻንጉሊቶች ተደጋጋሚ ሊሆን ይችላል። ይህ LVM እጅግ በጣም ተለዋዋጭነትን ይሰጣል።

PS

በሚቀጥለው መጣጥፍ ውስጥ ፣በርካታ ተመሳሳይ የሞባይል ማከማቻ / KVMን ለመጠቀም እንሞክራለን በጂኦ-የተከፋፈለ ማከማቻ / ቪኤም ክላስተር በበርካታ አህጉራት በቤት ዴስክቶፖች ፣በቤት ኢንተርኔት እና በፒ2ፒ አውታረመረቦች በኩል ከተደጋጋሚነት ጋር።

ምንጭ: hab.com

አስተያየት ያክሉ