Създаване и използване на моментни снимки в BTRFS. „Устойчива на грешки“ система, базирана на Ubuntu и btrfs Btrfs команди

Като маниак, все още имам навика постоянно да експериментирам със системата: да възстановявам, инсталирам нестабилни RC ядра, включително експериментални клонове за актуализиране. Често дори бих казал, че разбивам системата твърде често (моят личен рекорд, 2 седмици без преинсталиране).

Какво означава прекъсване? Когато нещо работи изключително зле, например LibreOffice и Compiz, които често се сриват и обичат да замръзват, аз или се опитвам да преконфигурирам системата, но това е доста дълго и мрачно.

Точно това, към което имам предвид.

Ако някой, като мен, обича да експериментира със системата и му е писнало да я възстановява всеки път, то ето вариант за вас как реших този проблем за себе си. Ще мина под котката.

Как да или обикновен велосипед.

Елемент 1: LiveCD

След факта изхождаме от факта, че дискът е разделен на 2 дяла: /boot, форматиран в ext4 и / форматиран в btrfs.
Grub 2 е написан в MBR на диска.
Съответно, първи параграф:
От лични навици и съображения е много по-лесно да възстановите системата от графичния интерфейс, отколкото да се възхищавате на черния екран и понякога без достъп до Интернет, да запомните и предписвате команди. Не, не мисля, че конзолата е зла, обичам конзолата, но така или иначе е по-приятна от графичния интерфейс.
Действие първо
Идеята не е нова, признавам, че се появи някъде в Хабре, но не намерих линка, затова се извинявам на източника на публикацията.
Копирайте изображението на желаната Live дистрибуция в папката /boot
sudo cp /media/timofey/boot/grub/ISO/Linux/Ubuntu/ubuntu-12.10-desktop-amd64.iso /boot/ubuntu-12.10-desktop-amd64.iso
/boot се премества в отделен дял, не защото е по-добре, а защото по неизвестни за мен причини не се зареждат LiveCD, записани в btrfs от под grub 2.
Сега коригираме настройките по подразбиране grub 2, така че при актуализиране на grub "a да не загубим изображението.
sudo nano /etc/grub.d/40_custom

И поставете нещо подобно там, след коментарите:
menuentry "Ubuntu 12.10 amd64" ( set isofile=/ubuntu-12.10-desktop-amd64.iso loopback loop $isofile linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile - init noeject nord )/casper/initrd.lz )

Всъщност той беше конфигуриран по изображение и подобие (официална уики за ubuntu):
/Grub2/ISOBoot
Сега "почти" най-важното нещо, ние повторно генерираме конфигурацията:

sudo update-grub

Това е всичко, сега след рестартиране, задържайки клавиша shift, можем да стартираме мини система с интернет и графичен интерфейс, независимо от състоянието на основната система.

Елемент 2: Снимки

Мисля, че всеки, който е запознат с Linux от дълго време, поне е чувал за btrfs, може би дори че вече е изградил собствено мнение. Когато инсталирате ubuntu на дял с btrfs, по подразбиране се прави много разумно, използва се механизмът на подразделения и се създават 2 подраздела, това са @ и home (които замествам / и / home), съответно , когато преинсталираме системата правилно, няма да загубим конфигурации. Но сега не става дума за това. Как да използваме тази грижа за крайните потребители? Много просто.

Малко предистория:
Първоначално беше планирано скриптът да се изпълни чрез rc.local, но не беше изпълнен, след това беше реализиран чрез ежедневния cron, по-късно победих rc.local и изключих моментните снимки по дяволите в cron.

Код на скрипта:

#!/bin/bash #Този скрипт за автоматично създаване на моментна снимка при стартиране #Версия 1.2.9 set -e DATA="$(date +%g%m%d%k%M%S)" VOLUME=/dev/sda1 [ ! -d "/tmp/$DATA/" ] && sudo mkdir "/tmp/$DATA/" монтиране $VOLUME "/tmp/$DATA/" && ( [ ! -d "/tmp/$DATA/snapshots/" ] && sudo mkdir "/tmp/$DATA/snapshots/" mkdir "/tmp/$DATA/snapshots/$DATA/" && cd "/tmp/$DATA/" btrfs моментна снимка на подтом ./@ ."/snapshots/$DATA /@_$(DATA)/" btrfs subvolume моментна снимка ./@home ."/snapshots/$DATA/@home_$(DATA)/" [ ! -f ./snapshots/snapshots.log ] && докоснете ./snapshots/ snapshots.log chmod 777 ./snapshots/snapshots.log echo on_startup_$(дата +%X_%x) >> ./snapshots/snapshots.log umount -l "/tmp/$DATA/" && sudo rmdir "/tmp/ $DATA/" )

Намира се в /etc/btrfs_snapshot_onstartup
Добавете го към /etc/rc.local и дайте разрешения за изпълнение на двата файла чрез sudo chmod +x "път на файла"
Регистрирането на изпълнението във файла ./snapshots/snapshots.log може да не работи, тогава трябва да го създадете ръчно под root права. След рестартирането той самият ще получи необходимите права.

По всяко време можем да видим състоянието на системните моментни снимки, като напишем:
котка /var/log/snapshots.log

Всички моментни снимки се добавят към дяла със системата в папката със снимки, където се създава папка за всяко успешно стартиране на системата.
Някои може да кажат, че не си струва да правите моментни снимки при стартиране. Изобщо не, оправдава се, за един ден мога да направя куп промени в системата и да я рестартирам сто пъти, а в алтернативни случаи няма да мога да се върна към момента на успешно стартиране (действително), но само преди един ден.

Възможност за ръчно стартиране:
#!/bin/bash #Този скрипт за автоматично създаване на моментна снимка #Версия 1.2.8 set -e DATA=$(дата +%g%m%d%k%M%S) ############ ########################## [ ! -d /tmp/$DATA/ ] && sudo mkdir /tmp/$DATA/ sudo mount /dev/sda2 /tmp/$DATA/ && ( ################## ################################################### [ ! -d /tmp/$DATA/snapshots/ ] && mkdir /tmp/$DATA/snapshots/ mkdir /tmp/$DATA/snapshots/$DATA/ cd /tmp/$DATA/ sudo btrfs моментна снимка на подтом ./@ . /snapshots/$DATA/@_$(DATA)/ sudo btrfs subvolume моментна снимка ./@home ./snapshots/$DATA/@home_$(DATA)/ ############### ################################################### ### sudo chmod 777 ./snapshots/snapshots.log sudo echo this.hands_$(date +%X_%x) >> ./snapshots/snapshots.log sudo cat ./snapshots/snapshots.log sleep 1 sudo umount - l /tmp/$DATA/ && sudo rmdir /tmp/$DATA/ ################################## ################################# sudo btrfs файлова система df / #информация за fs ) прочетете изход 0

