X'għandhom komuni LVM u Matryoshka?

Jum tajba.
Nixtieq naqsam mal-komunità l-esperjenza prattika tiegħi tal-bini ta’ sistema ta’ ħażna ta’ data għal KVM bl-użu ta’ md RAID + LVM.

Il-programm se jinkludi:

  • Bini md RAID 1 minn NVMe SSD.
  • Assemblaġġ ta 'md RAID 6 minn SATA SSD u drives regolari.
  • Karatteristiċi tal-operazzjoni TRIM/DISCARD fuq SSD RAID 1/6.
  • Ħolqien ta 'array md RAID 1/6 bootable fuq sett komuni ta' diski.
  • L-installazzjoni tas-sistema fuq NVMe RAID 1 meta ma jkunx hemm appoġġ NVMe fil-BIOS.
  • Uża LVM cache u LVM irqiq.
  • Uża snapshots BTRFS u tibgħat/irċievi għall-backup.
  • Bl-użu ta 'snapshots irqaq LVM u thin_delta għal backups stil BTRFS.

Jekk inti interessat, jekk jogħġbok ara cat.

Dikjarazzjoni

L-awtur ma jġorr l-ebda responsabbiltà għall-konsegwenzi tal-użu jew le materjali/eżempji/kodiċi/tips/data minn dan l-artikolu. Billi taqra jew tuża dan il-materjal bi kwalunkwe mod, tassumi r-responsabbiltà għall-konsegwenzi kollha ta 'dawn l-azzjonijiet. Il-konsegwenzi possibbli jinkludu:

  • SSDs NVMe moqlija iqarmeċ.
  • Riżorsa ta 'reġistrazzjoni użata kompletament u falliment ta' drives SSD.
  • Telf sħiħ tad-data kollha fuq id-drajvs kollha, inklużi kopji ta 'backup.
  • Ħardwer tal-kompjuter difettuż.
  • Ħin moħli, nervi u flus.
  • Kwalunkwe konsegwenzi oħra li mhumiex elenkati hawn fuq.

Ħadid

Disponibbli kienu:

Motherboard minn madwar 2013 bi chipset Z87, komplut b'Intel Core i7 / Haswell.

  • Proċessur 4 qlub, 8 ħjut
  • 32 GB DDR3 RAM
  • 1 x 16 jew 2 x 8 PCIe 3.0
  • 1 x 4 + 1 x 1 PCIe 2.0
  • 6 x 6 GBps SATA 3 konnetturi

L-adapter SAS LSI SAS9211-8I flashed għall-modalità IT / HBA. Firmware li ppermettiet RAID ġie sostitwit intenzjonalment b'firmware HBA biex:

  1. Tista' tarmi dan l-adapter fi kwalunkwe ħin u tibdilha ma' kwalunkwe waħda oħra li ltqajt magħha.
  2. TRIM/Jarmi ħadem b'mod normali fuq diski, għax... fil-firmware RAID dawn il-kmandi mhuma sostnuti xejn, u l-HBA, b'mod ġenerali, ma jimpurtax liema kmandi huma trażmessi fuq ix-xarabank.

Hard drives - 8 biċċiet ta 'HGST Travelstar 7K1000 b'kapaċità ta' 1 TB f'fattur ta 'forma 2.5, bħal għal laptops. Dawn id-drajvs kienu qabel f'firxa RAID 6. Se jkollhom ukoll użu fis-sistema l-ġdida. Biex taħżen backups lokali.

Addizzjonalment miżjud:

6 biċċiet SATA SSD mudell Samsung 860 QVO 2TB. Dawn l-SSDs kienu jeħtieġu volum kbir, il-preżenza ta 'cache SLC, affidabilità, u prezz baxx kienu mixtieqa. Kien meħtieġ appoġġ għar-rimi/żero, li huwa ċċekkjat bil-linja f'dmesg:

kernel: ata1.00: Enabling discard_zeroes_data

2 biċċiet tal-mudell NVMe SSD Samsung SSD 970 EVO 500GB.

Għal dawn l-SSDs, il-veloċità tal-qari/kitba każwali u l-kapaċità tar-riżorsi għall-bżonnijiet tiegħek huma importanti. Radjatur għalihom. Neċessarjament. Assolutament. Inkella, aqlihom sakemm iqarmeċ matul l-ewwel sinkronizzazzjoni RAID.

Adapter StarTech PEX8M2E2 għal 2 x NVMe SSD installat fi slot PCIe 3.0 8x. Dan, għal darb'oħra, huwa biss HBA, iżda għal NVMe. Hija differenti minn adapters irħas peress li ma teħtieġx appoġġ ta 'bifurcation PCIe mill-motherboard minħabba l-preżenza ta' swiċċ PCIe integrat. Se taħdem anke fl-aktar sistema antika b'PCIe, anke jekk hija slot x1 PCIe 1.0. Naturalment, bil-veloċità xierqa. M'hemm l-ebda RAIDs hemmhekk. M'hemm l-ebda BIOS built-in abbord. Għalhekk, is-sistema tiegħek mhux se titgħallem b'mod maġiku tibbutja b'NVMe, u wisq inqas tagħmel NVMe RAID grazzi għal dan l-apparat.

Dan il-komponent kien biss minħabba l-preżenza ta '8x PCIe 3.0 b'xejn wieħed biss fis-sistema, u, jekk ikun hemm 2 slots ħielsa, jista' jiġi sostitwit faċilment b'żewġ Penny PEX4M2E1 jew analogi, li jistgħu jinxtraw kullimkien bi prezz ta '600. rubles.

Ir-rifjut ta 'kull tip ta' ħardwer jew chipset/BIOS RAIDs inkorporat sar deliberatament, sabiex tkun tista 'tissostitwixxi kompletament is-sistema kollha, bl-eċċezzjoni tal-SSD/HDD nfushom, filwaqt li tiġi ppreservata d-dejta kollha. Idealment, sabiex tkun tista 'tiffranka anki s-sistema operattiva installata meta tiċċaqlaq għal ħardwer kompletament ġdid/differenti. Il-ħaġa prinċipali hija li hemm portijiet SATA u PCIe. Huwa bħal live CD jew bootable flash drive, biss veloċi ħafna u ftit goff.

HumorInkella, taf x'jiġri - xi kultant għandek bżonn urġenti li tieħu l-firxa kollha miegħek biex tieħu l-bogħod. Imma ma rridx nitlef id-data. Biex tagħmel dan, il-midja kollha msemmija jinsabu b'mod konvenjenti fuq il-pjastri fil-bajjiet 5.25 tal-każ standard.

Ukoll, u, ovvjament, għall-esperimentazzjoni b'metodi differenti ta 'caching SSD fil-Linux.

Ir-rejds tal-ħardwer huma boring. Ixgħelha. Dan jew jaħdem jew ma jaħdimx. U ma' mdadm dejjem hemm għażliet.

Artab

