Naon anu LVM sareng Matryoshka sami?

Alus poé.
Abdi hoyong bagikeun sareng komunitas pangalaman praktis kuring ngawangun sistem panyimpen data pikeun KVM nganggo md RAID + LVM.

Program éta bakal kalebet:

  • Ngawangun md RAID 1 ti NVMe SSD.
  • Assembling md RAID 6 ti SATA SSD jeung drive biasa.
  • Fitur operasi TRIM / DISCARD dina SSD RAID 1/6.
  • Nyieun hiji bootable md RAID 1/6 Asép Sunandar Sunarya dina set umum tina disk.
  • Masang sistem dina NVMe RAID 1 nalika teu aya dukungan NVMe dina mios.
  • Ngagunakeun LVM cache sarta LVM ipis.
  • Ngagunakeun snapshots BTRFS sarta ngirim / narima pikeun cadangan.
  • Ngagunakeun LVM snapshots ipis jeung thin_delta pikeun cadangan gaya BTRFS.

Upami anjeun kabetot, mangga tingali ucing.

Pernyataan

Panulis henteu nanggung tanggung jawab kana akibat tina ngagunakeun atanapi henteu ngagunakeun bahan/conto/kode/tips/data tina artikel ieu. Ku maca atanapi nganggo bahan ieu dina cara naon waé, anjeun nanggung tanggung jawab pikeun sadaya akibat tina tindakan ieu. Konsékuansi anu mungkin kalebet:

  • NVMe SSDs gorengan.
  • Lengkep dianggo pikeun ngarékam sumberdaya sareng kagagalan drive SSD.
  • Leungitna lengkep sadaya data dina sadaya drive, kalebet salinan cadangan.
  • hardware komputer lepat.
  • Wasted waktos, saraf jeung duit.
  • Sagala konsékuansi séjén nu teu didaptarkeun di luhur.

beusi

Sadia nyaéta:

Motherboard ti sabudeureun 2013 kalawan Z87 chipset, kumplit jeung Intel Core i7 / Haswell.

  • Prosesor 4 inti, 8 benang
  • 32 GB DDR3 RAM
  • 1 x 16 atanapi 2 x 8 PCIe 3.0
  • 1 x 4 + 1 x 1 PCIe 2.0
  • 6 x 6 GBps SATA 3 panyambungna

SAS adaptor LSI SAS9211-8I flashed kana IT / modeu HBA. Firmware anu diaktipkeun RAID parantos ngahaja diganti ku firmware HBA pikeun:

  1. Anjeun tiasa ngalungkeun adaptor ieu iraha waé sareng ngagentos ku anu sanés anu anjeun tepang.
  2. TRIM/Discard berpungsi normal dina disk, sabab... dina firmware razia Paréntah ieu teu dirojong pisan, sarta HBA, umumna, teu paduli naon Paréntah dikirimkeun ngaliwatan beus.

Hard drive - 8 buah HGST Travelstar 7K1000 kapasitas 1 TB dina faktor formulir 2.5, sakumaha keur laptop. drive ieu saméméhna aya dina RAID 6 Asép Sunandar Sunarya. Éta ogé bakal boga pamakéan dina sistem anyar. Pikeun nyimpen cadangan lokal.

Sajaba ditambahkeun:

6 potongan SATA SSD modél Samsung 860 QVO 2TB. SSDs ieu peryogi volume anu ageung, ayana cache SLC, reliabilitas, sareng harga anu murah anu dipikahoyong. Rojongan pikeun piceun / nol diperyogikeun, anu dipariksa ku garis dina dmesg:

kernel: ata1.00: Enabling discard_zeroes_data

2 potongan NVMe SSD modél Samsung SSD 970 EVO 500GB.

Pikeun SSDs ieu, laju baca/tulis acak sarta kapasitas sumberdaya pikeun kabutuhan Anjeun penting. Radiator pikeun aranjeunna. kuduna. Leres pisan. Upami teu kitu, tumis aranjeunna dugi ka garing salami sinkronisasi RAID munggaran.

StarTech PEX8M2E2 adaptor pikeun 2 x NVMe SSD dipasang dina slot PCIe 3.0 8x. Ieu, sakali deui, ngan hiji HBA, tapi pikeun NVMe. Ieu béda ti adapters mirah sabab teu merlukeun PCIe rojongan bifurcation ti motherboard alatan ayana switch PCIe diwangun-di. Bakal dianggo malah dina sistem paling kuna kalawan PCIe, sanajan mangrupa x1 PCIe 1.0 slot. Alami, dina laju anu pas. Aya henteu RAIDs dinya. Henteu aya BIOS anu diwangun dina dewan. Janten, sistem anjeun moal magis diajar boot sareng NVMe, langkung seueur NVMe RAID berkat alat ieu.

Komponén ieu ngan ukur kusabab ayana ngan ukur hiji 8x PCIe 3.0 gratis dina sistem, sareng, upami aya 2 slot gratis, éta tiasa gampang diganti ku dua Penny PEX4M2E1 atanapi analog, anu tiasa dipésér dimana waé kalayan harga 600 rubles.

Panolakan tina sagala jinis hardware atawa diwangun-di chipset / BIOS RAIDs dijieun ngahaja, dina urutan bisa sagemblengna ngaganti sakabéh sistem, iwal SSD / HDD sorangan, bari preserving sakabeh data. Ideally, ku kituna anjeun bisa nyimpen malah sistem operasi dipasang nalika pindah ka lengkep anyar / hardware béda. Hal utama nyaéta yén aya SATA sareng palabuhan PCIe. Éta sapertos CD live atanapi flash drive bootable, ngan gancang pisan sareng rada ageung.

oconUpami teu kitu, anjeun terang naon anu kajantenan - sakapeung anjeun kedah urgently nyandak sakabeh Asép Sunandar Sunarya sareng anjeun nyandak jauh. Tapi kuring teu hayang leungit data. Jang ngalampahkeun ieu, sakabéh média disebutkeun merenah lokasina dina slides dina 5.25 bay tina kasus baku.

Nya, sareng, tangtosna, pikeun ékspérimén sareng metode anu béda tina cache SSD dina Linux.

razia hardware anu boring. Hurungkeun. Éta tiasa dianggo atanapi henteu. Tur kalawan mdadm salawasna aya pilihan.