Точка 3: Възстановяване

За това се опитаха, убиха системата, какво да се прави?
Зареждаме от LiveCD, монтираме системния дял в удобна за нас папка.
След това, ако е необходимо, скрийте или премахнете стандартните @ и началните подтомове.
и заменете липсващия с необходимата моментна снимка.
В повечето случаи е достатъчно да замените @.
nazarpc
Също така, моментните снимки позволяват не само да се върнете към определено състояние на системата, но и да извлечете необходимия файл или конфигурация от него, което също дава известна свобода при изтриване на файлове с неизвестен произход.

Точка 4: Почистване

Моментните снимки не заемат много място, но с течение на времето поради тях на диска може да се натрупа голямо количество боклук. Ето скрипт за автоматично почистване на папки със снимки. Това премахва всички моментни снимки на системата

#!/bin/bash #Версия 0.0.9 set -e DATA=$(дата +%g%m%d%k%M%S) [ ! -d "/tmp/$DATA" ] && sudo mkdir "/tmp/$DATA" sudo mount /dev/sda1 "/tmp/$DATA" && ( cd "/tmp/$DATA/snapshots/" за i в * /* do sudo btrfs subvolume delete "$i" направено за i в * do sudo rmdir -v "$i" done echo cleanup_$(date +%g%m%d%k%M%S) > "./snapshots .log" sudo cp "./snapshots.log" "/var/log/snapshots.log" sudo umount -l "/tmp/$DATA" && sudo rmdir "/tmp/$DATA" ) прочетете изход 0

Резултат

Направихме относително устойчива на грешки система, в която имаме възможността бързо да възстановим системата след повреда. В същото време харчите минимално време и усилия за изграждане на защитна система.
Моите собствени мисли за това
Мисля, че подобно решение едва ли ще бъде полезно в големи ИТ структури, но за малка домашна употреба би трябвало да е идеално.

Също така би било страхотно да завършите скрипта за почистване, така че да изчисти всички моментни снимки, по-стари от, например, седмици, а не всички налични, честно казано опитах, но не ми се получи. След това може също да бъде въведен, например, в cron по подразбиране, за да се изпълнява веднъж на ден и след това да бъде включен в официалния инсталационен скрипт за btrfs, мисля, че с малки модификации, това е доста универсално решение, базирано на стандартни btrfs функции.

Да, знам lvm, но нямам нужда от допълнителен слой на абстракция от хардуер и поставянето на снимки в отделна секция също не е comme il faut.

UPD 1:
Благодаря на потребителите

Преминаването към нова файлова система винаги е трудна задача. Вече се доверяваме на старата, доказана файлова система. Може дори да има някои ограничения във функционалността и производителността, но никога не ни е подвеждал. Новите файлови системи предлагат много функции, но въпросът е може ли да им се вярва?

Една такава файлова система е Btrfs. Това е сравнително нова файлова система, която се появи през 2007 г. и е разработена от Oracle. Той предлага много широк набор от нови функции и следователно представлява голям интерес за потребителите, но все още има слухове в мрежата, че тази файлова система все още не е подходяща за постоянно използване. В тази статия ще се опитаме да разберем какви възможности ни дава Btrfs, както и дали вече може да се използва.

Както казах, Btrfs е разработен от Oracle през 2007 г. Няма единно декодиране на името, някои казват, че означава B-tree FS, други Better Fs. Точно както в други файлови системи, всички данни се съхраняват на диск на определени адреси. Тези адреси се съхраняват в метаданни. И тук започват разликите. Всички метаданни са организирани като b-дървета. Това дава по-голяма производителност при работа с файловата система, а също така ви позволява да добавяте неограничен брой файлове.

Но дори и това не е всичко. Когато презаписвате файл, данните не се презаписват, а само модифицираната част се копира на новото място.След това метаданните просто се актуализират. Това ви позволява да създавате моментни снимки на файловата система, които не заемат дисково пространство, докато не бъдат направени много промени. Ако старият блок вече не е необходим, защото не е част от моментна снимка, той автоматично се изтрива.

Благодарение на своята структура Btrfs има много възможности, например може да се справи с днешните много големи носители за съхранение. Максималният размер на файловата система е 16 екзабайта. Всичко това е възможно благодарение на правилното използване на дисковото пространство. Други файлови системи използват целия твърд диск, от край до край, за да запишат структурата си.

Btrfs прави нещата по различен начин. Всеки диск, независимо от неговия размер, е разделен на блокове от 1 GB за данни и 256 MB за метаданни. След това тези блокове се събират в групи, всяка от които може да се съхранява на различни устройства, като броят на такива блокове в групата може да зависи от нивото на RAID за групата. Мениджърът на обеми вече е интегриран във файловата система, така че не е необходимо да се използва допълнителен софтуер.

Защитата и компресията на данните също се поддържат на ниво файлова система, така че тук също не се нуждаете от допълнителни програми. Файловата система btrfs също поддържа огледално отразяване на данни в множество медии. Ето и други характеристики на btrfs, които могат да бъдат споменати:

  • Поддръжка за моментни снимки на файловата система, само за четене или само за запис;
  • Контролни суми за данни и метаданни с помощта на алгоритъма crc32. По този начин всяка повреда на блока може да се определи много бързо;
  • Компресия със Zlib и Lzo;
  • Оптимизирана за работа със SSD, файловата система автоматично открива ssd и започва да се държи различно;
  • Фонов процес за откриване и коригиране на грешки, както и дефрагментиране и дедупликация в реално време;
  • Поддържа преобразуване от ext4 и ext3 и обратно.

Всичко това е много добре, но възможно ли е вече да се използва тази файлова система? Нека се опитаме да се справим с това.

Готов ли е btrfs за използване?

