LVM ва Матрёшка чӣ умумӣ доранд?

Вақти хуби рӯз.
Ман мехоҳам бо ҷомеа таҷрибаи амалии худро дар бораи сохтани системаи нигоҳдории маълумот барои KVM бо истифода аз md RAID + LVM мубодила кунам.

Барнома дар бар мегирад:

  • Сохтани md RAID 1 аз NVMe SSD.
  • Ҷамъоварии md RAID 6 аз SATA SSD ва дискҳои муқаррарӣ.
  • Хусусиятҳои амалиёти TRIM/DISSCARD дар SSD RAID 1/6.
  • Эҷоди массиви пурборшаванда md RAID 1/6 дар маҷмӯи умумии дискҳо.
  • Насб кардани система дар NVMe RAID 1, вақте ки дар BIOS дастгирии NVMe вуҷуд надорад.
  • Истифодаи кэши LVM ва LVM лоғар.
  • Истифодаи аксҳои BTRFS ва ирсол/қабул барои нусхабардорӣ.
  • Истифодаи аксҳои лоғар LVM ва thin_delta барои нусхабардории сабки BTRFS.

Агар шумо таваҷҷӯҳ дошта бошед, лутфан гурбаро бубинед.

Шакли дархост

Муаллиф барои оқибатҳои истифода ё истифода накардани мавод/намунаҳо/код/маслиҳатҳо/маълумот аз ин мақола масъулият надорад. Бо хондан ё истифода бурдани ин мавод, шумо барои ҳама оқибатҳои ин амалҳо масъулият доред. Оқибатҳои эҳтимолӣ инҳоро дар бар мегиранд:

  • SSD-ҳои пухташудаи NVMe.
  • Манбаи сабт ва нокомии дискҳои SSD пурра истифода шудааст.
  • Нобудшавии пурраи ҳама маълумот дар ҳама дискҳо, аз ҷумла нусхаҳои эҳтиётӣ.
  • Таҷҳизоти нодурусти компютер.
  • Вақт, асабҳо ва пулро беҳуда сарф карданд.
  • Ҳама гуна оқибатҳои дигаре, ки дар боло номбар нашудаанд.

Iron

Дастрас буданд:

Модар тахта аз соли 2013 бо чипсети Z87, ки бо Intel Core i7 / Haswell мукаммал аст.

  • Протсессор 4 ядро, 8 ришта
  • 32 ГБ DDR3 RAM
  • 1 x 16 ё 2 x 8 PCIe 3.0
  • 1 x 4 + 1 x 1 PCIe 2.0
  • Пайвасткунакҳои 6 x 6 GBps SATA 3

Адаптери SAS LSI SAS9211-8I ба ҳолати IT / HBA дурахшид. Нармафзори бо RAID фаъолшуда қасдан бо нармафзори HBA иваз карда шудааст, то:

  1. Шумо метавонед ин адаптерро дар вақти дилхоҳ берун партоед ва онро бо дигар адаптере, ки дучор шудаед, иваз кунед.
  2. TRIM/Discard одатан дар дискҳо кор мекард, зеро... дар нармафзори RAID ин фармонҳо умуман дастгирӣ намешаванд ва HBA, умуман, парвое надорад, ки кадом фармонҳо тавассути автобус интиқол дода мешаванд.

Дискҳои сахт - 8 дона HGST Travelstar 7K1000 бо иқтидори 1 ТБ дар формати 2.5, ба монанди ноутбукҳо. Ин дискҳо қаблан дар массиви RAID 6 буданд. Онҳо инчунин дар системаи нав истифода хоҳанд кард. Барои нигоҳ доштани захираҳои маҳаллӣ.

Илова бар ин:

6 дона SATA SSD модели Samsung 860 QVO 2TB. Ин SSDҳо ҳаҷми калон, мавҷудияти кэши SLC, эътимоднокӣ ва нархи пастро талаб мекарданд. Дастгирии партофтан/сифр лозим буд, ки онро сатр дар dmesg тафтиш мекунад:

kernel: ata1.00: Enabling discard_zeroes_data

2 дона NVMe SSD модели Samsung SSD 970 EVO 500GB.

Барои ин SSDҳо, суръати тасодуфии хондан/навишт ва қобилияти захираҳо барои эҳтиёҷоти шумо муҳиманд. Радиатор барои онҳо. Ҳатман. Комилан. Дар акси ҳол, ҳангоми ҳамоҳангсозии аввалини RAID онҳоро то қаҳваранг бирён кунед.

Адаптери StarTech PEX8M2E2 барои 2 x NVMe SSD, ки дар ковокии PCIe 3.0 8x насб шудааст. Ин, боз ҳам, танҳо як HBA аст, аммо барои NVMe. Он аз адаптерҳои арзон бо он фарқ мекунад, ки он дастгирии бифуркатсияи PCIe аз motherboard бо сабаби мавҷудияти гузариши дарунсохт PCIe талаб намекунад. Он ҳатто дар системаи қадимтарин бо PCIe кор хоҳад кард, ҳатто агар он ковокии x1 PCIe 1.0 бошад. Табиист, ки бо суръати мувофиқ. Дар он ҷо ягон RAID вуҷуд надорад. Дар борт BIOS-и дарунсохт мавҷуд нест. Ҳамин тавр, системаи шумо ба таври ҷодугарӣ пурборкуниро бо NVMe намеомӯзад, ба шарофати ин дастгоҳ NVMe RAID камтар кор мекунад.

Ин ҷузъ танҳо аз сабаби мавҷудияти як 8x PCIe 3.0 дар система буд ва агар 2 ҷойи ройгон мавҷуд бошад, онро ба осонӣ бо ду динор PEX4M2E1 ё аналогҳо иваз кардан мумкин аст, ки онҳоро бо нархи 600 аз ҳама ҷо харидан мумкин аст. рубл.

Рад кардани ҳама гуна сахтафзор ё чипсетҳои дарунсохт/BIOS RAID-ҳо дидаву дониста анҷом дода шудааст, то тавонанд пурра иваз кардани тамоми система, ба истиснои худи SSD/HDD, ҳангоми нигоҳ доштани ҳама маълумот. Идеалӣ, то ки шумо метавонед ҳатто системаи оператсионии насбшударо ҳангоми гузаштан ба сахтафзори комилан нав / гуногун захира кунед. Муҳим он аст, ки портҳои SATA ва PCIe мавҷуданд. Он ба CD-и зинда ё флеши пурборшаванда монанд аст, танҳо хеле зуд ва каме калон аст.

ЮморДар акси ҳол, шумо медонед, ки чӣ рӯй медиҳад - баъзан ба шумо лозим меояд, ки фавран тамоми массиви худро бо худ гиред. Аммо ман намехоҳам маълумотро аз даст диҳам. Барои ин, ҳама васоити зикршуда дар слайдҳо дар 5.25 халиҷҳои корпуси стандартӣ ҷойгиранд.

Хуб, ва албатта, барои озмоиш бо усулҳои гуногуни кэшкунии SSD дар Linux.

Рейдхои аппаратура дилгиркунанда мебошанд. Онро фурӯзон кунед. Он ё кор мекунад ё не. Ва бо mdadm ҳамеша вариантҳо вуҷуд доранд.

Software

Қаблан, Debian 8 Jessie дар сахтафзор насб карда шуда буд, ки ба EOL наздик аст. RAID 6 аз HDD-ҳои дар боло зикршуда бо LVM пайваст карда шудааст. Он мошинҳои виртуалиро дар kvm/libvirt идора мекард.