Preċedentement, Debian 8 Jessie kien installat fuq il-ħardwer, li huwa qrib EOL. RAID 6 ġie mmuntat mill-HDDs imsemmija hawn fuq imqabbda ma 'LVM. Dam magni virtwali f'kvm/libvirt.

Għax L-awtur għandu esperjenza xierqa fil-ħolqien ta 'flash drives SATA/NVMe bootable portabbli, u wkoll, sabiex ma jiksirx il-mudell tas-soltu apt, Ubuntu 18.04 intgħażlet bħala s-sistema fil-mira, li diġà ġiet stabilizzata biżżejjed, iżda għad għandha 3 snin ta' appoġġ fil-futur.

Is-sistema msemmija fiha s-sewwieqa tal-hardware kollha li għandna bżonn barra mill-kaxxa. M'għandniex bżonn xi softwer jew sewwieqa ta' parti terza.

Tħejjija għall-installazzjoni

Biex ninstallaw is-sistema għandna bżonn Ubuntu Desktop Image. Is-sistema tas-server għandha xi tip ta 'installatur vigoruż, li turi indipendenza eċċessiva li ma tistax tiġi diżattivata billi tpoġġi l-partizzjoni tas-sistema UEFI fuq waħda mid-diski, u tħassar is-sbuħija kollha. Għaldaqstant, huwa installat biss fil-mod UEFI. Ma joffri l-ebda għażla.

M’aħniex kuntenti b’dan.

Għaliex?Sfortunatament, UEFI boot huwa estremament kompatibbli mal-boot software RAID, minħabba li... Ħadd ma joffrilna riżervi għall-partition UEFI ESP. Hemm riċetti onlajn li jissuġġerixxu li tpoġġi l-partizzjoni ESP fuq flash drive f'port USB, iżda dan huwa punt ta 'falliment. Hemm riċetti li jużaw softwer mdadm RAID 1 bil-verżjoni tal-metadata 0.9 li ma jipprevjenux lill-UEFI BIOS milli jara din il-partizzjoni, iżda dan jgħix sal-mument kuntenti meta l-BIOS jew hardware OS ieħor jikteb xi ħaġa lill-ESP u jinsa li jissinkronizzaha ma 'oħrajn. mirja.

Barra minn hekk, il-boot UEFI jiddependi fuq NVRAM, li mhux se jiċċaqlaq flimkien mad-diski għas-sistema l-ġdida, minħabba li hija parti mill-motherboard.

Allura, aħna mhux se nivvintaw mill-ġdid rota ġdida. Diġà għandna rota tan-nannu lesta u ttestjata fil-ħin, issa msejħa Legacy/BIOS boot, li għandha l-isem kburi ta' CSM fuq sistemi kompatibbli mal-UEFI. Se nieħduha minn fuq l-ixkaffa, nillubrikawha, nippumpjaw it-tajers u nimsaħha b'ċarruta niedja.

Il-verżjoni tad-desktop ta 'Ubuntu wkoll ma tistax tiġi installata sew mal-bootloader Legacy, iżda hawnhekk, kif jgħidu, għall-inqas hemm għażliet.

U għalhekk, aħna niġbru l-ħardwer u tagħbija s-sistema mill-Ubuntu Live bootable flash drive. Ikollna bżonn inniżżlu pakketti, għalhekk inwaqqfu n-netwerk li jaħdem għalik. Jekk ma taħdimx, tista 'ttella' l-pakketti meħtieġa fuq flash drive bil-quddiem.

Aħna nidħlu fl-ambjent tad-Desktop, inniedu l-emulatur tat-terminal, u nimxu:

#sudo bash

Kif…?Il-linja ta 'hawn fuq hija l-grillu kanoniku għal holiwars dwar sudo. C bоjiġu opportunitajiet akbar uоresponsabbiltà akbar. Il-mistoqsija hija jekk tistax teħodha fuqek innifsek. Ħafna nies jaħsbu li l-użu ta 'sudo b'dan il-mod huwa għall-inqas mhux attent. Madankollu:

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

Għaliex le ZFS...?Meta ninstallaw softwer fuq il-kompjuter tagħna, essenzjalment insellfu l-ħardwer tagħna lill-iżviluppaturi ta 'dan is-software biex issuqu.
Meta nafdaw dan is-software bis-sigurtà tad-dejta tagħna, nieħdu self ugwali għall-ispiża tar-restawr ta 'din id-dejta, li jkollna nħallsu xi darba.

Minn dan il-lat, ZFS hija Ferrari, u mdadm+lvm hija aktar bħal rota.

Suġġettivament, l-awtur jippreferi jsellef rota bi kreditu lil individwi mhux magħrufa minflok Ferrari. Hemmhekk, il-prezz tal-ħruġ mhuwiex għoli. Ebda ħtieġa għal drittijiet. Aktar sempliċi mir-regolamenti tat-traffiku. L-ipparkjar huwa b'xejn. Il-kapaċità bejn il-pajjiżi hija aħjar. Dejjem tista’ twaħħal saqajn ma’ rota, u tista’ ssewwa rota b’idejk stess.

Għaliex mela BTRFS...?Sabiex nibdew is-sistema operattiva, neħtieġu sistema ta 'fajls li hija appoġġjata f'Legacy/BIOS GRUB barra mill-kaxxa, u fl-istess ħin tappoġġja snapshots ħajjin. Aħna se nużawha għall-partizzjoni /boot. Barra minn hekk, l-awtur jippreferi juża dan FS għal / (għerq), mingħajr ma jinsa li jinnota li għal kwalunkwe softwer ieħor tista 'toħloq diviżorji separati fuq LVM u timmontahom fid-direttorji meħtieġa.

Aħna mhux se naħżnu l-ebda immaġini ta 'magni virtwali jew databases fuq dan l-FS.
Dan l-FS se jintuża biss biex jinħolqu snapshots tas-sistema mingħajr ma jintefa u mbagħad jittrasferixxi dawn l-istantaneji għal disk backup billi tuża ibgħat/irċievi.

Barra minn hekk, l-awtur ġeneralment jippreferi li jżomm minimu ta 'softwer direttament fuq il-ħardwer u jmexxi s-softwer l-ieħor kollu f'magni virtwali li juża affarijiet bħal GPUs trażmissjoni u kontrolluri PCI-USB Host lill-KVM permezz ta' IOMMU.

L-uniċi affarijiet li fadal fuq il-ħardwer huma l-ħażna tad-dejta, il-virtwalizzazzjoni u l-backup.

Jekk tafda aktar ZFS, allura, fil-prinċipju, għall-applikazzjoni speċifikata huma interkambjabbli.

Madankollu, l-awtur jinjora deliberatament il-karatteristiċi integrati ta 'mirror/RAID u redundancy li għandhom ZFS, BRTFS u LVM.

Bħala argument addizzjonali, BTRFS għandu l-abbiltà li jbiddel kitbiet każwali f'dawk sekwenzjali, li għandu effett estremament pożittiv fuq il-veloċità tas-sinkronizzazzjoni ta 'snapshots/backups fuq l-HDD.