Parangkat lunak

Sateuacanna, Debian 8 Jessie dipasang dina hardware, anu caket sareng EOL. RAID 6 dirakit tina HDD anu disebatkeun di luhur dipasangkeun sareng LVM. Éta ngajalankeun mesin virtual dina kvm / libvirt.

Sabab Panulis gaduh pangalaman anu cocog dina nyiptakeun flash drive SATA / NVMe bootable portabel, sareng ogé, supados henteu ngarobih template apt biasa, Ubuntu 18.04 dipilih salaku sistem target, anu parantos cekap stabil, tapi masih gaduh 3 taun. rojongan dina mangsa nu bakal datang.

Sistem anu disebatkeun ngandung sadaya panggerak hardware anu urang peryogikeun tina kotakna. Kami henteu peryogi parangkat lunak atanapi supir pihak katilu.

Nyiapkeun pikeun instalasi

Pikeun masang sistem kami peryogi Gambar Desktop Ubuntu. Sistem server ngagaduhan sababaraha jinis pamasangan anu kuat, anu nunjukkeun kamerdikaan kaleuleuwihan anu teu tiasa ditumpurkeun ku ngadorong partisi sistem UEFI kana salah sahiji disk, ngarusak sadayana kaéndahan. Sasuai, éta dipasang ngan dina modeu UEFI. Henteu nawiskeun pilihan naon waé.

Kami teu senang jeung ieu.

Naha?Hanjakalna, boot UEFI kirang cocog sareng software boot RAID, sabab... Teu aya anu nawiskeun kami reservasi pikeun partisi UEFI ESP. Aya resep online anu nyarankeun nempatkeun partisi ESP dina flash drive dina port USB, tapi ieu mangrupikeun titik gagal. Aya resep ngagunakeun software mdadm RAID 1 sareng versi metadata 0.9 anu henteu nyegah UEFI BIOS ningali partisi ieu, tapi ieu hirup dugi ka momen anu bahagia nalika mios atanapi OS hardware anu sanés nyerat hiji hal ka ESP sareng hilap nyingkronkeun ka anu sanés. kaca spion.

Salaku tambahan, boot UEFI gumantung kana NVRAM, anu moal ngalih sareng disk kana sistem énggal, sabab mangrupa bagian tina motherboard nu.

Ku kituna, urang moal reinvent a kabayang anyar. Kami parantos gaduh sapédah akina anu siap-dijieun, anu ayeuna disebut Warisan / BIOS boot, nganggo nami bangga CSM dina sistem anu cocog sareng UEFI. Kami ngan ukur cabut tina rak, lubricate, pompa ban sareng usap ku kaén beueus.

Versi desktop Ubuntu ogé teu tiasa dipasang leres sareng bootloader Warisan, tapi di dieu, sakumaha anu aranjeunna nyarios, sahenteuna aya pilihan.

Janten, urang ngumpulkeun hardware sareng ngamuat sistem tina flash drive bootable Ubuntu Live. Urang kedah ngaunduh pakét, janten kami bakal nyetél jaringan anu cocog pikeun anjeun. Upami éta henteu jalan, anjeun tiasa ngamuat bungkusan anu diperyogikeun kana flash drive sateuacanna.

Urang lebet kana lingkungan Desktop, ngajalankeun émulator terminal, sareng urang angkat:

#sudo bash

Kumaha…?Garis di luhur mangrupikeun pemicu kanonik pikeun holiwar ngeunaan sudo. C bоkasempetan gede datang naоtanggung jawab nu leuwih gede. Patarosan na naha anjeun tiasa nyandak éta sorangan. Seueur jalma nganggap yén ngagunakeun sudo ku cara ieu sahenteuna henteu ati-ati. Tapi:

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

Naha henteu ZFS ...?Lamun urang masang software dina komputer urang, urang dasarna nginjeumkeun hardware urang ka pamekar software ieu ngajalankeun.
Nalika kami percanten ka parangkat lunak ieu sareng kasalametan data kami, kami nyandak pinjaman anu sami sareng biaya mulangkeun data ieu, anu kami kedah mayar hiji dinten.

Tina sudut pandang ieu, ZFS mangrupikeun Ferrari, sareng mdadm + lvm langkung sapertos sapedah.

Sacara subyektif, panulis langkung milih nginjeumkeun sapédah kana kiridit ka jalma anu teu dipikanyaho tibatan Ferrari. Di dinya, harga masalahna henteu luhur. Teu perlu hak. Leuwih basajan ti aturan lalulintas. Parkir gratis. Kamampuh lintas nagara langkung saé. Anjeun salawasna tiasa ngagantelkeun suku ka sapédah, sareng anjeun tiasa ngalereskeun sapédah nganggo panangan anjeun nyalira.

Naha teras BTRFS ...?Pikeun nga-boot sistem operasi, urang peryogi sistem file anu dirojong dina Legacy / BIOS GRUB out of the box, sareng dina waktos anu sami ngadukung snapshot langsung. Urang bakal ngagunakeun éta pikeun partisi / boot. Salaku tambahan, panulis langkung milih ngagunakeun FS ieu pikeun / (root), teu hilap yén pikeun parangkat lunak sanés anjeun tiasa nyiptakeun partisi anu misah dina LVM sareng dipasang dina diréktori anu diperyogikeun.

Kami moal nyimpen gambar tina mesin virtual atanapi database dina FS ieu.
FS ieu ngan bakal dipaké pikeun nyieun snapshots tina sistem tanpa mareuman eta lajeng mindahkeun snapshots ieu ka disk cadangan maké ngirim / narima.

Sajaba ti éta, panulis umumna resep tetep minimum software langsung dina hardware jeung ngajalankeun sagala software lianna dina mesin virtual ngagunakeun hal kawas diteruskeun GPUs na PCI-USB Host controller ka KVM via IOMMU.

Hiji-hijina hal anu tinggaleun dina hardware nyaéta neundeun data, virtualisasi sareng cadangan.

Upami anjeun langkung percanten ka ZFS, teras, prinsipna, pikeun aplikasi anu khusus aranjeunna tiasa ditukeurkeun.

Nanging, panulis ngahaja teu malire fitur mirroring / RAID sareng redundancy anu diwangun ku ZFS, BRTFS sareng LVM.

