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 سرې رامینځته کول.
  • په NVMe RAID 1 کې د سیسټم نصب کول کله چې په BIOS کې د NVMe ملاتړ شتون نلري.
  • د LVM کیچ او LVM پتلی کارول.
  • د BTRFS سنیپ شاټونو کارول او د بیک اپ لپاره لیږل / ترلاسه کول.
  • د BTRFS سټایل بیک اپ لپاره د LVM پتلی سنیپ شاټونو او پتلی_ډیلټا کارول.

که تاسو لیوالتیا لرئ، مهرباني وکړئ بلی وګورئ.

بیان

لیکوال د دې مقالې څخه د موادو / مثالونو / کوډ / لارښوونو / ډیټا کارولو یا نه کارولو پایلو لپاره هیڅ مسؤلیت نلري. د دې موادو په لوستلو یا په هر ډول کارولو سره، تاسو د دې کړنو د ټولو پایلو مسؤلیت په غاړه اخلئ. احتمالي پایلې شاملې دي:

  • کرسپ شوي NVMe SSDs.
  • په بشپړ ډول د ثبت کولو سرچینې کارول او د SSD ډرایو ناکامي.
  • په ټولو ډرایو کې د ټولو معلوماتو بشپړ ضایع کول، په شمول د بیک اپ کاپي.
  • د کمپیوټر هارډویر غلط.
  • وخت، اعصاب او پیسې ضایع کول.
  • نورې کومې پایلې چې پورته لیست شوي ندي.

اوسپنه

موجود وو:

مدربورډ د 2013 شاوخوا د Z87 چپسیټ سره، د Intel Core i7 / Haswell سره بشپړ شوی.

  • پروسیسر 4 کورونه، 8 تارونه
  • 32 GB DDR3 RAM
  • 1 x 16 یا 2 x 8 PCIe 3.0
  • 1 x 4 + 1 x 1 PCIe 2.0
  • 6 x 6 GBps SATA 3 نښلونکي

د SAS اډاپټر LSI SAS9211-8I IT / HBA حالت ته فلش شوی. د RAID فعال شوي فرم ویئر په قصدي توګه د HBA فرم ویئر سره بدل شوی ترڅو:

  1. تاسو کولی شئ دا اډاپټر هر وخت وغورځوئ او د بل هر هغه سره بدل کړئ چې تاسو ورسره مخ یاست.
  2. TRIM/Discard په عادي ډول په ډیسکونو کې کار کوي، ځکه چې ... په RAID فرم ویئر کې دا کمانډونه په بشپړ ډول نه ملاتړ کیږي، او HBA، په عموم کې، پروا نه کوي چې کوم حکمونه په بس کې لیږدول کیږي.

هارډ ډرایو - د HGST Travelstar 8K7 1000 ټوټې په 1 فارم فاکتور کې د 2.5 TB ظرفیت سره، لکه د لپټاپ لپاره. دا ډرایو دمخه په RAID 6 صف کې وو. دوی به په نوي سیسټم کې هم کار واخلي. د محلي بیک اپ ذخیره کولو لپاره.

سربیره پردې اضافه شوي:

6 ټوټې SATA SSD ماډل سیمسنگ 860 QVO 2TB. دا SSDs لوی حجم ته اړتیا لري، د SLC کیچ شتون، اعتبار، او ټیټ نرخ غوښتل شوي. د رد/صفر لپاره ملاتړ ته اړتیا وه، کوم چې په dmesg کې د کرښې لخوا چک کیږي:

kernel: ata1.00: Enabling discard_zeroes_data

د NVMe SSD ماډل سامسنګ SSD 2 EVO 970GB 500 ټوټې.

د دې SSDs لپاره ، ستاسو د اړتیاو لپاره د تصادفي لوستلو / لیکلو سرعت او د سرچینې ظرفیت مهم دي. د دوی لپاره ریډیټر. لازمه ده. بالکل. که نه نو، د لومړي RAID همغږي کولو په جریان کې تر هغه وخته پورې وخورئ تر څو کرکره نه وي.

د StarTech PEX8M2E2 اډاپټر د 2 x NVMe SSD لپاره په PCIe 3.0 8x سلاټ کې نصب شوی. دا، بیا، یوازې یو HBA دی، مګر د NVMe لپاره. دا د ارزانه اډیپټرونو څخه توپیر لري پدې کې چې دا د جوړ شوي PCIe سویچ شتون له امله د مور بورډ څخه د PCIe دوه اړخیز ملاتړ ته اړتیا نلري. دا به حتی د PCIe سره په خورا پخوانی سیسټم کې کار وکړي، حتی که دا د X1 PCIe 1.0 سلاټ وي. په طبيعي توګه، په مناسب سرعت. هلته هیڅ RAID نشته. په بورډ کې هیڅ جوړ شوی BIOS شتون نلري. نو ، ستاسو سیسټم به په جادویی ډول د NVMe سره بوټ کول زده نه کړي ، د دې وسیلې څخه د NVMe RAID څخه ډیر لږ مننه.