Зеро Муаллиф дар эҷоди флеш-дискҳои пурборшавандаи SATA/NVMe таҷрибаи мувофиқ дорад ва инчунин барои вайрон накардани қолаби муқаррарии мувофиқ Ubuntu 18.04 ҳамчун системаи мақсаднок интихоб карда шуд, ки аллакай ба таври кофӣ мӯътадил шудааст, аммо то ҳол 3 сол дорад. дар оянда дастгирй мекунанд.

Системаи зикршуда тамоми драйверҳои сахтафзорро дар бар мегирад, ки ба мо аз қуттӣ лозим аст. Мо ба ягон нармафзор ё драйверҳои тарафи сеюм ниёз надорем.

Омодасозии барои насб

Барои насб кардани система ба мо Image Desktop Ubuntu лозим аст. Системаи сервер як навъ насбкунандаи пурқувват дорад, ки мустақилияти аз ҳад зиёдро нишон медиҳад, ки онро бо гузоштани қисмати системаи UEFI ба яке аз дискҳо ғайрифаъол кардан мумкин аст ва тамоми зебоиро вайрон мекунад. Мувофиқи он, он танҳо дар ҳолати UEFI насб карда мешавад. Ягон вариант пешниҳод намекунад.

Мо аз ин хурсанд нестем.

Чаро?Мутаассифона, пурборкунии UEFI бо нармафзори пурборкунандаи RAID хеле суст мувофиқ аст, зеро... Ҳеҷ кас ба мо барои қисмати UEFI ESP фармоиш пешниҳод намекунад. Дар Интернет дорухатҳо мавҷуданд, ки тавсия медиҳанд, ки қисмати ESP-ро дар флешдор дар порти USB ҷойгир кунед, аммо ин як нуқтаи ноком аст. Рецептҳо бо истифода аз нармафзори mdadm RAID 1 бо версияи метадата 0.9 мавҷуданд, ки ба UEFI BIOS аз дидани ин қисм монеъ намешаванд, аммо ин то лаҳзаи хушбахтона зиндагӣ мекунад, ки BIOS ё дигар OS сахтафзор ба ESP чизе менависад ва ҳамоҳангсозии онро бо дигар фаромӯш мекунад. оинахо.

Илова бар ин, пурборкунии UEFI аз NVRAM вобаста аст, ки дар баробари дискҳо ба системаи нав ҳаракат намекунад, зеро қисми motherboard мебошад.

Пас, мо чархи навро аз нав ихтироъ намекунем. Мо аллакай як дучархаи бобои бобои аз замон санҷидашуда дорем, ки ҳоло Legacy/BIOS boot ном дорад ва бо номи ифтихории CSM дар системаҳои бо UEFI мувофиқ. Факат онро аз раф мебардорем, равган мекунем, чарххоро насос мекунем ва бо матои нам тоза мекунем.

Варианти мизи кории Ubuntu низ бо боркунаки Legacy дуруст насб карда намешавад, аммо дар ин ҷо, тавре ки мегӯянд, ҳадди аққал вариантҳо мавҷуданд.

Ҳамин тариқ, мо сахтафзор ҷамъоварӣ мекунем ва системаро аз флеши пурборшавандаи Ubuntu Live бор мекунем. Мо бояд бастаҳоро зеркашӣ кунем, аз ин рӯ мо шабакаеро, ки барои шумо кор мекунад, насб мекунем. Агар он кор накунад, шумо метавонед бастаҳои заруриро ба диски флешдор пешакӣ бор кунед.

Мо ба муҳити мизи корӣ ворид мешавем, эмулятори терминалро оғоз мекунем ва меравем:

#sudo bash

Чӣ хел…?Сатри боло триггери каноникӣ барои holiwars дар бораи sudo мебошад. C боимкониятхои калонтар меоянд ваомасъулияти бештар. Савол ин аст, ки оё шумо метавонед онро худатон қабул кунед. Бисёр одамон фикр мекунанд, ки истифодаи sudo дар ин роҳ ҳадди аққал эҳтиёткор нест. Аммо:

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

Чаро ZFS не...?Вақте ки мо нармафзорро дар компютери худ насб мекунем, мо аслан сахтафзори худро ба таҳиягарони ин нармафзор барои рондан қарз медиҳем.
Вақте ки мо ба ин нармафзор ба бехатарии додаҳоямон боварӣ дорем, мо қарзро ба арзиши барқарорсозии ин маълумот мегирем, ки мо бояд рӯзе пардохт кунем.

Аз ин нуктаи назар, ZFS як Феррари аст ва мдамдм+лвм бештар ба велосипед монанд аст.

Субъективӣ, муаллиф ба ҷои як Феррари ба шахсони номаълум ба қарз дучарха доданро афзал медонад. Дар он чо нархи масъала баланд нест. Ба ҳуқуқ лозим нест. Аз қоидаҳои ҳаракат соддатар аст. Таваққуфгоҳ ройгон аст. Қобилияти байни кишварҳо беҳтар аст. Шумо ҳамеша метавонед пойҳоро ба велосипед пайваст кунед ва шумо метавонед велосипедро бо дасти худ таъмир кунед.

Пас чаро BTRFS ...?Барои пурбор кардани системаи оператсионӣ ба мо системаи файлие лозим аст, ки дар Legacy/BIOS GRUB аз қуттӣ дастгирӣ карда мешавад ва ҳамзамон аксҳои зиндаро дастгирӣ мекунад. Мо онро барои қисмати / boot истифода хоҳем кард. Илова бар ин, муаллиф бартарӣ медиҳад, ки ин FS-ро барои / (реша) истифода барад, фаромӯш накунед, ки барои ҳама гуна нармафзори дигар шумо метавонед дар LVM қисмҳои алоҳида эҷод кунед ва онҳоро дар директорияҳои зарурӣ насб кунед.

Мо дар ин ФС ягон тасвири мошинҳои виртуалӣ ё пойгоҳи додаҳоро нигоҳ намедорем.
Ин FS танҳо барои эҷоди аксҳои система бидуни хомӯш кардани он истифода мешавад ва сипас ин аксҳоро бо истифода аз ирсол/қабул ба диски эҳтиётӣ интиқол медиҳад.

Илова бар ин, муаллиф одатан афзалтар медонад, ки ҳадди ақали нармафзорро мустақиман дар сахтафзор нигоҳ дорад ва ҳама нармафзори дигарро дар мошинҳои виртуалӣ бо истифода аз чизҳое ба монанди интиқоли GPUs ва контроллерҳои PCI-USB Host ба KVM тавассути IOMMU иҷро кунад.

Ягона чизҳое, ки дар сахтафзор боқӣ мондаанд, нигоҳдории маълумот, виртуализатсия ва нусхабардорӣ мебошанд.

Агар шумо ба ZFS бештар эътимод дошта бошед, пас, аслан, барои замимаи зикршуда онҳо иваз карда мешаванд.

Бо вуҷуди ин, муаллиф дидаву дониста хусусиятҳои дарунсохташудаи mirroring/RAID ва зиёдатӣ, ки ZFS, BRTFS ва LVM доранд, нодида мегирад.

Ҳамчун далели иловагӣ, BTRFS дорои қобилияти табдил додани навиштаҷоти тасодуфӣ ба навбатӣ мебошад, ки ба суръати ҳамоҳангсозии аксҳо/нусхаҳо дар HDD таъсири бениҳоят мусбат мерасонад.