Salaku argumen tambahan, BTRFS gaduh kamampuan ngarobih tulisan acak kana tulisan anu berurutan, anu gaduh pangaruh anu positip pisan kana laju nyingkronkeun snapshot / cadangan dina HDD.

Hayu urang nyeken deui sadaya alat:

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

Hayu urang tingali sabudeureun:

#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

Tata perenah piringan

NVMe SSD

Tapi kami moal nyirian aranjeunna ku cara naon waé. Sadayana sami, BIOS kami henteu ningali drive ieu. Janten, aranjeunna bakal sapinuhna kana software RAID. Simkuring malah moal nyieun bagian dinya. Upami anjeun hoyong nuturkeun "kanon" atanapi "utamana", jieun hiji partisi ageung, sapertos HDD.

HDD SATA

Teu perlu invent nanaon husus di dieu. Urang bakal nyieun hiji bagian pikeun sagalana. Kami bakal nyiptakeun partisi sabab BIOS ningali disk ieu sareng tiasa nyobian boot ti aranjeunna. Kami malah bakal masang GRUB dina disk ieu engké supados sistem ujug-ujug tiasa ngalakukeun ieu.

#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

Ieu tempat hal jadi metot pikeun urang.

Anu mimiti, drive kami ukuranana 2 TB. Ieu aya dina kisaran anu tiasa ditampi pikeun MBR, anu bakal kami anggo. Upami diperlukeun, bisa diganti ku GPT. Disk GPT gaduh lapisan kasaluyuan anu ngamungkinkeun sistem anu cocog sareng MBR ningali 4 partisi anu munggaran upami aranjeunna aya dina 2 terabyte munggaran. Hal utama nyaéta yén partisi boot sareng partisi bios_grub dina disk ieu kedah di awal. Ieu malah ngidinan Anjeun pikeun boot ti GPT Warisan / BIOS drive.

Tapi ieu sanés kasus urang.

Di dieu urang bakal nyieun dua bagian. Anu kahiji bakal ukuranana 1 GB sareng dianggo pikeun RAID 1 / boot.

Anu kadua bakal dianggo pikeun RAID 6 sareng bakal nyéépkeun sadaya rohangan bébas sésa-sésa iwal ti daérah anu teu aya alit dina tungtung drive.

Naon wewengkon teu ditandaan ieu?Numutkeun sumber dina jaringan, SSDs SATA kami ngagaduhan cache SLC anu tiasa dilegakeun sacara dinamis dina ukuran tina 6 dugi ka 78 gigabyte. Kami nampi 6 gigabytes "gratis" kusabab bédana antara "gigabytes" sareng "gibibytes" dina lambar data drive. Sésana 72 gigabyte dialokasikeun tina rohangan anu henteu dianggo.

Di dieu eta kudu dicatet yén urang boga cache SLC, sarta spasi nempatan dina 4 mode bit MLC. Nu keur urang éféktif hartina pikeun unggal 4 gigabytes rohangan bébas urang ngan bakal meunang 1 gigabyte cache SLC.

Kalikeun 72 gigabytes ku 4 sarta meunang 288 gigabytes. Ieu mangrupikeun rohangan bébas anu urang moal ditandaan pikeun ngamungkinkeun drive ngagunakeun pinuh ku cache SLC.

Ku kituna, urang bakal éféktif meunang nepi ka 312 gigabytes of SLC cache tina total genep drive. Tina sadaya drive, 2 bakal dianggo dina RAID pikeun redundansi.

Jumlah cache ieu bakal ngidinan urang pikeun pisan jarang dina kahirupan nyata sapatemon kaayaan dimana nulis teu buka cache nu. Hal ieu kacida alusna ngimbangan kalemahan memori QLC anu paling hanjelu - laju nulis anu rendah pisan nalika data ditulis ngalangkungan cache. Upami beban anjeun henteu saluyu sareng ieu, maka kuring nyarankeun yén anjeun mikirkeun sabaraha lila SSD anjeun bakal tahan dina beban sapertos kitu, kalayan ngitung TBW tina lambaran data.

#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

Nyieun Arrays

Kahiji, urang kudu ngaganti ngaran mesin. Ieu diperlukeun sabab ngaran host mangrupa bagian tina ngaran Asép Sunandar Sunarya wae di jero mdadm sarta mangaruhan hal wae. Tangtu, arrays bisa diganti engké, tapi ieu mangrupa hambalan teu perlu.

#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

Naha -nganggap-bersih...?Pikeun nyingkahan initializing arrays. Pikeun duanana tingkat RAID 1 jeung 6 ieu valid. Sagalana tiasa dianggo tanpa initialization lamun éta Asép Sunandar Sunarya anyar. Sumawona, ngamimitian susunan SSD nalika nyiptakeun mangrupikeun runtah sumber daya TBW. Kami nganggo TRIM / DISCARD upami mungkin dina susunan SSD anu dirakit pikeun "inisialisasi" aranjeunna.

Pikeun susunan SSD, RAID 1 DISCARD dirojong out of the box.

Pikeun SSD RAID 6 DISCARD arrays, anjeun kudu ngaktipkeun dina parameter modul kernel.

Ieu ngan kudu dipigawé lamun sakabeh SSDs dipaké dina tingkat 4/5/6 Asép Sunandar Sunarya dina sistem ieu boga rojongan gawé pikeun discard_zeroes_data. Kadang-kadang nu datang di sakuliah drive aneh nu ngabejaan kernel nu fungsi ieu dirojong, tapi dina kanyataanana teu aya, atawa fungsi nu teu salawasna jalan. Ayeuna, dukungan sayogi ampir di mana waé, tapi, aya drive sareng firmware anu aya kasalahan. Ku sabab kitu, pangrojong DISCARD ditumpurkeun sacara standar pikeun RAID 6.

Perhatosan, paréntah di handap ieu bakal ngancurkeun sadaya data dina drive NVMe ku "inisialisasi" susunan sareng "enol".

#blkdiscard /dev/md0

Upami aya anu lepat, cobian tangtukeun léngkah.

#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

Naha ageung pisan...?Ngaronjatkeun chunk-ukuran boga pangaruh positif kana laju bacaan acak dina blok nepi ka chunk-ukuran inklusif. Ieu kajadian sabab hiji operasi tina ukuran luyu atawa leuwih leutik bisa réngsé sagemblengna dina hiji alat. Ku alatan éta, IOPS tina sadaya alat dijumlahkeun. Numutkeun statistik, 99% tina IO henteu ngaleuwihan 512K.

