Beth sydd gan LVM a Matryoshka yn gyffredin?

Ddiwrnod da.
Hoffwn rannu gyda'r gymuned fy mhrofiad ymarferol o adeiladu system storio data ar gyfer KVM gan ddefnyddio md RAID + LVM.

Bydd y rhaglen yn cynnwys:

  • Adeiladu md RAID 1 o NVMe SSD.
  • Cydosod md RAID 6 o SATA SSD a gyriannau rheolaidd.
  • Nodweddion gweithrediad TRIM/DISCARD ar SSD RAID 1/6.
  • Creu arae md RAID 1/6 bootable ar set gyffredin o ddisgiau.
  • Gosod y system ar NVMe RAID 1 pan nad oes cefnogaeth NVMe yn y BIOS.
  • Gan ddefnyddio storfa LVM a LVM tenau.
  • Defnyddio cipluniau BTRFS ac anfon/derbyn ar gyfer copi wrth gefn.
  • Defnyddio cipluniau tenau LVM a thin_delta ar gyfer copïau wrth gefn arddull BTRFS.

Os oes gennych ddiddordeb, gwelwch cath.

Datganiad

Nid yw'r awdur yn cymryd unrhyw gyfrifoldeb am ganlyniadau defnyddio neu beidio â defnyddio deunyddiau/enghreifftiau/cod/awgrymiadau/data o'r erthygl hon. Trwy ddarllen neu ddefnyddio'r deunydd hwn mewn unrhyw ffordd, rydych chi'n cymryd cyfrifoldeb am holl ganlyniadau'r gweithredoedd hyn. Mae canlyniadau posibl yn cynnwys:

  • SSDs NVMe wedi'u ffrio mewn creision.
  • Adnodd cofnodi sydd wedi'i ddefnyddio'n llwyr a methiant gyriannau SSD.
  • Colled llwyr o'r holl ddata ar bob gyriant, gan gynnwys copïau wrth gefn.
  • Caledwedd cyfrifiadurol diffygiol.
  • Gwastraffu amser, nerfau ac arian.
  • Unrhyw ganlyniadau eraill nad ydynt wedi'u rhestru uchod.

Haearn

Ar gael roedd:

Motherboard o tua 2013 gyda chipset Z87, ynghyd â Intel Core i7 / Haswell.

  • Prosesydd 4 craidd, 8 edafedd
  • 32 GB RAM DDR3
  • 1 x 16 neu 2 x 8 PCIe 3.0
  • 1 x 4 + 1 x 1 PCIe 2.0
  • Cysylltwyr SATA 6 6 x 3 GBps

Fflachiodd addasydd SAS LSI SAS9211-8I i ddelw TG / HBA. Mae firmware wedi'i alluogi gan RAID wedi'i ddisodli'n fwriadol â firmware HBA i:

  1. Gallech chi daflu'r addasydd hwn unrhyw bryd a rhoi unrhyw un arall y daethoch chi ar ei draws yn ei le.
  2. Roedd TRIM/Discard yn gweithio fel arfer ar ddisgiau, oherwydd... yn firmware RAID ni chefnogir y gorchmynion hyn o gwbl, ac nid yw'r HBA, yn gyffredinol, yn poeni pa orchmynion sy'n cael eu trosglwyddo dros y bws.

Gyriannau caled - 8 darn o HGST Travelstar 7K1000 gyda chynhwysedd o 1 TB mewn ffactor ffurf 2.5, fel ar gyfer gliniaduron. Roedd y disgiau hyn yn flaenorol mewn cyfres RAID 6. Byddant hefyd yn cael defnydd yn y system newydd. I storio copïau wrth gefn lleol.

Yn ogystal ychwanegodd:

6 darn model SSD SATA Samsung 860 QVO 2TB. Roedd angen cyfaint mawr ar yr SSDs hyn, roedd presenoldeb storfa SLC, dibynadwyedd, a phris isel yn ddymunol. Roedd angen cefnogaeth ar gyfer taflu/sero, sy'n cael ei wirio gan y llinell yn dmesg:

kernel: ata1.00: Enabling discard_zeroes_data

2 ddarn o fodel NVMe SSD Samsung SSD 970 EVO 500GB.

Ar gyfer yr AGCau hyn, mae cyflymder darllen/ysgrifennu ar hap a gallu adnoddau ar gyfer eich anghenion yn bwysig. Rheiddiadur ar eu cyfer. O reidrwydd. Yn hollol. Fel arall, ffriwch nhw nes eu bod yn grensiog yn ystod y cydamseriad RAID cyntaf.

Addasydd StarTech PEX8M2E2 ar gyfer 2 x NVMe SSD wedi'i osod yn slot PCIe 3.0 8x. Unwaith eto, dim ond HBA yw hwn, ond ar gyfer NVMe. Mae'n wahanol i addaswyr rhad yn yr ystyr nad oes angen cefnogaeth bifurcation PCIe gan y famfwrdd oherwydd presenoldeb switsh PCIe adeiledig. Bydd yn gweithio hyd yn oed yn y system fwyaf hynafol gyda PCIe, hyd yn oed os yw'n slot x1 PCIe 1.0. Yn naturiol, ar y cyflymder priodol. Nid oes unrhyw RAIDs yno. Nid oes BIOS adeiledig ar y bwrdd. Felly, ni fydd eich system yn dysgu cychwyn gyda NVMe yn hudol, llawer llai na NVMe RAID diolch i'r ddyfais hon.

Roedd y gydran hon yn bennaf oherwydd presenoldeb dim ond un 8x PCIe 3.0 am ddim yn y system, ac, os oes 2 slot am ddim, gellir ei ddisodli'n hawdd â dwy geiniog PEX4M2E1 neu analogau, y gellir eu prynu yn unrhyw le am bris o 600 rwbl.

Gwnaethpwyd gwrthod pob math o galedwedd neu chipset / BIOS RAIDs adeiledig yn fwriadol, er mwyn gallu disodli'r system gyfan yn llwyr, ac eithrio'r SSD / HDD eu hunain, wrth gadw'r holl ddata. Yn ddelfrydol, fel y gallwch arbed hyd yn oed y system weithredu sydd wedi'i gosod wrth symud i galedwedd cwbl newydd/gwahanol. Y prif beth yw bod yna borthladdoedd SATA a PCIe. Mae fel CD byw neu yriant fflach bootable, dim ond yn gyflym iawn ac ychydig yn swmpus.

HiwmorFel arall, rydych chi'n gwybod beth sy'n digwydd - weithiau mae angen i chi fynd â'r casgliad cyfan gyda chi ar frys i'w gludo. Ond dydw i ddim eisiau colli data. I wneud hyn, mae'r holl gyfryngau a grybwyllir wedi'u lleoli'n gyfleus ar y sleidiau yng nghilfachau 5.25 yr achos safonol.

Wel, ac, wrth gwrs, ar gyfer arbrofi gyda gwahanol ddulliau o caching SSD yn Linux.

Mae cyrchoedd caledwedd yn ddiflas. Trowch ef ymlaen. Mae naill ai'n gweithio neu ddim. A chyda mdadm mae yna opsiynau bob amser.