دا برخه یوازې په سیسټم کې یوازې د یو وړیا 8x PCIe 3.0 شتون له امله وه ، او که چیرې 2 وړیا سلاټونه شتون ولري ، نو دا په اسانۍ سره د دوه قلمي PEX4M2E1 یا انلاګونو سره بدل کیدی شي ، کوم چې د 600 قیمت لپاره هرچیرې اخیستل کیدی شي. روبل

د هر ډول هارډویر یا جوړ شوي چپسیټ/BIOS RAIDs رد کول په قصدي ډول رامینځته شوي ، ترڅو وکولی شي په بشپړ ډول د بشپړ سیسټم ځای په ځای کړي ، د SSD/HDD پخپله استثنا سره ، پداسې حال کې چې ټول معلومات ساتي. په مثالي توګه ، نو تاسو کولی شئ حتی نصب شوي عملیاتي سیسټم خوندي کړئ کله چې په بشپړ ډول نوي / مختلف هارډویر ته حرکت وکړئ. اصلي شی دا دی چې د SATA او PCIe بندرونه شتون لري. دا د ژوندۍ CD یا د بوټ وړ فلش ډرایو په څیر دی ، یوازې خورا ګړندی او یو څه لوی.

مزاحکه نه نو، تاسو پوهیږئ چې څه پیښیږي - ځینې وختونه تاسو په چټکۍ سره اړتیا لرئ چې د نیولو لپاره ټول صف له ځان سره ولرئ. مګر زه نه غواړم معلومات له لاسه ورکړم. د دې کولو لپاره ، ټولې ذکر شوې رسنۍ په اسانۍ سره د معیاري قضیې 5.25 خلیجونو کې په سلایډونو کې موقعیت لري.

ښه ، او البته ، په لینکس کې د SSD کیچ کولو مختلف میتودونو تجربه کولو لپاره.

د هارډویر بریدونه ستړي دي. چالان يې کړه. دا یا کار کوي یا دا نه کوي. او د mdadm سره تل اختیارونه شتون لري.

ساوتري

مخکې، Debian 8 Jessie په هارډویر کې نصب شوی و، کوم چې EOL ته نږدې دی. RAID 6 د پورته ذکر شوي HDDs څخه د LVM سره جوړه شوې وه. دا په kvm/libvirt کې مجازی ماشینونه چلول.

ځکه لیکوال د پورټ ایبل بوټ ایبل SATA/NVMe فلش ډرایو رامینځته کولو کې مناسبه تجربه لري ، او همدارنګه د معمول اپټ ټیمپلیټ ماتولو لپاره ، اوبنټو 18.04 د هدف سیسټم په توګه غوره شوی ، کوم چې دمخه په کافي اندازه ثبات شوی ، مګر لاهم 3 کاله لري. په راتلونکي کې ملاتړ.

یاد شوی سیسټم ټول هغه هارډویر ډرایورونه لري چې موږ یې له بکس څخه بهر ته اړتیا لرو. موږ د دریمې ډلې سافټویر یا چلوونکي ته اړتیا نلرو.

د لګولو لپاره چمتو کول

د سیسټم نصبولو لپاره موږ د اوبنټو ډیسټاپ عکس ته اړتیا لرو. د سرور سیسټم یو ډول قوي انسټالر لري، کوم چې ډیره خپلواکي ښیي چې د UEFI سیسټم ویش په یو ډیسک کې د ویشلو له لارې غیر فعال کیدی نشي، ټول ښکلا خرابوي. په دې اساس، دا یوازې په UEFI حالت کې نصب شوی. هیڅ اختیار نه وړاندې کوي.

موږ له دې څخه خوښ نه یو.

Почему؟له بده مرغه، د UEFI بوټ د بوټ سافټویر RAID سره خورا کمزوری مطابقت لري، ځکه چې ... هیڅوک موږ ته د UEFI ESP ویش لپاره ریزرویشن نه وړاندې کوي. آنلاین ترکیبونه شتون لري چې وړاندیز کوي د ESP برخې په فلش ډرایو کې په USB پورټ کې ځای په ځای کړي ، مګر دا د ناکامۍ نقطه ده. د میټاډاټا نسخه 1 سره د mdadm RAID 0.9 سافټویر کارولو ترکیبونه شتون لري چې د UEFI BIOS د دې برخې لیدو مخه نه نیسي ، مګر دا د خوښۍ شیبې پورې ژوند کوي کله چې BIOS یا بل هارډویر OS ESP ته یو څه لیکي او له نورو سره یې همغږي کول هیر کړي. عکسونه

سربیره پردې ، د UEFI بوټ په NVRAM پورې اړه لري ، کوم چې به نوي سیسټم ته د ډیسکونو سره حرکت ونه کړي ، ځکه چې د مور بورډ برخه ده.

نو، موږ به یو نوی څرخ بیا ایجاد نه کړو. موږ دمخه یو چمتو شوی ، د وخت ازمویل شوي د نیکه بایسکل لرو ، چې اوس د Legacy/BIOS بوټ په نوم یادیږي ، د UEFI سره مطابقت لرونکي سیسټمونو کې د CSM ویاړلي نوم لري. موږ به دا یوازې له المارۍ څخه وباسو ، غوړ یې کړو ، ټایرونه به پمپ کړو او په لنده ټوکر یې مسح کړو.

