Unsa ang managsama sa LVM ug Matryoshka?

Π”ΠΎΠ±Ρ€ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ суток.
Gusto nakong ipaambit sa komunidad ang akong praktikal nga kasinatian sa pagtukod og data storage system para sa KVM gamit ang md RAID + LVM.

Ang programa maglakip sa:

  • Pagtukod sa md RAID 1 gikan sa NVMe SSD.
  • Pag-assemble sa md RAID 6 gikan sa SATA SSD ug regular nga mga drive.
  • Mga bahin sa TRIM/DISCARD nga operasyon sa SSD RAID 1/6.
  • Paghimo og bootable md RAID 1/6 array sa usa ka komon nga set sa mga disk.
  • Pag-install sa sistema sa NVMe RAID 1 kung wala’y suporta sa NVMe sa BIOS.
  • Gamit ang LVM cache ug LVM thin.
  • Gamit ang mga snapshot sa BTRFS ug ipadala/dawat alang sa backup.
  • Gamit ang LVM thin snapshots ug thin_delta para sa BTRFS style backups.

Kung interesado ka, palihog tan-awa ang iring.

Paggamit nga porma

Ang tagsulat walay responsibilidad alang sa mga sangputanan sa paggamit o dili paggamit sa mga materyales / mga pananglitan / code / tip / data gikan sa kini nga artikulo. Pinaagi sa pagbasa o paggamit niini nga materyal sa bisan unsa nga paagi, ikaw adunay responsibilidad sa tanan nga mga sangputanan niini nga mga aksyon. Ang posibleng mga sangputanan naglakip sa:

  • Crisp-fried NVMe SSDs.
  • Hingpit nga nagamit ang kapanguhaan sa pagrekord ug pagkapakyas sa mga drive sa SSD.
  • Kompleto nga pagkawala sa tanan nga datos sa tanan nga mga drive, lakip ang mga backup nga kopya.
  • Sayop nga hardware sa kompyuter.
  • Nausik ang oras, nerbiyos ug kuwarta.
  • Ang bisan unsang ubang mga sangputanan nga wala gilista sa ibabaw.

Iron

Anaa kay:

Motherboard gikan sa palibot 2013 uban sa Z87 chipset, kompleto sa Intel Core i7 / Haswell.

  • Processor 4 cores, 8 threads
  • 32 GB DDR3 RAM
  • 1 x 16 o 2 x 8 PCIe 3.0
  • 1 x 4 + 1 x 1 PCIe 2.0
  • 6 x 6 GBps SATA 3 nga mga konektor

Ang SAS adapter LSI SAS9211-8I nag-flash sa IT / HBA mode. Ang firmware nga gipagana sa RAID gituyo nga gipulihan sa HBA firmware aron:

  1. Mahimo nimong ilabay kini nga adapter bisan unsang orasa ug pulihan kini sa bisan unsang lain nga imong nakit-an.
  2. Ang TRIM/Discard kasagarang nagtrabaho sa mga disk, tungod kay... sa RAID firmware kini nga mga sugo wala gisuportahan sa tanan, ug ang HBA, sa kinatibuk-an, wala magtagad kung unsa nga mga sugo ang gipasa sa bus.

Mga hard drive - 8 ka piraso sa HGST Travelstar 7K1000 nga adunay kapasidad nga 1 TB sa usa ka 2.5 form factor, sama sa mga laptop. Kini nga mga drive kaniadto sa usa ka RAID 6 array. Magamit usab sila sa bag-ong sistema. Sa pagtipig sa mga lokal nga backup.

Dugang gidugang:

6 ka piraso SATA SSD modelo Samsung 860 QVO 2TB. Kini nga mga SSD nanginahanglan usa ka dako nga volume, ang presensya sa usa ka SLC cache, kasaligan, ug usa ka mubu nga presyo ang gitinguha. Gikinahanglan ang suporta alang sa discard/zero, nga gisusi sa linya sa dmesg:

kernel: ata1.00: Enabling discard_zeroes_data

2 ka piraso sa NVMe SSD nga modelo nga Samsung SSD 970 EVO 500GB.

Alang niini nga mga SSD, ang random nga pagbasa/pagsulat nga katulin ug kapasidad sa kahinguhaan alang sa imong mga panginahanglan hinungdanon. Radiator alang kanila. Kinahanglan. Hingpit nga. Kung dili, iprito kini hangtod nga crispy sa una nga pag-synchronize sa RAID.

StarTech PEX8M2E2 adapter para sa 2 x NVMe SSD nga na-install sa PCIe 3.0 8x slot. Kini, pag-usab, usa ra ka HBA, apan alang sa NVMe. Kini lahi sa barato nga mga adapter tungod kay wala kini magkinahanglan og suporta sa PCIe bifurcation gikan sa motherboard tungod sa presensya sa usa ka built-in nga PCIe switch. Kini molihok bisan sa labing karaan nga sistema nga adunay PCIe, bisan kung kini usa ka x1 PCIe 1.0 slot. Natural, sa tukma nga tulin. Walay mga RAID didto. Walay built-in nga BIOS sa board. Mao nga, ang imong sistema dili mahika nga makakat-on sa pag-boot gamit ang NVMe, labi na ang NVMe RAID salamat sa kini nga aparato.

Kini nga sangkap tungod lamang sa presensya sa usa lamang ka libre nga 8x PCIe 3.0 sa sistema, ug, kung adunay 2 nga libre nga mga slot, dali kini mapulihan sa duha ka sentimos nga PEX4M2E1 o mga analogue, nga mapalit bisan diin sa presyo nga 600 ruble.

Ang pagsalikway sa tanang matang sa hardware o built-in nga chipset/BIOS RAIDs gihimo nga tinuyo, aron hingpit nga mapulihan ang tibuok sistema, gawas sa SSD/HDD mismo, samtang gipreserbar ang tanang datos. Sa tinuud, aron imong maluwas bisan ang na-install nga operating system kung mobalhin sa hingpit nga bag-o/lainlain nga hardware. Ang nag-unang butang mao nga adunay mga SATA ug PCIe port. Sama kini sa usa ka live CD o bootable flash drive, kusog ra kaayo ug gamay.

KatawaKung dili, nahibal-an nimo kung unsa ang mahitabo - usahay kinahanglan nimo nga dad-on ang tibuuk nga laray aron kuhaon. Apan dili ko gusto nga mawala ang datos. Aron mahimo kini, ang tanan nga gihisgutan nga media dali nga nahimutang sa mga slide sa 5.25 bay sa standard nga kaso.

Aw, ug, siyempre, alang sa pag-eksperimento sa lainlaing mga pamaagi sa SSD caching sa Linux.

Ang mga pag-atake sa hardware makalaay. I-on kini. Mahimo kini o dili. Ug sa mdadm kanunay adunay mga kapilian.

Software

Kaniadto, ang Debian 8 Jessie na-install sa hardware, nga duol sa EOL. Ang RAID 6 gitigum gikan sa gihisgutan sa ibabaw nga mga HDD nga gipares sa LVM. Gipadagan niini ang mga virtual machine sa kvm/libvirt.

