Ki sa LVM ak Matryoshka gen an komen?

Bon jou.
Mwen ta renmen pataje ak kominote a eksperyans pratik mwen nan bati yon sistèm depo done pou KVM lè l sèvi avèk md RAID + LVM.

Pwogram nan ap gen ladan:

  • Building md RAID 1 soti nan NVMe SSD.
  • Asanble md RAID 6 soti nan SATA SSD ak kondui regilye.
  • Karakteristik operasyon TRIM/DISCARD sou SSD RAID 1/6.
  • Kreye yon etalaj md RAID demaraj 1/6 sou yon seri disk komen.
  • Enstale sistèm lan sou NVMe RAID 1 lè pa gen okenn sipò NVMe nan BIOS la.
  • Sèvi ak LVM kachèt ak LVM mens.
  • Sèvi ak snapshots BTRFS epi voye/resevwa pou backup.
  • Sèvi ak LVM snapshots mens ak thin_delta pou sovgad style BTRFS.

Si w enterese, tanpri gade chat.

Deklarasyon

Otè a pa gen okenn responsablite pou konsekans lè w sèvi ak oswa pa itilize materyèl / egzanp / kòd / konsèy / done ki soti nan atik sa a. Lè w li oswa itilize materyèl sa a nenpòt fason, ou asime responsablite pou tout konsekans aksyon sa yo. Konsekans posib yo enkli:

  • Kwik-fri SSD NVMe.
  • Konplètman itilize resous anrejistreman ak echèk nan kondui SSD.
  • Konplete pèt tout done sou tout kondui, ki gen ladan kopi backup.
  • Defo pyès ki nan konpitè konpitè.
  • Pèdi tan, nè ak lajan.
  • Nenpòt lòt konsekans ki pa nan lis pi wo a.

Iron

Disponib yo te:

Plak mèr soti alantou 2013 ak chipset Z87, konplè ak Intel Core i7 / Haswell.

  • Processeur 4 nwayo, 8 fil
  • 32 GB DDR3 RAM
  • 1 x 16 oswa 2 x 8 PCIe 3.0
  • 1 x 4 + 1 x 1 PCIe 2.0
  • 6 x 6 GBps SATA 3 konektè

SAS adaptè LSI SAS9211-8I te klere nan mòd IT / HBA. Firmware ki pèmèt RAID yo te espre ranplase ak firmwèr HBA pou:

  1. Ou ta ka jete adaptè sa a nenpòt ki lè epi ranplase li ak nenpòt lòt ou te rankontre.
  2. TRIM/Discard te travay nòmalman sou disk, paske... nan firmwèr RAID kòmandman sa yo pa sipòte ditou, ak HBA a, an jeneral, pa pran swen ki kòmandman yo transmèt sou bis la.

Diskè difisil - 8 moso HGST Travelstar 7K1000 ak yon kapasite de 1 TB nan yon faktè fòm 2.5, menm jan pou laptops. Kondwi sa yo te deja nan yon etalaj RAID 6. Yo pral gen tou yon itilizasyon nan nouvo sistèm nan. Pou estoke sovgad lokal yo.

Anplis de sa te ajoute:

6 moso SATA SSD modèl Samsung 860 QVO 2TB. SSD sa yo te mande yon gwo volim, prezans nan yon kachèt SLC, fyab, ak yon pri ki ba yo te vle. Sipò pou jete / zewo te obligatwa, ki se tcheke pa liy ki nan dmesg:

kernel: ata1.00: Enabling discard_zeroes_data

2 moso NVMe SSD modèl Samsung SSD 970 EVO 500GB.

Pou SSD sa yo, vitès lekti/ekri o aza ak kapasite resous pou bezwen ou yo enpòtan. Radyatè pou yo. Nesesèman. Absoliman. Sinon, fri yo jiskaske yo vin kroustiyan pandan premye senkronizasyon RAID la.

Adaptè StarTech PEX8M2E2 pou 2 x NVMe SSD enstale nan plas PCIe 3.0 8x. Sa a, ankò, se jis yon HBA, men pou NVMe. Li diferan de adaptè bon mache paske li pa mande pou sipò PCIe bifurcation soti nan mèr la akòz prezans nan yon switch PCIe entegre. Li pral travay menm nan sistèm ki pi ansyen ak PCIe, menm si li se yon plas x1 PCIe 1.0. Natirèlman, nan vitès ki apwopriye a. Pa gen okenn RAID la. Pa gen okenn BIOS entegre sou tablo. Se konsa, sistèm ou a pa pral maji aprann demare ak NVMe, anpil mwens fè NVMe RAID gras a aparèy sa a.

Eleman sa a te sèlman akòz prezans nan yon sèl gratis 8x PCIe 3.0 nan sistèm nan, epi, si gen 2 fant gratis, li ka fasil ranplase ak de pyès lajan PEX4M2E1 oswa analogue, ki ka achte nenpòt kote nan yon pri 600. rubles.

Rejè a nan tout kalite pyès ki nan konpitè oswa bati-an chipset / BIOS RAID te fè espre, yo nan lòd yo kapab konplètman ranplase sistèm nan tout antye, ak eksepsyon nan SSD / HDD yo tèt yo, pandan y ap konsève tout done yo. Idealman, pou ou ka sove menm sistèm opere enstale a lè w ap deplase nan pyès ki nan konpitè konplètman nouvo/diferan. Bagay pwensipal lan se ke gen pò SATA ak PCIe. Se tankou yon CD ap viv oswa yon kondwi flash demaraj, sèlman trè vit ak yon ti kras ankonbran.

ImèSinon, ou konnen sa k ap pase - pafwa ou ijan bezwen pran tout etalaj la avèk ou pou pran. Men, mwen pa vle pèdi done. Pou fè sa, tout medya mansyone yo fasilman sitiye sou glisad yo nan 5.25 bè yo nan ka a estanda.

Oke, epi, nan kou, pou fè eksperyans ak diferan metòd pou SSD kachèt nan Linux.

