LXF116:DrBrown3

Материал из Linuxformat.

Перейти к: навигация, поиск

Говяжья файловая система

ext3cow Вернитесь в прошлое и найдите старые версии своих файлов, не делая полного резервирования.

Общая теория относительности Эйнштейна, которую вы, конечно, знаете как свои пять пальцев, говорит о «пространственно-временном континууме». Согласно этой теории, все точки во времени – в прошлом, настоящем и будущем – существуют всегда. На мой взгляд, это 10 баллов из 10 за оригинальность, но минус несколько миллионов за интуитивную понятность. Такова уж физика.

Однако в мире Linux файловые системы с контролем версий в самом деле создают иллюзию, что прошлое таки существует параллельно с настоящим. Одна из таких систем – ext3cow (cow означает не «корова», а Copy On Write – копирование при записи, это лежащая в ее основе технология), и я решил ее попробовать. Установка ext3cow была непростой (см. соответствующий раздел). Но перейдем сразу к делу и опишем ext3cow с точки зрения пользователя.

Му-у!

Из чего она сделана

Ext3cow доступна на сайте http://www.ext3cow.com и состоит из следующих основных компонентов:

  • linux-2.6.20.3-ext3cow.patch Заплатки для поддержки ext3cow ядром 2.6.20.3.
  • e3cfsprogs-1.39.tgz Модифицированные утилиты файловой системы ext3, в частности, mkfs.
  • ext3cow-tools.tgz Три простых пользовательских утилиты:
ss Создает снимок файловой системы. (Я переименовал ее в snapshot, потому что в Ubuntu уже есть утилита ss).
tt Получает номер периода текущей версии файловой системы.
e2d Получает дату по заданному номеру периода.

По сути, ext3cow – это расширение файловой системы ext3, позволяющее делать «снимки» состояния ФС и возвращаться в прошлое, чтобы просмотреть содержимое файла на момент создания любого снимка. Сначала создадим структуру пустой файловой системы ext3cow на разделе – например, таким образом:

$ sudo mkfs.ext3cow /dev/sdb1

В выводе команды mkfs должна быть строка типа этой:

Writing super block with epoch number: 1228988556

Номер периода (epoch number) означает момент времени, в который был сделан снимок, в данном случае это время создания файловой системы. (См. врезку «Эпоха Unix»).

Теперь надо смонтировать файловую систему. Для этого я создал тестовый каталог /cow в качестве точки монтирования:

$ sudo mkdir /cow
$ sudo chmod 777 /cow
$ sudo mount -t ext3cow /dev/sdb1 /cow

Давайте создадим файл в нашей файловой системе ext3cow:

$ cd /cow
$ echo “This is the original file” > afile

Затем создадим снимок, чтобы потом мы могли просмотреть файловую систему в ее текущем состоянии:

$ snapshot /cow
Snapshot on /cow: 1228989274

Обратите внимание, что сообщается номер периода созданного снимка.

Теперь добавим в файл строку

$ echo “This is version 2” >> afile
Эпоха Unix