د اوبنټو ډیسټاپ نسخه هم د میراث بوټلوډر سره په سمه توګه نشي نصب کیدی ، مګر دلته ، لکه څنګه چې دوی وايي ، لږترلږه اختیارونه شتون لري.

او پدې توګه ، موږ هارډویر راټولوو او سیسټم د اوبنټو لایو بوټ ایبل فلش ډرایو څخه بار کوو. موږ به د کڅوړو ډاونلوډ ته اړتیا ولرو، نو موږ به هغه شبکه جوړه کړو چې ستاسو لپاره کار کوي. که دا کار ونکړي، تاسو کولی شئ اړین کڅوړې مخکې له مخکې په فلش ډرایو کې بار کړئ.

موږ د ډیسټاپ چاپیریال ته ځو ، د ټرمینل ایمولیټر لانچ کوو ، او موږ ځو:

#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 برخې لپاره وکاروو. برسېره پردې، لیکوال غوره کوي چې دا FS د / (root) لپاره وکاروي، په یاد ولرئ چې د کوم بل سافټویر لپاره تاسو کولی شئ په LVM کې جلا جلا برخې جوړې کړئ او په اړین لارښودونو کې یې نصب کړئ.

موږ به پدې FS کې د مجازی ماشینونو یا ډیټابیس کوم عکسونه ذخیره نکړو.
دا FS به یوازې د سیسټم سنیپ شاټونو رامینځته کولو لپاره کارول کیږي پرته لدې چې دا بند کړي او بیا دا سنیپ شاټونه د لیږلو/ترلاسه کولو په کارولو سره بیک اپ ډیسک ته انتقال کړي.

سربیره پردې ، لیکوال عموما غوره کوي چې لږترلږه سافټویر مستقیم په هارډویر کې وساتي او نور ټول سافټویر په مجازی ماشینونو کې پرمخ بوځي لکه د GPUs او PCI-USB کوربه کنټرولرونو ته د IOMMU له لارې KVM ته لیږل.

یوازې هغه شیان چې په هارډویر کې پاتې دي د ډیټا ذخیره کول ، مجازی کول او بیک اپ دي.

که تاسو په ZFS ډیر باور لرئ، نو په اصولو کې، د ټاکل شوي غوښتنلیک لپاره دوی د تبادلې وړ دي.

په هرصورت، لیکوال په عمدي توګه جوړ شوي عکس العمل/RAID او بې ځایه شوي ځانګړتیاوې له پامه غورځوي چې ZFS، BRTFS او LVM لري.

د اضافي دلیل په توګه، 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

دا هغه ځای دی چې شیان زموږ لپاره په زړه پوري کیږي.

لومړی، زموږ ډرایو د 2 TB اندازه لري. دا د MBR لپاره د منلو وړ حد کې دی، کوم چې موږ به یې وکاروو. که اړتیا وي، د GPT سره بدل کیدی شي. د GPT ډیسکونه د مطابقت پرت لري چې د MBR سره مطابقت لرونکي سیسټمونو ته اجازه ورکوي چې لومړی 4 برخې وګوري که چیرې دوی په لومړي 2 ټیرابایټ کې موقعیت ولري. اصلي شی دا دی چې په دې ډیسکونو کې د بوټ ویش او بایوس_ګرب برخه باید په پیل کې وي. دا حتی تاسو ته اجازه درکوي د GPT میراث / BIOS ډرایو څخه بوټ وکړئ.

مګر دا زموږ قضیه نه ده.

دلته به دوه برخې جوړې کړو. لومړی به د 1 GB اندازه وي او د RAID 1 / بوټ لپاره کارول کیږي.

دوهم به د RAID 6 لپاره وکارول شي او د ډرایو په پای کې د یوې کوچنۍ غیر تخصیص شوي ساحې پرته به ټول پاتې خالي ځای ونیسي.

دا بې نښه شوې سیمه څه ده؟په شبکه کې د سرچینو په وینا، زموږ د SATA SSDs په تخته کې د 6 څخه تر 78 ګیګابایټ پورې اندازه کې د متحرک ډول د پراختیا وړ SLC کیچ لري. موږ د ډرایو په ډیټا شیټ کې د "ګیګابایټ" او "ګیبایټس" ترمینځ توپیر له امله 6 ګیګابایټ "وړیا" ترلاسه کوو. پاتې 72 ګیګابایټ د غیر استعمال شوي ځای څخه تخصیص شوي.

دلته باید یادونه وشي چې موږ د SLC کیچ لرو، او ځای په 4 بټ MLC حالت کې نیول شوی. کوم چې زموږ لپاره په مؤثره توګه معنی لري چې د هر 4 ګیګابایټ وړیا ځای لپاره به موږ یوازې 1 ګیګابایټ SLC کیچ ترلاسه کړو.

72 ګیګابایټ په 4 سره ضرب کړئ او 288 ګیګابایټ ترلاسه کړئ. دا وړیا ځای دی چې موږ به یې په نښه نه کړو ترڅو ډرایو ته اجازه ورکړو چې د SLC کیچ څخه بشپړ ګټه پورته کړي.

په دې توګه، موږ به په مؤثره توګه تر 312 ګیګابایټ پورې د SLC کیچ له ټول شپږ ډرایو څخه ترلاسه کړو. د ټولو ډرایو څخه، 2 به په RAID کې د بې ځایه کیدو لپاره وکارول شي.

د کیچ دا مقدار به موږ ته اجازه راکړو چې په ریښتیني ژوند کې په ندرت سره د داسې وضعیت سره مخ شو چې لیکل کیچ ته نه ځي. دا د QLC حافظې ترټولو غمجنه نیمګړتیا ته خورا ښه تاوان ورکوي - د لیکلو خورا ټیټ سرعت کله چې ډاټا د کیچ په واسطه لیکل کیږي. که ستاسو بارونه د دې سره مطابقت نه لري، نو زه وړاندیز کوم چې تاسو د دې په اړه سخت فکر وکړئ چې ستاسو SSD به څومره وخت د داسې بار لاندې دوام وکړي ، د ډیټا شیټ څخه TBW په پام کې نیولو سره.

#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 سرچینې ضایع کول دي. موږ TRIM/DISCARD کاروو چیرې چې ممکنه وي د SSD په راټولو کې د دوی "پیل" کولو لپاره.

د SSD صفونو لپاره، RAID 1 DISCARD د بکس څخه بهر ملاتړ شوی.

د SSD RAID 6 ډیسکارډ سرې لپاره، تاسو باید دا د کرنل ماډل پیرامیټونو کې فعال کړئ.

دا باید یوازې هغه وخت ترسره شي که ټول SSDs په دې سیسټم کې د 4/5/6 لیول کې کارول شوي د discard_zeroes_data لپاره کاري ملاتړ ولري. ځینې ​​​​وختونه تاسو د عجیب ډرایو سره مخ شئ چې کرنل ته ووایی چې دا فنکشن ملاتړ شوی ، مګر په حقیقت کې دا شتون نلري ، یا فنکشن تل کار نه کوي. دا مهال، ملاتړ نږدې هرچیرې شتون لري، په هرصورت، زاړه ډرایو او فرم ویئر د غلطیو سره شتون لري. د دې دلیل لپاره، د 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 لنډیز شوی. د احصایو له مخې، د IO 99٪ د 512K څخه زیات نه وي.

په هره لیکنه کې RAID 6 IOPS تل د یو ډرایو له IOPS څخه لږ یا مساوي. کله چې ، د تصادفي لوستلو په توګه ، IOPS د یو ډرایو په پرتله څو ځله لوی کیدی شي ، او دلته د بلاک اندازه کلیدي اهمیت لري.
لیکوال د داسې پیرامیټر غوره کولو په هڅه کې نقطه نه ګوري چې د RAID 6 لخوا ډیزاین کې خراب دی او پرځای یې هغه څه غوره کوي چې RAID 6 ښه دی.
موږ به د RAID 6 ضعیف تصادفي لیکلو لپاره د NVMe کیچ او پتلي چمتو کولو چلونو سره جبران کړو.

موږ لا تر اوسه د 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

LVM په NVMe RAID کې

د سرعت لپاره، موږ غواړو د روټ فایل سیسټم په NVMe RAID 1 کې ځای په ځای کړو کوم چې /dev/md0 دی.
په هرصورت، موږ به بیا هم د نورو اړتیاو لپاره دې ګړندۍ صف ته اړتیا ولرو، لکه سویپ، میټاډاټا او LVM-cache او LVM- پتلی میټاډاټا، نو موږ به پدې صف کې LVM VG جوړ کړو.

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

راځئ چې د روټ فایل سیسټم لپاره یوه برخه جوړه کړو.

#lvcreate -L 128G --name root root

راځئ چې د RAM د اندازې سره سم د بدلولو لپاره یوه برخه جوړه کړو.

#lvcreate -L 32G --name swap root

د OS نصب کول

په مجموع کې، موږ د سیسټم نصبولو لپاره اړین هرڅه لرو.

د اوبنټو ژوند چاپیریال څخه د سیسټم نصبولو وزرډ لانچ کړئ. نورمال نصب. یوازې د نصب کولو لپاره د ډیسکونو غوره کولو مرحله کې ، تاسو اړتیا لرئ لاندې مشخص کړئ:

  • /dev/md1، - mount point /boot، FS - BTRFS
  • /dev/root/root (aka /dev/mapper/root-root)، - mount point / (root)، FS - BTRFS
  • /dev/root/swap (aka /dev/mapper/root-swap)، - د سویپ برخې په توګه وکاروئ
  • بوټلوډر په /dev/sda کې نصب کړئ

کله چې تاسو د روټ فایل سیسټم په توګه BTRFS وټاکئ، نو انسټالر به په اتوماتيک ډول دوه BTRFS حجمونه رامینځته کړي چې نوم یې "@" د / (root) لپاره، او "@home" د /home لپاره.

راځئ چې نصب پیل کړو ...