Ravaj pyès ki nan konpitè yo raz. Limen li. Li swa travay oswa li pa fè sa. Ak mdadm toujou genyen opsyon.

Mou

Précédemment, Debian 8 Jessie te enstale sou pyès ki nan konpitè, ki se tou pre EOL. RAID 6 te rasanble soti nan HDDs mansyone anwo yo asosye ak LVM. Li te kouri machin vityèl nan kvm/libvirt.

Paske Otè a gen eksperyans apwopriye nan kreye pòtab demaraj SATA / NVMe kondui flash, epi tou, yo nan lòd yo pa kraze modèl la abityèl apwopriye, Ubuntu 18.04 te chwazi kòm sistèm nan sib, ki te deja ase estabilize, men li toujou gen 3 ane nan sipò nan tan kap vini an.

Sistèm mansyone a gen tout chofè pyès ki nan konpitè nou bezwen soti nan bwat la. Nou pa bezwen okenn lojisyèl oswa chofè twazyèm pati.

Prepare pou enstalasyon

Pou enstale sistèm nan nou bezwen Ubuntu Desktop Imaj. Sistèm sèvè a gen kèk kalite enstalasyon wòdpòte, ki montre twòp endepandans ki pa ka enfim lè yo mete patisyon sistèm UEFI a sou youn nan disk yo, sa ki gate tout bote a. An konsekans, li enstale sèlman nan mòd UEFI. Pa ofri okenn opsyon.

Nou pa kontan ak sa.

Poukisa?Malerezman, bòt UEFI trè mal konpatib ak RAID lojisyèl bòt, paske... Pèsonn pa ofri nou rezèvasyon pou patisyon UEFI ESP la. Gen resèt sou entènèt ki sijere mete patisyon ESP a sou yon kondwi flash nan yon pò USB, men sa a se yon pwen echèk. Gen resèt lè l sèvi avèk lojisyèl mdadm RAID 1 ak metadata vèsyon 0.9 ki pa anpeche UEFI BIOS la wè patisyon sa a, men sa a ap viv jouk moman sa a kontan lè BIOS la oswa yon lòt sistèm eksplwatasyon pyès ki nan konpitè ekri yon bagay nan ESP a epi bliye senkronize li ak lòt. miwa.

Anplis de sa, UEFI bòt depann sou NVRAM, ki pa pral deplase ansanm ak disk yo nan nouvo sistèm nan, paske se yon pati nan mèr la.

Se konsa, nou pa pral reenvante yon nouvo wou. Nou deja gen yon bisiklèt granpapa pare, ki teste tan, kounye a yo rele Legacy/BIOS boot, ki pote non an fyè nan CSM sou sistèm UEFI-konpatib. Nou pral jis retire li sou etajè a, wile li, ponpe kawotchou yo epi siye li ak yon twal mouye.

Vèsyon Desktop Ubuntu tou pa ka enstale byen ak bootloader Legacy, men isit la, jan yo di, omwen gen opsyon.

Se konsa, nou kolekte kenkayri a epi chaje sistèm nan soti nan Ubuntu Live demaraj flash kondwi a. Nou pral bezwen telechaje pakè, kidonk nou pral mete kanpe rezo ki travay pou ou. Si li pa travay, ou ka chaje pakè ki nesesè yo sou yon kondwi flash davans.

Nou ale nan anviwònman Desktop la, lanse Emulation tèminal la, epi nou ale:

#sudo bash

Ki jan...?Liy ki anwo a se deklanche kanonik pou holiwars sou sudo. C bоpi gwo opòtinite vini akоpi gwo responsablite. Kesyon an se si ou ka pran li sou tèt ou. Anpil moun panse ke lè l sèvi avèk sudo nan fason sa a omwen pa fè atansyon. Sepandan:

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

Poukisa pas ZFS...?Lè nou enstale lojisyèl sou òdinatè nou an, nou esansyèlman prete kenkayri nou an bay devlopè lojisyèl sa a pou kondwi.
Lè nou fè konfyans lojisyèl sa a ak sekirite done nou yo, nou pran yon prè ki egal a pri a nan restorasyon done sa yo, ke nou pral oblije peye yon jou.

Soti nan pwen de vi sa a, ZFS se yon Ferrari, ak mdadm + lvm se plis tankou yon bisiklèt.

Subjektif, otè a pito prete yon bisiklèt sou kredi bay moun enkoni olye pou yo yon Ferrari. Gen, pri a nan pwoblèm nan se pa wo. Pa bezwen dwa. Pi senp pase règ trafik yo. Espas pou gratis. Kapasite kwa-peyi se pi bon. Ou ka toujou tache pye nan yon bisiklèt, epi ou ka repare yon bisiklèt ak pwòp men ou.

Poukisa lè sa a BTRFS...?Pou demare sistèm operasyon an, nou bezwen yon sistèm fichye ki sipòte nan Legacy/BIOS GRUB soti nan bwat la, epi an menm tan an sipòte snapshots vivan. Nou pral sèvi ak li pou patisyon /boot la. Anplis de sa, otè a pito sèvi ak FS sa a pou / (rasin), pa bliye sonje ke pou nenpòt lòt lojisyèl ou ka kreye patisyon separe sou LVM epi monte yo nan repèrtwar ki nesesè yo.

Nou p ap estoke okenn imaj machin vityèl oswa baz done sou FS sa a.
FS sa a pral sèlman itilize pou kreye snapshots nan sistèm nan san yo pa fèmen l 'ak Lè sa a, transfere snapshots sa yo nan yon disk backup lè l sèvi avèk voye / resevwa.

Anplis de sa, otè a jeneralman prefere kenbe yon minimòm de lojisyèl dirèkteman sou pyès ki nan konpitè epi kouri tout lòt lojisyèl an nan machin vityèl lè l sèvi avèk bagay tankou voye GPU ak PCI-USB Host contrôleur nan KVM atravè IOMMU.

Sèl bagay ki rete sou pyès ki nan konpitè yo se depo done, Virtualization ak backup.

Si ou fè plis konfyans ZFS, lè sa a, nan prensip, pou aplikasyon an espesifye yo ka ranplase.

