ืžื” ืžืฉื•ืชืฃ ืœ-LVM ื•ืžื˜ืจื™ื•ืฉืงื”?

ืฉึธืืœื•ึนื.
ื‘ืจืฆื•ื ื™ ืœื—ืœื•ืง ืขื ื”ืงื”ื™ืœื” ืืช ื”ื ื™ืกื™ื•ืŸ ื”ืžืขืฉื™ ืฉืœื™ ื‘ื‘ื ื™ื™ืช ืžืขืจื›ืช ืื—ืกื•ืŸ ื ืชื•ื ื™ื ืขื‘ื•ืจ KVM ื‘ืืžืฆืขื•ืช md RAID + LVM.

ื”ืชื•ื›ื ื™ืช ืชื›ืœื•ืœ:

  • ื‘ื ื™ื™ืช md RAID 1 ืž-NVMe SSD.
  • ื”ืจื›ื‘ืช md RAID 6 ืž-SATA SSD ื•ื›ื•ื ื ื™ื ืจื’ื™ืœื™ื.
  • ืชื›ื•ื ื•ืช ืฉืœ ืคืขื•ืœืช TRIM/DISCARD ื‘-SSD RAID 1/6.
  • ื™ืฆื™ืจืช ืžืขืจืš md RAID 1/6 ื”ื ื™ืชืŸ ืœืืชื—ื•ืœ ืขืœ ืงื‘ื•ืฆื” ืžืฉื•ืชืคืช ืฉืœ ื“ื™ืกืงื™ื.
  • ื”ืชืงื ืช ื”ืžืขืจื›ืช ื‘-NVMe RAID 1 ื›ืืฉืจ ืื™ืŸ ืชืžื™ื›ื” ื‘-NVMe ื‘-BIOS.
  • ืฉื™ืžื•ืฉ ื‘ืžื˜ืžื•ืŸ LVM ื•ื‘-LVM ื“ืง.
  • ืฉื™ืžื•ืฉ ื‘ืชืžื•ื ื•ืช BTRFS ื•ืฉืœื—/ืงื‘ืœ ืœื’ื™ื‘ื•ื™.
  • ืฉื™ืžื•ืฉ ื‘ืฆื™ืœื•ืžื™ ืžืฆื‘ ื“ืงื™ื ืฉืœ LVM ื•- thin_delta ืขื‘ื•ืจ ื’ื™ื‘ื•ื™ื™ื ื‘ืกื’ื ื•ืŸ BTRFS.

ืื ืืชื” ืžืขื•ื ื™ื™ืŸ, ืื ื ืจืื” ื—ืชื•ืœ.

ื”ืฆื”ืจื”

ื”ืžื—ื‘ืจ ืื™ื ื• ื ื•ืฉื ื‘ืื—ืจื™ื•ืช ื›ืœืฉื”ื™ ืœื”ืฉืœื›ื•ืช ืฉืœ ืฉื™ืžื•ืฉ ืื• ืื™ ืฉื™ืžื•ืฉ ื‘ื—ื•ืžืจื™ื/ื“ื•ื’ืžืื•ืช/ืงื•ื“/ื˜ื™ืคื™ื/ื ืชื•ื ื™ื ืžืžืืžืจ ื–ื”. ืขืœ ื™ื“ื™ ืงืจื™ืื” ืื• ืฉื™ืžื•ืฉ ื‘ื—ื•ืžืจ ื–ื” ื‘ื›ืœ ื“ืจืš ืฉื”ื™ื, ืืชื” ืœื•ืงื— ืื—ืจื™ื•ืช ืขืœ ื›ืœ ื”ื”ืฉืœื›ื•ืช ืฉืœ ืคืขื•ืœื•ืช ืืœื”. ื”ื”ืฉืœื›ื•ืช ื”ืืคืฉืจื™ื•ืช ื›ื•ืœืœื•ืช:

  • ื›ื•ื ื ื™ SSD NVMe ืžื˜ื•ื’ื ื™ื.
  • ืžื ื•ืฆืœ ืœื—ืœื•ื˜ื™ืŸ ืžืฉืื‘ ื”ืงืœื˜ื” ื•ื›ืฉืœ ื‘ื›ื•ื ื ื™ SSD.
  • ืื•ื‘ื“ืŸ ืžื•ื—ืœื˜ ืฉืœ ื›ืœ ื”ื ืชื•ื ื™ื ื‘ื›ืœ ื”ื›ื•ื ื ื™ื, ื›ื•ืœืœ ืขื•ืชืงื™ ื’ื™ื‘ื•ื™.
  • ื—ื•ืžืจืช ืžื—ืฉื‘ ืคื’ื•ืžื”.
  • ื‘ื–ื‘ื•ื– ื–ืžืŸ, ืขืฆื‘ื™ื ื•ื›ืกืฃ.
  • ื›ืœ ื”ืฉืœื›ื•ืช ืื—ืจื•ืช ืฉืื™ื ืŸ ืžืคื•ืจื˜ื•ืช ืœืขื™ืœ.

ื‘ืจื–ืœ

ื”ื–ืžื™ื ื™ื ื”ื™ื•:

ืœื•ื— ืื ืžืกื‘ื™ื‘ื•ืช 2013 ืขื ืขืจื›ืช ืฉื‘ื‘ื™ื Z87, ืฉืœื ืขื Intel Core i7 / Haswell.

  • ืžืขื‘ื“ 4 ืœื™ื‘ื•ืช, 8 ื—ื•ื˜ื™ื
  • ื–ื™ื›ืจื•ืŸ RAM ืฉืœ 32 GB DDR3
  • 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 TB ื‘ืคื•ืจืžื˜ 2.5, ื›ืžื• ืœืžื—ืฉื‘ื™ื ื ื™ื™ื“ื™ื. ื›ื•ื ื ื™ื ืืœื” ื”ื™ื• ื‘ืขื‘ืจ ื‘ืžืขืจืš RAID 6. ื™ื”ื™ื” ืœื”ื ืฉื™ืžื•ืฉ ื’ื ื‘ืžืขืจื›ืช ื”ื—ื“ืฉื”. ืœืื—ืกื•ืŸ ื’ื™ื‘ื•ื™ื™ื ืžืงื•ืžื™ื™ื.

ื ื•ืกืฃ ื ื•ืกืฃ:

6 ื—ืœืงื™ื SATA SSD ื“ื’ื Samsung 860 QVO 2TB. ื›ื•ื ื ื™ SSD ืืœื” ื“ืจืฉื• ื ืคื— ื’ื“ื•ืœ, ื ื•ื›ื—ื•ืช ืฉืœ ืžื˜ืžื•ืŸ SLC, ืืžื™ื ื•ืช ื•ืžื—ื™ืจ ื ืžื•ืš ื”ื™ื• ืจืฆื•ื™ื™ื. ื ื“ืจืฉื” ืชืžื™ื›ื” ื‘-discard/zero, ืืฉืจ ื ื‘ื“ืงืช ืขืœ ื™ื“ื™ ื”ืฉื•ืจื” ื‘-dmesg:

kernel: ata1.00: Enabling discard_zeroes_data

2 ื—ืชื™ื›ื•ืช ืฉืœ NVMe SSD ื“ื’ื Samsung SSD 970 EVO 500GB.

ืขื‘ื•ืจ SSDs ืืœื”, ืžื”ื™ืจื•ืช ืงืจื™ืื”/ื›ืชื™ื‘ื” ืืงืจืื™ืช ื•ื™ื›ื•ืœืช ื”ืžืฉืื‘ื™ื ืœืฆืจื›ื™ื ืฉืœืš ื—ืฉื•ื‘ื™ื. ืจื“ื™ืื˜ื•ืจ ืขื‘ื•ืจื. ื‘ื”ื›ืจื—. ื‘ื”ื—ืœื˜. ืื—ืจืช, ืžื˜ื’ื ื™ื ืื•ืชื ืขื“ ืฉื”ื ืคืจื™ื›ื™ื ื‘ืžื”ืœืš ืกื ื›ืจื•ืŸ ื”-RAID ื”ืจืืฉื•ืŸ.

ืžืชืื StarTech PEX8M2E2 ืขื‘ื•ืจ 2 x NVMe SSD ืžื•ืชืงืŸ ื‘ื—ืจื™ืฅ PCIe 3.0 8x. ื–ื”, ืฉื•ื‘, ื”ื•ื ืจืง HBA, ืื‘ืœ ืขื‘ื•ืจ NVMe. ื”ื•ื ืฉื•ื ื” ืžืชืืžื™ื ื–ื•ืœื™ื ื‘ื›ืš ืฉื”ื•ื ืื™ื ื• ื“ื•ืจืฉ ืชืžื™ื›ื” ื‘ืคื™ืฆื•ืœ PCIe ืžืœื•ื— ื”ืื ื‘ืฉืœ ื ื•ื›ื—ื•ืชื• ืฉืœ ืžืชื’ PCIe ืžื•ื‘ื ื”. ื–ื” ื™ืขื‘ื•ื“ ืืคื™ืœื• ื‘ืžืขืจื›ืช ื”ืขืชื™ืงื” ื‘ื™ื•ืชืจ ืขื PCIe, ื’ื ืื ื–ื” ื—ืจื™ืฅ X1 PCIe 1.0. ื‘ืื•ืคืŸ ื˜ื‘ืขื™, ื‘ืžื”ื™ืจื•ืช ื”ืžืชืื™ืžื”. ืื™ืŸ ืฉื RAIDs. ืื™ืŸ BIOS ืžื•ื‘ื ื” ื‘ืœื•ื—. ืื–, ื”ืžืขืจื›ืช ืฉืœืš ืœื ืชืœืžื“ ื‘ืื•ืคืŸ ืงืกื•ื ืœืืชื—ืœ ืขื NVMe, ื•ืคื—ื•ืช ืœืขืฉื•ืช NVMe RAID ื”ื•ื“ื•ืช ืœืžื›ืฉื™ืจ ื”ื–ื”.