نصب به د موډل ډیالوګ بکس سره پای ته ورسیږي چې د بوټلوډر په نصبولو کې یوه تېروتنه په ګوته کوي. له بده مرغه، تاسو به نشئ کولی د معیاري وسیلو په کارولو سره له دې ډیالوګ څخه وځئ او نصبولو ته دوام ورکړئ. موږ له سیسټم څخه لاګ آوټ شو او بیا لاګ ان شو ، په پاک اوبنټو لایو ډیسټاپ کې پای ته ورسیدو. ټرمینل خلاص کړئ، او بیا:

#sudo bash

د نصب کولو دوام لپاره د کروټ چاپیریال رامینځته کړئ:

#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

راځئ چې په کروټ کې شبکه او کوربه نوم تنظیم کړو:

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

راځئ چې د کروټ چاپیریال ته لاړ شو:

#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 ایډیټ کړئ

راځئ چې د RAID 6 ماډل لپاره پیرامیټونه تنظیم کړو ترڅو د TRIM/DISCARD فعالولو لپاره:

#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 لپاره کافي وي. د ډیفالټ ارزښت ، داسې بریښي چې د لینکس رامینځته کیدو راهیسې ندي بدل شوي ، او د اوږدې مودې لپاره کافي ندي.
  • د سري چکونو/همغږي کولو مودې لپاره لږترلږه IO خوندي کړئ. دا د دې لپاره دی چې ستاسو سرې د بار لاندې د ابدي همغږي حالت کې د پاتې کیدو مخه ونیسي.
  • د صفونو د چک / همغږي کولو پرمهال اعظمي IO محدود کړئ. دا اړینه ده چې د SSD RAIDs همغږي کول / چک کول ستاسو ډرایوونه کرکرا نه کوي. دا په ځانګړې توګه د NVMe لپاره ریښتیا ده. (د ریډیټر په اړه یاد ولرئ؟ زه ټوکې نه کوم.)
  • ډیسکونه د APM له لارې د سپینډل گردش (HDD) بندولو څخه منع کړئ او د ډیسک کنټرولرانو لپاره د خوب وخت 7 ساعتونو ته وټاکئ. تاسو کولی شئ په بشپړ ډول APM غیر فعال کړئ که ستاسو ډرایو دا کولی شي (-B 255). د ډیفالټ ارزښت سره ، ډرایو به پنځه ثانیې وروسته ودریږي. بیا OS غواړي د ډیسک کیچ له سره تنظیم کړي ، ډیسکونه به بیا وګرځي ، او هرڅه به بیا پیل شي. ډیسکونه د سپینډل گردشونو محدود حد لري. دا ډول ساده ډیفالټ دوره کولی شي په څو کلونو کې ستاسو ډیسکونه په اسانۍ سره وژني. ټول ډیسکونه له دې څخه رنځ وړي ، مګر زموږ "لیپ ټاپ" دي ، د مناسب ډیفالټ ترتیباتو سره ، کوم چې 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 په واسطه د /boot ویش لټون وکړو. د سرې نوم کول په نظرياتي توګه بدلون کولی شي.

موږ به پاتې برخې د LVM نومونو په واسطه په /dev/mapper/vg-lv نوټیشن کې ولټوو، ځکه چې دوی تقسیمونه په ځانګړي ډول پیژني.

موږ د LVM لپاره UUID نه کاروو ځکه چې د LVM حجمونو UUID او د دوی سنیپ شاټونه ورته کیدی شي.Mount /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

څه وه..؟موږ د LVM پتلي حوضونو اتوماتیک پراخول فعال کړي دي کله چې د نیول شوي ځای 90٪ حجم ته 5٪ ته رسیدو سره.

موږ د LVM کیچ لپاره د کیچ بلاکونو اعظمي شمیر زیات کړی دی.

موږ د LVM په اړه د LVM حجمونو (PV) لټون کولو مخه نیولې ده:

  • هغه وسایل چې د LVM کیچ لري (cdata)
  • وسیلې د LVM کیچ په کارولو سره زیرمه شوي ، د کیچ په واسطه ( _کوریګ). په دې حالت کې، زیرمه شوی وسیله به لاهم د کیچ له لارې سکین شي (یوازې ).
  • هغه وسایل چې د LVM کیچ میټاډاټا (cmeta) لري
  • په VG کې ټول وسایل د نوم عکسونو سره. دلته به موږ د مجازی ماشینونو ډیسک عکسونه ولرو، او موږ په کوربه کې LVM نه غواړو چې د میلمستون OS پورې اړوند حجمونه فعال کړي.
  • په VG کې ټول وسایل د نوم بیک اپ سره. دلته به موږ د مجازی ماشین عکسونو بیک اپ کاپي ولرو.
  • ټول وسایل چې نوم یې د "gpv" سره پای ته رسیږي (د میلمه فزیکي حجم)

موږ د DISCARD ملاتړ فعال کړی دی کله چې په LVM VG کې وړیا ځای خالي کړئ. پام ولرئ. دا به په SSD کې د LVs حذف کول خورا وخت نیسي. دا په ځانګړې توګه د 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 اضافه کړل ..؟د ډیرې خپلواکۍ او لوبو لاسونو لپاره.