Sepandan, otè a fè espre inyore karakteristik yo ki entegre mirwar / RAID ak redondance ke ZFS, BRTFS ak LVM genyen.

Kòm yon agiman adisyonèl, BTRFS gen kapasite nan vire ekri o aza nan sekans, ki gen yon efè trè pozitif sou vitès la nan senkronize snapshots / sovgad sou HDD la.

Ann re-eskane tout aparèy:

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

Ann pran yon gade alantou:

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

NVMe SSD

Men, nou p ap make yo nan okenn fason. Menm jan an tou, BIOS nou an pa wè kondui sa yo. Se konsa, yo pral ale antyèman nan lojisyèl RAID. Nou p ap menm kreye seksyon la. Si ou vle swiv "kanon" oswa "principalman", kreye yon gwo patisyon, tankou yon HDD.

SATA HDD

Pa gen okenn nesesite envante anyen espesyal isit la. Nou pral kreye yon seksyon pou tout bagay. Nou pral kreye yon patisyon paske BIOS la wè disk sa yo epi li ka menm eseye demare soti nan yo. Nou pral menm enstale GRUB sou disk sa yo pita pou sistèm nan ka toudenkou fè sa.

#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

Sa a se kote bagay yo vin enteresan pou nou.

Premyèman, kondui nou yo gen 2 TB nan gwosè. Sa a se nan seri a akseptab pou MBR, ki se sa nou pral itilize. Si sa nesesè, yo ka ranplase ak GPT. Disk GPT yo gen yon kouch konpatibilite ki pèmèt sistèm konpatib MBR yo wè 4 premye patisyon yo si yo sitiye nan 2 premye teraocte yo. Bagay pwensipal lan se ke patisyon an bòt ak patisyon bios_grub sou disk sa yo ta dwe nan kòmansman an. Sa a menm pèmèt ou bòt soti nan kondui GPT Legacy / BIOS.

Men, sa a se pa ka nou an.

Isit la nou pral kreye de seksyon. Premye a pral 1 GB nan gwosè ak itilize pou ATAK 1 / bòt.

Dezyèm lan pral itilize pou RAID 6 epi li pral pran tout espas gratis ki rete a eksepte yon ti zòn ki pa alokasyon nan fen kondwi a.

Ki zòn sa a ki pa make?Dapre sous sou rezo a, SSD SATA nou yo gen sou tablo yon kachèt SLC dinamik dilatabl ki varye nan gwosè soti nan 6 a 78 jigokte. Nou jwenn 6 gigabytes "gratis" akòz diferans ki genyen ant "gigabytes" ak "gibibytes" nan fèy done kondwi a. 72 jigokte ki rete yo resevwa lajan nan espas ki pa itilize yo.

Isit la li ta dwe remake ke nou gen yon kachèt SLC, ak espas ki la okipe nan mòd 4 ti jan MLC. Ki pou nou efektivman vle di ke pou chak 4 gigaocte espas lib nou pral sèlman jwenn 1 gigabyte nan kachèt SLC.

Miltipliye 72 jigokte pa 4 epi jwenn 288 jigokte. Sa a se espas gratis ke nou pa pral make soti nan lòd yo pèmèt kondui yo fè tout itilizasyon kachèt SLC la.

Kidonk, nou pral efektivman jwenn jiska 312 gigabyte nan kachèt SLC soti nan yon total de sis kondui. Nan tout kondui yo, 2 yo pral itilize nan RAID pou redondance.

Kantite kachèt sa a pral pèmèt nou trè raman nan lavi reyèl rankontre yon sitiyasyon kote yon ekri pa ale nan kachèt la. Sa a trè byen konpanse pou dezavantaj ki pi tris nan memwa QLC - vitès la ekri ki ba anpil lè done yo ekri kontoune kachèt la. Si chaj ou yo pa koresponn ak sa a, Lè sa a, mwen rekòmande ke ou reflechi byen sou konbyen tan SSD ou a pral dire anba yon chaj konsa, pran an kont TBW ki soti nan fèy done a.

#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

Kreye etalaj

Premyèman, nou bezwen chanje non machin nan. Sa nesesè paske non lame a se yon pati nan non etalaj la yon kote andedan mdadm epi li afekte yon bagay yon kote. Natirèlman, etalaj yo ka chanje non pita, men sa a se yon etap nesesè.

#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

Poukisa -sipoze-pwòp...?Pou evite inisyalize etalaj. Pou tou de nivo RAID 1 ak 6 sa a valab. Tout bagay ka travay san inisyalizasyon si li se yon nouvo etalaj. Anplis, inisyalize etalaj SSD la sou kreyasyon an se yon fatra nan resous TBW. Nou itilize TRIM/DISCARD kote sa posib sou etalaj SSD reyini pou "inisyalize" yo.

Pou etalaj SSD, RAID 1 DISCARD sipòte soti nan bwat la.

Pou etalaj SSD RAID 6 DISCARD, ou dwe aktive li nan paramèt modil nwayo yo.

Sa a ta dwe fèt sèlman si tout SSD yo itilize nan etalaj nivo 4/5/6 nan sistèm sa a gen sipò k ap travay pou discard_zeroes_data. Pafwa ou tonbe sou kondui etranj ki di nwayo a ke fonksyon sa a sipòte, men an reyalite li pa la, oswa fonksyon an pa toujou travay. Nan moman sa a, sipò disponib prèske tout kote, sepandan, gen ansyen kondui ak firmwèr ki gen erè. Pou rezon sa a, sipò DISCARD enfim pa default pou RAID 6.

Atansyon, lòd sa a pral detwi tout done sou kondui NVMe pa "inisyalize" etalaj la ak "zewo".

#blkdiscard /dev/md0

Si yon bagay ale mal, eseye espesifye yon etap.

#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

Poukisa tèlman gwo...?Ogmante gwosè moso a gen yon efè pozitif sou vitès lekti o aza nan blòk jiska gwosè moso enklizif. Sa rive paske yon operasyon nan gwosè apwopriye a oswa pi piti ka ranpli antyèman sou yon sèl aparèy. Se poutèt sa, IOPS ki soti nan tout aparèy yo adisyone. Dapre estatistik, 99% nan IO pa depase 512K.