В Linux и Unix время измеряется в секундах, начиная с 00:00:00 UTC (Универсальное координированное время) 1 января 1970 года. Этот момент времени со всей важностью называют Эрой [Unix] – The Epoch. Например, сезон охоты на куропаток 2009 года в Великобритании – «Славное 12 Августа» [день победы североирландских протестантов над католиками в битве при Бойне в 1690 г., – прим. пер.]) начнется с временной отметки 1250035200. (Утилиту для конверсии можно найти на сайте http://www.epochconverter.com).

Так как время хранится в 32-битных целых числах, во вторник 19 января 2038 года произойдет переполнение, и земля завертится в противоположном направлении или произойдет нечто столь же катастрофическое. Используемые в ext3cow номера периодов – это просто время Unix с начала эпохи.


Если просмотреть его содержимое командой cat, то мы увидим текущую версию, как и должно быть:

$ cat afile
This is the original file
This is version 2

Но – и это умно придумано – файл можно восстановить из снимка:

$ cat afile@1228989274
This is the original file

С помощью команды ls можно просмотреть временные штампы и размеры файлов для двух версий:

$ ls -l afile@1228989274 afile
-rw-r--r-- 1 chris chris 44 2008-12-11 09:55 afile
-rw-r--r-- 1 chris chris 26 2008-12-11 09:54 afile@1228989274

Даже удалив текущую версию файла afile, мы все равно сможем восстановить оригинал, хотя он и не показывается в листинге каталога:

$ rm afile
$ cat afile
cat: afile: No such file or directory
$ ls -l
total 12
drwx------ 2 root root 12288 2008-12-11 09:42 lost+found
$ cat afile@1228989274
This is the original file

Фактически, удалить исходный файл (в текущей реализации) нельзя никак:

$ rm afile@1228989274
rm: cannot remove `afile@1228989274’: Read-only file system

Пример небольшой, но, будем надеяться, он доказывает главное.

Готова ли ext3cow к проверке временем? Вообще говоря, нет. Установка сложна, да и все эти номера периодов в командной строке выглядят довольно неуклюже. Разработчики явно нацелены на реализацию со стороны ядра, а не на пользовательские утилиты, которые, мягко говоря, минималистичны.

Я бы, на самом деле, хотел увидеть команду, которая устанавливает номер периода процесса, что-нибудь типа

$ setepoch 1 May 2006

чтобы все будущие ссылки на файлы опирались на это время. Но тогда потребовалось бы расширение контекста процесса, что, по-моему, не входит в ближайшие планы разработчиков ext3cow. LXF

Установка ext3cow

Установка ext3cow – не самая простая вещь на свете, и я подумал, что полезно задокументировать свои усилия. Надо сказать, что эти отчасти приглаженные строки никоим образом не отражают количества почесываний в затылке и невнятных бормотаний, имевших место на самом деле!

Часть затруднений возникла из-за отсутствия ext3cow в официальных исходных кодах Linux: файловая система доступна только в виде набора заплат к ядру 2.6.20.3. Во всех современных дистрибутивах версия ядра более новая, и я решил скомпилировать ядро 2.6.20.3 из исходных текстов. Сначала я установил Jeos 8.04 («урезанная» версия Ubuntu), так как он быстро инсталлируется и загружается; это означало работу исключительно в командной строке, но в ней я чувствую себя неплохо. Вот проделанные мною шаги...

1 Скачал wget из репозитория Ubuntu

$ sudo apt-get install wget

2 Скачал tar-архив с исходниками ядра Linux 2.6.20.3

$ wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.3.tar.bz2

3 Установил инструменты сборки и пакет curses, необходимый для поддержки make menuconfig, чтобы настроить ядро

$ sudo apt-get install build-essential libncurses5-dev

4 Распаковал исходный код ядра в /usr/src

$ cd /usr/src
$ sudo tar xjvf ~/linux-2.6.20.3.tar.bz2

5 Скачал и применил заплатки ext3cow

$ wget http://ext3cow.com/patches/linux-2.6.20.3-ext3cow.patch
$ sudo cp linux-2.6.20.3-ext3cow.patch /usr/src/linux-2.6.20.3/
$ cd /usr/src/linux-2.6.20.3/
$ sudo patch -p1 < linux-2.6.20.3-ext3cow.patch

6 Создал файл настройки ядра

$ sudo make menuconfig

В меню верхнего уровня я выбрал ‘Filesystems’, затем ‘Ext3cow filesystem support’. Никаких других изменений я не делал.

7 Назначил EXTRAVERSION в Makefile как ‘.3cow’, чтобы у нового ядра было понятное имя

8 Собрал и установил ядро

$ sudo make all
$ sudo make modules_install
$ sudo make install
$ sudo update-initramfs -c -k 2.6.20.3cow

9 Добавил в menu.lst запись для загрузки нового ядра

 title Kernel 2.6.20.3cow
 root (hd0,0)
 kernel /boot/vmlinuz-2.6.20.3cow root=/dev/sda1 ro
 initrd /boot/initrd.img-2.6.20.3cow

10 Перезагрузил новое ядро

11 Скачал инструменты и утилиты ext3cow

 $ wget http://ext3cow.com/e3cfsprogs/e3cfsprogs-1.39.tgz
 $ wget http://ext3cow.com/tools/ext3cow-tools.tgz

12 Собрал инструментарий

 $ tar xzvf e3cfsprogs-1.39.tgz
 $ cd e3cfsprogs-1.39
 $ ./configure
 $ make
 $ sudo make install

Эти команды обновляют системные утилиты в /sbin, в частности, mke2fs.

13 Переименовал mke2fs в mkfs.ext3cow, согласно инструкции

На данном этапе все было готово для создания файловой системы ext3cow:

 $ sudo mkfs.ext3cow /dev/sdb1

Но судьба решила иначе, и я получил загадочное сообщение об ошибке: “Invalid filesystem option set: sparse_super,filetype,resize_inode,dir_index,ext_attr”.

Я угробил немало времени, пробуя различные вещи и изрядно злобствуя, но сломался и написал письмо разработчику ext3cow Закари Питерсону [Zachary Peterson]. К моей радости, почти немедленно пришел ответ с лекарством от моего недомогания (ошибочная строка в файле /etc/mke2fs.conf), и я мог двигаться дальше (спасибо, Закари!) и создавать файловую систему.

Последней задачей была компиляция утилит ext3cow. На сайте ext3cow написано: «Чтобы собрать утилиты ext3cow, потребуется скопировать заголовочный файл ядра ext3cow_fs.h в ваш каталог include.» После недолгих поисков я нашел файл и понял, куда его поместить. Команды были такими:

 $ sudo mkdir /usr/local/include/linux
 $ sudo cp /usr/src/linux-2.6.20.3/include/linux/ext3cow_fs.h /usr/local/include/linux
 $ tar xzvf ext3cow-tools.tgz
 $ cd ext3cow-tools
 $ make all
Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию