FastNetMon

Tuesday, 19 January 2010

Инкрементальные бэкапы для ядра 2.6.27 / 2.6.32 (эксклюзивная версия!)

Я ранее уже упоминал в блоге замечательный патч от Matt Heaton http://www.mattheaton.com/?p=188, но теперь решил его портировать на 32е ядро и перевести документацию на русский.

Этот патч предоставляет информацию о всех измененных, вновь созданных или подвергшихся изменению прав посредством chmod файлах в системе. Таким образом, эти файлы могут быть забэкаплены без осуществления полного сканирования файловой системы и поиска изменившихся файлов (например, посредством программ rdiff-backup или rsync). Само резервное копирование не входит в задачи этого патча, он только предоставляет список файлов. Бэкап списка изменившихся файлов осуществляете уже Вы сами, это самая легкая часть задачи. Более сложную - формирование спсика изменившихся файлов - решает патч ядра.

В патче нету хеширования, сортировки или фильтрации дубликатов файлов. Это означает, что после того, как файл будет изменен и до того, как вы его забэкапите, он может изменится снова. Таким образом, вы вполне можете получить дубликаты файлов в логе изменений. Чтобы избежать ошибок в поведении бэкап скрипта просто удаляйте дубликаты в нем.

Чтобы использовать все эти замечательные возможности, необходимо применить следующий патч на исходники 2.6.27 ядра с kernel.org После этого у ядра появится два триггера, которые по-умолчанию отключены и система логирования изменившихся файлов не создает нагрузки на систему:


/proc/sys/fs/bh_logging_user
/proc/sys/fs/bh_logging_root


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

echo 1 > /proc/sys/fs/bh_logging_user
echo 1 > /proc/sys/fs/bh_logging_root


Либо же можно добавить следующие строки в файл:

vi /etc/sysctl.conf


fs.bh_logging_user=1
fs.bh_logging_root=1


После этого необходимо внести коррективы в файл /etc/syslog.conf, чтобы syslog принимал сообщения от ядра (как раз посредством них и будут передаваться измененные файлы) и сохранял их в лог:

kern.debug /var/log/modified


После этого, все измененные файлы будут отображаться в логе /var/log/modified.

UPDATE: самостоятельно перенес патч на 2.6.32.8 ядро, вот он, прошу: http://fastvps.googlecode.com/svn/trunk/patches/bluehost-backup-fastvps-edited-patch-2.6.32.diff

Вот мануал по накатываюнию патча на 2.6.32.8 ядро

cd /usr/src/linux-2.6.32.8
wget http://fastvps.googlecode.com/svn/trunk/patches/bluehost-backup-fastvps-edited-patch-2.6.32.diff
patch -p1 < bluehost-backup-fastvps-edited-patch-2.6.32.diff



В итоге должны увидеть нечто вот такое:
patching file fs/compat.c
patching file fs/dcache.c
patching file fs/namei.c
patching file fs/open.c
patching file fs/read_write.c
patching file include/linux/fs.h
patching file kernel/sysctl.c
patching file mm/mmap.c


Далее собираем ядро.

(с) http://www.mattheaton.com/?p=188