RAID 6 IOPS pou chak ekri toujou mwens pase oswa egal a IOPS yo nan yon sèl kondwi. Lè, kòm yon lekti o aza, IOPS ka plizyè fwa pi gran pase sa yo ki nan yon sèl kondwi, ak isit la gwosè a blòk se nan enpòtans kle.
Otè a pa wè pwen nan eseye optimize yon paramèt ki pa bon nan RAID 6 pa konsepsyon ak olye de optimize sa ki RAID 6 bon nan.
Nou pral konpanse pou pòv ekri o aza nan RAID 6 ak yon kachèt NVMe ak ke trik nouvèl mens-pwovizyon.

Nou poko pèmèt DISCARD pou RAID 6. Se konsa, nou pa pral "inisyalize" etalaj sa a pou kounye a. Nou pral fè sa pita, apre enstale eksplwatasyon an.

SATA HDD

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

LVM sou NVMe RAID

Pou vitès, nou vle mete sistèm dosye rasin lan sou NVMe RAID 1 ki se /dev/md0.
Sepandan, nou pral toujou bezwen etalaj rapid sa a pou lòt bezwen, tankou swap, metadata ak LVM-cache ak metadata LVM-mens, kidonk nou pral kreye yon LVM VG sou etalaj sa a.

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

Ann kreye yon patisyon pou sistèm dosye rasin lan.

#lvcreate -L 128G --name root root

Ann kreye yon patisyon pou echanje dapre gwosè RAM la.

#lvcreate -L 32G --name swap root

Enstalasyon OS

An total, nou gen tout bagay ki nesesè yo enstale sistèm nan.

Lanse sòsye enstalasyon sistèm lan nan anviwònman Ubuntu Live la. Enstalasyon nòmal. Se sèlman nan etap nan chwazi disk pou enstalasyon, ou bezwen presize bagay sa yo:

  • /dev/md1, - pwen mòn /boot, FS - BTRFS
  • /dev/root/root (aka /dev/mapper/root-root), - pwen mòn / (rasin), FS - BTRFS
  • /dev/root/swap (aka /dev/mapper/root-swap), - itilize kòm patisyon swap
  • Enstale bootloader la sou /dev/sda

Lè w chwazi BTRFS kòm sistèm fichye rasin lan, enstalatè a pral otomatikman kreye de komèsan BTRFS yo rele "@" pou / (rasin), ak "@home" pou /home.

Ann kòmanse enstalasyon an...

Enstalasyon an pral fini ak yon bwat dyalòg modal ki endike yon erè nan enstale bootloader la. Malerezman, ou p ap kapab sòti dyalòg sa a lè l sèvi avèk mwayen estanda epi kontinye enstalasyon an. Nou soti nan sistèm nan epi konekte ankò, ki fini nan yon pwòp Ubuntu Live Desktop. Louvri tèminal la, epi ankò:

#sudo bash

Kreye yon anviwònman chroot pou kontinye enstalasyon an:

#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

Ann konfigirasyon rezo a ak hostname nan chroot:

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

Ann antre nan anviwònman chroot la:

#chroot /mnt/chroot

Premye a tout, nou pral delivre pakè yo:

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

Ann tcheke ak ranje tout pakè ki te enstale mal akòz enstalasyon sistèm enkonplè:

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

Si yon bagay pa mache, ou ka bezwen edite /etc/apt/sources.list an premye

Ann ajiste paramèt yo pou modil RAID 6 la pou pèmèt TRIM/DISCARD:

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

Ann ajiste etalaj nou yo yon ti kras:

#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

Sa ki te li..?Nou te kreye yon seri règ udev ki pral fè bagay sa yo:

  • Mete gwosè kachèt blòk la pou RAID 2020 adekwa pou 6. Valè default, sanble, pa chanje depi kreyasyon Linux, e li pa adekwa pou yon bon bout tan.
  • Rezève yon minimòm de IO pou dire chèk etalaj/synchronizations. Sa a se anpeche etalaj ou yo soti nan bloke nan yon eta de senkronizasyon p'ap janm fini an anba chaj.
  • Limite maksimòm IO pandan chèk/synchronization de baies. Sa nesesè pou senkronize/tcheke SSD RAID pa fri kondui ou yo nan yon sèk. Sa a se laverite espesyalman pou NVMe. (Sonje sou radyatè a? Mwen pa t ap blag.)
  • Entèdi disk yo sispann wotasyon spindle (HDD) atravè APM epi mete delè dòmi pou kontwolè ki gen kapasite a 7 èdtan. Ou ka konplètman enfim APM si kondui ou yo ka fè li (-B 255). Avèk valè default la, kondui yo ap sispann apre senk segonn. Lè sa a, eksplwatasyon an vle Reyajiste kachèt la ki gen kapasite, disk yo pral vire ankò, ak tout bagay pral kòmanse tout lòt peyi sou ankò. Disk yo gen yon kantite maksimòm limite wotasyon axe. Tankou yon sik default senp ka fasil touye disk ou nan yon koup la ane. Se pa tout disk ki soufri sa a, men nou yo se "laptop", ak paramèt default apwopriye, ki fè RAID la sanble ak yon mini-MAID.
  • Enstale readahead sou disk (wotasyon) 1 megaocte - de blòk youn apre lòt / moso RAID 6
  • Enfim readahead sou etalaj yo tèt yo.

Ann edite /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

Poukisa sa ..?Nou pral chèche patisyon /boot pa UUID. Teyorikman nonmen etalaj ta ka chanje.

Nou pral chèche seksyon ki rete yo pa non LVM nan notasyon /dev/mapper/vg-lv, paske yo idantifye patisyon byen inikman.

Nou pa sèvi ak UUID pou LVM paske UUID volim LVM yo ak snapshots yo kapab menm bagay la tou.Mount /dev/mapper/root-root.. de fwa?Wi. Egzakteman. Karakteristik nan BTRFS. Sistèm fichye sa a ka monte plizyè fwa ak diferan subvols.

