Дълго време не можах да хвана идеята. Тук ще се помъча от моя гледна точка да обясня предимството на subbolume. Subvolume е част от btrfs и не е блоково устройство. То не може да се разглежда като том, част от диск, а представлява нещо подобно на папка която може да се монтира. Има дървовидна структура. Ако правите аналогия с LVM ще видите, че subvolume на btrfs не е блоково устройство, а е пространство от имена на файлове POSIX. Subvolume може да се създава в произволно място на файловата система и ще се държи като всеки друг каталог, но ще може да се монтира и демонтира. Най-вероятно изглежда сложно, а идеята е проста и оригинална. Пример: - Стандартно когато инсталираме дадена ОС разделяме диска на определени томове с определени размери. - По време на работа тези томове могат да се запълнят и да не достигат. - Ако ползваме примерно LVM то томовете може да се променят но става по-сложно. - Subvolume не представлява твърдо зададен том, той е папка на даден диск която може да се монтира като том. - Ползвайки subvolume можете да правите лесно моментни снимки на работоспособността на системата. Subvolume е ключов елемент на btrfs, който изпълнява различни функции като: - съхраняване на потребителски данни и други подтомове, - предоставяне на достъп до данни (монтиране), - CoW (Copy-on-write) механизъм, копиране при запис, - създаване на моментни снимки. Някои общи комнади:
btrfs subvolume create /mnt/subvolume_name btrfs subvolume delete /mnt/subvolume_name
Обърнете внимание, че ако се опитате да премахнете подтом с помощта на файлов мениджър или помощната програма rm , операцията ще бъде неуспешна, като операцията за грешка не е разрешена.
btrfs subvolume show /mnt/subvolume_name btrfs subvolume show /home @home Name: @home UUID: 2482112c-36ae-0a44-8281-b57563e7c855 Parent UUID: - Received UUID: - Creation time: 2024-06-29 12:49:26 -0400 Subvolume ID: 257 Generation: 72 Gen at creation: 14 Parent ID: 5 Top level ID: 5 Flags: - Send transid: 0 Send time: 2024-06-29 12:49:26 -0400 Receive transid: 0 Receive time: - Snapshot(s):
Name - името на подтома, UUID - универсален уникален идентификатор, използван главно за идентифициране на връзките подтом-моментна снимка, Parent UUID - идентификатор на предшестващия подтом, от който е извлечен текущият, Received UUID - идентификатор на предшестващия подтом, изпратен чрез btrfs изпращане, Creation time - Subvolume ID - уникален идентификатор за поставяне в B-дървото, Generation - номер на транзакция при последната актуализация на метаданните на подтома, Gen at creation - номер на транзакция към момента на създаване на подтома, Parent ID - идентификатор на подтома, в който е вложен текущият, Top level ID - ID от най-високо ниво е абсолютно същият като ID на родител, Flags - флагове (всъщност само 1 флаг - само за четене ), Snapshot(s) - списък с моментни снимки, направени от този подтом.
btrfs subvolume list / ID 256 gen 174 top level 5 path @ ID 257 gen 72 top level 5 path @home
btrfs subvolume snapshot -r /path/to/subvol /path/to/snapshot
-r - заключваме моментната снимка за промени. Моментната снимка също е подтом, но просто има разширени свойства. Основната им разлика е, че моментната снимка има записи за това от кой подтом е създадена. Това са полетата Parent UUID и Received UUID . Подтомът също има тези полета, но те винаги са празни. Така че по същество моментна снимка и подотом са едно и също нещо. Флагът само за четене може да се контролира ръчно, това работи за всеки подтом:
btrfs property get /path/to/subvol ro btrfs property set /path/to/subvol ro true
btrfs subvolume show /path/to/snapshot Name: subx UUID: d08612d8-596a-11e9-8647-d663bd873d93 Parent UUID: 09af45e8-d2b2-b342-8a92-fa270ac82d0a Received UUID: - Creation time: 2019-03-23 17:59:28 +0100 Subvolume ID: 269 Generation: 39 Gen at creation: 35 Parent ID: 260 Top level ID: 260 Flags: - Snapshot(s):
Важна характеристика на операцията за създаване на моментна снимка е, че тя не е рекурсивна. Вместо вложени подтомове, в моментната снимка ще бъдат създадени празни директории.
Много теория, а за какво се ползва? Ще демонстрирам инсталиране на Debian, в случая 12. Ще ползваме brtfs subvolume. На по-късен етап върху тази виртуална машина ще инсталираме LXD. По-принцип subvolum-ите са добра идея когато правите временни снимки на системата. Дали ще е сървър или работна станция няма значение. Да инсталираме системата. Самата инсталация няма да показвам, а само важните неща.
Това е виртуалната машина. Ползваме UEFI.
Ползваме Advanced options ... за инсталация.
Експертна инсталация. Инсталацията протича стъпка по стъпка. Когато трябва да се разделя диска избираме ръчно (Manual) разделяне.
Забележете как са разделени дисковете. Първи диск - имаме един дял за ESP и всичко останало за /. Втори диск - един дял за ESP всичко останало не е монтирано никъде. На по-късен етап ще имаме btrfs-mirror с първия диск.
Предупреждава, че на втория диск btrfs дяла не е монтиран. Не се връщаме и продължаваме.
Предупреждава, че нямаме SWAP дял. Не се връщаме и продължаваме. За сега не е нужен.
Записваме промените които направихме.
ВАЖНО !!!. Не продължаваме а натискаме клавишна комбинация Ctrl+Alt+F2.
Натискаме Enter и влизаме в терминален режим.
Вълнува ни какви дялове имаме и къде са монтирани.
Имаме: /dev/nvme0n1p2 /target /dev/nvme0n1p1 /target/boot/efi Всичко е правилно. Ползваме UEFI затова дяля efi е монтиран в /boot/efi Задачата е тези дялове да се демонтират. След това втория дял на първия диск да се монтира в /mnt
Имаме един subvolume. Той е именуван @rootfs. Поради спецификата на работа на subvolume трябва да го преименуваме на @. Освен това е необходим и още един subwolume @home.
Следващата задача е да монтираме @ и @home с определени опции.
Монтирахме втория дял на първия диск. mount -o - монтираме с опция. rw - монтираме дяла с възможност да се чете и да се записва в него. noatime - забраняваме записването на времето за последен достъп до файла, вдигаме производителността, space_cache=v2 - опция за контрол на кеша за свободно пространство. Кешът за свободно пространство значително подобрява производителността при четене на свободно пространство от блокова група в паметта. compress=zstd - компресиране на съдържанието в z standard. Отношение производителност/компресиране много добро. ssd - ако дисковете са ssd ползвайте тази опция. Оптимизира монтирането. discard=async - ако липсва тази опция рязко се повишава енерго потреблението особено на NVMe дисковете. subcol=@ - кой под том монтираме /dev/nvme0n1p2 - физически кой е тома /target - къде монтираме под тома. Имаме още един пот том (subvolume). Проблема е, че нямаме папка къде да го монтираме. За целта първо създаваме папка. След това монтираме и @home. Между другото създаваме и папка за монтиране на EFI.
Монтирахме и EFI. За да се запазят всички промени които създадохме след рестарт трябва да се редактира fstab.
nano /target/etc/fstab # UUID=6b9eb7e8-4be6-4aa4-8607-37ed382ea69a / btrfs defaults,subvol=@rootfs 0 0 UUID=6b9eb7e8-4be6-4aa4-8607-37ed382ea69a / btrfs rw,noatime,space_cache=v2,compress=zstd,ssd,discard=async,subvol=@ 0 0 UUID=6b9eb7e8-4be6-4aa4-8607-37ed382ea69a /home btrfs rw,noatime,space_cache=v2,compress=zstd,ssd,discard=async,subvol=@home 0 0
След като сме записали файла, връщаме се в първа конзола за да продължим инсталацията. Връщането става чрез клавишната комбинация Ctrl+Alt+F1.
Предлага да използваме не свободни хардуерни решения, които не са част от Debian. Съгласяваме се.
Предлага да използваме не свободни софтуерни решения, които не са част от Debian. Съгласяваме се.
Ще ползваме репозиторите на Debian.
Указваме кои репозитори ще ползваме.
Предлага да инсталираме GRUB.
Ползваме EFI затова се отказваме GRUB да го замести.
Да обновим NVRAM.
Нямаме друга операционна система затова няма какво друго да откриваме. И така инсталацията протича до края. След което системата се рестартира.
Системата зареди успешно. Да погледнем наличните subvolume.
btrfs subvolume list / ID 256 gen 103 top level 5 path @ ID 257 gen 72 top level 5 path @home
Налични два, както ги създадохме. Да проверим как са монтирани дяловете.
df -h Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 795M 664K 794M 1% /run /dev/nvme0n1p2 55G 1.7G 51G 4% / tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/nvme0n1p2 55G 1.7G 51G 4% /home /dev/nvme0n1p1 487M 5.9M 481M 2% /boot/efi tmpfs 795M 0 795M 0% /run/user/0 tmpfs 795M 0 795M 0% /run/user/1000 lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sr0 11:0 1 1024M 0 rom nvme0n1 259:0 0 55G 0 disk ├─nvme0n1p1 259:1 0 487M 0 part /boot/efi └─nvme0n1p2 259:2 0 54.5G 0 part /home / nvme0n2 259:3 0 55G 0 disk ├─nvme0n2p1 259:4 0 487M 0 part └─nvme0n2p2 259:5 0 54.5G 0 part
Забележете, / и /home са монтирани на едно и също място (на един и същи дял). Subvolume не е физически дял, затова е така.
https://habr.com/ru/companies/veeam/articles/458250/