Kay Ang tagsulat adunay angay nga kasinatian sa paghimo sa portable bootable SATA / NVMe flash drive, ug usab, aron dili mabuak ang naandan nga apt template, gipili ang Ubuntu 18.04 isip target nga sistema, nga igo na nga na-stabilize, apan adunay 3 ka tuig sa gihapon. suporta sa umaabot.

Ang gihisgutan nga sistema naglangkob sa tanan nga mga driver sa hardware nga kinahanglan namon nga wala sa kahon. Wala namo kinahanglana ang bisan unsang third-party nga software o mga drayber.

Pagpangandam alang sa instalar

Aron ma-install ang sistema kinahanglan namon ang Ubuntu Desktop Image. Ang sistema sa server adunay usa ka matang sa kusog nga installer, nga nagpakita sa sobra nga kagawasan nga dili ma-disable pinaagi sa pagduso sa partition sa UEFI system ngadto sa usa sa mga disk, nga makadaut sa tanan nga katahum. Busa, kini gi-install lamang sa UEFI mode. Wala nagtanyag bisan unsang kapilian.

Wala kami nalipay niini.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ?Ikasubo, ang UEFI boot dili kaayo katugma sa boot software RAID, tungod kay... Wala’y nagtanyag kanamo nga mga reserbasyon alang sa partisyon sa UEFI ESP. Adunay mga resipe sa online nga nagsugyot sa pagbutang sa partisyon sa ESP sa usa ka flash drive sa usa ka USB port, apan kini usa ka punto sa kapakyasan. Adunay mga resipe nga naggamit sa software nga mdadm RAID 1 nga adunay metadata nga bersyon 0.9 nga dili makapugong sa UEFI BIOS nga makita kini nga partisyon, apan kini mabuhi hangtod sa malipayon nga higayon kung ang BIOS o lain nga hardware OS nagsulat sa usa ka butang sa ESP ug nakalimot nga i-synchronize kini sa uban. mga salamin.

Dugang pa, ang boot sa UEFI nagdepende sa NVRAM, nga dili molihok kauban ang mga disk sa bag-ong sistema, tungod kay mao ang bahin sa motherboard.

Busa, dili kami mag-imbento pag-usab ug bag-ong ligid. Aduna na kami'y andam na, nasulayan na sa panahon nga bisikleta sa lolo, nga gitawag karon og Legacy/BIOS boot, nga nagdala sa garbo nga ngalan sa CSM sa UEFI-compatible nga mga sistema. Among kuhaon kini gikan sa estante, lubricate kini, bombahan ang mga ligid ug pahiran kini sa basa nga panapton.

Ang desktop nga bersyon sa Ubuntu dili usab ma-install sa husto sa Legacy bootloader, apan dinhi, ingon sa ilang giingon, labing menos adunay mga kapilian.

Ug busa, gikolekta namo ang hardware ug gikarga ang sistema gikan sa Ubuntu Live bootable flash drive. Kinahanglan namong i-download ang mga pakete, mao nga among i-set up ang network nga magamit nimo. Kung dili kini molihok, mahimo nimong i-load ang kinahanglan nga mga pakete sa usa ka flash drive nga abante.

Moadto kami sa palibot sa Desktop, maglansad sa terminal emulator, ug moadto kami:

#sudo bash

Giunsa…?Ang linya sa ibabaw mao ang canonical trigger alang sa mga holiwar bahin sa sudo. C bΠΎmas dako nga mga oportunidad moabut ugΠΎmas dako nga responsibilidad. Ang pangutana mao kung mahimo ba nimo kini sa imong kaugalingon. Daghang mga tawo ang naghunahuna nga ang paggamit sa sudo niining paagiha labing menos dili mabinantayon. Apan:

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

Ngano dili ZFS...?Kung nag-install kami og software sa among kompyuter, gipahulam namon ang among hardware sa mga nag-develop niini nga software aron magmaneho.
Kung gisaligan namon kini nga software sa kaluwasan sa among datos, nangutang kami nga katumbas sa gasto sa pagpahiuli niini nga datos, nga kinahanglan namon nga bayran sa umaabot.

Gikan niini nga punto sa panglantaw, ang ZFS usa ka Ferrari, ug ang mdadm+lvm mas susama sa usa ka bisikleta.

Sa tinuud, gipalabi sa tagsulat nga magpahulam ug bisikleta sa wala mailhi nga mga tawo imbis sa usa ka Ferrari. Didto, dili taas ang presyo sa isyu. Dili kinahanglan ang mga katungod. Mas simple kay sa mga lagda sa trapiko. Libre ang parking. Ang abilidad sa cross-country mas maayo. Mahimo nimo kanunay nga ibutang ang mga bitiis sa usa ka bisikleta, ug mahimo nimong ayohon ang usa ka bisikleta gamit ang imong kaugalingon nga mga kamot.

Ngano man BTRFS...?Aron ma-boot ang operating system, kinahanglan namon ang usa ka file system nga gisuportahan sa Legacy / BIOS GRUB gikan sa kahon, ug sa samang higayon nagsuporta sa mga live snapshot. Atong gamiton kini alang sa / boot partition. Dugang pa, mas gusto sa tagsulat nga gamiton kini nga FS para sa / (gamut), nga dili makalimtan nga timan-an nga alang sa bisan unsang ubang software mahimo ka makahimo og bulag nga mga partisyon sa LVM ug i-mount kini sa kinahanglan nga mga direktoryo.

Dili kami magtipig bisan unsang mga imahe sa mga virtual machine o database sa kini nga FS.
Kini nga FS gamiton lamang sa paghimo og mga snapshot sa sistema nga dili kini i-off ug dayon ibalhin kini nga mga snapshot ngadto sa backup nga disk gamit ang send/recieve.

Dugang pa, mas gusto sa tagsulat nga tipigan ang usa ka minimum nga software direkta sa hardware ug ipadagan ang tanan nga uban pang software sa virtual machine gamit ang mga butang sama sa pagpasa sa mga GPU ug PCI-USB Host controllers sa KVM pinaagi sa IOMMU.

Ang nahabilin nga mga butang sa hardware mao ang pagtipig sa datos, virtualization ug backup.

Kung mas mosalig ka sa ZFS, nan, sa prinsipyo, alang sa piho nga aplikasyon sila mabaylo.

Bisan pa, ang tagsulat tinuyo nga wala magtagad sa built-in nga mirroring/RAID ug redundancy nga mga bahin nga anaa sa ZFS, BRTFS ug LVM.

Isip usa ka dugang nga argumento, ang BTRFS adunay abilidad sa paghimo sa mga random nga pagsulat ngadto sa sunod-sunod nga mga, nga adunay usa ka hilabihan nga positibo nga epekto sa katulin sa pag-synchronize sa mga snapshot / backup sa HDD.

Atong rescan ang tanang device:

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

