LVM ۽ Matryoshka ڇا ۾ عام آهن؟

توهان جو ڏينهن سٺو گذري.
مان ڪميونٽي سان حصيداري ڪرڻ چاهيان ٿو Md RAID + LVM استعمال ڪندي KVM لاءِ ڊيٽا اسٽوريج سسٽم ٺاهڻ جو منهنجو عملي تجربو.

پروگرام ۾ شامل ٿيندو:

  • NVMe SSD کان ايم ڊي RAID 1 جي تعمير.
  • SATA SSD ۽ باقاعده ڊرائيو مان md RAID 6 گڏ ڪرڻ.
  • SSD RAID 1/6 تي TRIM/DSCARD آپريشن جون خاصيتون.
  • هڪ بوٽبل ايم ڊي RAID 1/6 سري ٺاهڻ ڊسڪ جي هڪ عام سيٽ تي.
  • NVMe RAID 1 تي سسٽم کي انسٽال ڪرڻ جڏهن BIOS ۾ NVMe سپورٽ نه آهي.
  • LVM ڪيش ۽ LVM پتلي استعمال ڪندي.
  • BTRFS سنيپ شاٽ استعمال ڪندي ۽ بيڪ اپ لاءِ موڪليو / وصول ڪريو.
  • BTRFS طرز جي بيڪ اپ لاءِ LVM پتلي سنيپ شاٽ ۽ thin_delta استعمال ڪندي.

جيڪڏھن توھان دلچسپي رکو ٿا، مھرباني ڪري ٻلي ڏسو.

بيان

ليکڪ هن مضمون مان مواد/مثال/ ڪوڊ/ ٽوٽڪا/ ڊيٽا استعمال ڪرڻ يا نه ڪرڻ جي نتيجن جي ڪا به ذميواري نه کڻندو. ڪنهن به طريقي سان هن مواد کي پڙهڻ يا استعمال ڪندي، توهان انهن عملن جي سڀني نتيجن جي ذميواري قبول ڪندا آهيو. ممڪن نتيجا شامل آهن:

  • ڪڪڙ ڀريل NVMe SSDs.
  • مڪمل طور تي استعمال ٿيل رڪارڊنگ وسيلن ۽ ايس ايس ڊي ڊرائيو جي ناڪامي.
  • سڀني ڊرائيو تي سڀني ڊيٽا جي مڪمل نقصان، بشمول بيڪ اپ ڪاپيون.
  • ناقص ڪمپيوٽر هارڊويئر.
  • ضايع وقت، اعصاب ۽ پئسا.
  • ٻيا به نتيجا جيڪي مٿي ڏنل نه آهن.

آئرن

موجود هئا:

مدر بورڊ تقريباً 2013 کان Z87 چپ سيٽ سان، مڪمل Intel Core i7 / Haswell سان.

  • پروسيسر 4 ڪور، 8 موضوع
  • 32 GB 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 ڪنيڪٽر

SAS اڊاپٽر LSI SAS9211-8I IT / HBA موڊ تي چمڪيو. RAID-فعال فرمائيندڙ کي ارادي طور تي HBA فرم ویئر سان تبديل ڪيو ويو آهي:

  1. توهان هن اڊاپٽر کي ڪنهن به وقت اڇلائي سگهو ٿا ۽ ان کي ڪنهن ٻئي سان تبديل ڪري سگهو ٿا جيڪو توهان وٽ آيو آهي.
  2. TRIM/Discard عام طور تي ڊسڪ تي ڪم ڪيو، ڇاڪاڻ ته ... RAID firmware ۾ اهي حڪم بلڪل به سپورٽ نه آهن، ۽ HBA، عام طور تي، پرواه ناهي ته بس تي ڪهڙا حڪم منتقل ڪيا ويا آهن.

هارڊ ڊرائيو - HGST Travelstar 8K7 جا 1000 ٽڪرا 1 TB جي گنجائش سان 2.5 فارم فيڪٽر ۾، جيئن ليپ ٽاپ لاءِ. اهي ڊرائيو اڳ ۾ RAID 6 صف ۾ هئا. انهن کي به نئين نظام ۾ استعمال ڪيو ويندو. مقامي بيڪ اپ کي ذخيرو ڪرڻ لاء.

اضافي طور تي شامل ڪيو ويو:

6 ٽڪرا SATA SSD ماڊل Samsung 860 QVO 2TB. انهن SSDs کي وڏي مقدار جي ضرورت هئي، هڪ SLC ڪيش جي موجودگي، اعتبار، ۽ گهٽ قيمت گهربل هئي. رد ڪرڻ/صفر لاءِ سپورٽ گهربل هئي، جيڪا dmesg ۾ لائن ذريعي چيڪ ڪئي وئي آهي:

kernel: ata1.00: Enabling discard_zeroes_data

2 ٽڪرا NVMe SSD ماڊل Samsung SSD 970 EVO 500GB.

انهن SSDs لاءِ، بي ترتيب پڙهڻ/لکڻ جي رفتار ۽ وسيلن جي صلاحيت توهان جي ضرورتن لاءِ اهم آهن. انهن لاءِ ريڊيٽر. لازمي طور تي. بلڪل. ٻي صورت ۾، پهرين RAID هم وقت سازي جي دوران انهن کي خراب ٿيڻ تائين ڀڄايو.

StarTech PEX8M2E2 اڊاپٽر 2 x NVMe SSD لاءِ PCIe 3.0 8x سلاٽ ۾ نصب ٿيل. هي، ٻيهر، صرف هڪ HBA آهي، پر NVMe لاء. اهو سستا اڊاپٽرن کان مختلف آهي انهي ۾ ته ان کي PCIe بائيفرڪشن سپورٽ جي ضرورت نه آهي مادر بورڊ کان بلٽ ان PCIe سوئچ جي موجودگي جي ڪري. اهو PCIe سان گڏ سڀ کان قديم سسٽم ۾ به ڪم ڪندو، جيتوڻيڪ اهو هڪ x1 PCIe 1.0 سلاٽ آهي. قدرتي طور، مناسب رفتار تي. اتي ڪي RAIDs نه آھن. بورڊ تي ڪو به تعمير ٿيل BIOS ناهي. تنهن ڪري، توهان جو سسٽم جادوئي طور تي NVMe سان بوٽ ڪرڻ نه سکندو، هن ڊوائيس جي مهرباني NVMe RAID تمام گهٽ.

اهو جزو صرف سسٽم ۾ صرف هڪ مفت 8x PCIe 3.0 جي موجودگي جي ڪري هو، ۽، جيڪڏهن 2 مفت سلاٽ آهن، ان کي آساني سان ٻه قلمي PEX4M2E1 يا اينالاگ سان تبديل ڪري سگهجي ٿو، جيڪو 600 جي قيمت تي ڪٿي به خريد ڪري سگهجي ٿو. روبل

سڀني قسمن جي هارڊويئر يا بلٽ ان چپسيٽ/BIOS RAIDs جو رد عمدي طور ڪيو ويو، مڪمل طور تي مڪمل سسٽم کي تبديل ڪرڻ جي قابل ٿيڻ لاءِ، SSD/HDD جي پاڻ کان سواءِ، سڀني ڊيٽا کي محفوظ ڪندي. مثالي طور، ته جيئن توهان مڪمل طور تي نئين/مختلف هارڊويئر ڏانهن منتقل ٿيڻ دوران نصب ٿيل آپريٽنگ سسٽم کي به بچائي سگهو ٿا. بنيادي شيء اها آهي ته اتي SATA ۽ PCIe بندرگاهن آهن. اهو هڪ لائيو سي ڊي يا بوٽبل فليش ڊرائيو وانگر آهي، صرف تمام تيز ۽ ٿورو وڏو.

مزاحمٻي صورت ۾، توهان کي خبر آهي ته ڇا ٿئي ٿو - ڪڏهن ڪڏهن توهان کي فوري طور تي پوري صف کي توهان سان گڏ کڻڻ جي ضرورت آهي. پر مان ڊيٽا وڃائڻ نٿو چاهيان. هن کي ڪرڻ لاء، سڀني ذڪر ڪيل ميڊيا آساني سان سلائڊ تي واقع آهن معياري ڪيس جي 5.25 بيز ۾.

خير، ۽، يقينا، لينڪس ۾ ايس ايس ڊي ڪيشنگ جي مختلف طريقن سان تجربو ڪرڻ لاء.

هارڊويئر حملا بورنگ آهن. ان کي چالو ڪريو. اهو يا ته ڪم ڪري ٿو يا نه. ۽ mdadm سان هميشه اختيارن جا آهن.

سافٽويئر

اڳي، Debian 8 Jessie هارڊويئر تي نصب ڪيو ويو، جيڪو EOL جي ويجهو آهي. RAID 6 مٿي ڄاڻايل HDDs مان گڏ ڪيو ويو LVM سان گڏ. اهو ورچوئل مشينون kvm/libvirt ۾ هليو.

ڇاڪاڻ ته ليکڪ کي پورٽبل بوٽبل SATA/NVMe فليش ڊرائيو ٺاهڻ ۾ مناسب تجربو آهي، ۽ پڻ، معمولي اپٽ ٽيمپليٽ کي ٽوڙڻ نه ڏيڻ لاء، Ubuntu 18.04 کي ٽارگيٽ سسٽم طور چونڊيو ويو، جيڪو اڳ ۾ ئي ڪافي مستحڪم آهي، پر اڃا تائين 3 سال آهي. مستقبل ۾ حمايت.

ذڪر ڪيل سسٽم ۾ سڀني هارڊويئر ڊرائيور شامل آهن جن جي اسان کي دٻي کان ٻاهر ضرورت آهي. اسان کي ڪنهن به ٽئين پارٽي سافٽ ويئر يا ڊرائيور جي ضرورت ناهي.

انسٽاليشن جي تياري

سسٽم کي انسٽال ڪرڻ لاءِ اسان کي ضرورت آهي Ubuntu ڊيسڪ ٽاپ تصوير. سرور سسٽم ۾ ڪجهه قسم جو زوردار انسٽالر آهي، جيڪو تمام گهڻي آزادي ڏيکاري ٿو جيڪو UEFI سسٽم جي ورهاڱي کي ڪنهن هڪ ڊسڪ تي ڇڪڻ سان غير فعال نه ٿو ڪري سگهجي، تمام خوبصورتي کي خراب ڪري ٿو. مطابق، اهو صرف UEFI موڊ ۾ نصب ٿيل آهي. ڪو به اختيار پيش نٿو ڪري.

اسان ان سان خوش نه آهيون.