RAID 6 IOPS per nulis salawasna kurang atawa sarua jeung IOPS hiji drive. Nalika, salaku bacaan acak, IOPS tiasa sababaraha kali langkung ageung tibatan hiji drive, sareng di dieu ukuran blok pentingna.
Panulis henteu ningali titik dina nyobian ngaoptimalkeun parameter anu goréng dina RAID 6 ku-desain sareng gantina ngaoptimalkeun naon anu hadé pikeun RAID 6.
Urang bakal ngimbangan tulisan acak goréng tina RAID 6 kalawan cache NVMe jeung trik-provisioning ipis.

Kami henteu acan ngaktipkeun DISCARD pikeun RAID 6. Ku kituna kami moal "initialize" Asép Sunandar Sunarya ieu ayeuna. Urang bakal ngalakukeun ieu engké, saatos masang OS.

HDD SATA

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

LVM on NVMe RAID

Pikeun gancang, urang hoyong nempatkeun sistem file root dina NVMe RAID 1 nyaéta / dev / md0.
Najan kitu, urang masih bakal butuh Asép Sunandar Sunarya gancang ieu pikeun kaperluan séjén, kayaning swap, metadata na LVM-cache na LVM-ipis metadata, sangkan bakal nyieun hiji LVM VG on Asép Sunandar Sunarya ieu.

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

Hayu urang nyieun partisi pikeun sistem file root.

#lvcreate -L 128G --name root root

Hayu urang nyieun partisi pikeun swapping nurutkeun ukuran RAM.

#lvcreate -L 32G --name swap root

instalasi OS

Dina total, urang gaduh sadayana anu diperyogikeun pikeun masang sistem.

Jalankeun wizard pamasangan sistem tina lingkungan Ubuntu Live. Pamasangan normal. Ngan dina tahap milih disk pikeun instalasi, anjeun kedah netepkeun ieu:

  • / dev / md1, - Gunung titik / boot, FS - BTRFS
  • / dev / root / root (alias / dev / mapper / root-root), - titik Gunung / (root), FS - BTRFS
  • / dev / root / swap (aka / dev / mapper / root-swap), - dianggo salaku partisi swap
  • Pasang bootloader dina /dev/sda

Lamun anjeun milih BTRFS salaku sistem file root, installer bakal otomatis nyieun dua jilid BTRFS ngaranna "@" pikeun / (root), sarta "@home" pikeun / home.

Hayu urang ngamimitian pamasangan ...

Pamasangan bakal ditungtungan ku kotak dialog modal anu nunjukkeun kasalahan dina masang bootloader. Hanjakalna, anjeun moal tiasa kaluar tina dialog ieu nganggo cara standar sareng neraskeun pamasangan. Kami kaluar tina sistem sareng asup deui, ditungtungan dina desktop Ubuntu Live anu bersih. Buka terminal, sareng deui:

#sudo bash

Jieun lingkungan chroot pikeun neraskeun pamasangan:

#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

Hayu urang ngonpigurasikeun jaringan sareng hostname di chroot:

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

Hayu urang lebet kana lingkungan chroot:

#chroot /mnt/chroot

Anu mimiti, kami bakal nganteurkeun bungkusan:

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

Hayu urang parios sareng ngalereskeun sadaya bungkusan anu dipasang bengkok kusabab pamasangan sistem anu teu lengkep:

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

Upami aya anu henteu hasil, anjeun panginten kedah ngédit /etc/apt/sources.list heula

Hayu urang saluyukeun parameter pikeun modul RAID 6 pikeun ngaktipkeun TRIM/DISCARD:

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

Hayu urang tweak arrays urang saeutik:

#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

Naon éta..?Kami parantos nyiptakeun sakumpulan aturan udev anu bakal ngalakukeun ieu:

  • Setel ukuran blok cache pikeun RAID 2020 janten nyukupan pikeun 6. Nilai standar, sigana, teu robah saprak kreasi Linux Ubuntu, sarta geus teu cukup keur lila.
  • Cadangan minimum IO pikeun durasi cek / sinkronisasi Asép Sunandar Sunarya. Ieu pikeun nyegah arrays anjeun tina macét dina kaayaan sinkronisasi langgeng dina beban.
  • Ngawatesan IO maksimum salila cék / sinkronisasi arrays. Ieu diperlukeun supados sinkronisasi / mariksa SSD RAIDs teu ngagoreng drive anjeun ka garing. Ieu hususna leres pikeun NVMe. (Émut ngeunaan radiator? Abdi henteu bercanda.)
  • Nyaram disk pikeun ngeureunkeun rotasi spindle (HDD) ngalangkungan APM sareng nyetél waktos sare pikeun pangendali disk ka 7 jam. Anjeun tiasa nganonaktipkeun lengkep APM upami drive anjeun tiasa ngalakukeunana (-B 255). Kalayan nilai standar, drive bakal eureun saatos lima detik. Teras OS hoyong ngareset cache disk, disk bakal spin up deui, sareng sadayana bakal ngamimitian deui. Cakram boga jumlah maksimum kawates rotations spindle. Siklus standar saderhana sapertos kitu tiasa gampang maéhan disk anjeun dina sababaraha taun. Henteu sadayana disk kakurangan tina ieu, tapi kami mangrupikeun "laptop", kalayan setélan standar anu cocog, anu ngajantenkeun RAID sapertos mini-MAID.
  • Pasang readahead dina disk (puteran) 1 megabyte - dua blok padeukeut / chunk RAID 6
  • Nonaktipkeun readahead dina arrays sorangan.

Hayu urang édit /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

Kunaon éta..?Urang bakal milarian partisi / boot ku UUID. Ngaran Array sacara téoritis tiasa robih.

Urang bakal milarian bagian sésana ku ngaran LVM dina notasi / dev / mapper / vg-lv, sabab aranjeunna ngaidentipikasi partisi rada unik.

Kami henteu nganggo UUID pikeun LVM sabab UUID tina volume LVM sareng jepretanna tiasa sami.Gunung /dev/mapper/root-root.. dua kali?Sumuhun. Leres pisan. Keunggulan BTRFS. Sistim file ieu bisa dipasang sababaraha kali kalawan subvols béda.