Atong tan-awon ang palibot:

#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

Layout sa disk

NVMe SSD

Apan dili namo sila markahan sa bisan unsang paagi. Ang tanan parehas, ang among BIOS wala makakita niini nga mga drive. Busa, sila moadto sa bug-os sa software RAID. Dili man ta maghimo ug mga seksyon didto. Kung gusto nimo sundon ang "canon" o "panguna", paghimo usa ka dako nga partisyon, sama sa usa ka HDD.

SATA HDD

Dili kinahanglan nga mag-imbento ug bisan unsang espesyal dinhi. Maghimo kami usa ka seksyon alang sa tanan. Maghimo kami usa ka partisyon tungod kay nakita sa BIOS kini nga mga disk ug mahimo pa nga sulayan nga mag-boot gikan kanila. I-install pa gani namo ang GRUB niini nga mga disk sa ulahi aron ang sistema makahimo niini nga kalit.

#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

Dinhi diin ang mga butang mahimong makapaikag alang kanamo.

Una, ang among mga drive 2 TB ang gidak-on. Anaa kini sa gidawat nga range alang sa MBR, nga mao ang among gamiton. Kung gikinahanglan, mahimong pulihan sa GPT. Ang mga disk sa GPT adunay usa ka layer sa pagkaangay nga nagtugot sa mga sistema nga nahiuyon sa MBR nga makita ang una nga 4 nga mga partisyon kung kini nahimutang sa sulod sa una nga 2 terabytes. Ang panguna nga butang mao nga ang partisyon sa boot ug partisyon sa bios_grub sa kini nga mga disk kinahanglan naa sa sinugdanan. Gitugotan ka niini nga mag-boot gikan sa GPT Legacy / BIOS drive.

Apan dili kini ang atong kaso.

Dinhi maghimo kita og duha ka mga seksyon. Ang una mahimong 1 GB sa gidak-on ug gamiton alang sa RAID 1 / boot.

Ang ikaduha gamiton alang sa RAID 6 ug kuhaon ang tanan nga nahabilin nga libre nga wanang gawas sa usa ka gamay nga wala gigahin nga lugar sa katapusan sa drive.

Unsa kini nga lugar nga wala’y marka?Sumala sa mga tinubdan sa network, ang among SATA SSDs adunay sakay sa usa ka dinamikong gipalapdan nga SLC cache gikan sa 6 hangtod 78 gigabytes. Nakuha namo ang 6 gigabytes nga "libre" tungod sa kalainan tali sa "gigabytes" ug "gibibytes" sa data sheet sa drive. Ang nahabilin nga 72 gigabytes gigahin gikan sa wala magamit nga wanang.

Dinhi kinahanglan nga matikdan nga kita adunay usa ka SLC cache, ug ang luna okupar sa 4 bit MLC mode. Nga alang kanamo epektibo nga nagpasabut nga sa matag 4 gigabytes nga libre nga wanang makakuha ra kami og 1 gigabyte nga cache sa SLC.

I-multiply ang 72 gigabytes sa 4 ug makakuha og 288 gigabytes. Kini ang libre nga wanang nga dili namon markahan aron tugutan ang mga drive nga hingpit nga magamit ang cache sa SLC.

Sa ingon, epektibo nga makakuha kami hangtod sa 312 gigabytes nga cache sa SLC gikan sa kinatibuk-an nga unom ka mga drive. Sa tanan nga mga drive, 2 ang gamiton sa RAID para sa redundancy.

Kini nga kantidad sa cache magtugot kanato sa hilabihan panagsa ra sa tinuod nga kinabuhi makasugat sa usa ka sitwasyon diin ang usa ka pagsulat dili moadto sa cache. Kini nga maayo kaayo nga bayad alang sa labing makapasubo nga disbentaha sa memorya sa QLC - ang labi ka ubos nga katulin sa pagsulat kung ang mga datos gisulat nga nag-agi sa cache. Kung ang imong mga karga dili katumbas niini, nan girekomenda ko nga imong hunahunaon pag-ayo kung unsa kadugay ang imong SSD sa ilawom sa ingon nga pagkarga, nga gikonsiderar ang TBW gikan sa data sheet.

#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

Paghimo og mga Array

Una, kinahanglan natong usbon ang ngalan sa makina. Kinahanglan kini tungod kay ang host name kabahin sa array name sa usa ka dapit sulod sa mdadm ug makaapekto sa usa ka butang sa usa ka dapit. Siyempre, ang mga arrays mahimong mabag-o sa ulahi, apan kini usa ka dili kinahanglan nga lakang.

#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

Ngano -assume-limpyo...?Aron malikayan ang pagsugod sa mga arrays. Kini balido alang sa RAID nga lebel 1 ug 6. Ang tanan mahimong molihok nga wala’y pagsugod kung kini usa ka bag-ong laray. Dugang pa, ang pagsugod sa SSD array sa pagmugna usa ka pag-usik sa kapanguhaan sa TBW. Gigamit namon ang TRIM/DISCARD kung mahimo sa mga gi-assemble nga SSD arrays aron "masugdan" kini.

Alang sa SSD arrays, ang RAID 1 DISCARD gisuportahan sa gawas sa kahon.

Alang sa SSD RAID 6 DISCARD arrays, kinahanglan nimo nga palihokon kini sa mga parameter sa kernel module.

Kinahanglan lang kini buhaton kung ang tanan nga SSDs nga gigamit sa lebel 4/5/6 arrays niini nga sistema adunay nagtrabaho nga suporta alang sa discard_zeroes_data. Usahay makit-an nimo ang mga katingad-an nga drive nga nagsulti sa kernel nga kini nga function gisuportahan, apan sa tinuud wala kini didto, o ang function dili kanunay molihok. Sa pagkakaron, ang suporta anaa halos bisan asa, bisan pa, adunay mga daan nga drive ug firmware nga adunay mga sayup. Tungod niini nga hinungdan, ang suporta sa DISCARD gi-disable pinaagi sa default alang sa RAID 6.

Atensyon, ang mosunod nga sugo makaguba sa tanang datos sa NVMe drives pinaagi sa "pagsugod" sa array nga adunay "zero".

#blkdiscard /dev/md0

Kung adunay sayup, sulayi pagtino ang usa ka lakang.

#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

Nganong dako kaayo...?Ang pagdugang sa gidak-on sa tipak adunay positibo nga epekto sa katulin sa random nga pagbasa sa mga bloke hangtod sa apil ang gidak-on sa tipak. Nahitabo kini tungod kay ang usa ka operasyon sa angay nga gidak-on o mas gamay mahimong makompleto sa usa ka aparato. Busa, ang IOPS gikan sa tanan nga mga himan gisumada. Sumala sa estadistika, 99% sa IO dili molapas sa 512K.