Биёед ҳамаи дастгоҳҳоро аз нав тафтиш кунем:

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

Биёед ба атроф назар андозем:

#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

Тарҳбандии диск

NVMe SSD

Аммо мо ба ҳеҷ ваҷҳ онҳоро қайд намекунем. Ба ҳар ҳол, BIOS-и мо ин дискҳоро намебинад. Ҳамин тавр, онҳо комилан ба нармафзори RAID хоҳанд рафт. Мо ҳатто дар он ҷо бахшҳо эҷод намекунем. Агар шумо хоҳед, ки "канон" ё "асосан" пайравӣ кунед, як қисмати калонро ба мисли HDD созед.

HDD SATA

Дар ин чо ягон чизи махсус ихтироъ кардан лозим нест. Мо барои ҳама як бахш эҷод мекунем. Мо қисматро эҷод хоҳем кард, зеро BIOS ин дискҳоро мебинад ва ҳатто метавонад аз онҳо пурбор кунад. Мо ҳатто дертар GRUB-ро дар ин дискҳо насб мекунем, то система ногаҳон ин корро кунад.

#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

Дар ин ҷо чизҳо барои мо ҷолиб мешаванд.

Аввалан, дискҳои мо андозаи 2 ТБ доранд. Ин дар доираи қобили қабул барои MBR аст, ки мо он чизеро истифода хоҳем бурд. Агар лозим бошад, онро бо GPT иваз кардан мумкин аст. Дискҳои GPT дорои қабати мутобиқат мебошанд, ки ба системаҳои бо MBR мувофиқ имкон медиҳад, ки 4 қисмати аввалро бинанд, агар онҳо дар 2 терабайтҳои аввал ҷойгир бошанд. Муҳим он аст, ки қисмати пурборкунанда ва қисмати bios_grub дар ин дискҳо бояд дар ибтидо бошад. Ин ҳатто ба шумо имкон медиҳад, ки аз дискҳои GPT Legacy/BIOS бор кунед.

Аммо ин кори мо нест.

Дар ин ҷо мо ду бахш эҷод мекунем. Аввалин андозаи он 1 ГБ хоҳад буд ва барои RAID 1 / boot истифода мешавад.

Дуюм барои RAID 6 истифода мешавад ва тамоми фазои холии боқимондаро мегирад, ба истиснои як майдони хурди ҷудонашуда дар охири диск.

Ин минтақаи номатлуб чист?Тибқи иттилои манбаъҳо дар шабака, SATA SSD-ҳои мо дар як кэши динамикӣ васеъшавандаи SLC доранд, ки андозаашон аз 6 то 78 гигабайт мебошанд. Мо аз сабаби фарқияти байни "гигабайтҳо" ва "гибибайтҳо" дар варақаи маълумоти диск 6 гигабайтро "бепул" мегирем. 72 гигабайти боқимонда аз фазои истифоданашуда ҷудо карда мешавад.

Дар ин ҷо бояд қайд кард, ки мо кэши SLC дорем ва ҷой дар ҳолати 4 бит MLC ишғол шудааст. Ин барои мо самаранок маънои онро дорад, ки барои ҳар 4 гигабайт фазои холӣ мо танҳо 1 гигабайт кэши SLC мегирем.

72 гигабайтро ба 4 зарб кунед ва 288 гигабайт гиред. Ин фазои озодест, ки мо онро қайд намекунем, то ба дискҳо имкон диҳанд, ки кэши SLC пурра истифода баранд.

Ҳамин тариқ, мо аз ҳамагӣ шаш диск то 312 гигабайт кэши SLC ба даст меорем. Аз ҳамаи дискҳо, 2-тоаш дар RAID барои зиёдатӣ истифода мешавад.

Ин миқдори кэш ба мо имкон медиҳад, ки дар ҳаёти воқеӣ хеле кам дучор шавем, ки навиштан ба кэш намеравад. Ин ғамангезтарин нуқсони хотираи QLC-ро хеле хуб ҷуброн мекунад - суръати бениҳоят пасти навиштан ҳангоми навиштани маълумот бо гузашти кэш. Агар бори шумо ба ин мувофиқат накунад, ман тавсия медиҳам, ки бо назардошти TBW аз варақаи маълумот дар бораи он, ки SSD-и шумо дар зери чунин сарборӣ то чӣ андоза давом мекунад, сахт фикр кунед.

#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

Эҷоди массивҳо

Аввалан, мо бояд номи мошинро тағир диҳем. Ин зарур аст, зеро номи мизбон як қисми номи массив дар ҷое дар дохили mdadm аст ва ба чизе дар ҷое таъсир мерасонад. Албатта, массивҳоро баъдтар номгузорӣ кардан мумкин аст, аммо ин як қадами нолозим аст.

#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

Чаро -фарз-пок...?Барои пешгирӣ кардани оғоз кардани массивҳо. Барои ҳарду сатҳи RAID 1 ва 6 ин эътибор дорад. Ҳама чиз метавонад бидуни оғозкунӣ кор кунад, агар он массиви нав бошад. Ғайр аз он, оғоз кардани массиви SSD ҳангоми офариниш сарфи беҳудаи манбаи TBW мебошад. Мо то ҳадди имкон дар массивҳои ҷамъшудаи SSD барои "оғоз" кардани онҳо TRIM/DISCARD-ро истифода мебарем.

Барои массивҳои SSD, RAID 1 DISCARD аз қуттӣ дастгирӣ карда мешавад.

Барои массивҳои SSD RAID 6 DISCARD, шумо бояд онро дар параметрҳои модули ядро ​​фаъол созед.

Ин бояд танҳо дар сурате анҷом дода шавад, ки ҳамаи SSD-ҳои дар массивҳои сатҳи 4/5/6 истифодашуда дар ин система барои discard_zeroes_data дастгирии корӣ дошта бошанд. Баъзан шумо бо дискҳои аҷибе дучор мешавед, ки ба ядро ​​мегӯянд, ки ин функсия дастгирӣ мешавад, аммо дар асл он вуҷуд надорад, ё ин функсия на ҳамеша кор мекунад. Дар айни замон, дастгирӣ қариб дар ҳама ҷо дастрас аст, аммо дискҳои кӯҳна ва нармафзори дорои хатогиҳо мавҷуданд. Аз ин сабаб, дастгирии DISCARD барои RAID 6 бо нобаёнӣ ғайрифаъол аст.

Диққат, фармони зерин ҳама маълумотро дар дискҳои NVMe бо роҳи "оғоз" кардани массив бо "сифрҳо" нест мекунад.

#blkdiscard /dev/md0

Агар чизе хато кунад, кӯшиш кунед, ки қадамро муайян кунед.

#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

Чаро ин қадар калон...?Баланд бардоштани андозаи порча ба суръати хондани тасодуфӣ дар блокҳо то андозаи фарогир таъсири мусбӣ мерасонад. Ин аз он сабаб рӯй медиҳад, ки як амалиёти андозаи мувофиқ ё хурдтар метавонад пурра дар як дастгоҳ анҷом дода шавад. Аз ин рӯ, IOPS аз ҳама дастгоҳҳо ҷамъбаст карда мешавад. Тибқи омор, 99% IO аз 512K зиёд нест.