ืจื›ื™ื‘ ื–ื” ื ื‘ืข ืืš ื•ืจืง ืžื”ื ื•ื›ื—ื•ืช ืฉืœ PCIe 8 ื—ื™ื ืžื™ ืื—ื“ ื‘ืœื‘ื“ ื‘ืžืขืจื›ืช, ื•ืื ื™ืฉ 3.0 ื—ืจื™ืฆื™ื ืคื ื•ื™ื™ื, ื ื™ืชืŸ ืœื”ื—ืœื™ืฃ ืื•ืชื• ื‘ืงืœื•ืช ื‘ืฉื ื™ ืื’ื•ืจื•ืช PEX2M4E2 ืื• ืื ืœื•ื’ื™ื, ืื•ืชื ื ื™ืชืŸ ืœืงื ื•ืช ื‘ื›ืœ ืžืงื•ื ื‘ืžื—ื™ืจ ืฉืœ 1 ืจื•ื‘ืœ.

ื“ื—ื™ื™ืช ื›ืœ ืžื™ื ื™ ื—ื•ืžืจื” ืื• ืขืจื›ืช ืฉื‘ื‘ื™ื/BIOS RAID ืžื•ื‘ื ื™ื ื ืขืฉืชื” ื‘ื›ื•ื•ื ื”, ืขืœ ืžื ืช ืฉื ื™ืชืŸ ื™ื”ื™ื” ืœื”ื—ืœื™ืฃ ืœื—ืœื•ื˜ื™ืŸ ืืช ื›ืœ ื”ืžืขืจื›ืช, ืœืžืขื˜ ื”-SSD/HDD ืขืฆืžื, ืชื•ืš ืฉืžื™ืจื” ืขืœ ื›ืœ ื”ื ืชื•ื ื™ื. ื‘ืื•ืคืŸ ืื™ื“ื™ืืœื™, ื›ืš ืฉืชื•ื›ืœ ืœืฉืžื•ืจ ืืคื™ืœื• ืืช ืžืขืจื›ืช ื”ื”ืคืขืœื” ื”ืžื•ืชืงื ืช ื‘ืขืช ืžืขื‘ืจ ืœื—ื•ืžืจื” ื—ื“ืฉื”/ืฉื•ื ื” ืœื—ืœื•ื˜ื™ืŸ. ื”ืขื™ืงืจ ืฉื™ืฉ ื™ืฆื™ืื•ืช SATA ื•-PCIe. ื–ื” ื›ืžื• ืชืงืœื™ื˜ื•ืจ ื—ื™ ืื• ื›ื•ื ืŸ ื”ื‘ื–ืง ืฉื ื™ืชืŸ ืœืืชื—ื•ืœ, ืจืง ืžื”ื™ืจ ืžืื•ื“ ื•ืงืฆืช ืžื’ื•ืฉื.

ะฎะผะพั€ืื—ืจืช, ืืชื” ื™ื•ื“ืข ืžื” ืงื•ืจื” - ืœืคืขืžื™ื ืืชื” ืฆืจื™ืš ื‘ื“ื—ื™ืคื•ืช ืœืงื—ืช ืืช ื›ืœ ื”ืžืขืจืš ืื™ืชืš ื›ื“ื™ ืœืงื—ืช. ืื‘ืœ ืื ื™ ืœื ืจื•ืฆื” ืœืื‘ื“ ื ืชื•ื ื™ื. ืœืฉื ื›ืš, ื›ืœ ื”ืžื“ื™ื” ื”ืžื•ื–ื›ืจืช ืžืžื•ืงืžืช ื‘ื ื•ื—ื•ืช ืขืœ ื”ืฉืงื•ืคื™ื•ืช ื‘ืžืคืจืฆื™ื 5.25 ืฉืœ ื”ืžืืจื– ื”ืกื˜ื ื“ืจื˜ื™.

ื•ื‘ื›ืŸ, ื•ื›ืžื•ื‘ืŸ, ืœื”ืชื ืกื•ืช ื‘ืฉื™ื˜ื•ืช ืฉื•ื ื•ืช ืฉืœ ืฉืžื™ืจื” ื‘ืžื˜ืžื•ืŸ SSD ื‘ืœื™ื ื•ืงืก.

ืคืฉื™ื˜ื•ืช ื—ื•ืžืจื” ืžืฉืขืžืžื•ืช. ื”ืคืขืœ ืื•ืชื•. ืื• ืฉื–ื” ืขื•ื‘ื“ ืื• ืฉื–ื” ืœื. ื•ืขื mdadm ืชืžื™ื“ ื™ืฉ ืืคืฉืจื•ื™ื•ืช.

ืชื•ื›ื ื”

ื‘ืขื‘ืจ, Debian 8 Jessie ื”ื•ืชืงืŸ ืขืœ ื”ื—ื•ืžืจื”, ืฉืงืจื•ื‘ื” ืœ-EOL. RAID 6 ื”ื•ืจื›ื‘ ืžื”ื›ื•ื ื ื™ื ื”ืงืฉื™ื—ื™ื ืฉื”ื•ื–ื›ืจื• ืœืขื™ืœ ื‘ืฉื™ืœื•ื‘ ืขื LVM. ื”ื•ื ื”ืคืขื™ืœ ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช ื‘-kvm/libvirt.

ื›ื™ ืœืžื—ื‘ืจ ื™ืฉ ื ื™ืกื™ื•ืŸ ืžืชืื™ื ื‘ื™ืฆื™ืจืช ื›ื•ื ื ื™ ืคืœืืฉ ื ื™ื™ื“ื™ื ืืชื—ื•ืœ SATA/NVMe, ื•ื’ื, ื›ื“ื™ ืœื ืœืฉื‘ื•ืจ ืืช ืชื‘ื ื™ืช ื”ืžืชืื™ืžื” ื”ืจื’ื™ืœื”, ื ื‘ื—ืจื” ืื•ื‘ื•ื ื˜ื• 18.04 ื›ืžืขืจื›ืช ื”ื™ืขื“, ืฉื›ื‘ืจ ื”ืชื™ื™ืฆื‘ื” ืžืกืคื™ืง, ืื‘ืœ ืขื“ื™ื™ืŸ ื™ืฉ ืœื” 3 ืฉื ื™ื ืฉืœ ืชืžื™ื›ื” ื‘ืขืชื™ื“.

ื”ืžืขืจื›ืช ื”ืžื•ื–ื›ืจืช ืžื›ื™ืœื” ืืช ื›ืœ ืžื ื”ืœื™ ื”ืชืงื ื™ ื”ื—ื•ืžืจื” ืฉืื ื• ืฆืจื™ื›ื™ื ืžื”ืงื•ืคืกื”. ืื ื—ื ื• ืœื ืฆืจื™ื›ื™ื ืฉื•ื ืชื•ื›ื ื” ืื• ืžื ื”ืœื™ ื”ืชืงื ื™ื ืฉืœ ืฆื“ ืฉืœื™ืฉื™.

ืžืชื›ื•ื ืŸ ืœื”ืชืงื ื”

ื›ื“ื™ ืœื”ืชืงื™ืŸ ืืช ื”ืžืขืจื›ืช ืื ื• ื–ืงื•ืงื™ื ืœ-Ubuntu Desktop Image. ืœืžืขืจื›ืช ื”ืฉืจืช ื™ืฉ ืื™ื–ืฉื”ื• ืžืชืงื™ืŸ ื ืžืจืฅ, ืฉืžืจืื” ืขืฆืžืื•ืช ืžื•ื’ื–ืžืช ืฉืœื ื ื™ืชืŸ ืœื ื˜ืจืœ ืขืœ ื™ื“ื™ ื“ื—ื™ืคื” ืฉืœ ืžื—ื™ืฆืช ืžืขืจื›ืช UEFI ืขืœ ืื—ื“ ื”ื“ื™ืกืงื™ื, ื•ืžืงืœืงืœ ืืช ื›ืœ ื”ื™ื•ืคื™. ื‘ื”ืชืื, ื”ื•ื ืžื•ืชืงืŸ ืจืง ื‘ืžืฆื‘ UEFI. ืœื ืžืฆื™ืข ืฉื•ื ืืคืฉืจื•ื™ื•ืช.

ืื ื—ื ื• ืœื ืžืจื•ืฆื™ื ืžื–ื”.

ืœืžื”?ืœืจื•ืข ื”ืžื–ืœ, ืืชื—ื•ืœ UEFI ืื™ื ื• ืชื•ืื ื‘ืฆื•ืจื” ื’ืจื•ืขื” ื‘ื™ื•ืชืจ ืœ-RAID ืฉืœ ืชื•ื›ื ืช ื”ืืชื—ื•ืœ, ืžื›ื™ื•ื•ืŸ ืฉ... ืืฃ ืื—ื“ ืœื ืžืฆื™ืข ืœื ื• ื”ื–ืžื ื•ืช ืœืžื—ื™ืฆืช UEFI ESP. ื™ืฉื ื ืžืชื›ื•ื ื™ื ื‘ืื™ื ื˜ืจื ื˜ ื”ืžืฆื™ืขื™ื ืœืžืงื ืืช ืžื—ื™ืฆืช ื”-ESP ืขืœ ื›ื•ื ืŸ ื”ื‘ื–ืง ื‘ื™ืฆื™ืืช USB, ืืš ื–ื• ื ืงื•ื“ืช ื›ืฉืœ. ื™ืฉื ื ืžืชื›ื•ื ื™ื ื”ืžืฉืชืžืฉื™ื ื‘ืชื•ื›ื ื” mdadm RAID 1 ืขื ืžื˜ื ื ืชื•ื ื™ื ื’ืจืกื” 0.9 ืฉืื™ื ื ืžื•ื ืขื™ื ืžื”-UEFI BIOS ืœืจืื•ืช ืืช ื”ืžื—ื™ืฆื” ื”ื–ื•, ืื‘ืœ ื–ื” ื—ื™ ืขื“ ืœืจื’ืข ื”ืžืื•ืฉืจ ืฉื‘ื• ื”-BIOS ืื• ืžืขืจื›ืช ื”ืคืขืœื” ื—ื•ืžืจื” ืื—ืจืช ื›ื•ืชื‘ื™ื ืžืฉื”ื• ืœ-ESP ื•ืฉื•ื›ื—ื™ื ืœืกื ื›ืจืŸ ืื•ืชื• ืขื ืื—ืจื™ื ืžืจืื•ืช.