RAID 6 IOPS kada pagsulat kanunay ubos o katumbas sa IOPS sa usa ka drive. Kung, ingon usa ka random nga pagbasa, ang IOPS mahimong daghang beses nga mas dako kaysa sa usa ka drive, ug dinhi ang gidak-on sa block hinungdanon.
Wala makita sa tagsulat ang punto sa pagsulay sa pag-optimize sa usa ka parameter nga dili maayo sa RAID 6 pinaagi sa disenyo ug sa baylo gi-optimize kung unsa ang maayo sa RAID 6.
Among bayran ang kabus nga random nga pagsulat sa RAID 6 nga adunay cache sa NVMe ug mga trick sa paghatag og manipis.

Wala pa namo ma-enable ang DISCARD para sa RAID 6. Busa dili namo "i-initialize" kini nga array sa pagkakaron. Buhaton namo kini sa ulahi, human ma-install ang OS.

SATA HDD

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

LVM sa NVMe RAID

Alang sa katulin, gusto namong ibutang ang root file system sa NVMe RAID 1 nga mao ang /dev/md0.
Bisan pa, kinahanglan gihapon namo kining paspas nga han-ay alang sa ubang mga panginahanglan, sama sa swap, metadata ug LVM-cache ug LVM-thin metadata, mao nga maghimo kami og LVM VG niini nga array.

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

Maghimo kita og partition para sa root file system.

#lvcreate -L 128G --name root root

Maghimo kita og partition para sa swapping sumala sa gidak-on sa RAM.

#lvcreate -L 32G --name swap root

Pag-instalar sa OS

Sa kinatibuk-an, naa namo ang tanan nga gikinahanglan aron ma-install ang sistema.

Ilunsad ang wizard sa pag-install sa sistema gikan sa palibot sa Ubuntu Live. Normal nga pag-instalar. Sa yugto lamang sa pagpili sa mga disk alang sa pag-instalar, kinahanglan nimo nga ipiho ang mosunod:

  • / dev / md1, - mount point / boot, FS - BTRFS
  • / dev/root/root (aka /dev/mapper/root-root), - mount point / (root), FS - BTRFS
  • /dev/root/swap (aka /dev/mapper/root-swap), - gamita isip swap partition
  • I-install ang bootloader sa /dev/sda

Kung imong pilion ang BTRFS isip root file system, ang installer awtomatik nga maghimo ug duha ka volume sa BTRFS nga ginganlan og "@" para sa / (root), ug "@home" para sa /home.

Atong sugdan ang pag-instalar...

Ang pag-instalar matapos sa usa ka modal dialog box nga nagpakita sa usa ka sayup sa pag-instalar sa bootloader. Ikasubo, dili ka makagawas niini nga dialog gamit ang standard nga paagi ug ipadayon ang pag-instalar. Nag-log out kami sa sistema ug nag-log in pag-usab, nga natapos sa usa ka limpyo nga desktop sa Ubuntu Live. Ablihi ang terminal, ug pag-usab:

#sudo bash

Paghimo og chroot environment aron ipadayon ang pag-instalar:

#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

Atong i-configure ang network ug hostname sa chroot:

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

Adto ta sa chroot environment:

#chroot /mnt/chroot

Una sa tanan, ihatud namo ang mga pakete:

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

Atong susihon ug ayohon ang tanan nga mga pakete nga na-install nga hiwi tungod sa dili kompleto nga pag-instalar sa sistema:

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

Kung adunay dili molihok, kinahanglan nimo nga usbon una ang /etc/apt/sources.list

Atong i-adjust ang mga parameter para sa RAID 6 module aron mahimo ang TRIM/DISCARD:

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

Atong usbon gamay ang atong mga arrays:

#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

Unsa kadto..?Naghimo kami usa ka hugpong sa mga lagda sa udev nga buhaton ang mga musunud:

  • Ibutang ang block cache nga gidak-on alang sa RAID 2020 nga igo alang sa 6. Ang default nga bili, ingon og, wala mausab sukad sa paglalang sa Linux, ug dili igo sa dugay nga panahon.
  • Magreserba ug minimum nga IO alang sa gidugayon sa array checks/synchronizations. Kini aron mapugngan ang imong mga arrays gikan sa pag-stuck sa usa ka kahimtang sa walay katapusan nga pag-synchronize ubos sa load.
  • Limitahi ang pinakataas nga IO sa panahon sa pagsusi/pag-synchronize sa mga arrays. Kinahanglanon kini aron ang pag-synchronize/pagsusi sa SSD RAIDs dili makaprito sa imong mga drive ngadto sa presko. Tinuod kini ilabi na alang sa NVMe. (Hinumdumi ang bahin sa radiator? Wala ako nagbiaybiay.)
  • Idili ang mga disk sa pagpahunong sa spindle rotation (HDD) pinaagi sa APM ug itakda ang oras sa pagkatulog alang sa mga disk controller ngadto sa 7 ka oras. Mahimo nimong bug-os nga ma-disable ang APM kung mahimo kini sa imong mga drive (-B 255). Uban sa default nga kantidad, ang mga drive mohunong pagkahuman sa lima ka segundo. Dayon ang OS gusto nga i-reset ang disk cache, ang mga disk magtuyok pag-usab, ug ang tanan magsugod pag-usab. Ang mga disc adunay limitado nga maximum nga gidaghanon sa mga rotation sa spindle. Ang ingon nga yano nga default cycle dali nga makapatay sa imong mga disk sa usa ka magtiayon nga mga tuig. Dili tanan nga mga disk ang nag-antos niini, apan ang amon "laptop", nga adunay angay nga default nga mga setting, nga naghimo sa RAID nga tan-awon sama sa usa ka mini-MAID.
  • I-install ang readahead sa mga disk (nagtuyok) 1 megabyte - duha ka sunod-sunod nga bloke/chunk RAID 6
  • I-disable ang readahead sa mga arrays mismo.

Atong usbon /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

Ngano diay..?Pangitaon namo ang /boot partition pinaagi sa UUID. Ang pagngalan sa array mahimong mabag-o sa teorya.

Atong pangitaon ang nahabilin nga mga seksyon pinaagi sa mga ngalan sa LVM sa /dev/mapper/vg-lv notation, tungod kay ilang giila ang mga partisyon nga talagsaon.

Wala kami mogamit sa UUID alang sa LVM tungod kay Ang UUID sa mga volume sa LVM ug ang ilang mga snapshot mahimong parehas.Mount /dev/mapper/root-root.. kaduha?Oo. Sakto. Feature sa BTRFS. Kini nga file system mahimong ma-mount sa daghang mga higayon nga adunay lainlaing mga subvols.

Tungod sa parehas nga bahin, girekomenda ko nga dili gyud maghimo mga snapshot sa LVM sa aktibo nga mga volume sa BTRFS. Mahimong makakuha ka usa ka sorpresa kung mag-reboot ka.

Atong i-regenerate ang mdadm config:

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

Atong i-adjust ang LVM settings:

#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

Unsa kadto..?Nahimo namon ang awtomatik nga pagpalapad sa mga nipis nga pool sa LVM sa pag-abot sa 90% sa giokupar nga wanang sa 5% sa volume.