Akòz menm karakteristik sa a, mwen rekòmande pa janm kreye snapshots LVM nan volim BTRFS aktif. Ou ka jwenn yon sipriz lè ou rdemare.

Ann rejenere konfigirasyon mdadm la:

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

Ann ajiste paramèt LVM yo:

#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

Sa ki te li..?Nou te pèmèt ekspansyon otomatik nan pisin mens LVM lè nou rive nan 90% nan espas ki okipe a pa 5% nan volim la.

Nou te ogmante kantite maksimòm blòk kachèt pou LVM kachèt.

Nou te anpeche LVM chèche komèsan LVM (PV) sou:

  • aparèy ki gen LVM kachèt (cdata)
  • aparèy kachèt lè l sèvi avèk LVM kachèt, kontoune kachèt la ( _corig). Nan ka sa a, aparèy nan kachèt tèt li ap toujou analize nan kachèt la (jis ).
  • aparèy ki gen metadata kachèt LVM (cmeta)
  • tout aparèy nan VG ak imaj yo non. Isit la nou pral gen imaj ki gen kapasite nan machin vityèl, epi nou pa vle LVM sou lame a aktive komèsan ki fè pati OS envite a.
  • tout aparèy nan VG ak backup la non. Isit la nou pral gen kopi backup nan imaj machin vityèl.
  • tout aparèy ki gen non fini ak "gpv" (volim fizik envite)

Nou te pèmèt sipò DISCARD lè nou libere espas gratis sou LVM VG. Fè atansyon. Sa a pral fè efase LVs sou SSD a byen pran tan. Sa a espesyalman aplike nan SSD RAID 6. Sepandan, dapre plan an, nou pral sèvi ak pwovizyon mens, kidonk sa a pa pral anpeche nou ditou.

Ann mete ajou imaj initramfs la:

#update-initramfs -u -k all

Enstale ak konfigirasyon grub:

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

Ki disk ou ta dwe chwazi?Tout moun ki sd*. Sistèm nan dwe kapab demare nan nenpòt kondwi SATA k ap travay oswa SSD.

Poukisa yo te ajoute os-prober ..?Pou endepandans twòp ak men jwe.

Li pa travay kòrèkteman si youn nan RAID yo nan yon eta degrade. Li eseye fè rechèch pou eksplwatasyon an sou patisyon ki itilize nan machin vityèl kouri sou pyès ki nan konpitè sa a.

Si ou bezwen li, ou ka kite li, men kenbe nan tèt ou tout sa ki anwo yo. Mwen rekòmande pou chèche resèt pou debarase m de men vakabon sou entènèt.

Avèk sa a nou te konplete premye enstalasyon an. Li lè pou rdemare nan OS ki fèk enstale a. Pa bliye retire demaraj Live CD/USB la.

#exit
#reboot

Chwazi nenpòt nan SSD SATA yo kòm aparèy bòt la.

LVM sou SATA SSD

Nan pwen sa a, nou te deja demare nan nouvo eksplwatasyon an, konfigirasyon rezo a, bon, louvri Emulation tèminal la, epi kouri:

#sudo bash

Ann kontinye.

"Inisyalize" etalaj la soti nan SATA SSD:

#blkdiscard /dev/md2

Si li pa travay, alò eseye:

#blkdiscard --step 65536 /dev/md2
Kreye LVM VG sou SATA SSD:

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

Poukisa yon lòt VG ..?An reyalite, nou deja gen yon VG ki rele rasin. Poukisa nou pa ajoute tout bagay nan yon sèl VG?

Si gen plizyè PV nan yon VG, Lè sa a, pou VG la dwe aktive kòrèkteman, tout PV yo dwe prezan (sou entènèt). Eksepsyon a se LVM RAID, ke nou fè espre pa itilize.

Nou reyèlman vle ke si gen yon echèk (li pèt done) sou nenpòt nan etalaj yo RAID 6, sistèm nan fonksyone pral demare nòmalman epi li ba nou opòtinite pou rezoud pwoblèm nan.

Pou fè sa, nan premye nivo abstraksyon nou pral izole chak kalite "medya" fizik nan yon VG separe.

Syantifikman pale, diferan etalaj RAID fè pati diferan "domèn fyab". Ou pa ta dwe kreye yon lòt pwen komen nan echèk pou yo lè w mete yo nan yon sèl VG.

Prezans LVM nan nivo "pyès ki nan konpitè" pral pèmèt nou koupe abitrèman moso nan diferan etalaj RAID lè nou konbine yo nan diferan fason. Pou egzanp - kouri an menm tan an bcache + LVM mens, bcache + BTRFS, LVM kachèt + LVM mens, yon konfigirasyon ZFS konplèks ak kachèt, oswa nenpòt lòt melanj lanfè pou eseye konpare li tout.

Nan nivo "pyès ki nan konpitè", nou p'ap sèvi ak lòt bagay pase bon ansyen volim LVM "epè". Eksepsyon nan règ sa a pouvwa se patisyon an backup.

Mwen panse ke nan moman sa a, anpil lektè te deja kòmanse sispèk yon bagay sou poupe a nidifikasyon.

LVM sou SATA HDD

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

Nouvo VG ankò ..?Nou reyèlman vle ke si etalaj la disk ke nou pral itilize pou backup done echwe, sistèm opere nou an ap kontinye travay nòmalman, pandan y ap kenbe aksè a done ki pa sovgad kòm dabitid. Se poutèt sa, pou fè pou evite pwoblèm aktivasyon VG, nou kreye yon VG separe.

Mete kanpe LVM kachèt

Ann kreye yon LV sou NVMe RAID 1 pou itilize li kòm yon aparèy kachèt.

#lvcreate -L 70871154688B --name cache root