ื‘ื ื•ืกืฃ, ื”ืืชื—ื•ืœ ืฉืœ UEFI ืชืœื•ื™ ื‘-NVRAM, ืฉืœื ื™ืขื‘ื•ืจ ื™ื—ื“ ืขื ื”ื“ื™ืกืงื™ื ืœืžืขืจื›ืช ื”ื—ื“ืฉื”, ืžื›ื™ื•ื•ืŸ ื”ื•ื ื—ืœืง ืžืœื•ื— ื”ืื.

ืื–, ืœื ื ืžืฆื™ื ืžื—ื“ืฉ ื’ืœื’ืœ ื—ื“ืฉ. ื™ืฉ ืœื ื• ื›ื‘ืจ ืื•ืคื ื™ ืกื‘ื ืžื•ื›ื ื™ื ืฉื ื‘ื“ืงื• ื‘ื–ืžืŸ, ื”ื ืงืจืื™ื ื›ืขืช Legacy/BIOS boot, ื”ื ื•ืฉืื™ื ืืช ื”ืฉื ื”ื’ืื” ืฉืœ CSM ื‘ืžืขืจื›ื•ืช ืชื•ืืžื•ืช UEFI. ืคืฉื•ื˜ ื ื•ืจื™ื“ ืื•ืชื• ืžื”ืžื“ืฃ, ื ืฉืžืŸ ืื•ืชื•, ื ืฉืื‘ ืืช ื”ืฆืžื™ื’ื™ื ื•ื ื ื’ื‘ ืื•ืชื• ื‘ืžื˜ืœื™ืช ืœื—ื”.

ื’ื ืืช ื’ืจืกืช ืฉื•ืœื—ืŸ ื”ืขื‘ื•ื“ื” ืฉืœ ืื•ื‘ื•ื ื˜ื• ืœื ื ื™ืชืŸ ืœื”ืชืงื™ืŸ ื›ืจืื•ื™ ืขื ื˜ื•ืขืŸ ื”ืืชื—ื•ืœ Legacy, ืื‘ืœ ื›ืืŸ, ื›ืžื• ืฉืื•ืžืจื™ื, ืœืคื—ื•ืช ื™ืฉ ืืคืฉืจื•ื™ื•ืช.

ื•ื›ืš, ืื ื• ืื•ืกืคื™ื ืืช ื”ื—ื•ืžืจื” ื•ืžื˜ืขื™ื ื™ื ืืช ื”ืžืขืจื›ืช ืžื›ื•ื ืŸ ื”ื‘ื–ืง ื”ื ื™ืชืŸ ืœืืชื—ื•ืœ ืฉืœ Ubuntu Live. ื ืฆื˜ืจืš ืœื”ื•ืจื™ื“ ื—ื‘ื™ืœื•ืช, ืื– ื ื’ื“ื™ืจ ืืช ื”ืจืฉืช ืฉืžืชืื™ืžื” ืœืš. ืื ื–ื” ืœื ืขื•ื‘ื“, ืืชื” ื™ื›ื•ืœ ืœื˜ืขื•ืŸ ืืช ื”ื—ื‘ื™ืœื•ืช ื”ื“ืจื•ืฉื•ืช ืœื›ื•ื ืŸ ื”ื‘ื–ืง ืžืจืืฉ.

ืื ื—ื ื• ื ื›ื ืกื™ื ืœืกื‘ื™ื‘ืช ืฉื•ืœื—ืŸ ื”ืขื‘ื•ื“ื”, ืžืคืขื™ืœื™ื ืืช ืืžื•ืœื˜ื•ืจ ื”ื˜ืจืžื™ื ืœ, ื•ื™ื•ืฆืื™ื ืœื“ืจืš:

#sudo bash

ืึตื™ืšโ€ฆ?ื”ืฉื•ืจื” ืœืžืขืœื” ื”ื™ื ื”ื˜ืจื™ื’ืจ ื”ืงื ื•ื ื™ ืœื”ื•ืœื™ื•ื•ืืจ ืขืœ ืกื•ื“ื•. ื’ ื‘ะพื”ื–ื“ืžื ื•ื™ื•ืช ื’ื“ื•ืœื•ืช ื™ื•ืชืจ ื‘ืื•ืช ื•ะพืื—ืจื™ื•ืช ื’ื“ื•ืœื” ื™ื•ืชืจ. ื”ืฉืืœื” ื”ื™ื ืื ืืชื” ื™ื›ื•ืœ ืœืงื—ืช ืืช ื–ื” ืขืœ ืขืฆืžืš. ืื ืฉื™ื ืจื‘ื™ื ื—ื•ืฉื‘ื™ื ืฉืฉื™ืžื•ืฉ ื‘-sudo ื‘ื“ืจืš ื–ื• ื”ื•ื ืœืคื—ื•ืช ืœื ื–ื”ื™ืจ. ืœืžืจื•ืช ื–ืืช:

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

ืœืžื” ืœื ZFS...?ื›ืืฉืจ ืื ื• ืžืชืงื™ื ื™ื ืชื•ื›ื ื” ืขืœ ื”ืžื—ืฉื‘ ืฉืœื ื•, ืื ื• ื‘ืขืฆื ืžืฉืื™ืœื™ื ืืช ื”ื—ื•ืžืจื” ืฉืœื ื• ืœืžืคืชื—ื™ ื”ืชื•ื›ื ื” ื”ื–ื• ืœื ื”ื•ื’.
ื›ืืฉืจ ืื ื• ืกื•ืžื›ื™ื ืขืœ ื”ืชื•ื›ื ื” ื”ื–ื• ื‘ื‘ื˜ื™ื—ื•ืช ื”ื ืชื•ื ื™ื ืฉืœื ื•, ืื ื• ืœื•ืงื—ื™ื ื”ืœื•ื•ืื” ื”ืฉื•ื•ื” ืœืขืœื•ืช ืฉื—ื–ื•ืจ ื”ื ืชื•ื ื™ื ื”ืœืœื•, ืฉื ืฆื˜ืจืš ืœืฉืœื ืžืชื™ืฉื”ื•.

ืžื ืงื•ื“ืช ืžื‘ื˜ ื–ื•, ZFS ื”ื•ื ืคืจืืจื™, ื•-mdadm+lvm ื”ื•ื ื™ื•ืชืจ ื›ืžื• ืื•ืคื ื™ื™ื.

ืžื‘ื—ื™ื ื” ืกื•ื‘ื™ื™ืงื˜ื™ื‘ื™ืช, ื”ืžื—ื‘ืจ ืžืขื“ื™ืฃ ืœื”ืฉืื™ืœ ืื•ืคื ื™ื™ื ื‘ืืฉืจืื™ ืœืื ืฉื™ื ืืœืžื•ื ื™ื ื‘ืžืงื•ื ืคืจืืจื™. ืฉื, ืžื—ื™ืจ ื”ื”ื ืคืงื” ืœื ื’ื‘ื•ื”. ืื™ืŸ ืฆื•ืจืš ื‘ื–ื›ื•ื™ื•ืช. ืคืฉื•ื˜ ื™ื•ืชืจ ืžืชืงื ื•ืช ื”ืชืขื‘ื•ืจื”. ื”ื—ื ื™ื” ื”ื™ื ื” ืœืœื ืชืฉืœื•ื. ื™ื›ื•ืœืช ืฉื˜ื— ื˜ื•ื‘ื” ื™ื•ืชืจ. ืืชื” ืชืžื™ื“ ื™ื›ื•ืœ ืœื—ื‘ืจ ืจื’ืœื™ื™ื ืœืื•ืคื ื™ื™ื, ื•ืืชื” ื™ื›ื•ืœ ืœืชืงืŸ ืื•ืคื ื™ื™ื ื‘ืžื• ื™ื“ื™ืš.

ืœืžื” ืื– BTRFS...?ืขืœ ืžื ืช ืœืืชื—ืœ ืืช ืžืขืจื›ืช ื”ื”ืคืขืœื”, ืื ื• ื–ืงื•ืงื™ื ืœืžืขืจื›ืช ืงื‘ืฆื™ื ืฉื ืชืžื›ืช ื‘-Legacy/BIOS GRUB ืžื—ื•ืฅ ืœืงื•ืคืกื”, ื•ื‘ืžืงื‘ื™ืœ ืชื•ืžื›ืช ื‘ืฆื™ืœื•ืžื™ ืžืฆื‘ ื—ื™ื™ื. ืื ื• ื ืฉืชืžืฉ ื‘ื• ืขื‘ื•ืจ ืžื—ื™ืฆืช /boot. ื‘ื ื•ืกืฃ, ื”ืžื—ื‘ืจ ืžืขื“ื™ืฃ ืœื”ืฉืชืžืฉ ื‘-FS ื–ื” ืขื‘ื•ืจ / (ืฉื•ืจืฉ), ื‘ืœื™ ืœืฉื›ื•ื— ืœืฆื™ื™ืŸ ืฉืœื›ืœ ืชื•ื›ื ื” ืื—ืจืช ืืชื” ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืžื—ื™ืฆื•ืช ื ืคืจื“ื•ืช ื‘-LVM ื•ืœืขืœื•ืช ืื•ืชืŸ ื‘ืกืคืจื™ื•ืช ื”ื“ืจื•ืฉื•ืช.