Gidugangan namo ang kinatas-ang gidaghanon sa mga bloke sa cache alang sa cache sa LVM.

Gipugngan namo ang LVM sa pagpangita sa mga volume sa LVM (PV) sa:

  • mga device nga adunay LVM cache (cdata)
  • mga device nga gi-cache gamit ang LVM cache, pag-bypass sa cache ( _corig). Sa kini nga kaso, ang gi-cache nga aparato mismo ma-scan gihapon pinaagi sa cache (lang ).
  • mga device nga adunay LVM cache metadata (cmeta)
  • tanan nga mga aparato sa VG nga adunay ngalan nga mga imahe. Dinhi kita adunay mga hulagway sa disk sa mga virtual machine, ug dili nato gusto nga ang LVM sa host mag-activate sa mga volume nga iya sa guest OS.
  • tanang device sa VG nga naay name backup. Dinhi kita adunay mga backup nga kopya sa mga imahe sa virtual machine.
  • tanang device kansang ngalan natapos sa "gpv" (pisikal nga volume sa bisita)

Nahimo namo ang suporta sa DISCARD sa dihang nagpagawas sa libreng luna sa LVM VG. Pag-amping. Kini maghimo sa pagtangtang sa mga LV sa SSD nga makagugol sa panahon. Kini ilabi na nga magamit sa SSD RAID 6. Bisan pa, sumala sa plano, mogamit kami og nipis nga probisyon, mao nga dili kini makababag kanamo.

Atong i-update ang initramfs image:

#update-initramfs -u -k all

I-install ug i-configure ang grub:

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

Unsang mga disk ang pilion?Tanan nga sd*. Ang sistema kinahanglan nga maka-boot gikan sa bisan unsang nagtrabaho nga SATA drive o SSD.

Nganong gidugangan nila ang os-prober..?Alang sa sobra nga independensya ug madula nga mga kamot.

Dili kini molihok sa husto kung ang usa sa mga RAID anaa sa usa ka degraded nga kahimtang. Gisulayan niini nga pangitaon ang OS sa mga partisyon nga gigamit sa mga virtual nga makina nga nagdagan sa kini nga hardware.

Kung kinahanglan nimo kini, mahimo nimong biyaan kini, apan hinumdomi ang tanan sa ibabaw. Girekomenda ko ang pagpangita sa mga resipe alang sa pagtangtang sa mga naughty nga mga kamot online.

Uban niini nahuman na namo ang inisyal nga pag-instalar. Panahon na nga mag-reboot sa bag-ong na-install nga OS. Ayaw kalimot sa pagtangtang sa bootable Live CD/USB.

#exit
#reboot

Pilia ang bisan unsang SATA SSDs isip boot device.

LVM sa SATA SSD

Niini nga punto, naka-boot na kami sa bag-ong OS, gi-configure ang network, apt, giablihan ang terminal emulator, ug gilunsad:

#sudo bash

Padayon ta.

"I-initialize" ang array gikan sa SATA SSD:

#blkdiscard /dev/md2

Kung dili kini molihok, unya sulayi:

#blkdiscard --step 65536 /dev/md2
Paghimo LVM VG sa SATA SSD:

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

Ngano naa pay VG..?Sa tinuud, naa na kami usa ka VG nga ginganlag gamut. Ngano nga dili idugang ang tanan sa usa ka VG?

Kung adunay daghang mga PV sa usa ka VG, aron ang VG ma-aktibo sa husto, ang tanan nga mga PV kinahanglan naa (online). Ang eksepsiyon mao ang LVM RAID, nga tinuyo nga wala namo gamita.

Gusto gyud namo nga kung adunay kapakyasan (basaha ang pagkawala sa datos) sa bisan unsang RAID 6 arrays, ang operating system normal nga mag-boot ug maghatag kanamo sa oportunidad nga masulbad ang problema.

Aron mahimo kini, sa unang lebel sa abstraction atong ihimulag ang matag matang sa pisikal nga "media" ngadto sa usa ka bulag nga VG.

Sa siyentipikanhong pagkasulti, lain-laing mga RAID arrays iya sa lain-laing mga "kasaligan domain". Dili ka kinahanglan maghimo usa ka dugang nga kasagarang punto sa kapakyasan alang kanila pinaagi sa pag-cramm kanila sa usa ka VG.

Ang presensya sa LVM sa lebel sa "hardware" magtugot kanamo sa arbitraryong pagputol sa mga piraso sa lainlaing RAID arrays pinaagi sa paghiusa niini sa lainlaing mga paagi. Pananglitan - dagan sa samang higayon bcache + LVM thin, bcache + BTRFS, LVM cache + LVM thin, usa ka komplikadong ZFS configuration nga adunay mga cache, o bisan unsa nga impyerno nga sagol aron sulayan ug itandi kining tanan.

Sa lebel sa "hardware", dili kami mogamit bisan unsa gawas sa maayo nga "baga" nga mga volume sa LVM. Ang eksepsiyon niini nga lagda mahimong ang backup partition.

Sa akong hunahuna niining higayona, daghang mga magbabasa ang nagsugod na sa pagduda bahin sa nagsalag nga monyeka.

LVM sa SATA HDD

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

Bag-ong VG na usab..?Gusto gyud namo nga kung ang disk array nga among gamiton alang sa pag-backup sa data mapakyas, ang among operating system magpadayon sa pagtrabaho nga normal, samtang nagpadayon sa pag-access sa non-backup nga data sama sa naandan. Busa, aron malikayan ang mga problema sa pagpaaktibo sa VG, maghimo kami usa ka lahi nga VG.

Pag-set up sa LVM cache

Maghimo kita og LV sa NVMe RAID 1 aron gamiton kini isip caching device.

#lvcreate -L 70871154688B --name cache root

Nganong gamay ra...?Ang tinuod mao nga ang among NVMe SSDs usab adunay SLC cache. 4 gigabytes nga "libre" ug 18 gigabytes nga dinamiko tungod sa libre nga luna nga giokupar sa 3-bit nga MLC. Kung nahurot na kini nga cache, ang NVMe SSDs dili labi ka paspas kaysa sa among SATA SSD nga adunay cache. Sa tinuud, tungod niini nga hinungdan, wala’y hinungdan alang kanamo nga himuon ang partisyon sa cache sa LVM nga labi ka dako kaysa doble sa gidak-on sa SLC cache sa NVMe drive. Alang sa NVMe drive nga gigamit, gikonsiderar sa tagsulat nga makatarunganon ang paghimo sa 32-64 gigabytes nga cache.

Ang gihatag nga gidak-on sa partisyon gikinahanglan aron maorganisar ang 64 gigabytes nga cache, cache metadata, ug metadata backup.

Dugang pa, namatikdan nako nga pagkahuman sa usa ka hugaw nga sistema sa pagsira, markahan sa LVM ang tibuuk nga cache nga hugaw ug mag-synchronize pag-usab. Dugang pa, kini gisubli sa matag higayon nga ang lvchange gigamit sa kini nga aparato hangtod ang sistema ma-reboot pag-usab. Busa, girekomendar nako ang paghimo dayon sa cache gamit ang angay nga script.