RAID 6 IOPS барои як навиштан ҳамеша камтар ё баробар ба IOPS як диск. Вақте ки, ҳамчун хондани тасодуфӣ, IOPS метавонад аз як диск якчанд маротиба зиёдтар бошад ва дар ин ҷо андозаи блок аҳамияти калидӣ дорад.
Муаллиф нуқтаи кӯшиши оптимизатсияи параметреро намебинад, ки дар тарҳрезии RAID 6 бад аст ва ба ҷои он, ки RAID 6 хуб аст.
Мо навиштани тасодуфии камбизоати RAID 6-ро бо кэши NVMe ва ҳиллаҳои лоғар таъмин мекунем.

Мо то ҳол ДИSCARD-ро барои RAID 6 фаъол накардаем. Аз ин рӯ, мо ҳоло ин массивро "оғоз" намекунем. Мо ин корро баъд аз насб кардани ОС анҷом медиҳем.

HDD SATA

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

LVM дар NVMe RAID

Барои суръат, мо мехоҳем системаи файлии решаро дар NVMe RAID 1 ҷойгир кунем, ки /dev/md0 аст.
Бо вуҷуди ин, мо то ҳол ба ин массиви зуд барои эҳтиёҷоти дигар ниёз дорем, ба монанди своп, метадата ва LVM-кэш ва метамаълумоти LVM-лоғар, аз ин рӯ мо дар ин массив LVM VG эҷод мекунем.

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

Биёед барои системаи файлии реша қисмат эҷод кунем.

#lvcreate -L 128G --name root root

Биёед як қисмро барои ивазкунӣ мувофиқи андозаи RAM созем.

#lvcreate -L 32G --name swap root

Насби OS

Дар маҷмӯъ, мо ҳама чизро барои насб кардани система дорем.

Устоди насби системаро аз муҳити Ubuntu Live оғоз кунед. Насбкунии муқаррарӣ. Танҳо дар марҳилаи интихоби дискҳо барои насб, шумо бояд зеринро муайян кунед:

  • /dev/md1, - нуқтаи васлкунӣ / боркунӣ, FS - BTRFS
  • /dev/root/root (aka /dev/mapper/root-root), - нуқтаи пайвастшавӣ / (реша), FS - BTRFS
  • /dev/root/swap (aka /dev/mapper/root-swap), - ҳамчун қисмати своп истифода баред
  • Боркунаки боркунакро дар /dev/sda насб кунед

Вақте ки шумо BTRFS-ро ҳамчун системаи файлии реша интихоб мекунед, насбкунанда ба таври худкор ду ҷилди BTRFS-ро бо номи "@" барои / (реша) ва "@home" барои /home эҷод мекунад.

Биёед насбро оғоз кунем ...

Насбкунӣ бо қуттии муколамаи модалӣ ба анҷом мерасад, ки хатогиро дар насби боркунак нишон медиҳад. Мутаассифона, шумо наметавонед бо истифода аз воситаҳои стандартӣ аз ин муколама берун шавед ва насбро идома диҳед. Мо аз система хориҷ мешавем ва дубора ворид мешавем ва дар мизи кории Ubuntu Live тоза мекунем. Терминалро кушоед ва боз:

#sudo bash

Барои идома додани насб муҳити chroot эҷод кунед:

#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

Биёед шабака ва номи мизбонро дар chroot танзим кунем:

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

Биёед ба муҳити chroot равем:

#chroot /mnt/chroot

Пеш аз ҳама, мо бастаҳоро мерасонем:

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

Биёед ҳамаи бастаҳоеро, ки аз сабаби насби нопурраи система каҷ насб шудаанд, тафтиш ва ислоҳ кунем:

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

Агар чизе кор накунад, ба шумо лозим меояд, ки аввал /etc/apt/sources.list-ро таҳрир кунед

Биёед параметрҳои модули RAID 6-ро танзим кунем, то TRIM/DISSCARD-ро фаъол созем:

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

Биёед массивҳои худро каме тағир диҳем:

#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

Чӣ буд..?Мо як қатор қоидаҳои udev эҷод кардем, ки инҳоро иҷро мекунанд:

  • Андозаи кэши блокро барои RAID 2020 барои соли 6 мувофиқ созед. Ба назар чунин мерасад, ки арзиши пешфарз аз замони офариниши Linux тағйир наёфтааст ва муддати тӯлонӣ мувофиқ набуд.
  • Ҳадди ақали IO-ро барои давомнокии санҷишҳо/синхронизатсияи массив захира кунед. Ин барои пешгирӣ кардани он аст, ки массивҳои шумо дар ҳолати синхронизатсияи абадӣ зери сарборӣ намонанд.
  • Ҳадди ниҳоии IO-ро ҳангоми санҷиш/синхронизатсияи массивҳо маҳдуд кунед. Ин зарур аст, то синхронизатсия/тафтиши RAID-ҳои SSD драйвҳои шуморо ба қадри кофӣ пухта накунад. Ин махсусан барои NVMe дуруст аст. (Дар бораи радиатор дар хотир доред? Ман шӯхӣ намекардам.)
  • Дискҳоро аз қатъ кардани гардиши шпиндель (HDD) тавассути APM манъ кунед ва вақти хоби контроллерҳои дискро то 7 соат муқаррар кунед. Шумо метавонед APM-ро комилан ғайрифаъол кунед, агар дискҳои шумо ин корро карда тавонанд (-B 255). Бо арзиши пешфарз, дискҳо пас аз панҷ сония қатъ мешаванд. Он гоҳ OS мехоҳад кэши дискро аз нав барқарор кунад, дискҳо дубора чарх мезананд ва ҳама чиз аз нав оғоз мешавад. Дискҳо шумораи маҳдуди гардиши шпиндель доранд. Чунин давраи оддии пешфарз метавонад дискҳои шуморо дар тӯли якчанд сол ба осонӣ кушад. На ҳама дискҳо аз ин азоб мекашанд, аммо дискҳои мо "ноутбук" ҳастанд, ки танзимоти мувофиқи пешфарз доранд, ки RAID-ро ба мини-МАЙД монанд мекунанд.
  • Насб кардани пешакии хондан дар дискҳо (гардонанда) 1 мегабайт - ду блоки пайдарпай / пораи RAID 6
  • Хомӯш кардани хондан дар худи массивҳо.

Биёед /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

Барои чӣ ин..?Мо қисмати / boot-ро тавассути UUID ҷустуҷӯ хоҳем кард. Номгузории массив метавонад аз ҷиҳати назариявӣ тағир ёбад.

Мо қисмҳои боқимондаро аз рӯи номҳои LVM дар қайди /dev/mapper/vg-lv ҷустуҷӯ хоҳем кард, зеро онҳо қисмҳоро ба таври беназир муайян мекунанд.

Мо UUID-ро барои LVM истифода намебарем, зеро UUID-и ҳаҷми LVM ва аксҳои онҳо метавонанд якхела бошанд.Маунт /dev/mapper/root-root .. ду маротиба?Бале. Махз. Хусусияти BTRFS. Ин системаи файлиро метавон якчанд маротиба бо субволҳои гуногун насб кард.

Аз сабаби ин хусусият, ман тавсия медиҳам, ки ҳеҷ гоҳ аксҳои LVM-и ҳаҷми фаъоли BTRFS-ро эҷод накунам. Ҳангоми бозоғозӣ шумо метавонед сюрприз гиред.

Биёед конфигуратсияи mdadm-ро барқарор кунем:

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

Биёед танзимоти 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

Чӣ буд..?Мо тавсеаи автоматии ҳавзҳои лоғар LVMро имкон додем, ки пас аз расидан ба 90% фазои ишғолшуда ба 5% ҳаҷм.

Мо шумораи ниҳоии блокҳои кэшро барои кэши LVM зиёд кардем.