ืœื ื ืื—ืกืŸ ืชืžื•ื ื•ืช ืฉืœ ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช ืื• ืžืกื“ื™ ื ืชื•ื ื™ื ื‘-FS ื–ื”.
FS ื–ื” ื™ืฉืžืฉ ืจืง ืœื™ืฆื™ืจืช ืชืžื•ื ื•ืช ืžืฆื‘ ืฉืœ ื”ืžืขืจื›ืช ืžื‘ืœื™ ืœื›ื‘ื•ืช ืื•ืชื” ื•ืœืื—ืจ ืžื›ืŸ ืœื”ืขื‘ื™ืจ ืืช ื”ืชืžื•ื ื•ืช ื”ืœืœื• ืœื“ื™ืกืง ื’ื™ื‘ื•ื™ ื‘ืืžืฆืขื•ืช ืฉืœื™ื—ื”/ืงื‘ืœื”.

ื‘ื ื•ืกืฃ, ื”ืžื—ื‘ืจ ื‘ื“ืจืš ื›ืœืœ ืžืขื“ื™ืฃ ืœืฉืžื•ืจ ืขืœ ืžื™ื ื™ืžื•ื ืชื•ื›ื ื” ื™ืฉื™ืจื•ืช ืขืœ ื”ื—ื•ืžืจื” ื•ืœื”ืคืขื™ืœ ืืช ื›ืœ ื”ืชื•ื›ื ื•ืช ื”ืื—ืจื•ืช ื‘ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช ื‘ืืžืฆืขื•ืช ื“ื‘ืจื™ื ื›ืžื• ื”ืขื‘ืจืช GPUs ื•ื‘ืงืจื™ PCI-USB Host ืœ-KVM ื“ืจืš IOMMU.

ื”ื“ื‘ืจื™ื ื”ื™ื—ื™ื“ื™ื ืฉื ื•ืชืจื• ื‘ื—ื•ืžืจื” ื”ื ืื—ืกื•ืŸ ื ืชื•ื ื™ื, ื•ื™ืจื˜ื•ืืœื™ื–ืฆื™ื” ื•ื’ื™ื‘ื•ื™.

ืื ืืชื” ืกื•ืžืš ื™ื•ืชืจ ืขืœ ZFS, ืื–, ื‘ืื•ืคืŸ ืขืงืจื•ื ื™, ืขื‘ื•ืจ ื”ื™ื™ืฉื•ื ืฉืฆื•ื™ืŸ ื”ื ื ื™ืชื ื™ื ืœื”ื—ืœืคื”.

ืขื ื–ืืช, ื”ืžื—ื‘ืจ ืžืชืขืœื ื‘ื›ื•ื•ื ื” ืžืชื›ื•ื ื•ืช ื”ืฉื™ืงื•ืฃ/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 ืฉืœ ืชื•ื›ื ื”. ืืคื™ืœื• ืœื ื ื™ืฆื•ืจ ืฉื ืงื˜ืขื™ื. ืื ืืชื” ืจื•ืฆื” ืœืขืงื•ื‘ ืื—ืจ ื”"ืงืื ื•ืŸ" ืื• "ื‘ืขื™ืงืจ", ืฆื•ืจ ืžื—ื™ืฆื” ืื—ืช ื’ื“ื•ืœื”, ื›ืžื• ื“ื™ืกืง ืงืฉื™ื—.

SATA HDD

ืื™ืŸ ืฆื•ืจืš ืœื”ืžืฆื™ื ื›ืืŸ ืžืฉื”ื• ืžื™ื•ื—ื“. ื ื™ืฆื•ืจ ืงื˜ืข ืื—ื“ ืœื›ืœ ื“ื‘ืจ. ืื ื• ื ื™ืฆื•ืจ ืžื—ื™ืฆื” ืžื›ื™ื•ื•ืŸ ืฉื”-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 TB. ื–ื” ื‘ื˜ื•ื•ื— ื”ืžืงื•ื‘ืœ ืขื‘ื•ืจ MBR, ื•ื–ื” ืžื” ืฉื ืฉืชืžืฉ ื‘ื•. ื‘ืžื™ื“ืช ื”ืฆื•ืจืš, ื ื™ืชืŸ ืœื”ื—ืœื™ืฃ ื‘-GPT. ืœื“ืกืงื™ GPT ื™ืฉ ืฉื›ื‘ืช ืชืื™ืžื•ืช ื”ืžืืคืฉืจืช ืœืžืขืจื›ื•ืช ืชื•ืืžื•ืช MBR ืœืจืื•ืช ืืช 4 ื”ืžื—ื™ืฆื•ืช ื”ืจืืฉื•ื ื•ืช ืื ื”ืŸ ืžืžื•ืงืžื•ืช ื‘ืชื•ืš 2 ื”ื˜ืจื”-ื‘ื™ื™ื˜ ื”ืจืืฉื•ื ื™ื. ื”ืขื™ืงืจ ื”ื•ื ืฉืžื—ื™ืฆืช ื”ืืชื—ื•ืœ ื•ืžื—ื™ืฆืช bios_grub ื‘ื“ื™ืกืงื™ื ื”ืืœื” ืฆืจื™ื›ื™ื ืœื”ื™ื•ืช ื‘ื”ืชื—ืœื”. ื–ื” ืืคื™ืœื• ืžืืคืฉืจ ืœืš ืœืืชื—ืœ ืžื›ื•ื ื ื™ GPT Legacy/BIOS.

ืื‘ืœ ื–ื” ืœื ื”ืžืงืจื” ืฉืœื ื•.

ื›ืืŸ ื ื™ืฆื•ืจ ืฉื ื™ ื—ืœืงื™ื. ื”ืจืืฉื•ืŸ ื™ื”ื™ื” ื‘ื’ื•ื“ืœ 1 GB ื•ื™ืฉืžืฉ ืขื‘ื•ืจ RAID 1 /boot.

ื”ืฉื ื™ ื™ืฉืžืฉ ืขื‘ื•ืจ RAID 6 ื•ื™ืชืคื•ืก ืืช ื›ืœ ื”ืฉื˜ื— ื”ืคื ื•ื™ ืฉื ื•ืชืจ ืœืžืขื˜ ืื–ื•ืจ ืงื˜ืŸ ืœื ืžื•ืงืฆื” ื‘ืกื•ืฃ ื”ื›ื•ื ืŸ.

ืžื” ื–ื” ื”ืื–ื•ืจ ื”ืœื ืžืกื•ืžืŸ ื”ื–ื”?ืœืคื™ ืžืงื•ืจื•ืช ื‘ืจืฉืช, ื›ื•ื ื ื™ SATA SSD ืฉืœื ื• ื›ื•ืœืœื™ื ืžื˜ืžื•ืŸ SLC ื”ื ื™ืชืŸ ืœื”ืจื—ื‘ื” ื“ื™ื ืžื™ืช ื‘ื’ื•ื“ืœ ืฉืœ 6 ืขื“ 78 ื’ื™ื’ื”-ื‘ื™ื™ื˜. ืื ื—ื ื• ืžืงื‘ืœื™ื 6 ื’'ื™ื’ื”-ื‘ื™ื™ื˜ "ื‘ื—ื™ื ื" ื‘ื’ืœืœ ื”ื”ื‘ื“ืœ ื‘ื™ืŸ "ื’ื™ื’ื”-ื‘ื™ื™ื˜" ืœ-"ื’'ื™-ื‘ื™ื™ื˜" ื‘ื’ื™ืœื™ื•ืŸ ื”ื ืชื•ื ื™ื ืฉืœ ื”ื›ื•ื ืŸ. ืฉืืจ ื”-72 ื’ื™ื’ื”-ื‘ื™ื™ื˜ ืžื•ืงืฆื™ื ืžืฉื˜ื— ืœื ื‘ืฉื™ืžื•ืฉ.

ื›ืืŸ ื™ืฉ ืœืฆื™ื™ืŸ ืฉื™ืฉ ืœื ื• ืžื˜ืžื•ืŸ SLC, ื•ื”ืฉื˜ื— ืชืคื•ืก ื‘ืžืฆื‘ MLC 4 ืกื™ื‘ื™ื•ืช. ืžื” ืฉืื•ืžืจ ืขื‘ื•ืจื ื• ืœืžืขืฉื” ืฉืขืœ ื›ืœ 4 ื’ื™ื’ื”-ื‘ื™ื™ื˜ ืฉืœ ืžืงื•ื ืคื ื•ื™ ื ืงื‘ืœ ืจืง 1 ื’ื™ื’ื”-ื‘ื™ื™ื˜ ืฉืœ ืžื˜ืžื•ืŸ SLC.

ืชื›ืคื™ืœื• 72 ื’ื™ื’ื”-ื‘ื™ื™ื˜ ื‘-4 ื•ืชืงื‘ืœื• 288 ื’ื™ื’ื”-ื‘ื™ื™ื˜. ื–ื”ื• ื”ืฉื˜ื— ื”ืคื ื•ื™ ืฉืœื ื ืกืžืŸ ืขืœ ืžื ืช ืœืืคืฉืจ ืœื›ื•ื ื ื™ื ืœืขืฉื•ืช ืฉื™ืžื•ืฉ ืžืœื ื‘ืžื˜ืžื•ืŸ SLC.

ื›ืš, ืœืžืขืฉื”, ื ืงื‘ืœ ืขื“ 312 ื’ื™ื’ื”-ื‘ื™ื™ื˜ ืฉืœ ืžื˜ืžื•ืŸ SLC ืžืชื•ืš ืฉื™ืฉื” ื›ื•ื ื ื™ื ื‘ืกืš ื”ื›ืœ. ืžื›ืœ ื”ื›ื•ื ื ื™ื, 2 ื™ืฉืžืฉื• ื‘-RAID ืœืฆื•ืจืš ื™ืชื™ืจื•ืช.