Meddalwedd

Yn flaenorol, gosodwyd Debian 8 Jessie ar y caledwedd, sy'n agos at EOL. Cafodd RAID 6 ei ymgynnull o'r HDDs a grybwyllwyd uchod wedi'u paru â LVM. Roedd yn rhedeg peiriannau rhithwir mewn kvm/libvirt.

Achos Mae gan yr awdur brofiad addas o greu gyriannau fflach symudol SATA/NVMe y gellir eu cychwyn, a hefyd, er mwyn peidio â thorri'r templed addas arferol, dewiswyd Ubuntu 18.04 fel y system darged, sydd eisoes wedi'i sefydlogi'n ddigonol, ond mae ganddo 3 blynedd o hyd o cefnogaeth yn y dyfodol.

Mae'r system a grybwyllir yn cynnwys yr holl yrwyr caledwedd sydd eu hangen arnom allan o'r blwch. Nid oes angen unrhyw feddalwedd na gyrwyr trydydd parti arnom.

Paratoi ar gyfer gosod

I osod y system mae angen Delwedd Bwrdd Gwaith Ubuntu arnom. Mae gan y system gweinydd ryw fath o osodwr egnïol, sy'n dangos annibyniaeth ormodol na ellir ei analluogi trwy wthio rhaniad system UEFI ar un o'r disgiau, gan ddifetha'r holl harddwch. Yn unol â hynny, dim ond yn y modd UEFI y caiff ei osod. Nid yw'n cynnig unrhyw opsiynau.

Nid ydym yn hapus gyda hyn.

Pam?Yn anffodus, mae cist UEFI yn gydnaws iawn â meddalwedd cychwyn RAID, oherwydd ... Nid oes neb yn cynnig amheuon i ni ar gyfer rhaniad UEFI ESP. Mae yna ryseitiau ar-lein sy'n awgrymu gosod y rhaniad ESP ar yriant fflach mewn porthladd USB, ond mae hwn yn bwynt o fethiant. Mae yna ryseitiau sy'n defnyddio meddalwedd mdadm RAID 1 gyda fersiwn metadata 0.9 nad ydynt yn atal BIOS UEFI rhag gweld y rhaniad hwn, ond mae hyn yn byw tan y foment hapus pan fydd y BIOS neu OS caledwedd arall yn ysgrifennu rhywbeth i'r ESP ac yn anghofio ei gydamseru i un arall drychau.

Yn ogystal, mae cist UEFI yn dibynnu ar NVRAM, na fydd yn symud ynghyd â'r disgiau i'r system newydd, oherwydd yn rhan o'r famfwrdd.

Felly, ni fyddwn yn ailddyfeisio olwyn newydd. Mae gennym eisoes feic taid parod, prawf amser, a elwir bellach yn Legacy/BIOS boot, sy'n dwyn yr enw balch CSM ar systemau sy'n gydnaws â UEFI. Byddwn yn ei dynnu oddi ar y silff, ei iro, ei bwmpio i fyny'r teiars a'i sychu â lliain llaith.

Ni ellir gosod y fersiwn bwrdd gwaith o Ubuntu hefyd yn iawn gyda'r llwyth cychwyn Legacy, ond yma, fel y dywedant, o leiaf mae yna opsiynau.

Ac felly, rydyn ni'n casglu'r caledwedd ac yn llwytho'r system o yriant fflach bootable Ubuntu Live. Bydd angen i ni lawrlwytho pecynnau, felly byddwn yn sefydlu'r rhwydwaith sy'n gweithio i chi. Os na fydd yn gweithio, gallwch lwytho'r pecynnau angenrheidiol ar yriant fflach ymlaen llaw.

Rydyn ni'n mynd i mewn i'r amgylchedd Penbwrdd, yn lansio'r efelychydd terfynell, ac i ffwrdd â ni:

#sudo bash

Sut…?Y llinell uchod yw'r sbardun canonaidd ar gyfer holiwars am sudo. C bоdaw mwy o gyfleoedd aоmwy o gyfrifoldeb. Y cwestiwn yw a allwch chi ei gymryd arnoch chi'ch hun. Mae llawer o bobl yn meddwl nad yw defnyddio sudo yn y modd hwn yn ofalus o leiaf. Fodd bynnag:

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

Beth am ZFS...?Pan fyddwn yn gosod meddalwedd ar ein cyfrifiadur, yn y bôn rydym yn rhoi benthyg ein caledwedd i ddatblygwyr y feddalwedd hon i'w yrru.
Pan fyddwn yn ymddiried yn y feddalwedd hon gyda diogelwch ein data, rydym yn cymryd benthyciad sy'n cyfateb i gost adfer y data hwn, y bydd yn rhaid i ni ei dalu ryw ddydd.

O'r safbwynt hwn, Ferrari yw ZFS, ac mae mdadm + lvm yn debycach i feic.

Yn oddrychol, mae'n well gan yr awdur roi benthyg beic ar gredyd i unigolion anhysbys yn lle Ferrari. Yno, nid yw pris y mater yn uchel. Dim angen hawliau. Symlach na rheolau traffig. Mae parcio am ddim. Mae gallu traws gwlad yn well. Gallwch chi gysylltu coesau â beic bob amser, a gallwch chi atgyweirio beic gyda'ch dwylo eich hun.

Pam felly BTRFS...?Er mwyn cychwyn y system weithredu, mae angen system ffeiliau arnom a gefnogir yn Legacy/BIOS GRUB allan o'r bocs, ac ar yr un pryd yn cefnogi cipluniau byw. Byddwn yn ei ddefnyddio ar gyfer y rhaniad /boot. Yn ogystal, mae'n well gan yr awdur ddefnyddio'r FS hwn ar gyfer / (gwraidd), heb anghofio nodi y gallwch chi greu rhaniadau ar wahân ar LVM ar gyfer unrhyw feddalwedd arall a'u gosod yn y cyfeiriaduron angenrheidiol.

Ni fyddwn yn storio unrhyw ddelweddau o beiriannau rhithwir na chronfeydd data ar yr FS hwn.
Bydd yr FS hwn yn cael ei ddefnyddio i greu cipluniau o'r system heb ei ddiffodd ac yna trosglwyddo'r cipluniau hyn i ddisg wrth gefn gan ddefnyddio anfon/derbyn.

Yn ogystal, yn gyffredinol mae'n well gan yr awdur gadw isafswm o feddalwedd yn uniongyrchol ar y caledwedd a rhedeg yr holl feddalwedd arall mewn peiriannau rhithwir gan ddefnyddio pethau fel anfon GPUs ymlaen a rheolwyr PCI-USB Host i KVM trwy IOMMU.

Yr unig bethau sydd ar ôl ar y caledwedd yw storio data, rhithwiroli a gwneud copi wrth gefn.

Os ydych chi'n ymddiried mwy yn ZFS, yna, mewn egwyddor, ar gyfer y cais penodedig maent yn gyfnewidiol.

Fodd bynnag, mae'r awdur yn fwriadol yn anwybyddu'r nodweddion adlewyrchu / RAID adeiledig a dileu swyddi sydd gan ZFS, BRTFS a LVM.

