Безопасное обновление из исходных текстов - sandbox

untitled аватар

Управление пакетами в песочнице с помощью...

pkgtools/pkglint: Верификатор для пакетов NetBSD и дерева pkgsrc
pkgtools/pkgdepgraph:Наглядное представление установленных NetBSD пакетов
pkgtools/pkg_tarup: Генерирует бинарные пакеты из установленных.
wip/pkg_rmleaves: Скрипт для удаления 'leaf' пакетов.
mk/bulk/mksandbox: скритп для построения песочницы.

Данный метод обновления пакетов в NetBSD использует песочницу для сборки
всех пакетов, которые надо обновить. Как только вы убедились в том,
что в чрутнутой песочнице все в порядке, вы просто создаете бинарные пакеты,
которые вам нужны и используете их для обновления в настоящей среде.

Давайте посмотрим как это делается.

1) Обновите дерево pkgsrc (/usr/pkgsrc и /usr/pkgsrc/wip).

2) Вы можете удалить ненужные 'leaf' пакеты, для этого спользуйте утилиту
    pkg_rmleaves. Пересборка пакетов занимает много времени, поэтому небудем
    тратить время на пакеты, которые нам больше не нужны.

3) Теперь вам надо построить песочницу. Сделать это очень просто используя
    утилиту /usr/pkgsrc/mk/bulk/mksandbox. Если вы используете xorg вместо
    Xfree86, исправьте cтроку "need_xsrc=yes" на "need_xsrc=no".
    Затем запустите скрипт чтобы создать песочницу в директории на ваше
    усмотрение:

        root@YOURbox [root]# cd /usr/pkgsrc/mk/bulk/
    root@YOURbox [bulk]# ./mksandbox /usr/sandbox/

Все, песочница готова. Наберите df. Посмотрите как скрипт подмонтировал
все нужные чруту директории в read-only и директории, в котых он будет
работать в read-write:

/bin /bin ro
/sbin /sbin ro
/lib /lib ro
/libexec /libexec ro
/usr/X11R6 /usr/X11R6 ro
/usr/bin /usr/bin ro
/usr/games /usr/games ro
/usr/include /usr/include ro
/usr/lib /usr/lib ro
/usr/libdata /usr/libdata ro
/usr/libexec /usr/libexec ro
/usr/lkm /usr/lkm ro
/usr/share /usr/share ro
/usr/sbin /usr/sbin ro
/var/mail /var/mail ro
/usr/src /usr/src ro
/usr/pkgsrc /usr/pkgsrc rw
/usr/pkgsrc/packages /usr/pkgsrc/packages rw
/usr/pkg_distfiles /usr/pkg_distfiles rw

Заметьте, у меня в системе distfiles сохранены в /usr/pkg_distfiles,
чтобы избежать их переписывания во время обновления деревьев моими
скриптами.

Скрипт, контролирующий все монтирования - /usr/sandbox/sandbox. Он
вызывается только во время первого создания песочницы,
в следующий раз это надо делать руками:

       root@YOURbox [root] #/usr/sandbox/sandbox mount
для монтирования директорий

       root@YOURbox [root] #/usr/sandbox/sandbix umount
для отмонтирования.

Теперь давайте соберем пару необходимых пакетов для работы в нашей
песочнице:

        root@YOURbox [root]# chroot /usr/sandbox /bin/sh
    root@SANDbox [/]# cd /usr/pkgsrc/shells/bash && make install
    root@SANDbox [bash]# cd /usr/pkgsrc/pkgtools/pkg_tarup &&
    make install

Вот и все, теперь выйдите из песочницы по Ctrl+D

    root@SANDbox [pkg_tarup]# exit

4) Теперь подготовим песочницу к работе:

    root@YOURbox [root] # cd /usr/sandbox/tmp
    root@YOURbox [tmp]# lintpkgsrc -i > out_of_date

Эта команда создаст список устаревших пакетов,

    root@YOURbox [tmp]# pkgdepgraph -D out_of_date > to_delete

Эта создаст список пакетов, которые надо удалить до обновления,

    root@YOURbox [tmp]# pkgdepgraph -R out_of_date > rebuild.sh

Наконец, последняя команда создаст скрипт, который будет использоваться
для сборки пакетов.

5) Настало время чрутиться и приступать к сборке:

    root@YOURbox [tmp]# chroot /usr/sandbox/ /usr/pkg/bin/bash
    root@SANDbox [/]# cd /tmp
    root@SANDbox [tmp]# pkg_delete -r `cat to_delete`
    root@SANDbox [tmp]# sh rebuild.sh