Poukisa gen ti kras...?Reyalite a se ke SSD NVMe nou yo gen tou yon kachèt SLC. 4 jigokte "gratis" ak 18 jigokte dinamik akòz espas lib la okipe nan MLC 3-bit la. Yon fwa ke kachèt sa a fin itilize, SSD NVMe pa pral pi vit pase SSD SATA nou an ak kachèt. Aktyèlman, pou rezon sa a, li pa gen okenn sans pou nou fè patisyon kachèt LVM la pi gwo pase de fwa gwosè kachèt SLC kondwi NVMe a. Pou kondui NVMe yo itilize, otè a konsidere li rezonab pou fè 32-64 gigaocte nan kachèt.

Gwosè patisyon yo bay yo oblije òganize 64 gigaocte nan kachèt, metadata kachèt, ak backup metadata.

Anplis de sa, mwen sonje ke apre yon fèmen sistèm sal, LVM pral make tout kachèt la kòm sal epi li pral senkronize ankò. Anplis, sa a pral repete chak fwa yo itilize lvchange sou aparèy sa a jiskaske sistèm lan rekòmanse ankò. Se poutèt sa, mwen rekòmande imedyatman rkree kachèt la lè l sèvi avèk script ki apwopriye a.

Ann kreye yon LV sou SATA RAID 6 pou itilize li kòm yon aparèy kachèt.

#lvcreate -L 3298543271936B --name cache data

Poukisa sèlman twa teraoctet ..?Se konsa, ke, si sa nesesè, ou ka itilize SATA SSD RAID 6 pou kèk lòt bezwen. Ka gwosè a nan espas ki la kachèt ap ogmante dinamik, sou vole, san yo pa sispann sistèm nan. Pou fè sa, ou bezwen pou yon ti tan sispann ak re-pèmèt kachèt la, men avantaj nan diferan nan LVM-kachèt sou, pou egzanp, bcache se ke sa a ka fè sou vole.

Ann kreye yon nouvo VG pou kachèt.

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

Ann kreye yon LV sou aparèy la kachèt.

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

Isit la nou imedyatman pran tout espas lib sou /dev/data/cache pou tout lòt patisyon nesesè yo te kreye imedyatman sou /dev/root/cache. Si ou te kreye yon bagay nan move kote, ou ka deplase li lè l sèvi avèk pvmove.

Ann kreye ak pèmèt kachèt la:

#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

Poukisa sa yo chunkize ..?Atravè eksperyans pratik, otè a te kapab chèche konnen ke pi bon rezilta a reyalize si gwosè a nan blòk la kachèt LVM kowenside ak gwosè a nan blòk la mens LVM. Anplis, pi piti gwosè a, pi bon konfigirasyon an fè nan yon anrejistreman o aza.

64k se gwosè blòk minimòm ki pèmèt pou LVM mens.

Fè atansyon ekriback ..!Wi. Kalite kachèt sa a ranvwaye senkronizasyon ekri nan aparèy kachèt la. Sa vle di ke si kachèt la pèdi, ou ka pèdi done sou aparèy la kachèt. Apre sa, otè a pral di w ki mezi, anplis NVMe RAID 1, yo ka pran pou konpanse risk sa a.

Kalite kachèt sa a te chwazi espre pou konpanse move pèfòmans ekri o aza RAID 6 la.

Ann tcheke sa nou jwenn:

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

Se sèlman [cachedata_corig] ki ta dwe lokalize sou /dev/data/cache. Si gen yon bagay ki mal, Lè sa a, sèvi ak pvmove.

Ou ka enfim kachèt la si sa nesesè ak yon sèl kòmand:

#lvconvert -y --uncache cache/cachedata

Sa a se fè sou entènèt. LVM pral tou senpleman senkronize kachèt la sou disk, retire li, epi chanje non cachedata_corig tounen nan cachedata.

Mete kanpe LVM mens

Ann apeprè estime konbyen espas nou bezwen pou metadata mens 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"

Awondi jiska 4 gigaocte: 4294967296B

Miltipliye pa de epi ajoute 4194304B pou metadata LVM PV: 8594128896B
Ann kreye yon patisyon separe sou NVMe RAID 1 pou mete metadata mens LVM ak kopi backup yo sou li:

#lvcreate -L 8594128896B --name images root

Pou kisa..?Isit la kesyon an ka leve: poukisa mete LVM mens metadata separeman si li pral toujou kache sou NVMe epi li pral travay byen vit.

Malgre ke vitès la enpòtan isit la, li se lwen rezon prensipal la. Bagay la se ke kachèt la se yon pwen nan echèk. Yon bagay ka rive li, epi si metadata mens LVM yo nan kachèt, li pral lakòz tout bagay yo dwe konplètman pèdi. San metadata konplè, li pral prèske enposib rasanble komèsan mens.

Lè nou deplase metadata yo nan yon volim separe ki pa kachèt, men rapid, nou garanti sekirite metadata yo nan ka pèt kachèt oswa koripsyon. Nan ka sa a, tout domaj ki te koze pa pèt kachèt yo pral lokalize andedan volim mens, ki pral senplifye pwosedi rekiperasyon an pa lòd nan grandè. Avèk yon gwo pwobabilite, domaj sa yo pral retabli lè l sèvi avèk FS journaux.

Anplis, si yo te deja pran yon snapshot nan yon volim mens, epi apre sa kachèt la te konplètman senkronize omwen yon fwa, Lè sa a, akòz konsepsyon entèn nan LVM mens, entegrite nan snapshot la pral garanti nan evènman an nan pèt kachèt. .

Ann kreye yon nouvo VG ki pral responsab pou pwovizyon mens:

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

Ann kreye yon pisin:

#lvcreate -L 274877906944B --poolmetadataspare y --poolmetadatasize 4294967296B --chunksize 64k -Z y -T images/thin-pool
Poukisa -Z yAnplis de sa ki mòd sa a aktyèlman gen entansyon pou - pou anpeche done ki sòti nan yon machin vityèl soti nan koule nan yon lòt machin vityèl lè redistribiye espas - zewoing anplis itilize ogmante vitès la nan ekri o aza nan blòk ki pi piti pase 64k. Nenpòt ki ekri mwens pase 64k nan yon zòn nan volim mens ki pa te deja aloke yo pral vin 64K kwen-aliyen nan kachèt la. Sa a pral pèmèt operasyon an dwe fèt antyèman nan kachèt la, kontoune aparèy la kachèt.