Fel dadl ychwanegol, mae gan BTRFS y gallu i droi ysgrifen ar hap yn rhai dilyniannol, sy'n cael effaith hynod gadarnhaol ar gyflymder cydamseru cipluniau / copïau wrth gefn ar yr HDD.

Gadewch i ni ail-sganio pob dyfais:

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

Gadewch i ni edrych o gwmpas:

#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

Cynllun disg

NVMe SSD

Ond ni fyddwn yn eu marcio mewn unrhyw ffordd. Yn yr un modd, nid yw ein BIOS yn gweld y gyriannau hyn. Felly, byddant yn mynd yn gyfan gwbl i RAID meddalwedd. Ni fyddwn hyd yn oed yn creu adrannau yno. Os ydych chi am ddilyn y “canon” neu “yn bennaf”, crëwch un rhaniad mawr, fel HDD.

HDD SATA

Nid oes angen dyfeisio dim byd arbennig yma. Byddwn yn creu un adran ar gyfer popeth. Byddwn yn creu rhaniad oherwydd bod y BIOS yn gweld y disgiau hyn ac efallai y bydd hyd yn oed yn ceisio cychwyn ohonynt. Byddwn hyd yn oed yn gosod GRUB ar y disgiau hyn yn ddiweddarach fel y gall y system wneud hyn yn sydyn.

#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

Dyma lle mae pethau'n dod yn ddiddorol i ni.

Yn gyntaf, mae ein gyriannau yn 2 TB o ran maint. Mae hyn o fewn yr ystod dderbyniol ar gyfer MBR, sef yr hyn y byddwn yn ei ddefnyddio. Os oes angen, gellir ei ddisodli gan GPT. Mae gan ddisgiau GPT haen gydnawsedd sy'n caniatáu i systemau sy'n gydnaws â MBR weld y 4 rhaniad cyntaf os ydynt wedi'u lleoli o fewn y 2 terabytes cyntaf. Y prif beth yw y dylai'r rhaniad cychwyn a'r rhaniad bios_grub ar y disgiau hyn fod ar y dechrau. Mae hyn hyd yn oed yn caniatáu ichi gychwyn o yriannau GPT Legacy/BIOS.

Ond nid dyma ein hachos ni.

Yma byddwn yn creu dwy adran. Bydd yr un cyntaf yn 1 GB o faint ac yn cael ei ddefnyddio ar gyfer RAID 1 /boot.

Bydd yr ail un yn cael ei ddefnyddio ar gyfer RAID 6 a bydd yn cymryd yr holl le rhydd sy'n weddill ac eithrio ardal fach heb ei neilltuo ar ddiwedd y dreif.

Beth yw'r maes hwn heb ei farcio?Yn ôl ffynonellau ar y rhwydwaith, mae gan ein SSDs SATA storfa SLC y gellir ei ehangu'n ddeinamig yn amrywio o ran maint o 6 i 78 gigabeit. Rydyn ni'n cael 6 gigabeit “am ddim” oherwydd y gwahaniaeth rhwng “gigabytes” a “gibibytes” yn nhaflen ddata'r gyriant. Mae'r 72 gigabeit sy'n weddill yn cael eu dyrannu o ofod nas defnyddir.

Yma dylid nodi bod gennym storfa SLC, ac mae'r gofod yn cael ei feddiannu yn y modd MLC 4 did. Sydd i ni yn golygu i bob pwrpas mai dim ond 4 gigabeit o storfa SLC y byddwn yn ei gael am bob 1 gigabeit o le am ddim.

Lluoswch 72 gigabeit â 4 a chael 288 gigabeit. Dyma'r gofod rhydd na fyddwn yn ei farcio er mwyn caniatáu i'r gyriannau wneud defnydd llawn o'r storfa SLC.

Felly, byddwn i bob pwrpas yn cael hyd at 312 gigabeit o storfa SLC o gyfanswm o chwe gyriant. O'r holl yriannau, bydd 2 yn cael eu defnyddio yn RAID ar gyfer dileu swyddi.

Bydd y swm hwn o storfa yn ein galluogi i ddod ar draws sefyllfa anaml iawn mewn bywyd go iawn lle nad yw ysgrifen yn mynd i'r storfa. Mae hyn yn gwneud iawn am yr anfantais tristaf o gof QLC - y cyflymder ysgrifennu hynod o isel pan fydd data'n cael ei ysgrifennu gan osgoi'r storfa. Os nad yw eich llwythi yn cyfateb i hyn, yna rwy'n argymell eich bod yn meddwl yn galed am ba mor hir y bydd eich SSD yn para o dan lwyth o'r fath, gan ystyried y TBW o'r daflen ddata.

#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

Creu Araeau

Yn gyntaf, mae angen inni ailenwi'r peiriant. Mae hyn yn angenrheidiol oherwydd bod yr enw gwesteiwr yn rhan o'r enw arae rhywle y tu mewn i mdadm ac yn effeithio ar rywbeth yn rhywle. Wrth gwrs, gellir ailenwi araeau yn ddiweddarach, ond mae hwn yn gam diangen.

#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

Pam - cymryd yn ganiataol-lanhau...?Er mwyn osgoi cychwyn araeau. Ar gyfer lefelau RAID 1 a 6 mae hyn yn ddilys. Gall popeth weithio heb gychwyn os yw'n gyfres newydd. Ar ben hynny, mae cychwyn yr arae SSD ar ôl ei greu yn wastraff adnoddau TBW. Rydym yn defnyddio TRIM/DISCARD lle bo modd ar araeau SSD sydd wedi'u cydosod i'w “cychwyn”.

Ar gyfer araeau SSD, cefnogir RAID 1 DISCARD allan o'r blwch.

Ar gyfer araeau DARPARU SSD RAID 6, rhaid i chi ei alluogi yn y paramedrau modiwl cnewyllyn.

Dim ond os oes gan bob SSD a ddefnyddir mewn araeau lefel 4/5/6 yn y system hon gefnogaeth weithredol ar gyfer discard_zeroes_data y dylid gwneud hyn. Weithiau byddwch chi'n dod ar draws gyriannau rhyfedd sy'n dweud wrth y cnewyllyn bod y swyddogaeth hon yn cael ei chefnogi, ond mewn gwirionedd nid yw yno, neu nid yw'r swyddogaeth bob amser yn gweithio. Ar hyn o bryd, mae cefnogaeth ar gael bron ym mhobman, fodd bynnag, mae hen yriannau a firmware gyda gwallau. Am y rheswm hwn, mae cymorth DISCARD wedi'i analluogi yn ddiofyn ar gyfer RAID 6.

Sylwch, bydd y gorchymyn canlynol yn dinistrio'r holl ddata ar yriannau NVMe trwy “gychwyn” yr arae gyda “sero”.

#blkdiscard /dev/md0

Os aiff rhywbeth o'i le, ceisiwch nodi cam.

#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

Pam mor fawr...?Mae cynyddu maint y talp yn cael effaith gadarnhaol ar gyflymder darllen ar hap mewn blociau hyd at faint talp cynhwysol. Mae hyn yn digwydd oherwydd gellir cwblhau un gweithrediad o'r maint priodol neu lai yn gyfan gwbl ar un ddyfais. Felly, mae'r IOPS o bob dyfais yn cael ei grynhoi. Yn ôl yr ystadegau, nid yw 99% o IO yn fwy na 512K.