Если процесс сборки завершился ошибкой, вы можете посмотреть какой
пакет вызвал аварийную остановку и исправить ситуацию руками. Затем
запустите rebuild.sh заново. Скрипт не станет пересобирать уже
собранные пакеты.

Заметьте, процесс сборки в голом чруте может затянуться, так как может
понадобиться сборка тех пакетов, которые уже установлены в настоящем
окружении, но со временем ваша песочница станет один в один как ваша
система и это перестанет приносить неудобства. Я думаю это разумная
цена за безмятежность, обеспечиваемую тем фактом, что вам ненадо больше
беспокоиться о поломке системы, если во время сборки важных пакетов
произошла ошибка.

6) После того как все закончится вы должны создать бинарные пакеты для
   дальнейшего их использования в настоящем окружении. Сделаем это для
   каждого пакета, установленного в песочнице:

    root@SANDbox [tmp]# pkg_tarup `pkg_info | cut -d ' ' -f 1 -s`

Эта команда создаст все бинарные пакеты в /tmp (/usr/sandbox/tmp
настоящего окружения). После этого выйдите из чрута.

    root@SANDbox [tmp]# exit

7) Теперь вы в своей системе и вам нехочется наводить здесь беспорядок.

    root@YOURbox [tmp]# cd /usr/sandbox/tmp
    root@YOURbox [tmp]# pkg_add -uu `cut -d "'" -f 2 -s out_of_date`

Это должно все установить. Вы можете проверить обновлена ли ваша
система полностью, воспользовавшись командой lintpkgsrc -i и убедившись
в отсутствии несовпадающих пакетов.

8) Время чистки:

    root@YOURbox [tmp]# rm -rf /usr/sandbox/tmp/*
    root@YOURbox [tmp]# /usr/sandbox/sandbox umount

Все.

Давайте просмотрим все необходимые команды, учитывая то, что песочница
уже создана:

    root@YOURbox [root]# cd /usr/sandbox/tmp
    root@YOURbox [tmp]# lintpkgsrc -i > out_of_date
    root@YOURbox [tmp]# pkgdepgraph -D out_of_date > to_delete
    root@YOURbox [tmp]# pkgdepgraph -R out_of_date > rebuild.sh
    root@YOURbox [tmp]# /usr/sandbox/sandbox mount
    root@YOURbox [tmp]# chroot /usr/sandbox/ /usr/pkg/bin/bash
    root@SANDbox [/]# cd /tmp
    root@SANDbox [tmp]# pkg_delete -r `cat to_delete`
    root@SANDbox [tmp]# sh rebuild.sh
    root@SANDbox [tmp]# pkg_tarup `pkg_info | cut -d ' ' -f 1 -s`
    root@SANDbox [tmp]# exit
    root@YOURbox [tmp]# pkg_add -uu `cut -d "'" -f 2 -s out_of_date`
    root@YOURbox [tmp]# rm -rf /usr/sandbox/tmp/*
    root@YOURbox [tmp]# /usr/sandbox/sandbox umount

Надеюсь вам понравится мой способ обновленя пакетов;)
Не стесняйтесь коментировать если у вас есть идеи по его улучшению.

ССЫЛКА НА ОРИГИНАЛ:
http://diwp.blogspot.com/2006/09/manage-your-packages-in-sandbox-with.html

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".
untitled аватар

Статья

Статья обсолютно рабочая проверенная, все работает как надо.

rmx аватар

Попробую.. Tnx!

Попробую.. Tnx!

EvAn аватар

Важное

Важное замечание! Не используйте sandbox в DragonFlyBSD. Там это не просто не работает, а вешает систему: сначала sandbox делает вид, что он все сделал как надо, но спустя пару секунд оная перестает реагировать на нажатия на клавиши.

Второе, не все знают что такое wip. Информация по ссылке: http://pkgsrc-wip.sourceforge.net/.

EvAn аватар

Следует

Следует заметить, что данный метод можно (и нужно) использовать и для установки пакетов, потому что также как и при обновлении, при сборке новых пакетов, может потребоваться пересборка/обновление зависимостей, что скорее всего приведет к временной неработоспособности системы. Сейчас устанавливаю данным методом пакеты во вновь установленную систему. Но еще не придумал как автоматизировать процесс, чтобы устанавливались только новые пакеты, а не все из репозитория.