Maghimo kita og LV sa SATA RAID 6 aron magamit kini isip cached device.

#lvcreate -L 3298543271936B --name cache data

Nganong tulo ra ka terabytes..?Mao nga, kung gikinahanglan, mahimo nimong gamiton ang SATA SSD RAID 6 alang sa ubang mga panginahanglanon. Ang gidak-on sa gi-cache nga luna mahimong madugangan sa dinamikong paagi, sa langaw, nga walay paghunong sa sistema. Aron mahimo kini, kinahanglan nimo nga temporaryo nga hunongon ug i-enable pag-usab ang cache, apan ang lahi nga bentaha sa LVM-cache sa, pananglitan, bcache mao nga mahimo kini sa langaw.

Magbuhat ta ug bag-ong VG para sa caching.

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

Magbuhat ta ug LV sa naka-cache nga device.

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

Dinhi gikuha dayon namon ang tanan nga libre nga wanang sa / dev / data / cache aron ang tanan nga kinahanglan nga partisyon gihimo dayon sa / dev / gamut / cache. Kung nakahimo ka usa ka butang sa sayup nga lugar, mahimo nimo kini ibalhin gamit ang pvmove.

Himoon ug palihokon nato ang 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

Ngano chunksize man..?Pinaagi sa praktikal nga mga eksperimento, nahibal-an sa tagsulat nga ang labing kaayo nga sangputanan makab-ot kung ang gidak-on sa block sa cache sa LVM motakdo sa gidak-on sa nipis nga bloke sa LVM. Dugang pa, ang mas gamay nga gidak-on, mas maayo ang pag-configure nga gihimo sa usa ka random nga pagrekord.

Ang 64k mao ang minimum nga gidak-on sa block nga gitugotan alang sa nipis nga LVM.

Pag-amping sa pagsulat balik..!Oo. Kini nga matang sa cache naglangan sa pagsulat sa pag-synchronize sa cached device. Kini nagpasabot nga kon ang cache mawala, mahimo ka nga mawad-an sa data sa cached device. Sa ulahi, isulti kanimo sa tagsulat kung unsang mga lakang, dugang sa NVMe RAID 1, mahimo’g makuha aron mabayran kini nga peligro.

Kini nga tipo sa cache gipili nga tinuyo aron mabayran ang dili maayo nga random write performance sa RAID 6.

Atong susihon kung unsa ang atong nakuha:

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

Ang [cachedata_corig] ra ang kinahanglan mahimutang sa /dev/data/cache. Kung adunay sayup, gamita ang pvmove.

Mahimo nimong i-disable ang cache kung gikinahanglan sa usa ka command:

#lvconvert -y --uncache cache/cachedata

Gihimo kini online. I-sync lang sa LVM ang cache sa disk, tangtangon kini, ug ilisan ang ngalan sa cachedata_corig balik sa cachedata.

Pag-set up sa LVM nga manipis

Atong tan-awon kung unsa ka dako ang atong gikinahanglan alang sa LVM thin metadata:

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

Round hangtod sa 4 gigabytes: 4294967296B

I-multiply sa duha ug idugang ang 4194304B para sa LVM PV metadata: 8594128896B
Maghimo kita og bulag nga partisyon sa NVMe RAID 1 aron ibutang ang LVM thin metadata ug ang ilang backup nga kopya niini:

#lvcreate -L 8594128896B --name images root

Para unsa..?Dinhi ang pangutana mahimong motungha: nganong ibutang ang LVM nga nipis nga metadata nga gilain kung kini ma-cache pa sa NVMe ug molihok dayon.

Bisan kung ang katulin hinungdanon dinhi, layo kini sa panguna nga hinungdan. Ang butang mao nga ang cache usa ka punto sa kapakyasan. Adunay mahimo nga mahitabo niini, ug kung ang LVM nga manipis nga metadata gi-cache, kini ang hinungdan sa tanan nga hingpit nga mawala. Kung wala’y kompleto nga metadata, hapit imposible ang pag-assemble sa nipis nga mga volume.

Pinaagi sa pagbalhin sa metadata sa usa ka bulag nga dili-cached, apan paspas, nga gidaghanon, among gigarantiyahan ang kaluwasan sa metadata kung adunay pagkawala sa cache o pagkadunot. Sa kini nga kaso, ang tanan nga kadaot nga gipahinabo sa pagkawala sa cache ma-localize sa sulod sa nipis nga mga volume, nga makapasimple sa pamaagi sa pagbawi pinaagi sa mga mando sa kadako. Uban sa usa ka taas nga posibilidad, kini nga mga kadaot ibalik gamit ang FS logs.

Dugang pa, kung ang usa ka snapshot sa usa ka nipis nga volume gikuha kaniadto, ug pagkahuman ang cache hingpit nga na-synchronize labing menos kausa, nan, tungod sa internal nga disenyo sa LVM nga manipis, ang integridad sa snapshot masiguro kung adunay pagkawala sa cache. .

Maghimo kita og bag-ong VG nga maoy responsable sa thin-provisioning:

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

Magbuhat ta og pool:

#lvcreate -L 274877906944B --poolmetadataspare y --poolmetadatasize 4294967296B --chunksize 64k -Z y -T images/thin-pool
Ngano -Z yDugang pa sa kung unsa ang tinuod nga katuyoan niini nga mode - aron mapugngan ang data gikan sa usa ka virtual nga makina gikan sa pagtulo sa lain nga virtual machine kung mag-apod-apod pag-usab sa wanang - ang zeroing dugang nga gigamit aron madugangan ang katulin sa random nga pagsulat sa mga bloke nga gamay sa 64k. Ang bisan unsang pagsulat nga wala’y 64k sa usa ka kaniadto wala gigahin nga lugar sa nipis nga volume mahimong 64K nga gilinya sa sulud sa cache. Kini magtugot sa operasyon nga ipahigayon sa bug-os pinaagi sa cache, sa pag-bypass sa cached device.

Atong ibalhin ang mga LV sa katugbang nga mga PV:

#pvmove -n images/thin-pool_tdata /dev/root/images /dev/cache/cachedata
#pvmove -n images/lvol0_pmspare /dev/cache/cachedata /dev/root/images
#pvmove -n images/thin-pool_tmeta /dev/cache/cachedata /dev/root/images

Atong susihon:

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

Maghimo kita og nipis nga volume para sa mga pagsulay:

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

Mag-instalar kami og mga pakete alang sa mga pagsulay ug pag-monitor:

#apt-get install sysstat fio

Ingon niini kung giunsa nimo maobserbahan ang pamatasan sa among configuration sa pagtipig sa tinuud nga oras:

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

Mao kini ang paagi nga atong masulayan ang atong configuration:

#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