ڇو؟بدقسمتي سان، UEFI بوٽ بوٽ سافٽ ويئر RAID سان انتهائي ناقص مطابقت آهي، ڇاڪاڻ ته ... ڪو به اسان کي UEFI ESP ورهاڱي لاءِ تحفظات پيش نٿو ڪري. هتي ترڪيبون آن لائن آهن جيڪي هڪ USB پورٽ ۾ فلي ڊرائيو تي ESP ورهاڱي کي رکڻ جي صلاح ڏين ٿا، پر اهو ناڪامي جو هڪ نقطو آهي. ميٽا ڊيٽا ورزن 1 سان سافٽ ويئر mdadm RAID 0.9 استعمال ڪندي ترڪيبون آهن جيڪي UEFI BIOS کي هن ورهاڱي کي ڏسڻ کان نه ٿيون روڪين، پر اهو ان وقت تائين زندهه رهي ٿو جڏهن BIOS يا ٻيو هارڊويئر OS ESP ڏانهن ڪجهه لکي ٿو ۽ ان کي ٻين سان هم وقت سازي ڪرڻ وساري ٿو. آئينو.

ان کان علاوه، UEFI بوٽ NVRAM تي منحصر آهي، جيڪو ڊسڪ سان گڏ نئين سسٽم ڏانهن منتقل نه ٿيندو، ڇاڪاڻ ته ماء بورڊ جو حصو آهي.

تنهن ڪري، اسان هڪ نئين سائيڪل کي ٻيهر نه ڪنداسين. اسان وٽ اڳ ۾ ئي تيار ڪيل، وقت تي آزمايل دادا جي سائيڪل آهي، جيڪا هاڻي Legacy/BIOS بوٽ سڏجي ٿي، جيڪا UEFI-مطابقت رکندڙ سسٽم تي CSM جو فخريه نالو رکي ٿي. اسان صرف ان کي شيلف تان ڪڍنداسين، ان کي لوبريڪيٽ ڪنداسين، ٽائر پمپ ڪري ۽ نم ڪپڙي سان ان کي مسح ڪنداسين.

Ubuntu جو ڊيسڪ ٽاپ ورزن پڻ Legacy bootloader سان صحيح طريقي سان انسٽال نٿو ڪري سگھجي، پر هتي، جيئن اهي چون ٿا، گهٽ ۾ گهٽ اختيار موجود آهن.

۽ ائين، اسان هارڊويئر گڏ ڪريون ٿا ۽ سسٽم کي لوڊ ڪريون ٿا Ubuntu Live بوٽبل فلي ڊرائيو مان. اسان کي پيڪيجز کي ڊائون لوڊ ڪرڻ جي ضرورت پوندي، تنهنڪري اسان نيٽ ورڪ قائم ڪنداسين جيڪو توهان لاء ڪم ڪري ٿو. جيڪڏهن اهو ڪم نٿو ڪري، توهان اڳ ۾ ئي ضروري پيڪيجز کي فليش ڊرائيو تي لوڊ ڪري سگهو ٿا.

اسان ڊيسڪ ٽاپ ماحول ۾ وڃون ٿا، ٽرمينل ايموليٽر لانچ ڪريو، ۽ اسان وڃون ٿا:

#sudo bash

ڪيئن…؟مٿي ڏنل لڪير سوڊو بابت هوليوارز لاءِ ڪيننيڪل ٽرگر آهي. سي بيоوڌيڪ موقعا اچن ٿا ۽оوڌيڪ ذميواري. سوال اهو آهي ته ڇا توهان ان کي پاڻ تي وٺي سگهو ٿا. ڪيترن ئي ماڻهن جو خيال آهي ته سودو استعمال ڪندي هن طريقي سان گهٽ ۾ گهٽ محتاط ناهي. بهرحال:

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

ZFS ڇو نه...؟جڏهن اسان پنهنجي ڪمپيوٽر تي سافٽ ويئر انسٽال ڪريون ٿا، اسان بنيادي طور تي هن سافٽ ويئر جي ڊولپرز کي ڊرائيو ڪرڻ لاءِ پنهنجو هارڊويئر قرض ڏيون ٿا.
جڏهن اسان پنهنجي ڊيٽا جي حفاظت سان هن سافٽ ويئر تي ڀروسو ڪريون ٿا، اسان هن ڊيٽا کي بحال ڪرڻ جي قيمت جي برابر قرض کڻون ٿا، جيڪو اسان کي ڪنهن ڏينهن ادا ڪرڻو پوندو.

هن نقطي نظر کان، ZFS هڪ Ferrari آهي، ۽ mdadm + lvm وڌيڪ هڪ سائيڪل وانگر آهي.

موضوعي طور تي، ليکڪ کي پسند ڪري ٿو ته قرض تي هڪ سائيڪل قرض تي نامعلوم ماڻهن کي فيراري جي بدران. اتي، مسئلي جي قيمت اعلي نه آهي. حقن جي ضرورت ناهي. ٽريفڪ ضابطن کان وڌيڪ آسان. پارڪنگ مفت آهي. ڪراس ملڪ جي صلاحيت بهتر آهي. توهان هميشه پيرن کي سائيڪل سان ڳنڍي سگهو ٿا، ۽ توهان پنهنجي هٿن سان سائيڪل جي مرمت ڪري سگهو ٿا.

پوءِ ڇو BTRFS...؟آپريٽنگ سسٽم کي بوٽ ڪرڻ لاء، اسان کي هڪ فائيل سسٽم جي ضرورت آهي جيڪا باڪس کان ٻاهر Legacy/BIOS GRUB ۾ سپورٽ ڪئي وئي آهي، ۽ ساڳئي وقت لائيو سنيپ شاٽ کي سپورٽ ڪري ٿو. اسان ان کي استعمال ڪنداسين /boot ورهاڱي لاء. ان کان علاوه، ليکڪ هن FS کي استعمال ڪرڻ کي ترجيح ڏئي ٿو / (root)، اهو ياد رکڻ نه وساريو ته ڪنهن ٻئي سافٽ ويئر لاء توهان LVM تي الڳ پارٽيشن ٺاهي سگهو ٿا ۽ انهن کي ضروري ڊائريڪٽرن ۾ نصب ڪري سگهو ٿا.