Все още има много погрешни схващания около Btrfs. Много от тях произтичат от реални проблеми, които са били в началото на развитието на файловата система. Но хората, които гледат тази информация, не гледат нейната дата. Да, Btrfs наистина беше нестабилен и нестабилен. Имаше много проблеми със загубата на данни и много потребители пишат за това, но това беше през 2010 г.

Най-важната част от файловата система е нейният формат за съхранение на диск. Но форматът на файловата система Btrfs вече е фиксиран, това се случи през 2012 г. и вече не се променя, освен ако не е абсолютно необходимо. Само това е достатъчно, за да се разпознае стабилността на btrfs.

Но защо мнозина смятат Btrfs за нестабилен? Има няколко причини за това. Първо, това е страхът на потребителите от новите технологии. Това беше не само в Linux, но и в Microsoft, с прехода им към NTFS, и в Apple. Но тук има някакъв парадокс, файловата система XFS е преминала през 20 години стабилно развитие, но най-стабилната файлова система е ext4, която е разработена от разклонението на ext3 през 2006 г. Всъщност той е една година по-стар от Btrfs.

Втората причина е в активно развитие, въпреки че форматът за съхранение на данни е замразен, основната кодова база все още е активно разработена и все още има много място за подобрения в производителността и нови функции.

Но вече има много потвърждения, че файловата система е готова. Тази файлова система се използва на сървърите на Facebook, където компанията съхранява своите чувствителни данни. А това само по себе си е важен фактор. Компании като Facebook, SuSE, RedHat, Oracle, Intel и други работят върху подобряването на файловата система. Тази файлова система се използва по подразбиране в SUSE Linux Enterprise от версия 12. Всички тези фактори заедно доказват, че файловата система е напълно готова за използване. И като се има предвид функционалността и характеристиките на btrfs, той вече може да се използва.

Използване на Btrfs

Защо си струва да използвате Btrfs и дали изобщо си струва, разбрах. Сега бих искал да покажа малко практика, за да можете да оцените тази файлова система в действие. Ще дам примери, базирани на Ubuntu. Първо, инсталирайте инструментите за управление на файловата система:

sudo apt инсталирайте btrfs-tools

Създаване на файлова система btrfs

Първо трябва да създадете файлова система. Да кажем, че имаме два твърди диска /dev/sdb и /dev/sdc, искаме да създадем една файлова система върху тях с огледално копиране на данни. За да направите това, просто направете:

sudo mkfs.btrfs /dev/sdb /dev/sdc