Ann deplase LV yo nan PV korespondan yo:

#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

Ann tcheke:

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

Ann kreye yon volim mens pou tès yo:

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

Nou pral enstale pakè pou tès ak siveyans:

#apt-get install sysstat fio

Men ki jan ou ka obsève konpòtman konfigirasyon depo nou an an tan reyèl:

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

Men ki jan nou ka teste konfigirasyon nou an:

#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

Ak anpil atansyon! Resous!Kòd sa a pral kouri 36 tès diferan, chak ap kouri pou 4 segonn. Mwatye nan tès yo se pou anrejistreman. Ou ka anrejistre anpil sou NVMe nan 4 segonn. Jiska 3 jigokte pou chak segonn. Se konsa, chak tès ekriti yo ka manje jiska 216 gigabyte resous SSD nan men ou.

Lekti ak ekriti melanje?Wi. Li fè sans pou kouri tès li ak ekri separeman. Anplis, li fè sans pou asire ke tout kachèt yo senkronize pou ke yon ekri deja fè pa afekte lekti a.

Rezilta yo pral varye anpil pandan premye lansman an ak sa ki vin apre yo kòm kachèt la ak volim mens ranpli, epi tou depann de si sistèm nan jere yo senkronize kachèt yo plen pandan dènye lansman an.

Pami lòt bagay, mwen rekòmande pou mezire vitès la sou yon volim mens deja plen kote yo te jis pran yon snapshot. Otè a te gen opòtinite pou yo obsève ki jan ekri o aza akselere sevè imedyatman apre yo fin kreye premye snapshot la, espesyalman lè kachèt la poko plen nèt. Sa rive akòz semantik ekriti kopi-sou-ekri, aliyman nan kachèt ak blòk volim mens, ak lefèt ke yon ekri o aza nan RAID 6 vire nan yon lekti o aza soti nan RAID 6 ki te swiv pa yon ekri nan kachèt la. Nan konfigirasyon nou an, lekti o aza soti nan RAID 6 se jiska 6 fwa (kantite SSD SATA nan etalaj la) pi vit pase ekri. Paske blòk pou CoW yo atribye ba sekans soti nan yon pisin mens, Lè sa a, anrejistreman an, pou pati ki pi, tou vire nan sekans.

Tou de nan karakteristik sa yo ka itilize nan avantaj ou.

Cache "koyeran" snapshots

Pou redwi risk pou yo pèdi done nan ka ta gen domaj / pèt kachèt, otè a pwopoze prezante pratik la nan wotasyon snapshots garanti entegrite yo nan ka sa a.

Premyèman, paske metadata volim mens abite sou yon aparèy ki pa kachèt, metadata yo pral konsistan epi pèt posib yo pral izole nan blòk done yo.

Sik wotasyon snapshot sa a garanti entegrite done yo andedan snapshots yo nan ka pèt kachèt:

  1. Pou chak volim mens ak non <name>, kreye yon snapshot ak non <name>.cached
  2. Ann fikse papòt migrasyon an nan yon valè rezonab segondè: #lvchange --quiet --cachesettings "migration_threshold=16384" cache/cachedata
  3. Nan bouk la nou tcheke kantite blòk sal nan kachèt la: #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' jiskaske nou jwenn zewo. Si zewo a manke pou twò lontan, li ka kreye pa tanporèman chanje kachèt la nan mòd ekriti. Sepandan, pran an kont karakteristik vitès yo nan etalaj SATA ak NVMe SSD nou yo, osi byen ke resous TBW yo, ou pral swa kapab byen vit trape moman sa a san yo pa chanje mòd nan kachèt, oswa pyès ki nan konpitè ou pral konplètman manje tout resous li yo nan kèk jou. Akòz limit resous, sistèm nan se, nan prensip, pa kapab anba 100% chaj ekri tout tan tout tan an. SSD NVMe nou yo anba 100% chaj ekri pral konplètman fin itilize resous la KIJE-NAN JOU. SATA SSD yo pral dire sèlman de fwa plis tan. Se poutèt sa, nou pral asime ke pi fò nan chaj la ale nan lekti, epi nou gen relativman kout tèm eklat nan aktivite ekstrèmman wo konbine avèk yon chaj ki ba an mwayèn pou ekri.
  4. Le pli vit ke nou kenbe (oswa fè) yon zewo, nou chanje non <name>.cached nan <name>.committed. Ansyen <non>.committed la efase.
  5. Opsyonèlman, si kachèt la plen 100%, li ka rkree pa yon script, konsa netwaye li. Avèk yon kachèt mwatye vid, sistèm nan travay pi vit lè w ap ekri.
  6. Mete papòt migrasyon an sou zewo: #lvchange --quiet --cachesettings "migration_threshold=0" cache/cachedata Sa a pral tanporèman anpeche kachèt la senkronize ak medya prensipal yo.
  7. Nou rete tann jiskaske yon anpil nan chanjman akimile nan kachèt la #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' oswa revèy la pral koupe.
  8. Nou repete ankò.

Poukisa difikilte ak papòt migrasyon...?Bagay la se ke nan pratik reyèl, yon anrejistreman "o aza" se aktyèlman pa konplètman o aza. Si nou te ekri yon bagay nan yon sektè ki gen 4 kilobyte nan gwosè, gen yon gwo pwobabilite ke nan pwochen koup la minit yo pral fè yon dosye nan menm oswa youn nan sektè vwazen yo (+- 32K).

Lè nou mete papòt migrasyon an a zewo, nou ranvwaye senkronizasyon ekri sou SSD SATA a epi nou ajoute plizyè chanjman nan yon blòk 64K nan kachèt la. Sa a siyifikativman sove resous SATA SSD.

