- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
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
В 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