Alatan fitur anu sarua ieu, abdi nyarankeun pernah nyieun snapshots LVM tina volume BTRFS aktip. Anjeun tiasa kéngingkeun kejutan nalika anjeun reboot.

Hayu urang regenerasi konfigurasi mdadm:

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

Hayu urang saluyukeun setelan 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

Naon éta..?Kami parantos ngaktifkeun ékspansi otomatis kolam renang ipis LVM nalika ngahontal 90% tina rohangan anu dijajah ku 5% tina volume.

Kami geus ngaronjat jumlah maksimum blok cache pikeun LVM cache.

Kami parantos nyegah LVM milarian volume LVM (PV) dina:

  • alat nu ngandung cache LVM (cdata)
  • alat sindangan ngagunakeun cache LVM, bypassing cache ( _corig). Dina hal ieu, alat sindangan sorangan masih bakal discan ngaliwatan cache (ngan ).
  • alat nu ngandung LVM cache metadata (cmeta)
  • sadaya alat dina VG kalawan gambar ngaran. Di dieu urang bakal boga gambar disk tina mesin virtual, sarta kami teu hayang LVM on host pikeun Aktipkeun jilid milik OS tamu.
  • sadaya alat dina VG kalawan cadangan ngaran. Di dieu urang bakal gaduh salinan cadangan gambar mesin virtual.
  • sadaya alat anu ngaranna ditungtungan ku "gpv" (volume fisik tamu)

Kami parantos ngaktifkeun dukungan DISCARD nalika ngosongkeun rohangan bébas dina LVM VG. Ati-ati. Ieu bakal ngajantenkeun ngahapus LV dina SSD rada nyéépkeun waktos. Ieu hususna lumaku pikeun SSD RAID 6. Sanajan kitu, nurutkeun rencana, urang bakal ngagunakeun provisioning ipis, jadi ieu moal ngahalangan urang pisan.

Hayu urang ngapdet gambar initramfs:

#update-initramfs -u -k all

Pasang sareng konpigurasikeun grub:

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

Disk naon anu kedah dipilih?Sadayana anu sd*. Sistem kedah tiasa boot tina drive SATA atanapi SSD anu tiasa dianggo.

Naha aranjeunna nambahkeun os-prober ..?Pikeun kamerdikaan kaleuleuwihan jeung leungeun playful.

Teu dianggo leres lamun salah sahiji RAIDs dina kaayaan didegradasi. Éta nyobian milarian OS dina partisi anu dianggo dina mesin virtual anu dijalankeun dina hardware ieu.

Upami anjeun peryogi, anjeun tiasa ngantunkeunana, tapi émut sadayana di luhur. Abdi nyarankeun milarian resep pikeun ngaleungitkeun leungeun bangor online.

Kalayan ieu kami parantos réngsé pamasangan awal. Geus waktuna reboot kana OS anyar dipasang. Tong hilap nyabut CD/USB Live bootable.

#exit
#reboot

Pilih salah sahiji SATA SSDs salaku alat boot.

LVM on SATA SSD

Dina titik ieu, urang geus booted kana OS anyar, ngonpigurasi jaringan, apt, muka émulator terminal, sarta ngajalankeun:

#sudo bash

Hayu urang neruskeun.

"Initialize" susunan tina SATA SSD:

#blkdiscard /dev/md2

Upami éta henteu hasil, teras cobian:

#blkdiscard --step 65536 /dev/md2
Jieun LVM VG dina SATA SSD:

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

Naha lain VG..?Kanyataanna, urang geus boga VG ngaranna root. Naha henteu nambihan sadayana kana hiji VG?

Upami aya sababaraha PV dina VG, teras supados VG diaktipkeun leres, sadaya PV kedah hadir (online). Pangecualian nyaéta LVM RAID, anu kami ngahaja henteu dianggo.

Kami hoyong pisan upami aya kagagalan (baca leungitna data) dina susunan RAID 6, sistem operasi bakal boot normal sareng masihan kami kasempetan pikeun ngabéréskeun masalah.

Jang ngalampahkeun ieu, dina tingkat mimiti abstraksi urang bakal ngasingkeun unggal jenis fisik "média" kana VG misah.

Diomongkeun ilmiah, arrays RAID béda milik béda "domain réliabilitas". Anjeun teu kedah nyiptakeun titik kagagalan umum tambahan pikeun aranjeunna ku cara ngejat kana hiji VG.

Ayana LVM dina tingkat "hardware" bakal ngidinan urang pikeun wenang motong potongan arrays RAID béda ku ngagabungkeun aranjeunna dina cara béda. Contona - ngajalankeun одновременно bcache + LVM ipis, bcache + BTRFS, LVM cache + LVM ipis, konfigurasi ZFS kompléks nu mibanda caches, atawa campuran hellish séjén pikeun nyobaan tur dibandingkeun sadayana.

Dina tingkat "hardware", urang moal make nanaon lian ti alus heubeul "kandel" jilid LVM. Pangecualian pikeun aturan ieu tiasa janten partisi cadangan.

Jigana ku moment ieu, loba pamiarsa geus mimiti curiga hal ngeunaan boneka nyarang.

LVM on SATA HDD

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

VG anyar deui..?Kami hoyong pisan upami susunan disk anu bakal kami anggo pikeun nyadangkeun data gagal, sistem operasi kami bakal terus jalan normal, bari ngajaga aksés ka data non-cadangan sapertos biasa. Ku alatan éta, pikeun nyegah masalah aktivasina VG, urang nyieun VG misah.

Nyetél cache LVM

Hayu urang ngadamel LV dina NVMe RAID 1 pikeun dianggo salaku alat cache.

#lvcreate -L 70871154688B --name cache root

Naha saeutik pisan...?Kanyataanna nyaéta SSDs NVMe kami ogé ngagaduhan cache SLC. 4 gigabyte "bébas" sareng 18 gigabyte dinamis kusabab rohangan bébas anu aya dina MLC 3-bit. Sakali cache ieu béak, NVMe SSDs moal langkung gancang tibatan SATA SSD urang sareng cache. Sabenerna, pikeun alesan ieu, teu aya rasa pikeun urang sangkan partisi cache LVM leuwih badag batan dua kali ukuran tina cache SLC tina NVMe drive. Pikeun drive NVMe anu dianggo, panulis nganggap éta wajar pikeun ngadamel cache 32-64 gigabyte.