Ejja niskennjaw mill-ġdid l-apparati kollha:

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

Ejja nagħtu ħarsa madwar:

#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

Disk tqassim

SSDs NVMe

Imma bl-ebda mod mhu se jimmarkawhom. L-istess, il-BIOS tagħna ma jarax dawn id-drajvs. Allura, dawn se jmorru kompletament għal software RAID. Lanqas se noħolqu sezzjonijiet hemmhekk. Jekk trid issegwi l-"canon" jew "prinċipalment", oħloq partizzjoni waħda kbira, bħal HDD.

HDD SATA

M'hemmx għalfejn nivvintaw xi ħaġa speċjali hawn. Aħna noħolqu sezzjoni waħda għal kollox. Aħna se noħolqu partizzjoni minħabba li l-BIOS jara dawn id-diski u jista 'saħansitra tipprova boot minnhom. Saħansitra se ninstallaw GRUB fuq dawn id-diski aktar tard sabiex is-sistema tkun tista 'tagħmel dan f'daqqa.

#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

Dan huwa fejn l-affarijiet isiru interessanti għalina.

L-ewwelnett, id-drajvs tagħna huma 2 TB fid-daqs. Dan huwa fil-medda aċċettabbli għall-MBR, li huwa dak li se nużaw. Jekk meħtieġ, jista 'jiġi sostitwit b'GPT. Id-diski GPT għandhom saff ta 'kompatibilità li jippermetti li s-sistemi kompatibbli ma' MBR jaraw l-ewwel 4 diviżorji jekk ikunu jinsabu fl-ewwel 2 terabytes. Il-ħaġa prinċipali hija li l-partition boot u l-partition bios_grub fuq dawn id-diski għandhom ikunu fil-bidu. Dan anke jippermettilek li tibbutja minn drives GPT Legacy/BIOS.

Imma dan mhux il-każ tagħna.

Hawnhekk se noħolqu żewġ taqsimiet. L-ewwel waħda se tkun 1 GB fid-daqs u użata għal RAID 1 / boot.

It-tieni wieħed se jintuża għal RAID 6 u se jieħu l-ispazju ħieles kollu li jifdal ħlief għal żona żgħira mhux allokata fit-tarf tad-drajv.

X'inhi din iż-żona mhux immarkata?Skont sorsi fuq in-netwerk, l-SSD SATA tagħna għandhom abbord cache SLC espansibbli b'mod dinamiku li jvarja fid-daqs minn 6 sa 78 gigabytes. Ikollna 6 gigabytes "b'xejn" minħabba d-differenza bejn "gigabytes" u "gibibytes" fil-folja tad-dejta tad-drajv. It-72 gigabytes li jifdal huma allokati minn spazju mhux użat.

Hawnhekk għandu jiġi nnutat li għandna cache SLC, u l-ispazju huwa okkupat fil-modalità MLC 4 bit. Li għalina effettivament ifisser li għal kull 4 gigabytes ta 'spazju ħieles se nieħdu biss gigabyte 1 ta' SLC cache.

Immultiplika 72 gigabytes b'4 u ksib 288 gigabytes. Dan huwa l-ispazju ħieles li aħna mhux se jimmarkaw sabiex inħallu d-drajvs jagħmlu użu sħiħ mill-cache SLC.

Għalhekk, se nġibu b'mod effettiv sa 312 gigabytes ta 'cache SLC minn total ta' sitt drives. Mill-drives kollha, 2 se jintużaw fir-RAID għal redundancy.

Dan l-ammont ta 'cache se jippermettilna li estremament rari fil-ħajja reali niltaqgħu ma' sitwazzjoni fejn kitba ma tmurx fil-cache. Dan jikkumpensa tajjeb ħafna għall-iżvantaġġ l-aktar imdejjaq tal-memorja QLC - il-veloċità estremament baxxa tal-kitba meta tinkiteb id-dejta billi tevita l-cache. Jekk it-tagħbijiet tiegħek ma jikkorrispondux għal dan, allura nirrakkomanda li taħseb sew dwar kemm se jdum l-SSD tiegħek taħt tagħbija bħal din, b'kont meħud tat-TBW mill-folja tad-dejta.

#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

Ħolqien Arrays

L-ewwel, għandna bżonn inbiddlu l-isem tal-magna. Dan huwa meħtieġ minħabba li l-isem ospitanti huwa parti mill-isem tal-firxa x'imkien ġewwa mdadm u jaffettwa xi ħaġa x'imkien. Naturalment, l-arrays jistgħu jingħataw isem ġdid aktar tard, iżda dan huwa pass mhux meħtieġ.

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

SSDs NVMe

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

Għaliex -assume-naddaf...?Biex tevita l-inizjalizzazzjoni tal-arrays. Għaż-żewġ livelli RAID 1 u 6 dan huwa validu. Kollox jista 'jaħdem mingħajr initialization jekk huwa firxa ġdida. Barra minn hekk, l-inizjalizzazzjoni tal-firxa SSD mal-ħolqien hija ħela ta 'riżorsi TBW. Aħna nużaw TRIM/DISCARD fejn possibbli fuq arrays SSD immuntati biex "inizjalizzaw".

Għal arrays SSD, RAID 1 DISCARD huwa appoġġjat barra mill-kaxxa.

Għall-arrays SSD RAID 6 DISCARD, trid tagħmilha fil-parametri tal-modulu tal-kernel.

Dan għandu jsir biss jekk l-SSDs kollha użati f'arrays ta' livell 4/5/6 f'din is-sistema jkollhom appoġġ ta' ħidma għal discard_zeroes_data. Xi drabi tiltaqa 'ma' drives strambi li jgħidu lill-qalba li din il-funzjoni hija appoġġjata, iżda fil-fatt mhix hemm, jew il-funzjoni mhux dejjem taħdem. Fil-mument, l-appoġġ huwa disponibbli kważi kullimkien, madankollu, hemm drives qodma u firmware bi żbalji. Għal din ir-raġuni, l-appoġġ DISCARD huwa diżattivat awtomatikament għal RAID 6.

Attenzjoni, il-kmand li ġej se jeqred id-dejta kollha fuq drives NVMe billi "jibdalizza" l-array b'"żeri".

#blkdiscard /dev/md0

Jekk xi ħaġa tmur ħażin, ipprova speċifika pass.

#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

Għaliex daqshekk kbir...?Iż-żieda fid-daqs tal-biċċa għandha effett pożittiv fuq il-veloċità tal-qari bl-addoċċ fi blokki sa daqs tal-biċċa inklużiv. Dan jiġri minħabba li operazzjoni waħda tad-daqs xieraq jew iżgħar tista 'titlesta kompletament fuq apparat wieħed. Għalhekk, l-IOPS mill-apparati kollha hija mqassra. Skont l-istatistika, 99% tal-IO ma jaqbiżx 512K.