Мо LVM-ро аз ҷустуҷӯи ҳаҷми LVM (PV) дар:

  • дастгоҳҳои дорои кэши LVM (cdata)
  • дастгоҳҳое, ки бо истифодаи кэши LVM кэш карда шудаанд _кориг). Дар ин ҳолат, худи дастгоҳи кэшшуда ҳоло ҳам тавассути кэш скан карда мешавад (танҳо ).
  • дастгоҳҳои дорои метамаълумоти кэши LVM (cmeta)
  • ҳама дастгоҳҳо дар VG бо тасвирҳои ном. Дар ин ҷо мо тасвирҳои диски мошинҳои виртуалӣ хоҳем дошт ва мо намехоҳем, ки LVM дар мизбон ҳаҷми мутааллиқ ба OS меҳмонро фаъол созад.
  • ҳама дастгоҳҳо дар VG бо номи нусхабардорӣ. Дар ин ҷо мо нусхаҳои эҳтиётии тасвирҳои мошини виртуалиро хоҳем дошт.
  • ҳама дастгоҳҳое, ки номашон бо "gpv" тамом мешавад (ҳаҷми физикии меҳмонон)

Мо ҳангоми озод кардани фазои холӣ дар LVM VG дастгирии DISCARD-ро фаъол кардем. Эҳтиёт шав. Ин нест кардани LV-ҳоро дар SSD хеле вақт мегирад. Ин махсусан ба SSD RAID 6 дахл дорад. Аммо, мувофиқи нақша, мо провизияҳои лоғарро истифода мебарем, аз ин рӯ ин ба мо тамоман халал намерасонад.

Биёед тасвири initramfs -ро навсозӣ кунем:

#update-initramfs -u -k all

Grubро насб ва танзим кунед:

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

Кадом дискҳоро шумо бояд интихоб кунед?Хамаи онхое, ки сд*. Система бояд қодир бошад, ки аз ҳама гуна диски SATA ё SSD кор кунад.

Чаро онхо ос-проберро илова карданд..?Барои истиқлолияти аз ҳад зиёд ва дастони бозӣ.

Агар яке аз RAIDҳо дар ҳолати таназзул бошад, он дуруст кор намекунад. Он кӯшиш мекунад, ки OS-ро дар қисмҳое, ки дар мошинҳои виртуалӣ дар ин сахтафзор кор мекунанд, ҷустуҷӯ кунад.

Агар ба шумо лозим бошад, шумо метавонед онро тарк кунед, аммо ҳамаи чизҳои дар боло зикршударо дар хотир доред. Ман тавсия медиҳам, ки дар интернет дастурҳоро барои халос шудан аз дастҳои ношоям ҷустуҷӯ кунед.

Бо ин мо насби ибтидоиро анҷом додем. Вақти он расидааст, ки ба OS нав насбшуда аз нав оғоз кунед. Фаромӯш накунед, ки CD/USB-и пурборшавандаро хориҷ кунед.

#exit
#reboot

Яке аз SATA SSD-ро ҳамчун дастгоҳи пурборкунанда интихоб кунед.

LVM дар SATA SSD

Дар ин лаҳза, мо аллакай ба OS нав бор кардаем, шабакаро танзим кардем, мувофиқ, эмулятори терминалро кушоем ва иҷро кардем:

#sudo bash

Мо идома медиҳем.

Массивро аз SATA SSD "оғоз кунед":

#blkdiscard /dev/md2

Агар он кор накунад, кӯшиш кунед:

#blkdiscard --step 65536 /dev/md2
Дар SATA SSD LVM VG эҷод кунед:

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

Чаро дигар ВГ..?Дар асл, мо аллакай як VG бо номи реша дорем. Чаро ҳама чизро ба як VG илова накунед?

Агар дар VG якчанд PV мавҷуд бошад, пас барои дуруст фаъол кардани VG, ҳама PV-ҳо бояд мавҷуд бошанд (онлайн). Истисно LVM RAID аст, ки мо дидаву дониста онро истифода намебарем.

Мо дар ҳақиқат мехоҳем, ки агар дар яке аз массивҳои RAID 6 нокомӣ (талафоти хондани маълумот) вуҷуд дошта бошад, системаи оператсионӣ ба таври муқаррарӣ пурбор мешавад ва ба мо имкон медиҳад, ки мушкилотро ҳал кунем.

Барои ин, дар сатҳи якуми абстраксия мо ҳар як намуди "васоити ахбори омма" -и физикиро ба VG-и алоҳида ҷудо мекунем.

Агар аз ҷиҳати илмӣ гӯем, массивҳои гуногуни RAID ба "доменҳои эътимоднокӣ"-и гуногун тааллуқ доранд. Шумо набояд як нуқтаи умумии нокомиро барои онҳо эҷод карда, онҳоро ба як VG ворид кунед.

Мавҷудияти LVM дар сатҳи "сахтафзор" ба мо имкон медиҳад, ки қисмҳои массивҳои гуногуни RAID-ро тавассути омезиши онҳо бо роҳҳои гуногун худсарона бурем. Масалан - давидан дар айни замон bcache + LVM thin, bcache + BTRFS, cache LVM + LVM thin, конфигуратсияи мураккаби ZFS бо кэшҳо ё дигар омехтаи ҷаҳаннам барои кӯшиш ва муқоисаи ҳама.

Дар сатҳи "сахтафзор", мо ба ғайр аз ҳаҷми хуби "ғафси" LVM дигар чизеро истифода намебарем. Истиснои ин қоида метавонад қисмати эҳтиётӣ бошад.

Ман фикр мекунам, ки дар ин лаҳза, бисёре аз хонандагон аллакай дар бораи лӯхтаки лона гумонбар шуданд.

LVM дар SATA HDD

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

Боз VG нав ..?Мо воқеан мехоҳем, ки агар массиви диске, ки мо барои нусхабардории маълумот истифода мебарем, ноком шавад, системаи оператсионии мо ба таври муқаррарӣ корашро идома дода, дастрасиро ба маълумоти нусхабардории ғайримуқаррарӣ нигоҳ медорад. Аз ин рӯ, барои пешгирӣ кардани мушкилоти фаъолсозии VG, мо VG-и алоҳида эҷод мекунем.

Танзими кэши LVM

Биёед дар NVMe RAID 1 LV эҷод кунем, то онро ҳамчун дастгоҳи кэш истифода барем.

#lvcreate -L 70871154688B --name cache root

Чаро ин қадар кам аст...?Далели он аст, ки NVMe SSD-ҳои мо инчунин кэши SLC доранд. 4 гигабайт "озод" ва 18 гигабайт динамикӣ аз ҳисоби фазои холӣ дар MLC 3-бит. Пас аз тамом шудани ин кэш, NVMe SSDs аз SATA SSD-и мо бо кэш тезтар нахоҳад буд. Воқеан, аз ин сабаб, барои мо ҳеҷ маъно надорад, ки қисмати кэши LVM-ро аз ду маротиба аз андозаи кэши SLC гардонандаи NVMe калонтар кунем. Барои дискҳои NVMe истифодашуда, муаллиф 32-64 гигабайт кэшро оқилона мешуморад.

Андозаи тақсимоти додашуда барои ташкили 64 гигабайт кэш, метамаълумоти кэш ва нусхаи эҳтиётии метамаълумот лозим аст.