دا په سمه توګه کار نه کوي که چیرې د RAIDs څخه یو په خراب حالت کې وي. دا هڅه کوي په پارشنونو کې د OS لټون وکړي چې په دې هارډویر کې په مجازی ماشینونو کې کارول کیږي.

که تاسو ورته اړتیا لرئ، تاسو کولی شئ دا پریږدئ، مګر پورته ټول په پام کې ونیسئ. زه د آنلاین شرارتي لاسونو څخه د خلاصون لپاره د ترکیبونو په لټه کې وړاندیز کوم.

له دې سره موږ لومړني نصب بشپړ کړ. دا وخت دی چې نوي نصب شوي OS ته ریبوټ کړئ. د بوټ وړ ژوندۍ CD/USB لرې کول مه هیروئ.

#exit
#reboot

د بوټ وسیلې په توګه د SATA SSDs څخه کوم غوره کړئ.

LVM په SATA SSD کې

پدې مرحله کې، موږ لا دمخه په نوي 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 ..؟په حقیقت کې، موږ لا دمخه د وی جی په نوم روټ لرو. ولې هرڅه په یو VG کې نه اضافه کوئ؟

که چیرې په VG کې ډیری PVs شتون ولري، نو د دې لپاره چې VG په سمه توګه فعال شي، ټول PVs باید شتون ولري (آنلاین). استثنا LVM RAID دی، کوم چې موږ په قصدي توګه نه کاروو.

موږ واقعیا غواړو چې که چیرې د RAID 6 په هر یو کې ناکامي (د معلوماتو ضایع کول) شتون ولري ، نو عملیاتي سیسټم به په نورمال ډول بوټ شي او موږ ته د ستونزې حل کولو فرصت راکړي.

د دې کولو لپاره ، د خلاصون په لومړۍ کچه کې به موږ هر ډول فزیکي "میډیا" په جلا VG کې جلا کړو.

په ساینسي توګه خبرې کول، د RAID مختلف صفونه د مختلف "د اعتبار وړ ډومینونو" پورې اړه لري. تاسو باید د دوی لپاره د ناکامۍ اضافي عام ټکی رامینځته نکړئ د دوی په یو VG کې په مینځلو سره.

د "هارډویر" په کچه د LVM شتون به موږ ته اجازه راکړي چې په خپله خوښه د مختلف RAID صفونو ټوټې په مختلفو لارو سره یوځای کولو سره پرې کړو. د مثال په توګه - چلول په ورته وخت کې bcache + LVM پتلی، bcache + BTRFS، LVM کیچ + LVM پتلی، د کیچونو سره یو پیچلی ZFS ترتیب، یا کوم بل دوزخي مخلوط هڅه وکړئ او دا ټول پرتله کړئ.

د "هارډویر" په کچه، موږ به د ښه زاړه "موټی" LVM حجمونو پرته بل څه ونه کاروو. د دې قاعدې استثنا ممکن د بیک اپ ویش وي.

زه فکر کوم چې پدې مرحله کې ، ډیری لوستونکو دمخه د ځنځیر ګنډۍ په اړه یو څه شک پیل کړی و.

LVM په SATA HDD کې

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

نوی VG بیا ..؟موږ واقعیا غواړو چې که د ډیسک سرې چې موږ به یې د ډیټا بیک اپ لپاره کاروو ناکام شو ، زموږ عملیاتي سیسټم به په نورمال ډول کار ته دوام ورکړي ، پداسې حال کې چې د معمول په څیر غیر بیک اپ ډیټا ته لاسرسی ساتل کیږي. له همدې امله، د VG فعالولو ستونزو څخه مخنیوي لپاره، موږ یو جلا VG جوړوو.

د LVM کیچ تنظیم کول

راځئ چې په NVMe RAID 1 کې LV جوړ کړو ترڅو دا د کیشینګ وسیلې په توګه وکاروو.

#lvcreate -L 70871154688B --name cache root

ولې دومره کم دی...؟حقیقت دا دی چې زموږ NVMe SSDs هم د SLC کیچ لري. 4 ګیګابایټ "وړیا" او 18 ګیګابایټ متحرک د وړیا ځای له امله چې په 3-bit MLC کې نیول شوی. یوځل چې دا زیرمه ختمه شي ، د NVMe SSDs به د کیچ سره زموږ د SATA SSD څخه ډیر ګړندي نه وي. په حقیقت کې ، د دې دلیل لپاره ، دا زموږ لپاره هیڅ معنی نلري چې د LVM کیچ برخې د NVMe ډرایو د SLC کیچ اندازې دوه چنده څخه خورا لوی کړي. د کارول شوي NVMe ډرایو لپاره، لیکوال دا مناسب ګڼي چې د 32-64 ګیګابایټ کیچ جوړ کړي.

د ورکړل شوي ویش اندازه د 64 ګیګابایټ کیچ ، کیچ میټاډاټا ، او میټاډاټا بیک اپ تنظیم کولو لپاره اړینه ده.