RAID 6 IOPS fesul ysgrifennu bob amser llai na neu'n hafal i IOPS un gyriant. Pan, fel darlleniad ar hap, gall IOPS fod sawl gwaith yn fwy nag un gyriant, ac yma mae maint y bloc yn allweddol bwysig.
Nid yw'r awdur yn gweld y pwynt mewn ceisio optimeiddio paramedr sy'n ddrwg yn sgil-gynllunio RAID 6 ac yn hytrach yn gwneud y gorau o'r hyn y mae RAID 6 yn ei wneud yn dda.
Byddwn yn gwneud iawn am ysgrifennu gwael ar hap RAID 6 gyda storfa NVMe a thriciau darparu tenau.

Nid ydym eto wedi galluogi DATGELIAD ar gyfer RAID 6. Felly ni fyddwn yn “cychwyn” y casgliad hwn am y tro. Byddwn yn gwneud hyn yn ddiweddarach, ar ôl gosod yr OS.

HDD SATA

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

LVM ar NVMe RAID

Ar gyfer cyflymder, rydym am osod y system ffeiliau gwraidd ar NVMe RAID 1 sef /dev/md0.
Fodd bynnag, bydd angen yr amrywiaeth gyflym hon arnom o hyd ar gyfer anghenion eraill, megis cyfnewid, metadata a metadata LVM-cache a LVM-denau, felly byddwn yn creu VG LVM ar yr amrywiaeth hon.

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

Gadewch i ni greu rhaniad ar gyfer y system ffeiliau gwraidd.

#lvcreate -L 128G --name root root

Gadewch i ni greu rhaniad ar gyfer cyfnewid yn ôl maint yr RAM.

#lvcreate -L 32G --name swap root

gosod OS

Yn gyfan gwbl, mae gennym bopeth sydd ei angen i osod y system.

Lansiwch y dewin gosod system o amgylchedd Ubuntu Live. Gosodiad arferol. Dim ond ar y cam o ddewis disgiau i'w gosod, mae angen i chi nodi'r canlynol:

  • /dev/md1, - pwynt gosod / cist, FS - BTRFS
  • /dev/root/root (aka / dev/mapper/root-root), - pwynt gosod / (gwraidd), FS - BTRFS
  • /dev/root/swap (aka / dev/mapper/root-swap), - defnyddiwch fel rhaniad cyfnewid
  • Gosodwch y cychwynnydd ar /dev/sda

Pan fyddwch chi'n dewis BTRFS fel y system ffeiliau gwraidd, bydd y gosodwr yn creu dwy gyfrol BTRFS yn awtomatig o'r enw "@" ar gyfer / (root), a "@home" ar gyfer / home.

Gadewch i ni ddechrau'r gosodiad...

Bydd y gosodiad yn dod i ben gyda blwch deialog moddol yn nodi gwall wrth osod y cychwynnwr. Yn anffodus, ni fyddwch yn gallu gadael y dialog hwn gan ddefnyddio dulliau safonol a pharhau â'r gosodiad. Rydyn ni'n allgofnodi o'r system ac yn mewngofnodi eto, gan orffen mewn bwrdd gwaith glân Ubuntu Live. Agorwch y derfynell, ac eto:

#sudo bash

Creu amgylchedd croot i barhau â'r gosodiad:

#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

Gadewch i ni ffurfweddu'r rhwydwaith a'r enw gwesteiwr yn chroot:

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

Gadewch i ni fynd i mewn i'r amgylchedd chroot:

#chroot /mnt/chroot

Yn gyntaf oll, byddwn yn cyflwyno'r pecynnau:

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

Gadewch i ni wirio a thrwsio pob pecyn a osodwyd yn gam oherwydd gosodiad system anghyflawn:

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

Os nad yw rhywbeth yn gweithio allan, efallai y bydd angen i chi olygu /etc/apt/sources.list yn gyntaf

Gadewch i ni addasu'r paramedrau ar gyfer modiwl RAID 6 i alluogi TRIM/DISCARD:

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

Gadewch i ni newid ein haraeau ychydig:

#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

Beth oedd ei..?Rydym wedi creu set o reolau udev a fydd yn gwneud y canlynol:

  • Gosodwch faint y storfa bloc ar gyfer RAID 2020 i fod yn ddigonol ar gyfer 6. Mae'n ymddangos nad yw'r gwerth rhagosodedig wedi newid ers creu Linux, ac nid yw wedi bod yn ddigonol ers amser maith.
  • Cadw lleiafswm o IO am hyd y gwiriadau arae / cydamseriadau. Mae hyn er mwyn atal eich araeau rhag mynd yn sownd mewn cyflwr o gydamseru tragwyddol dan lwyth.
  • Cyfyngu ar yr IO uchaf yn ystod gwiriadau / cydamseru araeau. Mae hyn yn angenrheidiol fel nad yw cysoni / gwirio SSD RAIDs yn ffrio'ch gyriannau i grimp. Mae hyn yn arbennig o wir am NVMe. (Cofiwch am y rheiddiadur? Doeddwn i ddim yn cellwair.)
  • Gwahardd disgiau rhag atal cylchdroi gwerthyd (HDD) trwy APM a gosodwch y terfyn amser cysgu ar gyfer rheolwyr disg i 7 awr. Gallwch analluogi APM yn llwyr os gall eich gyriannau ei wneud (-B 255). Gyda'r gwerth diofyn, bydd y gyriannau'n stopio ar ôl pum eiliad. Yna mae'r OS eisiau ailosod y storfa ddisg, bydd y disgiau'n troelli eto, a bydd popeth yn dechrau eto. Mae gan ddisgiau uchafswm cyfyngedig o gylchdroadau gwerthyd. Gall cylch diofyn syml o'r fath ladd eich disgiau yn hawdd mewn cwpl o flynyddoedd. Nid yw pob disg yn dioddef o hyn, ond mae ein rhai ni yn rhai “gliniadur”, gyda'r gosodiadau diofyn priodol, sy'n gwneud i'r RAID edrych fel mini-MAID.
  • Gosod darllen ymlaen llaw ar ddisgiau (cylchdroi) 1 megabeit - dau floc yn olynol / talp RAID 6
  • Analluogi darllen ymlaen llaw ar yr araeau eu hunain.

Gadewch i ni olygu /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

Pam mae hynny..?Byddwn yn chwilio am y rhaniad /boot gan UUID. Yn ddamcaniaethol, gallai enwi arae newid.

Byddwn yn chwilio am yr adrannau sy'n weddill yn ôl enwau LVM yn y nodiant /dev/mapper/vg-lv, oherwydd maent yn nodi rhaniadau yn eithaf unigryw.

Nid ydym yn defnyddio UUID ar gyfer LVM oherwydd Gall yr UUID o gyfrolau LVM a'u cipluniau fod yr un peth.Mount /dev/mapper/root-root.. ddwywaith?Oes. Yn union. Nodwedd BTRFS. Gellir gosod y system ffeiliau hon sawl gwaith gyda gwahanol subvols.