Илова бар ин, ман қайд мекунам, ки пас аз қатъ шудани системаи ифлос, LVM тамоми кэшро ҳамчун ифлос қайд мекунад ва дубора ҳамоҳанг хоҳад шуд. Ғайр аз он, ин ҳар дафъае, ки lvchange дар ин дастгоҳ истифода мешавад, то он даме, ки система дубора бозоғоз карда шавад, такрор мешавад. Аз ин рӯ, ман тавсия медиҳам, ки фавран кэшро бо истифода аз скрипти мувофиқ дубора эҷод кунед.

Биёед дар SATA RAID 6 LV эҷод кунем, то онро ҳамчун дастгоҳи кэш истифода барем.

#lvcreate -L 3298543271936B --name cache data

Чаро танҳо се терабайт..?Ҳамин тавр, агар лозим бошад, шумо метавонед SATA SSD RAID 6-ро барои эҳтиёҷоти дигар истифода баред. Андозаи фазои кэшро метавон ба таври динамикӣ, дар парвоз, бидуни қатъ кардани система афзоиш дод. Барои ин ба шумо лозим аст, ки муваққатан қатъ ва аз нав фаъол кардани кэш, аммо бартарии фарқкунандаи LVM-кэш бар, масалан, bcache дар он аст, ки ин корро дар парвоз кардан мумкин аст.

Биёед VG-и навро барои кэш созем.

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

Биёед дар дастгоҳи кэшшуда LV эҷод кунем.

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

Дар ин ҷо мо дарҳол тамоми фазои холиро дар /dev/data/cache гирифтем, то ки ҳамаи қисмҳои дигари зарурӣ фавран дар /dev/root/cache сохта шаванд. Агар шумо чизеро дар ҷои нодуруст сохта бошед, шумо метавонед онро бо истифода аз pvmove интиқол диҳед.

Биёед кэшро эҷод ва фаъол созем:

#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

Чаро чунин порчаҳо..?Тавассути таҷрибаҳои амалӣ, муаллиф тавонист фаҳмад, ки натиҷаи беҳтарин ба даст меояд, агар андозаи блоки кэши LVM бо андозаи блоки борики LVM мувофиқат кунад. Гузашта аз ин, андозаи хурдтар бошад, конфигуратсия дар сабти тасодуфӣ ҳамон қадар беҳтар иҷро мешавад.

64k андозаи ҳадди ақали блокест, ки барои LVM лоғар иҷозат дода шудааст.

Эҳтиёт бошед, ки ҷавоб нависед..!Бале. Ин намуди кэш синхронизатсияи навиштанро ба дастгоҳи кэш ба таъхир мегузорад. Ин маънои онро дорад, ки агар кэш гум шавад, шумо метавонед маълумотро дар дастгоҳи кэш гум кунед. Баъдтар, муаллиф ба шумо мегӯяд, ки ба ғайр аз NVMe RAID 1 барои ҷуброни ин хатар чӣ чораҳо андешидан мумкин аст.

Ин навъи кэш қасдан барои ҷуброн кардани иҷрои сусти навиштани тасодуфии RAID 6 интихоб шудааст.

Биёед бубинем, ки чӣ дорем:

#lvs -a -o lv_name,lv_size,devices --units B cache
LV LSize Devices
[cache] 68719476736B cache_cdata(0)
[cache_cdata] 68719476736B /dev/root/cache(0)
[cache_cmeta] 1073741824B /dev/root/cache(16384)
cachedata 3298539077632B cachedata_corig(0)
[cachedata_corig] 3298539077632B /dev/data/cache(0)
[lvol0_pmspare] 1073741824B /dev/root/cache(16640)

Танҳо [cachedata_corig] бояд дар /dev/data/cache ҷойгир бошад. Агар чизе нодуруст бошад, пас pvmove -ро истифода баред.

Агар лозим бошад, шумо метавонед кэшро бо як фармон хомӯш кунед:

#lvconvert -y --uncache cache/cachedata

Ин онлайн анҷом дода мешавад. LVM танҳо кэшро бо диск ҳамоҳанг мекунад, онро нест мекунад ва номи cachedata_corig-ро ба cachedata бармегардонад.

Насб кардани LVM thin

Биёед тахминан ҳисоб кунем, ки барои метамаълумоти лоғар 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"

Давраи то 4 гигабайт: 4294967296B

Ба ду зарб кунед ва 4194304B барои метамаълумоти LVM PV илова кунед: 8594128896B
Биёед дар NVMe RAID 1 як қисми алоҳида эҷод кунем, то метамаълумоти лоғар LVM ва нусхаи эҳтиётии онҳоро дар он ҷойгир кунем:

#lvcreate -L 8594128896B --name images root

Барои чӣ..?Дар ин ҷо савол пайдо шуда метавонад: чаро метамаълумоти лоғар LVM-ро алоҳида ҷойгир кунед, агар он дар NVMe кэш карда шавад ва зуд кор кунад.

Гарчанде ки суръат дар ин ҷо муҳим аст, аммо он аз сабаби асосӣ дур аст. Гап дар он аст, ки кэш нуқтаи ноком аст. Чизе метавонад бо он рӯй диҳад ва агар метамаълумоти лоғар LVM кэш карда шавад, он боиси комилан гум шудани ҳама чиз мегардад. Бе метамаълумоти мукаммал, ҷамъ кардани ҳаҷми борик қариб ғайриимкон хоҳад буд.

Бо интиқол додани метамаълумот ба ҳаҷми алоҳидаи кэшнашуда, вале зуд, мо бехатарии метамаълумотро дар сурати гум шудани кэш ё фасод кафолат медиҳем. Дар ин ҳолат, ҳама зараре, ки аз талафоти кэш ба вуҷуд омадааст, дар дохили ҳаҷмҳои лоғар ҷойгир карда мешавад, ки ин тартиби барқароркуниро бо фармоишҳои бузург содда мекунад. Бо эҳтимоли зиёд, ин хисорот бо истифода аз гузоришҳои FS барқарор карда мешавад.

Ғайр аз он, агар акси ҳаҷми борик қаблан гирифта шуда бошад ва пас аз он кэш ҳадди аққал як маротиба пурра ҳамоҳанг карда шуда бошад, пас аз сабаби тарҳи дохилии LVM thin, тамомияти акс дар сурати гум шудани кэш кафолат дода мешавад. .

Биёед як VG-и нав эҷод кунем, ки барои таъминоти лоғар масъул хоҳад буд:

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

Биёед як ҳавз эҷод кунем:

#lvcreate -L 274877906944B --poolmetadataspare y --poolmetadatasize 4294967296B --chunksize 64k -Z y -T images/thin-pool
Чаро -З йИлова бар он, ки ин режим воқеан барои он пешбинӣ шудааст - барои пешгирӣ кардани интиқоли маълумот аз як мошини маҷозӣ ба мошини дигари виртуалӣ ҳангоми тақсими фазо - сифркунӣ иловатан барои баланд бардоштани суръати навиштани тасодуфӣ дар блокҳои хурдтар аз 64к истифода мешавад. Ҳар як навиштаҷоти камтар аз 64к ба майдони қаблан тақсимнашудаи ҳаҷми борик дар кэш 64К ба канори канори он мувофиқ карда мешавад. Ин имкон медиҳад, ки амалиёт пурра тавассути кэш, канорагирии дастгоҳи кэшшуда иҷро карда шавад.

Биёед LV-ро ба 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

Биёед тафтиш кунем:

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

Биёед барои санҷишҳо ҳаҷми лоғар эҷод кунем:

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

Мо бастаҳоро барои санҷиш ва мониторинг насб мекунем:

#apt-get install sysstat fio

Ҳамин тавр шумо метавонед рафтори конфигуратсияи нигаҳдории моро дар вақти воқеӣ мушоҳида кунед:

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

Ин аст, ки мо метавонем конфигуратсияи худро санҷем:

#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

Бодиққат! Манбаъ!Ин код 36 санҷиши гуногунро иҷро мекунад, ки ҳар кадоми онҳо 4 сония кор мекунанд. Нисфи санҷишҳо барои сабт аст. Шумо метавонед дар NVMe дар 4 сония бисёр чизҳоро сабт кунед. То 3 гигабайт дар як сония. Ҳамин тавр, ҳар як санҷиши хаттӣ метавонад аз шумо то 216 гигабайт манбаи SSD-ро бихӯрад.

Хондан ва навиштан омехта?Бале. Санҷишҳои хондан ва навиштанро алоҳида иҷро кардан маъно дорад. Ғайр аз он, боварӣ ҳосил кардан лозим аст, ки ҳамаи кэшҳо ҳамоҳанг карда мешаванд, то навиштаҷоти қаблан сохташуда ба хондан таъсир нарасонад.

Натиҷаҳо ҳангоми оғозёбии аввал ва баъд аз пур шудани кэш ва ҳаҷми борик ва инчунин вобаста ба он, ки система тавонистааст кэшҳои пуршударо дар вақти оғози охирин ҳамоҳанг созад, хеле фарқ мекунад.

Дар байни чизҳои дигар, ман тавсия медиҳам, ки суръатро дар ҳаҷми аллакай пурра борик чен кунед, ки аз он навор гирифта шудааст. Муаллиф имкон дошт, ки мушоҳида кунад, ки чӣ гуна навиштани тасодуфӣ фавран пас аз эҷоди акси аввал якбора тезтар мешавад, хусусан вақте ки кэш ҳанӯз пурра пур нест. Ин аз сабаби семантикаи навиштани нусхабардорӣ ба навиштан, ҳамоҳангсозии кэш ва блокҳои ҳаҷми борик ва далели он, ки навиштани тасодуфӣ ба RAID 6 ба хондани тасодуфӣ аз RAID 6 ва пас аз навиштан ба кэш табдил меёбад. Дар конфигуратсияи мо, хониши тасодуфӣ аз RAID 6 нисбат ба навиштан то 6 маротиба (шумораи SATA SSD дар массив) тезтар аст. Зеро блокҳо барои CoW пайдарпай аз ҳавзи борик ҷудо карда мешаванд, пас сабт, аксар вақт, ба пайдарпай табдил меёбад.

Ҳардуи ин хусусиятҳо метавонанд ба манфиати шумо истифода шаванд.

Лавҳаҳои "ҳамбаста"-и кэш

Барои кам кардани хатари талафи додаҳо дар сурати вайрон шудан/гум шудани кэш, муаллиф пешниҳод мекунад, ки таҷрибаи гардиши аксҳоро барои кафолат додани тамомияти онҳо дар ин ҳолат ҷорӣ кунад.

Аввалан, азбаски метамаълумоти ҳаҷми борик дар дастгоҳи кэшнашуда ҷойгир аст, метадата пайваста хоҳад буд ва талафоти эҳтимолӣ дар блокҳои додаҳо ҷудо карда мешаванд.

Давраи гардиши аксҳои зерин тамомияти маълумотро дар дохили аксҳо дар сурати гум шудани кэш кафолат медиҳад:

  1. Барои ҳар як ҳаҷми борик бо номи <ном>, тасвири лаҳзае бо номи <name>.cached эҷод кунед
  2. Биёед ҳадди ниҳоии муҳоҷиратро ба арзиши баланди оқилона муқаррар кунем: #lvchange --quiet --cachesettings "migration_threshold=16384" cache/cachedata
  3. Дар давра мо шумораи блокҳои ифлосро дар кэш тафтиш мекунем: #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' то сифр ба даст орем. Агар сифр барои муддати тӯлонӣ нопадид шавад, онро бо роҳи муваққатан иваз кардани кэш ба реҷаи навиштан эҷод кардан мумкин аст. Аммо, бо дарназардошти хусусиятҳои суръати массивҳои SATA ва NVMe SSD, инчунин манбаи TBW, шумо метавонед бе тағир додани режими кэш лаҳзаро зуд ба даст оред ё сахтафзори шумо тамоми захираи худро дар чанд руз. Аз сабаби маҳдудияти захираҳо, система аслан наметавонад ҳамеша зери 100% сарбории навиштан бошад. NVMe SSD-ҳои мо зери 100% сарбории навиштан манбаро пурра тамом мекунанд Рӯзҳои 3-4. SSD-ҳои SATA танҳо ду маротиба дарозтар кор мекунанд. Аз ин рӯ, мо тахмин мезанем, ки қисми зиёди сарборӣ ба хондан меравад ва мо таркишҳои нисбатан кӯтоҳмуддати фаъолияти бениҳоят баланд дар якҷоягӣ бо сарбории кам ба ҳисоби миёна барои навиштан дорем.
  4. Ҳамин ки мо сифрро гирифтем (ё сохтем), мо номи <name>.cached-ро ба <ном>.committed иваз мекунем. <ном>-и кӯҳнаи содиршуда нест карда мешавад.
  5. Ихтиёрӣ, агар кэш 100% пур бошад, он метавонад тавассути скрипт дубора эҷод карда шавад ва ҳамин тавр онро тоза кунад. Бо кэши ним холӣ, система ҳангоми навиштан хеле тезтар кор мекунад.
  6. Ҳадди муҳоҷиратро ба сифр муқаррар кунед: #lvchange --quiet --cachesettings "migration_threshold=0" cache/cachedata Ин муваққатан синхронизатсияи кэшро бо медиаи асосӣ пешгирӣ мекунад.
  7. Мо интизор мешавем, ки дар кэш тағиротҳои зиёде ҷамъ шаванд #lvs --rows --reportformat basic --quiet -ocache_dirty_blocks cache/cachedata | awk '{print $2}' ё таймер хомӯш мешавад.
  8. Мо боз такрор мекунем.

Чаро мушкилиҳо бо остонаи муҳоҷират...?Гап дар он аст, ки дар амалияи воқеӣ сабти "тасодуфӣ" воқеан комилан тасодуфӣ нест. Агар мо чизеро ба бахши ҳаҷмаш 4 килобайт нависем, эҳтимоли зиёд вуҷуд дорад, ки дар чанд дақиқаи оянда сабт дар ҳамон ё яке аз секторҳои ҳамсоя (+- 32К) сабт шавад.

Бо муқаррар кардани ҳадди ниҳоии муҳоҷират, мо синхронизатсияи навиштанро дар SATA SSD ба таъхир меандозем ва якчанд тағиротро ба як блоки 64K дар кэш ҷамъ мекунем. Ин захираи SATA SSD-ро ба таври назаррас сарфа мекунад.

Рамз дар куҷост..?Мутаассифона, муаллиф худро дар таҳияи скриптҳои bash ба қадри кофӣ қобилиятнок мешуморад, зеро ӯ 100% худомӯз аст ва бо таҳияи "google" машқ мекунад, аз ин рӯ вай боварӣ дорад, ки рамзи даҳшатноке, ки аз дасти ӯ мебарояд, набояд аз ҷониби касе истифода шавад. дигар.