ื›ืžื•ืช ื”ืžื˜ืžื•ืŸ ื”ื–ื• ืชืืคืฉืจ ืœื ื• ืœื”ื™ืชืงืœ ืœืขื™ืชื™ื ืจื—ื•ืงื•ืช ื‘ื™ื•ืชืจ ื‘ื—ื™ื™ื ื”ืืžื™ืชื™ื™ื ื‘ืžืฆื‘ ืฉื‘ื• ื›ืชื™ื‘ื” ืœื ืขื•ื‘ืจืช ืœืžื˜ืžื•ืŸ. ื–ื” ืžืคืฆื” ื‘ืฆื•ืจื” ืžืฆื•ื™ื ืช ืขืœ ื”ื—ื™ืกืจื•ืŸ ื”ืขืฆื•ื‘ ื‘ื™ื•ืชืจ ืฉืœ ื–ื™ื›ืจื•ืŸ QLC - ืžื”ื™ืจื•ืช ื”ื›ืชื™ื‘ื” ื”ื ืžื•ื›ื” ื‘ืžื™ื•ื—ื“ ื›ืืฉืจ ื ืชื•ื ื™ื ื ื›ืชื‘ื™ื ืขื•ืงืคื™ื ืืช ื”ืžื˜ืžื•ืŸ. ืื ื”ืขื•ืžืกื™ื ืฉืœืš ืื™ื ื ืชื•ืืžื™ื ืœื–ื”, ืื– ืื ื™ ืžืžืœื™ืฅ ืœืš ืœื—ืฉื•ื‘ ื”ื™ื˜ื‘ ื›ืžื” ื–ืžืŸ ื”-SSD ืฉืœืš ื™ื—ื–ื™ืง ืžืขืžื“ ืชื—ืช ืขื•ืžืก ื›ื–ื”, ืชื•ืš ื”ืชื—ืฉื‘ื•ืช ื‘-TBW ืžื’ื™ืœื™ื•ืŸ ื”ื ืชื•ื ื™ื.

#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. ืื ื• ืžืฉืชืžืฉื™ื ื‘-TRIM/DISCARD ื‘ืžื™ื“ืช ื”ืืคืฉืจ ืขืœ ืžืขืจื›ื™ SSD ืžื•ืจื›ื‘ื™ื ื›ื“ื™ "ืœืืชื—ืœ" ืื•ืชื.

ืขื‘ื•ืจ ืžืขืจื›ื™ 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 by-design ื•ื‘ืžืงื•ื ื–ืืช ืœื™ื™ืขืœ ืืช ืžื” ืฉ-RAID 6 ื˜ื•ื‘ ื‘ื•.
ื ืคืฆื” ืขืœ ื”ื›ืชื™ื‘ื” ื”ืืงืจืื™ืช ื”ื’ืจื•ืขื” ืฉืœ RAID 6 ื‘ืืžืฆืขื•ืช ืžื˜ืžื•ืŸ NVMe ื•ื˜ืจื™ืงื™ื ืฉืœ ืืกืคืงื” โ€‹โ€‹ื“ืงื”.

ืขื“ื™ื™ืŸ ืœื ื”ืคืขืœื ื• ืืช DISCARD ืขื‘ื•ืจ RAID 6. ืื– ืœื "ื ืืชื—ืœ" ืืช ื”ืžืขืจืš ื”ื–ื” ืœืขืช ืขืชื”. ื ืขืฉื” ื–ืืช ืžืื•ื—ืจ ื™ื•ืชืจ, ืœืื—ืจ ื”ืชืงื ืช ืžืขืจื›ืช ื”ื”ืคืขืœื”.

SATA HDD

#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.
ืขื ื–ืืช, ืขื“ื™ื™ืŸ ื ืฆื˜ืจืš ืืช ื”ืžืขืจืš ื”ืžื”ื™ืจ ื”ื–ื” ืœืฆืจื›ื™ื ืื—ืจื™ื, ื›ื’ื•ืŸ swap, metadata ื•-LVM-cache ื•-LVM-thinn metadata, ืื– ื ื™ืฆื•ืจ LVM VG ืขืœ ืžืขืจืš ื–ื”.

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

ื‘ื•ืื• ื ื™ืฆื•ืจ ืžื—ื™ืฆื” ืขื‘ื•ืจ ืžืขืจื›ืช ืงื‘ืฆื™ ื”ืฉื•ืจืฉ.

#lvcreate -L 128G --name root root

ื‘ื•ืื• ื ื™ืฆื•ืจ ืžื—ื™ืฆื” ืœื”ื—ืœืคื” ืœืคื™ ื’ื•ื“ืœ ื”-RAM.

#lvcreate -L 32G --name swap root

ื”ืชืงื ืช ืžืขืจื›ืช ื”ืคืขืœื”

ื‘ืกืš ื”ื›ืœ, ื™ืฉ ืœื ื• ืืช ื›ืœ ื”ื“ืจื•ืฉ ืœื”ืชืงื ืช ื”ืžืขืจื›ืช.

ื”ืคืขืœ ืืช ืืฉืฃ ื”ืชืงื ืช ื”ืžืขืจื›ืช ืžืกื‘ื™ื‘ืช Ubuntu Live. ื”ืชืงื ื” ืจื’ื™ืœื”. ืจืง ื‘ืฉืœื‘ ื‘ื—ื™ืจืช ื”ื“ื™ืกืงื™ื ืœื”ืชืงื ื”, ืขืœื™ืš ืœืฆื™ื™ืŸ ืืช ื”ื“ื‘ืจื™ื ื”ื‘ืื™ื:

  • /dev/md1, - ื ืงื•ื“ืช mount /boot, 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/DISCARD:

#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. ืขืจืš ื‘ืจื™ืจืช ื”ืžื—ื“ืœ, ื›ืš ื ืจืื”, ืœื ื”ืฉืชื ื” ืžืื– ื™ืฆื™ืจืช ืœื™ื ื•ืงืก, ื•ืœื ื”ื™ื” ืžืกืคื™ืง ื‘ืžืฉืš ื–ืžืŸ ืจื‘.
  • ืฉืžื•ืจ ืžื™ื ื™ืžื•ื ืฉืœ IO ืœืžืฉืš ื‘ื“ื™ืงื•ืช/ืกื ื›ืจื•ืŸ ืžืขืจืš. ื–ื” ื›ื“ื™ ืœืžื ื•ืข ืžื”ืžืขืจื›ื™ื ืฉืœืš ืœื”ื™ืชืงืข ื‘ืžืฆื‘ ืฉืœ ืกื ื›ืจื•ืŸ ื ืฆื—ื™ ืชื—ืช ืขื•ืžืก.
  • ื”ื’ื‘ืœ ืืช ื”-IO ื”ืžืงืกื™ืžืœื™ ื‘ืžื”ืœืš ื‘ื“ื™ืงื•ืช/ืกื ื›ืจื•ืŸ ืฉืœ ืžืขืจื›ื™ื. ื–ื” ื”ื›ืจื—ื™ ื›ื“ื™ ืฉืกื ื›ืจื•ืŸ/ื‘ื“ื™ืงืช SSD RAIDs ืœื ื™ื˜ื’ืŸ ืืช ื”ื›ื•ื ื ื™ื ืฉืœืš ื‘ืฆื•ืจื” ื—ื“ื”. ื–ื” ื ื›ื•ืŸ ื‘ืžื™ื•ื—ื“ ืขื‘ื•ืจ NVMe. (ื–ื•ื›ืจื™ื ืœื’ื‘ื™ ื”ืจื“ื™ืื˜ื•ืจ? ืœื ืฆื—ืงืชื™.)
  • ืืกืจื• ืขืœ ื“ื™ืกืงื™ื ืœืขืฆื•ืจ ืืช ืกื™ื‘ื•ื‘ ื”ืฆื™ืจ (HDD) ื‘ืืžืฆืขื•ืช APM ื•ื”ื’ื“ืจ ืืช ืคืกืง ื–ืžืŸ ื”ืฉื™ื ื” ืขื‘ื•ืจ ื‘ืงืจื™ ื“ื™ืกืง ืœ-7 ืฉืขื•ืช. ืืชื” ื™ื›ื•ืœ ืœื”ืฉื‘ื™ืช ืœื—ืœื•ื˜ื™ืŸ ืืช APM ืื ื”ื›ื•ื ื ื™ื ืฉืœืš ื™ื›ื•ืœื™ื ืœืขืฉื•ืช ื–ืืช (-B 255). ืขื ืขืจืš ื‘ืจื™ืจืช ื”ืžื—ื“ืœ, ื”ื›ื•ื ื ื™ื ื™ืขืฆืจื• ืœืื—ืจ ื—ืžืฉ ืฉื ื™ื•ืช. ื•ืื– ืžืขืจื›ืช ื”ื”ืคืขืœื” ืจื•ืฆื” ืœืืคืก ืืช ืžื˜ืžื•ืŸ ื”ื“ื™ืกืงื™ื, ื”ื“ื™ืกืงื™ื ื™ืกืชื•ื‘ื‘ื• ืฉื•ื‘, ื•ื”ื›ืœ ื™ืชื—ื™ืœ ืžื—ื“ืฉ. ืœื“ื™ืกืงื™ื ื™ืฉ ืžืกืคืจ ืžืจื‘ื™ ืžื•ื’ื‘ืœ ืฉืœ ืกื™ื‘ื•ื‘ื™ ืฆื™ืจ. ืžื—ื–ื•ืจ ื‘ืจื™ืจืช ืžื—ื“ืœ ืคืฉื•ื˜ ื›ื–ื” ื™ื›ื•ืœ ื‘ืงืœื•ืช ืœื”ืจื•ื’ ืืช ื”ื“ื™ืกืงื™ื ืฉืœืš ืชื•ืš ื›ืžื” ืฉื ื™ื. ืœื ื›ืœ ื”ื“ื™ืกืงื™ื ืกื•ื‘ืœื™ื ืžื›ืš, ืื‘ืœ ืฉืœื ื• ื”ื "ืœืคื˜ื•ืคื™ื", ืขื ื”ื’ื“ืจื•ืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื”ืžืชืื™ืžื•ืช, ืฉื’ื•ืจืžื•ืช ืœ-RAID ืœื”ื™ืจืื•ืช ื›ืžื• ืžื™ื ื™-MAID.
  • ื”ืชืงืŸ Readahead ืขืœ ื“ื™ืกืงื™ื (ืžืกืชื•ื‘ื‘) 1 ืžื’ื”-ื‘ื™ื™ื˜ - ืฉื ื™ ื‘ืœื•ืงื™ื ืจืฆื•ืคื™ื/ื ืชื— RAID 6
  • ื”ืฉื‘ืช ืืช Readahead ื‘ืžืขืจื›ื™ื ืขืฆืžื.