RAID 6 IOPS kull kitba dejjem inqas minn jew ugwali għall-IOPS ta' drive wieħed. Meta, bħala qari każwali, IOPS jista 'jkun bosta drabi akbar minn dak ta' drive wieħed, u hawn id-daqs tal-blokk huwa ta 'importanza ewlenija.
L-awtur ma jarax il-punt li jipprova jottimizza parametru li huwa ħażin fir-RAID 6 mid-disinn u minflok jottimizza dak RAID 6 huwa tajjeb għalih.
Aħna se nikkumpensaw għall-kitba każwali fqira ta 'RAID 6 b'cache NVMe u tricks thin-provisioning.

Għadna ma ppermettiex DISCARD għal RAID 6. Allura aħna mhux se "initializzaw" din il-firxa għalissa. Dan nagħmluh aktar tard, wara li ninstallaw l-OS.

HDD SATA

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

LVM fuq NVMe RAID

Għall-veloċità, irridu npoġġu s-sistema tal-fajl tal-għeruq fuq NVMe RAID 1 li hija /dev/md0.
Madankollu, xorta se jkollna bżonn din l-array veloċi għal bżonnijiet oħra, bħal swap, metadata u LVM-cache u LVM-thin metadata, għalhekk se noħolqu LVM VG fuq din il-firxa.

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

Ejja noħolqu partizzjoni għas-sistema tal-fajl tal-għeruq.

#lvcreate -L 128G --name root root

Ejja noħolqu partizzjoni għall-iskambju skond id-daqs tar-RAM.

#lvcreate -L 32G --name swap root

Installazzjoni tal-OS

B'kollox, għandna dak kollu meħtieġ biex ninstallaw is-sistema.

Niedi l-wizard tal-installazzjoni tas-sistema mill-ambjent Ubuntu Live. Installazzjoni normali. Fl-istadju tal-għażla tad-diski għall-installazzjoni biss, għandek bżonn tispeċifika dan li ġej:

  • /dev/md1, - punt ta' muntatura /boot, FS - BTRFS
  • /dev/root/root (magħruf ukoll bħala /dev/mapper/root-root), - punt tal-muntaġġ / (għerq), FS - BTRFS
  • /dev/root/swap (magħruf ukoll bħala /dev/mapper/root-swap), - uża bħala partizzjoni ta' skambju
  • Installa l-bootloader fuq /dev/sda

Meta tagħżel BTRFS bħala s-sistema tal-fajl tal-għeruq, l-installatur awtomatikament joħloq żewġ volumi BTRFS bl-isem "@" għal / (għerq), u "@home" għal /home.

Ejja nibdew l-installazzjoni...

L-installazzjoni se tispiċċa b'kaxxa ta 'djalogu modali li tindika żball fl-installazzjoni tal-bootloader. Sfortunatament, ma tkunx tista' toħroġ minn dan id-djalogu billi tuża mezzi standard u tkompli l-installazzjoni. Aħna nilloggjaw mis-sistema u nerġgħu nilloggjaw, u nispiċċaw f'desktop nadif Ubuntu Live. Iftaħ it-terminal, u għal darb'oħra:

#sudo bash

Oħloq ambjent chroot biex tkompli l-installazzjoni:

#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

Ejja kkonfiguraw in-netwerk u l-hostname fil-chroot:

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

Ejja mmorru fl-ambjent chroot:

#chroot /mnt/chroot

L-ewwelnett, aħna se nwasslu l-pakketti:

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

Ejja niċċekkjaw u nirranġaw il-pakketti kollha li ġew installati b'mod mgħawweġ minħabba installazzjoni mhux kompluta tas-sistema:

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

Jekk xi ħaġa ma taħdimx, jista' jkollok bżonn teditja l-ewwel /etc/apt/sources.list

Ejja naġġustaw il-parametri għall-modulu RAID 6 biex nippermettu TRIM/DISCARD:

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

Ejja nimxu ftit l-arrays tagħna:

#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

X'kienet ..?Ħloqna sett ta’ regoli udev li se jagħmlu dan li ġej:

  • Issettja d-daqs tal-blokk tal-cache għal RAID 2020 biex ikun adegwat għall-6. Il-valur default, jidher, ma nbidilx mill-ħolqien tal-Linux, u ma kienx adegwat għal żmien twil.
  • Irriżerva minimu ta' IO għat-tul ta' kontrolli/sinkronizzazzjonijiet tal-array. Dan biex jipprevjeni l-arrays tiegħek milli jeħlu fi stat ta 'sinkronizzazzjoni eterna taħt tagħbija.
  • Illimita l-IO massimu waqt il-kontrolli/sinkronizzazzjoni tal-arrays. Dan huwa meħtieġ sabiex is-sinkronizzazzjoni/iċċekkjar SSD RAIDs ma fry drives tiegħek għal iqarmeċ. Dan hu veru speċjalment għal NVMe. (Ftakar dwar ir-radjatur? Ma kontx niċċajta.)
  • Ipprojbixxi lid-diski milli jwaqqfu r-rotazzjoni tal-magħżel (HDD) permezz tal-APM u ssettja l-timeout tal-irqad għall-kontrolluri tad-disk għal 7 sigħat. Tista' tiddiżattiva kompletament l-APM jekk id-drajvs tiegħek jistgħu jagħmlu dan (-B 255). Bil-valur default, id-drajvs se jieqfu wara ħames sekondi. Imbagħad l-OS irid jerġa 'jissettja l-cache tad-disk, id-diski jerġgħu jduru, u kollox jerġa' jibda mill-ġdid. Id-diski għandhom numru massimu limitat ta' rotazzjonijiet tal-magħżel. Ċiklu default sempliċi bħal dan jista 'faċilment joqtol id-diski tiegħek fi ftit snin. Mhux id-diski kollha jbatu minn dan, iżda tagħna huma dawk "laptop", bis-settings default xierqa, li jagħmlu r-RAID qisu mini-MAID.
  • Installa readahead fuq diski (rotazzjoni) 1 megabyte - żewġ blokki konsekuttivi/biċċa RAID 6
  • Iddiżattiva readahead fuq l-arrays infushom.

Ejja neditjaw /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

Għalfejn..?Aħna se nfittxu l-partizzjoni /boot mill-UUID. L-ismijiet tal-array jistgħu teoretikament jinbidel.

Se nfittxu s-sezzjonijiet li fadal bl-ismijiet LVM fin-notazzjoni /dev/mapper/vg-lv, għax huma jidentifikaw diviżorji pjuttost unikament.

Aħna ma nużawx UUID għal LVM għax L-UUID tal-volumi LVM u snapshots tagħhom jistgħu jkunu l-istess.Immonta /dev/mapper/root-root.. darbtejn?Iva. Eżattament. Karatteristika ta 'BTRFS. Din is-sistema tal-fajls tista 'tiġi mmuntata diversi drabi b'subvols differenti.