Ман фикр мекунам, ки мутахассисони ин соҳа метавонанд дар ҳолати зарурӣ тамоми мантиқи дар боло тавсифшударо мустақилона тасвир кунанд ва шояд ҳатто онро ҳамчун хидмати системавӣ, тавре ки муаллиф кӯшиш кард, ба таври зебо тарҳрезӣ кунад.

Чунин схемаи оддии гардиши аксҳо ба мо имкон медиҳад, ки на танҳо як аксро дар SATA SSD пурра ҳамоҳанг созем, балки инчунин ба мо имкон медиҳад, ки бо истифода аз утилитаи thin_delta бифаҳмем, ки кадом блокҳо пас аз офариниши он иваз карда шудаанд ва ба ин васила зарари онро локализатсия кунем. ҳаҷми асосӣ, хеле осонтар барқарорсозӣ .

TRIM/DISSCARD дар libvirt/KVM

Зеро нигоҳдории маълумот барои KVM-и libvirt истифода мешавад, он гоҳ хуб мебуд, ки ба VM-ҳои мо на танҳо фазои холӣ ишғол кунанд, балки он чизеро, ки дигар лозим нест, омӯзем.

Ин тавассути тақлид кардани дастгирии TRIM/DISSCARD дар дискҳои виртуалӣ анҷом дода мешавад. Барои ин, шумо бояд навъи контроллерро ба virtio-scsi тағир диҳед ва 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>

Чунин DISCARD-ҳои OS-ҳои меҳмонон аз ҷониби LVM дуруст коркард карда мешаванд ва блокҳо ҳам дар кэш ва ҳам дар ҳавзи борик дуруст озод карда мешаванд. Дар ҳолати мо, ин асосан ба таври таъхирнопазир ҳангоми нест кардани акси навбатӣ рух медиҳад.

Нусхаи BTRFS

Скриптҳои тайёрро бо шадид эҳтиёт ва ба хатари шахс. Муаллиф ин рамзро худаш ва танҳо барои худ навиштааст. Ман боварӣ дорам, ки бисёре аз корбарони ботаҷрибаи Linux асбобҳои шабеҳ доранд ва ба нусхабардории ягон каси дигар лозим нест.

Биёед дар дастгоҳи нусхабардорӣ ҳаҷми эҷод кунем:

#lvcreate -L 256G --name backup backup

Биёед онро дар BTRFS формат кунем:

#mkfs.btrfs /dev/backup/backup

Биёед нуқтаҳои васлкуниро эҷод кунем ва зербахшҳои решаи системаи файлиро насб кунем:

#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

Биёед директорияҳоро барои нусхабардорӣ созем:

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

Биёед директорияеро барои скриптҳои эҳтиётӣ созем:

#mkdir /root/btrfs-backup

Биёед скриптро нусхабардорӣ кунем:

Бисёр кодҳои даҳшатноки bash. Бо хатари худ истифода баред. Ба муаллиф мактубҳои хашмгин нанависед...#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

Он ҳатто чӣ кор мекунад..?Маҷмӯи фармонҳои оддиро барои эҷоди аксҳои BTRFS ва нусхабардории онҳо ба дигар FS бо истифода аз ирсол/қабули BTRFS дарбар мегирад.

Ифтитоҳи аввал метавонад нисбатан тӯлонӣ бошад, зеро... Дар ибтидо, ҳама маълумот нусхабардорӣ карда мешавад. Парвозҳои минбаъда хеле зуд хоҳанд буд, зеро ... Танҳо тағиротҳо нусхабардорӣ карда мешаванд.

Скрипти дигаре, ки мо ба cron мегузорем:

Боз як рамзи 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

Чӣ кор мекунад..?Суратҳои афзояндаи ҳаҷмҳои номбаршудаи BTRFS-ро дар FS нусхабардорӣ эҷод ва ҳамоҳанг мекунад. Пас аз ин, он ҳамаи тасвирҳои 60 рӯз пеш сохташударо нест мекунад. Пас аз оғози кор, аксҳои таърихии ҷилди номбаршуда дар зеркаталогҳои /backup/btrfs/back/remote/ пайдо мешаванд.

Биёед ҳуқуқҳои иҷрои кодро диҳем:

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

Биёед онро тафтиш кунем ва онро дар 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

Биёед дар дастгоҳи эҳтиётӣ ҳавзи борик эҷод кунем:

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

Биёед ddrescue-ро насб кунем, зеро... скриптҳо ин асбобро истифода мебаранд:

#apt-get install gddrescue

Биёед директорияро барои скриптҳо созем:

#mkdir /root/lvm-thin-backup

Биёед скриптҳоро нусхабардорӣ кунем:

Дарун бисёр ғазаб...#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

Чӣ кор мекунад...?Маҷмӯи фармонҳоро барои коркарди аксҳои борик ва ҳамоҳангсозии фарқияти ду акси борик, ки тавассути thin_delta ба дастгоҳи блоки дигар бо истифода аз ddrescue ва blkdiscard гирифта шудаанд, дар бар мегирад.

Скрипти дигаре, ки мо дар cron ҷойгир мекунем:

Каме бештар#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

Чӣ кор мекунад...?Скрипти қаблиро барои эҷод ва ҳамоҳангсозии нусхаҳои эҳтиётии ҳаҷми лоғар дар рӯйхат истифода мебарад. Скрипт аксҳои ғайрифаъол аз ҷилди номбаршударо мегузорад, ки барои пайгирии тағирот аз синхронизатсияи охирин лозиманд.

Ин скрипт бояд таҳрир карда шавад ва рӯйхати ҷилди лоғареро, ки барои онҳо бояд нусхаҳои эҳтиётӣ сохта шаванд, муайян кунад. Номҳои додашуда танҳо бо мақсади тасвирӣ мебошанд. Агар шумо хоҳед, шумо метавонед скрипт нависед, ки ҳамаи ҷилдиҳоро ҳамоҳанг созад.

Биёед ҳуқуқҳоро диҳем:

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

Биёед онро тафтиш кунем ва онро дар 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

Ифтитоҳи аввал тӯлонӣ хоҳад буд, зеро ... ҳаҷмҳои борик тавассути нусхабардории тамоми фазои истифодашуда пурра ҳамоҳанг карда мешаванд. Бо шарофати метамаълумоти лоғар LVM, мо медонем, ки кадом блокҳо воқеан истифода мешаванд, аз ин рӯ танҳо блокҳои ҳаҷми борик истифодашуда нусхабардорӣ карда мешаванд.

Давраҳои минбаъда ба туфайли тағир додани пайгирӣ тавассути метамаълумоти лоғар LVM маълумотро тадриҷан нусхабардорӣ мекунанд.

Биёед бубинем, ки чӣ шуд:

#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

Ин ба лӯхтакҳои лона чӣ иртибот дорад?

Эҳтимол, бо назардошти он, ки ҳаҷми мантиқии LVM LV метавонад ҳаҷми физикии LVM PV барои VG-ҳои дигар бошад. LVM метавонад рекурсивӣ бошад, ба монанди лӯхтакҳои лона. Ин ба LVM чандирии шадид медиҳад.

PS

Дар мақолаи навбатӣ, мо кӯшиш мекунем, ки якчанд системаҳои шабеҳи нигаҳдории мобилӣ/KVM-ро ҳамчун асос барои эҷоди кластери геологии тақсимшуда/vm бо зиёдатӣ дар якчанд қитъаҳо бо истифода аз мизи кории хонагӣ, Интернети хонагӣ ва шабакаҳои P2P истифода барем.

Манбаъ: will.com

Илова Эзоҳ