Ukuran partisi anu dipasihkeun diperyogikeun pikeun ngatur 64 gigabytes cache, cache metadata, sareng cadangan metadata.

Salaku tambahan, kuring perhatikeun yén saatos mareuman sistem anu kotor, LVM bakal nyirian sadayana cache salaku kotor sareng bakal nyingkronkeun deui. Leuwih ti éta, ieu bakal terus-terusan unggal waktos lvchange dipaké dina alat ieu dugi sistem rebooted deui. Ku alatan éta, kuring nyarankeun geuwat nyieun deui cache ngagunakeun Aksara luyu.

Hayu urang nyieun hiji LV on SATA RAID 6 pikeun make eta salaku alat sindangan.

#lvcreate -L 3298543271936B --name cache data

Naha ngan tilu terabyte..?Janten, upami diperyogikeun, anjeun tiasa nganggo SATA SSD RAID 6 pikeun sababaraha kabutuhan anu sanés. Ukuran spasi sindangan bisa ngaronjat dinamis, on laleur, tanpa stopping sistem. Jang ngalampahkeun ieu, anjeun kudu eureun samentara sarta ngaktipkeun deui cache nu, tapi kaunggulan has LVM-cache leuwih, Contona, bcache éta ieu bisa dipigawé dina laleur nu.

Hayu urang nyieun VG anyar pikeun cache.

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

Hayu urang nyieun hiji LV dina alat sindangan.

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

Di dieu kami langsung nyandak sadaya rohangan bébas dina / dev / data / cache supados sadaya partisi anu sanésna didamel langsung dina / dev / root / cache. Upami anjeun nyiptakeun hal anu salah, anjeun tiasa ngalihkeunana nganggo pvmove.

Hayu urang jieun sareng aktipkeun cache:

#lvcreate -y -L 64G -n cache cache /dev/root/cache
#lvcreate -y -L 1G -n cachemeta cache /dev/root/cache
#lvconvert -y --type cache-pool --cachemode writeback --chunksize 64k --poolmetadata cache/cachemeta cache/cache
#lvconvert -y --type cache --cachepool cache/cache cache/cachedata

Naha chunksize kitu..?Ngaliwatan percobaan praktis, panulis éta bisa manggihan yén hasil pangalusna kahontal lamun ukuran blok cache LVM coincides jeung ukuran blok ipis LVM. Leuwih ti éta, nu leuwih leutik ukuranana, nu hadé konfigurasi nedunan dina rékaman acak.

64k nyaeta ukuran blok minimum diwenangkeun pikeun LVM ipis.

Awas nulis balik..!Sumuhun. Jenis cache ieu nunda sinkronisasi nulis ka alat sindangan. Ieu ngandung harti yén lamun cache leungit, Anjeun bisa leungit data dina alat sindangan. Engké, panulis bakal nyarioskeun ka anjeun naon ukuran, salian NVMe RAID 1, tiasa dilaksanakeun pikeun ngimbangan résiko ieu.

Jinis cache ieu dipilih ngahaja pikeun ngimbangan kinerja nulis acak anu goréng tina RAID 6.

Hayu urang pariksa naon anu urang ngagaduhan:

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

Ngan [cachedata_corig] kedah aya dina /dev/data/cache. Upami aya anu lepat, teras nganggo pvmove.

Anjeun tiasa nganonaktipkeun cache upami diperyogikeun ku hiji paréntah:

#lvconvert -y --uncache cache/cachedata

Hal ieu dilakukeun online. LVM ngan saukur bakal nyingkronkeun cache kana disk, cabut, sareng ganti ngaran cachedata_corig deui kana cachedata.

Nyetél LVM ipis

Hayu urang kira-kira kira-kira sabaraha rohangan anu urang peryogikeun pikeun metadata ipis 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"

Babak nepi ka 4 gigabyte: 4294967296B

Kalikeun ku dua jeung tambahkeun 4194304B pikeun LVM PV metadata: 8594128896B
Hayu urang ngadamel partisi anu misah dina NVMe RAID 1 pikeun nempatkeun metadata ipis LVM sareng salinan cadanganna:

#lvcreate -L 8594128896B --name images root

Kanggo naon..?Di dieu patarosan bisa timbul: naha nempatkeun LVM metadata ipis misah lamun masih bakal sindangan on NVMe tur bakal dianggo gancang.

Sanajan speed penting didieu, éta tebih ti alesan utama. Hal éta cache nyaéta titik gagal. Aya anu tiasa kajantenan, sareng upami metadata ipis LVM sindangan, éta bakal nyababkeun sadayana leungit. Tanpa metadata lengkep, éta bakal ampir teu mungkin keur ngumpul volume ipis.

Ku mindahkeun metadata kana volume misah non-cached, tapi gancang, kami ngajamin kasalametan metadata dina acara leungitna cache atawa korupsi. Dina hal ieu, sagala karuksakan disababkeun ku leungitna cache bakal localized jero volume ipis, nu bakal simplify prosedur recovery ku pesenan gedena. Kalayan kamungkinan anu luhur, karusakan ieu bakal disimpen deui nganggo log FS.

Sumawona, upami snapshot tina volume ipis sateuacana dicandak, sareng saatos éta cache disingkronkeun sapinuhna sahenteuna sakali, teras, kusabab desain internal LVM ipis, integritas snapshot bakal dijamin upami aya leungitna cache. .

Hayu urang ngadamel VG énggal anu bakal tanggung jawab pikeun panyadiaan ipis:

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

Hayu urang ngadamel kolam renang:

#lvcreate -L 274877906944B --poolmetadataspare y --poolmetadatasize 4294967296B --chunksize 64k -Z y -T images/thin-pool
Naha -Z ySalian naon mode ieu sabenerna dimaksudkeun pikeun - pikeun nyegah data tina hiji mesin virtual bocor ka mesin virtual sejen nalika redistributing spasi - zeroing ieu Sajaba dipaké pikeun ngaronjatkeun kagancangan nulis acak dina blok leuwih leutik batan 64k. Tulisan naon waé anu kirang ti 64k ka daérah anu henteu dialokasikeun sateuacana tina volume ipis bakal janten 64K tepi-blok dina cache. Ieu bakal ngidinan operasi bisa dipigawé sagemblengna ngaliwatan cache nu, bypassing alat sindangan.