Kote kòd la..?Malerezman, otè a konsidere tèt li pa sifizameman konpetan nan devlopman scripts bash paske li se 100% pwòp tèt ou anseye ak pratike "google"-kondwi devlopman, Se poutèt sa li kwè ke kòd la terib ki soti nan men l 'pa ta dwe itilize pa nenpòt moun. lòt bagay.

Mwen panse ke pwofesyonèl nan domèn sa a yo pral kapab poukont yo dekri tout lojik ki dekri pi wo a, si sa nesesè, epi, petèt, menm bèl konsepsyon li kòm yon sèvis systemd, jan otè a te eseye fè.

Yon konplo wotasyon snapshot senp sa a pral pèmèt nou pa sèlman toujou gen yon sèl snapshot konplètman senkronize sou SSD SATA a, men tou li pral pèmèt nou, lè l sèvi avèk sèvis piblik la thin_delta, chèche konnen ki blòk yo te chanje apre kreyasyon li yo, epi konsa lokalize domaj sou volim prensipal yo, anpil senplifye rekiperasyon.

TAYE/JETE nan libvirt/KVM

Paske depo done yo pral itilize pou KVM kouri libvirt, Lè sa a, li ta yon bon lide yo anseye VMs nou yo pa sèlman pran espas gratis, men tou, yo libere sa ki pa nesesè ankò.

Sa a se fè pa imite sipò TRIM/DISCARD sou disk vityèl. Pou fè sa, ou bezwen chanje kalite kontwolè a nan virtio-scsi epi modifye xml la.

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

Sa yo DISCARD soti nan OS envite yo kòrèkteman trete pa LVM, ak blòk yo libere kòrèkteman tou de nan kachèt la ak nan pisin nan mens. Nan ka nou an, sa rive sitou nan yon fason reta, lè w ap efase pwochen snapshot la.

BTRFS sovgad

Sèvi ak scripts pare ak ekstrèm prekosyon ak sou pwòp risk yon moun. Otè a te ekri kòd sa a tèt li epi sèlman pou tèt li. Mwen sèten ke anpil itilizatè Linux ki gen eksperyans gen zouti ki sanble, epi pa gen okenn bezwen kopye yon lòt moun.

Ann kreye yon volim sou aparèy backup la:

#lvcreate -L 256G --name backup backup

Ann fòmate li nan BTRFS:

#mkfs.btrfs /dev/backup/backup

Ann kreye pwen mòn ak monte sou-seksyon rasin sistèm dosye a:

#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

Ann kreye anyè pou sovgad:

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

Ann kreye yon anyè pou scripts backup:

#mkdir /root/btrfs-backup

Ann kopye script la:

Anpil kòd bash pè. Sèvi ak pwòp risk ou. Pa ekri lèt fache bay otè a...#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

Ki sa li menm fè..?Gen yon seri kòmandman senp pou kreye snapshots BTRFS epi kopye yo nan yon lòt FS lè l sèvi avèk BTRFS voye/resevwa.

Premye lansman an ka relativman long, paske... Nan kòmansman an, tout done yo pral kopye. Pli lwen lanse yo pral trè vit, paske... Se sèlman chanjman yo pral kopye.

Yon lòt script ke nou pral mete nan cron:

Kèk plis kòd bash#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

Kisa li fè..?Kreye ak senkronize snapshots incrémentielle nan volim BTRFS ki nan lis yo sou backup FS la. Apre sa, li efase tout foto ki te kreye 60 jou de sa. Apre lansman, snapshots ki gen dat nan volim ki nan lis yo ap parèt nan /backup/btrfs/back/remote/ subdirectory yo.

Ann bay dwa ekzekisyon kòd la:

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

Ann tcheke li epi mete l nan cron la:

#/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 mens backup

Ann kreye yon pisin mens sou aparèy backup la:

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

Ann enstale ddrescue, paske... scripts yo pral sèvi ak zouti sa a:

#apt-get install gddrescue

Ann kreye yon anyè pou scripts:

#mkdir /root/lvm-thin-backup

Ann kopye scripts yo:

Anpil kochon anndan...#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

Kisa li fè...?Gen yon seri kòmandman pou manipile snapshot mens ak senkronize diferans ki genyen ant de snapshot mens resevwa atravè thin_delta nan yon lòt aparèy blòk lè l sèvi avèk ddrescue ak blkdiscard.

Yon lòt script ke nou pral mete nan cron:

Yon ti kras plis 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

Kisa li fè...?Sèvi ak script anvan an pou kreye ak senkronize sovgad volim mens ki nan lis yo. Script la pral kite snapshots inaktif nan volim ki nan lis yo, ki nesesè pou swiv chanjman depi dènye senkronizasyon an.

Script sa a dwe modifye, ki espesifye lis volim mens pou ki kopi backup yo ta dwe fè. Non yo bay yo se pou rezon ilistrasyon sèlman. Si ou vle, ou ka ekri yon script ki pral senkronize tout volim yo.

Ann bay dwa yo:

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

Ann tcheke li epi mete l nan cron la:

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

Premye lansman an pral long, paske... komèsan mens yo pral konplètman senkronize pa kopye tout espas itilize yo. Mèsi a metadata mens LVM, nou konnen ki blòk yo aktyèlman ap itilize, kidonk yo pral kopye sèlman blòk volim mens yo itilize aktyèlman.

Kouri ki vin apre yo pral kopye done yo enkreman gras a swivi chanjman atravè LVM metadata mens.

Ann wè sa ki te pase:

#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

Kisa sa gen pou wè ak poupe nidifikasyon?

Gen plis chans, bay volim lojik LVM LV yo ka volim fizik LVM PV pou lòt VG. LVM ka rekursif, tankou poupe nidifikasyon. Sa a bay LVM fleksibilite ekstrèm.

PS

Nan pwochen atik la, nou pral eseye sèvi ak plizyè sistèm depo mobil/KVM menm jan an kòm baz pou kreye yon gwoup depo jeo distribye/vm ak redondance sou plizyè kontinan lè l sèvi avèk biwo lakay ou, entènèt kay la ak rezo P2P.

Sous: www.habr.com

Add nouvo kòmantè