سربیره پردې ، زه یادونه کوم چې د خراب سیسټم بندیدو وروسته ، LVM به ټوله کیچ د خندا په توګه په نښه کړي او بیا به همغږي شي. سربیره پردې ، دا به هرکله تکرار شي چې په دې وسیله کې lvchange کارول کیږي تر هغه چې سیسټم بیا ریبوټ شوی نه وي. له همدې امله ، زه د مناسب سکریپټ په کارولو سره سمدلاسه د کیچ بیا جوړولو وړاندیز کوم.

راځئ چې په SATA RAID 6 کې LV جوړ کړو ترڅو دا د زیرمه شوي وسیلې په توګه وکاروو.

#lvcreate -L 3298543271936B --name cache data

ولې یوازې درې تیرایټ..؟نو که اړتیا وي، تاسو کولی شئ د ځینو نورو اړتیاو لپاره د SATA SSD RAID 6 وکاروئ. د زیرمه شوي ځای اندازه کولی شي په متحرک ډول لوړ شي ، په الوتنه کې ، پرته له دې چې سیسټم ودروي. د دې کولو لپاره ، تاسو اړتیا لرئ په لنډمهاله توګه کیچ ودروئ او بیا فعال کړئ ، مګر د LVM-cache اوور ځانګړې ګټه ، د مثال په توګه ، bcache دا دی چې دا په الوتنه کې ترسره کیدی شي.

راځئ چې د کیچ کولو لپاره نوی 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)

یوازې [cachedata_corig] باید په /dev/data/cache کې موقعیت ولري. که یو څه غلط وي، نو 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

دوه سره ضرب کړئ او د LVM PV میټاډاټا لپاره 4194304B اضافه کړئ: 8594128896B
راځئ چې په 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 څنډې سره سمون ولري. دا به عملیات ته اجازه ورکړي چې په بشپړ ډول د کیچ له لارې ترسره شي، د زیرمه شوي وسیلې په واسطه.

راځئ چې LVs ورته PVs ته واړوو:

#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 ثانیو لپاره پرمخ ځي. نیمایي ازموینې د ثبت لپاره دي. تاسو کولی شئ په 4 ثانیو کې په NVMe کې ډیر څه ثبت کړئ. په هر ثانیه کې تر 3 ګیګابایټ پورې. نو ، د لیکلو ازموینو هر چل کولی شي ستاسو څخه تر 216 ګیګابایټ پورې د SSD سرچینې وخوري.

لوستل او لیکل مخلوط؟هو. دا معنی لري چې په جلا توګه د لوستلو او لیکلو ازموینې پرمخ بوځي. سربیره پردې ، دا معنی لري چې ډاډ ترلاسه کړئ چې ټولې کیچونه همغږي شوي ترڅو مخکې جوړ شوی لیکنه په لوستلو اغیزه ونکړي.

پایلې به د لومړي لانچ او وروسته په جریان کې خورا توپیر ولري لکه څنګه چې کیچ او پتلی حجم ډکیږي ، او پدې پورې اړه لري چې ایا سیسټم د وروستي لانچ په جریان کې ډک شوي کیچونه همغږي کړي.

د نورو شیانو په مینځ کې ، زه وړاندیز کوم چې سرعت په بشپړ پتلي حجم کې اندازه کړئ له کوم څخه چې یوازې سنیپ شاټ اخیستل شوی و. لیکوال فرصت درلود چې وګوري چې څنګه تصادفي لیکنې د لومړي سنیپ شاټ رامینځته کولو وروسته سمدلاسه ګړندي کیږي ، په ځانګړي توګه کله چې زیرمه لاهم په بشپړ ډول ډکه نه وي. دا د کاپي پر لیکلو لیکلو سیمانټیکونو له امله پیښیږي ، د کیچ ترتیب او د حجم پتلي بلاکس ، او دا حقیقت چې RAID 6 ته تصادفي لیکنه د RAID 6 څخه په تصادفي لوستلو بدلیږي او وروسته کیچ ته لیکل کیږي. زموږ په ترتیب کې، د RAID 6 څخه تصادفي لوستل تر 6 ځله پورې دي (په صف کې د SATA SSDs شمیر) د لیکلو په پرتله ګړندی. ځکه د CoW لپاره بلاکونه په ترتیب سره د یو پتلي حوض څخه تخصیص شوي، بیا ثبت کول، د ډیری برخې لپاره، په ترتیب سره هم بدلیږي.

دا دواړه ځانګړتیاوې ستاسو د ګټې لپاره کارول کیدی شي.

کیچ "همغږي" سنیپ شاټونه

د کیچ د زیان / ضایع کیدو په صورت کې د معلوماتو د ضایع کیدو خطر کمولو لپاره، لیکوال وړاندیز کوي چې په دې قضیه کې د دوی بشپړتیا تضمین کولو لپاره د عکس شاټونو ګرځولو تمرین معرفي کړي.

لومړی، ځکه چې پتلی حجم میټاډاټا په یو غیر محفوظ شوي وسیله کې ژوند کوي، میټاډاټا به ثابت وي او احتمالي زیانونه به د ډیټا بلاکونو کې جلا شي.