ื‘ื•ืื• ื ืขืจื•ืš ืืช /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 ื‘ืžืืจื— ื™ืคืขื™ืœ ืืžืฆืขื™ ืื—ืกื•ืŸ ื”ืฉื™ื™ื›ื™ื ืœืžืขืจื›ืช ื”ื”ืคืขืœื” ื”ืื•ืจื—ืช.
  • ื›ืœ ื”ืžื›ืฉื™ืจื™ื ื‘-VG ืขื ื”ืฉื ื’ื™ื‘ื•ื™. ื›ืืŸ ื™ื”ื™ื• ืœื ื• ืขื•ืชืงื™ ื’ื™ื‘ื•ื™ ืฉืœ ืชืžื•ื ื•ืช ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช.
  • ื›ืœ ื”ืžื›ืฉื™ืจื™ื ืฉืฉืžื ืžืกืชื™ื™ื ื‘-"gpv" (ื ืคื— ืคื™ื–ื™ ืฉืœ ืื•ืจื—)

ื”ืคืขืœื ื• ืชืžื™ื›ืช DISCARD ื‘ืขืช ืคื™ื ื•ื™ ืฉื˜ื— ืคื ื•ื™ ื‘-LVM VG. ื”ื–ื”ืจ. ื–ื” ื™ื’ืจื•ื ืœืžื—ื™ืงืช LVs ื‘-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

ื‘ืื™ืœื• ื“ื™ืกืงื™ื ื›ื“ืื™ ืœื‘ื—ื•ืจ?ื›ืœ ืžื™ ืฉื”ื sd*. ื”ืžืขืจื›ืช ื—ื™ื™ื‘ืช ืœื”ื™ื•ืช ืžืกื•ื’ืœืช ืœืืชื—ืœ ืžื›ืœ ื›ื•ื ืŸ SATA ืื• SSD ืคื•ืขืœื™ื.

ืœืžื” ื”ื•ืกื™ืคื• os-prober..?ืœืขืฆืžืื•ืช ื™ืชืจ ื•ื™ื“ื™ื™ื ืฉื•ื‘ื‘ื•ืช.

ื–ื” ืœื ืขื•ื‘ื“ ื›ืฉื•ืจื” ืื ืื—ื“ ืž-RAIDs ื ืžืฆื ื‘ืžืฆื‘ ืคื’ื•ื. ื”ื•ื ืžื ืกื” ืœื—ืคืฉ ืืช ืžืขืจื›ืช ื”ื”ืคืขืœื” ื‘ืžื—ื™ืฆื•ืช ื”ืžืฉืžืฉื•ืช ื‘ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช ื”ืคื•ืขืœื•ืช ืขืœ ื—ื•ืžืจื” ื–ื•.

ืื ืืชื” ืฆืจื™ืš ืืช ื–ื”, ืืชื” ื™ื›ื•ืœ ืœืขื–ื•ื‘ ืืช ื–ื”, ืื‘ืœ ื–ื›ื•ืจ ืืช ื›ืœ ื”ืืžื•ืจ ืœืขื™ืœ. ืื ื™ ืžืžืœื™ืฆื” ืœื—ืคืฉ ื‘ืื™ื ื˜ืจื ื˜ ืžืชื›ื•ื ื™ื ืœื”ื™ืคื˜ืจ ื™ื“ื™ื™ื ืฉื•ื‘ื‘ื•ืช.

ืขื ื–ื” ื”ืฉืœืžื ื• ืืช ื”ื”ืชืงื ื” ื”ืจืืฉื•ื ื™ืช. ื–ื” ื”ื–ืžืŸ ืœืืชื—ืœ ืžื—ื“ืฉ ืœืžืขืจื›ืช ื”ื”ืคืขืœื” ื”ื—ื“ืฉื” ืฉื”ื•ืชืงื ื”. ืืœ ืชืฉื›ื— ืœื”ืกื™ืจ ืืช ื”- Live CD/USB ื”ื ื™ืชืŸ ืœืืชื—ื•ืœ.

#exit
#reboot

ื‘ื—ืจ ื›ืœ ืื—ื“ ืžื›ื•ื ื ื™ SATA SSD ื›ื”ืชืงืŸ ื”ืืชื—ื•ืœ.

LVM ืขืœ SATA SSD

ื‘ืฉืœื‘ ื–ื”, ื›ื‘ืจ ืืชื—ื•ืœ ืœืžืขืจื›ืช ื”ื”ืคืขืœื” ื”ื—ื“ืฉื”, ื”ื’ื“ืจื ื• ืืช ื”ืจืฉืช, apt, ืคืชื—ื ื• ืืช ืืžื•ืœื˜ื•ืจ ื”ืžืกื•ืฃ ื•ื”ืฉืงื ื•:

#sudo bash

ืื ื—ื ื• ืžืžืฉื™ื›ื™ื.

"ืืชื—ืœ" ืืช ื”ืžืขืจืš ืž- SATA SSD:

#blkdiscard /dev/md2

ืื ื–ื” ืœื ืขื•ื‘ื“, ื ืกื”:

#blkdiscard --step 65536 /dev/md2
ืฆื•ืจ LVM VG ืขืœ SATA SSD:

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

ืœืžื” ืขื•ื“ VG..?ืœืžืขืฉื”, ื›ื‘ืจ ื™ืฉ ืœื ื• VG ื‘ืฉื root. ืœืžื” ืœื ืœื”ื•ืกื™ืฃ ื”ื›ืœ ืœ-VG ืื—ื“?

ืื ื™ืฉื ื ืžืกืคืจ PVs ื‘-VG, ืื– ื›ื“ื™ ืฉื”-VG ื™ื•ืคืขืœ ื›ื”ืœื›ื”, ื›ืœ ื”-PVs ื—ื™ื™ื‘ื™ื ืœื”ื™ื•ืช ื ื•ื›ื—ื™ื (ืžืงื•ื•ืŸ). ื”ื™ื•ืฆื ืžืŸ ื”ื›ืœืœ ื”ื•ื LVM RAID, ืฉืื ื• ืœื ืžืฉืชืžืฉื™ื ื‘ื• ื‘ื›ื•ื•ื ื”.

ืื ื—ื ื• ืžืื•ื“ ืจื•ืฆื™ื ืฉืื ื™ืฉ ื›ืฉืœ (ืื•ื‘ื“ืŸ ื ืชื•ื ื™ื) ื‘ื›ืœ ืื—ื“ ืžืžืขืจื›ื™ ื”-RAID 6, ืžืขืจื›ืช ื”ื”ืคืขืœื” ืชืืชื—ืœ ื›ืจื’ื™ืœ ื•ืชื™ืชืŸ ืœื ื• ืืช ื”ื”ื–ื“ืžื ื•ืช ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื”.

ืœืฉื ื›ืš, ื‘ืจืžืช ื”ื”ืคืฉื˜ื” ื”ืจืืฉื•ื ื” ื ื‘ื•ื“ื“ ื›ืœ ืกื•ื’ ืฉืœ "ืžื“ื™ื”" ืคื™ื–ื™ืช ืœ-VG ื ืคืจื“.

ืžื‘ื—ื™ื ื” ืžื“ืขื™ืช, ืžืขืจื›ื™ RAID ืฉื•ื ื™ื ืฉื™ื™ื›ื™ื ืœ"ืชื—ื•ืžื™ ืืžื™ื ื•ืช" ืฉื•ื ื™ื. ืœื ื›ื“ืื™ ืœื™ืฆื•ืจ ืขื‘ื•ืจื ื ืงื•ื“ืช ื›ืฉืœ ื ืคื•ืฆื” ื ื•ืกืคืช ืขืœ ื™ื“ื™ ื“ื—ื™ืกืชื ืœ-VG ืื—ื“.

ื”ื ื•ื›ื—ื•ืช ืฉืœ LVM ื‘ืจืžืช "ื—ื•ืžืจื”" ืชืืคืฉืจ ืœื ื• ืœื—ืชื•ืš ื‘ืื•ืคืŸ ืฉืจื™ืจื•ืชื™ ื—ืชื™ื›ื•ืช ืฉืœ ืžืขืจื›ื™ RAID ืฉื•ื ื™ื ืขืœ ื™ื“ื™ ืฉื™ืœื•ื‘ื ื‘ื“ืจื›ื™ื ืฉื•ื ื•ืช. ืœืžืฉืœ - ืœืจื•ืฅ ื‘ื• ื–ืžื ื™ืช bcache + LVM ื“ืง, bcache + BTRFS, LVM cache + LVM thin, ืชืฆื•ืจืช ZFS ืžื•ืจื›ื‘ืช ืขื ืžื˜ืžื•ื ื™ื, ืื• ื›ืœ ืชืขืจื•ื‘ืช ื’ื™ื”ื ื•ืžื™ืช ืื—ืจืช ื›ื“ื™ ืœื ืกื•ืช ื•ืœื”ืฉื•ื•ืช ืืช ื”ื›ืœ.

ื‘ืจืžืช "ื—ื•ืžืจื”", ืœื ื ืฉืชืžืฉ ื‘ืฉื•ื ื“ื‘ืจ ืžืœื‘ื“ ืืžืฆืขื™ ืื—ืกื•ืŸ LVM "ืขื‘ื™ื" ื™ืฉื ื™ื ื•ื˜ื•ื‘ื™ื. ื”ื—ืจื™ื’ ืœื›ืœืœ ื–ื” ืขืฉื•ื™ ืœื”ื™ื•ืช ืžื—ื™ืฆืช ื”ื’ื™ื‘ื•ื™.

ืื ื™ ื—ื•ืฉื‘ ืฉื‘ืจื’ืข ื–ื”, ืงื•ืจืื™ื ืจื‘ื™ื ื›ื‘ืจ ื”ื—ืœื• ืœื—ืฉื•ื“ ื‘ืžืฉื”ื• ืขืœ ื”ื‘ื•ื‘ื” ื”ืžืงื ื ืช.