Hayu urang mindahkeun LVs ka PVs pakait:

#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

Hayu urang parios:

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

Hayu urang ngadamel volume ipis pikeun tés:

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

Kami bakal masang bungkusan pikeun tés sareng ngawaskeun:

#apt-get install sysstat fio

Ieu kumaha anjeun tiasa ningali paripolah konfigurasi panyimpenan kami sacara real waktos:

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

Ieu kumaha urang tiasa nguji konfigurasi urang:

#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

Ati-ati! Sumberdaya!Kode ieu bakal ngajalankeun 36 tés béda, unggal ngajalankeun pikeun 4 detik. Satengah tina tés kanggo ngarékam. Anjeun tiasa ngarekam seueur dina NVMe dina 4 detik. Nepi ka 3 gigabyte per detik. Janten, unggal tés tulisan tiasa tuang dugi ka 216 gigabyte sumberdaya SSD ti anjeun.

Maca jeung nulis dicampur?Sumuhun. Masuk akal pikeun ngajalankeun tés maca sareng nyerat sacara misah. Leuwih ti éta, asup akal pikeun mastikeun yén sadaya caches disingkronkeun supados tulisan anu dilakukeun sateuacana henteu mangaruhan bacaan.

Hasilna bakal rupa-rupa pisan salami peluncuran anu munggaran sareng anu salajengna nalika cache sareng volume ipis ngeusian, sareng ogé gumantung kana naha sistem tiasa nyinkronkeun cache anu dieusian salami peluncuran anu terakhir.

Diantara hal séjén, kuring nyarankeun ngukur laju dina volume ipis geus pinuh ti mana snapshot ngan dicokot. Panulis ngagaduhan kasempetan pikeun niténan kumaha tulisan acak ngagancangkeun gancang saatos nyiptakeun snapshot munggaran, khususna nalika cache henteu acan pinuh. Ieu lumangsung alatan salinan-on-tulis nulis semantik, alignment of cache sarta blok volume ipis, jeung kanyataan yén acak nulis ka razia 6 robah jadi acak dibaca ti razia 6 dituturkeun ku nulis ka cache nu. Dina konfigurasi urang, bacaan acak tina RAID 6 nepi ka 6 kali (jumlah SATA SSDs dina Asép Sunandar Sunarya) gancang ti nulis. Sabab blok pikeun CoW dialokasikeun sequentially ti kolam renang ipis, lajeng rekaman, keur bagian paling, ogé robah jadi sequential.

Kadua fitur ieu tiasa dianggo pikeun kauntungan anjeun.

Cache "koheren" snapshots

Pikeun ngurangan résiko leungitna data bisi ruksakna cache / leungitna, panulis proposes pikeun ngawanohkeun prakték puteran snapshots pikeun ngajamin integritas maranéhanana dina hal ieu.

Kahiji, sabab metadata volume ipis resides dina alat uncached, metadata bakal konsisten jeung kamungkinan karugian bakal diisolasi dina blok data.

Siklus rotasi snapshot di handap ieu ngajamin integritas data di jero snapshots bisi kaleungitan cache:

  1. Pikeun unggal volume ipis kalawan ngaran <ngaran>, nyieun snapshot kalawan ngaran <ngaran>.cached
  2. Hayu urang nyetel ambang migrasi ka nilai luhur lumrah: #lvchange --quiet --cachesettings "migration_threshold=16384" cache/cachedata
  3. Dina loop urang pariksa jumlah blok kotor dina cache nu: #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' nepi ka urang meunang nol. Lamun enol leungit pikeun lila teuing, éta bisa dijieun ku samentara ngaganti cache ka mode writethrough. Nanging, kalayan ngémutan karakteristik kacepetan susunan SATA sareng NVMe SSD kami, ogé sumber daya TBW na, anjeun bakal tiasa gancang nyandak momen tanpa ngarobih modeu cache, atanapi hardware anjeun bakal ngahakan sadayana sumber daya na. sababaraha poé. Kusabab keterbatasan sumber daya, sistem, prinsipna, henteu tiasa dina 100% beban nyerat sadaya waktos. SSDs NVMe kami dina 100% beban nyerat bakal ngaleungitkeun sumber daya 3-4 poé. SSDs SATA ngan ukur dua kali langkung lami. Kituna, urang bakal nganggap yén lolobana beban mana kana bacaan, sarta kami boga bursts jangka pondok rélatif aktivitas pisan tinggi digabungkeun jeung beban low rata-rata pikeun nulis.
  4. Pas urang nyekel (atawa nyieun) nol, urang ngaganti ngaran <name>.cached ka <name>.committed. <name> heubeul.committed dihapus.
  5. Opsional, upami cache 100% pinuh, éta tiasa diciptakeun deui ku naskah, sahingga ngabersihanana. Kalawan cache satengah kosong, sistem jalan leuwih gancang nalika nulis.
  6. Setel ambang migrasi ka nol: #lvchange --quiet --cachesettings "migration_threshold=0" cache/cachedata Ieu samentara bakal nyegah cache tina nyingkronkeun kana media utama.
  7. Urang antosan nepi ka cukup loba parobahan ngumpulkeun dina cache nu #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' atawa timer bakal pareum.
  8. Urang ulang deui.

Naha kasusah jeung ambang migrasi ...?Hal éta dina prakna nyata, rékaman "acak" sabenerna teu sagemblengna acak. Lamun urang nulis hiji hal ka sektor 4 kilobyte dina ukuranana, aya kamungkinan luhur yén dina sababaraha menit ka hareup rékaman bakal dilakukeun ka sarua atawa salah sahiji tatanggana (+- 32K) séktor.

Ku netepkeun bangbarung migrasi ka nol, urang nunda sinkronisasi nulis dina SATA SSD jeung agrégat sababaraha parobahan dina hiji blok 64K dina cache nu. Ieu sacara signifikan ngahemat sumberdaya SATA SSD.

Dimana kodena..?Hanjakalna, panulis nganggap dirina henteu cekap kompeten dina pamekaran skrip bash sabab anjeunna 100% otodidak sareng ngalaksanakeun pamekaran anu didorong "google", ku kituna anjeunna yakin yén kodeu dahsyat anu kaluar tina pananganana henteu kedah dianggo ku saha waé. lain.