Oherwydd yr un nodwedd hon, rwy'n argymell peidio byth â chreu cipluniau LVM o gyfeintiau gweithredol BTRFS. Efallai y cewch chi syndod pan fyddwch chi'n ailgychwyn.

Gadewch i ni adfywio'r ffurfwedd mdadm:

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

Gadewch i ni addasu'r gosodiadau 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

Beth oedd ei..?Rydym wedi galluogi ehangu pyllau tenau LVM yn awtomatig ar ôl cyrraedd 90% o'r gofod a feddiannir gan 5% o'r cyfaint.

Rydym wedi cynyddu'r nifer uchaf o flociau cache ar gyfer storfa LVM.

Rydym wedi atal LVM rhag chwilio am gyfeintiau LVM (PV) ar:

  • dyfeisiau sy'n cynnwys storfa LVM (cdata)
  • dyfeisiau wedi'u storio gan ddefnyddio storfa LVM, gan osgoi'r storfa ( _corig). Yn yr achos hwn, bydd y ddyfais cached ei hun yn dal i gael ei sganio trwy'r storfa (dim ond ).
  • dyfeisiau sy'n cynnwys metadata storfa LVM (cmeta)
  • pob dyfais yn VG gyda'r delweddau enw. Yma bydd gennym ddelweddau disg o beiriannau rhithwir, ac nid ydym am i LVM ar y gwesteiwr actifadu cyfrolau sy'n perthyn i'r OS gwadd.
  • pob dyfais yn VG gyda'r enw wrth gefn. Yma bydd gennym gopïau wrth gefn o ddelweddau peiriant rhithwir.
  • pob dyfais y mae ei henw yn gorffen gyda “gpv” (cyfaint corfforol gwestai)

Rydym wedi galluogi cefnogaeth DISCARD wrth ryddhau lle am ddim ar LVM VG. Byddwch yn ofalus. Bydd hyn yn cymryd llawer o amser i ddileu LVs ar yr SSD. Mae hyn yn arbennig o berthnasol i SSD RAID 6. Fodd bynnag, yn ôl y cynllun, byddwn yn defnyddio darpariaeth denau, felly ni fydd hyn yn ein rhwystro o gwbl.

Gadewch i ni ddiweddaru'r ddelwedd initramfs:

#update-initramfs -u -k all

Gosod a ffurfweddu grub:

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

Pa ddisgiau ddylech chi eu dewis?Pawb sy'n sd*. Rhaid i'r system allu cychwyn o unrhyw yriant SATA neu SSD sy'n gweithio.

Pam wnaethon nhw ychwanegu os-prober..?Am annibyniaeth gormodol a dwylo chwareus.

Nid yw'n gweithio'n gywir os yw un o'r RAIDs mewn cyflwr dirywiedig. Mae'n ceisio chwilio am yr OS ar raniadau a ddefnyddir mewn peiriannau rhithwir sy'n rhedeg ar y caledwedd hwn.

Os oes ei angen arnoch, gallwch ei adael, ond cofiwch bob un o'r uchod. Rwy'n argymell chwilio am ryseitiau ar gyfer cael gwared â dwylo drwg ar-lein.

Gyda hyn rydym wedi cwblhau'r gosodiad cychwynnol. Mae'n bryd ailgychwyn i'r OS sydd newydd ei osod. Peidiwch ag anghofio tynnu'r CD byw / USB y gellir ei gychwyn.

#exit
#reboot

Dewiswch unrhyw un o'r SSDs SATA fel y ddyfais cychwyn.

LVM ar SATA SSD

Ar y pwynt hwn, rydym eisoes wedi cychwyn ar yr OS newydd, wedi ffurfweddu'r rhwydwaith, yn addas, wedi agor yr efelychydd terfynell, ac wedi lansio:

#sudo bash

Gadewch i ni barhau.

“Cychwyn” yr arae o SATA SSD:

#blkdiscard /dev/md2

Os nad yw'n gweithio, yna ceisiwch:

#blkdiscard --step 65536 /dev/md2
Creu LVM VG ar SATA SSD:

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

Pam VG arall..?Mewn gwirionedd, mae gennym wreiddyn o'r enw VG eisoes. Beth am ychwanegu popeth mewn un VG?

Os oes sawl PV mewn VG, yna er mwyn i'r VG gael ei actifadu'n gywir, rhaid i bob PV fod yn bresennol (ar-lein). Yr eithriad yw LVM RAID, nad ydym yn ei ddefnyddio'n fwriadol.

Rydyn ni wir eisiau, os oes methiant (colli data darllen) ar unrhyw un o'r araeau RAID 6, bydd y system weithredu yn cychwyn fel arfer ac yn rhoi cyfle i ni ddatrys y broblem.

I wneud hyn, ar y lefel echdynnu gyntaf byddwn yn ynysu pob math o “gyfrwng” ffisegol yn VG ar wahân.

A siarad yn wyddonol, mae gwahanol araeau RAID yn perthyn i wahanol “barthau dibynadwyedd”. Ni ddylech greu pwynt methiant cyffredin ychwanegol ar eu cyfer trwy eu gwasgu i mewn i un VG.

Bydd presenoldeb LVM ar y lefel “caledwedd” yn caniatáu inni dorri darnau o wahanol araeau RAID yn fympwyol trwy eu cyfuno mewn gwahanol ffyrdd. Er enghraifft - rhedeg ar yr un pryd bcache + LVM tenau, bcache + BTRFS, LVM cache + LVM tenau, cyfluniad ZFS cymhleth gyda caches, neu unrhyw gymysgedd uffernol arall i geisio cymharu'r cyfan.

Ar y lefel “caledwedd”, ni fyddwn yn defnyddio unrhyw beth heblaw hen gyfeintiau LVM “trwchus” da. Efallai mai'r eithriad i'r rheol hon yw'r rhaniad wrth gefn.

Rwy'n meddwl erbyn hyn, roedd llawer o ddarllenwyr eisoes wedi dechrau amau ​​rhywbeth am y ddol nythu.

LVM ar SATA HDD

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

VG newydd eto..?Rydyn ni wir eisiau, os bydd yr arae disg y byddwn ni'n ei defnyddio ar gyfer copi wrth gefn o ddata yn methu, bydd ein system weithredu yn parhau i weithio'n normal, tra'n cynnal mynediad i ddata nad ydyn nhw wrth gefn fel arfer. Felly, er mwyn osgoi problemau actifadu VG, rydym yn creu VG ar wahân.

Sefydlu storfa LVM

Gadewch i ni greu LV ar NVMe RAID 1 i'w ddefnyddio fel dyfais caching.

#lvcreate -L 70871154688B --name cache root

Pam fod cyn lleied...?Y ffaith yw bod gan ein SSDs NVMe storfa SLC hefyd. 4 gigabeit o “am ddim” a 18 gigabeit o ddeinamig oherwydd y gofod rhydd a ddefnyddir yn yr MLC 3-did. Unwaith y bydd y storfa hon wedi dod i ben, ni fydd NVMe SSDs yn llawer cyflymach na'n SSD SATA gyda storfa. Mewn gwirionedd, am y rheswm hwn, nid yw'n gwneud unrhyw synnwyr i ni wneud y rhaniad storfa LVM yn llawer mwy na dwywaith maint storfa SLC y gyriant NVMe. Ar gyfer y gyriannau NVMe a ddefnyddir, mae'r awdur yn ystyried ei bod yn rhesymol gwneud 32-64 gigabeit o storfa.