LVM ืขืœ SATA HDD

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

ืฉื•ื‘ VG ื—ื“ืฉ..?ืื ื—ื ื• ืžืื•ื“ ืจื•ืฆื™ื ืฉืื ืžืขืจืš ื”ื“ื™ืกืงื™ื ื‘ื• ื ืฉืชืžืฉ ืœื’ื™ื‘ื•ื™ ื ืชื•ื ื™ื ื™ื™ื›ืฉืœ, ืžืขืจื›ืช ื”ื”ืคืขืœื” ืฉืœื ื• ืชืžืฉื™ืš ืœืขื‘ื•ื“ ื›ืจื’ื™ืœ, ืชื•ืš ืฉืžื™ืจื” ืขืœ ื’ื™ืฉื” ืœื ืชื•ื ื™ื ืฉืื™ื ื ืžื’ื•ื‘ื™ื ื›ืจื’ื™ืœ. ืœื›ืŸ, ื›ื“ื™ ืœืžื ื•ืข ื‘ืขื™ื•ืช ื”ืคืขืœื” ืฉืœ VG, ืื ื• ื™ื•ืฆืจื™ื VG ื ืคืจื“.

ื”ื’ื“ืจืช ืžื˜ืžื•ืŸ LVM

ื‘ื•ืื• ื ื™ืฆื•ืจ LV ื‘-NVMe RAID 1 ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘ื• ื›ื”ืชืงืŸ ืžื˜ืžื•ืŸ.

#lvcreate -L 70871154688B --name cache root

ืœืžื” ื™ืฉ ื›ืœ ื›ืš ืžืขื˜...?ื”ืขื•ื‘ื“ื” ื”ื™ื ืฉืœื›ื•ื ื ื™ ื”-NVMe SSD ืฉืœื ื• ื™ืฉ ื’ื ืžื˜ืžื•ืŸ SLC. 4 ื’ื™ื’ื”-ื‘ื™ื™ื˜ ืฉืœ "ื—ื•ืคืฉื™" ื•-18 ื’ื™ื’ื”-ื‘ื™ื™ื˜ ื“ื™ื ืžื™ ื‘ื’ืœืœ ื”ืฉื˜ื— ื”ืคื ื•ื™ ืฉืชืคื•ืก ื‘-3-bit MLC. ืœืื—ืจ ืžื™ืฆื•ื™ ื”ืžื˜ืžื•ืŸ ื”ื–ื”, ื›ื•ื ื ื™ SSD ืฉืœ NVMe ืœื ื™ื”ื™ื• ืžื”ื™ืจื™ื ื‘ื”ืจื‘ื” ืžื”-SATA SSD ืฉืœื ื• ืขื ืžื˜ืžื•ืŸ. ืœืžืขืฉื”, ืžืกื™ื‘ื” ื–ื•, ืื™ืŸ ื–ื” ื”ื’ื™ื•ื ื™ ืขื‘ื•ืจื ื• ืœื”ืคื•ืš ืืช ืžื—ื™ืฆืช ื”ืžื˜ืžื•ืŸ ืฉืœ LVM ืœื’ื“ื•ืœื” ื‘ื”ืจื‘ื” ืžืคืขืžื™ื™ื ืžื’ื•ื“ืœ ื”ืžื˜ืžื•ืŸ SLC ืฉืœ ื›ื•ื ืŸ NVMe. ืขื‘ื•ืจ ื›ื•ื ื ื™ ื”-NVMe ื”ืžืฉืžืฉื™ื, ื”ืžื—ื‘ืจ ืกื‘ื•ืจ ืฉื–ื” ื”ื’ื™ื•ื ื™ ืœื™ื™ืฆืจ 32-64 ื’ื™ื’ื”-ื‘ื™ื™ื˜ ืฉืœ ืžื˜ืžื•ืŸ.

ื’ื•ื“ืœ ื”ืžื—ื™ืฆื” ื”ื ืชื•ืŸ ื ื“ืจืฉ ื›ื“ื™ ืœืืจื’ืŸ 64 ื’ื™ื’ื”-ื‘ื™ื™ื˜ ืฉืœ ืžื˜ืžื•ืŸ, ืžื˜ื ื ืชื•ื ื™ื ืฉืœ ืžื˜ืžื•ืŸ ื•ื’ื™ื‘ื•ื™ ืฉืœ ืžื˜ื ื ืชื•ื ื™ื.

ื‘ื ื•ืกืฃ, ืื ื™ ืžืฆื™ื™ืŸ ืฉืœืื—ืจ ื›ื™ื‘ื•ื™ ืžืขืจื›ืช ืžืœื•ื›ืœืš, LVM ื™ืกืžืŸ ืืช ื›ืœ ื”ืžื˜ืžื•ืŸ ื›ืžืœื•ื›ืœืš ื•ื™ืกื•ื ื›ืจืŸ ืฉื•ื‘. ื™ืชืจ ืขืœ ื›ืŸ, ื–ื” ื™ื—ื–ื•ืจ ืขืœ ืขืฆืžื• ื‘ื›ืœ ืคืขื ืฉื ืขืฉื” ืฉื™ืžื•ืฉ ื‘-lvchange ื‘ืžื›ืฉื™ืจ ื–ื” ืขื“ ืฉื”ืžืขืจื›ืช ืชืื•ื—ืœ ืžื—ื“ืฉ. ืœื›ืŸ, ืื ื™ ืžืžืœื™ืฅ ืœื™ืฆื•ืจ ืžื—ื“ืฉ ืืช ื”ืžื˜ืžื•ืŸ ื‘ืื•ืคืŸ ืžื™ื™ื“ื™ ื‘ืืžืฆืขื•ืช ื”ืกืงืจื™ืคื˜ ื”ืžืชืื™ื.

ื‘ื•ืื• ื ื™ืฆื•ืจ LV ื‘-SATA RAID 6 ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘ื• ื›ื”ืชืงืŸ ืฉืžื•ืจ.

#lvcreate -L 3298543271936B --name cache data

ืœืžื” ืจืง ืฉืœื•ืฉื” ื˜ืจื”-ื‘ื™ื™ื˜..?ื›ืš ืฉื‘ืžื™ื“ืช ื”ืฆื•ืจืš ืชื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘-SATA SSD RAID 6 ืœืฆืจื›ื™ื ืื—ืจื™ื. ื ื™ืชืŸ ืœื”ื’ื“ื™ืœ ืืช ื’ื•ื“ืœ ื”ืฉื˜ื— ื”ืžืื•ื—ืกืŸ ื‘ืื•ืคืŸ ื“ื™ื ืžื™, ืชื•ืš ื›ื“ื™ ืชื ื•ืขื”, ืžื‘ืœื™ ืœืขืฆื•ืจ ืืช ื”ืžืขืจื›ืช. ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืขืœื™ืš ืœืขืฆื•ืจ ื–ืžื ื™ืช ื•ืœื”ืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืžื˜ืžื•ืŸ, ืืš ื”ื™ืชืจื•ืŸ ื”ืžื•ื‘ื”ืง ืฉืœ LVM-cache ืขืœ ืคื ื™, ืœืžืฉืœ, 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 ื“ืง

ื‘ื•ืื• ื ืขืจื™ืš ื‘ืขืจืš ื›ืžื” ืžืงื•ื ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืžื˜ื ื ืชื•ื ื™ื ื“ืงื™ื ืฉืœ 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
ืœืžื” -Z yื‘ื ื•ืกืฃ ืœืžื” ืฉืžืฆื‘ ื–ื” ื ื•ืขื“ ืœืžืขืฉื” - ืœืžื ื•ืข ื“ืœื™ืคื” ืฉืœ ื ืชื•ื ื™ื ืžืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ืื—ืช ืœืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ืื—ืจืช ื‘ืขืช ื—ืœื•ืงื” ืžื—ื“ืฉ ืฉืœ ืฉื˜ื— - ื ืขืฉื” ืฉื™ืžื•ืฉ ื ื•ืกืฃ ื‘ืืคืก ื›ื“ื™ ืœื”ื’ื‘ื™ืจ ืืช ืžื”ื™ืจื•ืช ื”ื›ืชื™ื‘ื” ื”ืืงืจืื™ืช ื‘ืœื•ืงื™ื ื”ืงื˜ื ื™ื ืž-64k. ื›ืœ ื›ืชื™ื‘ื” ืฉืœ ืคื—ื•ืช ืž-64k ืœืื–ื•ืจ ืฉืœื ื”ื•ืงืฆื” ื‘ืขื‘ืจ ืฉืœ ื”ื ืคื— ื”ื“ืง ื™ื”ืคื•ืš ืœื™ื™ืฉื•ืจ ืงืฆื” ืฉืœ 64K ื‘ืžื˜ืžื•ืŸ. ื–ื” ื™ืืคืฉืจ ืœื‘ืฆืข ืืช ื”ืคืขื•ืœื” ื›ื•ืœื” ื“ืจืš ื”ืžื˜ืžื•ืŸ, ืชื•ืš ืขืงื™ืคืช ื”ืžื›ืฉื™ืจ ื”ืžืื•ื—ืกืŸ.

ื‘ื•ืื• ื ืขื‘ื™ืจ ืืช ื”-LVs ืœ-PVs ื”ืžืชืื™ืžื™ื:

#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>, ืฆื•ืจ ืชืžื•ื ืช ืžืฆื‘ ืขื ื”ืฉื <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 ืฉืœ ื”ื™ื•ื. ื›ื•ื ื ื™ SATA SSD ื™ื—ื–ื™ืงื• ืžืขืžื“ ืจืง ืคื™ ืฉื ื™ื™ื ื™ื•ืชืจ. ืœื›ืŸ, ื ื ื™ื— ืฉืจื•ื‘ ื”ืขื•ืžืก ื”ื•ืœืš ืœืงืจื™ืื”, ื•ื™ืฉ ืœื ื• ืคืจืฆื™ื ืงืฆืจื™ ื˜ื•ื•ื— ื™ื—ืกื™ืช ืฉืœ ืคืขื™ืœื•ืช ื’ื‘ื•ื”ื” ื‘ืžื™ื•ื—ื“ ื‘ืฉื™ืœื•ื‘ ืขื ืขื•ืžืก ื ืžื•ืš ื‘ืžืžื•ืฆืข ืœื›ืชื™ื‘ื”.
  4. ื‘ืจื’ืข ืฉืชืคืกื ื• (ืื• ืขืฉื™ื ื•) ืืคืก, ืื ื• ืžืฉื ื™ื ืืช ืฉื <name>.cached ืœ-<name>.committed. ื”-<name>.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 ืงื™ืœื•ื‘ื™ื™ื˜, ื™ืฉ ืกื‘ื™ืจื•ืช ื’ื‘ื•ื”ื” ืฉื‘ื“ืงื•ืช ื”ืงืจื•ื‘ื•ืช ืชื™ืขืฉื” ืจืฉื•ืžื” ืœืื•ืชื• ืกืงื˜ื•ืจ ืื• ืื—ื“ ืžื”ืกืงื˜ื•ืจื™ื ื”ืกืžื•ื›ื™ื (+- 32K).

ืขืœ ื™ื“ื™ ื”ื’ื“ืจืช ืกืฃ ื”ื”ื’ื™ืจื” ืœืืคืก, ืื ื• ื“ื•ื—ื™ื ืืช ืกื ื›ืจื•ืŸ ื”ื›ืชื™ื‘ื” ื‘-SATA SSD ื•ืžืฆื‘ืจื™ื ืžืกืคืจ ืฉื™ื ื•ื™ื™ื ืœื‘ืœื•ืง ืื—ื“ ืฉืœ 64K ื‘ืžื˜ืžื•ืŸ. ื–ื” ื—ื•ืกืš ื‘ืื•ืคืŸ ืžืฉืžืขื•ืชื™ ืืช ื”ืžืฉืื‘ ืฉืœ SATA SSD.

ืื™ืคื” ื”ืงื•ื“..?ืœืžืจื‘ื” ื”ืฆืขืจ, ื”ืžื—ื‘ืจ ืžื—ืฉื™ื‘ ืืช ืขืฆืžื• ืœื ืžืกืคื™ืง ืžื•ื›ืฉืจ ื‘ืคื™ืชื•ื— ืชืกืจื™ื˜ื™ ื‘ืฉ, ื›ื™ ื”ื•ื 100% ืื•ื˜ื•ื“ื™ื“ืงื˜ ื•ืžืชืืžืŸ ื‘ืคื™ืชื•ื— ืžื•ื ืข "ื’ื•ื’ืœ", ืœื›ืŸ ื”ื•ื ืžืืžื™ืŸ ืฉืืฃ ืื—ื“ ืœื ืฆืจื™ืš ืœื”ืฉืชืžืฉ ื‘ืงื•ื“ ื”ื ื•ืจื ืฉื™ื•ืฆื ืžื™ื“ื™ื• ืึทื—ึตืจ.

ืื ื™ ื—ื•ืฉื‘ ืฉืื ืฉื™ ืžืงืฆื•ืข ื‘ืชื—ื•ื ื–ื” ื™ื•ื›ืœื• ืœืชืืจ ื‘ืื•ืคืŸ ืขืฆืžืื™ ืืช ื›ืœ ื”ื”ื™ื’ื™ื•ืŸ ืฉืชื•ืืจ ืœืขื™ืœ, ื‘ืžื™ื“ืช ื”ืฆื•ืจืš, ื•ืื•ืœื™ ืืคื™ืœื• ืœืขืฆื‘ ืื•ืชื• ื™ืคื” ื›ืฉื™ืจื•ืช ืžืขืจื›ืชื™, ื›ืคื™ ืฉื”ืžื—ื‘ืจ ื ื™ืกื” ืœืขืฉื•ืช.

ืกื›ืžืช ืกื™ื‘ื•ื‘ ืชืžื•ื ืช ืžืฆื‘ ืคืฉื•ื˜ื” ื›ื–ื• ืชืืคืฉืจ ืœื ื• ืœื ืจืง ืœืงื‘ืœ ื›ืœ ื”ื–ืžืŸ ืชืžื•ื ืช ืžืฆื‘ ืื—ืช ืžืกื•ื ื›ืจื ืช ื‘ืžืœื•ืื” ืขืœ ื”- SATA SSD, ืืœื ื’ื ืชืืคืฉืจ ืœื ื•, ื‘ืืžืฆืขื•ืช ื›ืœื™ ื”ืขื–ืจ thin_delta, ืœื’ืœื•ืช ืื™ืœื• ื‘ืœื•ืงื™ื ืฉื•ื ื• ืœืื—ืจ ื™ืฆื™ืจืชื•, ื•ื›ืš ืœืžืงื ืืช ื”ื ื–ืง ืขืœ ื”ื›ืจื›ื™ื ื”ืขื™ืงืจื™ื™ื, ืžืคืฉื˜ื™ื ืžืื•ื“ ืืช ื”ื”ืชืื•ืฉืฉื•ืช.

TRIM/DISCARD ื‘-libvirt/KVM

ื›ื™ ืื—ืกื•ืŸ ื”ื ืชื•ื ื™ื ื™ืฉืžืฉ ืขื‘ื•ืจ KVM ื”ืžืจื™ืฅ libvirt, ืื– ื–ื” ื™ื”ื™ื” ืจืขื™ื•ืŸ ื˜ื•ื‘ ืœืœืžื“ ืืช ื”-VMs ืฉืœื ื• ืœื ืจืง ืœืชืคื•ืก ืžืงื•ื ืคื ื•ื™, ืืœื ื’ื ืœืคื ื•ืช ืืช ืžื” ืฉื›ื‘ืจ ืœื ื ื—ื•ืฅ.

ื–ื” ื ืขืฉื” ืขืœ ื™ื“ื™ ื”ื“ืžื™ื™ืช ืชืžื™ื›ืช TRIM/DISCARD ืขืœ ื“ื™ืกืงื™ื ื•ื™ืจื˜ื•ืืœื™ื™ื. ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืขืœื™ืš ืœืฉื ื•ืช ืืช ืกื•ื’ ื”ื‘ืงืจ ืœ-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>

DISCARDs ื›ืืœื” ืžืžืขืจื›ื•ืช ื”ืคืขืœื” ืื•ืจื—ื•ืช ืžืขื•ื‘ื“ื•ืช ื‘ืฆื•ืจื” ื ื›ื•ื ื” ืขืœ ื™ื“ื™ LVM, ื•ื”ื‘ืœื•ืงื™ื ืžืฉืชื—ืจืจื™ื ื‘ืฆื•ืจื” ื ื›ื•ื ื” ื”ืŸ ื‘ืžื˜ืžื•ืŸ ื•ื”ืŸ ื‘ืžืื’ืจ ื”ื“ืง. ื‘ืžืงืจื” ืฉืœื ื• ื–ื” ืงื•ืจื” ื‘ืขื™ืงืจ ื‘ืื™ื—ื•ืจ, ื‘ืขืช ืžื—ื™ืงืช ืชืžื•ื ืช ื”ืžืฆื‘ ื”ื‘ืื”.

ื’ื™ื‘ื•ื™ BTRFS

ื”ืฉืชืžืฉ ื‘ืกืงืจื™ืคื˜ื™ื ืžื•ื›ื ื™ื ืขื ืงื™ืฆื•ื ื™ ื–ื”ื™ืจื•ืช ื• ืขืœ ืื—ืจื™ื•ืชืš ื‘ืœื‘ื“. ื”ืžื—ื‘ืจ ื›ืชื‘ ืืช ื”ืงื•ื“ ื”ื–ื” ื‘ืขืฆืžื• ื•ื‘ืœืขื“ื™ืช ืขื‘ื•ืจ ืขืฆืžื•. ืื ื™ ื‘ื˜ื•ื— ืฉืœืžืฉืชืžืฉื™ ืœื™ื ื•ืงืก ืžื ื•ืกื™ื ืจื‘ื™ื ื™ืฉ ื›ืœื™ื ื“ื•ืžื™ื, ื•ืื™ืŸ ืฆื•ืจืš ืœื”ืขืชื™ืง ืืช ื–ื” ืฉืœ ืžื™ืฉื”ื• ืื—ืจ.

ื‘ื•ืื• ื ื™ืฆื•ืจ ื ืคื— ื‘ืžื›ืฉื™ืจ ื”ื’ื™ื‘ื•ื™:

#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 ืขื‘ื•ืจ VGs ืื—ืจื™ื. LVM ื™ื›ื•ืœ ืœื”ื™ื•ืช ืจืงื•ืจืกื™ื‘ื™, ื›ืžื• ื‘ื•ื‘ื•ืช ืงื™ื ื•ืŸ. ื–ื” ื ื•ืชืŸ ืœ-LVM ื’ืžื™ืฉื•ืช ืงื™ืฆื•ื ื™ืช.

ื .ื‘.

ื‘ืžืืžืจ ื”ื‘ื, ื ื ืกื” ืœื”ืฉืชืžืฉ ื‘ืžืกืคืจ ืžืขืจื›ื•ืช ืื—ืกื•ืŸ ื ื™ื™ื“ื•ืช/KVM ื“ื•ืžื•ืช ื›ื‘ืกื™ืก ืœื™ืฆื™ืจืช ืืฉื›ื•ืœ ืื—ืกื•ืŸ/vm ืžื‘ื•ื–ืจ ื’ื™ืื•ื’ืจืคื™ ืขื ื™ืชื™ืจื•ืช ื‘ืžืกืคืจ ื™ื‘ืฉื•ืช ื‘ืืžืฆืขื•ืช ืžื—ืฉื‘ื™ื ืฉื•ืœื—ื ื™ื™ื ื‘ื™ืชื™ื™ื, ื”ืื™ื ื˜ืจื ื˜ ื”ื‘ื™ืชื™ ื•ืจืฉืชื•ืช P2P.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”