Minħabba din l-istess karatteristika, nirrakkomanda li qatt ma toħloq snapshots LVM ta 'volumi BTRFS attivi. Inti tista 'tikseb sorpriża meta terġa' tibda.

Ejja nirriġeneraw il-konfigurazzjoni mdadm:

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

Ejja naġġustaw is-settings tal-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

X'kienet ..?Ippermettejna espansjoni awtomatika ta 'pools irqaq LVM malli nilħqu 90% tal-ispazju okkupat b'5% tal-volum.

Żidna n-numru massimu ta’ blokki tal-cache għal cache LVM.

Ħalliejna lil LVM milli jfittex volumi LVM (PV) fuq:

  • tagħmir li fih LVM cache (cdata)
  • apparati cache bl-użu ta' LVM cache billi jaqbżu l-cache (_corig). F'dan il-każ, it-tagħmir cached innifsu xorta se jiġi skannjat permezz tal-cache (sempliċement ).
  • apparati li fihom metadata tal-cache LVM (cmeta)
  • l-apparati kollha f'VG bl-immaġini tal-isem. Hawnhekk se jkollna stampi tad-disk ta 'magni virtwali, u ma rridux li LVM fuq il-host jattiva volumi li jappartjenu għall-OS mistieden.
  • l-apparati kollha f'VG bl-isem backup. Hawnhekk se jkollna kopji ta 'backup ta' immaġini ta 'magni virtwali.
  • l-apparati kollha li isimhom jispiċċa b'“gpv” (volum fiżiku tal-mistieden)

Ippermettejna l-appoġġ JARMI meta ħeles l-ispazju ħieles fuq LVM VG. Oqghod attent. Dan se jagħmel it-tħassir ta 'LVs fuq l-SSD jieħu ħafna ħin. Dan japplika b'mod speċjali għal SSD RAID 6. Madankollu, skont il-pjan, se nużaw forniment irqiq, għalhekk dan ma jfixkilna xejn.

Ejja naġġornaw l-immaġni initramfs:

#update-initramfs -u -k all

Installa u kkonfigurat grub:

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

Liema diski għandek tagħżel?Dawk kollha li huma sd*. Is-sistema trid tkun tista 'tibbutja minn kwalunkwe drive SATA jew SSD li jaħdem.

Għaliex żiedu os-prober..?Għal indipendenza eċċessiva u idejn tal-logħob.

Ma taħdimx b'mod korrett jekk wieħed mir-RAIDs ikun fi stat degradat. Jipprova jfittex l-OS fuq diviżorji li jintużaw f'magni virtwali li jaħdmu fuq dan il-ħardwer.

Jekk għandek bżonnha, tista 'tħalliha, iżda żomm f'moħħok dak kollu ta' hawn fuq. Nirrakkomanda li tfittex riċetti biex teħles mill-idejn imqareb onlajn.

B'dan lestejna l-installazzjoni inizjali. Wasal iż-żmien li terġa 'tibda fl-OS li għadu kif ġie installat. Tinsiex tneħħi s-CD/USB Live bootable.

#exit
#reboot

Agħżel kwalunkwe mill-SSDs SATA bħala l-apparat tal-ibbutjar.

LVM fuq SSD SATA

F'dan il-punt, diġà bdejtna fl-OS il-ġdid, ikkonfigurajna n-netwerk, apt, ftaħna l-emulatur tat-terminal, u dam:

#sudo bash

Ejja nkomplu.

"Inizjalizza" l-array minn SATA SSD:

#blkdiscard /dev/md2

Jekk ma taħdimx, imbagħad ipprova:

#blkdiscard --step 65536 /dev/md2
Oħloq LVM VG fuq SATA SSD:

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

Għaliex VG ieħor..?Fil-fatt, diġà għandna VG jismu għerq. Għaliex ma żżidx kollox f'VG wieħed?

Jekk hemm diversi PVs f'VG, allura biex il-VG jiġi attivat b'mod korrett, il-PVs kollha għandhom ikunu preżenti (online). L-eċċezzjoni hija LVM RAID, li aħna deliberatament ma nużawx.