Pag-amping! Kapanguhaan!Kini nga code modagan sa 36 ka lain-laing mga pagsulay, ang matag usa modagan sa 4 segundos. Katunga sa mga pagsulay alang sa pagrekord. Makarekord ka og daghan sa NVMe sa 4 segundos. Hangtod sa 3 gigabytes matag segundo. Mao nga, ang matag dagan sa mga pagsulay sa pagsulat makakaon hangtod sa 216 gigabytes nga kahinguhaan sa SSD gikan kanimo.

Nagsagol ang pagbasa ug pagsulat?Oo. Makataronganon ang pagpadagan sa pagbasa ug pagsulat nga mga pagsulay nga gilain. Dugang pa, makatarunganon ang pagsiguro nga ang tanan nga mga cache gi-synchronize aron ang usa ka kaniadto nga gihimo nga pagsulat dili makaapekto sa pagbasa.

Ang mga resulta magkalainlain kaayo sa panahon sa una nga paglansad ug sa sunod nga mga ingon nga ang cache ug nipis nga volume napuno, ug depende usab kung ang sistema nakahimo sa pag-synchronize sa mga cache nga napuno sa katapusan nga paglansad.

Lakip sa ubang mga butang, girekomendar nako ang pagsukod sa katulin sa usa ka bug-os na nga nipis nga volume diin nakuha ang usa ka snapshot. Ang tagsulat adunay higayon sa pag-obserbar kung giunsa ang mga random nga pagsulat paspas nga paspas pagkahuman sa paghimo sa una nga snapshot, labi na kung ang cache dili pa hingpit nga puno. Kini mahitabo tungod sa copy-on-write write semantics, alignment sa cache ug thin volume blocks, ug ang kamatuoran nga ang random write sa RAID 6 nahimong random read gikan sa RAID 6 nga gisundan sa write to the cache. Sa among pag-configure, ang random nga pagbasa gikan sa RAID 6 hangtod sa 6 ka beses (ang gidaghanon sa mga SATA SSD sa array) mas paspas kaysa pagsulat. Kay Ang mga bloke alang sa CoW gibahin sa sunodsunod nga paagi gikan sa usa ka nipis nga pool, unya ang pagrekord, sa kadaghanan, nahimo usab nga sunud-sunod.

Ang duha niini nga mga bahin mahimong magamit sa imong kaayohan.

Pag-cache sa "coherent" nga mga snapshot

Aron makunhuran ang risgo sa pagkawala sa datos sa kaso sa pagkadaot sa cache/pagkawala, ang tagsulat nagsugyot sa pagpaila sa praktis sa rotating snapshots aron sa paggarantiya sa ilang integridad niini nga kaso.

Una, tungod kay ang nipis nga gidaghanon nga metadata nagpuyo sa usa ka wala ma-cached nga aparato, ang metadata mahimong makanunayon ug ang posible nga mga pagkawala malain sa sulod sa mga bloke sa datos.

Ang mosunod nga snapshot rotation cycle naggarantiya sa integridad sa data sulod sa snapshots sa kaso sa cache loss:

  1. Alang sa matag nipis nga volume nga adunay ngalan <name>, paghimo og snapshot nga adunay ngalan <name>.cached
  2. Atong ibutang ang migration threshold sa makatarunganong taas nga bili: #lvchange --quiet --cachesettings "migration_threshold=16384" cache/cachedata
  3. Sa loop atong susihon ang gidaghanon sa hugaw nga mga bloke sa cache: #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' hangtod nga ma zero mi. Kung ang zero nawala sa dugay nga panahon, mahimo kini pinaagi sa temporaryo nga pagbalhin sa cache sa writethrough mode. Bisan pa, nga gikonsiderar ang katulin nga mga kinaiya sa among SATA ug NVMe SSD arrays, ingon man ang ilang TBW nga kapanguhaan, mahimo nimo nga dali nga makuha ang higayon nga wala usba ang mode sa cache, o ang imong hardware hingpit nga mokaon sa tibuuk nga kapanguhaan niini. pipila ka adlaw. Tungod sa mga limitasyon sa kahinguhaan, ang sistema, sa prinsipyo, dili mahimong ubos sa 100% nga load sa pagsulat sa tanang panahon. Ang among mga NVMe SSD ubos sa 100% nga load sa pagsulat hingpit nga mahurot ang kapanguhaan 3-4 nga mga adlaw. Ang mga SATA SSDs molungtad lang og doble ang gitas-on. Busa, atong hunahunaon nga ang kadaghanan sa load moadto sa pagbasa, ug kita adunay medyo hamubo nga mga pagbuto sa hilabihan ka taas nga kalihokan inubanan sa usa ka ubos nga load sa kasagaran alang sa pagsulat.
  4. Sa diha nga kami nakakuha (o nakahimo) sa usa ka zero, among ilisan ang ngalan sa <name>.cached sa <name>.committed. Ang daan nga <name>.committed gipapas.
  5. Opsyonal, kung 100% puno ang cache, mahimo kini nga himuon pag-usab pinaagi sa usa ka script, sa ingon malimpyohan kini. Uban sa usa ka tunga nga walay sulod nga cache, ang sistema molihok nga mas paspas sa pagsulat.
  6. Ibutang ang migration threshold sa zero: #lvchange --quiet --cachesettings "migration_threshold=0" cache/cachedata Kini temporaryo nga magpugong sa cache gikan sa pag-synchronize sa main media.
  7. Naghulat kami hangtod nga daghang mga pagbag-o ang natipon sa cache #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' o ang timer mopalong.
  8. Atong balikon pag-usab.

Ngano nga mga kalisud sa migration threshold...?Ang butang mao nga sa tinuud nga praktis, ang usa ka "random" nga pagrekord sa tinuud dili hingpit nga random. Kung nagsulat kami sa usa ka sektor nga 4 ka kilobytes ang gidak-on, adunay taas nga posibilidad nga sa sunod nga mga minuto usa ka rekord ang mahimo sa parehas o usa sa mga silingan nga sektor (+- 32K).

Pinaagi sa pagtakda sa migration threshold ngadto sa zero, among gi-postpone ang pagsulat sa pag-synchronize sa SATA SSD ug gi-aggregate ang daghang mga pagbag-o sa usa ka 64K block sa cache. Kini hinungdanon nga makatipig sa kapanguhaan sa SATA SSD.

Asa ang code..?Ikasubo, giisip sa tagsulat ang iyang kaugalingon nga dili igo nga katakus sa pag-uswag sa mga script sa bash tungod kay siya 100% nga gitudlo sa kaugalingon ug nagpraktis sa pag-uswag nga gimaneho sa "google", busa nagtuo siya nga ang makalilisang nga code nga mogawas sa iyang mga kamot kinahanglan dili gamiton ni bisan kinsa. lain.

Sa akong hunahuna nga ang mga propesyonal sa kini nga natad makahimo nga independente nga maghulagway sa tanan nga lohika nga gihulagway sa ibabaw, kung gikinahanglan, ug, tingali, bisan sa matahum nga pagdesinyo niini ingon usa ka serbisyo sa systemd, sama sa gisulayan nga buhaton sa tagsulat.