د لاندې سنیپ شاټ گردش دوره د کیچ له لاسه ورکولو په صورت کې د سنیپ شاټونو دننه د معلوماتو بشپړتیا تضمینوي:

  1. د هر پتلی حجم لپاره د <نوم> نوم سره، د <نوم> نوم سره یو سنیپ شاټ جوړ کړئ.
  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 سرې سرعت ځانګړتیاوې په پام کې نیولو سره، او همدارنګه د دوی TBW سرچینې، تاسو به وکولی شئ د کیچ حالت بدلولو پرته ګړندي شیبه ونیسئ، یا ستاسو هارډویر به په بشپړه توګه د هغې ټولې سرچینې وخوري. څو ورځې. د منابعو د محدودیتونو له امله، سیسټم په اصل کې نشي کولی هر وخت د 100٪ لیکلو بار لاندې وي. زموږ د NVMe SSDs د 100٪ لیکلو بار لاندې به سرچینې په بشپړ ډول له مینځه ویسي 3-4 ورځې. د SATA SSDs به یوازې دوه ځله دوام وکړي. له همدې امله، موږ به فرض کړو چې ډیری بار لوستلو ته ځي، او موږ نسبتا لنډ مهاله خورا لوړ فعالیت لرو چې د لیکلو لپاره په اوسط ډول د ټیټ بار سره یوځای کیږي.
  4. هرڅومره ژر چې موږ صفر ونیسو (یا جوړ کړو) نو موږ د <name>.cached په <name>.committed نوم بدل کړو. زوړ <name>.committed حذف شوی دی.
  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٪ پخپله ښوونه کوي او د "ګوګل" پرمخ وړونکي پرمختګ تمرین کوي، نو له همدې امله هغه په ​​​​دې باور دی چې هغه ناوړه کوډ چې د هغه له لاسونو څخه راځي باید د هیڅ چا لخوا ونه کارول شي. بل

زه فکر کوم چې پدې برخه کې مسلکیان به وکولی شي په خپلواکه توګه ټول پورته بیان شوي منطقونه انځور کړي، که اړتیا وي، او شاید حتی په ښکلي ډول دا د سیسټم خدمت په توګه ډیزاین کړي، لکه څنګه چې لیکوال هڅه کړې.

دا ډول ساده سنیپ شاټ گردش سکیم به موږ ته اجازه راکړي چې نه یوازې یو سنیپ شاټ په دوامداره توګه په SATA SSD کې په بشپړ ډول همغږي کړو ، بلکه موږ ته به اجازه راکړي چې د thin_delta یوټیلیټ په کارولو سره معلومه کړو چې کوم بلاکونه د دې رامینځته کیدو وروسته بدل شوي ، او پدې توګه زیانونه ځایی کول. اصلي حجمونه، د بیا رغونې خورا ساده کول.

TRIM/DSCARD په libvirt/KVM کې

ځکه د ډیټا ذخیره به د KVM چلولو libvirt لپاره وکارول شي ، نو دا به ښه نظر وي چې زموږ VMs ته نه یوازې د خالي ځای نیولو لپاره درس ورکړئ ، بلکه هغه څه خالي کړئ چې نور ورته اړتیا نلري.

دا په مجازی ډیسکونو کې د 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 څخه دا ډول DISCARDs په سمه توګه د LVM لخوا پروسس شوي، او بلاکونه په سمه توګه په کیچ او پتلي حوض کې آزاد شوي. زموږ په قضیه کې ، دا په عمده ډول په ځنډ سره پیښیږي ، کله چې راتلونکی سنیپ شاټ حذف کړئ.

د 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 لیږلو / ترلاسه کولو په کارولو سره بل FS ته د کاپي کولو لپاره د ساده کمانډونو سیټ لري.

لومړی لانچ نسبتا اوږد کیدی شي، ځکه چې ... په پیل کې، ټول معلومات به کاپي شي. نور لانچونه به خورا ګړندي وي ، ځکه چې ... یوازې بدلونونه به کاپي شي.

بل سکریپټ چې موږ به یې په کرون کې واچوو:

یو څه نور باش کوډ#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/ subdirectories کې ښکاره شي.

راځئ چې د کوډ اجرا کولو حقونه ورکړو:

#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

راځئ چې 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 په کارولو سره بل بلاک وسیلې ته د پتلي_ډیلټا له لارې ترلاسه شوي دوه پتلي سنیپ شاټونو ترمینځ توپیر همغږي کولو لپاره د کمانډونو سیټ لري.

یو بل سکریپټ چې موږ به یې په کرون کې واچوو:

یو څه نور بش#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 LV منطقي حجمونه د نورو VGs لپاره د LVM PV فزیکي حجمونه کیدی شي. LVM کیدای شي تکراري وي، لکه د ځنځیرونو ګولۍ. دا LVM خورا انعطاف پذیري ورکوي.

PS

په راتلونکې مقاله کې، موږ به هڅه وکړو چې د کور ډیسټاپونو، کور انټرنیټ او P2P شبکې په کارولو سره په څو براعظمونو کې د بې ځایه کیدو سره د جیو توزیع شوي ذخیره / vm کلستر رامینځته کولو اساس په توګه د ورته ګرځنده ذخیره کولو سیسټمونو/KVM څخه کار واخلو.

سرچینه: www.habr.com

Add a comment