Aħna rridu tassew li jekk ikun hemm falliment (aqra telf ta 'data) fuq kwalunkwe mill-arrays RAID 6, is-sistema operattiva tibbutja b'mod normali u tagħtina l-opportunità li ssolvi l-problema.

Biex tagħmel dan, fl-ewwel livell ta 'estrazzjoni se niżolaw kull tip ta' "midja" fiżika f'VG separat.

B'mod xjentifiku, arrays RAID differenti jappartjenu għal "dominji ta' affidabilità" differenti. M'għandekx toħloq punt ta' falliment komuni addizzjonali għalihom billi tgħaqqadhom f'VG wieħed.

Il-preżenza ta 'LVM fil-livell ta' "ħardwer" se tippermettilna naqtgħu b'mod arbitrarju biċċiet ta 'arrays RAID differenti billi ngħaqqduhom b'modi differenti. Per eżempju - run simultanjament bcache + LVM irqiq, bcache + BTRFS, LVM cache + LVM irqiq, konfigurazzjoni ZFS kumplessa b'caches, jew kwalunkwe taħlita infernali oħra biex tipprova tqabbelha kollha.

Fil-livell ta '"ħardwer", aħna mhux se nużaw xejn għajr volumi LVM "ħxuna" qodma tajba. L-eċċezzjoni għal din ir-regola tista 'tkun il-partizzjoni tal-backup.

Naħseb li sa dan il-mument, ħafna qarrejja kienu diġà bdew jissuspettaw xi ħaġa dwar il-pupa li jbejtu.

LVM fuq SATA HDD

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

VG ġdid mill-ġdid ..?Aħna rridu tassew li jekk l-array tad-disk li se nużaw għall-backup tad-data tfalli, is-sistema operattiva tagħna tkompli taħdem b'mod normali, filwaqt li żżomm aċċess għal data mhux backup bħas-soltu. Għalhekk, biex jiġu evitati problemi ta 'attivazzjoni VG, noħolqu VG separat.

Twaqqif ta' LVM cache

Ejja noħolqu LV fuq NVMe RAID 1 biex tużah bħala mezz ta 'caching.

#lvcreate -L 70871154688B --name cache root

Għaliex hemm daqshekk ftit...?Il-fatt hu li l-SSDs NVMe tagħna għandhom ukoll cache SLC. 4 gigabytes ta '"ħieles" u 18-il gigabytes ta' dinamika minħabba l-ispazju ħieles okkupat fl-MLC 3-bit. Ladarba din il-cache tiġi eżawrita, l-SSDs NVMe mhux se jkunu ħafna aktar mgħaġġla mill-SSD SATA tagħna bil-cache. Fil-fatt, għal din ir-raġuni, ma jagħmilx sens għalina li nagħmlu l-partizzjoni tal-cache LVM ħafna akbar mid-doppju tad-daqs tal-cache SLC tad-drajv NVMe. Għall-drives NVMe użati, l-awtur iqis li huwa raġonevoli li tagħmel 32-64 gigabytes ta 'cache.

Id-daqs tal-partizzjoni mogħti huwa meħtieġ biex torganizza 64 gigabytes ta 'cache, metadata tal-cache, u backup tal-metadata.

Barra minn hekk, ninnota li wara għeluq tas-sistema maħmuġa, LVM jimmarka l-cache kollu bħala maħmuġ u jerġa 'jissinkronizza. Barra minn hekk, dan se jiġi ripetut kull darba li lvchange jintuża fuq dan l-apparat sakemm is-sistema terġa 'tibda. Għalhekk, nirrakkomanda immedjatament li terġa 'tiġi mill-ġdid il-cache billi tuża l-iskript xieraq.

Ejja noħolqu LV fuq SATA RAID 6 biex tużah bħala mezz cached.

#lvcreate -L 3298543271936B --name cache data

Għaliex tliet terabytes biss ..?Sabiex, jekk meħtieġ, tista 'tuża SATA SSD RAID 6 għal xi bżonnijiet oħra. Id-daqs ta 'l-ispazju cached jista' jiżdied b'mod dinamiku, fuq il-fly, mingħajr ma titwaqqaf is-sistema. Biex tagħmel dan, għandek bżonn tieqaf temporanjament u terġa 'tippermetti l-cache, iżda l-vantaġġ distintiv ta' LVM-cache fuq, pereżempju, bcache huwa li dan jista 'jsir fuq il-fly.

Ejja noħolqu VG ġdid għall-caching.

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

Ejja noħolqu LV fuq il-mezz cached.

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

Hawnhekk ħadna immedjatament l-ispazju ħieles kollu fuq /dev/data/cache sabiex il-ħitan kollha meħtieġa l-oħra nħolqu immedjatament fuq /dev/root/cache. Jekk ħloqt xi ħaġa fil-post ħażin, tista 'timxi bl-użu ta' pvmove.

Ejja noħolqu u nippermettu l-cache:

#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

Għaliex tali chunksize ..?Permezz ta 'esperimenti prattiċi, l-awtur seta' jiskopri li l-aħjar riżultat jinkiseb jekk id-daqs tal-blokka tal-cache LVM jikkoinċidi mad-daqs tal-blokka rqiqa LVM. Barra minn hekk, iktar ma jkun żgħir id-daqs, aħjar il-konfigurazzjoni taħdem f'reġistrazzjoni każwali.

64k huwa d-daqs minimu tal-blokk permess għal LVM irqiq.

Oqgħod attent writeback ..!Iva. Dan it-tip ta 'cache jiddeferixxi s-sinkronizzazzjoni tal-kitba għall-apparat fil-cache. Dan ifisser li jekk il-cache tintilef, tista 'titlef id-data fuq l-apparat li jdaħħal fil-cache. Aktar tard, l-awtur jgħidlek liema miżuri, minbarra NVMe RAID 1, jistgħu jittieħdu biex jikkumpensaw għal dan ir-riskju.

Dan it-tip ta 'cache intgħażel intenzjonalment biex jikkumpensa għall-prestazzjoni fqira tal-kitba każwali ta' RAID 6.

Ejja niċċekkjaw dak li ksibna:

#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] biss għandu jkun jinsab fuq /dev/data/cache. Jekk xi ħaġa ħażina, imbagħad uża pvmove.

Tista' tiddiżattiva l-cache jekk meħtieġ bi kmand wieħed:

#lvconvert -y --uncache cache/cachedata

Dan isir online. LVM sempliċiment jissinkronizza l-cache mad-disk, ineħħiha, u semmi mill-ġdid cachedata_corig lura għal cachedata.

Twaqqif ta 'LVM irqiq

Ejja nistmaw bejn wieħed u ieħor kemm neħtieġu spazju għal metadejta rqiqa 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"

Arrotonda sa 4 gigabytes: 4294967296B

Immoltiplika bi tnejn u żid 4194304B għal metadata LVM PV: 8594128896B
Ejja noħolqu partizzjoni separata fuq NVMe RAID 1 biex tpoġġi l-metadata rqiqa LVM u l-kopja ta' backup tagħhom fuqha:

#lvcreate -L 8594128896B --name images root

Għalxiex..?Hawnhekk tista 'tqum il-mistoqsija: għaliex poġġi l-metadata rqiqa ta' LVM separatament jekk xorta se tkun fil-cache fuq NVMe u taħdem malajr.

Għalkemm il-veloċità hija importanti hawnhekk, hija 'l bogħod mir-raġuni ewlenija. Il-ħaġa hija li l-cache huwa punt ta 'falliment. Jista 'jiġrilu xi ħaġa, u jekk il-metadata rqiqa tal-LVM tkun fil-cache, tikkawża li kollox jintilef kompletament. Mingħajr metadata kompluta, ikun kważi impossibbli li jinġabru volumi rqaq.

Billi nċaqalqu l-metadejta għal volum separat mhux fil-cache, iżda veloċi, niggarantixxu s-sigurtà tal-metadejta fil-każ ta’ telf ta’ cache jew korruzzjoni. F'dan il-każ, il-ħsara kollha kkawżata mit-telf tal-cache se tkun lokalizzata ġewwa volumi rqaq, li se jissimplifikaw il-proċedura ta 'rkupru b'ordnijiet ta' kobor. Bi probabbiltà għolja, dawn il-ħsarat se jiġu rrestawrati bl-użu ta 'zkuk FS.

Barra minn hekk, jekk preċedentement ittieħdet snapshot ta 'volum irqiq, u wara dan il-cache kienet kompletament sinkronizzata mill-inqas darba, allura, minħabba d-disinn intern ta' LVM irqiq, l-integrità tal-istampa tkun garantita fil-każ ta 'telf ta' cache. .

Ejja noħolqu VG ġdid li se jkun responsabbli għal thin-provisioning:

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

Ejja noħolqu pool:

#lvcreate -L 274877906944B --poolmetadataspare y --poolmetadatasize 4294967296B --chunksize 64k -Z y -T images/thin-pool
Għaliex -Z yMinbarra dak li huwa attwalment maħsub għal din il-modalità - biex tevita li d-dejta minn magna virtwali waħda titnixxi għal magna virtwali oħra meta tqassam mill-ġdid l-ispazju - iż-żero jintuża wkoll biex tiżdied il-veloċità tal-kitba każwali fi blokki iżgħar minn 64k. Kwalunkwe kitba ta' inqas minn 64k f'żona mhux allokata qabel tal-volum irqiq issir 64K allinjata mat-tarf fil-cache. Dan se jippermetti li l-operazzjoni titwettaq kompletament permezz tal-cache, billi tevita l-apparat tal-cache.

Ejja nimxu l-LVs għall-PVs korrispondenti:

#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

Ejja niċċekkjaw:

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

Ejja noħolqu volum irqiq għat-testijiet:

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

Aħna se ninstallaw pakketti għat-testijiet u l-monitoraġġ:

#apt-get install sysstat fio

Dan huwa kif tista 'tosserva l-imġieba tal-konfigurazzjoni tal-ħażna tagħna f'ħin reali:

#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)'

Dan huwa kif nistgħu nittestjaw il-konfigurazzjoni tagħna:

#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

B'attenzjoni! Riżors!Dan il-kodiċi se jwettaq 36 test differenti, kull wieħed jaħdem għal 4 sekondi. Nofs it-testijiet huma għar-reġistrazzjoni. Tista 'tirreġistra ħafna fuq NVMe f'4 sekondi. Sa 3 gigabytes kull sekonda. Għalhekk, kull ġirja ta 'testijiet tal-kitba tista' tiekol sa 216 gigabytes ta 'riżorsi SSD mingħandek.

Qari u kitba mħallta?Iva. Jagħmel sens li tmexxi t-testijiet tal-qari u tal-kitba separatament. Barra minn hekk, jagħmel sens li jiġi żgurat li l-caches kollha jkunu sinkronizzati sabiex kitba magħmula qabel ma taffettwax il-qari.

Ir-riżultati se jvarjaw ħafna matul l-ewwel tnedija u dawk sussegwenti hekk kif il-cache u l-volum irqiq jimlew, u wkoll skont jekk is-sistema rnexxielha tissinkronizza l-caches mimlija matul l-aħħar tnedija.

Fost affarijiet oħra, nirrakkomanda li tkejjel il-veloċità fuq volum irqiq diġà sħiħ li minnu ħadet snapshot. L-awtur kellu l-opportunità li josserva kif il-kitbiet każwali jaċċelleraw b'mod qawwi immedjatament wara li ħoloq l-ewwel snapshot, speċjalment meta l-cache ma jkunx għadu kompletament mimli. Dan jiġri minħabba s-semantika tal-kitba tal-kopja fuq il-kitba, l-allinjament tal-cache u l-blokki tal-volum irqiq, u l-fatt li kitba każwali għal RAID 6 tinbidel f'qari każwali minn RAID 6 segwit minn kitba fil-cache. Fil-konfigurazzjoni tagħna, il-qari bl-addoċċ minn RAID 6 huwa sa 6 darbiet (in-numru ta 'SSDs SATA fil-firxa) aktar mgħaġġel mill-kitba. Għax blokki għal CoW huma allokati b'mod sekwenzjali minn ġabra rqiqa, allura r-reġistrazzjoni, fil-biċċa l-kbira, tinbidel ukoll f'sekwenzjali.

Dawn iż-żewġ karatteristiċi jistgħu jintużaw għall-vantaġġ tiegħek.

Cache snapshots "koerenti".

Biex jitnaqqas ir-riskju ta 'telf ta' data f'każ ta 'ħsara/telf fil-cache, l-awtur jipproponi li jintroduċi l-prattika ta' snapshots rotanti biex jiggarantixxi l-integrità tagħhom f'dan il-każ.

L-ewwel, minħabba li l-metadejta tal-volum irqiq tirrisjedi fuq apparat mhux fil-cache, il-metadejta tkun konsistenti u t-telf possibbli se jkun iżolat fi ħdan il-blokki tad-dejta.

Iċ-ċiklu ta' rotazzjoni ta' snapshot li ġej jiggarantixxi l-integrità tad-dejta ġewwa l-istantaneji f'każ ta' telf ta' cache:

  1. Għal kull volum irqiq bl-isem , oħloq snapshot bl-isem .cached
  2. Ejja nissettjaw il-limitu tal-migrazzjoni għal valur għoli raġonevoli: #lvchange --quiet --cachesettings "migration_threshold=16384" cache/cachedata
  3. Fil-linja niċċekkjaw in-numru ta 'blokki maħmuġin fil-cache: #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' sakemm nikbru żero. Jekk iż-żero jkun nieqes għal żmien twil wisq, jista 'jinħoloq billi l-cache taqleb temporanjament għall-modalità writethrough. Madankollu, meta tqis il-karatteristiċi tal-veloċità tal-arrays SSD SATA u NVMe tagħna, kif ukoll ir-riżorsa TBW tagħhom, int jew tkun tista' taqbad il-mument malajr mingħajr ma tbiddel il-modalità cache, jew il-hardware tiegħek jiekol kompletament ir-riżors kollu tiegħu f' ftit jiem. Minħabba limitazzjonijiet tar-riżorsi, is-sistema, fil-prinċipju, ma tistax tkun taħt il-100% tat-tagħbija tal-kitba il-ħin kollu. L-SSDs NVMe tagħna taħt it-tagħbija tal-kitba ta' 100% se jeżawrixxu kompletament ir-riżors jiem 3-4. SSDs SATA se jdumu biss id-doppju. Għalhekk, se nassumu li l-biċċa l-kbira tat-tagħbija tmur għall-qari, u għandna tifqigħ relattivament għal żmien qasir ta 'attività estremament għolja flimkien ma' tagħbija baxxa bħala medja għall-kitba.
  4. Hekk kif qbidna (jew għamilna) żero, nsemmu .cached għal .committed. L-antik .committed jitħassar.
  5. B'għażla, jekk il-cache tkun mimlija 100%, tista' tiġi maħluqa mill-ġdid permezz ta' skript, u ​​b'hekk tneħħiha. B'cache nofs vojta, is-sistema taħdem ħafna aktar malajr meta tikteb.
  6. Issettja l-limitu tal-migrazzjoni għal żero: #lvchange --quiet --cachesettings "migration_threshold=0" cache/cachedata Dan se jipprevjeni temporanjament il-cache milli jissinkronizza mal-midja prinċipali.
  7. Nistennew sakemm jakkumulaw ħafna bidliet fil-cache #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' jew it-tajmer jintefa.
  8. Erġgħu nirrepetu.

Għaliex diffikultajiet bil-limitu tal-migrazzjoni...?Il-ħaġa hija li fil-prattika reali, reġistrazzjoni "każwali" fil-fatt mhix kompletament każwali. Jekk ktibna xi ħaġa lil settur ta 'daqs ta' 4 kilobytes, hemm probabbiltà kbira li fil-ftit minuti li ġejjin isir rekord għall-istess jew wieħed mis-setturi ġirien (+- 32K).

Billi nissettjaw il-limitu tal-migrazzjoni għal żero, nipposponu s-sinkronizzazzjoni tal-kitba fuq l-SSD SATA u naggregaw diversi bidliet għal blokka waħda ta '64K fil-cache. Dan jiffranka b'mod sinifikanti r-riżors ta 'SATA SSD.

Fejn hu l-kodiċi ..?Sfortunatament, l-awtur iqis lilu nnifsu mhux kompetenti biżżejjed fl-iżvilupp ta 'skripts bash minħabba li huwa 100% awto-mgħallem u jipprattika żvilupp immexxi minn "google", għalhekk jemmen li l-kodiċi terribbli li joħroġ minn idejh m'għandux jintuża minn ħadd. inkella.

Naħseb li l-professjonisti f'dan il-qasam se jkunu jistgħu jpinġu b'mod indipendenti l-loġika kollha deskritta hawn fuq, jekk meħtieġ, u, forsi, anke jiddisinjawha b'mod sabiħ bħala servizz systemd, kif ipprova jagħmel l-awtur.

Skema ta' rotazzjoni snapshot sempliċi bħal din tippermettilna mhux biss li kontinwament ikollna snapshot waħda kompletament sinkronizzata fuq l-SSD SATA, iżda tippermettilna wkoll, bl-użu tal-utilità thin_delta, biex insibu liema blokki nbidlu wara l-ħolqien tiegħu, u b'hekk nillokalizzaw il-ħsara fuq il-volumi ewlenin, jissimplifikaw ħafna l-irkupru .

TRIM/ARMI f'libvirt/KVM

Għax il-ħażna tad-dejta se tintuża għal KVM li jħaddem libvirt, allura tkun idea tajba li ngħallmu lill-VMs tagħna mhux biss biex jieħdu spazju ħieles, iżda wkoll biex jilliberaw dak li m'għadux meħtieġ.

Dan isir billi jiġi emulat l-appoġġ TRIM/DISCARD fuq diski virtwali. Biex tagħmel dan, għandek bżonn tibdel it-tip ta 'kontrollur għal virtio-scsi u teditja l-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>

Tali RIMI minn OS mistiedna huma pproċessati b'mod korrett minn LVM, u l-blokki huma meħlusa b'mod korrett kemm fil-cache kif ukoll fil-pool irqiq. Fil-każ tagħna, dan iseħħ prinċipalment b'mod ittardjat, meta tħassar l-istampa li jmiss.

BTRFS Backup

Uża skripts lesti ma estremi kawtela u għar-riskju tiegħu stess. L-awtur kiteb dan il-kodiċi huwa stess u esklussivament għalih innifsu. Jien ċert li ħafna utenti b'esperjenza tal-Linux għandhom għodod simili, u m'hemmx għalfejn tikkopja dawk ta' xi ħadd ieħor.

Ejja noħolqu volum fuq it-tagħmir tal-backup:

#lvcreate -L 256G --name backup backup

Ejja nifformattjaha f'BTRFS:

#mkfs.btrfs /dev/backup/backup

Ejja noħolqu punti ta 'muntaġġ u mmuntaw is-subsezzjonijiet tal-għeruq tas-sistema tal-fajls:

#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

Ejja noħolqu direttorji għall-backups:

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

Ejja noħolqu direttorju għall-iskripts tal-backup:

#mkdir /root/btrfs-backup

Ejja nikkopja l-iskrittura:

Ħafna kodiċi bash tal-biża. Uża għar-riskju tiegħek. Tiktebx ittri rrabjati lill-awtur...#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

X'jagħmel anke ..?Fih sett ta 'kmandi sempliċi għall-ħolqien ta' snapshots BTRFS u l-ikkupjar tagħhom għal FS ieħor bl-użu ta 'BTRFS tibgħat/riċevi.

L-ewwel tnedija tista’ tkun relattivament twila, għax... Fil-bidu, id-dejta kollha tiġi kkupjata. Tnedijiet ulterjuri se jkunu mgħaġġla ħafna, għax... Il-bidliet biss se jiġu kkupjati.

Skript ieħor li se npoġġu f'cron:

Xi kodiċi bash aktar#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

X'tagħmel ..?Joħloq u jissinkronizza snapshots inkrementali tal-volumi BTRFS elenkati fuq l-FS backup. Wara dan, iħassar l-istampi kollha maħluqa 60 jum ilu. Wara t-tnedija, snapshots datati tal-volumi elenkati se jidhru fis-subdirettorji /backup/btrfs/back/remote/.

Ejja nagħtu d-drittijiet ta 'eżekuzzjoni tal-kodiċi:

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

Ejja niċċekkjawha u poġġiha fil-cron:

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

LVM rqiqa backup

Ejja noħolqu ġabra rqiqa fuq it-tagħmir tal-backup:

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

Ejja ninstallaw ddrescue, għax... skripts se jużaw din l-għodda:

#apt-get install gddrescue

Ejja noħolqu direttorju għall-iskripts:

#mkdir /root/lvm-thin-backup

Ejja nikkopja l-iskripts:

Ħafna bash ġewwa...#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

X'tagħmel...?Fih sett ta’ kmandi għall-manipulazzjoni ta’ snapshots irqaq u s-sinkronizzazzjoni tad-differenza bejn żewġ snapshots rqaq riċevuti permezz ta’ thin_delta għal apparat blokk ieħor bl-użu ta’ ddrescue u blkdiscard.

Skript ieħor li se npoġġu f'cron:

Bash ftit aktar#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

X'tagħmel...?Juża l-iskript preċedenti biex joħloq u jissinkronizza backups tal-volumi rqaq elenkati. L-iskrittura se tħalli snapshots inattivi tal-volumi elenkati, li huma meħtieġa biex jittraċċaw il-bidliet mill-aħħar sinkronizzazzjoni.

Din l-iskrittura trid tiġi editjata, u tispeċifika l-lista ta 'volumi rqaq li għalihom għandhom isiru kopji ta' backup. L-ismijiet mogħtija huma għal skopijiet illustrattivi biss. Jekk tixtieq, tista' tikteb skript li jissinkronizza l-volumi kollha.

Ejja nagħtu d-drittijiet:

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

Ejja niċċekkjawha u poġġiha fil-cron:

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

L-ewwel tnedija se tkun twila, għax... volumi rqaq se jkunu sinkronizzati bis-sħiħ billi tikkopja l-ispazju kollu użat. Bis-saħħa tal-metadata rqiqa LVM, nafu liema blokki qed jintużaw fil-fatt, għalhekk se jiġu kkupjati biss blokki ta 'volum irqiq użati fil-fatt.

Il-ġirjiet sussegwenti se jikkupjaw id-dejta b'mod inkrementali grazzi għat-traċċar tal-bidliet permezz tal-metadejta rqiqa LVM.

Ejja naraw x'ġara:

#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

X'għandu x'jaqsam dan mal-pupi li jbejtu?

Ħafna probabbli, peress li l-volumi loġiċi LVM LV jistgħu jkunu volumi fiżiċi LVM PV għal VGs oħra. LVM jista' jkun rikorsiv, bħal pupi li jbejtu. Dan jagħti flessibbiltà estrema LVM.

PS

Fl-artiklu li jmiss, se nippruvaw nużaw diversi sistemi simili ta 'ħażna mobbli/KVM bħala l-bażi għall-ħolqien ta' ħażna ġeo distribwita / cluster vm b'redundancy f'diversi kontinenti billi tuża desktops tad-dar, l-Internet tad-dar u netwerks P2P.

Sors: www.habr.com

Żid kumment