Jigana nu professional dina widang ieu bakal tiasa bebas ngagambarkeun sakabeh logika ditétélakeun di luhur, lamun perlu, sarta, meureun, malah beautifully mendesain eta salaku layanan systemd, sakumaha panulis nyoba ngalakukeun.

Skéma rotasi snapshot saderhana sapertos kitu bakal ngamungkinkeun urang henteu ngan ukur gaduh hiji snapshot anu disingkronkeun pinuh dina SATA SSD, tapi ogé bakal ngamungkinkeun urang, ngagunakeun utilitas thin_delta, pikeun milari blok mana anu dirobih saatos nyiptakeunana, sahingga ngalokalisasi karusakan dina. volume utama, greatly nyederhanakeun recovery .

TRIM / DISCARD dina libvirt / KVM

Sabab gudang data bakal dipaké pikeun KVM ngajalankeun libvirt, mangka bakal jadi mangrupakeun ide nu sae pikeun ngajarkeun VM urang teu ukur nyandak up spasi bébas, tapi ogé pikeun ngosongkeun naon deui diperlukeun.

Hal ieu dilakukeun ku cara niru pangrojong TRIM/DISCARD dina disk virtual. Jang ngalampahkeun ieu, anjeun kudu ngarobah tipe controller pikeun virtio-scsi tur edit xml nu.

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

DISCARDs sapertos tina OSes tamu leres diolah ku LVM, sareng blok dibébaskeun leres dina cache sareng di kolam renang ipis. Dina kasus urang, ieu kajadian utamana dina cara nyangsang, nalika mupus snapshot salajengna.

BTRFS Nyadangkeun

Paké skrip siap-dijieun kalawan ekstrim caution jeung dina resiko sorangan. Panulis nyerat kode ieu nyalira sareng éksklusif pikeun dirina. Kuring yakin yén seueur pangguna Linux anu ngalaman gaduh alat anu sami, sareng henteu kedah nyalin anu sanés.

Hayu urang nyieun volume dina alat cadangan:

#lvcreate -L 256G --name backup backup

Hayu urang pormat dina BTRFS:

#mkfs.btrfs /dev/backup/backup

Hayu urang ngadamel titik gunung sareng pasang subseksi akar sistem file:

#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

Hayu urang jieun diréktori pikeun cadangan:

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

Hayu urang ngadamel diréktori pikeun skrip cadangan:

#mkdir /root/btrfs-backup

Hayu urang salin naskah:

Seueur kodeu bash pikasieuneun. Paké dina resiko sorangan. Ulah nulis surat ambek ka pangarang...#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

Naon eta malah ngalakukeun..?Ngandung sakumpulan paréntah basajan pikeun nyieun snapshots BTRFS sarta nyalin ka FS sejen maké BTRFS ngirim / narima.

Peluncuran munggaran tiasa kawilang panjang, sabab ... Dina awalna, sadaya data bakal disalin. Peluncuran salajengna bakal gancang pisan, sabab ... Ngan parobahan bakal disalin.

Skrip séjén anu bakal kami lebetkeun kana cron:

Sababaraha deui kode 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

Naon eusina..?Nyiptakeun sareng nyingkronkeun snapshot incremental tina jilid BTRFS anu didaptarkeun dina FS cadangan. Saatos ieu, éta ngahapus sadaya gambar anu diciptakeun 60 dinten ka pengker. Saatos peluncuran, snapshot tanggal tina jilid anu didaptarkeun bakal muncul dina /backup/btrfs/back/remote/ subdirectories.

Hayu urang masihan hak palaksanaan kode:

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

Hayu urang parios sareng lebetkeun kana 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 cadangan ipis

Hayu urang nyieun kolam renang ipis dina alat cadangan:

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

Hayu urang pasang ddrescue, sabab ... skrip bakal nganggo alat ieu:

#apt-get install gddrescue

Hayu urang ngadamel diréktori pikeun skrip:

#mkdir /root/lvm-thin-backup

Hayu urang salin naskah:

Loba bash di jero ...#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

Naon eusina...?Ngandung sakumpulan paréntah pikeun manipulasi snapshots ipis tur nyingkronkeun bédana antara dua snapshots ipis narima via thin_delta ka alat block sejen maké ddrescue na blkdiscard.

Skrip sanés anu bakal urang pasang dina cron:

Saeutik deui 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

Naon eusina...?Ngagunakeun skrip saméméhna pikeun nyieun jeung nyingkronkeun cadangan tina jilid ipis didaptarkeun. Skrip bakal ninggalkeun snapshots teu aktif tina jilid didaptarkeun, nu diperlukeun pikeun ngalacak parobahan saprak sinkronisasi panungtungan.

Skrip ieu kudu diédit, nangtukeun daptar volume ipis nu salinan cadangan kudu dijieun. Ngaran anu dipasihkeun ngan ukur kanggo tujuan ilustrasi. Upami anjeun hoyong, anjeun tiasa nyerat naskah anu bakal nyingkronkeun sadaya jilid.

Hayu urang masihan hak:

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

Hayu urang parios sareng lebetkeun kana 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

Peluncuran kahiji bakal panjang, sabab ... volume ipis bakal pinuh disingkronkeun ku nyalin sakabéh spasi dipaké. Hatur nuhun kana metadata ipis LVM, urang terang blok mana anu leres-leres dianggo, janten ngan ukur blok volume ipis anu dianggo anu bakal disalin.

Ngajalankeun salajengna bakal nyalin data incrementally berkat robah tracking via LVM metadata ipis.

Hayu urang tingali naon anu lumangsung:

#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

Naon hubunganana sareng boneka nyarang?

Paling dipikaresep, nunjukkeun yen LVM LV volume logis tiasa LVM PV volume fisik pikeun VGs séjén. LVM tiasa rekursif, sapertos boneka nyarang. Hal ieu méré LVM kalenturan ekstrim.

PS

Dina artikel salajengna, urang bakal coba ngagunakeun sababaraha sistem gudang mobile sarupa / KVM salaku dadasar pikeun nyieun gudang geo-disebarkeun / klaster vm kalawan redundancy on sababaraha buana ngagunakeun desktops imah, Internet imah jeung jaringan P2P.

sumber: www.habr.com

Tambahkeun komentar