اسان هن FS تي ورچوئل مشينن يا ڊيٽابيس جون تصويرون محفوظ نه ڪنداسين.
هي FS صرف ان کي بند ڪرڻ کان سواءِ سسٽم جا سنيپ شاٽ ٺاهڻ لاءِ استعمال ڪيو ويندو ۽ پوءِ انهن سنيپ شاٽس کي موڪليو / وصول ڪندي بيڪ اپ ڊسڪ ۾ منتقل ڪيو.

ان کان علاوه، ليکڪ عام طور تي گهٽ ۾ گهٽ سافٽ ويئر رکڻ کي ترجيح ڏئي ٿو سڌو سنئون هارڊويئر تي ۽ ٻين سڀني سافٽ ويئر کي ورچوئل مشينن ۾ هلائڻ جهڙوڪ شيون استعمال ڪندي GPUs ۽ PCI-USB هوسٽ ڪنٽرولرز کي KVM ذريعي IOMMU ڏانهن.

هارڊويئر تي صرف شيون ڇڏيل آهن ڊيٽا اسٽوريج، ورچوئلائيزيشن ۽ بيڪ اپ.

جيڪڏهن توهان 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.

ايسٽي هاء ڊي

هتي ڪا خاص ايجاد ڪرڻ جي ڪا ضرورت ناهي. اسان هر شي لاء هڪ سيڪشن ٺاهينداسين. اسان هڪ ورهاڱي ٺاهينداسين ڇو ته 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 ٽيرا بائيٽ اندر واقع آهن. بنيادي شيء اها آهي ته انهن ڊسڪ تي بوٽ ورهاڱي ۽ bios_grub ورهاڱي جي شروعات ۾ هجڻ گهرجي. اهو توهان کي GPT Legacy/BIOS ڊرائيو مان بوٽ ڪرڻ جي اجازت ڏئي ٿو.

پر اهو اسان جو معاملو ناهي.

هتي اسان ٻه حصا ٺاهينداسين. پهريون هوندو 1 GB سائيز ۾ ۽ استعمال ٿيندو RAID 1 /boot لاءِ.

ٻيو هڪ RAID 6 لاءِ استعمال ڪيو ويندو ۽ ڊرائيو جي آخر ۾ هڪ ننڍڙي غير مختص ٿيل علائقي کان سواءِ باقي سموري خالي جاءِ وٺي ويندي.

هي اڻڄاتل علائقو ڇا آهي؟نيٽ ورڪ تي ذريعن موجب، اسان جي SATA SSDs وٽ بورڊ تي آهي هڪ متحرڪ طور تي توسيع لائق SLC ڪيش سائيز ۾ 6 کان 78 گيگا بائيٽ تائين. ڊرائيو جي ڊيٽا شيٽ ۾ "گيگا بائيٽ" ۽ "گيبي بائيٽس" جي وچ ۾ فرق جي ڪري اسان کي 6 گيگا بائيٽس “مفت ۾” ملي ٿي. باقي 72 گيگا بائيٽ غير استعمال ٿيل اسپيس مان مختص ڪيا ويا آهن.

هتي اهو ياد رکڻ گهرجي ته اسان وٽ هڪ SLC ڪيش آهي، ۽ خلا 4 بٽ MLC موڊ ۾ قبضو ڪيو ويو آهي. جنهن جو اسان لاءِ مؤثر مطلب اهو آهي ته هر 4 گيگا بائيٽ جي خالي جاءِ لاءِ اسان کي صرف 1 گيگا بائيٽ SLC ڪيش ملندي.

72 گيگا بائيٽ کي 4 سان ضرب ڪريو ۽ 288 گيگا بائيٽ حاصل ڪريو. اها خالي جاءِ آهي جنهن کي اسين نشان نه لڳائينداسين ته جيئن ڊرائيوز کي SLC ڪيش جو مڪمل استعمال ڪرڻ جي اجازت ڏني وڃي.

اهڙيء طرح، اسان مجموعي طور تي ڇهه ڊرائيو مان 312 گيگا بائيٽ SLC ڪيش حاصل ڪنداسين. سڀني ڊرائيو مان، 2 استعمال ڪيو ويندو RAID ۾ بيڪارگي لاءِ.

ڪيش جي اها مقدار اسان کي اجازت ڏئي ٿي ته حقيقي زندگي ۾ تمام گهٽ گهٽ ۾ گهٽ هڪ اهڙي صورتحال کي منهن ڏيڻو پوي ٿو جتي لکڻ ڪيش ڏانهن نه وڃي. اهو تمام سٺو معاوضو ڏئي ٿو QLC ميموري جي افسوسناڪ خرابي - انتهائي گهٽ لکڻ جي رفتار جڏهن ڊيٽا ڪيش کي پاس ڪندي لکيو وڃي ٿو. جيڪڏهن توهان جا لوڊ انهي سان مطابقت نٿا رکن، ته پوءِ مان صلاح ڏيان ٿو ته توهان سخت سوچيو ته توهان جو ايس ايس ڊي ڪيتري عرصي تائين اهڙي لوڊ هيٺ رهندي، ڊيٽا شيٽ مان 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

Arrays ٺاهڻ

پهريون، اسان کي مشين جو نالو تبديل ڪرڻ جي ضرورت آهي. اهو ضروري آهي ڇاڪاڻ ته هوسٽ جو نالو صف جي نالي جو حصو آهي ڪٿي 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 arrays لاءِ، RAID 1 DISCARD باڪس مان سپورٽ ڪئي وئي آهي.