9 comments :

  1. MODPOST vmlinux.o
    WARNING: modpost: Found 5 section mismatch(es).
    To see full details build your kernel with:
    'make CONFIG_DEBUG_SECTION_MISMATCH=y'
    GEN .version
    CHK include/linux/compile.h
    UPD include/linux/compile.h
    CC init/version.o
    LD init/built-in.o
    LD .tmp_vmlinux1
    kernel/built-in.o:(.data+0x3194): undefined reference to `bh_logging_user'
    kernel/built-in.o:(.data+0x31c0): undefined reference to `bh_logging_root'
    mm/built-in.o: In function `mmap_region':
    /root/rpmbuild/BUILD/kernel-2.6.32.8/mm/mmap.c:1196: undefined reference to `bh_log_modified'
    fs/built-in.o: In function `do_sys_open':
    /root/rpmbuild/BUILD/kernel-2.6.32.8/fs/open.c:1090: undefined reference to `bh_log_new'
    fs/built-in.o: In function `sys_fchown':
    /root/rpmbuild/BUILD/kernel-2.6.32.8/fs/open.c:811: undefined reference to `bh_log_modified'
    fs/built-in.o: In function `sys_fchmod':
    /root/rpmbuild/BUILD/kernel-2.6.32.8/fs/open.c:635: undefined reference to `bh_log_modified'
    fs/built-in.o: In function `sys_lchown':
    /root/rpmbuild/BUILD/kernel-2.6.32.8/fs/open.c:782: undefined reference to `bh_log_changed'
    fs/built-in.o: In function `sys_fchownat':
    /root/rpmbuild/BUILD/kernel-2.6.32.8/fs/open.c:757: undefined reference to `bh_log_changed'
    fs/built-in.o: In function `sys_chown':
    /root/rpmbuild/BUILD/kernel-2.6.32.8/fs/open.c:726: undefined reference to `bh_log_changed'
    fs/built-in.o: In function `sys_fchmodat':
    /root/rpmbuild/BUILD/kernel-2.6.32.8/fs/open.c:670: undefined reference to `bh_log_changed'
    fs/built-in.o: In function `vfs_write':
    /root/rpmbuild/BUILD/kernel-2.6.32.8/fs/read_write.c:357: undefined reference to `bh_log_modified'
    fs/built-in.o: In function `do_readv_writev':
    /root/rpmbuild/BUILD/kernel-2.6.32.8/fs/read_write.c:671: undefined reference to `bh_log_modified'
    fs/built-in.o: In function `sys_renameat':
    /root/rpmbuild/BUILD/kernel-2.6.32.8/fs/namei.c:2793: undefined reference to `bh_log_removed'
    /root/rpmbuild/BUILD/kernel-2.6.32.8/fs/namei.c:2794: undefined reference to `bh_log_new'
    fs/built-in.o: In function `do_unlinkat':
    /root/rpmbuild/BUILD/kernel-2.6.32.8/fs/namei.c:2369: undefined reference to `bh_log_removed'
    fs/built-in.o: In function `do_rmdir':
    /root/rpmbuild/BUILD/kernel-2.6.32.8/fs/namei.c:2272: undefined reference to `bh_log_removed'
    fs/built-in.o: In function `sys_mkdirat':
    /root/rpmbuild/BUILD/kernel-2.6.32.8/fs/namei.c:2150: undefined reference to `bh_log_new'
    make[2]: *** [.tmp_vmlinux1] Error 1
    error: Bad exit status from /var/tmp/rpm-tmp.Meag8L (%build)


    RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.Meag8L (%build)
    make[1]: *** [rpm] Помилка 1
    make: *** [rpm] Помилка

    Не могу собрать ядро после патча. Может подскажыте?

    ReplyDelete
    Replies
    1. Оххх. а ядро ванильное (с kernel.org) точно?

      Delete
  2. Да, это https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.8.tar.gz

    ReplyDelete
  3. Centos 6.3
    Что я делал:
    yum install -y ncurses-devel gcc make rpm-build redhat-rpm-config


    cd /usr/src
    wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.8.tar.gz
    tar -xvf linux-2.6.32.8.tar.gz
    cd linux-2.6.32.8
    cp /boot/config-`uname -r` .config
    make menuconfig
    Отмечаю General setup ---> enable deprecated sysfs features which may confuse old userspace

    mkdir -p /usr/src/redhat/SRPMS
    mkdir -p /usr/src/redhat/RPMS/i686

    vi scripts/package/mkspec


    И в самый низ добавляем следующее:
    echo "%post"
    echo "/sbin/new-kernel-pkg --package kernel --mkinitrd --depmod --install "$KERNELRELEASE" || exit \$?"
    echo ""

    echo "%preun"
    echo "/sbin/new-kernel-pkg --rminitrd --rmmoddep --remove "$KERNELRELEASE" || exit \$?"
    echo ""

    time make rpm

    А делее ошыбки... (

    ReplyDelete
  4. This comment has been removed by the author.

    ReplyDelete
  5. Я уже вручную накатывал патч, ошибки те же.
    Ядро без патча собирается нормально

    ReplyDelete
    Replies
    1. Пожалуйста, вот актуальная версия патча с документацией: https://github.com/FastVPSEestiOu/Linux-kernel-fast-logging-path

      Delete
    2. Спасибо за наводку, вижу патч для Убунту-Дебиана.
      Но у меня беда в том, что под Дебианом (причем старом lenny) ядро с патчем собирается без проблем, и работало так как надо.

      А вот под Centos 6.4 сборка завершалась ошибками. Хотя ядро одно и тоже, ванильное. Может я чего не установил, пока не разобрался. Пробовал даже вручную вносить изменения в код, исход тот же, ошибки.

      Delete
    3. А Вы как собираете? Попробуйте собрать в обход rpm, просто make make install. Я на гитхабе указал, какие версии ядра нужны.

      А вообще, напишите проще jabber'ом, придумаем, как собрать: pavel.odintsov [at] gmail.com

      Delete

Note: only a member of this blog may post a comment.