По подразбиране ще бъде RAID0 за данни (без излишък и RAID1 за метаданни (дублиране на един диск). Когато използвате един диск, метаданните също се дублират, ако искате да деактивирате това поведение, можете да използвате единичния -m опция:

sudo mkfs.btrfs -m единичен /dev/sdb

Но като правите това, увеличавате риска от загуба на данни, защото ако метаданните бъдат загубени, данните също.

Можете да видите информация за новосъздадената файлова система с командата:

sudo btrfs файлова система показва /dev/sdb

Или за всички монтирани файлови системи:

sudo btrfs файлова система показване

btrfs монтиране

За да монтирате, използвайте обичайната команда:

sudo монтиране /dev/sdb /mnt

Можете да монтирате всяко от устройствата, това ще има същия ефект. Редът в /etc/fstab ще изглежда така:

/dev/sdb /mnt btrfs по подразбиране 0 1

Сега разглеждаме информацията за заетото дисково пространство:

sudo btrfs файлова система df /mnt

Компресия в btrfs

За да активирате компресията, просто добавете опцията за компресиране при монтиране. Можете да му предадете алгоритъма lzo или zlib:

sudo mount -o компресия=lzo /dev/sdb /mnt
$ sudo mount -o compress=zlib /dev/sdb /mnt

Възстановяване на btrfs

За да възстановите повреден Btrfs, използвайте опцията за монтиране за възстановяване:

sudo mount -o възстановяване /dev/sdb /mnt

Промяна на размера

Можете да преоразмерите том в реално време с помощта на командата resize:

sudo btrfs преоразмеряване на файловата система -2g /mnt

Намалете размера с 2 гигабайта. След това увеличете с 1 гигабайт:

sudo btrfs преоразмеряване на файловата система +1g /mnt

Създаване на подтомове

Можете да създавате логически дялове, подтомове вътре в основния дял, като използвате Btrfs. Те могат да се монтират вътре в основния дял:

sudo btrfs подтом създава /mnt/sv1
$ sudo btrfs подтом създава /mnt/sv2
$ sudo btrfs списък с подтомове /mnt

Монтаж на подобеми

Можете да монтирате подтом с идентификатора, който сте получили с последната команда:

sudo umount /dev/sdb

sudo mount -o subvolid=258 /dev/sdb /mnt

Или можете да използвате името:

sudo mount -o subvol=sv1 /dev/sdb /mnt

Премахване на подтомове

Първо, монтирайте корена на btrfs вместо подтом:

sudo umount /mnt

sudo монтиране /dev/sdb /mnt/

За да премахнете подтом, можете да използвате пътя за монтиране, например:

sudo btrfs изтриване на подтом /mnt/sv1/

Правене на моментни снимки

Файловата система Btrfs ви позволява да създавате моментни снимки на промените. За това се използва командата моментна снимка. Например, нека създадем файл, след което направим моментна снимка:

докоснете /mnt/sv1/test1 /mnt/sv1/test2

Създайте моментна снимка:

sudo btrfs моментна снимка на подтом /mnt/sv1 /mnt/sv1_snapshot

Оригинал: Как да създавате и използвате BTRFS моментни снимки - Урок
Автор: Игор Любунчич
Дата на публикуване: 25 февруари 2012 г
Превод: А. Кривошей
Дата на прехвърляне: април 2012 г

BTRFS е сравнително нова файлова система, базирана на ZFS на Sun, която донесе най-много иновации в Unix през последните 25 години, преди да бъде поета от Oracle. BTRFS все още се счита за нестабилен и следователно не е подходящ за производствени приложения. Тази файлова система обаче има много полезни функции, които си струва да се проучат. Едно от тях е създаването на моментни снимки на системата.
Нека уточня. Моментните снимки са моментални снимки на състоянието на системата. В известен смисъл, ако копирате файл и направите резервно копие, вие правите моментна снимка в момента на копирането. Това може да се направи навсякъде и по всяко време. Помислете за файлова система, която всъщност може да управлява множество копия на вашите файлове в своята структура и да ви позволи да ги използвате, както пожелаете. Звучи интересно, нека да проучим.

Въведение в BTRFS

Преди да започнем да копаем по-дълбоко, бих искал да очертая накратко възможностите на тази файлова система. BTRFS трябва да обработва всички системни операции, свързани с дискове и управление на файлове, които обикновено изискват допълнителни помощни програми. BTRFS осигурява дефрагментиране, балансиране на натоварването, свиване, нарастване, гореща смяна, RAID, моментни снимки, компресия, клониране и други, всичко това е вградено в драйвера на файловата система. С други файлови системи вероятно ще ви трябват различни други драйвери и потребителски помощни програми, за да управлявате всички тези видове операции, като дефрагментатор на файлова система, RAID и LVM драйвери и т.н.
Вградената функционалност означава производителност и лекота на използване. Въпреки това, в момента BTRFS все още не е напълно използваем поради нестабилност, както и влошаване на производителността в сравнение с други файлови системи като Ext4. Но той има огромен потенциал, така че не може да бъде пренебрегнат, а трябва да се изучава.
В това ръководство ще ви покажа как да управлявате моментни снимки. Това е изключително подходяща функция, която ще ви позволи да архивирате важни файлове, преди да направите каквито и да било промени в тях и след това да ги възстановите, ако е необходимо. В известен смисъл това е като Windows System Restore плюс драйвер за връщане назад на ниво файлова система. Между другото, освен моментни снимки, в тази статия можете да намерите и полезна информация за ежедневната работа с файловата система BTRFS. Тестването беше направено на система Fedora 16 Verne с KDE работен плот.

Как да управлявате BTRFS

Можете да използвате BTRFS за основната файлова система, с изключение на /boot, която трябва да бъде форматирана с традиционна файлова система за журналиране. За простота, в това ръководство ще работим с отделно устройство /dev/sdb1, форматирано в BTRFS и използвано, когато е необходимо. На практика това може да бъде /home или /data, или каквото и да е.

И така, какво ще правим?

Ще вземем /dev/sdb1 и ще го монтираме. След това ще създадем няколко подсекции. Мислете за подсекциите като за виртуални коренни дървета, тъй като всяко от тях е отделна, независима структура от данни на дърво, дори ако данните са едни и същи.
По-долу е дадена последователността от команди, необходими за това. Не се плашете, ние ще ви обясним как работят.

$ btrfs subvolume create /mnt/data $ btrfs subvolume create /mnt/data/orig $ echo "Dedoimedo е l33t" > /mnt/data/orig/file $ btrfs subvolume моментна снимка /mnt/data/orig /mnt/data/backup

/dev/sdb1 е монтиран на /mnt. Създаваме подключ, наречен данни. Вътре в него създаваме друг подраздел, наречен orig. И вече вътре в него ще бъдат създадени нашите файлове. От гледна точка на потребителя, подсекциите изглеждат като обикновени директории. С други думи, data и data/orig са директории.
След това създаваме текстов файл в произход, наречен файл, съдържащ някакъв текст. Накрая създаваме моментна снимка на подключа orig и го наричаме backup. Вече имаме идентично копие на подраздела orig. Ето доказателството:

Освен това, за да проверим, използваме командата btrfs списък с подтомовеза да видите всички подраздели:

$ btrfs списък с подтомове

Имайте предвид, че всеки подраздел има свой собствен идентификационен номер. Както скоро ще видим, това е важно.

Изглед по подразбиране

Понастоящем /mnt показва както orig, така и архивиране по подразбиране (всичко в данни). Можем да го променим. Спомняте ли си по-рано, че споменах виртуални коренови дървовидни структури? BTRFS ви позволява да промените виртуалната главна директория на всеки от подключовете.
По този начин използването на подсекции и моментни снимки просто означава превключване между различни йерархии на данни. Няма нужда да изтривате, презаписвате файлове или да правите нещо друго. Просто преминавате към друг подраздел. Сега ще видим как се прави това.
Екип btrfs subvolume set-default IDе всичко, от което се нуждаем. Ще зададем изгледа по подразбиране на различен дял, след това ще демонтираме устройството и ще го монтираме отново. Важно е!
Сега, ако работите върху файлова система, която не може да бъде демонтирана, защото се използва, като /usr или /etc, трябва да рестартирате компютъра, за да влязат промените в сила. Сега в даденото дърво на директорията ще се покаже друг подраздел. Потребителят няма да забележи разликата, но данните в директориите ще се променят.
За да видим наистина как работи това, ще редактираме файла в архива. Заменете текста Dedoimedo is l33t с Dedoimedo NOT l33t.

$ echo "Dedoimedo НЕ е l33t" > /mnt/data/backup/file

Добре, знаем идентификатора за всички подраздели. Следователно ще монтираме ID като изглед по подразбиране. Това означава, че веднага щом монтирате отново /mnt, ще видим файл с това съдържание тук.

$ btrfs subvolume set-default 257 /mnt $ umount /mnt $ mount /dev/sdb1 /mnt

Сега нека върнем всичко обратно:

Това може да се направи толкова пъти, колкото е необходимо:

По-горе променихме изгледа между 257 и 260, тоест между orig и backup, в резултат на което можем да видим съдържанието на модифицирания файл. Просто показахме на потребителя различни подсекции.
В резултат на това, ако искаме да видим както оригинал, така и резервно копие в директорията с данни, трябва да възстановим изгледа по подразбиране на подраздела от най-високо ниво, тоест данни. Имайте предвид, че всички данни се показват в директорията /mnt, тъй като ние я избрахме като точка на монтиране. Вместо това обаче можете да използвате всяка друга директория.

Заключение

Функцията за моментна снимка в BTRFS е реализирана доста спретнато и използването й не е трудно. Разбира се, трябва да внимавате да използвате правилното дърво с данни и да не смесвате нещата. Но сега вече знаете основните команди на BTRFS и можете да действате по-уверено. В бъдеще ще тестваме Snapper, BTRFS преден край, достъпен от openSUSE, който позволява същата функционалност да бъде реализирана чрез GUI за тези, които не харесват командния ред.

Никой от нас не е имунизиран от грешки. Понякога синдромът на кривите ръце води до много тъжни последици. Понякога е много трудно да устоиш и да не проведеш „антинаучни“ експерименти със системата или да стартираш скрипт/приложение, изтеглено от непроверен източник. И тук на помощ идват различни инструменти за стартиране на приложения в изолирана среда и разширени възможности на файловата система.

Въведение

*nix системите винаги са били относително устойчиви на неправилно написани приложения (при условие, разбира се, че не са стартирани като root). Понякога обаче има желание да експериментирате със системата - да се забавлявате с конфигурации, някои от които могат да бъдат жизненоважни, да стартирате подозрителен скрипт, да инсталирате програма, получена от ненадежден източник ... В противен случай параноята просто преодолява и аз искам да изгради възможно най-много бариери за защита срещу потенциален зловреден софтуер. Статията ще опише някои начини за избягване на последствията от непринудени грешки чрез връщане към предварително създадена точка на връщане (Btrfs моментни снимки), стартиране на подозрителна програма в ограничена среда и забавление на вашата параноя (Arkose и chroot).

chroot

Chroot е познат от дълго време. Той има огромно предимство пред другите инструменти - работи навсякъде, дори в много стари дистрибуции. Всички тези новосъздадени пясъчници не са нищо повече от по-нататъшното му развитие. Но има и недостатъци. Например, няма начин да ограничите работата в мрежа, root може да се измъкне от нея с известно усилие и най-важното е доста трудно да го конфигурирате. Въпреки това, за някои цели, като например инсталиране на пакети от източник, той е идеален.

Има поне три начина за създаване на chroot среда:

  1. Вие дефинирате всички приложения и библиотеки, необходими за работата на стартираната програма. Това е най-гъвкавият начин, но и най-объркващият.
  2. chroot средата се формира динамично. Едно време имаше проект Isolate, който направи това, но сега, по неизвестни причини, той потъна в забвение.
  3. Разгръщане на базовата система в посочената директория и рутинг към нея - ще го опиша.

grub и btrfs

Най-вероятно, когато се зарежда от Btrfs дяла, Grub ще се закълне, че редки файлове не са разрешени и ще ви помоли да натиснете произволен клавиш. За да предотвратите изскачането на това съобщение, отворете файла /etc/grub.d/00.header в любимия си текстов редактор и коментирайте следния ред там:

Ако [ -n "\$(have_grubenv)" ]; тогава ако [ -z "\$(boot_once)" ]; след това save_env recordfail; fi; fi

Всъщност променливата recordfail е необходима за предотвратяване на циклично рестартиране, за което се активира при стартиране и след това, в случай на успешно зареждане, се задава на 0. Въпреки че е нежелателно да се коментира кодът, отговорен за тази процедура, Мисля, че на настолна система е напълно можете да се справите без нея.

Ognelis в пясъчника - това казва заглавието

Първо, нека инсталираме пакета debootstrap, който се използва точно за тази цел.

$ sudo apt-get install debootstrap

След това ще създадем директория, в която ще се намира chroot, и ще разположим квантовата базова система в нея. По принцип може да се създаде навсякъде, но традиционното му местоположение е /var/chroot. Тъй като повечето от следните команди изискват root достъп, има смисъл да преминете към акаунта на суперпотребител:

$ sudo su - # mkdir /var/chroot && cd /var/chroot # debootstrap quantal ./quantal-chr1 http://mirror.yandex.ru/ubuntu

Нека да разгледаме последната команда. Той разгръща версията на Quantal Ubuntu в отделна директория quantal-chr1 (никога не знаете, внезапно е необходим друг chroot) от най-близкото огледало. След като внедряването приключи, трябва да съпоставите файловите системи procfs, sysfs и (ако е приложимо) директорията /dev към това поддърво. В случай, че chroot ще се използва само за текстови приложения до рестартиране, следните команди трябва да са достатъчни:

# монтиране --bind /proc /var/chroot/quantal-chr1/proc # монтиране --bind /sys /var/chroot/quantal-chr1/sys # монтиране --bind /dev /var/chroot/quantal-chr1/ dev

Ако искате това поддърво да работи след рестартиране, добавете съответните редове към /etc/fstab. Е, за да работят някои графични приложения, директориите /tmp и /var/run/dbus също трябва да се показват. След това вече можете да въведете следната команда, която всъщност прави chroot:

# chroot /var/chroot/quantal-chr1/

И вече си заключен в него. За да не бъркате chroot с реална система, препоръчвам да промените подканата на обвивката. Например, нека инсталираме и стартираме Skype в chroot. За да направите това, трябва да инсталирате пакета schroot на хост системата, което улеснява стартирането на програми в chroot среда:


Разгръщане на chroot в основната система с помощта на debootstrap # apt-get install schroot

След това добавяме запис към файла /etc/schroot/schroot.conf. В моя случай добавих следното:

/etc/schroot/schroot.conf description=Quantal Skype директория=/var/chroot/quantal-chr1 priority=3 user=rom groups=rom root-groups=root,rom

Препращаме /dev, /proc, /sys, /tmp и /var/run/dbus - вижте по-горе как да направите това. Нека добавим потребителя и групата на skype към chroot - желателно е uid и gid да съвпадат с uid / gid на основния потребител на реалната система (в моя случай rom), за което въвеждаме следните команди:

# schroot -c quantal-skype -u root # addgroup --gid 1000 skype # adduser --disabled-password --force --uid 1000 --gid 1000 skype

След това поставяме прясно изтегления Skype - отново в chroot - и задоволяваме неговите зависимости:

# dpkg --force-all -i skype-ubuntu-precise_4.1.0.20-1_i386.deb # apt-get -f install # изход

В основната система позволяваме връзки към X сървъра от localhost и влизаме в chroot като нормален потребител:

$ xhost +localhost $ cd / && schroot -c quantal-skype -u rom /bin/bash

Задайте променливата DISPLAY (която трябва да разгледате в основната система) и стартирайте Skype:

$ export DISPLAY=":0.0" $ skype --dbpath=/home/skype/.Skype &

Skype беше успешно инсталиран и стартиран в chroot среда.

Би било възможно да напишете скрипт за улесняване на стартирането, но можете да го направите сами.


Използване на Arkose

Arkose работи по подобен начин на пясъчните кутии на Windows, като Sandboxie. На практика това е удобна обвивка за LXC контейнери. Но, както знаете, удобството и гъвкавостта понякога са несъвместими - фината настройка на създадените контейнери е трудна. От плюсовете отбелязвам интуитивен интерфейс (това е, ако използвате GUI - стартирането от командния ред обаче също е много лесно), от минусите - по подразбиране изисква доста свободно пространство на твърдия диск и има някои възможни решения; но ако използвате Arkose като допълнителна обвивка за потенциални пътища за инжектиране на зловреден софтуер (браузър) или дори просто за експериментиране с някое интересно приложение, няма да навреди.

seccomp и seccomp-bpf

Seccomp е малко известен механизъм, въведен още в ядрото 2.6.12, който позволява на процес да направи еднопосочен преход към "безопасно" състояние, където са му достъпни само четири системни извиквания - exit(), sigreturn() , read() и write(), а последните две са достъпни само за вече отворени файлове. Ако процесът се опита да извика друго системно извикване, той ще бъде убит незабавно.

Очевидно това решение не е много гъвкаво. В тази връзка, seccomp-bpf се появи в ядрото 3.5, което ви позволява да прецизирате, като използвате правилата на BPF, кои системни извиквания (и техните аргументи) са разрешени и кои не. Seccomp-bpf се използва в Google Chrome, Chrome OS, а също и обратно в Ubuntu 12.04.

Преди да използвате Arkose, той трябва да бъде инсталиран. Процедурата е стандартна:

$ sudo apt-get install arkose-gui

Ще бъдат инсталирани както GUI (arkose-gui), така и помощната програма на командния ред (arkose). Графичният интерфейс е толкова прост, че не виждам смисъл да го описвам, по-добре е веднага да преминете към практиката.


Ръчно създаване
моментна снимка само за четене-
ta в btrfs

Опциите на командния ред ще разгледат:

  • -n (няма, директен, филтриран) - картографира мрежата към пясъчната кутия. Опциите без и директните са обясними сами по себе си, филтриран създава собствен интерфейс за всяка пясъчна кутия. На практика е по-добре да използвате или none, или директно, тъй като настройването на филтрира отнема много време.
  • -d (няма, система, сесия, и двете) - достъп до D-Bus автобуси от пясъчника.
  • -s размер - задава размера на съхранение в мегабайти. По подразбиране е 2000 MB за ext4 или половината памет за tmpfs. След като програмата, изпълнявана в пясъчника, приключи, хранилището се унищожава.
  • -t - тип файлова система за съхранение. По подразбиране е ext4.
  • --root директория - Посочва директорията, която е съпоставена с пясъчника като основна.
  • --root-type (cow,bind) - как точно да се покаже коренът. Ако използвате крава, тогава всички промени след затваряне на пясъчника ще бъдат загубени и ако свържете, те ще бъдат запазени.
  • --base-path - определя местоположението, където се съхранява пясъчната кутия. По подразбиране е ~/.arkose.
  • --bind директория и --cow директория - показва директория или в режим на крава, или директно. Естествено, използването на една или друга опция зависи от вида на основното картографиране - няма смисъл да използвате опцията --cow в директория, която вече е копиране при запис.
  • -h - използвайте реална домашна директория. Подобно на --bind $HOME.
  • -p - позволява използването на PulseAudio.

Нека стартираме Firefox като пример:

$ sudo arkose -n директен -p firefox

Тази команда ще стартира Firefox с уеб достъп и PulseAudio. Тъй като всеки новосъздаден контейнер има собствена домашна директория по подразбиране, профилът на firelis също ще бъде нов, без инсталирани добавки, ако имате такива.

"Но почакай! Защо sudo? - може да възникне резонен въпрос. Факт е, че някои подготвителни операции са достъпни само от root. Въпреки това, бързам да ви успокоя - стартираната програма ще работи с правата на текущия потребител.


Добавяне на потребител за стартиране на Skype в chroot

Накратко за BTRFS

Случва се, че след инсталиране на актуализации системата се срива. Тук биха били полезни инструменти, подобни на компонента за възстановяване на системата на Windows. Горд съм да кажа, че ги имаме! И един от тези инструменти е Btrfs. От предимствата на новата файлова система от Oracle си струва да се отбележи следното:

  • Копиране при запис. Тази технология се използва за създаване на моментни снимки - моментални снимки на състоянието на системата. Когато създава моментна снимка, FS драйверът копира метаданните в нея и започва да наблюдава действителния запис. Ако бъде намерен, оригиналните блокове данни се поставят в моментната снимка и на тяхно място се записват нови.
  • Динамично разпределение на inodes. За разлика от старото поколение FS, Btrfs няма ограничение за броя на файловете.
  • Компресиране на файлове.
  • Възможност за хостване на файлова система на няколко физически носителя. Всъщност това е същият RAID, само по-високо ниво. Към момента на писане се поддържат RAID 0, RAID 1 и RAID 10, докато поддръжката за RAID 5 е в ранните етапи на разработка.

Създаване и изтриване на моментни снимки

За извършване на операции върху файлова система от ново поколение, като създаване на моментни снимки, дефрагментиране на том и много други, се използва командата btrfs. Неговият синтаксис като цяло е следният:

btrfs<команда> <аргументы>

Какви операции могат да се извършват на Btrfs? По-долу са командите, които намерих за интересни.

  • btrfs subvol създаване [<путь>/]<имя>- създава подтом (виж страничната лента). Ако не е посочен път, го създава в текущата директория.
  • btrfs subvol изтриване<имя>- съответно изтрива подтом.
  • btrfs subvol find-new<путь> <поколение>- списък на последните модифицирани файлове в посочения път, започвайки от посоченото поколение. За съжаление, досега няма начин да разберете текущото поколение на конкретен файл по прост начин, така че използването на тази команда може да бъде придружено от танцуване с тамбура.
  • btrfs subvol моментна снимка [-r]<подтом> <путь к снапшоту>- акцентът на програмата. Създава моментна снимка на посочения подтом с посочения път към него. Опцията -r деактивира записа в моментни снимки.
  • btrfs subvol списък<путь>- показва списък с подтомове и моментни снимки в посочения път.
  • btrfs filesys df - използване на пространство за посочената точка на монтиране.
  • btrfs преоразмеряване на файловете [+/-]<новый размер> <путь>- да, да, Btrfs има способността да преоразмерява на "жива" система и не само да увеличава, но и да намалява! С аргументите мисля, че всичко е повече или по-малко ясно, но освен да посочите размера, можете да използвате аргумента max, който разширява файловата система до максималния възможен размер.

Останалите команди, макар и интересни, са свързани с темата на статията само доколкото и ние няма да ги разглеждаме. Така че, за да създадем моментна снимка на подтом с текущата дата, например главната директория, въвеждаме следната команда:

$ sudo btrfs subvol snap -r / /snapshot-2013-01-16

$ sudo btrfs subvol del /snapshot-2013-01-16

Btrfs подтом

Btrfs подтом може да действа по два начина: като директория и като VFS обект - нещо, което може да се монтира. Например, при инсталиране на Ubuntu се създават два подтома - @ и @home. Първият съдържа системни файлове, вторият - потребителски данни. Това е подобно на разделянето на диск, само ако по-рано един дял можеше да съдържа, като правило, само един VFS обект, сега може да има няколко обекта на един дял наведнъж и те могат да бъдат вложени.

Автоматизация

Не виждам голям смисъл от ръчно създаване на моментни снимки - можете просто да забравите да направите това. На ум идват три сценария за автоматизация:

  • напишете скрипт и го поставете в rc.local;
  • напишете скрипт и го поставете в cron;
  • използвайте командата btrfs autosnap.

За съжаление, в Ubuntu 12.10 последният метод не е наличен по някаква причина, така че практически няма избор като такъв. Лично аз предпочетох да напиша cron скрипт, но първо, нека създадем подтом, в който ще се съхраняват нашите моментни снимки. За какво? Поне за да не се засипва главната папка.

# mkdir /mnt/sda11 # mount /dev/sda11 /mnt/sda11 # btrfs subvol create /mnt/sda11/@snapshots # umount /mnt/sda11

Нека да видим какво правят тези команди. Тъй като действителният корен на файловата система не е достъпен в момента (вместо това ubuntu използва подтома @ като корен), ние сме принудени да го монтираме ръчно. В моя случай е на /dev/sda11. С третата команда създаваме подтомема @snapshots - така че ако не монтираме него или истинския корен, съдържанието му ще бъде недостъпно. И сега действителният скрипт:

Autosnap.sh #!/bin/bash set -e VOLUME=/dev/sda11 TMP_PATH=/tmp/snapshots MOUNT_OPTS=" [защитен с имейл]" # Текуща дата и час - необходими за именуване на папки за моментни снимки СЕГА="$(date +%Y%m%d%H%M)" NOW_SEC="$(дата +%s)" ако [ $# -ne 1 ] ; then # Ако скриптът се изпълнява без аргументи, задайте по подразбиране преди един ден OLDER_SEC="$(date --date "1 ден преди" +%s)" else # Ако имаме аргумент, предполагаме, че това е дата във всеки формат, който командата date разбира, с всички последствия OLDER_SEC="$(date --date "$1" +%s)" fi # Извадете желаната дата от текущата дата и я преобразувайте в минути OLDER=$ (($NOW_SEC-$ OLDER_SEC)) OLDER_MIN=$(($OLDER/60)) [ ! -d "$(TMP_PATH)/" ] && mkdir "$(TMP_PATH)/" [ -z "`grep "$( TMP_PATH)" /proc/ mounts`" ] && монтиране "$(VOLUME)" "$(TMP_PATH)/" -o "$(MOUNT_OPTS)" && ( # Монтиране на mkdir "$(TMP_PATH)/$(NOW)/" # Създаване на моментни снимки btrfs subvol snap / "$(TMP_PATH)/$(NOW)/rootsnap" > /dev/null 2>&1 btrfs subvol snap /home "$(TMP_PATH)/$(NOW)/homesnap" > /dev/ null 2>&1 ) && ( # Потърсете папки със снимки, по-стари от посочената дата за f в `намерете "$(TMP_PATH)" -mindepth 1 - maxdepth 1 -type d -cmin +"$OLDER_MIN" -print0 |xargs -0`; направете btrfs subvol del "$(f)/rootsnap" > /dev/null 2>&1 && btrfs subvol del "$(f)/homesnap" > /dev/null 2>&1 && # и изтрийте моментни снимки и папки, съдържащи ги rmdir "$f" готово ) umount -l "$(TMP_PATH)" && rmdir "$(TMP_PATH)"

Този скрипт може да бъде поставен където е удобно (аз лично предпочитам да поставям такива неща в /usr/local/bin, но това е въпрос на вкус) и да го стартирате или от cron, или от rc.local. По подразбиране скриптът завърта снимки, по-стари от един ден, но можете да посочите всяко желано число във формата на командата дата - най-важното е, не забравяйте да поставите в кавички.

Използване на ISO изображение

За да не издърпвате диска със записания ubunt всеки път, когато се повредят важни файлове, е възможно да добавите елемента за зареждане от ISO изображението в менюто Grub, което предлагам да направя. За да направите това, ще ви трябва дял, който не е Btrfs (защото по неизвестни причини стандартният initramfs на Ubuntu ISO не иска да вижда изображението, ако се намира на дяла с описания FS) и директни ръце. Добавете следните редове към файла /etc/grub.d/40_custom:

Меню "Ubuntu 12.10 i386 iso" ( insmod part_msdos insmod fat # Инсталирайте root, откъдето получаваме ISO set root="hd0,msdos7" # Път до изображението спрямо горния корен set isofile=/ubuntu-12.10-desktop- i386.iso # Монтиране като loopback устройство директно в цикъла за обратна връзка на Grub $isofile linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noeject noprompt -- initrd (loop)/casper/initrd.lz )

и изпълнете командата, за да актуализирате основната конфигурация на Grub:

$ sudo актуализиране grub

Сега, дори в случай на сериозна повреда на системата - освен ако, разбира се, буутлоудърът и неговите файлове не са засегнати - винаги можете да стартирате от ISO образ и да промените повредените файлове или да се върнете към предишно състояние на системата.


ИНФО

Ако работите в chroot среда като root, тогава има възможност да избягате от там. Един от начините е да използвате системното извикване mknod() и след това да монтирате истинския root. Инсталирането на комплекта корекции grsecurity решава този проблем.

Командите Btrfs имат стандартна и съкратена форма. Например, командата "btrfs subvolume snapshot" може да бъде написана като "btrfs su sn".

Така че, да приемем, че сте изпуснали системата и трябва да я възстановите от моментна снимка на Btrfs. За да направите това, стартирайте от това ISO изображение, монтирайте дяла, на който сте пуснали системата - точно дяла, а не подтом! - и въведете следните команди (разбира се, коригирани за вашите моментни снимки и дялове):

# cd /mnt/sda11 # mv @ @_badroot # mv @snapshots/201302011434/rootsnap @

Същото, ако е необходимо, правим и с @home и рестартираме. Ако всичко е минало добре, тогава можете да премахнете @_badroot:

$ sudo btrfs subvol del @_badroot

Заключение

В *nix системите има много начини да се предпазите от или да смекчите лошите експерименти. Прегледах някои от тях. Заслужава да се отбележи обаче, че всички тези методи са предназначени главно за експериментатори, които обичат да ровят по-дълбоко в системата. Те не са подходящи за улавяне на злонамерен софтуер - те са достатъчно лесни за откриване, въпреки че със сигурност осигуряват известно ниво на сигурност.

btrfs(понякога се произнася butter fs) е нова безплатна файлова система, която се разработва с подкрепата на Oracle. Разпространява се под GPL лиценза. Въпреки че нейното развитие далеч не е завършено, на 9 януари 2009 г. файловата система беше интегрирана в ядрото на Linux и е достъпна в Debian Squeueze.

Въпреки че Btrfs беше включен в ядрото 2.6.29, разработчиците заявяват, че "започвайки от ядрото 2.6.31, ние планираме само да направим формата за промяна на диска съвместим оттук нататък." Разработчиците все още искат да подобрят инструментите за потребител/управление, за да ги направят по-удобни за потребителя. За повече информация относно Btrfs, вижте връзката в раздела.

Ext2/3/4 може да се превърне в Btrfs (но не и обратното).

Състояние

Debian Squeeze и по-новите версии поддържат Btrfs.

ЧЗВ

Кой пакет съдържа помощни програми за btrfs?

btrfs-tools (в DebianSqueeze и по-горе)

Вижте също: Btrfs wiki FAQ

Примерни команди за работа с btrfs

Създаване на файлова система:

mkfs.btrfs

Управление на томове, подтомове, моментни снимки; проверка на целостта на файловата система:

btrfsctl

Сканиране за btrfs файлови системи:

btrfsctl -a btrfsctl -A /dev/sda2

Създаване на моментни снимки и подтомове:

монтиране -t btrfs -o subvol=. /dev/sda2 /mnt btrfsctl -s new_subvol_name /mnt btrfsctl -s snapshot_of_default /mnt/default btrfsctl -s snapshot_of_new_subvol /mnt/new_subvol_name btrfsctl -s snapshot_of_default /mnt/default btrfsctl -s snapshot_of_new_subvol /mnt/new_subvol_name btrfsctl -s snapshot_of_of_of_mnt

Проверка на дърветата на обхвата на файловата система:

btrfsck

Извеждане на метаданни в текстова форма:

debug-tree debug-tree /dev/sda2 >& big_output_file

Показване на файловите системи btrfs на твърдия диск:

btrfs-show /dev/sda*

Дефрагментиране (не се изисква по подразбиране):

# дефрагментиране на файлова система btrfs /mnt или # дефрагментиране на файлова система btrfs /mnt/file.iso

Преобразуване на файлова система ext3 в btrfs

Файловата система ext3 може да бъде превърната в btrfs и по-нататъшна работа с нея като нова файлова система. Освен това състоянието на оригиналната файлова система ext3 ще бъде достъпно по-късно.

# Винаги стартирайте първо fsck %# fsck.ext3 -f /dev/xxx # Преобразувайте от Ext3->Btrfs %# btrfs-convert /dev/xxx # Монтирайте получената Btrfs файлова система %# mount -t btrfs /dev/xxx /btrfs # Монтиране на моментната снимка на ext3 %# mount -t btrfs -o subvol=ext2_saved /dev/xxx /ext2_saved # Обратно монтиране на файла с изображение %# mount -t ext3 -o loop,ro /ext2_saved/image /ext3

Директорията /ext3 сега показва състоянието на оригиналната файлова система.

Демонтирането става в обратен ред:

%# umount /ext3 %# umount /ext2_saved %# umount /btrfs

Можете да се върнете към файлова система ext3 и да загубите промените си:

%# btrfs-convert -r /dev/xxx

Или можете да останете на btrfs и да изтриете запазеното изображение на файловата система ext3:

%# rm /ext2_saved/image

Забележка:новата файлова система понякога има много голям размер на метаданните след конвертиране.

Размер на метаданните:

# btrfs файлова система df /mnt/data1tb/

Нормализирайте размера им:

btrfs fi баланс /mnt/btrfs

Прочетете повече: Преобразуване от ext3 (английски) и Преобразуване на ext3fs в btrfs (руски)

Преоразмеряване на файловата система и дяловете

За btrfs е налично онлайн (в движение) преоразмеряване на файловата система. Първо трябва да монтирате желания дял:

# монтиране -t btrfs /dev/xxx /mnt

Добавяне на 2GB:

# btrfs преоразмеряване на файловата система +2G /mnt или # btrfsctl -r +2g /mnt

Намаляване с 4GB:

# btrfs преоразмеряване на файловата система -4g /mnt или # btrfsctl -r -4g /mnt

Задайте размер на 20GB файлова система:

# btrfsctl -r 20g /mnt или # btrfs преоразмеряване на файловата система 20g /mnt

Използване на цялото свободно пространство:

# btrfs файлова система преоразмерява max /mnt или # btrfsctl -r max /mnt

Горните команди са валидни само за файловата система. За да преоразмерите дял, трябва да използвате други помощни програми като fdisk. Помислете за пример за намаляване на дял с 4GB. Монтирайте и намалете дяла:

# mount -t btrfs /dev/xxx /mnt # btrfsctl -r -4g /mnt

Сега демонтирайте дяла и използвайте fdisk:

# umount /mnt fdisk /dev/xxx # където dev/xxx е твърдият диск с дяла, от който се нуждаем