SSD RAID 6 DISCARD arrays لاءِ، توھان کي ان کي فعال ڪرڻ گھرجي ڪرنل ماڊل پيٽرولن ۾.

اهو صرف ان صورت ۾ ٿيڻ گهرجي جڏهن هن سسٽم ۾ ليول 4/5/6 صفن ۾ استعمال ٿيل سڀئي SSDs discard_zeroes_data لاءِ ڪم ڪندڙ سپورٽ آهن. ڪڏهن ڪڏهن توهان کي عجيب ڊرائيو ملن ٿا جيڪي ڪنيل کي ٻڌائين ٿا ته هي فنڪشن سپورٽ آهي، پر حقيقت ۾ اهو موجود ناهي، يا فنڪشن هميشه ڪم نٿو ڪري. هن وقت، سپورٽ تقريبن هر جڳهه تي موجود آهي، جڏهن ته، پراڻن ڊرائيو ۽ فرم ویئر سان غلطيون آهن. ھن سبب لاءِ، RAID 6 لاءِ ڊفالٽ طور DISCARD سپورٽ بند ٿيل آھي.

ڌيان ڏيڻ، هيٺ ڏنل حڪم 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

ايڏو وڏو ڇو...؟chunk-size کي وڌائڻ سان بلاڪن ۾ بي ترتيب پڙهڻ جي رفتار تي chunk-size تائين هڪ مثبت اثر پوي ٿو. اهو ٿي سگهي ٿو ڇاڪاڻ ته مناسب سائيز يا ننڍو جو هڪ آپريشن مڪمل طور تي هڪ ڊوائيس تي مڪمل ٿي سگهي ٿو. تنهن ڪري، IOPS سڀني ڊوائيسز کان خلاصو آهي. انگن اکرن موجب، IO جو 99٪ 512K کان وڌيڪ نه آهي.

RAID وٽ 6 IOPS في لکڻ ھميشہ هڪ ڊرائيو جي IOPS کان گهٽ يا برابر. جڏهن، بي ترتيب پڙهڻ جي طور تي، IOPS هڪ ڊرائيو جي ڀيٽ ۾ ڪيترائي ڀيرا وڌيڪ ٿي سگهي ٿو، ۽ هتي بلاڪ سائيز اهم اهميت وارو آهي.
ليکڪ اهو نقطو نظر نٿو اچي ته هڪ پيٽرولر کي بهتر ڪرڻ جي ڪوشش ۾ جيڪو خراب آهي RAID 6 پاران ڊزائين ۾ ۽ ان جي بدران بهتر ڪري ٿو ته ڇا RAID 6 سٺو آهي.
اسان RAID 6 جي خراب بي ترتيب لکڻ جي لاءِ معاوضو ڏينداسين NVMe ڪيش ۽ پتلي روزي ڏيڻ واري چالن سان.

اسان اڃا تائين RAID 6 لاءِ DISCARD کي فعال نه ڪيو آهي. تنهنڪري اسان هن وقت لاءِ هن صف کي ”شروع“ نه ڪنداسين. اسان هن کي بعد ۾ ڪنداسين، او ايس کي نصب ڪرڻ کان پوء.

ايسٽي هاء ڊي

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

NVMe RAID تي LVM

رفتار لاءِ، اسان روٽ فائل سسٽم کي NVMe RAID 1 تي رکڻ چاهيون ٿا جيڪو آهي /dev/md0.
بهرحال، اسان کي اڃا به ٻين ضرورتن لاءِ هن تيز صف جي ضرورت پوندي، جهڙوڪ ادل، ميٽاڊيٽا ۽ LVM-ڪيش ۽ LVM-ٿلي ميٽاداٽا، تنهنڪري اسان هن صف تي LVM VG ٺاهينداسين.

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

اچو ته روٽ فائل سسٽم لاء هڪ ورهاڱي ٺاهي.

#lvcreate -L 128G --name root root

اچو ته ريم جي سائيز جي مطابق تبديل ڪرڻ لاء هڪ پارٽيشن ٺاهي.

#lvcreate -L 32G --name swap root

OS تنصيب

مجموعي طور تي، اسان وٽ سسٽم کي نصب ڪرڻ لاء سڀ ڪجهه ضروري آهي.

Ubuntu Live ماحول مان سسٽم انسٽاليشن وزرڊ شروع ڪريو. عام تنصيب. صرف تنصيب لاء ڊسڪ چونڊڻ جي اسٽيج تي، توهان کي هيٺين وضاحت ڪرڻ جي ضرورت آهي:

  • /dev/md1، - mount point /boot، FS - BTRFS
  • /dev/root/root (اڪا /dev/mapper/root-root)، - Mount point / (root)، FS - BTRFS
  • /dev/root/swap (اڪا /dev/mapper/root-swap)، - ادل بدلي ورهاڱي طور استعمال ڪريو
  • /dev/sda تي بوٽ لوڊر انسٽال ڪريو

جڏهن توهان BTRFS کي روٽ فائل سسٽم طور چونڊيو ٿا، انسٽالر پاڻمرادو ٻه BTRFS حجم ٺاهيندو "@" لاءِ / (root)، ۽ "@home" /home لاءِ.

اچو ته انسٽاليشن شروع ڪريون...