Mae angen y maint rhaniad a roddir i drefnu 64 gigabeit o storfa, metadata cache, a metadata wrth gefn.

Yn ogystal, nodaf, ar ôl cau system fudr, y bydd LVM yn nodi bod y storfa gyfan yn fudr ac yn cydamseru eto. Ar ben hynny, bydd hyn yn cael ei ailadrodd bob tro y defnyddir lvchange ar y ddyfais hon nes bod y system yn ailgychwyn eto. Felly, rwy'n argymell ail-greu'r storfa ar unwaith gan ddefnyddio'r sgript briodol.

Gadewch i ni greu LV ar SATA RAID 6 i'w ddefnyddio fel dyfais wedi'i storio.

#lvcreate -L 3298543271936B --name cache data

Pam dim ond tri terabytes..?Felly, os oes angen, gallwch ddefnyddio SATA SSD RAID 6 ar gyfer rhai anghenion eraill. Gellir cynyddu maint y gofod storio yn ddeinamig, ar y hedfan, heb atal y system. I wneud hyn, mae angen i chi stopio ac ail-alluogi'r storfa dros dro, ond mantais nodedig LVM-cache drosodd, er enghraifft, bcache yw y gellir gwneud hyn ar y hedfan.

Gadewch i ni greu VG newydd ar gyfer caching.

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

Gadewch i ni greu LV ar y ddyfais cached.

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

Yma fe wnaethom ar unwaith gymryd yr holl le am ddim ar /dev/data/cache fel bod pob rhaniad angenrheidiol arall yn cael eu creu ar unwaith ar /dev/root/cache. Os gwnaethoch chi greu rhywbeth yn y lle anghywir, gallwch ei symud gan ddefnyddio pvmove.

Gadewch i ni greu a galluogi'r storfa:

#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

Pam talpiau o'r fath..?Trwy arbrofion ymarferol, roedd yr awdur yn gallu darganfod bod y canlyniad gorau yn cael ei gyflawni os yw maint y bloc cache LVM yn cyd-fynd â maint y bloc tenau LVM. Ar ben hynny, y lleiaf yw'r maint, y gorau y mae'r cyfluniad yn perfformio mewn recordiad ar hap.

64k yw'r maint bloc lleiaf a ganiateir ar gyfer LVM tenau.

Byddwch yn ofalus wrth ysgrifennu ..!Oes. Mae'r math hwn o storfa yn gohirio cydamseru ysgrifennu i'r ddyfais sydd wedi'i storio. Mae hyn yn golygu, os bydd y storfa'n cael ei cholli, efallai y byddwch chi'n colli data ar y ddyfais sydd wedi'i storio. Yn ddiweddarach, bydd yr awdur yn dweud wrthych pa fesurau, yn ogystal â NVMe RAID 1, y gellir eu cymryd i wneud iawn am y risg hon.

Dewiswyd y math hwn o storfa yn fwriadol i wneud iawn am berfformiad ysgrifennu ar hap gwael RAID 6.

Gadewch i ni wirio beth gawson ni:

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

Dim ond [cachedata_corig] ddylai gael ei leoli ar /dev/data/cache. Os oes rhywbeth o'i le, yna defnyddiwch pvmove.

Gallwch chi analluogi'r storfa os oes angen gydag un gorchymyn:

#lvconvert -y --uncache cache/cachedata

Gwneir hyn ar-lein. Bydd LVM yn syml yn cysoni'r storfa i ddisg, yn ei dynnu, ac yn ailenwi cachedata_corig yn ôl i cachedata.

Sefydlu LVM tenau

Gadewch i ni amcangyfrif yn fras faint o le sydd ei angen arnom ar gyfer metadata tenau 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"

Talgrynnu hyd at 4 gigabeit: 4294967296B

Lluoswch â dau ac ychwanegu 4194304B ar gyfer metadata LVM PV: 8594128896B
Gadewch i ni greu rhaniad ar wahân ar NVMe RAID 1 i osod metadata tenau LVM a'u copi wrth gefn arno:

#lvcreate -L 8594128896B --name images root

Am beth..?Yma efallai y bydd y cwestiwn yn codi: pam gosod metadata tenau LVM ar wahân os bydd yn dal i gael ei storio ar NVMe a bydd yn gweithio'n gyflym.

Er bod cyflymder yn bwysig yma, mae'n bell o'r prif reswm. Y peth yw bod y storfa yn bwynt o fethiant. Gallai rhywbeth ddigwydd iddo, ac os caiff metadata tenau LVM ei storio, bydd yn achosi i bopeth gael ei golli'n llwyr. Heb fetadata cyflawn, bydd bron yn amhosibl cydosod cyfeintiau tenau.

Trwy symud y metadata i gyfrol ar wahân nad yw'n cael ei storio, ond yn gyflym, rydym yn gwarantu diogelwch y metadata pe bai storfa'n cael ei cholli neu ei llygru. Yn yr achos hwn, bydd yr holl ddifrod a achosir gan golli cache yn cael ei leoleiddio y tu mewn i gyfeintiau tenau, a fydd yn symleiddio'r weithdrefn adennill trwy orchmynion maint. Gyda thebygolrwydd uchel, bydd yr iawndal hyn yn cael ei adfer gan ddefnyddio logiau FS.

Ar ben hynny, pe bai ciplun o gyfaint tenau wedi'i gymryd yn flaenorol, ac ar ôl hynny roedd y storfa wedi'i gydamseru'n llawn o leiaf unwaith, yna, oherwydd dyluniad mewnol LVM tenau, bydd uniondeb y ciplun yn cael ei warantu pe bai storfa'n cael ei cholli. .

Gadewch i ni greu VG newydd a fydd yn gyfrifol am ddarpariaeth denau:

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

Gadewch i ni greu pwll:

#lvcreate -L 274877906944B --poolmetadataspare y --poolmetadatasize 4294967296B --chunksize 64k -Z y -T images/thin-pool
Pam -Z yYn ogystal â'r hyn y mae'r modd hwn wedi'i fwriadu ar ei gyfer mewn gwirionedd - i atal data o un peiriant rhithwir rhag gollwng i beiriant rhithwir arall wrth ailddosbarthu gofod - defnyddir sero hefyd i gynyddu cyflymder ysgrifennu ar hap mewn blociau llai na 64k. Bydd unrhyw ysgrifennu llai na 64k i ardal nas dyrannwyd yn flaenorol o'r gyfrol denau yn dod yn 64K ymyl-alinio yn y storfa. Bydd hyn yn caniatáu i'r llawdriniaeth gael ei chyflawni'n gyfan gwbl trwy'r storfa, gan osgoi'r ddyfais sydd wedi'i storio.

Gadewch i ni symud y LVs i'r PVs cyfatebol:

#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