Ang ingon nga yano nga snapshot rotation scheme magtugot kanato dili lamang sa kanunay nga adunay usa ka snapshot nga bug-os nga na-synchronize sa SATA SSD, apan tugotan usab kami, gamit ang thin_delta utility, aron mahibal-an kung unsang mga bloke ang giusab pagkahuman sa paghimo niini, ug sa ingon ma-localize ang kadaot sa ang mga nag-unang mga tomo, labi nga nagpayano sa pagkaayo.

TRIM/DISCARD sa libvirt/KVM

Kay ang pagtipig sa datos gamiton alang sa KVM nga nagpadagan sa libvirt, nan kini usa ka maayong ideya nga itudlo ang among mga VM dili lamang sa pagkuha sa libre nga wanang, apan aron usab mapahigawas ang wala na kinahanglan.

Gihimo kini pinaagi sa pagsunod sa suporta sa TRIM/DISCARD sa mga virtual disk. Aron mahimo kini, kinahanglan nimo nga usbon ang tipo sa controller sa virtio-scsi ug i-edit ang xml.

#virsh edit vmname
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='writethrough' io='threads' discard='unmap'/>
<source dev='/dev/images/vmname'/>
<backingStore/>
<target dev='sda' bus='scsi'/>
<alias name='scsi0-0-0-0'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>

<controller type='scsi' index='0' model='virtio-scsi'>
<alias name='scsi0'/>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</controller>

Ang ingon nga mga DISCARD gikan sa mga OS sa bisita husto nga giproseso sa LVM, ug ang mga bloke gibuhian sa husto sa cache ug sa nipis nga pool. Sa among kaso, kasagaran kini mahitabo sa usa ka nalangan nga paagi, kung gitangtang ang sunod nga snapshot.

Pag-backup sa BTRFS

Gamita ang andam na nga mga script nga adunay grabe pagbantay ug sa kaugalingon nga risgo. Ang tagsulat misulat niini nga code sa iyang kaugalingon ug alang lamang sa iyang kaugalingon. Sigurado ako nga daghang mga eksperyensiyado nga tiggamit sa Linux adunay parehas nga mga himan, ug dili kinahanglan nga kopyahon ang sa uban.

Maghimo kita og volume sa backup device:

#lvcreate -L 256G --name backup backup

Atong i-format kini sa BTRFS:

#mkfs.btrfs /dev/backup/backup

Himoon nato ang mga mount point ug i-mount ang root subsections sa file system:

#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

Maghimo kita og mga direktoryo alang sa mga backup:

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

Maghimo kita og direktoryo alang sa mga backup nga script:

#mkdir /root/btrfs-backup

Atong kopyahon ang script:

Daghang makahadlok nga bash code. Gamita sa imong kaugalingong risgo. Ayaw pagsulat ug kasuko nga mga sulat ngadto sa tagsulat...#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

Unsa man ang gibuhat niini..?Naglangkob sa usa ka hugpong sa yano nga mga mando alang sa paghimo sa mga snapshot sa BTRFS ug pagkopya niini sa lain nga FS gamit ang pagpadala / pagdawat sa BTRFS.

Ang una nga paglansad mahimong medyo taas, tungod kay ... Sa sinugdanan, ang tanang datos makopya. Ang dugang nga paglansad mahimong paspas kaayo, tungod kay ... Ang mga pagbag-o ra ang makopya.

Laing script nga atong ibutang sa cron:

Ang uban pang bash code#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

Unsa ang gibuhat niini..?Naghimo ug nag-synchronize sa mga incremental nga snapshot sa nalista nga mga volume sa BTRFS sa backup nga FS. Pagkahuman niini, gitangtang niini ang tanan nga mga litrato nga gihimo 60 ka adlaw ang milabay. Human sa paglusad, ang napetsahan nga mga snapshot sa nalista nga mga volume makita sa /backup/btrfs/back/remote/ subdirectories.

Atong ihatag ang mga katungod sa pagpatuman sa code:

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

Atong susihon ug ibutang sa 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 manipis nga backup

Maghimo kita og nipis nga pool sa backup device:

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

Atong i-install ang ddrescue, tungod kay... ang mga script mogamit niini nga himan:

#apt-get install gddrescue

Maghimo kita og direktoryo alang sa mga script:

#mkdir /root/lvm-thin-backup

Atong kopyahon ang mga script:

Daghang bash sa sulod...#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

Unsay gibuhat niini...?Naglangkob sa usa ka hugpong sa mga sugo alang sa pagmaniobra sa nipis nga mga snapshot ug pag-synchronize sa kalainan tali sa duha ka nipis nga mga snapshot nga nadawat pinaagi sa thin_delta ngadto sa laing block device gamit ang ddrescue ug blkdiscard.

Laing script nga atong ibutang sa cron:

Gamay pa nga 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

Unsay gibuhat niini...?Gigamit ang miaging script sa paghimo ug pag-synchronize sa mga backup sa nalista nga nipis nga mga volume. Ang script magbilin ug dili aktibo nga mga snapshot sa nalista nga mga volume, nga gikinahanglan aron masubay ang mga kausaban sukad sa kataposang pag-synchronize.

Kini nga script kinahanglan nga i-edit, nga nagtino sa lista sa nipis nga mga volume diin kinahanglan nga himuon ang mga backup nga kopya. Ang mga ngalan nga gihatag alang lamang sa mga katuyoan sa paghulagway. Kung gusto nimo, mahimo kang magsulat og script nga mag-synchronize sa tanang volume.

Atong ihatag ang mga katungod:

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

Atong susihon ug ibutang sa 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

Ang una nga paglansad dugay, tungod kay ... ang nipis nga mga volume bug-os nga madungan pinaagi sa pagkopya sa tanang gigamit nga luna. Salamat sa LVM nga manipis nga metadata, nahibal-an namon kung unsang mga bloke ang aktwal nga gigamit, mao nga ang aktwal nga gigamit nga manipis nga mga bloke sa volume ang makopya.

Ang sunod-sunod nga mga pagdagan magkopya sa datos nga hinay-hinay salamat sa pagbag-o sa pagsubay pinaagi sa LVM thin metadata.

Atong tan-awon kon unsay nahitabo:

#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

Unsa may kalabotan niini sa nagsalag nga mga monyeka?

Lagmit, tungod kay ang LVM LV logical volume mahimong LVM PV physical volumes para sa ubang VGs. Ang LVM mahimong recursive, sama sa mga nesting dolls. Naghatag kini sa LVM nga labi nga pagka-flexible.

PS

Sa sunod nga artikulo, atong sulayan ang paggamit sa pipila ka susamang mobile storage system/KVM isip basehan sa pagmugna og geo-distributed storage/vm cluster nga adunay redundancy sa daghang kontinente gamit ang mga home desktop, ang home Internet ug P2P networks.

Source: www.habr.com

Idugang sa usa ka comment