انسٽاليشن هڪ ماڊل ڊائلاگ باڪس سان ختم ٿي ويندي جيڪا بوٽ لوڊر کي نصب ڪرڻ ۾ غلطي جي نشاندهي ڪندي. بدقسمتي سان، توهان معياري وسيلا استعمال ڪندي هن ڊائلاگ مان نڪرڻ ۽ انسٽاليشن جاري رکڻ جي قابل نه هوندا. اسان سسٽم مان لاگ آئوٽ ڪيو ۽ ٻيهر لاگ ان ٿيو، صاف Ubuntu Live ڊيسڪ ٽاپ ۾ ختم. ٽرمينل کوليو، ۽ ٻيهر:

#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). ڊفالٽ ويل سان، ڊرائيو پنجن سيڪنڊن کان پوءِ بند ٿي وينديون. پوءِ او ايس ڊسڪ ڪيش کي ريٽ ڪرڻ چاهي ٿو، ڊسڪ وري گھمندو، ۽ سڀ ڪجھ وري شروع ٿيندو. ڊسڪ ۾ اسپنڊل گھمڻ جو محدود وڌ ۾ وڌ تعداد آھي. اهڙو سادو ڊفالٽ چڪر آساني سان توهان جي ڊسڪ کي ڪجهه سالن ۾ ماري سگهي ٿو. سڀئي ڊسڪ هن کان متاثر نه آهن، پر اسان جون "ليپ ٽاپ" آهن، مناسب ڊفالٽ سيٽنگن سان، جيڪي 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 config کي ٻيهر ٺاھيو:

#/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 ڪيش استعمال ڪندي ڪيش ڪيل ڪيش کي پاس ڪندي ( _corig). انهي صورت ۾، ڪيش ٿيل ڊوائيس پاڻ اڃا تائين ڪيش ذريعي اسڪين ڪيو ويندو (صرف ).
  • ڊوائيسز جن ۾ LVM ڪيش ميٽاداٽا (cmeta)
  • VG ۾ سڀ ڊوائيس نالي تصويرن سان. هتي اسان وٽ ورچوئل مشين جون ڊسڪ تصويرون هونديون، ۽ اسان نه ٿا چاهيون ته ميزبان تي LVM مهمان او ايس سان لاڳاپيل حجم کي چالو ڪري.
  • VG ۾ سڀئي ڊوائيس نالي جي بيڪ اپ سان. هتي اسان وٽ ورچوئل مشين جي تصويرن جون بيڪ اپ ڪاپيون هونديون.
  • سڀئي ڊوائيس جن جو نالو "gpv" سان ختم ٿئي ٿو (مهمان جو جسماني حجم)

اسان LVM VG تي خالي جاءِ خالي ڪرڻ وقت DISCARD سپورٽ کي فعال ڪيو آهي. خيال رکجو. اهو 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 ۾ ريبوٽ ڪرڻ جو وقت آهي. بوٽ لائق Live CD/USB کي هٽائڻ نه وساريو.

#exit
#reboot

بوٽ ڊيوائس طور SATA SSDs مان ڪو به چونڊيو.

SATA SSD تي LVM

هن نقطي تي، اسان اڳ ۾ ئي نئين او ايس ۾ بوٽ ڪيو آهي، نيٽ ورڪ کي ترتيب ڏنو، مناسب، ٽرمينل ايموليٽر کوليو، ۽ ڊوڙيو:

#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 arrays مان ڪنهن به ناڪامي (ڊيٽا نقصان پڙهڻ) آهي، آپريٽنگ سسٽم عام طور تي بوٽ ڪندو ۽ اسان کي مسئلو حل ڪرڻ جو موقعو ڏيندو.

ائين ڪرڻ لاءِ، تجريدي جي پهرئين سطح تي اسين هر قسم جي جسماني ”ميڊيا“ کي الڳ VG ۾ الڳ ڪنداسين.

سائنسي طور تي ڳالهائڻ، مختلف RAID صفن جو تعلق مختلف "معتبر ڊومينز" سان آهي. توهان کي انهن لاءِ ناڪامي جو هڪ اضافي عام نقطو نه بڻائڻ گهرجي انهن کي هڪ VG ۾ ڇڪڻ سان.

"هارڊويئر" جي سطح تي LVM جي موجودگي اسان کي مختلف طريقن سان گڏ ڪندي مختلف RAID صفن جا ٽڪرا ٽڪرا ڪرڻ جي اجازت ڏيندو. مثال طور - هلائڻ ساڳئي وقت bcache + LVM پتلي، bcache + BTRFS، LVM ڪيش + LVM پتلي، ڪيش سان گڏ ھڪڙو پيچيده ZFS ٺاھ جوڙ، يا ٻيو ڪو بھترين مرکب ڪوشش ڪريو ۽ انھن سڀني جي مقابلي ڪرڻ لاءِ.

"هارڊويئر" سطح تي، اسان سٺي پراڻي "ٿلهي" LVM حجمن کان سواء ٻيو ڪجهه استعمال نه ڪنداسين. هن قاعدي جي استثنا ٿي سگهي ٿي بيڪ اپ ورهاڱي.

مان سمجهان ٿو ته هن وقت تائين، ڪيترن ئي پڙهندڙن کي اڳ ۾ ئي نيسٽنگ گڏي بابت ڪجهه شڪ ڪرڻ شروع ڪيو هو.

SATA HDD تي LVM

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

