Laba diena.
VÄlos dalÄ«ties ar sabiedrÄ«bu ar savu praktisko pieredzi, veidojot datu glabÄÅ”anas sistÄmu KVM, izmantojot md RAID + LVM.
Programma ietvers:
- Md RAID 1 izveide no NVMe SSD.
- Md RAID 6 salikÅ”ana no SATA SSD un parastajiem diskdziÅiem.
- TRIM/DISCARD darbības iezīmes SSD RAID 1/6.
- SÄknÄjama md RAID 1/6 masÄ«va izveide kopÄjÄ disku komplektÄ.
- SistÄmas instalÄÅ”ana uz NVMe RAID 1, ja BIOS nav NVMe atbalsta.
- Izmantojot LVM keÅ”atmiÅu un LVM thin.
- BTRFS momentuzÅÄmumu izmantoÅ”ana un nosÅ«tÄ«Å”ana/saÅemÅ”ana dublÄÅ”anai.
- LVM plÄnu momentuzÅÄmumu un thin_delta izmantoÅ”ana BTRFS stila dublÄÅ”anai.
Ja jÅ«s interesÄ, lÅ«dzu, skatiet kaÄ·i.
PaziÅojums
Autors neuzÅemas nekÄdu atbildÄ«bu par sekÄm, kas izriet no Ŕī raksta materiÄlu/piemÄru/koda/padomu/datu izmantoÅ”anas vai neizmantoÅ”anas. Izlasot vai jebkÄdÄ veidÄ izmantojot Å”o materiÄlu, jÅ«s uzÅematies atbildÄ«bu par visÄm Å”o darbÄ«bu sekÄm. IespÄjamÄs sekas ir Å”Ädas:
- KraukŔķīgi cepti NVMe SSD.
- PilnÄ«bÄ iztÄrÄts ierakstÄ«Å”anas resurss un SSD disku kļūme.
- Pilnīga visu datu zudums visos diskos, ieskaitot rezerves kopijas.
- BojÄta datora aparatÅ«ra.
- IztÄrÄts laiks, nervi un nauda.
- Visas citas sekas, kas nav uzskaitītas iepriekŔ.
dzelzs
Pieejami bija:
ApmÄram 2013. gada mÄtesplate ar Z87 mikroshÄmojumu, komplektÄ ar Intel Core i7 / Haswell.
- Procesors 4 kodoli, 8 pavedieni
- 32 GB DDR3 RAM
- 1 x 16 vai 2 x 8 PCIe 3.0
- 1 x 4 + 1 x 1 PCIe 2.0
- 6 x 6 GBps SATA 3 savienotÄji
SAS adapteris LSI SAS9211-8I pÄrslÄdzÄs uz IT / HBA režīmu. Ar RAID iespÄjota programmaparatÅ«ra ir apzinÄti aizstÄta ar HBA programmaparatÅ«ru, lai:
- JÅ«s jebkurÄ laikÄ varat izmest Å”o adapteri un aizstÄt to ar jebkuru citu, ar kuru esat saskÄries.
- TRIM/Discard uz diskiem strÄdÄja normÄli, jo... RAID programmaparatÅ«rÄ Å”Ä«s komandas vispÄr netiek atbalstÄ«tas, un HBA kopumÄ ir vienalga, kÄdas komandas tiek pÄrsÅ«tÄ«tas pa kopni.
Cietie diski - 8 gabali HGST Travelstar 7K1000 ar ietilpÄ«bu 1 TB ar 2.5 formas koeficientu, tÄpat kÄ klÄpjdatoriem. Å ie diskdziÅi iepriekÅ” bija RAID 6 masÄ«vÄ. Tie bÅ«s noderÄ«gi arÄ« jaunajÄ sistÄmÄ. VietÄjo dublÄjumkopiju glabÄÅ”anai.
Papildus pievienots:
6 gab SATA SSD modelis Samsung 860 QVO 2TB. Å iem SSD bija nepiecieÅ”ams liels apjoms, SLC keÅ”atmiÅa, uzticamÄ«ba un zema cena. Bija nepiecieÅ”ams atmest/nulles atbalsts, ko pÄrbauda dmesg rinda:
kernel: ata1.00: Enabling discard_zeroes_data
2 gabali NVMe SSD modeļa Samsung SSD 970 EVO 500GB.
Å iem SSD ir svarÄ«gs nejauÅ”s lasÄ«Å”anas/rakstÄ«Å”anas Ätrums un resursu ietilpÄ«ba jÅ«su vajadzÄ«bÄm. Radiators viÅiem. ObligÄti. PilnÄ«gi noteikti. PretÄjÄ gadÄ«jumÄ pirmÄs RAID sinhronizÄcijas laikÄ apcepiet tos, lÄ«dz tie kļūst kraukŔķīgi.
StarTech PEX8M2E2 adapteris 2 x NVMe SSD, kas instalÄts PCIe 3.0 8x slotÄ. Tas atkal ir tikai HBA, bet paredzÄts NVMe. Tas atŔķiras no lÄtiem adapteriem ar to, ka tam nav nepiecieÅ”ams PCIe bifurkÄcijas atbalsts no mÄtesplates, jo tajÄ ir iebÅ«vÄts PCIe slÄdzis. Tas darbosies pat senÄkajÄ sistÄmÄ ar PCIe, pat ja tas ir x1 PCIe 1.0 slots. Protams, atbilstoÅ”Ä ÄtrumÄ. Tur nav RAID. Uz kuÄ£a nav iebÅ«vÄta BIOS. TÄtad, pateicoties Å”ai ierÄ«cei, jÅ«su sistÄma maÄ£iski neiemÄcÄ«sies sÄknÄties ar NVMe, vÄl jo mazÄk ā NVMe RAID.
Å is komponents radÄs tikai tÄpÄc, ka sistÄmÄ bija tikai viens bezmaksas 8x PCIe 3.0, un, ja ir 2 brÄ«vi sloti, to var viegli nomainÄ«t ar diviem pensiem PEX4M2E1 vai analogiem, kurus var iegÄdÄties jebkurÄ vietÄ par cenu 600. rubļi.
Visa veida aparatÅ«ras vai iebÅ«vÄto mikroshÄmojumu/BIOS RAID noraidÄ«Å”ana tika veikta apzinÄti, lai varÄtu pilnÄ«bÄ nomainÄ«t visu sistÄmu, izÅemot paÅ”u SSD/HDD, saglabÄjot visus datus. IdeÄli, lai, pÄrejot uz pilnÄ«gi jaunu/citu aparatÅ«ru, varÄtu saglabÄt pat instalÄto operÄtÄjsistÄmu. Galvenais, ka ir SATA un PCIe porti. Tas ir kÄ dzÄ«vs CD vai sÄknÄjams zibatmiÅas disks, tikai ļoti Ätrs un nedaudz apjomÄ«gs.
Š®Š¼Š¾ŃPretÄjÄ gadÄ«jumÄ jÅ«s zinÄt, kas notiek - dažreiz jums steidzami jÄpaÅem lÄ«dzi viss masÄ«vs, lai to aizvestu. Bet es nevÄlos zaudÄt datus. Lai to izdarÄ«tu, visi minÄtie datu nesÄji ir Ärti izvietoti uz priekÅ”metstikliÅiem standarta korpusa 5.25 nodalÄ«jumos.
Nu, un, protams, eksperimentÄÅ”anai ar dažÄdÄm SSD keÅ”atmiÅas metodÄm Linux.
AparatÅ«ras reidi ir garlaicÄ«gi. IeslÄdziet to. Tas vai nu strÄdÄ, vai ne. Un ar mdadm vienmÄr ir iespÄjas.
Programmatūra
IepriekÅ” Debian 8 Jessie tika instalÄta aparatÅ«rÄ, kas ir tuvu EOL. RAID 6 tika samontÄts no iepriekÅ” minÄtajiem HDD, kas savienoti pÄrÄ« ar LVM. Tas palaida virtuÄlÄs maŔīnas kvm/libvirt.
Jo Autoram ir piemÄrota pieredze portatÄ«vo bootable SATA/NVMe zibatmiÅu veidoÅ”anÄ, kÄ arÄ«, lai nesalauztu ierasto trÄpÄ«go veidni, par mÄrÄ·a sistÄmu tika izvÄlÄta Ubuntu 18.04, kas jau ir pietiekami nostabilizÄjusies, bet tai joprojÄm ir 3 gadi. atbalstu nÄkotnÄ.
MinÄtajÄ sistÄmÄ ir visi nepiecieÅ”amie aparatÅ«ras draiveri. Mums nav nepiecieÅ”ama treÅ”Äs puses programmatÅ«ra vai draiveri.
SagatavoÅ”ana uzstÄdÄ«Å”anai
Lai instalÄtu sistÄmu, mums ir nepiecieÅ”ams Ubuntu darbvirsmas attÄls. Serveru sistÄmai ir sava veida enerÄ£isks instalÄtÄjs, kas parÄda pÄrmÄrÄ«gu neatkarÄ«bu, ko nevar atspÄjot, iegrūžot UEFI sistÄmas nodalÄ«jumu vienÄ no diskiem, sabojÄjot visu skaistumu. AttiecÄ«gi tas ir instalÄts tikai UEFI režīmÄ. NepiedÄvÄ nekÄdas iespÄjas.
MÄs ar to neesam apmierinÄti.
KÄpÄc?DiemžÄl UEFI sÄknÄÅ”ana ir ÄrkÄrtÄ«gi slikti saderÄ«ga ar sÄknÄÅ”anas programmatÅ«ras RAID, jo... Neviens mums nepiedÄvÄ UEFI ESP nodalÄ«juma rezervÄcijas. TieÅ”saistÄ ir receptes, kas iesaka ievietot ESP nodalÄ«jumu zibatmiÅas diskÄ USB portÄ, taÄu tas ir neveiksmes punkts. Ir receptes, kurÄs tiek izmantota programmatÅ«ra mdadm RAID 1 ar metadatu versiju 0.9, kas neliedz UEFI BIOS redzÄt Å”o nodalÄ«jumu, bet tas dzÄ«vo lÄ«dz laimÄ«gajam brÄ«dim, kad BIOS vai cita aparatÅ«ras operÄtÄjsistÄma kaut ko ieraksta ESP un aizmirst to sinhronizÄt ar citu. spoguļi.
TurklÄt UEFI sÄknÄÅ”ana ir atkarÄ«ga no NVRAM, kas nepÄrvietosies kopÄ ar diskiem uz jauno sistÄmu, jo ir daļa no mÄtesplates.
TÄtad, mÄs neizgudrosim jaunu riteni. Mums jau ir gatavs, laika pÄrbaudÄ«ts vectÄva velosipÄds, ko tagad sauc par Legacy/BIOS boot un kas nes lepno nosaukumu CSM uz UEFI saderÄ«gÄm sistÄmÄm. MÄs to vienkÄrÅ”i noÅemsim no plaukta, eļļosim, uzpumpÄsim riepas un noslaukÄ«sim ar mitru drÄnu.
ArÄ« Ubuntu darbvirsmas versiju nevar pareizi instalÄt ar Legacy bootloader, taÄu Å”eit, kÄ saka, vismaz ir iespÄjas.
MÄs savÄcam aparatÅ«ru un ielÄdÄjam sistÄmu no Ubuntu Live sÄknÄjamÄ zibatmiÅas diska. Mums bÅ«s jÄlejupielÄdÄ pakotnes, tÄpÄc mÄs iestatÄ«sim jums piemÄrotu tÄ«klu. Ja tas nedarbojas, varat iepriekÅ” ielÄdÄt nepiecieÅ”amÄs pakotnes zibatmiÅas diskÄ.
MÄs pÄrejam uz darbvirsmas vidi, palaižam terminÄļa emulatoru un dodamies tÄlÄk:
#sudo bash
KÄā¦?IepriekÅ” redzamÄ rindiÅa ir kanoniskais sudo holiwars aktivizÄtÄjs. C bŠ¾nÄk lielÄkas iespÄjas unŠ¾lielÄka atbildÄ«ba. JautÄjums ir, vai jÅ«s varat to uzÅemties pats. Daudzi cilvÄki domÄ, ka sudo lietoÅ”ana Å”ÄdÄ veidÄ vismaz nav piesardzÄ«ga. TomÄr:
#apt-get install mdadm lvm2 thin-provisioning-tools btrfs-tools util-linux lsscsi nvme-cli mc
KÄpÄc ne ZFS...?InstalÄjot programmatÅ«ru savÄ datorÄ, mÄs bÅ«tÄ«bÄ aizdodam savu aparatÅ«ru Ŕīs programmatÅ«ras izstrÄdÄtÄjiem, lai tie vadÄ«tu.
Uzticot Å”ai programmatÅ«rai savu datu droŔību, mÄs Åemam aizdevumu, kas ir vienÄds ar Å”o datu atjaunoÅ”anas izmaksÄm, kas mums kÄdreiz bÅ«s jÄatmaksÄ.
No Ŕī viedokļa ZFS ir Ferrari, un mdadm+lvm vairÄk atgÄdina velosipÄdu.
SubjektÄ«vi autors dod priekÅ”roku nepazÄ«stamÄm personÄm uz kredÄ«ta aizdot velosipÄdu, nevis Ferrari. Tur emisijas cena nav augsta. Nav vajadzÄ«gas tiesÄ«bas. VienkÄrÅ”Äk nekÄ satiksmes noteikumi. AutostÄvvieta ir bezmaksas. Krosa spÄjas ir labÄkas. VelosipÄdam vienmÄr var piestiprinÄt kÄjas, un velosipÄdu var salabot ar savÄm rokÄm.
KÄpÄc tad BTRFS...?Lai palaistu operÄtÄjsistÄmu, mums ir nepiecieÅ”ama failu sistÄma, kas jau sÄkotnÄji tiek atbalstÄ«ta Legacy/BIOS GRUB, un tajÄ paÅ”Ä laikÄ tiek atbalstÄ«ti tieÅ”raides momentuzÅÄmumi. MÄs to izmantosim /boot nodalÄ«jumam. TurklÄt autors izvÄlas izmantot Å”o FS for / (root), neaizmirstot atzÄ«mÄt, ka jebkurai citai programmatÅ«rai LVM var izveidot atseviŔķus nodalÄ«jumus un uzstÄdÄ«t tos nepiecieÅ”amajos direktorijos.
MÄs Å”ajÄ FS neuzglabÄsim nekÄdus virtuÄlo maŔīnu vai datu bÄzu attÄlus.
Å is FS tiks izmantots tikai, lai izveidotu sistÄmas momentuzÅÄmumus, to neizslÄdzot, un pÄc tam pÄrsÅ«tÄ«tu Å”os momentuzÅÄmumus uz rezerves disku, izmantojot sÅ«tÄ«t/saÅemt.
TurklÄt autors parasti dod priekÅ”roku programmatÅ«ras minimumam tieÅ”i aparatÅ«rÄ un visu pÄrÄjo programmatÅ«ru palaist virtuÄlajÄs maŔīnÄs, izmantojot tÄdas lietas kÄ GPU un PCI-USB resursdatora kontrolleru pÄrsÅ«tÄ«Å”ana uz KVM, izmantojot IOMMU.
VienÄ«gais, kas paliek aparatÅ«rÄ, ir datu glabÄÅ”ana, virtualizÄcija un dublÄÅ”ana.
Ja vairÄk uzticaties ZFS, tad principÄ norÄdÄ«tajai lietojumprogrammai tie ir savstarpÄji aizstÄjami.
TomÄr autors apzinÄti ignorÄ iebÅ«vÄtÄs spoguļoÅ”anas/RAID un dublÄÅ”anas funkcijas, kas ir ZFS, BRTFS un LVM.
KÄ papildu arguments BTRFS ir iespÄja nejauÅ”us ierakstus pÄrvÄrst par secÄ«giem, kas ÄrkÄrtÄ«gi pozitÄ«vi ietekmÄ momentuzÅÄmumu/dublÄjumu sinhronizÄcijas Ätrumu HDD.
AtkÄrtoti skenÄsim visas ierÄ«ces:
#udevadm control --reload-rules && udevadm trigger
PaskatÄ«simies apkÄrt:
#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
Diska izkÄrtojums
NVMe SSD
Bet mÄs tos nekÄdÄ veidÄ neatzÄ«mÄsim. TomÄr mÅ«su BIOS neredz Å”os diskus. TÄtad viÅi pilnÄ«bÄ pÄries uz programmatÅ«ras RAID. MÄs tur pat neveidosim sadaļas. Ja vÄlaties ievÄrot ākanonuā vai āprincipÄā, izveidojiet vienu lielu nodalÄ«jumu, piemÄram, HDD.
SATA HDD
Å eit nekas Ä«paÅ”s nav jÄizdomÄ. MÄs izveidosim vienu sadaļu visam. MÄs izveidosim nodalÄ«jumu, jo BIOS redz Å”os diskus un var pat mÄÄ£inÄt no tiem palaist. MÄs pat vÄlÄk instalÄsim GRUB Å”ajos diskos, lai sistÄma pÄkÅ”Åi varÄtu to izdarÄ«t.
#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
Šeit lietas mums kļūst interesantas.
PirmkÄrt, mÅ«su diskdziÅi ir 2 TB lieli. Tas ir MBR pieÅemamÄ diapazonÄ, ko mÄs izmantosim. Ja nepiecieÅ”ams, var aizstÄt ar GPT. GPT diskiem ir saderÄ«bas slÄnis, kas ļauj ar MBR saderÄ«gÄm sistÄmÄm redzÄt pirmos 4 nodalÄ«jumus, ja tie atrodas pirmajos 2 terabaitos. Galvenais, lai sÄknÄÅ”anas nodalÄ«jums un bios_grub nodalÄ«jums Å”ajos diskos bÅ«tu sÄkumÄ. Tas pat ļauj palaist no GPT Legacy/BIOS diskdziÅiem.
Bet tas nav mūsu gadījums.
Å eit mÄs izveidosim divas sadaļas. Pirmais bÅ«s 1 GB liels un tiks izmantots RAID 1 / sÄknÄÅ”ana.
Otrais tiks izmantots RAID 6 un aizÅems visu atlikuÅ”o brÄ«vo vietu, izÅemot nelielu nepieŔķirtu laukumu diska beigÄs.
Kas ir Ŕī neatzÄ«mÄtÄ zona?SaskaÅÄ ar avotiem tÄ«klÄ, mÅ«su SATA SSD ir dinamiski paplaÅ”inÄma SLC keÅ”atmiÅa, kuras izmÄrs ir no 6 lÄ«dz 78 gigabaitiem. MÄs saÅemam 6 gigabaitus ābez maksasā, pateicoties atŔķirÄ«bai starp āgigabaitiemā un āgibibaitiemā diska datu lapÄ. AtlikuÅ”ie 72 gigabaiti tiek atvÄlÄti no neizmantotÄs vietas.
Å eit jÄatzÄ«mÄ, ka mums ir SLC keÅ”atmiÅa, un vieta tiek aizÅemta 4 bitu MLC režīmÄ. Kas mums faktiski nozÄ«mÄ, ka uz katriem 4 gigabaitiem brÄ«vas vietas mÄs iegÅ«sim tikai 1 gigabaitu SLC keÅ”atmiÅas.
Reiziniet 72 gigabaitus ar 4 un iegÅ«stiet 288 gigabaitus. Å Ä« ir brÄ«vÄ vieta, kuru mÄs neatzÄ«mÄsim, lai diskdziÅi varÄtu pilnÄ«bÄ izmantot SLC keÅ”atmiÅu.
TÄdÄjÄdi mÄs efektÄ«vi iegÅ«sim lÄ«dz 312 gigabaitiem SLC keÅ”atmiÅas no kopumÄ seÅ”iem diskdziÅiem. No visiem diskdziÅiem 2 tiks izmantoti RAID dublÄÅ”anai.
Å Äds keÅ”atmiÅas apjoms ļaus mums ļoti reti reÄlajÄ dzÄ«vÄ sastapties ar situÄciju, kad ieraksts nenonÄk keÅ”atmiÅÄ. Tas ÄrkÄrtÄ«gi labi kompensÄ visbÄdÄ«gÄko QLC atmiÅas trÅ«kumu ā ÄrkÄrtÄ«gi zemo rakstÄ«Å”anas Ätrumu, kad dati tiek rakstÄ«ti, apejot keÅ”atmiÅu. Ja jÅ«su slodzes tam neatbilst, tad iesaku rÅ«pÄ«gi padomÄt, cik ilgi jÅ«su SSD izturÄs pie Å”Ädas slodzes, Åemot vÄrÄ TBW no datu lapas.
#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
Masīvu izveide
PirmkÄrt, mums ir jÄpÄrdÄvÄ maŔīna. Tas ir nepiecieÅ”ams, jo resursdatora nosaukums ir daļa no masÄ«va nosaukuma kaut kur iekÅ”Ä mdadm un kaut kur kaut ko ietekmÄ. Protams, masÄ«vus vÄlÄk var pÄrdÄvÄt, taÄu tas ir lieks solis.
#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
KÄpÄc -pieÅemt-tÄ«ru...?Lai izvairÄ«tos no masÄ«vu inicializÄcijas. Tas attiecas gan uz RAID 1., gan 6. lÄ«meni. Viss var darboties bez inicializÄcijas, ja tas ir jauns masÄ«vs. TurklÄt SSD masÄ«va inicializÄcija pÄc izveides ir TBW resursu izŔķÄrdÄÅ”ana. MÄs izmantojam TRIM/DISCARD, kur iespÄjams, samontÄtajiem SSD masÄ«viem, lai tos āinicializÄtuā.
SSD masÄ«viem RAID 1 DISCARD tiek atbalstÄ«ts jau no komplektÄcijas.
SSD RAID 6 DISCARD masÄ«viem tas ir jÄiespÄjo kodola moduļa parametros.
Tas jÄdara tikai tad, ja visiem SSD, kas tiek izmantoti 4./5./6. lÄ«meÅa masÄ«vos Å”ajÄ sistÄmÄ, ir pieejams discard_zeroes_data atbalsts. Dažreiz jÅ«s saskaraties ar dÄ«vainiem diskdziÅiem, kas norÄda kodolam, ka Ŕī funkcija tiek atbalstÄ«ta, bet patiesÄ«bÄ tÄs nav, vai arÄ« funkcija ne vienmÄr darbojas. PaÅ”laik atbalsts ir pieejams gandrÄ«z visur, tomÄr ir veci diskdziÅi un programmaparatÅ«ra ar kļūdÄm. Å Ä« iemesla dÄļ RAID 6 pÄc noklusÄjuma ir atspÄjots atbalsts DISCARD.
UzmanÄ«bu, Ŕī komanda iznÄ«cinÄs visus datus par NVMe diskdziÅiem, āinicializÄjotā masÄ«vu ar ānullesā.
#blkdiscard /dev/md0
Ja kaut kas noiet greizi, mÄÄ£iniet norÄdÄ«t darbÄ«bu.
#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
KÄpÄc tik liels...?Daļas lieluma palielinÄÅ”ana pozitÄ«vi ietekmÄ nejauÅ”as nolasÄ«Å”anas Ätrumu blokos lÄ«dz pat gabala izmÄram ieskaitot. Tas notiek tÄpÄc, ka vienu atbilstoÅ”a izmÄra vai mazÄku darbÄ«bu var pilnÄ«bÄ veikt vienÄ ierÄ«cÄ. TÄpÄc IOPS no visÄm ierÄ«cÄm tiek summÄts. SaskaÅÄ ar statistiku, 99% IO nepÄrsniedz 512K.
RAID 6 IOPS rakstÄ«Å”anai vienmÄr mazÄks vai vienÄds ar viena diska IOPS. Ja, nejauÅ”i lasot, IOPS var bÅ«t vairÄkas reizes lielÄks nekÄ viena diska, un Å”eit bloka lielumam ir galvenÄ nozÄ«me.
Autors neredz jÄgu mÄÄ£inÄt optimizÄt parametru, kas ir slikts RAID 6 dizainÄ, un tÄ vietÄ optimizÄ to, kas RAID 6 ir labs.
MÄs kompensÄsim slikto RAID 6 nejauÅ”o rakstÄ«Å”anu ar NVMe keÅ”atmiÅu un plÄnas nodroÅ”inÄÅ”anas trikiem.
MÄs vÄl neesam iespÄjojuÅ”i DISCARD RAID 6. TÄpÄc mÄs pagaidÄm "neinicializÄsim" Å”o masÄ«vu. MÄs to darÄ«sim vÄlÄk, pÄc OS instalÄÅ”anas.
SATA HDD
#mdadm --create --verbose --assume-clean /dev/md3 --chunk-size=512 --level=6 --raid-devices=8 /dev/sd[g-n]1
LVM uz NVMe RAID
Ätruma labad mÄs vÄlamies ievietot saknes failu sistÄmu NVMe RAID 1, kas ir /dev/md0.
TomÄr Å”is Ätrais masÄ«vs mums joprojÄm bÅ«s vajadzÄ«gs citÄm vajadzÄ«bÄm, piemÄram, mijmaiÅas, metadatu un LVM keÅ”atmiÅas un LVM plÄna metadatu vajadzÄ«bÄm, tÄpÄc mÄs izveidosim LVM VG Å”ajÄ masÄ«vÄ.
#pvcreate /dev/md0
#vgcreate root /dev/md0
Izveidosim nodalÄ«jumu saknes failu sistÄmai.
#lvcreate -L 128G --name root root
Izveidosim nodalÄ«jumu maiÅai atbilstoÅ”i RAM izmÄram.
#lvcreate -L 32G --name swap root
OS instalÄÅ”ana
KopumÄ mums ir viss nepiecieÅ”amais sistÄmas uzstÄdÄ«Å”anai.
Palaidiet sistÄmas instalÄÅ”anas vedni no Ubuntu Live vides. Parasta uzstÄdÄ«Å”ana. Tikai instalÄÅ”anas disku atlases posmÄ ir jÄnorÄda:
- /dev/md1, - pievienoŔanas punkts /boot, FS - BTRFS
- /dev/root/root (aka /dev/mapper/root-root), - pievienoŔanas punkts / (sakne), FS - BTRFS
- /dev/root/swap (aka /dev/mapper/root-swap), - izmantojiet kÄ mijmaiÅas nodalÄ«jumu
- InstalÄjiet sÄknÄÅ”anas ielÄdÄtÄju vietnÄ /dev/sda
Atlasot BTRFS kÄ saknes failu sistÄmu, instalÄÅ”anas programma automÄtiski izveidos divus BTRFS sÄjumus ar nosaukumu "@" / (sakne) un "@home" /home.
SÄksim instalÄÅ”anu...
InstalÄÅ”ana beigsies ar modÄlu dialoglodziÅu, kas norÄda uz kļūdu, instalÄjot sÄknÄÅ”anas ielÄdÄtÄju. DiemžÄl jÅ«s nevarÄsit iziet no Ŕī dialoglodziÅa, izmantojot standarta lÄ«dzekļus, un turpinÄt instalÄÅ”anu. MÄs izrakstÄmies no sistÄmas un piesakÄmies vÄlreiz, nokļūstot tÄ«rÄ Ubuntu Live darbvirsmÄ. Atveriet terminÄli un vÄlreiz:
#sudo bash
Lai turpinÄtu instalÄÅ”anu, izveidojiet chroot vidi:
#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
KonfigurÄsim tÄ«klu un resursdatora nosaukumu programmÄ chroot:
#cat /etc/hostname >/mnt/chroot/etc/hostname
#cat /etc/hosts >/mnt/chroot/etc/hosts
#cat /etc/resolv.conf >/mnt/chroot/etc/resolv.conf
PÄriesim chroot vidÄ:
#chroot /mnt/chroot
PirmkÄrt, mÄs piegÄdÄsim pakas:
apt-get install --reinstall mdadm lvm2 thin-provisioning-tools btrfs-tools util-linux lsscsi nvme-cli mc debsums hdparm
PÄrbaudÄ«sim un izlabosim visas paketes, kas tika instalÄtas nepareizi nepilnÄ«gas sistÄmas instalÄÅ”anas dÄļ:
#CORRUPTED_PACKAGES=$(debsums -s 2>&1 | awk '{print $6}' | uniq)
#apt-get install --reinstall $CORRUPTED_PACKAGES
Ja kaut kas nedarbojas, iespÄjams, vispirms bÅ«s jÄrediÄ£Ä /etc/apt/sources.list
PielÄgosim RAID 6 moduļa parametrus, lai iespÄjotu TRIM/DISCARD:
#cat >/etc/modprobe.d/raid456.conf << EOF
options raid456 devices_handle_discard_safely=1
EOF
Nedaudz pielabosim savus masīvus:
#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
Kas tas bija..?MÄs esam izveidojuÅ”i udev noteikumu kopu, kas veiks Å”Ädas darbÄ«bas:
- Iestatiet RAID 2020 bloka keÅ”atmiÅas lielumu, lai tas bÅ«tu piemÄrots 6. gadam. Å Ä·iet, ka noklusÄjuma vÄrtÄ«ba nav mainÄ«jusies kopÅ” Linux izveides un nav bijusi piemÄrota ilgu laiku.
- RezervÄjiet vismaz IO masÄ«va pÄrbaužu/sinhronizÄcijas ilgumam. Tas ir paredzÄts, lai novÄrstu jÅ«su masÄ«vu iestrÄgÅ”anu mūžīgÄs sinhronizÄcijas stÄvoklÄ« slodzes laikÄ.
- Ierobežojiet maksimÄlo IO masÄ«vu pÄrbaužu/sinhronizÄcijas laikÄ. Tas ir nepiecieÅ”ams, lai, sinhronizÄjot/pÄrbaudot SSD RAID, jÅ«su diskdziÅi netiktu izcepti. Tas jo Ä«paÅ”i attiecas uz NVMe. (Atceries par radiatoru? Es nejokoju.)
- Aizliegt diskiem apturÄt vÄrpstas rotÄciju (HDD), izmantojot APM, un iestatÄ«t diska kontrolleru miega taimautu uz 7 stundÄm. Varat pilnÄ«bÄ atspÄjot APM, ja jÅ«su diskdziÅi to spÄj (-B 255). Izmantojot noklusÄjuma vÄrtÄ«bu, diskdziÅi apstÄsies pÄc piecÄm sekundÄm. PÄc tam OS vÄlas atiestatÄ«t diska keÅ”atmiÅu, diski atkal sagriezÄ«sies un viss sÄksies no jauna. Diskiem ir ierobežots maksimÄlais vÄrpstas apgriezienu skaits. Å Äds vienkÄrÅ”s noklusÄjuma cikls var viegli iznÄ«cinÄt jÅ«su diskus pÄris gadu laikÄ. Ne visi diski no tÄ cieÅ”, bet mÅ«sÄjie ir āklÄpjdatoriā ar atbilstoÅ”iem noklusÄjuma iestatÄ«jumiem, kas padara RAID lÄ«dzÄ«gu mini-MAID.
- InstalÄjiet priekÅ”lasÄ«Å”anas uz diskiem (rotÄjoÅ”s) 1 megabaits ā divi secÄ«gi bloki/gabals RAID 6
- AtspÄjot priekÅ”lasÄ«Å”anu paÅ”os masÄ«vos.
RediÄ£Äsim /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
KÄpÄc ir tÄ, ka..?MÄs meklÄsim /boot nodalÄ«jumu pÄc UUID. MasÄ«vu nosaukÅ”ana teorÄtiski varÄtu mainÄ«ties.
PÄrÄjÄs sadaļas meklÄsim pÄc LVM nosaukumiem /dev/mapper/vg-lv apzÄ«mÄjumÄ, jo tie identificÄ nodalÄ«jumus diezgan unikÄli.
MÄs neizmantojam UUID priekÅ” LVM, jo LVM sÄjumu un to momentuzÅÄmumu UUID var bÅ«t vienÄds.Pievienojiet /dev/mapper/root-root.. divreiz?JÄ. TieÅ”i tÄ. BTRFS iezÄ«me. Å o failu sistÄmu var uzstÄdÄ«t vairÄkas reizes ar dažÄdiem apakÅ”voliem.
Å Ä«s paÅ”as funkcijas dÄļ es iesaku nekad neveidot LVM momentuzÅÄmumus no aktÄ«vajiem BTRFS sÄjumiem. AtsÄknÄjot, jÅ«s varat saÅemt pÄrsteigumu.
ReÄ£enerÄsim mdadm konfigurÄciju:
#/usr/share/mdadm/mkconf | sed 's/#DEVICE/DEVICE/g' >/etc/mdadm/mdadm.conf
PielÄgosim LVM iestatÄ«jumus:
#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
Kas tas bija..?Esam iespÄjojuÅ”i LVM plÄno baseinu automÄtisku paplaÅ”inÄÅ”anu, sasniedzot 90% no aizÅemtÄs platÄ«bas par 5% no tilpuma.
MÄs esam palielinÄjuÅ”i LVM keÅ”atmiÅas maksimÄlo keÅ”atmiÅas bloku skaitu.
MÄs neļÄvÄm LVM meklÄt LVM sÄjumus (PV) vietnÄ:
- ierÄ«ces, kas satur LVM keÅ”atmiÅu (cdata)
- ierÄ«ces keÅ”atmiÅÄ, izmantojot LVM keÅ”atmiÅu, apejot keÅ”atmiÅu ( _corig). Å ajÄ gadÄ«jumÄ pati keÅ”atmiÅÄ saglabÄtÄ ierÄ«ce joprojÄm tiks skenÄta, izmantojot keÅ”atmiÅu (tikai ).
- ierÄ«ces, kas satur LVM keÅ”atmiÅas metadatus (cmeta)
- visas VG ierÄ«ces ar nosaukumu attÄliem. Å eit mums bÅ«s virtuÄlo maŔīnu diska attÄli, un mÄs nevÄlamies, lai LVM resursdatorÄ aktivizÄtu sÄjumus, kas pieder viesu OS.
- visas VG ierÄ«ces ar nosaukuma dublÄjumu. Å eit mums bÅ«s virtuÄlÄs maŔīnas attÄlu rezerves kopijas.
- visas ierÄ«ces, kuru nosaukums beidzas ar āgpvā (viesa fiziskais apjoms)
MÄs esam iespÄjojuÅ”i DISCARD atbalstu, atbrÄ«vojot brÄ«vu vietu LVM VG. Esi uzmanÄ«gs. TÄdÄjÄdi LV dzÄÅ”ana SSD diskÄ bÅ«s diezgan laikietilpÄ«ga. ÄŖpaÅ”i tas attiecas uz SSD RAID 6. TaÄu saskaÅÄ ar plÄnu izmantosim plÄno nodroÅ”inÄjumu, tÄpÄc tas mums nekÄdi netraucÄs.
AtjauninÄsim initramfs attÄlu:
#update-initramfs -u -k all
InstalÄjiet un konfigurÄjiet grub:
#apt-get install grub-pc
#apt-get purge os-prober
#dpkg-reconfigure grub-pc
KÄdus diskus izvÄlÄties?Visi, kas ir sd*. SistÄmai jÄspÄj palaist no jebkura strÄdÄjoÅ”a SATA diskdziÅa vai SSD.
KÄpÄc viÅi pievienoja os-prober..?Par pÄrmÄrÄ«gu neatkarÄ«bu un rotaļīgÄm rokÄm.
Tas nedarbojas pareizi, ja viens no RAID ir degradÄtÄ stÄvoklÄ«. Tas mÄÄ£ina meklÄt OS nodalÄ«jumos, kas tiek izmantoti virtuÄlajÄs maŔīnÄs, kas darbojas ar Å”o aparatÅ«ru.
Ja jums tas ir nepiecieÅ”ams, varat to atstÄt, taÄu paturiet prÄtÄ visu iepriekÅ” minÄto. Iesaku internetÄ meklÄt receptes, kÄ atbrÄ«voties no nerÄtnÄm rokÄm.
Ar to mÄs esam pabeiguÅ”i sÄkotnÄjo instalÄÅ”anu. Ir pienÄcis laiks restartÄt tikko instalÄto OS. Neaizmirstiet noÅemt sÄknÄjamo Live CD/USB.
#exit
#reboot
KÄ sÄknÄÅ”anas ierÄ«ci atlasiet jebkuru no SATA SSD.
LVM uz SATA SSD
Å ajÄ brÄ«dÄ« mÄs jau esam sÄknÄjuÅ”i jauno OS, konfigurÄjuÅ”i tÄ«klu, atvÄruÅ”i terminÄļa emulatoru un palaiduÅ”i:
#sudo bash
TurpinÄsim.
"InicializÄjiet" masÄ«vu no SATA SSD:
#blkdiscard /dev/md2
Ja tas nedarbojas, mÄÄ£iniet:
#blkdiscard --step 65536 /dev/md2
Izveidojiet LVM VG uz SATA SSD:
#pvcreate /dev/md2
#vgcreate data /dev/md2
KÄpÄc vÄl VG..?PatiesÄ«bÄ mums jau ir VG ar nosaukumu sakne. KÄpÄc ne pievienot visu vienÄ VG?
Ja VG ir vairÄki PV, tad, lai VG tiktu pareizi aktivizÄts, visiem PV ir jÄbÅ«t klÄt (tieÅ”saistÄ). IzÅÄmums ir LVM RAID, ko mÄs apzinÄti neizmantojam.
MÄs patieÅ”Äm vÄlamies, lai, ja kÄdÄ no RAID 6 masÄ«viem rodas kļūme (lasÄ«Å”anas datu zudums), operÄtÄjsistÄma sÄks normÄli un dos mums iespÄju atrisinÄt problÄmu.
Lai to izdarÄ«tu, pirmajÄ abstrakcijas lÄ«menÄ« mÄs izolÄsim katru fizisko āmedijuā veidu atseviÅ”Ä·Ä VG.
ZinÄtniski runÄjot, dažÄdi RAID masÄ«vi pieder pie dažÄdiem āuzticamÄ«bas domÄniemā. Jums nevajadzÄtu radÄ«t viÅiem papildu kopÄ«gu neveiksmes punktu, ievietojot tos vienÄ VG.
LVM klÄtbÅ«tne āaparatÅ«rasā lÄ«menÄ« ļaus mums patvaļīgi izgriezt dažÄdu RAID masÄ«vu gabalus, kombinÄjot tos dažÄdos veidos. PiemÄram ā skrien vienlaicÄ«gi bcache + LVM thin, bcache + BTRFS, LVM cache + LVM thin, sarežģīta ZFS konfigurÄcija ar keÅ”atmiÅÄm vai kÄds cits elliŔķīgs maisÄ«jums, lai mÄÄ£inÄtu to visu salÄ«dzinÄt.
āAparatÅ«rasā lÄ«menÄ« neko citu kÄ vecos labos ābiezoā LVM sÄjumus neizmantosim. IzÅÄmums no Ŕī noteikuma var bÅ«t rezerves nodalÄ«jums.
DomÄju, ka Å”ajÄ brÄ«dÄ« daudzi lasÄ«tÄji jau bija sÄkuÅ”i kaut ko aizdomÄties par ligzdojoÅ”o lelli.
LVM uz SATA HDD
#pvcreate /dev/md3
#vgcreate backup /dev/md3
Atkal jauns VG..?MÄs patieÅ”Äm vÄlamies, lai gadÄ«jumÄ, ja diska masÄ«vs, ko izmantosim datu dublÄÅ”anai, neizdosies, mÅ«su operÄtÄjsistÄma turpinÄs darboties normÄli, vienlaikus saglabÄjot piekļuvi datiem, kas nav dublÄti, kÄ parasti. TÄpÄc, lai izvairÄ«tos no VG aktivizÄÅ”anas problÄmÄm, mÄs izveidojam atseviŔķu VG.
LVM keÅ”atmiÅas iestatÄ«Å”ana
Izveidosim LV uz NVMe RAID 1, lai to izmantotu kÄ keÅ”atmiÅas ierÄ«ci.
#lvcreate -L 70871154688B --name cache root
KÄpÄc ir tik maz...?Fakts ir tÄds, ka mÅ«su NVMe SSD ir arÄ« SLC keÅ”atmiÅa. 4 gigabaiti ābezmaksasā un 18 gigabaiti dinamiskÄ, pateicoties 3 bitu MLC aizÅemtajai brÄ«vajai vietai. Kad Ŕī keÅ”atmiÅa bÅ«s izsmelta, NVMe SSD nebÅ«s daudz ÄtrÄki par mÅ«su SATA SSD ar keÅ”atmiÅu. Faktiski Ŕī iemesla dÄļ mums nav jÄgas padarÄ«t LVM keÅ”atmiÅas nodalÄ«jumu daudz lielÄku par divreiz lielÄku par NVMe diska SLC keÅ”atmiÅu. Izmantotajiem NVMe diskdziÅiem autors uzskata par saprÄtÄ«gu izveidot 32-64 gigabaitu keÅ”atmiÅu.
NorÄdÄ«tais nodalÄ«juma lielums ir nepiecieÅ”ams, lai organizÄtu 64 gigabaitus keÅ”atmiÅas, keÅ”atmiÅas metadatus un metadatu dublÄjumu.
TurklÄt es atzÄ«mÄju, ka pÄc netÄ«ras sistÄmas izslÄgÅ”anas LVM atzÄ«mÄs visu keÅ”atmiÅu kÄ netÄ«ru un atkal sinhronizÄs. TurklÄt tas tiks atkÄrtots katru reizi, kad Å”ajÄ ierÄ«cÄ tiek izmantots lvchange, lÄ«dz sistÄma tiks atkÄrtoti palaists. TÄpÄc es iesaku nekavÄjoties atjaunot keÅ”atmiÅu, izmantojot atbilstoÅ”o skriptu.
Izveidosim LV uz SATA RAID 6, lai to izmantotu kÄ keÅ”atmiÅÄ saglabÄtu ierÄ«ci.
#lvcreate -L 3298543271936B --name cache data
KÄpÄc tikai trÄ«s terabaiti..?Lai vajadzÄ«bas gadÄ«jumÄ varÄtu izmantot SATA SSD RAID 6 kÄdÄm citÄm vajadzÄ«bÄm. KeÅ”atmiÅas vietas lielumu var palielinÄt dinamiski, lidojuma laikÄ, neapturot sistÄmu. Lai to izdarÄ«tu, jums ir Ä«slaicÄ«gi jÄaptur un atkÄrtoti jÄiespÄjo keÅ”atmiÅa, taÄu LVM keÅ”atmiÅas Ä«paÅ”Ä priekÅ”rocÄ«ba salÄ«dzinÄjumÄ ar, piemÄram, bcache ir tÄ, ka to var izdarÄ«t lidojuma laikÄ.
Izveidosim jaunu VG keÅ”atmiÅai.
#pvcreate /dev/root/cache
#pvcreate /dev/data/cache
#vgcreate cache /dev/root/cache /dev/data/cache
KeÅ”atmiÅÄ saglabÄtajÄ ierÄ«cÄ izveidosim LV.
#lvcreate -L 3298539077632B --name cachedata cache /dev/data/cache
Å eit mÄs uzreiz aizÅÄmÄm visu brÄ«vo vietu /dev/data/cache, lai visi pÄrÄjie nepiecieÅ”amie nodalÄ«jumi tiktu izveidoti uzreiz /dev/root/cache. Ja kaut ko izveidojÄt nepareizÄ vietÄ, varat to pÄrvietot, izmantojot pvmove.
Izveidosim un iespÄjosim keÅ”atmiÅu:
#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
KÄpÄc tÄdi gabaliÅi..?Veicot praktiskus eksperimentus, autors varÄja noskaidrot, ka vislabÄkais rezultÄts tiek sasniegts, ja LVM keÅ”atmiÅas bloka izmÄrs sakrÄ«t ar LVM plÄnÄ bloka izmÄru. TurklÄt, jo mazÄks izmÄrs, jo labÄk konfigurÄcija darbojas nejauÅ”Ä ierakstÄ.
64k ir minimÄlais pieļaujamais LVM plÄnais bloka izmÄrs.
Esiet uzmanÄ«gi rakstot..!JÄ. Å Äda veida keÅ”atmiÅa atliek rakstÄ«Å”anas sinhronizÄciju ar keÅ”atmiÅÄ saglabÄto ierÄ«ci. Tas nozÄ«mÄ, ka, ja tiek zaudÄta keÅ”atmiÅa, varat zaudÄt datus keÅ”atmiÅÄ saglabÄtajÄ ierÄ«cÄ. VÄlÄk autors pastÄstÄ«s, kÄdus pasÄkumus papildus NVMe RAID 1 var veikt, lai kompensÄtu Å”o risku.
Å is keÅ”atmiÅas veids tika izvÄlÄts ar nolÅ«ku, lai kompensÄtu RAID 6 slikto nejauÅ”Äs rakstÄ«Å”anas veiktspÄju.
PÄrbaudÄ«sim, ko esam ieguvuÅ”i:
#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)
Tikai [cachedata_corig] ir jÄatrodas mapÄ /dev/data/cache. Ja kaut kas nav kÄrtÄ«bÄ, izmantojiet pvmove.
Ja nepiecieÅ”ams, keÅ”atmiÅu var atspÄjot ar vienu komandu:
#lvconvert -y --uncache cache/cachedata
Tas tiek darÄ«ts tieÅ”saistÄ. LVM vienkÄrÅ”i sinhronizÄs keÅ”atmiÅu ar disku, noÅems to un pÄrdÄvÄs cachedata_corig atpakaļ uz cachedata.
LVM plÄna iestatÄ«Å”ana
Aptuveni novÄrtÄsim, cik daudz vietas mums ir nepiecieÅ”ams LVM plÄnajiem metadatiem:
#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"
Noapaļot līdz 4 gigabaitiem: 4294967296B
Reiziniet ar divi un pievienojiet 4194304B LVM PV metadatiem: 8594128896B
Izveidosim atseviŔķu nodalÄ«jumu NVMe RAID 1, lai tajÄ ievietotu LVM plÄnos metadatus un to rezerves kopiju:
#lvcreate -L 8594128896B --name images root
Par ko..?Å eit var rasties jautÄjums: kÄpÄc LVM plÄnos metadatus ievietot atseviŔķi, ja tie joprojÄm tiks saglabÄti keÅ”atmiÅÄ NVMe un darbosies Ätri.
Lai gan Ätrums Å”eit ir svarÄ«gs, tas nebÅ«t nav galvenais iemesls. Lieta tÄda, ka keÅ”atmiÅa ir neveiksmes punkts. Ar to var kaut kas notikt, un, ja LVM plÄnie metadati tiks saglabÄti keÅ”atmiÅÄ, viss tiks pilnÄ«bÄ zaudÄts. Bez pilnÄ«giem metadatiem bÅ«s gandrÄ«z neiespÄjami salikt plÄnus sÄjumus.
PÄrvietojot metadatus uz atseviŔķu keÅ”atmiÅu neglabÄtu, bet Ätru sÄjumu, mÄs garantÄjam metadatu droŔību keÅ”atmiÅas zuduma vai sabojÄÅ”anas gadÄ«jumÄ. Å ajÄ gadÄ«jumÄ visi bojÄjumi, ko izraisa keÅ”atmiÅas zudums, tiks lokalizÄti nelielos sÄjumos, kas vienkÄrÅ”os atkopÅ”anas procedÅ«ru par lielumu. Ar lielu varbÅ«tÄ«bu Å”ie bojÄjumi tiks atjaunoti, izmantojot FS žurnÄlus.
TurklÄt, ja iepriekÅ” tika uzÅemts neliela apjoma momentuzÅÄmums un pÄc tam keÅ”atmiÅa vismaz vienu reizi tika pilnÄ«bÄ sinhronizÄta, tad LVM thin iekÅ”ÄjÄs konstrukcijas dÄļ momentuzÅÄmuma integritÄte tiks garantÄta keÅ”atmiÅas zuduma gadÄ«jumÄ. .
Izveidosim jaunu VG, kas bÅ«s atbildÄ«gs par plÄnoÅ”anu:
#pvcreate /dev/root/images
#pvcreate /dev/cache/cachedata
#vgcreate images /dev/root/images /dev/cache/cachedata
Izveidosim baseinu:
#lvcreate -L 274877906944B --poolmetadataspare y --poolmetadatasize 4294967296B --chunksize 64k -Z y -T images/thin-pool
KÄpÄc -Z yPapildus tam, kam Å”is režīms patiesÄ«bÄ ir paredzÄts - lai, pÄrdalot vietu, dati no vienas virtuÄlÄs maŔīnas nenoplÅ«stu uz citu virtuÄlo maŔīnu, papildus tiek izmantota nullÄÅ”ana, lai palielinÄtu nejauÅ”Äs rakstÄ«Å”anas Ätrumu blokos, kas mazÄki par 64k. JebkurÅ” ieraksts, kas ir mazÄks par 64 k uz iepriekÅ” nepieŔķirtu plÄnÄ sÄjuma apgabalu, keÅ”atmiÅÄ tiks izlÄ«dzinÄts ar malu lÄ«dz 64 K. Tas ļaus operÄciju pilnÄ«bÄ veikt caur keÅ”atmiÅu, apejot keÅ”atmiÅÄ saglabÄto ierÄ«ci.
PÄrvietosim LV uz atbilstoÅ”ajiem PV:
#pvmove -n images/thin-pool_tdata /dev/root/images /dev/cache/cachedata
#pvmove -n images/lvol0_pmspare /dev/cache/cachedata /dev/root/images
#pvmove -n images/thin-pool_tmeta /dev/cache/cachedata /dev/root/images
PÄrbaudÄ«sim:
#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)
Izveidosim nelielu sÄjumu testiem:
#lvcreate -V 64G --thin-pool thin-pool --name test images
MÄs uzstÄdÄ«sim paketes testiem un uzraudzÄ«bai:
#apt-get install sysstat fio
Å Ädi varat reÄllaikÄ novÄrot mÅ«su krÄtuves konfigurÄcijas darbÄ«bu:
#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)'
TÄdÄ veidÄ mÄs varam pÄrbaudÄ«t mÅ«su konfigurÄciju:
#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
UzmanÄ«gi! Resurss!Å is kods veiks 36 dažÄdus testus, katrs 4 sekundes. Puse no testiem ir paredzÄta ierakstÄ«Å”anai. JÅ«s varat ierakstÄ«t daudz NVMe 4 sekundÄs. LÄ«dz 3 gigabaitiem sekundÄ. TÄdÄjÄdi katrs rakstÄ«Å”anas tests var patÄrÄt lÄ«dz 216 gigabaitiem SSD resursa.
Jaukta lasÄ«Å”ana un rakstÄ«Å”ana?JÄ. Ir lietderÄ«gi palaist lasÄ«Å”anas un rakstÄ«Å”anas testus atseviŔķi. TurklÄt ir lietderÄ«gi nodroÅ”inÄt, lai visas keÅ”atmiÅas tiktu sinhronizÄtas, lai iepriekÅ” veikta rakstÄ«Å”ana neietekmÄtu lasÄ«Å”anu.
RezultÄti ļoti atŔķirsies pirmÄs palaiÅ”anas un turpmÄko palaiÅ”anas laikÄ, jo aizpildÄs keÅ”atmiÅa un mazais apjoms, kÄ arÄ« atkarÄ«bÄ no tÄ, vai sistÄmai izdevÄs sinhronizÄt pÄdÄjÄs palaiÅ”anas laikÄ aizpildÄ«tÄs keÅ”atmiÅas.
Cita starpÄ es iesaku izmÄrÄ«t Ätrumu jau pilnÄ«bÄ plÄnÄ skaļumÄ, no kura tikko tika uzÅemts momentuzÅÄmums. Autoram bija iespÄja novÄrot, kÄ nejauÅ”as rakstÄ«Å”anas strauji paÄtrinÄs uzreiz pÄc pirmÄ momentuzÅÄmuma izveidoÅ”anas, it Ä«paÅ”i, ja keÅ”atmiÅa vÄl nav pilnÄ«bÄ pilna. Tas notiek, pateicoties kopÄÅ”anas un rakstÄ«Å”anas rakstÄ«Å”anas semantikai, keÅ”atmiÅas izlÄ«dzinÄÅ”anai un plÄniem apjoma blokiem, kÄ arÄ« faktam, ka nejauÅ”a ierakstÄ«Å”ana RAID 6 pÄrvÄrÅ”as nejauÅ”Ä lasÄ«Å”anÄ no RAID 6, kam seko rakstÄ«Å”ana keÅ”atmiÅÄ. MÅ«su konfigurÄcijÄ nejauÅ”a nolasÄ«Å”ana no RAID 6 ir lÄ«dz pat 6 reizÄm (SATA SSD skaits masÄ«vÄ) ÄtrÄk nekÄ rakstÄ«Å”ana. Jo bloki CoW tiek pieŔķirti secÄ«gi no plÄnas pÅ«les, tad ieraksts lielÄkoties arÄ« pÄrvÄrÅ”as par secÄ«gu.
Abas Ŕīs funkcijas var izmantot savÄ labÄ.
SaglabÄjiet "saskaÅotus" momentuzÅÄmumus keÅ”atmiÅÄ
Lai samazinÄtu datu zuduma risku keÅ”atmiÅas bojÄjuma/zaudÄÅ”anas gadÄ«jumÄ, autore ierosina ieviest momentuzÅÄmumu rotÄcijas praksi, lai Å”ajÄ gadÄ«jumÄ garantÄtu to integritÄti.
PirmkÄrt, tÄ kÄ maza apjoma metadati atrodas ierÄ«cÄ, kas nav saglabÄta keÅ”atmiÅÄ, metadati bÅ«s konsekventi un iespÄjamie zudumi tiks izolÄti datu blokos.
Å is momentuzÅÄmumu rotÄcijas cikls garantÄ momentuzÅÄmumos esoÅ”o datu integritÄti keÅ”atmiÅas zuduma gadÄ«jumÄ:
- Katram plÄnajam sÄjumam ar nosaukumu <nosaukums> izveidojiet momentuzÅÄmumu ar nosaukumu <name>.cached
- IestatÄ«sim migrÄcijas slieksni uz saprÄtÄ«gi augstu vÄrtÄ«bu:
#lvchange --quiet --cachesettings "migration_threshold=16384" cache/cachedata
- CiklÄ mÄs pÄrbaudÄm netÄ«ro bloku skaitu keÅ”atmiÅÄ:
#lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}'
lÄ«dz sasniegsim nulli. Ja nulle trÅ«kst pÄrÄk ilgi, to var izveidot, Ä«slaicÄ«gi pÄrslÄdzot keÅ”atmiÅu uz ierakstÄ«Å”anas režīmu. TomÄr, Åemot vÄrÄ mÅ«su SATA un NVMe SSD masÄ«vu Ätruma raksturlielumus, kÄ arÄ« to TBW resursus, jÅ«s vai nu varÄsit Ätri uztvert mirkli, nemainot keÅ”atmiÅas režīmu, vai arÄ« jÅ«su aparatÅ«ra pilnÄ«bÄ apÄdÄ«s visus savus resursus. dažas dienas. Resursu ierobežojumu dÄļ sistÄma principÄ nevar visu laiku bÅ«t zem 100% rakstÄ«Å”anas slodzes. MÅ«su NVMe SSD diski ar 100% rakstÄ«Å”anas slodzi pilnÄ«bÄ iztÄrÄs resursus 3-4 dienas. SATA SSD kalpos tikai divreiz ilgÄk. TÄpÄc pieÅemsim, ka lielÄkÄ daļa slodzes ir lasÄ«Å”anai, un mums ir salÄ«dzinoÅ”i Ä«slaicÄ«gi ÄrkÄrtÄ«gi augstas aktivitÄtes uzliesmojumi apvienojumÄ ar vidÄji zemu slodzi rakstÄ«Å”anai. - TiklÄ«dz esam nozvejojuÅ”i (vai izveidojuÅ”i) nulli, mÄs pÄrdÄvÄjam <name>.cached par <name>.committed. Vecais <name>.committed ir dzÄsts.
- PÄc izvÄles, ja keÅ”atmiÅa ir 100% pilna, to var atkÄrtoti izveidot ar skriptu, tÄdÄjÄdi notÄ«rot to. Ar pustukÅ”u keÅ”atmiÅu sistÄma rakstot strÄdÄ daudz ÄtrÄk.
- Iestatiet migrÄcijas slieksni uz nulli:
#lvchange --quiet --cachesettings "migration_threshold=0" cache/cachedata
Tas Ä«slaicÄ«gi neļaus keÅ”atmiÅai sinhronizÄties ar galveno datu nesÄju. - MÄs gaidÄm, kamÄr keÅ”atmiÅÄ sakrÄjas diezgan daudz izmaiÅu
#lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}'
vai taimeris izslÄgsies. - MÄs atkÄrtojam vÄlreiz.
KÄpÄc grÅ«tÄ«bas ar migrÄcijas slieksni...?Lieta ir tÄda, ka reÄlajÄ praksÄ ānejauÅ”sā ieraksts patiesÄ«bÄ nav pilnÄ«gi nejauÅ”s. Ja kaut ko ierakstÄ«jÄm 4 kilobaitu lielumÄ sektorÄ, pastÄv liela varbÅ«tÄ«ba, ka tuvÄko pÄris minÅ«Å”u laikÄ tiks veikts ieraksts tajÄ paÅ”Ä vai kÄdÄ no blakus esoÅ”ajiem (+- 32K) sektoriem.
Iestatot migrÄcijas slieksni uz nulli, mÄs atliekam rakstÄ«Å”anas sinhronizÄciju SATA SSD un apkopojam vairÄkas izmaiÅas vienÄ 64K blokÄ keÅ”atmiÅÄ. Tas ievÄrojami ietaupa SATA SSD resursus.
Kur ir kods..?DiemžÄl autors uzskata sevi par nepietiekami kompetentu bash skriptu izstrÄdÄ, jo ir 100% autodidakts un praktizÄ āgoogleā vadÄ«tu izstrÄdi, tÄpÄc uzskata, ka Å”ausmÄ«go kodu, kas nÄk no viÅa rokÄm, nedrÄ«kst izmantot neviens. cits.
DomÄju, ka Ŕīs jomas profesionÄļi vajadzÄ«bas gadÄ«jumÄ spÄs patstÄvÄ«gi attÄlot visu iepriekÅ” aprakstÄ«to loÄ£iku un, iespÄjams, pat skaisti noformÄt to kÄ sistÄmisku servisu, kÄ to centÄs darÄ«t autors.
Å Äda vienkÄrÅ”a momentuzÅÄmuma rotÄcijas shÄma ļaus mums ne tikai pastÄvÄ«gi pilnÄ«bÄ sinhronizÄt vienu momentuzÅÄmumu SATA SSD, bet arÄ«, izmantojot utilÄ«tu thin_delta, noskaidrot, kuri bloki tika mainÄ«ti pÄc tÄ izveidoÅ”anas, un tÄdÄjÄdi lokalizÄt bojÄjumus galvenie apjomi, ievÄrojami vienkÄrÅ”ojot atgÅ«Å”anu.
TRIM/DISCARD programmÄ libvirt/KVM
Jo datu krÄtuve tiks izmantota KVM darbinÄÅ”anai libvirt, tad derÄtu iemÄcÄ«t mÅ«su VM ne tikai aizÅemt brÄ«vu vietu, bet arÄ« atbrÄ«vot to, kas vairs nav vajadzÄ«gs.
Tas tiek darÄ«ts, emulÄjot TRIM/DISCARD atbalstu virtuÄlajos diskos. Lai to izdarÄ«tu, ir jÄmaina kontrollera veids uz virtio-scsi un jÄrediÄ£Ä 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 pareizi apstrÄdÄ Å”Ädus DISCARD failus no viesu OS, un bloki tiek pareizi atbrÄ«voti gan keÅ”atmiÅÄ, gan plÄnÄ. MÅ«su gadÄ«jumÄ tas notiek galvenokÄrt aizkavÄtÄ veidÄ, dzÄÅ”ot nÄkamo momentuzÅÄmumu.
BTRFS dublÄjums
Izmantojiet gatavus skriptus ar ekstrÄms piesardzÄ«ba un uz savu risku. Autors Å”o kodu uzrakstÄ«ja pats un tikai sev. Esmu pÄrliecinÄts, ka daudziem pieredzÄjuÅ”iem Linux lietotÄjiem ir lÄ«dzÄ«gi rÄ«ki, un nav nepiecieÅ”ams kopÄt kÄdu citu.
Izveidosim sÄjumu rezerves ierÄ«cÄ:
#lvcreate -L 256G --name backup backup
FormatÄsim to BTRFS:
#mkfs.btrfs /dev/backup/backup
Izveidosim stiprinÄjuma punktus un montÄsim failu sistÄmas saknes apakÅ”sadaļas:
#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
Izveidosim direktorijus dublÄÅ”anai:
#mkdir /backup/btrfs/back/remote
#mkdir /backup/btrfs/back/remote/root
#mkdir /backup/btrfs/back/remote/boot
Izveidosim direktoriju rezerves skriptiem:
#mkdir /root/btrfs-backup
KopÄsim skriptu:
Daudz biedÄjoÅ”u bash koda. Izmantojiet uz savu risku. Neraksti autoram dusmÄ«gas vÄstules...#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
Ko tas vispÄr dara..?Satur vienkÄrÅ”u komandu kopu, lai izveidotu BTRFS momentuzÅÄmumus un kopÄtu tos uz citu FS, izmantojot BTRFS sÅ«tÄ«Å”anu/saÅemÅ”anu.
PirmÄ palaiÅ”ana var bÅ«t salÄ«dzinoÅ”i ilga, jo... SÄkumÄ visi dati tiks kopÄti. TurpmÄkÄs palaiÅ”anas bÅ«s ļoti Ätras, jo... Tiks kopÄtas tikai izmaiÅas.
VÄl viens skripts, ko ievietosim cron:
VÄl kÄds bash kods#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
Ko tas dara..?Izveido un sinhronizÄ papildu momentuzÅÄmumus no uzskaitÄ«tajiem BTRFS sÄjumiem dublÄjuma FS. PÄc tam tiek izdzÄsti visi attÄli, kas izveidoti pirms 60 dienÄm. PÄc palaiÅ”anas /backup/btrfs/back/remote/ apakÅ”direktorijÄs tiks parÄdÄ«ti uzskaitÄ«to sÄjumu datÄti momentuzÅÄmumi.
PieŔķirsim koda izpildes tiesības:
#chmod +x /root/btrfs-backup/cron-daily.sh
#chmod +x /root/btrfs-backup/btrfs-backup.sh
PÄrbaudÄ«sim to un ievietosim kronÄ:
#/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 plÄnÄ dublÄjums
Izveidosim plÄnu kopu rezerves ierÄ«cÄ:
#lvcreate -L 274877906944B --poolmetadataspare y --poolmetadatasize 4294967296B --chunksize 64k -Z y -T backup/thin-pool
InstalÄsim ddrescue, jo... skripti izmantos Å”o rÄ«ku:
#apt-get install gddrescue
Izveidosim skriptu direktoriju:
#mkdir /root/lvm-thin-backup
KopÄsim skriptus:
IekÅ”Ä daudz trakulÄ«bas...#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
Ko tas dara...?Ietver komandu kopu, lai manipulÄtu ar plÄniem momentuzÅÄmumiem un sinhronizÄtu atŔķirÄ«bu starp diviem plÄniem momentuzÅÄmumiem, kas saÅemti, izmantojot thin_delta, ar citu bloka ierÄ«ci, izmantojot ddrescue un blkdiscard.
VÄl viens skripts, ko ievietosim cron:
Nedaudz vairÄk bash#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
Ko tas dara...?Izmanto iepriekÅ”Äjo skriptu, lai izveidotu un sinhronizÄtu uzskaitÄ«to plÄno sÄjumu dublÄjumus. Skripts atstÄs neaktÄ«vus uzskaitÄ«to sÄjumu momentuzÅÄmumus, kas nepiecieÅ”ami, lai izsekotu izmaiÅÄm kopÅ” pÄdÄjÄs sinhronizÄcijas.
Å is skripts ir jÄrediÄ£Ä, norÄdot plÄnu sÄjumu sarakstu, kuriem jÄizveido rezerves kopijas. NorÄdÄ«tie nosaukumi ir paredzÄti tikai ilustratÄ«viem nolÅ«kiem. Ja vÄlaties, varat uzrakstÄ«t skriptu, kas sinhronizÄs visus sÄjumus.
Dosim tiesības:
#chmod +x /root/lvm-thin-backup/cron-daily.sh
#chmod +x /root/lvm-thin-backup/lvm-thin-backup.sh
PÄrbaudÄ«sim to un ievietosim kronÄ:
#/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
PirmÄ palaiÅ”ana bÅ«s ilga, jo... plÄnie sÄjumi tiks pilnÄ«bÄ sinhronizÄti, kopÄjot visu izmantoto vietu. Pateicoties LVM plÄnajiem metadatiem, mÄs zinÄm, kuri bloki faktiski tiek izmantoti, tÄpÄc tiks kopÄti tikai faktiski izmantotie plÄnie apjoma bloki.
TurpmÄkÄs darbÄ«bas pakÄpeniski kopÄs datus, pateicoties izmaiÅu izsekoÅ”anai, izmantojot LVM plÄnos metadatus.
Apskatīsim, kas notika:
#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
KÄds tam sakars ar ligzdoÅ”anas lellÄm?
VisticamÄk, Åemot vÄrÄ, ka LVM LV loÄ£iskie apjomi var bÅ«t LVM PV fiziskie apjomi citiem VG. LVM var bÅ«t rekursÄ«vs, piemÄram, ligzdotas lelles. Tas nodroÅ”ina LVM ÄrkÄrtÄju elastÄ«bu.
PS
NÄkamajÄ rakstÄ mÄs mÄÄ£inÄsim izmantot vairÄkas lÄ«dzÄ«gas mobilÄs atmiÅas sistÄmas/KVM kÄ pamatu Ä£eogrÄfiski sadalÄ«tas krÄtuves/vm klastera izveidei ar dublÄÅ”anu vairÄkos kontinentos, izmantojot mÄjas galddatorus, mÄjas internetu un P2P tÄ«klus.
Avots: www.habr.com