Безопасное обновление из исходных текстов - sandbox
Управление пакетами в песочнице с помощью...
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
- Страница для печати
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- 4649 просмотра
Статья
Статья обсолютно рабочая проверенная, все работает как надо.
Попробую.. Tnx!
Попробую.. Tnx!
Важное
Важное замечание! Не используйте sandbox в DragonFlyBSD. Там это не просто не работает, а вешает систему: сначала sandbox делает вид, что он все сделал как надо, но спустя пару секунд оная перестает реагировать на нажатия на клавиши.
Второе, не все знают что такое wip. Информация по ссылке: http://pkgsrc-wip.sourceforge.net/.
Следует
Следует заметить, что данный метод можно (и нужно) использовать и для установки пакетов, потому что также как и при обновлении, при сборке новых пакетов, может потребоваться пересборка/обновление зависимостей, что скорее всего приведет к временной неработоспособности системы. Сейчас устанавливаю данным методом пакеты во вновь установленную систему. Но еще не придумал как автоматизировать процесс, чтобы устанавливались только новые пакеты, а не все из репозитория.