Gadewch i ni wirio:

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

Gadewch i ni greu cyfaint tenau ar gyfer profion:

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

Byddwn yn gosod pecynnau ar gyfer profion a monitro:

#apt-get install sysstat fio

Dyma sut y gallwch chi arsylwi ymddygiad ein cyfluniad storio mewn amser real:

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

Dyma sut y gallwn brofi ein cyfluniad:

#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

Yn ofalus! Adnodd!Bydd y cod hwn yn rhedeg 36 prawf gwahanol, pob un yn rhedeg am 4 eiliad. Mae hanner y profion ar gyfer cofnodi. Gallwch chi recordio llawer ar NVMe mewn 4 eiliad. Hyd at 3 gigabeit yr eiliad. Felly, gall pob rhediad o brofion ysgrifennu fwyta hyd at 216 gigabeit o adnodd SSD gennych chi.

Darllen ac ysgrifennu yn gymysg?Oes. Mae'n gwneud synnwyr i redeg y profion darllen ac ysgrifennu ar wahân. Ar ben hynny, mae'n gwneud synnwyr i sicrhau bod yr holl caches yn cael eu cysoni fel nad yw ysgrifen a wnaed yn flaenorol yn effeithio ar y darlleniad.

Bydd y canlyniadau'n amrywio'n fawr yn ystod y lansiad cyntaf a'r rhai dilynol wrth i'r storfa a'r cyfaint tenau lenwi, a hefyd yn dibynnu a lwyddodd y system i gydamseru'r caches a lenwyd yn ystod y lansiad diwethaf.

Ymhlith pethau eraill, rwy'n argymell mesur y cyflymder ar gyfaint tenau sydd eisoes yn llawn y cymerwyd ciplun ohoni. Cafodd yr awdur gyfle i arsylwi sut mae ysgrifennu ar hap yn cyflymu'n sydyn yn syth ar ôl creu'r ciplun cyntaf, yn enwedig pan nad yw'r storfa'n gwbl lawn eto. Mae hyn yn digwydd oherwydd semanteg ysgrifennu copi-ar-ysgrifennu, aliniad storfa a blociau cyfaint tenau, a'r ffaith bod ysgrifen ar hap i RAID 6 yn troi'n ddarlleniad ar hap o RAID 6 ac yna ysgrifennu i'r storfa. Yn ein cyfluniad, mae darllen ar hap o RAID 6 hyd at 6 gwaith (nifer yr SSDs SATA yn yr arae) yn gyflymach nag ysgrifennu. Achos mae blociau ar gyfer CoW yn cael eu dyrannu'n ddilyniannol o bwll tenau, yna mae'r recordiad, ar y cyfan, hefyd yn troi'n ddilyniannol.

Gellir defnyddio'r ddwy nodwedd hyn er mantais i chi.

Cipluniau “cydlynol” o'r storfa

Er mwyn lleihau'r risg o golli data rhag ofn y bydd difrod/colled celc, mae'r awdur yn cynnig cyflwyno'r arfer o gylchdroi cipluniau i warantu eu cywirdeb yn yr achos hwn.

Yn gyntaf, oherwydd bod metadata cyfaint tenau yn byw ar ddyfais heb ei storio, bydd y metadata yn gyson a bydd colledion posibl yn cael eu hynysu o fewn blociau data.

Mae'r cylch cylchdroi ciplun canlynol yn gwarantu cywirdeb y data y tu mewn i'r cipluniau rhag ofn y bydd storfa'n cael ei cholli:

  1. Ar gyfer pob cyfrol denau gyda'r enw <enw>, crëwch giplun gyda'r enw <enw>.cached
  2. Gadewch i ni osod y trothwy mudo i werth rhesymol uchel: #lvchange --quiet --cachesettings "migration_threshold=16384" cache/cachedata
  3. Yn y ddolen rydym yn gwirio nifer y blociau budr yn y storfa: #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' nes i ni gael sero. Os yw'r sero ar goll yn rhy hir, gellir ei greu trwy newid y storfa dros dro i'r modd ysgrifennu trwodd. Fodd bynnag, gan ystyried nodweddion cyflymder ein haraeau SATA a NVMe SSD, yn ogystal â'u hadnodd TBW, byddwch naill ai'n gallu dal y foment yn gyflym heb newid y modd storfa, neu bydd eich caledwedd yn bwyta ei adnodd cyfan yn llwyr. ychydig ddyddiau. Oherwydd cyfyngiadau adnoddau, nid yw'r system, mewn egwyddor, yn gallu bod o dan 100% o lwyth ysgrifennu drwy'r amser. Bydd ein SSDs NVMe o dan lwyth ysgrifennu 100% yn disbyddu'r adnodd yn llwyr Diwrnodau 3-4. Dim ond dwywaith y bydd SSDs SATA yn para. Felly, byddwn yn tybio bod y rhan fwyaf o'r llwyth yn mynd i ddarllen, ac mae gennym gyfnodau cymharol fyr o weithgarwch hynod o uchel ynghyd â llwyth isel ar gyfartaledd ar gyfer ysgrifennu.
  4. Cyn gynted ag y gwnaethom ddal (neu wneud) sero, rydym yn ailenwi <enw>.cached i <enw>.committed. Mae'r hen <enw>.committed yn cael ei ddileu.
  5. Yn ddewisol, os yw'r storfa yn 100% yn llawn, gellir ei ail-greu trwy sgript, a thrwy hynny ei glirio. Gyda storfa hanner gwag, mae'r system yn gweithio'n llawer cyflymach wrth ysgrifennu.
  6. Gosodwch y trothwy mudo i sero: #lvchange --quiet --cachesettings "migration_threshold=0" cache/cachedata Bydd hyn yn atal y storfa rhag cydamseru â'r prif gyfryngau dros dro.
  7. Rydym yn aros nes bod cryn dipyn o newidiadau yn cronni yn y storfa #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' neu bydd yr amserydd yn diffodd.
  8. Rydyn ni'n ailadrodd eto.

Pam anawsterau gyda'r trothwy mudo...?Y peth yw nad yw recordiad “ar hap” mewn gwirionedd yn gwbl ar hap. Pe baem yn ysgrifennu rhywbeth at sector o 4 cilobeit o ran maint, mae'n debygol iawn y bydd cofnod yn cael ei wneud i'r un sectorau neu i un o'r sectorau cyfagos (+- 32K) yn ystod yr ychydig funudau nesaf.

Trwy osod y trothwy mudo i sero, rydym yn gohirio cydamseru ysgrifennu ar yr SSD SATA ac yn agregu sawl newid i un bloc 64K yn y storfa. Mae hyn yn arbed adnodd SATA SSD yn sylweddol.

Ble mae'r cod..?Yn anffodus, nid yw'r awdur yn ystyried ei hun yn ddigon cymwys yn natblygiad sgriptiau bash oherwydd ei fod yn hunan-ddysgedig 100% ac yn ymarfer datblygiad a yrrir gan “Google”, felly mae'n credu na ddylai unrhyw un ddefnyddio'r cod ofnadwy sy'n dod allan o'i ddwylo. arall.