نئين وي جي ٻيهر..؟اسان واقعي چاهيون ٿا ته جيڪڏهن ڊسڪ سري جيڪا اسان ڊيٽا جي بيڪ اپ لاءِ استعمال ڪنداسين ناڪام ٿي وڃي، اسان جو آپريٽنگ سسٽم معمول مطابق ڪم ڪندو رهندو، جڏهن ته غير بيڪ اپ ڊيٽا تائين رسائي کي معمول مطابق برقرار رکندو. تنهن ڪري، 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 ڪيش ورهاڱي کي ٻه ڀيرا وڌيڪ SLC ڪيش NVMe ڊرائيو جي سائيز کان وڌيڪ. استعمال ٿيل NVMe ڊرائيوز لاءِ، ليکڪ ان کي 32-64 گيگا بائيٽ ڪيش ڪرڻ مناسب سمجهي ٿو.

ڏنل ورهاڱي جي سائيز کي ترتيب ڏيڻ جي ضرورت آهي 64 گيگا بائيٽ ڪيش، ڪيش ميٽاداٽا، ۽ ميٽا ڊيٽا بيڪ اپ.

اضافي طور تي، مان نوٽ ڪريان ٿو ته گندي سسٽم جي بند ٿيڻ کان پوء، LVM سڄي ڪيش کي گندي طور نشان لڳايو ۽ ٻيهر هم وقت سازي ڪندو. ان کان علاوه، اهو هر وقت بار بار ڪيو ويندو lvchange هن ڊوائيس تي استعمال ڪيو ويندو جيستائين سسٽم ٻيهر ريبوٽ نه ڪيو وڃي. تنهن ڪري، مان سفارش ڪريان ٿو ته فوري طور تي مناسب اسڪرپٽ استعمال ڪندي ڪيش کي ٻيهر ٺاهيو.

اچو ته SATA RAID 6 تي LV ٺاھيون ان کي ڪيشڊ ڊيوائس طور استعمال ڪرڻ لاءِ.

#lvcreate -L 3298543271936B --name cache data

صرف ٽي ٽيرا بائيٽ ڇو..؟انهي ڪري، جيڪڏهن ضروري هجي ته، توهان استعمال ڪري سگهو ٿا SATA SSD RAID 6 ڪجهه ٻين ضرورتن لاءِ. ڪيش ٿيل خلا جي سائيز کي متحرڪ طور تي وڌائي سگھجي ٿو، پرواز تي، سسٽم کي روڪڻ کان سواء. هن کي ڪرڻ لاءِ، توهان کي ڪيش کي عارضي طور تي روڪڻ ۽ ٻيهر فعال ڪرڻ جي ضرورت آهي، پر LVM-ڪيش اوور جو خاص فائدو، مثال طور، 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 پتلي بلاڪ جي سائيز سان ٺهڪي اچي ٿي. ان کان علاوه، ننڍو سائيز، بهتر ترتيب ترتيب بي ترتيب رڪارڊنگ ۾ انجام ڏئي ٿو.

LVM پتلي لاءِ اجازت ڏنل گهٽ ۾ گهٽ بلاڪ سائيز 64k آهي.

احتياط سان لکو..!ها. هن قسم جي ڪيش کي ڊفر ڪري ٿو هم وقت سازي کي ڪيشڊ ڊيوائس ڏانهن. هن جو مطلب آهي ته جيڪڏهن ڪيش گم ٿي ويو آهي، ته توهان ڪيش ٿيل ڊوائيس تي ڊيٽا وڃائي سگهو ٿا. بعد ۾، ليکڪ توهان کي ٻڌائيندو ته 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 کي واپس cachedata.

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 گيگا بائيٽ ايس ايس ڊي وسيلن جي.

پڙهڻ ۽ لکڻ مخلوط؟ها. پڙهڻ ۽ لکڻ جا امتحان الڳ الڳ هلائڻ لاءِ سمجهه ۾ اچي ٿو. ان کان علاوه، اهو سمجھ ۾ اچي ٿو ته يقيني بڻائين ته سڀئي ڪيچ هم وقت سازي ڪيا ويا آهن ته جيئن اڳ ۾ لکيل لکڻ پڙهڻ تي اثر انداز نه ٿئي.

پهرين لانچ دوران ۽ ان کان پوءِ جا نتيجا تمام گهڻو مختلف ٿيندا جيئن ڪيش ۽ پتلي حجم ڀريو ويندو، ۽ ان تي به منحصر هوندو ته ڇا سسٽم آخري لانچ دوران ڀريل ڪيچ کي هم وقت سازي ڪرڻ ۾ ڪامياب ٿي ويو.

ٻين شين جي وچ ۾، مان سفارش ڪريان ٿو ته رفتار کي ماپ ڪري اڳ ۾ ئي مڪمل پتلي حجم تي جنهن مان هڪ سنيپ شاٽ ورتو ويو هو. ليکڪ کي اهو مشاهدو ڪرڻ جو موقعو مليو ته ڪيئن بي ترتيب لکڻيون پهرين سنيپ شاٽ ٺاهڻ کان پوءِ فوري طور تي تيز ٿين ٿيون، خاص طور تي جڏهن ڪيش مڪمل طور تي مڪمل نه ٿيو آهي. اهو ٿئي ٿو ڪاپي-آن-لکڻ لکڻ جي سيمينٽڪس، ڪيش جي ترتيب ۽ پتلي حجم بلاڪ جي ڪري، ۽ حقيقت اها آهي ته RAID 6 ڏانهن هڪ بي ترتيب لکڻ RAID 6 کان بي ترتيب پڙهڻ ۾ بدلجي ٿو ۽ بعد ۾ ڪيش ڏانهن لکڻ. اسان جي ترتيب ۾، RAID 6 کان بي ترتيب پڙهڻ 6 ڀيرا (صف ۾ SATA SSDs جو تعداد) لکڻ کان تيز آهي. ڇاڪاڻ ته CoW لاءِ بلاڪ هڪ ٿلهي تلاءَ مان ترتيب وار مختص ڪيا ويا آهن، پوءِ رڪارڊنگ، اڪثر حصي لاءِ، پڻ ترتيب وار ٿي ويندي آهي.