Credaf y bydd gweithwyr proffesiynol yn y maes hwn yn gallu darlunio'n annibynnol yr holl resymeg a ddisgrifir uchod, os oes angen, ac, efallai, hyd yn oed yn ei ddylunio'n hyfryd fel gwasanaeth systemd, fel y ceisiodd yr awdur ei wneud.

Bydd cynllun cylchdroi ciplun mor syml yn caniatáu inni nid yn unig gael un ciplun wedi'i gydamseru'n llawn ar yr SSD SATA, ond bydd hefyd yn caniatáu inni, gan ddefnyddio'r cyfleustodau thin_delta, ddarganfod pa flociau a newidiwyd ar ôl ei greu, a thrwy hynny leoleiddio difrod ar y prif gyfrolau, gan symleiddio adferiad yn fawr.

TRIM/GWARED yn libvirt/KVM

Achos bydd y storfa ddata yn cael ei ddefnyddio ar gyfer KVM yn rhedeg libvirt, yna byddai'n syniad da addysgu ein VMs nid yn unig i gymryd lle rhydd, ond hefyd i ryddhau'r hyn nad oes ei angen mwyach.

Gwneir hyn trwy efelychu cefnogaeth TRIM/DISCARD ar ddisgiau rhithwir. I wneud hyn, mae angen i chi newid y math rheolydd i virtio-scsi a golygu'r 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>

Mae LVM o'r fath yn cael ei brosesu'n gywir gan LVM, ac mae blociau'n cael eu rhyddhau'n gywir yn y storfa ac yn y pwll tenau. Yn ein hachos ni, mae hyn yn digwydd yn bennaf mewn modd gohiriedig, wrth ddileu'r ciplun nesaf.

BTRFS wrth gefn

Defnyddiwch sgriptiau parod gyda eithafol pwyll a ar eich menter eich hun. Ysgrifennodd yr awdur y cod hwn iddo'i hun ac iddo'i hun yn unig. Rwy'n siŵr bod gan lawer o ddefnyddwyr Linux profiadol offer tebyg, ac nid oes angen copïo rhai rhywun arall.

Gadewch i ni greu cyfrol ar y ddyfais wrth gefn:

#lvcreate -L 256G --name backup backup

Gadewch i ni ei fformatio yn BTRFS:

#mkfs.btrfs /dev/backup/backup

Gadewch i ni greu pwyntiau gosod a gosod is-adrannau gwraidd y system ffeiliau:

#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

Gadewch i ni greu cyfeiriaduron ar gyfer copïau wrth gefn:

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

Gadewch i ni greu cyfeiriadur ar gyfer sgriptiau wrth gefn:

#mkdir /root/btrfs-backup

Gadewch i ni gopïo'r sgript:

Llawer o god bash brawychus. Defnyddiwch ar eich menter eich hun. Peidiwch ag ysgrifennu llythyrau dig at yr awdur...#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

Beth mae hyd yn oed yn ei wneud ..?Yn cynnwys set o orchmynion syml ar gyfer creu cipluniau BTRFS a'u copïo i FS arall gan ddefnyddio anfon / derbyn BTRFS.

Gall y lansiad cyntaf fod yn gymharol hir, oherwydd ... Ar y dechrau, bydd yr holl ddata yn cael ei gopïo. Bydd lansiadau pellach yn gyflym iawn, oherwydd ... Dim ond newidiadau fydd yn cael eu copïo.

Sgript arall y byddwn yn ei rhoi yn cron:

Rhai cod bash mwy#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

Beth mae'n ei wneud..?Yn creu ac yn cydamseru cipluniau cynyddrannol o'r cyfrolau BTRFS rhestredig ar yr FS wrth gefn. Ar ôl hyn, mae'n dileu'r holl luniau a grëwyd 60 diwrnod yn ôl. Ar ôl ei lansio, bydd cipluniau dyddiedig o'r cyfrolau a restrir yn ymddangos yn y /backup/btrfs/back/remote/ subdirectories.

Gadewch i ni roi hawliau gweithredu'r cod:

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

Gadewch i ni ei wirio a'i roi yn y 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 copi wrth gefn tenau

Gadewch i ni greu pwll tenau ar y ddyfais wrth gefn:

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

Gadewch i ni osod ddrescue, oherwydd ... bydd sgriptiau'n defnyddio'r offeryn hwn:

#apt-get install gddrescue

Gadewch i ni greu cyfeiriadur ar gyfer sgriptiau:

#mkdir /root/lvm-thin-backup

Gadewch i ni gopïo'r sgriptiau:

Llawer o bash y tu mewn ...#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

Beth mae'n ei wneud...?Yn cynnwys set o orchmynion ar gyfer trin cipluniau tenau a chydamseru'r gwahaniaeth rhwng dau giplun tenau a dderbynnir trwy thin_delta i ddyfais bloc arall gan ddefnyddio ddrescue a blkdiscard.

Sgript arall y byddwn yn ei rhoi yn cron:

Ychydig mwy o 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

Beth mae'n ei wneud...?Yn defnyddio'r sgript flaenorol i greu a chydamseru copïau wrth gefn o'r cyfrolau tenau a restrir. Bydd y sgript yn gadael cipluniau anweithredol o'r cyfrolau a restrir, sydd eu hangen i olrhain newidiadau ers y cydamseriad diwethaf.

Rhaid golygu'r sgript hon, gan nodi'r rhestr o gyfrolau tenau y dylid gwneud copïau wrth gefn ar eu cyfer. Mae'r enwau a roddir at ddibenion enghreifftiol yn unig. Os dymunwch, gallwch ysgrifennu sgript a fydd yn cydamseru pob cyfrol.

Gadewch i ni roi'r hawliau:

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

Gadewch i ni ei wirio a'i roi yn y 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

Bydd y lansiad cyntaf yn hir, oherwydd ... bydd cyfeintiau tenau yn cael eu cydamseru'n llawn trwy gopïo'r holl ofod a ddefnyddiwyd. Diolch i fetadata tenau LVM, rydym yn gwybod pa flociau sy'n cael eu defnyddio mewn gwirionedd, felly dim ond blociau cyfaint tenau a ddefnyddir mewn gwirionedd fydd yn cael eu copïo.

Bydd rhediadau dilynol yn copïo'r data yn gynyddrannol diolch i olrhain newid trwy fetadata tenau LVM.

Gawn ni weld beth ddigwyddodd:

#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

Beth sydd a wnelo hyn â doliau nythu?

Yn fwyaf tebygol, o ystyried y gall cyfrolau rhesymegol LVM LV fod yn gyfeintiau corfforol LVM PV ar gyfer VGs eraill. Gall LVM fod yn ailadroddus, fel doliau nythu. Mae hyn yn rhoi hyblygrwydd eithafol i LVM.

PS

Yn yr erthygl nesaf, byddwn yn ceisio defnyddio sawl system storio symudol debyg / KVM fel sail ar gyfer creu clwstwr storio / vm geo-ddosbarthedig gyda diswyddiad ar sawl cyfandir gan ddefnyddio byrddau gwaith cartref, y Rhyngrwyd cartref a rhwydweithiau P2P.

Ffynhonnell: hab.com

Ychwanegu sylw