اهي ٻئي خاصيتون توهان جي فائدي لاء استعمال ڪري سگهجن ٿيون.

ڪيش "مربوط" سنيپ شاٽ

ڪيش جي نقصان/نقصان جي صورت ۾ ڊيٽا جي نقصان جي خطري کي گھٽائڻ لاءِ، ليکڪ ھن معاملي ۾ پنھنجي سالميت جي ضمانت ڏيڻ لاءِ سنيپ شاٽ گھمائڻ جي مشق کي متعارف ڪرائڻ جي تجويز پيش ڪري ٿو.

پهريون، ڇاڪاڻ ته پتلي حجم ميٽاداٽا هڪ غير محفوظ ٿيل ڊيوائس تي رهي ٿو، ميٽاداٽا هڪجهڙائي هوندي ۽ ممڪن نقصان ڊيٽا بلاڪ جي اندر الڳ ٿي ويندا.

ھيٺ ڏنل سنيپ شاٽ گھمڻ واري چڪر ڪيش جي نقصان جي صورت ۾ سنيپ شاٽ اندر ڊيٽا جي سالميت جي ضمانت ڏئي ٿي:

  1. نالي سان هر پتلي حجم لاءِ <name>، نالي سان هڪ سنيپ شاٽ ٺاهيو <name>.cached
  2. اچو ته لڏپلاڻ جي حد کي مناسب اعلي قيمت تي مقرر ڪريون: #lvchange --quiet --cachesettings "migration_threshold=16384" cache/cachedata
  3. لوپ ۾ اسان ڪيش ۾ گندي بلاڪ جو تعداد چيڪ ڪريون ٿا: #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' جيستائين اسان صفر حاصل ڪريون. جيڪڏهن صفر تمام گهڻي عرصي تائين غائب آهي، اهو عارضي طور تي ڪيش کي لکڻ جي ذريعي موڊ ۾ تبديل ڪري سگهجي ٿو. تنهن هوندي، اسان جي SATA ۽ NVMe SSD arrays جي رفتار جي خاصيتن کي، ۽ گڏوگڏ انهن جي TBW وسيلن جي حساب سان، توهان يا ته ڪيش موڊ کي تبديل ڪرڻ کان سواء جلدي لمحن کي پڪڙڻ جي قابل ٿي ويندا، يا توهان جو هارڊويئر مڪمل طور تي ان جي سموري وسيلن کي کائي ويندي. ڪجهه ڏينهن. وسيلن جي حدن جي ڪري، سسٽم آهي، اصول ۾، هر وقت 100٪ لکڻ جي لوڊ کان هيٺ ٿيڻ جي قابل ناهي. اسان جي NVMe SSDs هيٺ 100٪ لکڻ جي لوڊ مڪمل طور تي وسيلن کي ختم ڪري ڇڏيندو 3-4 ڏينهن. SATA SSDs صرف ٻه ڀيرا ڊگهو ٿيندو. تنهن ڪري، اسان اهو فرض ڪنداسين ته گهڻو ڪري لوڊ پڙهڻ تي وڃي ٿو، ۽ اسان وٽ نسبتا مختصر مدت جي انتهائي تيز سرگرميون آهن جيڪي لکڻ لاء اوسط تي گهٽ لوڊ سان گڏ آهن.
  4. جيئن ئي اسان هڪ صفر کي پڪڙيو (يا بنايو)، اسان جو نالو تبديل ڪريون ٿا <name>.cached to <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/DISCARD libvirt/KVM ۾

ڇاڪاڻ ته ڊيٽا اسٽوريج KVM هلندڙ libvirt لاءِ استعمال ڪئي ويندي، پوءِ اهو هڪ سٺو خيال هوندو ته اسان جي VMن کي نه رڳو خالي جاءِ کڻڻ سيکاريو، پر ان کي به خالي ڪرڻ لاءِ جنهن جي هاڻي ضرورت ناهي.

اهو ڪيو ويندو آهي TRIM/DISCARD سپورٽ کي تخليق ڪندي ورچوئل ڊسڪ تي. هن کي ڪرڻ لاء، توهان کي ڪنٽرولر جي قسم کي تبديل ڪرڻ جي ضرورت آهي virtio-scsi ۽ تبديل ڪريو xml.

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

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

مهمان او ايسز مان اهڙيون ڊسڪيون صحيح طريقي سان 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

ڇا ٿو ڪري...؟پتلي سنيپ شاٽ کي ترتيب ڏيڻ ۽ 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

ان جو ڪھڙو واسطو nesting گڏي سان؟

گهڻو ڪري، ڏنو ويو آهي ته LVM LV منطقي حجم ٻين VGs لاء LVM PV جسماني حجم ٿي سگهي ٿو. LVM recursive ٿي سگهي ٿو، nesting گڏي وانگر. هي LVM انتهائي لچڪدار ڏئي ٿو.

پي ايس

ايندڙ آرٽيڪل ۾، اسان ڪوشش ڪنداسين ته ڪيترن ئي ساڳين موبائل اسٽوريج سسٽم/KVM کي استعمال ڪرڻ جي بنياد طور هڪ جيو ورهايل اسٽوريج/vm ڪلستر ٺاهڻ جي بنياد تي ڪيترن ئي براعظمن تي گهر جي ڊيسڪ ٽاپ، هوم انٽرنيٽ ۽ P2P نيٽ ورڪ استعمال ڪندي.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو